Files
call-of-duty-tdm/gamemodes/cod_custom/gamemode/server/sv_abilities.lua
2026-03-30 10:39:52 +03:00

279 lines
9.1 KiB
Lua

local meta = FindMetaTable("Player")
function COD:IsAllowedSelfRevive()
return COD.DataTable["Gamemode"] != 3
end
function meta:StopSlide()
return self.Takedowning or self:GetNWBool('Downed') or self:GetNWString('SVAnim') != "" or self:WaterLevel() > 1 or !self:Alive() or !self:OnGround()
end
function meta:Sliding(bool)
if bool then
if isvector(self.SlidingVelocity) then return end
local ang = self:GetAngles()
ang.x = 0
ang.z = 0
local vec = ang:Forward()*32
self.SlidingDuration = CurTime()+1
self.SlidingVelocity = vec
self:SetNWBool('Sliding', true)
self:EmitSound("tdmg/ply/slide"..math.random(1,3)..".wav")
self:ViewPunch(Angle(-5,0,0))
else
self.SlidingVelocity = nil
self:SetNWBool('Sliding', false)
end
end
function meta:IsDowned()
return self:GetNWBool('Downed')
end
function meta:MovingDirection(threshold) --This function was made by OpenAI ChatGPT
threshold = threshold or 0.1
local vel = self:GetVelocity()
local forward = self:GetForward()
local right = self:GetRight()
local forwardDot = vel:Dot(forward)
local rightDot = vel:Dot(right)
if forwardDot > threshold then
return "forward"
elseif forwardDot < -threshold then
return "backward"
end
if rightDot > threshold then
return "right"
elseif rightDot < -threshold then
return "left"
end
return "stand"
end
function meta:Down()
if COD:IsAllowedSelfRevive() then
self:SetNWFloat('DownedTime', CurTime()+15)
else
self:SetNWFloat('DownedTime', CurTime()+30)
end
self:SetNWBool('Downed', true)
self:SetViewOffset( Vector(0,0,24) )
self:SetViewOffsetDucked( Vector(0,0,24) )
self:SetHealth(50)
self:SetJumpPower(0)
self.AlreadyWasDowned = true
self.ReviveNumber = 0
self:SetSVAnimation("laststand_down", true)
self:GodEnable()
self:SetActiveWeapon(nil)
timer.Simple(0.5, function()
if !IsValid(self) then return end
self:GodDisable()
end)
end
function meta:Revive(died)
self:SetViewOffset( Vector(0,0,64) )
self:SetViewOffsetDucked( Vector(0,0,32) )
self:SetJumpPower(128)
self:SetHealth(25)
if died then
self:Kill()
else
self:SetSVAnimation("laststand_standup", true)
end
self:SetNWBool('Downed', false)
self.RevivingSelf = false
end
hook.Add("SetupMove", "TDMSetupMove1", function(ply, mv, cmd)
if ply:IsDowned() then
if ply:KeyDown(IN_USE) or IsValid(ply:GetNWEntity('Reviver')) then
mv:SetForwardSpeed(1)
mv:SetSideSpeed(1)
else
mv:SetMaxSpeed(25)
mv:SetMaxClientSpeed(25)
end
end
if isvector(ply.SlidingVelocity) then
mv:SetMaxSpeed(1)
mv:SetMaxClientSpeed(1)
end
end)
hook.Add("Think", "TDMSliding", function()
for _, ent in ipairs(player.GetAll()) do
if isvector(ent.SlidingVelocity) then
ent:SetVelocity(ent.SlidingVelocity)
end
if ent:KeyDown(IN_SPEED) and ent:KeyDown(IN_DUCK) and not ent:Crouching() and !ent:StopSlide() then
ent:Sliding(true)
end
if !ent:KeyDown(IN_DUCK) and isvector(ent.SlidingVelocity) or ent.SlidingDuration and ent.SlidingDuration < CurTime() or ent:StopSlide() then
ent:Sliding(false)
end
end
end)
hook.Add("PlayerDeath", "TDMRevive", function(ply)
if ply:IsDowned() then
ply:Revive()
end
ply.AlreadyWasDowned = false
end)
hook.Add("Think", "TDMAnimsRevive", function()
local plys2 = player.GetAll()
for i=1,#plys2 do
local ply = plys2[i]
if ply:IsDowned() and ply:GetNWFloat('DownedTime') < CurTime() and (not ply:KeyDown(IN_USE) or !COD:IsAllowedSelfRevive()) and !IsValid(ply:GetNWEntity('Reviver')) and not ply.Takedowning then
ply:Revive(true)
end
if ply:Alive() and not ply:IsDowned() and ply:KeyDown(IN_USE) then
local tr = ply:GetEyeTrace()
local ent = tr.Entity
local dist = ply:EyePos():DistToSqr(tr.HitPos) < 5000
if ent:IsPlayer() and dist and ent:IsDowned() and ply:Team() == ent:Team() then
ent:SetNWEntity('Reviver', ply)
ply.RevivingThatEntity = ent
end
if !IsValid(ply.RevivingThatEntity) or !ply.RevivingThatEntity:Alive() or not ply.RevivingThatEntity:IsDowned() then
ply.RevivingThatEntity = nil
if ply:GetNWString('SVAnim') == "laststand_startrevive" and not ply.Takedowning then
ply:SetSVAnimation("")
end
end
end
if ply:IsDowned() then
local rev = ply:GetNWEntity('Reviver')
ply:SetActiveWeapon(nil)
if !IsValid(rev) and ply:KeyDown(IN_USE) and not ply.Takedowning and COD:IsAllowedSelfRevive() then
ply.ReviveNumber = ply.ReviveNumber + FrameTime()/5.5
if not ply.RevivingSelf then
ply:SetSVAnimation("laststand_selfrevive", true)
ply.RevivingSelf = true
end
elseif !IsValid(rev) and not ply:KeyDown(IN_USE) and not ply.Takedowning then
ply.ReviveNumber = 0
if ply.RevivingSelf then
ply:SetSVAnimation("")
ply.RevivingSelf = false
end
end
if IsValid(rev) then
if rev:KeyDown(IN_USE) and rev:GetEyeTrace().Entity == ply and not ply.Takedowning then
ply.ReviveNumber = ply.ReviveNumber + FrameTime()/3
rev:SetActiveWeapon(nil)
if not rev.RevivingTarget then
rev:SetSVAnimation("laststand_startrevive")
rev.RevivingTarget = true
end
else
if rev.RevivingTarget then
rev:SetSVAnimation("")
rev:SelectWeapon(rev:GetNWString('MainWep'))
rev.RevivingTarget = false
end
ply:SetNWEntity('Reviver', NULL)
end
end
if ply.ReviveNumber >= 1 then
ply.ReviveNumber = 0
ply:SetSVAnimation("")
if IsValid(rev) then
rev:ChangeScore(100)
rev:SetSVAnimation("")
rev:SelectWeapon(rev:GetNWString('MainWep'))
rev.RevivingTarget = false
COD:GiveMessageCenter({rev}, 5)
end
ply:Revive()
ply:SelectWeapon(ply:GetNWString('MainWep'))
end
else
ply:SetNWEntity('Reviver', NULL)
end
end
end)
hook.Add("CalcMainActivity", "TDMAnimsRevive", function(ply, vel)
if ply:IsDowned() and ply:GetNWString('SVAnim') == "" then
local anim1 = ply:LookupSequence("laststand_idle")
local anim2 = ply:LookupSequence("laststand_crawl_forward")
local anim3 = ply:LookupSequence("laststand_crawl_backward")
local anim4 = ply:LookupSequence("laststand_crawl_left")
local anim5 = ply:LookupSequence("laststand_crawl_right")
local dir = ply:MovingDirection(8)
local vel = ply:GetVelocity():Length2D() > 10
if dir == "forward" and vel then
return -1, anim2
elseif dir == "backward" and vel then
return -1, anim3
elseif dir == "left" and vel then
return -1, anim4
elseif dir == "right" and vel then
return -1, anim5
else
return -1, anim1
end
end
end)
local delay = CurTime()+5
hook.Add("Think", "TDMApplyCommands", function()
if delay < CurTime() then
delay = CurTime()+5
for k, v in pairs(COD.ApplyCommands["Server"]) do
RunConsoleCommand(k, v)
end
end
end)
concommand.Add("cod_jointeam", function(ply, cmd, args)
local float = tonumber(args[1])
if ply:IsSuperAdmin() then
ply:SetTeam(float)
ply:Spawn()
end
end)
---------------------------------------------------------------------
function COD:InfilStart()
if COD.DataTable["Gamemode"] == 4 then return end
local t1s, t2s = COD.DataTable["Team1_InfilSettings"], COD.DataTable["Team2_InfilSettings"]
for k1, v1 in pairs(t1s.positions) do
timer.Simple(0.1*k1, function()
local infil = ents.Create("tdm_player_infil")
infil:SetPos(v1)
infil:SetAngles(t1s.angles[k1])
infil.Infil = t1s.type
infil.TeamChoose = 1
infil:Spawn()
end)
end
for k2, v2 in pairs(t2s.positions) do
timer.Simple(0.1*k2, function()
local infil = ents.Create("tdm_player_infil")
infil:SetPos(v2)
infil:SetAngles(t2s.angles[k2])
infil.Infil = t2s.type
infil.TeamChoose = 2
infil:Spawn()
end)
end
end
hook.Add("COD.ChangeState", "TDM_Infil", function(start)
if COD.DataTable["Enable_InfilAnimations"] and start then
COD:InfilStart()
end
end)