Files
wnsrc/gamemodes/helix/plugins/doors/sh_commands.lua

510 lines
14 KiB
Lua
Raw Normal View History

2024-08-04 23:12:27 +03:00
--[[
| 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
})