From 87edd3361a1156c235053d4717d0f95dcedf334e Mon Sep 17 00:00:00 2001 From: NightAngel Date: Sat, 16 Jan 2016 11:38:59 -0500 Subject: [PATCH] Clockwork 0.95.1 * Added command aliases, which can be used to shorten longer commands while still keeping the original commands present. * *Contributed by Mr. Meow.* * Fixed chatbox to display commands properly after one letter is typed. * *Contributed by NightAngel.* * Added SpawnPointESP which includes info_player_start point entities, made minor optimization to staticESP. * *Contributed by NightAngel.* * Fixed errors occuring with manage_plugins system menu. * *Contributed by NightAngel.* * Fixed DisplayTyping plugin not drawing properly due to a minor mistake and optimized it further. * *Contributed by NightAngel.* --- CHANGELOG.md | 14 ++ .../gamemodes/clockwork/clockwork.txt | 2 +- .../clockwork/framework/commands/sh_radio.lua | 1 + .../framework/libraries/client/cl_chatbox.lua | 32 ++- .../framework/libraries/sh_command.lua | 34 ++- .../gamemodes/clockwork/framework/sh_boot.lua | 2 +- .../clockwork/framework/sv_kernel.lua | 15 +- .../framework/system/sh_manage_plugins.lua | 6 +- .../plugins/displaytyping/plugin/cl_hooks.lua | 226 +++++++++--------- .../plugins/spawnpoints/plugin/cl_hooks.lua | 60 +++++ .../plugins/spawnpoints/plugin/sh_plugin.lua | 3 +- .../plugins/spawnpoints/plugin/sv_hooks.lua | 18 ++ .../plugins/spawnpoints/plugin/sv_plugin.lua | 20 ++ .../plugin/commands/sh_staticmodetoggle.lua | 1 + .../plugin/commands/sh_staticwhitelistadd.lua | 1 + .../commands/sh_staticwhitelistremove.lua | 1 + .../commands/sh_staticwhitelistview.lua | 1 + .../plugins/staticents/plugin/sv_hooks.lua | 14 +- 18 files changed, 318 insertions(+), 133 deletions(-) create mode 100644 Clockwork/garrysmod/gamemodes/clockwork/plugins/spawnpoints/plugin/cl_hooks.lua diff --git a/CHANGELOG.md b/CHANGELOG.md index 4e4cf335..948fac99 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,20 @@ Changelog --------- The following changes have been made for each official Clockwork build. +0.95.1 +------- + +* Added command aliases, which can be used to shorten longer commands while still keeping the original commands present. + * *Contributed by Mr. Meow.* +* Fixed chatbox to display commands properly after one letter is typed. + * *Contributed by NightAngel.* +* Added SpawnPointESP which includes info_player_start point entities, made minor optimization to staticESP. + * *Contributed by NightAngel.* +* Fixed errors occuring with manage_plugins system menu. + * *Contributed by NightAngel.* +* Fixed DisplayTyping plugin not drawing properly due to a minor mistake and optimized it further. + * *Contributed by NightAngel.* + 0.95 ------- diff --git a/Clockwork/garrysmod/gamemodes/clockwork/clockwork.txt b/Clockwork/garrysmod/gamemodes/clockwork/clockwork.txt index 7ae5c26e..2c3532ab 100644 --- a/Clockwork/garrysmod/gamemodes/clockwork/clockwork.txt +++ b/Clockwork/garrysmod/gamemodes/clockwork/clockwork.txt @@ -5,7 +5,7 @@ "settings" { } - "version" "0.95" + "version" "0.95.1" "author" "Cloud Sixteen" "description" "A roleplaying framework developed by Cloud Sixteen for the people." "workshopid" "474315121" diff --git a/Clockwork/garrysmod/gamemodes/clockwork/framework/commands/sh_radio.lua b/Clockwork/garrysmod/gamemodes/clockwork/framework/commands/sh_radio.lua index 7c77ebf4..66400c71 100644 --- a/Clockwork/garrysmod/gamemodes/clockwork/framework/commands/sh_radio.lua +++ b/Clockwork/garrysmod/gamemodes/clockwork/framework/commands/sh_radio.lua @@ -13,6 +13,7 @@ COMMAND.tip = "Send a radio message out to other characters."; COMMAND.text = ""; COMMAND.flags = bit.bor(CMD_DEFAULT, CMD_DEATHCODE, CMD_FALLENOVER); COMMAND.arguments = 1; +COMMAND.alias = {"R"}; -- Called when the command has been run. function COMMAND:OnRun(player, arguments) diff --git a/Clockwork/garrysmod/gamemodes/clockwork/framework/libraries/client/cl_chatbox.lua b/Clockwork/garrysmod/gamemodes/clockwork/framework/libraries/client/cl_chatbox.lua index 9d70695c..97a52600 100644 --- a/Clockwork/garrysmod/gamemodes/clockwork/framework/libraries/client/cl_chatbox.lua +++ b/Clockwork/garrysmod/gamemodes/clockwork/framework/libraries/client/cl_chatbox.lua @@ -165,7 +165,7 @@ function Clockwork.chatBox:IsTypingCommand() local prefix = Clockwork.config:Get("command_prefix"):Get(); if (string.find(currentText, prefix) == 1) then - return true; + return true; end; return false; @@ -738,12 +738,32 @@ function Clockwork.chatBox:Paint() local prefix = Clockwork.config:Get("command_prefix"):Get(); if (command and command != "") then - for k, v in pairs(Clockwork.command:GetAll()) do - if (string.utf8sub(k, 1, string.utf8len(command)) == string.lower(command) + for k, v in pairs(Clockwork.command:GetAlias()) do + local commandLen = string.utf8len(command); + + if (commandLen == 0) then + commandLen = 1; + end; + + if (string.utf8sub(k, 1, commandLen) == string.lower(command) and (!splitTable[2] or string.lower(command) == k)) then - if (Clockwork.player:HasFlags(Clockwork.Client, v.access)) then - commands[#commands + 1] = v; - end; + local cmdTable = Clockwork.command:FindByAlias(v); + + if (Clockwork.player:HasFlags(Clockwork.Client, cmdTable.access)) then + local bShouldAdd = true; + + -- It can so happen that multiple alias for the same command begin with the same string. + -- We don't want to display the same command multiple times, so we check for that. + for k, v in pairs(commands) do + if (v == cmdTable) then + bShouldAdd = false; + end; + end; + + if (bShouldAdd) then + commands[#commands + 1] = cmdTable; + end; + end; end; if (#commands == 8) then diff --git a/Clockwork/garrysmod/gamemodes/clockwork/framework/libraries/sh_command.lua b/Clockwork/garrysmod/gamemodes/clockwork/framework/libraries/sh_command.lua index 2c30964e..1f8acd11 100644 --- a/Clockwork/garrysmod/gamemodes/clockwork/framework/libraries/sh_command.lua +++ b/Clockwork/garrysmod/gamemodes/clockwork/framework/libraries/sh_command.lua @@ -18,6 +18,7 @@ local hook = hook; Clockwork.command = Clockwork.kernel:NewLibrary("Command"); Clockwork.command.stored = Clockwork.command.stored or {}; local hidden = {}; +local alias = {}; CMD_KNOCKEDOUT = 2; CMD_FALLENOVER = 4; @@ -89,6 +90,16 @@ function Clockwork.command:Register(data, name) end; end; + -- We do that so the Command Interpreter can find the command + -- if it's original, non-aliased name has been used. + alias[uniqueID] = uniqueID; + + if (data.alias and type(data.alias) == "table") then + for k, v in pairs(data.alias) do + alias[string.lower(tostring(v))] = uniqueID; + end; + end; + self.stored[uniqueID] = data; self.stored[uniqueID].name = realName; self.stored[uniqueID].text = data.text or ""; @@ -108,12 +119,29 @@ function Clockwork.command:FindByID(identifier) return self.stored[string.lower(string.gsub(identifier, "%s", ""))]; end; +--[[ + @codebase Shared + @details Returns command's table by alias or unique id. + @param ID Identifier of the command to find. Can be alias or original command name. +--]] +function Clockwork.command:FindByAlias(id) + return self.stored[alias[id]] or nil; +end; + +--[[ + @codebase Shared + @details Returns table of all comamnd alias indexed by alias' names. +--]] +function Clockwork.command:GetAlias() + return alias; +end; + if (SERVER) then function Clockwork.command:ConsoleCommand(player, command, arguments) if (player:HasInitialized()) then if (arguments and arguments[1]) then local realCommand = string.lower(arguments[1]); - local commandTable = self.stored[realCommand]; + local commandTable = self:FindByAlias(realCommand); local commandPrefix = Clockwork.config:Get("command_prefix"):Get(); if (commandTable) then @@ -188,10 +216,10 @@ if (SERVER) then end; end; elseif (!Clockwork.player:GetDeathCode(player, true)) then - Clockwork.player:Notify(player, "This is not a valid command!"); + Clockwork.player:Notify(player, "This is not a valid command or alias!"); end; elseif (!Clockwork.player:GetDeathCode(player, true)) then - Clockwork.player:Notify(player, "This is not a valid command!"); + Clockwork.player:Notify(player, "This is not a valid command or alias!"); end; if (Clockwork.player:GetDeathCode(player)) then diff --git a/Clockwork/garrysmod/gamemodes/clockwork/framework/sh_boot.lua b/Clockwork/garrysmod/gamemodes/clockwork/framework/sh_boot.lua index 7dbea73e..4bf72147 100644 --- a/Clockwork/garrysmod/gamemodes/clockwork/framework/sh_boot.lua +++ b/Clockwork/garrysmod/gamemodes/clockwork/framework/sh_boot.lua @@ -28,7 +28,7 @@ end; Clockwork.ClockworkFolder = Clockwork.ClockworkFolder or GM.Folder; Clockwork.SchemaFolder = Clockwork.SchemaFolder or GM.Folder; -Clockwork.KernelVersion = "0.95"; +Clockwork.KernelVersion = "0.95.1"; Clockwork.KernelBuild = "beta" Clockwork.DeveloperVersion = true; Clockwork.Website = "http://kurozael.com"; diff --git a/Clockwork/garrysmod/gamemodes/clockwork/framework/sv_kernel.lua b/Clockwork/garrysmod/gamemodes/clockwork/framework/sv_kernel.lua index deb72b48..a1984c5d 100644 --- a/Clockwork/garrysmod/gamemodes/clockwork/framework/sv_kernel.lua +++ b/Clockwork/garrysmod/gamemodes/clockwork/framework/sv_kernel.lua @@ -2286,7 +2286,18 @@ function Clockwork:PlayerCanUseCommand(player, commandTable, arguments) end; -- Called when a player speaks from the client. -function Clockwork:PlayerSay(player, text, bPublic) end; +function Clockwork:PlayerSay(player, text, bPublic) + local prefix = Clockwork.config:Get("command_prefix"):Get(); + local prefixLength = string.len(prefix); + + if (string.sub(text, 1, prefixLength) == prefix) then + local arguments = Clockwork.kernel:ExplodeByTags(text, " ", "\"", "\"", true); + local command = string.sub(arguments[1], prefixLength + 1); + local realCommand = Clockwork.command:GetAlias()[command] or command; + + return string.Replace(text, prefix..command, prefix..realCommand); + end; +end; -- Called when a player attempts to suicide. function Clockwork:CanPlayerSuicide(player) return false; end; @@ -5883,4 +5894,4 @@ concommand.Add("cwDeathCode", function(player, command, arguments) end; end); -CloudAuthX.External("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"); \ No newline at end of file +CloudAuthX.External("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"); diff --git a/Clockwork/garrysmod/gamemodes/clockwork/framework/system/sh_manage_plugins.lua b/Clockwork/garrysmod/gamemodes/clockwork/framework/system/sh_manage_plugins.lua index 0c7d6a65..0c6dc1d9 100644 --- a/Clockwork/garrysmod/gamemodes/clockwork/framework/system/sh_manage_plugins.lua +++ b/Clockwork/garrysmod/gamemodes/clockwork/framework/system/sh_manage_plugins.lua @@ -36,7 +36,7 @@ if (CLIENT) then local categories = {}; local mainPlugins = {}; - for k, v in pairs(Clockwork.plugin.stored) do + for k, v in pairs(Clockwork.plugin:GetStored()) do if (v != Schema) then categories[v.author] = categories[v.author] or {}; categories[v.author][#categories[v.author] + 1] = v; @@ -139,7 +139,7 @@ if (CLIENT) then local systemTable = Clockwork.system:FindByID("Manage Plugins"); local unloaded = data; - for k, v in pairs(Clockwork.plugin.stored) do + for k, v in pairs(Clockwork.plugin:GetStored()) do if (unloaded[v.folderName]) then Clockwork.plugin:SetUnloaded(v.name, true); else @@ -166,7 +166,7 @@ if (CLIENT) then end); else Clockwork.datastream:Hook("SystemPluginGet", function(player, data) - Clockwork.datastream:Start(player, "SystemPluginGet", Clockwork.plugin.unloaded); + Clockwork.datastream:Start(player, "SystemPluginGet", Clockwork.plugin:GetUnloaded()); end); Clockwork.datastream:Hook("SystemPluginSet", function(player, data) diff --git a/Clockwork/garrysmod/gamemodes/clockwork/plugins/displaytyping/plugin/cl_hooks.lua b/Clockwork/garrysmod/gamemodes/clockwork/plugins/displaytyping/plugin/cl_hooks.lua index 76ad1150..69037224 100644 --- a/Clockwork/garrysmod/gamemodes/clockwork/plugins/displaytyping/plugin/cl_hooks.lua +++ b/Clockwork/garrysmod/gamemodes/clockwork/plugins/displaytyping/plugin/cl_hooks.lua @@ -6,125 +6,131 @@ http://cloudsixteen.com/license/clockwork.html --]] --- Called after a player has been drawn. -function cwDisplayTyping:PostDrawOpaqueRenderables() - for k, player in pairs(_player.GetAll()) do - if (!player:HasInitialized()) then return false; end; - local large3D2DFont = Clockwork.option:GetFont("large_3d_2d"); - local colorWhite = Clockwork.option:GetColor("white"); - local eyeAngles = Clockwork.Client:EyeAngles(); - local typing = player:GetSharedVar("Typing"); - - --[[ We aren't typing, so there is no point continuing! --]] - if (typing == 0) then return; end; - - local fadeDistance = 192; - - if (typing == TYPING_YELL or typing == TYPING_PERFORM) then - fadeDistance = Clockwork.config:Get("talk_radius"):Get() * 2; - elseif (typing == TYPING_WHISPER) then - fadeDistance = Clockwork.config:Get("talk_radius"):Get() / 3; - - if (fadeDistance > 80) then - fadeDistance = 80; - end; - else - fadeDistance = Clockwork.config:Get("talk_radius"):Get(); - end; - - if ((player:GetPos() and Clockwork.Client:GetPos()) - and player:GetPos():Distance(Clockwork.Client:GetPos()) > fadeDistance) then - return; - end; - - if (!player:Alive() or player:IsRagdolled(RAGDOLL_FALLENOVER)) then - return; - end; - - if (!player:InVehicle() and player:GetMoveType() == MOVETYPE_NOCLIP) then - return; - end; +--[[ + Micro-optimizations, because local variables are faster + to access than global variables. +--]] - local color = player:GetColor(); - local curTime = UnPredictedCurTime(); +local UnPredictedCurTime = UnPredictedCurTime; +local cwDisplayTyping = cwDisplayTyping; +local playerGetAll = _player.GetAll; +local cwConfig = Clockwork.config; +local cwOption = Clockwork.option; +local cwKernel = Clockwork.kernel; +local cwPlugin = Clockwork.plugin; +local string = string; +local pairs = pairs; - if (player:GetMaterial() != "sprites/heatwave" and (a != 0 or player:IsRagdolled())) then - local alpha = Clockwork.kernel:CalculateAlphaFromDistance(fadeDistance, Clockwork.Client, player); - local position = Clockwork.plugin:Call("GetPlayerTypingDisplayPosition", player); - local headBone = "ValveBiped.Bip01_Head1"; +-- Called to draw the text over each player's head if needed. +function cwDisplayTyping:PreDrawOpaqueRenderables() + for k, player in pairs(playerGetAll()) do + if (player:HasInitialized()) then + local large3D2DFont = cwOption:GetFont("large_3d_2d"); + local colorWhite = cwOption:GetColor("white"); + local eyeAngles = Clockwork.Client:EyeAngles(); + local typing = player:GetSharedVar("Typing"); + local plyPos = player:GetPos(); + local clientPos = Clockwork.Client:GetPos(); - if (string.find(player:GetModel(), "vortigaunt")) then - headBone = "ValveBiped.Head"; - end; - - if (!position) then - local bonePosition = nil; - local offset = Vector(0, 0, 80); - - if (player:IsRagdolled()) then - local entity = player:GetRagdollEntity(); - - if (IsValid(entity)) then - local physBone = entity:LookupBone(headBone); + if (typing != 0 and player:GetMoveType() != MOVETYPE_NOCLIP and player:Alive()) then + local fadeDistance = 192; + + if (typing == TYPING_YELL or typing == TYPING_PERFORM) then + fadeDistance = cwConfig:Get("talk_radius"):Get() * 2; + elseif (typing == TYPING_WHISPER) then + fadeDistance = cwConfig:Get("talk_radius"):Get() / 3; - if (physBone) then - bonePosition = entity:GetBonePosition(physBone); - end; + if (fadeDistance > 80) then + fadeDistance = 80; end; else - local physBone = player:LookupBone(headBone); - - if (physBone) then - bonePosition = player:GetBonePosition(physBone); - end; + fadeDistance = cwConfig:Get("talk_radius"):Get(); end; - if (player:InVehicle()) then - offset = Vector(0, 0, 128); - elseif (player:IsRagdolled()) then - offset = Vector(0, 0, 16); - elseif (player:Crouching()) then - offset = Vector(0, 0, 64); - end; + if ((plyPos and clientPos) and plyPos:Distance(clientPos) <= fadeDistance) then + local color = player:GetColor(); + local curTime = UnPredictedCurTime(); - if (bonePosition) then - position = bonePosition + Vector(0, 0, 16); - else - position = player:GetPos() + offset; - end; - end; + if (player:GetMaterial() != "sprites/heatwave" and (a != 0 or player:IsRagdolled())) then + local alpha = cwKernel:CalculateAlphaFromDistance(fadeDistance, Clockwork.Client, player); + local position = cwPlugin:Call("GetPlayerTypingDisplayPosition", player); + local headBone = "ValveBiped.Bip01_Head1"; + + if (string.find(player:GetModel(), "vortigaunt")) then + headBone = "ValveBiped.Head"; + end; + + if (!position) then + local bonePosition = nil; + local offset = Vector(0, 0, 80); - if (position) then - local drawText = ""; - - position = position + eyeAngles:Up(); - eyeAngles:RotateAroundAxis(eyeAngles:Forward(), 90); - eyeAngles:RotateAroundAxis(eyeAngles:Right(), 90); - - if (typing == TYPING_WHISPER) then - drawText = "Whispering..."; - elseif (typing == TYPING_PERFORM) then - drawText = "Performing..."; - elseif (typing == TYPING_NORMAL) then - drawText = "Talking..."; - elseif (typing == TYPING_RADIO) then - drawText = "Radioing..."; - elseif (typing == TYPING_YELL) then - drawText = "Yelling..."; - elseif (typing == TYPING_OOC) then - drawText = "Typing..."; - end; - - if (drawText != "") then - local textWidth, textHeight = Clockwork.kernel:GetCachedTextSize(Clockwork.option:GetFont("main_text"), drawText); - - if (textWidth and textHeight) then - cam.Start3D2D(position, Angle(0, eyeAngles.y, 90), 0.04); - Clockwork.kernel:OverrideMainFont(large3D2DFont); - Clockwork.kernel:DrawInfo(drawText, 0, 0, colorWhite, alpha, nil, nil, 4); - Clockwork.kernel:OverrideMainFont(false); - cam.End3D2D(); + if (player:IsRagdolled()) then + local entity = player:GetRagdollEntity(); + + if (IsValid(entity)) then + local physBone = entity:LookupBone(headBone); + + if (physBone) then + bonePosition = entity:GetBonePosition(physBone); + end; + end; + else + local physBone = player:LookupBone(headBone); + + if (physBone) then + bonePosition = player:GetBonePosition(physBone); + end; + end; + + if (player:InVehicle()) then + offset = Vector(0, 0, 128); + elseif (player:IsRagdolled()) then + offset = Vector(0, 0, 16); + elseif (player:Crouching()) then + offset = Vector(0, 0, 64); + end; + + if (bonePosition) then + position = bonePosition + Vector(0, 0, 16); + else + position = player:GetPos() + offset; + end; + end; + + if (position) then + local drawText = ""; + + position = position + eyeAngles:Up(); + eyeAngles:RotateAroundAxis(eyeAngles:Forward(), 90); + eyeAngles:RotateAroundAxis(eyeAngles:Right(), 90); + + if (typing == TYPING_WHISPER) then + drawText = "Whispering..."; + elseif (typing == TYPING_PERFORM) then + drawText = "Performing..."; + elseif (typing == TYPING_NORMAL) then + drawText = "Talking..."; + elseif (typing == TYPING_RADIO) then + drawText = "Radioing..."; + elseif (typing == TYPING_YELL) then + drawText = "Yelling..."; + elseif (typing == TYPING_OOC) then + drawText = "Typing..."; + end; + + if (drawText != "") then + local textWidth, textHeight = cwKernel:GetCachedTextSize(cwOption:GetFont("main_text"), drawText); + + if (textWidth and textHeight) then + cam.Start3D2D(position, Angle(0, eyeAngles.y, 90), 0.04); + cwKernel:OverrideMainFont(large3D2DFont); + cwKernel:DrawInfo(drawText, 0, 0, colorWhite, alpha, nil, nil, 4); + cwKernel:OverrideMainFont(false); + cam.End3D2D(); + end; + end; + end; end; end; end; @@ -132,6 +138,8 @@ function cwDisplayTyping:PostDrawOpaqueRenderables() end; end; + + -- Called when the chat box is closed. function cwDisplayTyping:ChatBoxClosed(textTyped) if (textTyped) then @@ -143,7 +151,7 @@ end; -- Called when the chat box text has changed. function cwDisplayTyping:ChatBoxTextChanged(previousText, newText) - local prefix = Clockwork.config:Get("command_prefix"):Get(); + local prefix = cwConfig:Get("command_prefix"):Get(); if (string.utf8sub(newText, 1, string.utf8len(prefix) + 6) == prefix.."radio") then if (string.utf8sub(previousText, 1, string.utf8len(prefix) + 6) != prefix.."radio") then diff --git a/Clockwork/garrysmod/gamemodes/clockwork/plugins/spawnpoints/plugin/cl_hooks.lua b/Clockwork/garrysmod/gamemodes/clockwork/plugins/spawnpoints/plugin/cl_hooks.lua new file mode 100644 index 00000000..d60a1ac9 --- /dev/null +++ b/Clockwork/garrysmod/gamemodes/clockwork/plugins/spawnpoints/plugin/cl_hooks.lua @@ -0,0 +1,60 @@ +--[[ + © 2015 CloudSixteen.com do not share, re-distribute or modify + without permission of its author (kurozael@gmail.com). + + Clockwork was created by Conna Wiles (also known as kurozael.) + http://cloudsixteen.com/license/clockwork.html +--]] + +local cwSpawnPoints = cwSpawnPoints; +local spawnPointData; +local cwClass = Clockwork.class; + +--Called when the plugin is initialized. +function cwSpawnPoints:Initialize() + CW_CONVAR_SPAWNPOINTESP = Clockwork.kernel:CreateClientConVar("cwSpawnPointESP", 0, true, true); + + Clockwork.setting:AddCheckBox("Admin ESP", "Show Spawn Points.", "cwSpawnPointESP", "Whether or not to show spawn points in the admin ESP.", function() + return Clockwork.player:IsAdmin(Clockwork.Client); + end); +end; + +local colorWhite = Color(255, 255, 255, 255); +local colorViolet = Color(180, 100, 255, 255); +local spawnColor; + +-- Called when the ESP info is needed. +function cwSpawnPoints:GetAdminESPInfo(info) + if (CW_CONVAR_SPAWNPOINTESP:GetInt() == 1 and spawnPointData) then + for typeName, spawnPoints in pairs(spawnPointData) do + spawnColor = colorViolet; + + for k, class in pairs(cwClass:GetAll()) do + if (class.factions[1] == typeName or typeName == k) then + spawnColor = class.color; + end; + end; + + for k, v in pairs(spawnPoints) do + table.insert(info, { + position = v.position, + text = { + { + text = "SpawnPoint", + color = colorWhite + }, + { + text = string.upper(typeName), + color = spawnColor + } + } + }); + end; + end; + end; +end; + +-- Called to sync up the ESP data from the server. +Clockwork.datastream:Hook("SpawnPointESPSync", function(data) + spawnPointData = data; +end); \ No newline at end of file diff --git a/Clockwork/garrysmod/gamemodes/clockwork/plugins/spawnpoints/plugin/sh_plugin.lua b/Clockwork/garrysmod/gamemodes/clockwork/plugins/spawnpoints/plugin/sh_plugin.lua index 0d079f91..d211f93b 100644 --- a/Clockwork/garrysmod/gamemodes/clockwork/plugins/spawnpoints/plugin/sh_plugin.lua +++ b/Clockwork/garrysmod/gamemodes/clockwork/plugins/spawnpoints/plugin/sh_plugin.lua @@ -14,4 +14,5 @@ PLUGIN:SetGlobalAlias("cwSpawnPoints"); --[[ You don't have to do this either, but I prefer to seperate the functions. --]] Clockwork.kernel:IncludePrefixed("sv_plugin.lua"); -Clockwork.kernel:IncludePrefixed("sv_hooks.lua"); \ No newline at end of file +Clockwork.kernel:IncludePrefixed("sv_hooks.lua"); +Clockwork.kernel:IncludePrefixed("cl_hooks.lua"); \ No newline at end of file diff --git a/Clockwork/garrysmod/gamemodes/clockwork/plugins/spawnpoints/plugin/sv_hooks.lua b/Clockwork/garrysmod/gamemodes/clockwork/plugins/spawnpoints/plugin/sv_hooks.lua index 930bda37..14e6501a 100644 --- a/Clockwork/garrysmod/gamemodes/clockwork/plugins/spawnpoints/plugin/sv_hooks.lua +++ b/Clockwork/garrysmod/gamemodes/clockwork/plugins/spawnpoints/plugin/sv_hooks.lua @@ -65,5 +65,23 @@ function cwSpawnPoints:PlayerSpawn(player) end; end; end; + + if (player:IsAdmin()) then + Clockwork.datastream:Start(player, "SpawnPointESPSync", self:GetSpawnPoints()); + end; + end; +end; + +local groupCheck = { + owner = true, + superadmin = true, + admin = true, + operator = true +}; + +-- Called when a player's usergroup has been set. +function cwSpawnPoints:OnPlayerUserGroupSet(player, usergroup) + if (groupCheck[string.lower(usergroup)]) then + Clockwork.datastream:Start(player, "SpawnPointESPSync", self:GetSpawnPoints()); end; end; \ No newline at end of file diff --git a/Clockwork/garrysmod/gamemodes/clockwork/plugins/spawnpoints/plugin/sv_plugin.lua b/Clockwork/garrysmod/gamemodes/clockwork/plugins/spawnpoints/plugin/sv_plugin.lua index db8becb8..ee8add33 100644 --- a/Clockwork/garrysmod/gamemodes/clockwork/plugins/spawnpoints/plugin/sv_plugin.lua +++ b/Clockwork/garrysmod/gamemodes/clockwork/plugins/spawnpoints/plugin/sv_plugin.lua @@ -62,6 +62,26 @@ function cwSpawnPoints:SaveSpawnPoints() }; end; end; + + for k, player in pairs(_player.GetAll()) do + if (player:IsAdmin()) then + Clockwork.datastream:Start(player, "SpawnPointESPSync", self:GetSpawnPoints()); + end; + end; Clockwork.kernel:SaveSchemaData("plugins/spawnpoints/"..game.GetMap(), spawnPoints); +end; + +-- A function to get the CW spawnpoints and combine them with source spawnpoints for syncing. +function cwSpawnPoints:GetSpawnPoints() + local spawnPoints = table.Copy(self.spawnPoints); + + for k, v in pairs(ents.FindByClass("info_player_start")) do + spawnPoints["Source Spawnpoint"] = spawnPoints["Source Spawnpoint"] or {}; + spawnPoints["Source Spawnpoint"][#spawnPoints["Source Spawnpoint"] + 1] = { + position = v:GetPos() + }; + end; + + return spawnPoints; end; \ No newline at end of file diff --git a/Clockwork/garrysmod/gamemodes/clockwork/plugins/staticents/plugin/commands/sh_staticmodetoggle.lua b/Clockwork/garrysmod/gamemodes/clockwork/plugins/staticents/plugin/commands/sh_staticmodetoggle.lua index 5142d80b..5452de04 100644 --- a/Clockwork/garrysmod/gamemodes/clockwork/plugins/staticents/plugin/commands/sh_staticmodetoggle.lua +++ b/Clockwork/garrysmod/gamemodes/clockwork/plugins/staticents/plugin/commands/sh_staticmodetoggle.lua @@ -9,6 +9,7 @@ local COMMAND = Clockwork.command:New("StaticModeToggle"); COMMAND.tip = "Toggle static mode, where ALL player spawned entities will be checked through the whitelist and staticed on spawn."; COMMAND.access = "a"; +COMMAND.alias = {"SMToggle"}; -- Called when the command has been run. function COMMAND:OnRun(player, arguments) diff --git a/Clockwork/garrysmod/gamemodes/clockwork/plugins/staticents/plugin/commands/sh_staticwhitelistadd.lua b/Clockwork/garrysmod/gamemodes/clockwork/plugins/staticents/plugin/commands/sh_staticwhitelistadd.lua index 0b532717..d0e6f9fc 100644 --- a/Clockwork/garrysmod/gamemodes/clockwork/plugins/staticents/plugin/commands/sh_staticwhitelistadd.lua +++ b/Clockwork/garrysmod/gamemodes/clockwork/plugins/staticents/plugin/commands/sh_staticwhitelistadd.lua @@ -11,6 +11,7 @@ COMMAND.tip = "Add a class of entity to the static whitelist so it can be static COMMAND.text = ""; COMMAND.access = "a"; COMMAND.arguments = 1; +COMMAND.alias = {"SWAdd"}; -- Called when the command has been run. function COMMAND:OnRun(player, arguments) diff --git a/Clockwork/garrysmod/gamemodes/clockwork/plugins/staticents/plugin/commands/sh_staticwhitelistremove.lua b/Clockwork/garrysmod/gamemodes/clockwork/plugins/staticents/plugin/commands/sh_staticwhitelistremove.lua index a51c1b83..931c57a8 100644 --- a/Clockwork/garrysmod/gamemodes/clockwork/plugins/staticents/plugin/commands/sh_staticwhitelistremove.lua +++ b/Clockwork/garrysmod/gamemodes/clockwork/plugins/staticents/plugin/commands/sh_staticwhitelistremove.lua @@ -11,6 +11,7 @@ COMMAND.tip = "Remove a class of entity from the static whitelist."; COMMAND.text = ""; COMMAND.access = "a"; COMMAND.arguments = 1; +COMMAND.alias = {"SWRemove"}; -- Called when the command has been run. function COMMAND:OnRun(player, arguments) diff --git a/Clockwork/garrysmod/gamemodes/clockwork/plugins/staticents/plugin/commands/sh_staticwhitelistview.lua b/Clockwork/garrysmod/gamemodes/clockwork/plugins/staticents/plugin/commands/sh_staticwhitelistview.lua index 021c4a3c..d1cfdc04 100644 --- a/Clockwork/garrysmod/gamemodes/clockwork/plugins/staticents/plugin/commands/sh_staticwhitelistview.lua +++ b/Clockwork/garrysmod/gamemodes/clockwork/plugins/staticents/plugin/commands/sh_staticwhitelistview.lua @@ -9,6 +9,7 @@ local COMMAND = Clockwork.command:New("StaticWhitelistView"); COMMAND.tip = "View the static whitelist."; COMMAND.access = "a"; +COMMAND.alias = {"SWView"}; -- Called when the command has been run. function COMMAND:OnRun(player, arguments) diff --git a/Clockwork/garrysmod/gamemodes/clockwork/plugins/staticents/plugin/sv_hooks.lua b/Clockwork/garrysmod/gamemodes/clockwork/plugins/staticents/plugin/sv_hooks.lua index 17ae90df..ce8cc34b 100644 --- a/Clockwork/garrysmod/gamemodes/clockwork/plugins/staticents/plugin/sv_hooks.lua +++ b/Clockwork/garrysmod/gamemodes/clockwork/plugins/staticents/plugin/sv_hooks.lua @@ -18,15 +18,15 @@ function cwStaticEnts:PostSaveData() end; end; +local groupCheck = { + owner = true, + superadmin = true, + admin = true, + operator = true +}; + -- Called when a player's usergroup has been set. function cwStaticEnts:OnPlayerUserGroupSet(player, usergroup) - local groupCheck = { - owner = true, - superadmin = true, - admin = true, - operator = true - }; - if (groupCheck[string.lower(usergroup)]) then local staticEnts = {};