mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 05:43:46 +03:00
198 lines
5.4 KiB
Lua
198 lines
5.4 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/
|
||
|
|
--]]
|
||
|
|
|
||
|
|
|
||
|
|
local PLUGIN = PLUGIN
|
||
|
|
|
||
|
|
util.AddNetworkString("ixInfestationZoneCreate")
|
||
|
|
util.AddNetworkString("ixInfestationZoneNetwork")
|
||
|
|
|
||
|
|
ix.log.AddType("infestationLog", function(_, log)
|
||
|
|
return "[INFESTATION] " .. log
|
||
|
|
end, FLAG_WARNING)
|
||
|
|
|
||
|
|
net.Receive("ixInfestationZoneCreate", function(length, client)
|
||
|
|
local name = net.ReadString()
|
||
|
|
local type = net.ReadString()
|
||
|
|
local spread = net.ReadFloat()
|
||
|
|
|
||
|
|
local infestationInfo = {
|
||
|
|
type = type,
|
||
|
|
spread = spread,
|
||
|
|
spreadProgress = 1,
|
||
|
|
entities = {},
|
||
|
|
paused = false
|
||
|
|
}
|
||
|
|
|
||
|
|
local corePos = Vector(0, 0, 0)
|
||
|
|
local infestationProps = {}
|
||
|
|
|
||
|
|
for _, entity in pairs(ents.FindByClass("prop_physics")) do
|
||
|
|
if (!entity:GetNetVar("infestationProp") or entity:GetNetVar("infestationProp") != client:SteamID()) then continue end
|
||
|
|
|
||
|
|
local entInfo = {
|
||
|
|
model = entity:GetModel(),
|
||
|
|
position = entity:GetPos(),
|
||
|
|
angles = entity:GetAngles(),
|
||
|
|
harvested = false,
|
||
|
|
core = false
|
||
|
|
}
|
||
|
|
|
||
|
|
if (entity:GetNetVar("infestationCore")) then
|
||
|
|
entInfo.core = true
|
||
|
|
corePos = entity:GetPos()
|
||
|
|
end
|
||
|
|
|
||
|
|
infestationProps[#infestationProps + 1] = entInfo
|
||
|
|
|
||
|
|
if (entity:GetNetVar("infestationCore")) then
|
||
|
|
local infestationCore = ents.Create("ix_infestation_prop")
|
||
|
|
infestationCore:SetModel(entity:GetModel())
|
||
|
|
infestationCore:SetPos(entity:GetPos())
|
||
|
|
infestationCore:SetAngles(entity:GetAngles())
|
||
|
|
infestationCore:SetHarvested(false)
|
||
|
|
infestationCore:SetInfestation(name)
|
||
|
|
infestationCore:SetType(type)
|
||
|
|
infestationCore:SetCore(true)
|
||
|
|
infestationCore:SetSprayed(false)
|
||
|
|
infestationCore:Spawn()
|
||
|
|
ix.saveEnts:SaveEntity(infestationCore)
|
||
|
|
end
|
||
|
|
|
||
|
|
entity:Remove()
|
||
|
|
end
|
||
|
|
|
||
|
|
table.sort(infestationProps, function(a, b)
|
||
|
|
return a.position:Distance(corePos) < b.position:Distance(corePos) -- Sort by closest to furthest.
|
||
|
|
end)
|
||
|
|
|
||
|
|
infestationInfo.entities = infestationProps
|
||
|
|
|
||
|
|
PLUGIN:UpdateInfestation(name, infestationInfo)
|
||
|
|
PLUGIN:InfestationTimer(name, spread)
|
||
|
|
|
||
|
|
client:SetNetVar("InfestationEditMode", 0)
|
||
|
|
client:NotifyLocalized("zoneCreated", name)
|
||
|
|
ix.log.Add(client, "infestationLog", client:GetName() .. " (" .. client:SteamID() .. ") created a new " .. type .. "-Class \"" .. name .. "\" Infestation Zone.")
|
||
|
|
end)
|
||
|
|
|
||
|
|
function PLUGIN:SpreadInfestation(identification)
|
||
|
|
local infestationInfo = ix.infestation.stored[identification]
|
||
|
|
|
||
|
|
if (!infestationInfo) then
|
||
|
|
if (timer.Exists("infestation_" .. identification .. "_timer")) then
|
||
|
|
timer.Remove("infestation_" .. identification .. "_timer")
|
||
|
|
|
||
|
|
return
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
if (infestationInfo.paused) then
|
||
|
|
if (timer.Exists("infestation_" .. identification .. "_timer")) then
|
||
|
|
timer.Remove("infestation_" .. identification .. "_timer")
|
||
|
|
end
|
||
|
|
|
||
|
|
return
|
||
|
|
end
|
||
|
|
|
||
|
|
local entityInfo = infestationInfo.entities[infestationInfo.spreadProgress + 1]
|
||
|
|
|
||
|
|
if (!entityInfo) then
|
||
|
|
infestationInfo.paused = true
|
||
|
|
|
||
|
|
self:UpdateInfestation(identification, infestationInfo)
|
||
|
|
|
||
|
|
return
|
||
|
|
end
|
||
|
|
|
||
|
|
local infestationProp = ents.Create("ix_infestation_prop")
|
||
|
|
infestationProp:SetModel(entityInfo.model)
|
||
|
|
infestationProp:SetPos(entityInfo.position)
|
||
|
|
infestationProp:SetAngles(entityInfo.angles)
|
||
|
|
infestationProp:SetHarvested(entityInfo.harvested)
|
||
|
|
infestationProp:SetInfestation(identification)
|
||
|
|
infestationProp:SetType(infestationInfo.type)
|
||
|
|
infestationProp:SetCore(entityInfo.core)
|
||
|
|
infestationProp:SetSprayed(false)
|
||
|
|
infestationProp:Spawn()
|
||
|
|
ix.saveEnts:SaveEntity(infestationProp)
|
||
|
|
|
||
|
|
infestationInfo.spreadProgress = infestationInfo.spreadProgress + 1
|
||
|
|
|
||
|
|
if (infestationInfo.spreadProgress >= #infestationInfo.entities) then
|
||
|
|
infestationInfo.paused = true
|
||
|
|
end
|
||
|
|
|
||
|
|
self:UpdateInfestation(identification, infestationInfo)
|
||
|
|
end
|
||
|
|
|
||
|
|
function PLUGIN:SaveInfestationProps()
|
||
|
|
local infestationProps = {}
|
||
|
|
|
||
|
|
for _, prop in ipairs(ents.FindByClass("ix_infestation_prop")) do
|
||
|
|
infestationProps[#infestationProps + 1] = {
|
||
|
|
model = prop:GetModel(),
|
||
|
|
position = prop:GetPos(),
|
||
|
|
angles = prop:GetAngles(),
|
||
|
|
harvested = prop:GetHarvested(),
|
||
|
|
infestation = prop:GetInfestation(),
|
||
|
|
type = prop:GetType(),
|
||
|
|
core = prop:GetCore(),
|
||
|
|
sprayed = prop:GetSprayed()
|
||
|
|
}
|
||
|
|
end
|
||
|
|
|
||
|
|
ix.data.Set("infestationProps", infestationProps)
|
||
|
|
end
|
||
|
|
|
||
|
|
function PLUGIN:UpdateInfestation(identification, data)
|
||
|
|
ix.infestation.stored[identification] = data
|
||
|
|
|
||
|
|
ix.data.Set("infestationZones", ix.infestation.stored)
|
||
|
|
|
||
|
|
net.Start("ixInfestationZoneNetwork")
|
||
|
|
net.WriteTable(ix.infestation.stored)
|
||
|
|
net.Broadcast()
|
||
|
|
|
||
|
|
ix.saveEnts:SaveClass("ix_infestation_prop")
|
||
|
|
self:SaveInfestationProps()
|
||
|
|
end
|
||
|
|
|
||
|
|
function PLUGIN:InfestationTimer(identification, time)
|
||
|
|
if (timer.Exists("infestation_" .. identification .. "_timer")) then
|
||
|
|
timer.Adjust("infestation_" .. identification .. "_timer", time, 0, function()
|
||
|
|
self:SpreadInfestation(identification)
|
||
|
|
end)
|
||
|
|
else
|
||
|
|
timer.Create("infestation_" .. identification .. "_timer", time, 0, function()
|
||
|
|
self:SpreadInfestation(identification)
|
||
|
|
end)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function PLUGIN:SaveInfestationTanks()
|
||
|
|
local data = {}
|
||
|
|
|
||
|
|
for _, tank in ipairs(ents.FindByClass("ix_infestation_tank")) do
|
||
|
|
data[#data + 1] = {
|
||
|
|
position = tank:GetPos(),
|
||
|
|
angles = tank:GetAngles(),
|
||
|
|
chemVolume = tank:GetChemicalVolume(),
|
||
|
|
chemType = tank:GetChemicalType(),
|
||
|
|
hoseAttached = tank:GetHoseAttached(),
|
||
|
|
applicatorAttached = tank:GetApplicatorAttached(),
|
||
|
|
hoseConnected = tank:GetHoseConnected(),
|
||
|
|
color = tank:GetColor()
|
||
|
|
}
|
||
|
|
end
|
||
|
|
|
||
|
|
ix.data.Set("infestationTanks", data)
|
||
|
|
end
|