Files
wnsrc/gamemodes/terrortown/gamemode/radar.lua
lifestorm 94063e4369 Upload
2024-08-04 22:55:00 +03:00

82 lines
2.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/
--]]
-- Traitor radar functionality
-- should mirror client
local chargetime = 30
local math = math
local function RadarScan(ply, cmd, args)
if IsValid(ply) and ply:IsTerror() then
if ply:HasEquipmentItem(EQUIP_RADAR) then
if ply.radar_charge > CurTime() then
LANG.Msg(ply, "radar_charging")
return
end
ply.radar_charge = CurTime() + chargetime
local scan_ents = player.GetAll()
table.Add(scan_ents, ents.FindByClass("ttt_decoy"))
local targets = {}
for k, p in ipairs(scan_ents) do
if ply == p or (not IsValid(p)) then continue end
if p:IsPlayer() then
if not p:IsTerror() then continue end
if p:GetNWBool("disguised", false) and (not ply:IsTraitor()) then continue end
end
local pos = p:LocalToWorld(p:OBBCenter())
-- Round off, easier to send and inaccuracy does not matter
pos.x = math.Round(pos.x)
pos.y = math.Round(pos.y)
pos.z = math.Round(pos.z)
local role = p:IsPlayer() and p:GetRole() or -1
if not p:IsPlayer() then
-- Decoys appear as innocents for non-traitors
if not ply:IsTraitor() then
role = ROLE_INNOCENT
end
elseif role != ROLE_INNOCENT and role != ply:GetRole() then
-- Detectives/Traitors can see who has their role, but not who
-- has the opposite role.
role = ROLE_INNOCENT
end
table.insert(targets, {role=role, pos=pos})
end
net.Start("TTT_Radar")
net.WriteUInt(#targets, 8)
for k, tgt in ipairs(targets) do
net.WriteUInt(tgt.role, 2)
net.WriteInt(tgt.pos.x, 15)
net.WriteInt(tgt.pos.y, 15)
net.WriteInt(tgt.pos.z, 15)
end
net.Send(ply)
else
LANG.Msg(ply, "radar_not_owned")
end
end
end
concommand.Add("ttt_radar_scan", RadarScan)