mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 13:53:45 +03:00
510 lines
14 KiB
Lua
510 lines
14 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
|
||
|
|
|
||
|
|
ix.command.Add("DoorSell", {
|
||
|
|
description = "@cmdDoorSell",
|
||
|
|
OnRun = function(self, client, arguments)
|
||
|
|
-- Get the entity 96 units infront of the player.
|
||
|
|
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
|
||
|
|
|
||
|
|
-- Check if the entity is a valid door.
|
||
|
|
if (IsValid(entity) and entity:IsDoor() and !entity:GetNetVar("disabled")) then
|
||
|
|
-- Check if the player owners the door.
|
||
|
|
if (client == entity:GetDTEntity(0)) then
|
||
|
|
entity = IsValid(entity.ixParent) and entity.ixParent or entity
|
||
|
|
|
||
|
|
-- Get the price that the door is sold for.
|
||
|
|
local price = math.Round(entity:GetNetVar("price", ix.config.Get("doorCost")) * ix.config.Get("doorSellRatio"))
|
||
|
|
local character = client:GetCharacter()
|
||
|
|
|
||
|
|
-- Remove old door information.
|
||
|
|
entity:RemoveDoorAccessData()
|
||
|
|
|
||
|
|
local doors = character:GetVar("doors") or {}
|
||
|
|
|
||
|
|
for k, v in ipairs(doors) do
|
||
|
|
if (v == entity) then
|
||
|
|
table.remove(doors, k)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
character:SetVar("doors", doors, true)
|
||
|
|
|
||
|
|
-- Take their money and notify them.
|
||
|
|
character:GiveMoney(price)
|
||
|
|
hook.Run("OnPlayerPurchaseDoor", client, entity, false, PLUGIN.CallOnDoorChildren)
|
||
|
|
|
||
|
|
ix.log.Add(client, "selldoor")
|
||
|
|
return "@dSold", ix.currency.Get(price)
|
||
|
|
else
|
||
|
|
-- Otherwise tell them they can not.
|
||
|
|
return "@notOwner"
|
||
|
|
end
|
||
|
|
else
|
||
|
|
-- Tell the player the door isn't valid.
|
||
|
|
return "@dNotValid"
|
||
|
|
end
|
||
|
|
end
|
||
|
|
})
|
||
|
|
|
||
|
|
ix.command.Add("DoorBuy", {
|
||
|
|
description = "@cmdDoorBuy",
|
||
|
|
OnRun = function(self, client, arguments)
|
||
|
|
-- Get the entity 96 units infront of the player.
|
||
|
|
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
|
||
|
|
|
||
|
|
-- Check if the entity is a valid door.
|
||
|
|
if (IsValid(entity) and entity:IsDoor() and !entity:GetNetVar("disabled")) then
|
||
|
|
if (!entity:GetNetVar("ownable") or entity:GetNetVar("faction") or entity:GetNetVar("class")) then
|
||
|
|
return "@dNotAllowedToOwn"
|
||
|
|
end
|
||
|
|
|
||
|
|
if (IsValid(entity:GetDTEntity(0))) then
|
||
|
|
return "@dOwnedBy", entity:GetDTEntity(0):Name()
|
||
|
|
end
|
||
|
|
|
||
|
|
entity = IsValid(entity.ixParent) and entity.ixParent or entity
|
||
|
|
|
||
|
|
-- Get the price that the door is bought for.
|
||
|
|
local price = entity:GetNetVar("price", ix.config.Get("doorCost"))
|
||
|
|
local character = client:GetCharacter()
|
||
|
|
|
||
|
|
-- Check if the player can actually afford it.
|
||
|
|
if (character:HasMoney(price)) then
|
||
|
|
-- Set the door to be owned by this player.
|
||
|
|
entity:SetDTEntity(0, client)
|
||
|
|
entity.ixAccess = {
|
||
|
|
[client] = DOOR_OWNER
|
||
|
|
}
|
||
|
|
|
||
|
|
PLUGIN:CallOnDoorChildren(entity, function(child)
|
||
|
|
child:SetDTEntity(0, client)
|
||
|
|
end)
|
||
|
|
|
||
|
|
local doors = character:GetVar("doors") or {}
|
||
|
|
doors[#doors + 1] = entity
|
||
|
|
character:SetVar("doors", doors, true)
|
||
|
|
|
||
|
|
-- Take their money and notify them.
|
||
|
|
character:TakeMoney(price)
|
||
|
|
hook.Run("OnPlayerPurchaseDoor", client, entity, true, PLUGIN.CallOnDoorChildren)
|
||
|
|
|
||
|
|
ix.log.Add(client, "buydoor")
|
||
|
|
return "@dPurchased", ix.currency.Get(price)
|
||
|
|
else
|
||
|
|
-- Otherwise tell them they can not.
|
||
|
|
return "@canNotAfford"
|
||
|
|
end
|
||
|
|
else
|
||
|
|
-- Tell the player the door isn't valid.
|
||
|
|
return "@dNotValid"
|
||
|
|
end
|
||
|
|
end
|
||
|
|
})
|
||
|
|
|
||
|
|
ix.command.Add("DoorSetUnownable", {
|
||
|
|
description = "@cmdDoorSetUnownable",
|
||
|
|
privilege = "Manage Doors",
|
||
|
|
adminOnly = true,
|
||
|
|
arguments = ix.type.text,
|
||
|
|
OnRun = function(self, client, name)
|
||
|
|
-- Get the door the player is looking at.
|
||
|
|
local entity = client:GetEyeTrace().Entity
|
||
|
|
|
||
|
|
-- Validate it is a door.
|
||
|
|
if (IsValid(entity) and entity:IsDoor() and !entity:GetNetVar("disabled")) then
|
||
|
|
-- Set it so it is unownable.
|
||
|
|
entity:SetNetVar("ownable", nil)
|
||
|
|
|
||
|
|
-- Change the name of the door if needed.
|
||
|
|
if (name:find("%S")) then
|
||
|
|
entity:SetNetVar("name", name)
|
||
|
|
end
|
||
|
|
|
||
|
|
PLUGIN:CallOnDoorChildren(entity, function(child)
|
||
|
|
child:SetNetVar("ownable", nil)
|
||
|
|
|
||
|
|
if (name:find("%S")) then
|
||
|
|
child:SetNetVar("name", name)
|
||
|
|
end
|
||
|
|
end)
|
||
|
|
|
||
|
|
-- Save the door information.
|
||
|
|
PLUGIN:SaveDoorData()
|
||
|
|
return "@dMadeUnownable"
|
||
|
|
else
|
||
|
|
-- Tell the player the door isn't valid.
|
||
|
|
return "@dNotValid"
|
||
|
|
end
|
||
|
|
end
|
||
|
|
})
|
||
|
|
|
||
|
|
ix.command.Add("DoorSetOwnable", {
|
||
|
|
description = "@cmdDoorSetOwnable",
|
||
|
|
privilege = "Manage Doors",
|
||
|
|
adminOnly = true,
|
||
|
|
arguments = ix.type.text,
|
||
|
|
OnRun = function(self, client, name)
|
||
|
|
-- Get the door the player is looking at.
|
||
|
|
local entity = client:GetEyeTrace().Entity
|
||
|
|
|
||
|
|
-- Validate it is a door.
|
||
|
|
if (IsValid(entity) and entity:IsDoor() and !entity:GetNetVar("disabled")) then
|
||
|
|
-- Set it so it is ownable.
|
||
|
|
entity:SetNetVar("ownable", true)
|
||
|
|
entity:SetNetVar("visible", true)
|
||
|
|
|
||
|
|
-- Update the name.
|
||
|
|
if (name:find("%S")) then
|
||
|
|
entity:SetNetVar("name", name)
|
||
|
|
end
|
||
|
|
|
||
|
|
PLUGIN:CallOnDoorChildren(entity, function(child)
|
||
|
|
child:SetNetVar("ownable", true)
|
||
|
|
child:SetNetVar("visible", true)
|
||
|
|
|
||
|
|
if (name:find("%S")) then
|
||
|
|
child:SetNetVar("name", name)
|
||
|
|
end
|
||
|
|
end)
|
||
|
|
|
||
|
|
-- Save the door information.
|
||
|
|
PLUGIN:SaveDoorData()
|
||
|
|
return "@dMadeOwnable"
|
||
|
|
else
|
||
|
|
-- Tell the player the door isn't valid.
|
||
|
|
return "@dNotValid"
|
||
|
|
end
|
||
|
|
end
|
||
|
|
})
|
||
|
|
|
||
|
|
ix.command.Add("DoorSetFaction", {
|
||
|
|
description = "@cmdDoorSetFaction",
|
||
|
|
privilege = "Manage Doors",
|
||
|
|
adminOnly = true,
|
||
|
|
arguments = bit.bor(ix.type.text, ix.type.optional),
|
||
|
|
OnRun = function(self, client, name)
|
||
|
|
-- Get the door the player is looking at.
|
||
|
|
local entity = client:GetEyeTrace().Entity
|
||
|
|
|
||
|
|
-- Validate it is a door.
|
||
|
|
if (IsValid(entity) and entity:IsDoor() and !entity:GetNetVar("disabled")) then
|
||
|
|
if (!name or name == "") then
|
||
|
|
entity.ixFactionID = nil
|
||
|
|
entity:SetNetVar("faction", nil)
|
||
|
|
|
||
|
|
PLUGIN:CallOnDoorChildren(entity, function()
|
||
|
|
entity.ixFactionID = nil
|
||
|
|
entity:SetNetVar("faction", nil)
|
||
|
|
end)
|
||
|
|
|
||
|
|
PLUGIN:SaveDoorData()
|
||
|
|
return "@dRemoveFaction"
|
||
|
|
end
|
||
|
|
|
||
|
|
local faction
|
||
|
|
|
||
|
|
-- Loop through each faction, checking the uniqueID and name.
|
||
|
|
for k, v in pairs(ix.faction.teams) do
|
||
|
|
if (ix.util.StringMatches(k, name) or ix.util.StringMatches(L(v.name, client), name)) then
|
||
|
|
-- This faction matches the provided string.
|
||
|
|
faction = v
|
||
|
|
|
||
|
|
-- Escape the loop.
|
||
|
|
break
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
-- Check if a faction was found.
|
||
|
|
if (faction) then
|
||
|
|
entity.ixFactionID = faction.uniqueID
|
||
|
|
entity:SetNetVar("faction", faction.index)
|
||
|
|
|
||
|
|
PLUGIN:CallOnDoorChildren(entity, function()
|
||
|
|
entity.ixFactionID = faction.uniqueID
|
||
|
|
entity:SetNetVar("faction", faction.index)
|
||
|
|
end)
|
||
|
|
|
||
|
|
PLUGIN:SaveDoorData()
|
||
|
|
return "@dSetFaction", L(faction.name, client)
|
||
|
|
-- The faction was not found.
|
||
|
|
else
|
||
|
|
return "@invalidFaction"
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
})
|
||
|
|
|
||
|
|
ix.command.Add("DoorSetDisabled", {
|
||
|
|
description = "@cmdDoorSetDisabled",
|
||
|
|
privilege = "Manage Doors",
|
||
|
|
adminOnly = true,
|
||
|
|
arguments = ix.type.bool,
|
||
|
|
OnRun = function(self, client, bDisabled)
|
||
|
|
-- Get the door the player is looking at.
|
||
|
|
local entity = client:GetEyeTrace().Entity
|
||
|
|
|
||
|
|
-- Validate it is a door.
|
||
|
|
if (IsValid(entity) and entity:IsDoor()) then
|
||
|
|
-- Set it so it is ownable.
|
||
|
|
entity:SetNetVar("disabled", bDisabled)
|
||
|
|
|
||
|
|
PLUGIN:CallOnDoorChildren(entity, function(child)
|
||
|
|
child:SetNetVar("disabled", bDisabled)
|
||
|
|
end)
|
||
|
|
|
||
|
|
PLUGIN:SaveDoorData()
|
||
|
|
|
||
|
|
-- Tell the player they have made the door (un)disabled.
|
||
|
|
return "@dSet" .. (bDisabled and "" or "Not") .. "Disabled"
|
||
|
|
else
|
||
|
|
-- Tell the player the door isn't valid.
|
||
|
|
return "@dNotValid"
|
||
|
|
end
|
||
|
|
end
|
||
|
|
})
|
||
|
|
|
||
|
|
ix.command.Add("DoorSetTitle", {
|
||
|
|
description = "@cmdDoorSetTitle",
|
||
|
|
arguments = ix.type.text,
|
||
|
|
OnRun = function(self, client, name)
|
||
|
|
-- Get the door infront of the player.
|
||
|
|
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
|
||
|
|
|
||
|
|
-- Validate the door.
|
||
|
|
if (IsValid(entity) and entity:IsDoor() and !entity:GetNetVar("disabled")) then
|
||
|
|
-- Make sure the name contains actual characters.
|
||
|
|
if (!name:find("%S")) then
|
||
|
|
return "@invalidArg", 1
|
||
|
|
end
|
||
|
|
|
||
|
|
--[[
|
||
|
|
NOTE: Here, we are setting two different networked names.
|
||
|
|
The title is a temporary name, while the other name is the
|
||
|
|
default name for the door. The reason for this is so when the
|
||
|
|
server closes while someone owns the door, it doesn't save THEIR
|
||
|
|
title, which could lead to unwanted things.
|
||
|
|
--]]
|
||
|
|
|
||
|
|
name = name:utf8sub(1, 24)
|
||
|
|
|
||
|
|
-- Check if they are allowed to change the door's name.
|
||
|
|
if (entity:CheckDoorAccess(client, DOOR_TENANT)) then
|
||
|
|
entity:SetNetVar("title", name)
|
||
|
|
elseif (CAMI.PlayerHasAccess(client, "Helix - Manage Doors", nil)) then
|
||
|
|
entity:SetNetVar("name", name)
|
||
|
|
|
||
|
|
PLUGIN:CallOnDoorChildren(entity, function(child)
|
||
|
|
child:SetNetVar("name", name)
|
||
|
|
end)
|
||
|
|
|
||
|
|
PLUGIN:SaveDoorData()
|
||
|
|
else
|
||
|
|
-- Otherwise notify the player he/she can't.
|
||
|
|
return "@notOwner"
|
||
|
|
end
|
||
|
|
else
|
||
|
|
-- Notification of the door not being valid.
|
||
|
|
return "@dNotValid"
|
||
|
|
end
|
||
|
|
end
|
||
|
|
})
|
||
|
|
|
||
|
|
ix.command.Add("DoorSetParent", {
|
||
|
|
description = "@cmdDoorSetParent",
|
||
|
|
privilege = "Manage Doors",
|
||
|
|
adminOnly = true,
|
||
|
|
OnRun = function(self, client, arguments)
|
||
|
|
-- Get the door the player is looking at.
|
||
|
|
local entity = client:GetEyeTrace().Entity
|
||
|
|
|
||
|
|
-- Validate it is a door.
|
||
|
|
if (IsValid(entity) and entity:IsDoor() and !entity:GetNetVar("disabled")) then
|
||
|
|
client.ixDoorParent = entity
|
||
|
|
return "@dSetParentDoor"
|
||
|
|
else
|
||
|
|
-- Tell the player the door isn't valid.
|
||
|
|
return "@dNotValid"
|
||
|
|
end
|
||
|
|
end
|
||
|
|
})
|
||
|
|
|
||
|
|
ix.command.Add("DoorSetChild", {
|
||
|
|
description = "@cmdDoorSetChild",
|
||
|
|
privilege = "Manage Doors",
|
||
|
|
adminOnly = true,
|
||
|
|
OnRun = function(self, client, arguments)
|
||
|
|
-- Get the door the player is looking at.
|
||
|
|
local entity = client:GetEyeTrace().Entity
|
||
|
|
|
||
|
|
-- Validate it is a door.
|
||
|
|
if (IsValid(entity) and entity:IsDoor() and !entity:GetNetVar("disabled")) then
|
||
|
|
if (client.ixDoorParent == entity) then
|
||
|
|
return "@dCanNotSetAsChild"
|
||
|
|
end
|
||
|
|
|
||
|
|
-- Check if the player has set a door as a parent.
|
||
|
|
if (IsValid(client.ixDoorParent)) then
|
||
|
|
-- Add the door to the parent's list of children.
|
||
|
|
client.ixDoorParent.ixChildren = client.ixDoorParent.ixChildren or {}
|
||
|
|
client.ixDoorParent.ixChildren[entity:MapCreationID()] = true
|
||
|
|
|
||
|
|
-- Set the door's parent to the parent.
|
||
|
|
entity.ixParent = client.ixDoorParent
|
||
|
|
|
||
|
|
-- Save the door information.
|
||
|
|
PLUGIN:SaveDoorData()
|
||
|
|
PLUGIN:CopyParentDoor(entity)
|
||
|
|
|
||
|
|
return "@dAddChildDoor"
|
||
|
|
else
|
||
|
|
-- Tell the player they do not have a door parent.
|
||
|
|
return "@dNoParentDoor"
|
||
|
|
end
|
||
|
|
else
|
||
|
|
-- Tell the player the door isn't valid.
|
||
|
|
return "@dNotValid"
|
||
|
|
end
|
||
|
|
end
|
||
|
|
})
|
||
|
|
|
||
|
|
ix.command.Add("DoorRemoveChild", {
|
||
|
|
description = "@cmdDoorRemoveChild",
|
||
|
|
privilege = "Manage Doors",
|
||
|
|
adminOnly = true,
|
||
|
|
OnRun = function(self, client, arguments)
|
||
|
|
-- Get the door the player is looking at.
|
||
|
|
local entity = client:GetEyeTrace().Entity
|
||
|
|
|
||
|
|
-- Validate it is a door.
|
||
|
|
if (IsValid(entity) and entity:IsDoor() and !entity:GetNetVar("disabled")) then
|
||
|
|
if (client.ixDoorParent == entity) then
|
||
|
|
PLUGIN:CallOnDoorChildren(entity, function(child)
|
||
|
|
child.ixParent = nil
|
||
|
|
end)
|
||
|
|
|
||
|
|
entity.ixChildren = nil
|
||
|
|
return "@dRemoveChildren"
|
||
|
|
end
|
||
|
|
|
||
|
|
-- Check if the player has set a door as a parent.
|
||
|
|
if (IsValid(entity.ixParent) and entity.ixParent.ixChildren) then
|
||
|
|
-- Remove the door from the list of children.
|
||
|
|
entity.ixParent.ixChildren[entity:MapCreationID()] = nil
|
||
|
|
-- Remove the variable for the parent.
|
||
|
|
entity.ixParent = nil
|
||
|
|
|
||
|
|
PLUGIN:SaveDoorData()
|
||
|
|
return "@dRemoveChildDoor"
|
||
|
|
end
|
||
|
|
else
|
||
|
|
-- Tell the player the door isn't valid.
|
||
|
|
return "@dNotValid"
|
||
|
|
end
|
||
|
|
end
|
||
|
|
})
|
||
|
|
|
||
|
|
ix.command.Add("DoorSetHidden", {
|
||
|
|
description = "@cmdDoorSetHidden",
|
||
|
|
privilege = "Manage Doors",
|
||
|
|
adminOnly = true,
|
||
|
|
arguments = ix.type.bool,
|
||
|
|
OnRun = function(self, client, bHidden)
|
||
|
|
-- Get the door the player is looking at.
|
||
|
|
local entity = client:GetEyeTrace().Entity
|
||
|
|
|
||
|
|
-- Validate it is a door.
|
||
|
|
if (IsValid(entity) and entity:IsDoor()) then
|
||
|
|
entity:SetNetVar("visible", !bHidden)
|
||
|
|
|
||
|
|
PLUGIN:CallOnDoorChildren(entity, function(child)
|
||
|
|
child:SetNetVar("visible", !bHidden)
|
||
|
|
end)
|
||
|
|
|
||
|
|
PLUGIN:SaveDoorData()
|
||
|
|
|
||
|
|
-- Tell the player they have made the door (un)hidden.
|
||
|
|
return "@dSet" .. (bHidden and "" or "Not") .. "Hidden"
|
||
|
|
else
|
||
|
|
-- Tell the player the door isn't valid.
|
||
|
|
return "@dNotValid"
|
||
|
|
end
|
||
|
|
end
|
||
|
|
})
|
||
|
|
|
||
|
|
ix.command.Add("DoorSetClass", {
|
||
|
|
description = "@cmdDoorSetClass",
|
||
|
|
privilege = "Manage Doors",
|
||
|
|
adminOnly = true,
|
||
|
|
arguments = bit.bor(ix.type.text, ix.type.optional),
|
||
|
|
OnRun = function(self, client, name)
|
||
|
|
-- Get the door the player is looking at.
|
||
|
|
local entity = client:GetEyeTrace().Entity
|
||
|
|
|
||
|
|
-- Validate it is a door.
|
||
|
|
if (IsValid(entity) and entity:IsDoor() and !entity:GetNetVar("disabled")) then
|
||
|
|
if (!name or name == "") then
|
||
|
|
entity:SetNetVar("class", nil)
|
||
|
|
|
||
|
|
PLUGIN:CallOnDoorChildren(entity, function()
|
||
|
|
entity:SetNetVar("class", nil)
|
||
|
|
end)
|
||
|
|
|
||
|
|
PLUGIN:SaveDoorData()
|
||
|
|
return "@dRemoveClass"
|
||
|
|
end
|
||
|
|
|
||
|
|
local class, classData
|
||
|
|
|
||
|
|
for k, v in pairs(ix.class.list) do
|
||
|
|
if (ix.util.StringMatches(v.name, name) or ix.util.StringMatches(L(v.name, client), name)) then
|
||
|
|
class, classData = k, v
|
||
|
|
|
||
|
|
break
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
-- Check if a faction was found.
|
||
|
|
if (class) then
|
||
|
|
entity.ixClassID = class
|
||
|
|
entity:SetNetVar("class", class)
|
||
|
|
|
||
|
|
PLUGIN:CallOnDoorChildren(entity, function()
|
||
|
|
entity.ixClassID = class
|
||
|
|
entity:SetNetVar("class", class)
|
||
|
|
end)
|
||
|
|
|
||
|
|
PLUGIN:SaveDoorData()
|
||
|
|
return "@dSetClass", L(classData.name, client)
|
||
|
|
else
|
||
|
|
return "@invalidClass"
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
})
|