mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 21:53:46 +03:00
Upload
This commit is contained in:
253
gamemodes/ixhl2rp/plugins/infestationcontrol/sv_hooks.lua
Normal file
253
gamemodes/ixhl2rp/plugins/infestationcontrol/sv_hooks.lua
Normal file
@@ -0,0 +1,253 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
|
||||
function PLUGIN:PlayerSpawnedProp(client, model, entity)
|
||||
if (!client:GetNetVar("InfestationEditMode") or client:GetNetVar("InfestationEditMode") == 0) then return end
|
||||
|
||||
if (client:GetNetVar("InfestationEditMode") == 1) then
|
||||
|
||||
|
||||
elseif (client:GetNetVar("InfestationEditMode") == 2) then
|
||||
|
||||
end
|
||||
|
||||
entity:SetNetVar("infestationProp", client:SteamID())
|
||||
end
|
||||
|
||||
function PLUGIN:RegisterSaveEnts()
|
||||
ix.saveEnts:RegisterEntity("ix_infestation_prop", true, true, true, {
|
||||
OnSave = function(entity, data) --OnSave
|
||||
data.model = entity:GetModel()
|
||||
data.harvested = entity:GetHarvested()
|
||||
data.infestation = entity:GetInfestation()
|
||||
data.type = entity:GetType()
|
||||
data.core = entity:GetCore()
|
||||
data.sprayed = entity:GetSprayed()
|
||||
end,
|
||||
OnRestore = function(entity, data) --OnRestore
|
||||
entity:SetModel(data.model)
|
||||
entity:SetHarvested(data.harvested)
|
||||
entity:SetInfestation(data.infestation)
|
||||
entity:SetType(data.type)
|
||||
entity:SetCore(data.core)
|
||||
entity:SetColor(data.harvested and Color(127, 127, 127) or Color(255, 255, 255))
|
||||
entity:SetSprayed(false)
|
||||
end,
|
||||
ShouldSave = function(entity) --ShouldSave
|
||||
if (entity:GetSprayed() or !entity:GetInfestation() or !ix.infestation.stored[entity:GetInfestation()]) then
|
||||
ix.saveEnts:DeleteEntity(entity)
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
return true
|
||||
end,
|
||||
ShouldRestore = function(data) --ShouldRestore
|
||||
return !data.sprayed, true
|
||||
end
|
||||
})
|
||||
|
||||
ix.saveEnts:RegisterEntity("ix_infestation_tank", true, true, true, {
|
||||
OnSave = function(entity, data) --OnSave
|
||||
data.chemVolume = entity:GetChemicalVolume()
|
||||
data.chemType = entity:GetChemicalType()
|
||||
data.hoseAttached = entity:GetHoseAttached()
|
||||
data.applicatorAttached = entity:GetApplicatorAttached()
|
||||
data.hoseConnected = entity:GetHoseConnected()
|
||||
end,
|
||||
OnRestore = function(entity, data) --OnRestore
|
||||
entity:SetChemicalVolume(data.chemVolume)
|
||||
entity:SetChemicalType(data.chemType)
|
||||
entity:SetHoseAttached(data.hoseAttached)
|
||||
entity:SetApplicatorAttached(data.applicatorAttached)
|
||||
entity:SetHoseConnected(false)
|
||||
entity:SetColor(data.color)
|
||||
entity:Spawn()
|
||||
|
||||
entity:SetBodygroup(entity:FindBodygroupByName("Hose"), data.hoseAttached and 0 or 1)
|
||||
entity:SetBodygroup(entity:FindBodygroupByName("Applicator"), data.applicatorAttached and 0 or 1)
|
||||
end
|
||||
})
|
||||
end
|
||||
|
||||
function PLUGIN:SaveData()
|
||||
ix.data.Set("infestationZones", ix.infestation.stored)
|
||||
|
||||
self:SaveInfestationProps()
|
||||
self:SaveInfestationTanks()
|
||||
end
|
||||
|
||||
function PLUGIN:LoadData()
|
||||
local data = ix.data.Get("infestationZones", {})
|
||||
ix.infestation.stored = data
|
||||
|
||||
for name, data in pairs(data) do
|
||||
self:InfestationTimer(name, data.spread)
|
||||
end
|
||||
|
||||
if (!ix.config.Get("SaveEntsOldLoadingEnabled")) then return end
|
||||
for _, data in ipairs(ix.data.Get("infestationProps", {})) do
|
||||
if (data.sprayed) then continue end
|
||||
if (!data.infestation or !ix.infestation.stored[data.infestation]) then continue end
|
||||
|
||||
local entity = ents.Create("ix_infestation_prop")
|
||||
entity:SetModel(data.model)
|
||||
entity:SetPos(data.position)
|
||||
entity:SetAngles(data.angles)
|
||||
entity:SetHarvested(data.harvested)
|
||||
entity:SetInfestation(data.infestation)
|
||||
entity:SetType(data.type)
|
||||
entity:SetCore(data.core)
|
||||
entity:SetSprayed(false)
|
||||
entity:SetColor(data.harvested and Color(127, 127, 127) or Color(255, 255, 255))
|
||||
entity:Spawn()
|
||||
end
|
||||
|
||||
for _, data in ipairs(ix.data.Get("infestationTanks", {})) do
|
||||
local entity = ents.Create("ix_infestation_tank")
|
||||
|
||||
entity:SetPos(data.position)
|
||||
entity:SetAngles(data.angles)
|
||||
entity:SetChemicalVolume(data.chemVolume)
|
||||
entity:SetChemicalType(data.chemType)
|
||||
entity:SetHoseAttached(data.hoseAttached)
|
||||
entity:SetApplicatorAttached(data.applicatorAttached)
|
||||
entity:SetHoseConnected(false)
|
||||
entity:SetColor(data.color)
|
||||
entity:Spawn()
|
||||
|
||||
entity:SetBodygroup(entity:FindBodygroupByName("Hose"), data.hoseAttached and 0 or 1)
|
||||
entity:SetBodygroup(entity:FindBodygroupByName("Applicator"), data.applicatorAttached and 0 or 1)
|
||||
end
|
||||
end
|
||||
|
||||
function PLUGIN:PlayerInitialSpawn(client)
|
||||
net.Start("ixInfestationZoneNetwork")
|
||||
net.WriteTable(ix.infestation.stored)
|
||||
net.Send(client)
|
||||
end
|
||||
|
||||
function PLUGIN:KeyPress(client, key)
|
||||
local editMode = client:GetNetVar("InfestationEditMode")
|
||||
|
||||
if (!editMode) then return end
|
||||
|
||||
if (client:KeyDown(IN_DUCK) and client:KeyDown(IN_SPEED)) then
|
||||
local desiredEditMode = false
|
||||
|
||||
if (editMode == 0) then -- Main menu.
|
||||
if (client:KeyDown(IN_ATTACK)) then -- Create a new infestation zone.
|
||||
desiredEditMode = 1
|
||||
elseif (client:KeyDown(IN_ATTACK2)) then -- Edit an existing infestation zone.
|
||||
local entity = client:GetEyeTraceNoCursor().Entity
|
||||
|
||||
if (entity and IsValid(entity) and entity:GetClass() == "ix_infestation_prop") then
|
||||
desiredEditMode = 2
|
||||
client:SetNetVar("InfestationEditName", entity:GetInfestation())
|
||||
else
|
||||
client:NotifyLocalized("invalidZone")
|
||||
end
|
||||
elseif (client:KeyDown(IN_WALK)) then -- Exit infestation edit mode.
|
||||
desiredEditMode = nil
|
||||
|
||||
ix.log.Add(client, "infestationLog", client:GetName() .. " (" .. client:SteamID() .. ") has exited Infestation Edit Mode.")
|
||||
end
|
||||
elseif (editMode == 1) then -- Create infestation zone.
|
||||
if (client:KeyDown(IN_ATTACK)) then -- Create a new infestation zone.
|
||||
for _, prop in pairs(ents.FindByClass("prop_physics")) do
|
||||
if (prop:GetNetVar("infestationProp") and prop:GetNetVar("infestationProp") == client:SteamID()) then
|
||||
local physicsObject = prop:GetPhysicsObject()
|
||||
|
||||
if (IsValid(physicsObject)) then
|
||||
physicsObject:EnableMotion(false)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
net.Start("ixInfestationZoneCreate")
|
||||
net.Send(client)
|
||||
elseif (client:KeyDown(IN_ATTACK2)) then -- Define core prop.
|
||||
local entity = client:GetEyeTraceNoCursor().Entity
|
||||
|
||||
if (entity and IsValid(entity) and entity:GetNetVar("infestationProp") and entity:GetNetVar("infestationProp") == client:SteamID()) then
|
||||
for _, prop in pairs(ents.FindByClass("prop_physics")) do
|
||||
if (prop and IsValid(prop) and prop:GetNetVar("infestationProp") and prop:GetNetVar("infestationProp") == client:SteamID() and prop:GetNetVar("infestationCore")) then
|
||||
prop:SetNetVar("infestationCore", nil)
|
||||
end
|
||||
end
|
||||
|
||||
entity:SetNetVar("infestationCore", true)
|
||||
else
|
||||
client:NotifyLocalized("invalidInfestationProp")
|
||||
end
|
||||
elseif (client:KeyDown(IN_WALK)) then -- Go back to menu.
|
||||
desiredEditMode = 0
|
||||
|
||||
for _, prop in pairs(ents.FindByClass("prop_physics")) do
|
||||
if (prop:GetNetVar("infestationProp") and prop:GetNetVar("infestationProp") == client:SteamID()) then
|
||||
prop:Remove()
|
||||
end
|
||||
end
|
||||
end
|
||||
elseif (editMode == 2) then -- Edit infestation zone.
|
||||
if (client:KeyDown(IN_ATTACK)) then -- Save changes & open menu.
|
||||
|
||||
-- To be added. Maybe.
|
||||
|
||||
elseif (client:KeyDown(IN_ATTACK2)) then -- Remove infestation zone.
|
||||
local targetInfestation = client:GetNetVar("InfestationEditName")
|
||||
|
||||
self:UpdateInfestation(targetInfestation, nil)
|
||||
|
||||
for _, entity in ipairs(ents.FindByClass("ix_infestation_prop")) do
|
||||
if (entity:GetInfestation() == targetInfestation) then
|
||||
entity:Remove()
|
||||
end
|
||||
end
|
||||
|
||||
self:SaveInfestationProps()
|
||||
desiredEditMode = 0
|
||||
|
||||
client:NotifyLocalized("zoneRemoved")
|
||||
ix.log.Add(client, "infestationLog", client:GetName() .. " (" .. client:SteamID() .. ") removed the \"" .. targetInfestation .. "\" Infestation Zone.")
|
||||
elseif (client:KeyDown(IN_WALK)) then -- Go back to menu.
|
||||
desiredEditMode = 0
|
||||
|
||||
for _, prop in pairs(ents.FindByClass("prop_physics")) do
|
||||
if (prop:GetNetVar("infestationProp") and prop:GetNetVar("infestationProp") == client:SteamID()) then
|
||||
prop:Remove()
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if (desiredEditMode != false) then
|
||||
client:SetNetVar("InfestationEditMode", desiredEditMode) -- Doing it this way purely to make the code a bit easier to read.
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function PLUGIN:EntityTakeDamage(entity, damageInfo)
|
||||
local client = damageInfo:GetAttacker()
|
||||
|
||||
if ((entity:GetClass() == "npc_headcrab" or entity:GetClass() == "npc_headcrab_black" or entity:GetClass() == "npc_headcrab_fast")
|
||||
and (damageInfo:GetDamageType() == DMG_SLASH or (IsValid(client) and client:IsPlayer() and client:IsVortigaunt() and client:GetActiveWeapon() and IsValid(client:GetActiveWeapon()) and client:GetActiveWeapon():GetClass() == "ix_hands"))
|
||||
and !entity:GetNetVar("heartHarvested")
|
||||
and math.random(0, 10) > 8) then -- I hate this
|
||||
if (!client:GetCharacter():GetInventory():Add("ing_headcrab_meat")) then
|
||||
ix.item.Spawn("ing_headcrab_meat", client)
|
||||
end
|
||||
|
||||
if (!entity or !IsValid(entity)) then return end
|
||||
|
||||
entity:Kill()
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user