73 lines
2.3 KiB
Lua
73 lines
2.3 KiB
Lua
-- Garry's Mod Binder - Main Server Logic
|
|
include("binder/sh_lang.lua")
|
|
include("binder/core/sh_config.lua")
|
|
|
|
util.AddNetworkString("Binder_SyncProfiles")
|
|
util.AddNetworkString("Binder_UpdateProfile")
|
|
util.AddNetworkString("Binder_DeleteProfile")
|
|
util.AddNetworkString("Binder_SetActiveProfile")
|
|
|
|
Binder = Binder or {}
|
|
Binder.Profiles = Binder.Profiles or {}
|
|
|
|
-- Default structure
|
|
-- Profile = { Name = "Profile1", Binds = { [KEY_X] = "cmd" }, Radial = { [1] = { Label = "L", Cmd = "cmd" } }, Active = true }
|
|
|
|
function Binder.SaveProfiles(ply)
|
|
local data = util.TableToJSON(Binder.Profiles[ply:SteamID64()] or {})
|
|
ply:SetPData("Binder_Profiles", data)
|
|
end
|
|
|
|
function Binder.LoadProfiles(ply)
|
|
local data = ply:GetPData("Binder_Profiles", "[]")
|
|
local profiles = Binder.SanitizeProfiles(util.JSONToTable(data) or {})
|
|
|
|
-- Ensure at least one default profile if empty
|
|
if table.Count(profiles) == 0 then
|
|
table.insert(profiles, {
|
|
Name = Binder.GetPhrase("raiding_profile"),
|
|
Binds = {},
|
|
Radial = {},
|
|
Active = true
|
|
})
|
|
end
|
|
|
|
Binder.Profiles[ply:SteamID64()] = profiles
|
|
|
|
-- Sync to client
|
|
net.Start("Binder_SyncProfiles")
|
|
local compressed = util.Compress(util.TableToJSON(profiles))
|
|
net.WriteUInt(#compressed, 32)
|
|
net.WriteData(compressed, #compressed)
|
|
net.Send(ply)
|
|
end
|
|
|
|
hook.Add("PlayerInitialSpawn", "Binder_LoadOnSpawn", function(ply)
|
|
Binder.LoadProfiles(ply)
|
|
end)
|
|
|
|
-- Receive entire profile updates from client (e.g., binds changed)
|
|
net.Receive("Binder_UpdateProfile", function(len, ply)
|
|
local length = net.ReadUInt(32)
|
|
local compressed = net.ReadData(length)
|
|
local data = util.Decompress(compressed)
|
|
|
|
if data then
|
|
local profiles = Binder.SanitizeProfiles(util.JSONToTable(data) or {})
|
|
if profiles then
|
|
Binder.Profiles[ply:SteamID64()] = profiles
|
|
Binder.SaveProfiles(ply)
|
|
end
|
|
end
|
|
end)
|
|
|
|
-- Chat Command to open the Binder
|
|
hook.Add("PlayerSay", "Binder_ChatCommand", function(ply, text, teamTalk)
|
|
local lowerText = string.lower(text)
|
|
if string.sub(lowerText, 1, 5) == "/bind" or string.sub(lowerText, 1, 5) == "!bind" then
|
|
ply:ConCommand("binder_menu")
|
|
return "" -- Hide the command from chat
|
|
end
|
|
end)
|
|
|