Залив
This commit is contained in:
279
gamemodes/cod_custom/gamemode/server/sv_abilities.lua
Normal file
279
gamemodes/cod_custom/gamemode/server/sv_abilities.lua
Normal file
@@ -0,0 +1,279 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user