Залив
This commit is contained in:
168
gamemodes/cod_custom/gamemode/server/sv_killcam.lua
Normal file
168
gamemodes/cod_custom/gamemode/server/sv_killcam.lua
Normal file
@@ -0,0 +1,168 @@
|
||||
util.AddNetworkString("COD.KillcamSend")
|
||||
|
||||
COD.LastKillData = {
|
||||
length = 0,
|
||||
data = ""
|
||||
}
|
||||
|
||||
function COD:ShowLastKillCam(delay)
|
||||
if not COD.DataTable["Enable_KillCam"] then return end
|
||||
local len = COD.LastKillData.length
|
||||
local tab = COD.LastKillData.data
|
||||
timer.Simple(delay, function()
|
||||
net.Start("COD.KillcamSend")
|
||||
net.WriteUInt(len, 32)
|
||||
net.WriteData(tab, len)
|
||||
net.WriteBool(true)
|
||||
net.Broadcast()
|
||||
end)
|
||||
end
|
||||
|
||||
function COD:ShowKillCam(ply, att, delay)
|
||||
if not COD.DataTable["Enable_KillCam"] then return end
|
||||
|
||||
if !istable(ply) then
|
||||
ply = {ply}
|
||||
end
|
||||
if not delay then
|
||||
delay = 0
|
||||
end
|
||||
|
||||
if att.KillCamTable then
|
||||
local tab = att.KillCamTable
|
||||
local num2 = #att.KillCamTable-300
|
||||
|
||||
for i=1,num2 do
|
||||
table.remove(tab, 1)
|
||||
end
|
||||
|
||||
local tab3 = util.TableToJSON(tab)
|
||||
tab3 = util.Compress(tab3)
|
||||
local flt = #tab3
|
||||
|
||||
if flt < 4294967295 then
|
||||
for _, en in pairs(ply) do
|
||||
if IsValid(en) then
|
||||
net.Start("COD.KillcamSend")
|
||||
net.WriteUInt(flt, 32)
|
||||
net.WriteData(tab3, flt)
|
||||
net.WriteBool(false)
|
||||
net.Send(en)
|
||||
end
|
||||
end
|
||||
|
||||
COD.LastKillData = {
|
||||
length = flt,
|
||||
data = tab3
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
hook.Add("Tick", "RecordCamBot", function()
|
||||
if COD.DataTable["Enable_KillCam"] then
|
||||
local plyall = player.GetAll()
|
||||
for k=1,#plyall do
|
||||
local ply = plyall[k]
|
||||
|
||||
if !COD.DataTable["Enable_KillCam_WithBots"] and !ply:IsPlayer() then continue end
|
||||
|
||||
if not ply.KillCamTable then
|
||||
ply.KillCamTable = {}
|
||||
end
|
||||
|
||||
if #ply.KillCamTable > 500 then
|
||||
table.remove(ply.KillCamTable, 1)
|
||||
end
|
||||
|
||||
local plytab = {
|
||||
model = ply:GetModel(),
|
||||
ang = (ply:GetAimVector()):GetNormalized():Angle(),
|
||||
pos = ply:EyePos()-ply:GetAimVector()*32+ply:GetUp()*16,
|
||||
snd = "",
|
||||
blt = {},
|
||||
hit = 0
|
||||
}
|
||||
|
||||
if ply:GetNWString('SVAnim') != "" then
|
||||
plytab.ang = (ply:GetForward()*1-ply:GetRight()*2):GetNormalized():Angle()
|
||||
plytab.pos = ply:GetAttachment(ply:LookupAttachment('eyes')).Pos+ply:GetRight()*64-ply:GetForward()*16
|
||||
end
|
||||
|
||||
if ply.VMSND and istable(ply.VMSND) then
|
||||
plytab.snd = ply.VMSND
|
||||
ply.VMSND = nil
|
||||
end
|
||||
|
||||
if ply.VMBLT then
|
||||
plytab.blt = ply.VMBLT
|
||||
ply.VMBLT = nil
|
||||
end
|
||||
|
||||
if ply.VMHIT then
|
||||
plytab.hit = ply.VMHIT
|
||||
ply.VMHIT = nil
|
||||
end
|
||||
|
||||
local otab = {
|
||||
ent = {},
|
||||
model = {},
|
||||
pos = {},
|
||||
ang = {},
|
||||
cycle = {},
|
||||
seq = {},
|
||||
alive = {}
|
||||
}
|
||||
|
||||
for i=1,#plyall do
|
||||
local pl = plyall[i]
|
||||
if pl:IsLineOfSightClear(ply) then
|
||||
table.insert(otab.ent, pl:EntIndex())
|
||||
table.insert(otab.model, pl:GetModel())
|
||||
table.insert(otab.pos, pl:GetPos())
|
||||
table.insert(otab.ang, Angle(0,math.Round(pl:EyeAngles().y),0))
|
||||
table.insert(otab.cycle, pl:GetCycle())
|
||||
table.insert(otab.seq, pl:GetSequenceName(pl:GetSequence()))
|
||||
table.insert(otab.alive, pl:Alive())
|
||||
end
|
||||
end
|
||||
|
||||
table.insert(ply.KillCamTable, {
|
||||
ply = plytab,
|
||||
other = otab,
|
||||
})
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
hook.Add("EntityEmitSound", "RecordCamBot", function(data)
|
||||
local ent = data.Entity
|
||||
|
||||
if ent:IsPlayer() or ent.IsBot and ent:IsBot() then
|
||||
if not istable(ent.VMSND) then
|
||||
ent.VMSND = {}
|
||||
end
|
||||
|
||||
table.insert(ent.VMSND, data.SoundName)
|
||||
end
|
||||
end)
|
||||
|
||||
hook.Add("EntityTakeDamage", "RecordCamBot", function(ent, data)
|
||||
local att = data:GetAttacker()
|
||||
if (att:IsPlayer() or att.IsBot and att:IsBot()) and (ent:IsPlayer() or ent.IsBot and ent:IsBot()) then
|
||||
att.VMHIT = 1
|
||||
if data:GetDamage() >= ent:Health()+ent:Armor() then
|
||||
att.VMHIT = 2
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
hook.Add("EntityFireBullets", "RecordCamBot", function(ent, data)
|
||||
if ent:IsPlayer() or ent.IsBot and ent:IsBot() then
|
||||
if not istable(ent.VMSND) then
|
||||
ent.VMSND = {}
|
||||
end
|
||||
|
||||
ent.VMBLT = data
|
||||
end
|
||||
end)
|
||||
Reference in New Issue
Block a user