168 lines
4.1 KiB
Lua
168 lines
4.1 KiB
Lua
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) |