Files
Simple-Squad-Menu/lua/autorun/sh_squad_menu.lua
2025-05-31 10:13:27 +02:00

231 lines
5.7 KiB
Lua

SquadMenu = SquadMenu or {}
if CLIENT then
-- Settings file
SquadMenu.DATA_FILE = "squad_menu.json"
end
-- Chat prefixes that allow messaging squad members only
SquadMenu.CHAT_PREFIXES = { "/s", "!s", "/p", "!pchat" }
-- Primary color used for the UI theme
SquadMenu.THEME_COLOR = Color( 34, 52, 142 )
-- Max. length of a squad name
SquadMenu.MAX_NAME_LENGTH = 30
-- Size limit for JSON data
SquadMenu.MAX_JSON_SIZE = 49152 -- 48 kibibytes
-- Used on net.WriteUInt for the command ID
SquadMenu.COMMAND_SIZE = 4
-- Command IDs (Max. ID when COMMAND_SIZE = 4 is 15)
SquadMenu.BROADCAST_EVENT = 0
SquadMenu.SQUAD_LIST = 1
SquadMenu.SETUP_SQUAD = 2
SquadMenu.JOIN_SQUAD = 3
SquadMenu.LEAVE_SQUAD = 4
SquadMenu.ACCEPT_REQUESTS = 5
SquadMenu.REQUESTS_LIST = 6
SquadMenu.KICK = 7
SquadMenu.PING = 8
-- Reasons given when a member is removed from a squad
SquadMenu.LEAVE_REASON_DELETED = 0
SquadMenu.LEAVE_REASON_LEFT = 1
SquadMenu.LEAVE_REASON_KICKED = 2
-- Server settings
local maxMembersCvar = CreateConVar(
"squad_max_members",
"10",
FCVAR_ARCHIVE + FCVAR_REPLICATED + FCVAR_NOTIFY,
"Limits how many members a single squad can have.",
1, 100
)
local squadListPosCvar = CreateConVar(
"squad_members_position",
"6",
FCVAR_ARCHIVE + FCVAR_REPLICATED + FCVAR_NOTIFY,
"Sets the position of the squad members on the screen. Takes numbers betweek 1-9 and uses the same positions as a numpad.",
1, 9
)
local broadcastCvar = CreateConVar(
"squad_broadcast_creation_message",
"1",
FCVAR_ARCHIVE + FCVAR_REPLICATED + FCVAR_NOTIFY,
"When set to 1, Squad Menu will print when a new squad is created on the chat.",
0, 1
)
local friendlyfireCvar = CreateConVar(
"squad_force_friendly_fire",
"0",
FCVAR_ARCHIVE + FCVAR_REPLICATED + FCVAR_NOTIFY,
"Makes so squads always have friendly fire enabled.",
0, 1
)
function SquadMenu.PrintF( str, ... )
MsgC( SquadMenu.THEME_COLOR, "[Squad Menu] ", Color( 255, 255, 255 ), string.format( str, ... ), "\n" )
end
function SquadMenu.TableToJSON( t )
return util.TableToJSON( t, false )
end
function SquadMenu.JSONToTable( s )
if type( s ) ~= "string" or s == "" then
return {}
end
return util.JSONToTable( s ) or {}
end
function SquadMenu.GetMemberLimit()
return maxMembersCvar:GetInt()
end
function SquadMenu.GetMembersPosition()
return squadListPosCvar:GetInt()
end
function SquadMenu.GetShowCreationMessage()
return broadcastCvar:GetInt() > 0
end
function SquadMenu.GetForceFriendlyFire()
return friendlyfireCvar:GetInt() > 0
end
function SquadMenu.GetPlayerId( ply )
if ply:IsBot() then
return "BOT_" .. ply:AccountID()
end
return ply:SteamID()
end
local PID = SquadMenu.GetPlayerId
function SquadMenu.AllPlayersById()
local all = player.GetAll()
local byId = {}
for _, ply in ipairs( all ) do
byId[PID( ply )] = ply
end
return byId
end
function SquadMenu.FindPlayerById( id )
local all = player.GetAll()
for _, ply in ipairs( all ) do
if id == PID( ply ) then return ply end
end
end
function SquadMenu.ValidateNumber( n, default, min, max )
return math.Clamp( tonumber( n ) or default, min, max )
end
function SquadMenu.ValidateString( s, default, maxLength )
if type( s ) ~= "string" then
return default
end
s = string.Trim( s )
if s == "" then
return default
end
if s:len() > maxLength then
return string.Left( s, maxLength - 3 ) .. "..."
end
return s
end
function SquadMenu.StartCommand( id )
net.Start( "squad_menu.command", false )
net.WriteUInt( id, SquadMenu.COMMAND_SIZE )
end
function SquadMenu.WriteTable( t )
local data = util.Compress( SquadMenu.TableToJSON( t ) )
local bytes = #data
net.WriteUInt( bytes, 16 )
if bytes > SquadMenu.MAX_JSON_SIZE then
SquadMenu.PrintF( "Tried to write JSON that was too big! (%d/%d)", bytes, SquadMenu.MAX_JSON_SIZE )
return
end
net.WriteData( data )
end
function SquadMenu.ReadTable()
local bytes = net.ReadUInt( 16 )
if bytes > SquadMenu.MAX_JSON_SIZE then
SquadMenu.PrintF( "Tried to read JSON that was too big! (%d/%d)", bytes, SquadMenu.MAX_JSON_SIZE )
return {}
end
local data = net.ReadData( bytes )
return SquadMenu.JSONToTable( util.Decompress( data ) )
end
if SERVER then
-- Shared files
include( "squad_menu/player.lua" )
AddCSLuaFile( "squad_menu/player.lua" )
-- Server files
include( "squad_menu/server/main.lua" )
include( "squad_menu/server/squad.lua" )
include( "squad_menu/server/network.lua" )
-- Client files
AddCSLuaFile( "includes/modules/styled_theme.lua" )
AddCSLuaFile( "includes/modules/styled_theme_tabbed_frame.lua" )
AddCSLuaFile( "squad_menu/client/main.lua" )
AddCSLuaFile( "squad_menu/client/config.lua" )
AddCSLuaFile( "squad_menu/client/menu.lua" )
AddCSLuaFile( "squad_menu/client/hud.lua" )
AddCSLuaFile( "squad_menu/client/vgui/member_status.lua" )
AddCSLuaFile( "squad_menu/client/vgui/squad_list_row.lua" )
end
if CLIENT then
-- Shared files
include( "squad_menu/player.lua" )
-- Setup UI theme
require( "styled_theme" )
require( "styled_theme_tabbed_frame" )
StyledTheme.RegisterFont( "SquadMenuInfo", 0.016, {
font = "Roboto-Condensed",
weight = 600,
} )
-- Client files
include( "squad_menu/client/main.lua" )
include( "squad_menu/client/config.lua" )
include( "squad_menu/client/menu.lua" )
include( "squad_menu/client/hud.lua" )
include( "squad_menu/client/vgui/member_status.lua" )
include( "squad_menu/client/vgui/squad_list_row.lua" )
end