mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-16 21:33:46 +03:00
137 lines
3.0 KiB
Lua
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)
|