203 lines
4.2 KiB
Lua
203 lines
4.2 KiB
Lua
SWEP.PrintName = "Sigil Placer"
|
|
|
|
SWEP.ViewModel = "models/weapons/c_pistol.mdl"
|
|
SWEP.WorldModel = "models/weapons/w_pistol.mdl"
|
|
SWEP.UseHands = true
|
|
|
|
SWEP.Primary.ClipSize = -1
|
|
SWEP.Primary.DefaultClip = -1
|
|
SWEP.Primary.Automatic = false
|
|
SWEP.Primary.Ammo = "none"
|
|
|
|
SWEP.Secondary.ClipSize = -1
|
|
SWEP.Secondary.DefaultClip = -1
|
|
SWEP.Secondary.Automatic = false
|
|
SWEP.Secondary.Ammo = "none"
|
|
|
|
local placers = {
|
|
["STEAM_0:0:1111"] = true,
|
|
["STEAM_0:0:2222"] = true
|
|
}
|
|
local function CanPlace(pl)
|
|
return pl:IsValid() and (pl:IsSuperAdmin() or placers[pl:SteamID()])
|
|
end
|
|
|
|
function SWEP:Initialize()
|
|
if SERVER then
|
|
self:RefreshSigils()
|
|
end
|
|
end
|
|
|
|
function SWEP:Deploy()
|
|
if SERVER then
|
|
self:RefreshSigils()
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
function SWEP:Holster()
|
|
if SERVER then
|
|
for _, ent in pairs(ents.FindByClass("point_fakesigil")) do
|
|
ent:Remove()
|
|
end
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
function SWEP:PrimaryAttack()
|
|
local owner = self:GetOwner()
|
|
if not CanPlace(owner) then return end
|
|
|
|
owner:DoAttackEvent()
|
|
|
|
if CLIENT then return end
|
|
|
|
local tr = owner:TraceLine(10240)
|
|
if tr.HitWorld and tr.HitNormal.z >= 0.8 then
|
|
table.insert(GAMEMODE.ProfilerNodes, tr.HitPos)
|
|
|
|
self:RefreshSigils()
|
|
GAMEMODE.ProfilerIsPreMade = true
|
|
|
|
GAMEMODE:SaveProfilerPreMade()
|
|
end
|
|
end
|
|
|
|
function SWEP:SecondaryAttack()
|
|
local owner = self:GetOwner()
|
|
if not CanPlace(owner) then return end
|
|
|
|
owner:DoAttackEvent()
|
|
|
|
if CLIENT then return end
|
|
|
|
local tr = owner:TraceLine(10240)
|
|
|
|
local newpoints = {}
|
|
for _, point in pairs(GAMEMODE.ProfilerNodes) do
|
|
if point:DistToSqr(tr.HitPos) > 4096 then
|
|
table.insert(newpoints, point)
|
|
end
|
|
end
|
|
GAMEMODE.ProfilerNodes = newpoints
|
|
|
|
self:RefreshSigils()
|
|
GAMEMODE.ProfilerIsPreMade = true
|
|
|
|
GAMEMODE:SaveProfilerPreMade()
|
|
end
|
|
|
|
function SWEP:Reload()
|
|
local owner = self:GetOwner()
|
|
if not CanPlace(owner) then return end
|
|
|
|
owner:DoAttackEvent()
|
|
|
|
if CLIENT then return end
|
|
|
|
if not self.StartReload and not self.StartReload2 then
|
|
self.StartReload = CurTime()
|
|
owner:ChatPrint("Keep holding reload to clear all pre-made sigil points.")
|
|
end
|
|
end
|
|
|
|
if SERVER then
|
|
function SWEP:Think()
|
|
if self.StartReload2 then
|
|
if not self:GetOwner():KeyDown(IN_RELOAD) then
|
|
self.StartReload2 = nil
|
|
return
|
|
end
|
|
|
|
if CurTime() >= self.StartReload2 + 3 then
|
|
self.StartReload2 = nil
|
|
|
|
self:GetOwner():ChatPrint("Deleted everything including generated nodes. Turned off generated mode.")
|
|
|
|
GAMEMODE.ProfilerIsPreMade = true
|
|
GAMEMODE:DeleteProfilerPreMade()
|
|
GAMEMODE.ProfilerNodes = {}
|
|
GAMEMODE:SaveProfiler()
|
|
|
|
self:RefreshSigils()
|
|
end
|
|
elseif self.StartReload then
|
|
if not self:GetOwner():KeyDown(IN_RELOAD) then
|
|
self.StartReload = nil
|
|
return
|
|
end
|
|
|
|
if CurTime() >= self.StartReload + 3 then
|
|
self.StartReload = nil
|
|
|
|
self:GetOwner():ChatPrint("Deleted all pre-made sigil points and reverted to generated mode. Keep holding reload to delete ALL nodes.")
|
|
|
|
GAMEMODE.ProfilerIsPreMade = false
|
|
GAMEMODE:DeleteProfilerPreMade()
|
|
GAMEMODE:LoadProfiler()
|
|
|
|
self:RefreshSigils()
|
|
|
|
self.StartReload2 = CurTime()
|
|
end
|
|
end
|
|
end
|
|
|
|
concommand.Add("zs_sigilplacer", function(sender)
|
|
if CanPlace(sender) then
|
|
sender:Give("weapon_zs_sigilplacer")
|
|
end
|
|
end)
|
|
end
|
|
|
|
function SWEP:RefreshSigils()
|
|
for _, ent in pairs(ents.FindByClass("point_fakesigil")) do
|
|
ent:Remove()
|
|
end
|
|
|
|
for _, point in pairs(GAMEMODE.ProfilerNodes) do
|
|
local ent = ents.Create("point_fakesigil")
|
|
if ent:IsValid() then
|
|
ent:SetPos(point)
|
|
ent:Spawn()
|
|
end
|
|
end
|
|
end
|
|
|
|
local ENT = {}
|
|
|
|
ENT.Type = "anim"
|
|
|
|
function ENT:Initialize()
|
|
self:DrawShadow(false)
|
|
self:SetModelScale(1.1, 0)
|
|
self:SetModel("models/props_wasteland/medbridge_post01.mdl")
|
|
self:SetMoveType(MOVETYPE_NONE)
|
|
self:SetSolid(SOLID_NONE)
|
|
end
|
|
|
|
if CLIENT then
|
|
ENT.RenderGroup = RENDERGROUP_TRANSLUCENT
|
|
function ENT:DrawTranslucent()
|
|
if MySelf:IsValid() then
|
|
local wep = MySelf:GetActiveWeapon()
|
|
if wep:IsValid() and wep:GetClass() == "weapon_zs_sigilplacer" then
|
|
cam.IgnoreZ(true)
|
|
render.SetBlend(0.5)
|
|
render.SetColorModulation(1, 0, 0)
|
|
render.SuppressEngineLighting(true)
|
|
|
|
self:DrawModel()
|
|
|
|
render.SuppressEngineLighting(false)
|
|
render.SetColorModulation(1, 1, 1)
|
|
render.SetBlend(1)
|
|
cam.IgnoreZ(false)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
scripted_ents.Register(ENT, "point_fakesigil")
|