mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-16 21:33:46 +03:00
222 lines
7.3 KiB
Lua
222 lines
7.3 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/
|
|
--]]
|
|
|
|
SWEP.NextHeatDissipateTime = 0
|
|
SWEP.Heat = 0
|
|
|
|
function SWEP:GetMaxHeat()
|
|
return self:GetBuff("HeatCapacity")
|
|
end
|
|
|
|
function SWEP:AddHeat(a)
|
|
local single = game.SinglePlayer()
|
|
a = tonumber(a)
|
|
|
|
if !(self.Jamming or self:GetBuff_Override("Override_Jamming")) then return end
|
|
|
|
if single and self:GetOwner():IsValid() and SERVER then self:CallOnClient("AddHeat", a) end
|
|
-- if !single and !IsFirstTimePredicted() then return end
|
|
|
|
local max = self:GetBuff("HeatCapacity")
|
|
local mult = 1 * self:GetBuff_Mult("Mult_FixTime")
|
|
local heat = self:GetHeat()
|
|
local anim = self:SelectAnimation("fix")
|
|
anim = self:GetBuff_Hook("Hook_SelectFixAnim", anim) or anim
|
|
local amount = a or 1
|
|
local t = CurTime() + self:GetAnimKeyTime(anim) * mult
|
|
self.Heat = math.max(0, heat + amount * ArcCW.ConVars["mult_heat"]:GetFloat())
|
|
|
|
self.NextHeatDissipateTime = CurTime() + (self:GetBuff("HeatDelayTime"))
|
|
local overheat = self.Heat >= max
|
|
if overheat then
|
|
local h = self:GetBuff_Hook("Hook_Overheat", self.Heat)
|
|
if h == true then overheat = false end
|
|
end
|
|
if overheat then
|
|
self.Heat = math.min(self.Heat, max)
|
|
if self:GetBuff_Override("Override_HeatFix", self.HeatFix) then
|
|
self.NextHeatDissipateTime = t
|
|
elseif self:GetBuff_Override("Override_HeatLockout", self.HeatLockout) then
|
|
self.NextHeatDissipateTime = t
|
|
end
|
|
elseif !self:GetBuff_Override("Override_HeatOverflow", self.HeatOverflow) then
|
|
self.Heat = math.min(self.Heat, max)
|
|
end
|
|
|
|
if single and CLIENT then return end
|
|
|
|
self:SetHeat(self.Heat)
|
|
|
|
if overheat then
|
|
|
|
local ret = self:GetBuff_Hook("Hook_OnOverheat")
|
|
if ret then return end
|
|
|
|
if anim then
|
|
self:PlayAnimation(anim, mult, true, 0, true)
|
|
self:SetPriorityAnim(t)
|
|
self:SetNextPrimaryFire(t)
|
|
|
|
if self:GetBuff_Override("Override_HeatFix", self.HeatFix) then
|
|
self:SetTimer(t - CurTime(),
|
|
function()
|
|
self:SetHeat(0)
|
|
end)
|
|
end
|
|
end
|
|
|
|
if self.HeatLockout or self:GetBuff_Override("Override_HeatLockout") then
|
|
self:SetHeatLocked(true)
|
|
end
|
|
|
|
self:GetBuff_Hook("Hook_PostOverheat")
|
|
end
|
|
end
|
|
|
|
function SWEP:DoHeat()
|
|
if self.NextHeatDissipateTime > CurTime() then return end
|
|
|
|
--local diss = self.HeatDissipation or 2
|
|
--diss = diss * self:GetBuff_Mult("Mult_HeatDissipation")
|
|
local diss = self:GetBuff("HeatDissipation") or 2
|
|
local ft = FrameTime()
|
|
self.Heat = self:GetHeat() - (ft * diss)
|
|
|
|
self.Heat = math.max(self.Heat, 0)
|
|
|
|
self:SetHeat(self.Heat)
|
|
|
|
if self.Heat <= 0 and self:GetHeatLocked() then
|
|
self:SetHeatLocked(false)
|
|
end
|
|
end
|
|
|
|
function SWEP:HeatEnabled()
|
|
return self.Jamming or self:GetBuff_Override("Override_Jamming")
|
|
end
|
|
|
|
function SWEP:MalfunctionEnabled()
|
|
local cvar = ArcCW.ConVars["malfunction"]:GetInt()
|
|
return cvar == 2 or (cvar == 1 and self:GetBuff_Override("Override_Malfunction", self.Malfunction))
|
|
end
|
|
|
|
function SWEP:GetMalfunctionAnimation()
|
|
local anim = self:SelectAnimation("unjam")
|
|
if !self.Animations[anim] then
|
|
anim = self:SelectAnimation("fix")
|
|
anim = self:GetBuff_Hook("Hook_SelectFixAnim", anim) or anim
|
|
end
|
|
if !self.Animations[anim] then anim = self:SelectAnimation("cycle") end
|
|
if !self.Animations[anim] then anim = nil end
|
|
return anim
|
|
end
|
|
|
|
function SWEP:DoMalfunction(post)
|
|
|
|
if !IsFirstTimePredicted() then return end
|
|
if !self:MalfunctionEnabled() then return false end
|
|
local shouldpost = self:GetBuff_Override("Override_MalfunctionPostFire", self.MalfunctionPostFire)
|
|
if post != shouldpost then return false end
|
|
|
|
-- Auto calculated malfunction mean
|
|
if self.MalfunctionMean == nil then
|
|
local mm
|
|
if self.Jamming then mm = self.HeatCapacity * 4
|
|
else mm = self.Primary.ClipSize * 8 end
|
|
|
|
if self.ManualAction then
|
|
-- Manual guns are less likely to jam
|
|
mm = mm * 2
|
|
else
|
|
-- Burst and semi only guns are less likely to jam
|
|
local a, b = false, false
|
|
for k, v in pairs(self.Firemodes) do
|
|
if !v.Mode then continue end
|
|
if v.Mode == 2 then a = true
|
|
elseif v.Mode < 0 then b = true end
|
|
end
|
|
if !a and b then
|
|
mm = mm * 1.25
|
|
elseif !a and !b then
|
|
mm = mm * 1.5
|
|
end
|
|
end
|
|
self.MalfunctionMean = mm
|
|
end
|
|
|
|
local cvar = math.max(ArcCW.ConVars["mult_malfunction"]:GetFloat(), 0.00000001)
|
|
local mean = self:GetBuff("MalfunctionMean") / cvar
|
|
local var = mean * math.Clamp(self:GetBuff("MalfunctionVariance") * math.max(1, math.sqrt(cvar)), 0, 1)
|
|
local count = (self.ShotsSinceMalfunction or 0)
|
|
|
|
if !self.NextMalfunction then
|
|
math.randomseed(math.Round(util.SharedRandom(count, -1337, 1337, !game.SinglePlayer() and self:GetOwner():GetCurrentCommand():CommandNumber() or CurTime()) * (self:EntIndex() % 30241)))
|
|
self.NextMalfunction = math.ceil(math.sqrt(-2 * var * math.log(math.random())) * math.cos(2 * math.pi * math.random()))
|
|
end
|
|
|
|
local ret = self:GetBuff_Hook("Hook_Malfunction", count, true)
|
|
if ret != nil then return ret end
|
|
|
|
-- if self:Clip1() <= 1 then return false end -- Don't fucking
|
|
|
|
--print(mean, var, count, self.NextMalfunction)
|
|
if count >= self.NextMalfunction + mean then
|
|
local ret2 = self:GetBuff_Hook("Hook_OnMalfunction", count, true)
|
|
if ret2 then return false end
|
|
|
|
self:MyEmitSound(self:GetBuff_Override("Override_MalfunctionSound") or self.MalfunctionSound, 75, 100, 1, CHAN_ITEM)
|
|
|
|
local wait = self:GetBuff("MalfunctionWait")
|
|
self:SetNextPrimaryFire(CurTime() + wait)
|
|
|
|
local anim = self:GetMalfunctionAnimation()
|
|
if !anim or self:GetBuff_Override("Override_MalfunctionJam", self.MalfunctionJam) then
|
|
self:SetMalfunctionJam(true)
|
|
else
|
|
self:SetTimer(wait,
|
|
function()
|
|
self:MalfunctionClear()
|
|
end)
|
|
end
|
|
|
|
self:GetBuff_Hook("Hook_PostMalfunction")
|
|
self.ShotsSinceMalfunction = 0
|
|
self.NextMalfunction = nil
|
|
|
|
self:SetBurstCount(0)
|
|
|
|
return true
|
|
else
|
|
self.ShotsSinceMalfunction = (self.ShotsSinceMalfunction or 0) + 1
|
|
return false
|
|
end
|
|
end
|
|
|
|
function SWEP:MalfunctionClear()
|
|
|
|
if self:GetBuff_Override("Override_MalfunctionTakeRound", self.MalfunctionTakeRound) then
|
|
self:TakePrimaryAmmo(self:GetBuff("AmmoPerShot"))
|
|
end
|
|
|
|
local anim = self:GetMalfunctionAnimation()
|
|
if anim then
|
|
self:PlayAnimation(anim, self:GetBuff_Mult("Mult_MalfunctionFixTime"), true, 0, true)
|
|
local wait = self:GetAnimKeyTime(anim) - 0.01
|
|
self:SetTimer(wait,
|
|
function()
|
|
self:SetMalfunctionJam(false)
|
|
self:PlayIdleAnimation(true)
|
|
end)
|
|
return true
|
|
else
|
|
self:SetMalfunctionJam(false)
|
|
return false
|
|
end
|
|
end |