Files
wnsrc/gamemodes/helix/plugins/area/sv_hooks.lua
lifestorm df294d03aa Upload
2024-08-04 23:54:45 +03:00

137 lines
3.0 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/
--]]
function PLUGIN:LoadData()
hook.Run("SetupAreaProperties")
ix.area.stored = self:GetData() or {}
timer.Create("ixAreaThink", ix.config.Get("areaTickTime"), 0, function()
self:AreaThink()
end)
end
function PLUGIN:SaveData()
self:SetData(ix.area.stored)
end
function PLUGIN:PlayerInitialSpawn(client)
timer.Simple(1, function()
if (IsValid(client)) then
local json = util.TableToJSON(ix.area.stored)
local compressed = util.Compress(json)
local length = compressed:len()
net.Start("ixAreaSync")
net.WriteUInt(length, 32)
net.WriteData(compressed, length)
net.Send(client)
end
end)
end
function PLUGIN:PlayerLoadedCharacter(client)
client.ixArea = ""
client.ixInArea = nil
end
function PLUGIN:PlayerSpawn(client)
client.ixArea = ""
client.ixInArea = nil
end
function PLUGIN:AreaThink()
for _, client in ipairs(player.GetAll()) do
local character = client:GetCharacter()
if (!client:Alive() or !character) then
continue
end
local overlappingBoxes = {}
local position = client:GetPos() + client:OBBCenter()
for id, info in pairs(ix.area.stored) do
if (position:WithinAABox(info.startPosition, info.endPosition)) then
overlappingBoxes[#overlappingBoxes + 1] = id
end
end
if (#overlappingBoxes > 0) then
local oldID = client:GetArea()
local id = overlappingBoxes[1]
if (oldID != id) then
hook.Run("OnPlayerAreaChanged", client, client.ixArea, id)
client.ixArea = id
end
client.ixInArea = true
else
client.ixInArea = false
end
end
end
function PLUGIN:OnPlayerAreaChanged(client, oldID, newID)
net.Start("ixAreaChanged")
net.WriteString(oldID)
net.WriteString(newID)
net.Send(client)
end
net.Receive("ixAreaAdd", function(length, client)
if (!client:Alive() or !CAMI.PlayerHasAccess(client, "Helix - AreaEdit", nil)) then
return
end
local id = net.ReadString()
local type = net.ReadString()
local startPosition, endPosition = net.ReadVector(), net.ReadVector()
local properties = net.ReadTable()
if (!ix.area.types[type]) then
client:NotifyLocalized("areaInvalidType")
return
end
if (ix.area.stored[id]) then
client:NotifyLocalized("areaAlreadyExists")
return
end
for k, v in pairs(properties) do
if (!isstring(k) or !ix.area.properties[k]) then
continue
end
properties[k] = ix.util.SanitizeType(ix.area.properties[k].type, v)
end
ix.area.Create(id, type, startPosition, endPosition, nil, properties)
ix.log.Add(client, "areaAdd", id)
end)
net.Receive("ixAreaRemove", function(length, client)
if (!client:Alive() or !CAMI.PlayerHasAccess(client, "Helix - AreaEdit", nil)) then
return
end
local id = net.ReadString()
if (!ix.area.stored[id]) then
client:NotifyLocalized("areaDoesntExist")
return
end
ix.area.Remove(id)
ix.log.Add(client, "areaRemove", id)
end)