mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 13:53:45 +03:00
Upload
This commit is contained in:
304
gamemodes/helix/plugins/doors/sv_plugin.lua
Normal file
304
gamemodes/helix/plugins/doors/sv_plugin.lua
Normal file
@@ -0,0 +1,304 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
|
||||
util.AddNetworkString("ixDoorMenu")
|
||||
util.AddNetworkString("ixDoorPermission")
|
||||
|
||||
-- Variables for door data.
|
||||
local variables = {
|
||||
-- Whether or not the door will be disabled.
|
||||
"disabled",
|
||||
-- The name of the door.
|
||||
"name",
|
||||
-- Price of the door.
|
||||
"price",
|
||||
-- If the door is ownable.
|
||||
"ownable",
|
||||
-- The faction that owns a door.
|
||||
"faction",
|
||||
-- The class that owns a door.
|
||||
"class",
|
||||
-- Whether or not the door will be hidden.
|
||||
"visible"
|
||||
}
|
||||
|
||||
function PLUGIN:CallOnDoorChildren(entity, callback)
|
||||
local parent
|
||||
|
||||
if (entity.ixChildren) then
|
||||
parent = entity
|
||||
elseif (entity.ixParent) then
|
||||
parent = entity.ixParent
|
||||
end
|
||||
|
||||
if (IsValid(parent)) then
|
||||
callback(parent)
|
||||
|
||||
for k, _ in pairs(parent.ixChildren) do
|
||||
local child = ents.GetMapCreatedEntity(k)
|
||||
|
||||
if (IsValid(child)) then
|
||||
callback(child)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function PLUGIN:CopyParentDoor(child)
|
||||
local parent = child.ixParent
|
||||
|
||||
if (IsValid(parent)) then
|
||||
for _, v in ipairs(variables) do
|
||||
local value = parent:GetNetVar(v)
|
||||
|
||||
if (child:GetNetVar(v) != value) then
|
||||
child:SetNetVar(v, value)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Called after the entities have loaded.
|
||||
function PLUGIN:LoadData()
|
||||
-- Restore the saved door information.
|
||||
local data = self:GetData()
|
||||
|
||||
if (!data) then
|
||||
return
|
||||
end
|
||||
|
||||
-- Loop through all of the saved doors.
|
||||
for k, v in pairs(data) do
|
||||
-- Get the door entity from the saved ID.
|
||||
local entity = ents.GetMapCreatedEntity(k)
|
||||
|
||||
-- Check it is a valid door in-case something went wrong.
|
||||
if (IsValid(entity) and entity:IsDoor()) then
|
||||
-- Loop through all of our door variables.
|
||||
for k2, v2 in pairs(v) do
|
||||
if (k2 == "children") then
|
||||
entity.ixChildren = v2
|
||||
|
||||
for index, _ in pairs(v2) do
|
||||
local door = ents.GetMapCreatedEntity(index)
|
||||
|
||||
if (IsValid(door)) then
|
||||
door.ixParent = entity
|
||||
end
|
||||
end
|
||||
elseif (k2 == "combineDoor") then
|
||||
entity.ixCombineDoor = v2
|
||||
entity:SetNetVar("combineDoor", v2)
|
||||
elseif (k2 == "faction") then
|
||||
for k3, v3 in pairs(ix.faction.teams) do
|
||||
if (k3 == v2) then
|
||||
entity.ixFactionID = k3
|
||||
entity:SetNetVar("faction", v3.index)
|
||||
|
||||
break
|
||||
end
|
||||
end
|
||||
else
|
||||
entity:SetNetVar(k2, v2)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Called before the gamemode shuts down.
|
||||
function PLUGIN:SaveDoorData()
|
||||
-- Create an empty table to save information in.
|
||||
local data = {}
|
||||
local doors = {}
|
||||
|
||||
for _, v in ipairs(ents.GetAll()) do
|
||||
if (v:IsDoor()) then
|
||||
doors[v:MapCreationID()] = v
|
||||
end
|
||||
end
|
||||
|
||||
local doorData
|
||||
|
||||
-- Loop through doors with information.
|
||||
for k, v in pairs(doors) do
|
||||
-- Another empty table for actual information regarding the door.
|
||||
doorData = {}
|
||||
|
||||
-- Save all of the needed variables to the doorData table.
|
||||
for _, v2 in ipairs(variables) do
|
||||
local value = v:GetNetVar(v2)
|
||||
|
||||
if (value) then
|
||||
doorData[v2] = v:GetNetVar(v2)
|
||||
end
|
||||
end
|
||||
|
||||
if (v.ixChildren) then
|
||||
doorData.children = v.ixChildren
|
||||
end
|
||||
|
||||
if (v.ixClassID) then
|
||||
doorData.class = v.ixClassID
|
||||
end
|
||||
|
||||
if (v.ixFactionID) then
|
||||
doorData.faction = v.ixFactionID
|
||||
end
|
||||
|
||||
if (v.ixCombineDoor) then
|
||||
doorData.combineDoor = v.ixCombineDoor
|
||||
end
|
||||
|
||||
-- Add the door to the door information.
|
||||
if (!table.IsEmpty(doorData)) then
|
||||
data[k] = doorData
|
||||
end
|
||||
end
|
||||
-- Save all of the door information.
|
||||
self:SetData(data)
|
||||
end
|
||||
|
||||
function PLUGIN:CanPlayerUseDoor(client, entity)
|
||||
if (entity:GetNetVar("disabled")) then
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
-- Whether or not a player a player has any abilities over the door, such as locking.
|
||||
function PLUGIN:CanPlayerAccessDoor(client, door, access)
|
||||
local faction = door:GetNetVar("faction")
|
||||
|
||||
-- If the door has a faction set which the client is a member of, allow access.
|
||||
if (faction and client:Team() == faction) then
|
||||
return true
|
||||
end
|
||||
|
||||
local class = door:GetNetVar("class")
|
||||
|
||||
-- If the door has a faction set which the client is a member of, allow access.
|
||||
local classData = ix.class.list[class]
|
||||
local charClass = client:GetCharacter():GetClass()
|
||||
local classData2 = ix.class.list[charClass]
|
||||
|
||||
if (class and classData and classData2) then
|
||||
if (classData.team) then
|
||||
if (classData.team != classData2.team) then
|
||||
return false
|
||||
end
|
||||
else
|
||||
if (charClass != class) then
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
function PLUGIN:PostPlayerLoadout(client)
|
||||
client:Give("ix_keys")
|
||||
end
|
||||
|
||||
function PLUGIN:ShowTeam(client)
|
||||
local data = {}
|
||||
data.start = client:GetShootPos()
|
||||
data.endpos = data.start + client:GetAimVector() * 96
|
||||
data.filter = client
|
||||
local trace = util.TraceLine(data)
|
||||
local entity = trace.Entity
|
||||
|
||||
if (IsValid(entity) and entity:IsDoor() and !entity:GetNetVar("faction") and !entity:GetNetVar("class")) then
|
||||
if (entity:CheckDoorAccess(client, DOOR_TENANT)) then
|
||||
local door = entity
|
||||
|
||||
if (IsValid(door.ixParent)) then
|
||||
door = door.ixParent
|
||||
end
|
||||
|
||||
if door.ixAccess and istable(door.ixAccess) then
|
||||
net.Start("ixDoorMenu")
|
||||
net.WriteEntity(door)
|
||||
net.WriteTable(door.ixAccess)
|
||||
net.WriteEntity(entity)
|
||||
net.Send(client)
|
||||
end
|
||||
elseif (!IsValid(entity:GetDTEntity(0))) then
|
||||
ix.command.Run(client, "doorbuy")
|
||||
else
|
||||
client:NotifyLocalized("notAllowed")
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
function PLUGIN:PlayerLoadedCharacter(client, curChar, prevChar)
|
||||
if (prevChar) then
|
||||
local doors = prevChar:GetVar("doors") or {}
|
||||
|
||||
for _, v in ipairs(doors) do
|
||||
if (IsValid(v) and v:IsDoor() and v:GetDTEntity(0) == client) then
|
||||
v:RemoveDoorAccessData()
|
||||
end
|
||||
end
|
||||
|
||||
prevChar:SetVar("doors", nil)
|
||||
end
|
||||
end
|
||||
|
||||
function PLUGIN:PlayerDisconnected(client)
|
||||
local character = client:GetCharacter()
|
||||
|
||||
if (character) then
|
||||
local doors = character:GetVar("doors") or {}
|
||||
|
||||
for _, v in ipairs(doors) do
|
||||
if (IsValid(v) and v:IsDoor() and v:GetDTEntity(0) == client) then
|
||||
v:RemoveDoorAccessData()
|
||||
end
|
||||
end
|
||||
|
||||
character:SetVar("doors", nil)
|
||||
end
|
||||
end
|
||||
|
||||
net.Receive("ixDoorPermission", function(length, client)
|
||||
local door = net.ReadEntity()
|
||||
local target = net.ReadEntity()
|
||||
local access = net.ReadUInt(4)
|
||||
|
||||
if (IsValid(target) and target:GetCharacter() and door.ixAccess and door:GetDTEntity(0) == client and target != client) then
|
||||
access = math.Clamp(access or 0, DOOR_NONE, DOOR_TENANT)
|
||||
|
||||
if (access == door.ixAccess[target]) then
|
||||
return
|
||||
end
|
||||
|
||||
door.ixAccess[target] = access
|
||||
|
||||
local recipient = {}
|
||||
|
||||
for k, v in pairs(door.ixAccess) do
|
||||
if (v > DOOR_GUEST) then
|
||||
recipient[#recipient + 1] = k
|
||||
end
|
||||
end
|
||||
|
||||
if (#recipient > 0) then
|
||||
net.Start("ixDoorPermission")
|
||||
net.WriteEntity(door)
|
||||
net.WriteEntity(target)
|
||||
net.WriteUInt(access, 4)
|
||||
net.Send(recipient)
|
||||
end
|
||||
end
|
||||
end)
|
||||
Reference in New Issue
Block a user