mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 21:53:46 +03:00
201 lines
4.7 KiB
Lua
201 lines
4.7 KiB
Lua
|
|
--[[
|
||
|
|
| This file was obtained through the combined efforts
|
||
|
|
| of Madbluntz & Plymouth Antiquarian Society.
|
||
|
|
|
|
||
|
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||
|
|
| Maloy, DrPepper10 @ RIP, Atle!
|
||
|
|
|
|
||
|
|
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||
|
|
--]]
|
||
|
|
|
||
|
|
|
||
|
|
local PLUGIN = PLUGIN
|
||
|
|
if (PLUGIN.active == nil) then
|
||
|
|
PLUGIN.active = false
|
||
|
|
else
|
||
|
|
PLUGIN.active = PLUGIN.active
|
||
|
|
end
|
||
|
|
|
||
|
|
local DRUG_NUM_OF_SONGS = 5
|
||
|
|
|
||
|
|
PLUGIN.music = {
|
||
|
|
"https://willard.network/game/drugs/oasis.mp3",
|
||
|
|
"https://willard.network/game/drugs/iloveit.mp3",
|
||
|
|
"https://willard.network/game/drugs/silhouettes.mp3",
|
||
|
|
"https://willard.network/game/drugs/nero.mp3",
|
||
|
|
"https://willard.network/game/drugs/greyhound.mp3",
|
||
|
|
"https://willard.network/game/drugs/ruiner.mp3",
|
||
|
|
"https://willard.network/game/drugs/majesty.mp3",
|
||
|
|
"https://willard.network/game/drugs/blahblahblah.mp3",
|
||
|
|
"https://willard.network/game/drugs/desire.mp3",
|
||
|
|
"https://willard.network/game/drugs/tidalwave.mp3",
|
||
|
|
"https://willard.network/game/drugs/solarsystem.mp3",
|
||
|
|
"https://willard.network/game/drugs/skrillex.mp3",
|
||
|
|
}
|
||
|
|
|
||
|
|
net.Receive("ixRaveDrug", function(len)
|
||
|
|
if (net.ReadBool()) then
|
||
|
|
PLUGIN:Apply()
|
||
|
|
else
|
||
|
|
PLUGIN:Clear()
|
||
|
|
end
|
||
|
|
end)
|
||
|
|
|
||
|
|
function PLUGIN:GetEntityTargets()
|
||
|
|
local entities = ents.GetAll()
|
||
|
|
local targets = {}
|
||
|
|
for i = 1, #entities do
|
||
|
|
local ent = entities[i]
|
||
|
|
if (!IsValid(ent)) then continue end
|
||
|
|
if (ent:IsPlayer() or ent:IsNPC() or ent:IsNextBot()) then
|
||
|
|
targets[#targets + 1] = ent
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
return targets
|
||
|
|
end
|
||
|
|
|
||
|
|
function PLUGIN:Apply()
|
||
|
|
self.songs = 0
|
||
|
|
|
||
|
|
if (!self.active) then
|
||
|
|
self.nextFlash = 0
|
||
|
|
self.active = true
|
||
|
|
|
||
|
|
if (ix.option.Get("drugEffects", true) == false) then
|
||
|
|
|
||
|
|
return
|
||
|
|
end
|
||
|
|
|
||
|
|
LocalPlayer():ScreenFade(SCREENFADE.IN, Color(0, 0, 0, 255), 3, 1)
|
||
|
|
self:Music()
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function PLUGIN:Clear()
|
||
|
|
self.active = false
|
||
|
|
if (self.sound ~= nil and IsValid(self.sound)) then
|
||
|
|
self.sound:Stop()
|
||
|
|
self.sound = nil
|
||
|
|
end
|
||
|
|
|
||
|
|
timer.Remove("ixRaveMusic")
|
||
|
|
|
||
|
|
for k, v in ipairs(self:GetEntityTargets()) do
|
||
|
|
v:DisableMatrix("RenderMultiply")
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function PLUGIN:Music()
|
||
|
|
if (!self.active) then return end
|
||
|
|
|
||
|
|
if (self.songs >= math.min(#self.music, DRUG_NUM_OF_SONGS)) then
|
||
|
|
net.Start("ixRaveDrug")
|
||
|
|
net.SendToServer()
|
||
|
|
return
|
||
|
|
--self:Clear(LocalPlayer())
|
||
|
|
end
|
||
|
|
|
||
|
|
if (!self.toPlay or #self.toPlay == 0) then
|
||
|
|
self.toPlay = {}
|
||
|
|
for i = 1, #self.music do self.toPlay[i] = i end
|
||
|
|
end
|
||
|
|
|
||
|
|
local random = math.random(1, #self.toPlay)
|
||
|
|
local url = self.music[self.toPlay[random]]
|
||
|
|
table.remove(self.toPlay, random)
|
||
|
|
|
||
|
|
sound.PlayURL(url, "noplay", function (s, errId, err)
|
||
|
|
if (!s and self.fails < 5) then
|
||
|
|
-- If this fails, try another.
|
||
|
|
self.fails = (self.fails or 0) + 1
|
||
|
|
return self:Music()
|
||
|
|
end
|
||
|
|
|
||
|
|
self.fails = 0
|
||
|
|
self.sound = s
|
||
|
|
s:Play()
|
||
|
|
s:SetVolume(2.0)
|
||
|
|
|
||
|
|
self.songs = self.songs + 1
|
||
|
|
self.song = url
|
||
|
|
|
||
|
|
timer.Create("ixRaveMusic", s:GetLength(), 1, function () self:Music() end)
|
||
|
|
end)
|
||
|
|
end
|
||
|
|
|
||
|
|
function PLUGIN:FFTFlash(triggerBands, threshold)
|
||
|
|
if (not self.sound or not IsValid(self.sound) or self.sound:GetState() ~= GMOD_CHANNEL_PLAYING) then
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
|
||
|
|
local s = self.sound
|
||
|
|
local bands = {}
|
||
|
|
local bandThickness = 18
|
||
|
|
local bandMaxHeight = ((ScrH()/3) * 2) - 75
|
||
|
|
local amp = 5000
|
||
|
|
local dext = 2
|
||
|
|
local offset = 0
|
||
|
|
local realBands = {}
|
||
|
|
|
||
|
|
self.sound:FFT(bands , FFT_8192)
|
||
|
|
for i = 1 , 64 do
|
||
|
|
if (bands[i + offset] * amp > bandMaxHeight) then
|
||
|
|
bands[i + offset] = bandMaxHeight / amp
|
||
|
|
end
|
||
|
|
|
||
|
|
if (bands[i + offset] * amp < 2) then
|
||
|
|
bands[i + offset] = 2
|
||
|
|
else
|
||
|
|
bands[i + offset] = bands[i + offset] * amp
|
||
|
|
end
|
||
|
|
|
||
|
|
realBands[i] = Lerp(30*FrameTime(),realBands[i] or 0,bands[i + offset])
|
||
|
|
if (i < 63 and i > 2) then
|
||
|
|
local a = realBands[i] or 0
|
||
|
|
local b = realBands[i + 1] or 0
|
||
|
|
local c = realBands[i - 1] or 0
|
||
|
|
realBands[i] = (a+b+c) / 3
|
||
|
|
elseif (i < 3) then
|
||
|
|
local a = realBands[i] or 0
|
||
|
|
local b = realBands[i + 1] or 0
|
||
|
|
local c = 0
|
||
|
|
realBands[i] = (a+b+c) / 3
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
--print(sum)
|
||
|
|
--print(realBands[15])
|
||
|
|
local amp2 = 0
|
||
|
|
for k, v in pairs(triggerBands) do
|
||
|
|
amp2 = amp2 + realBands[v]
|
||
|
|
end
|
||
|
|
|
||
|
|
if (amp2 > threshold and CurTime() > self.nextFlash) then
|
||
|
|
LocalPlayer():ScreenFade(SCREENFADE.IN, Color(math.Rand(200, 255), math.Rand(200, 255), math.Rand(200, 255), 80), 0.4, 0)
|
||
|
|
|
||
|
|
self.nextFlash = CurTime() + 0.2
|
||
|
|
|
||
|
|
-- Light
|
||
|
|
local dl = DynamicLight(LocalPlayer():EntIndex())
|
||
|
|
if (dl) then
|
||
|
|
dl.pos = LocalPlayer():GetPos()
|
||
|
|
dl.r = 255
|
||
|
|
dl.g = 192
|
||
|
|
dl.b = 255
|
||
|
|
dl.brightness = 2
|
||
|
|
dl.Decay = 1000
|
||
|
|
dl.Size = 4096
|
||
|
|
dl.DieTime = CurTime() + 1.0
|
||
|
|
end
|
||
|
|
|
||
|
|
self.dl = dl
|
||
|
|
local scaleMatrix = Matrix()
|
||
|
|
local factor = math.Clamp(1 + math.sin(CurTime()), 0.4, 0.8)
|
||
|
|
scaleMatrix:Scale(Vector(factor, factor, factor))
|
||
|
|
|
||
|
|
for k, v in ipairs(self:GetEntityTargets()) do
|
||
|
|
v:EnableMatrix("RenderMultiply", scaleMatrix)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|