Player params storage service with async SQLite persistence for CS2 plugins using Plugify.
- Go (1.20+)
- Docker (for building)
- Task (Taskfile runner)
This project uses Task for automation. To build the plugin, run:
1. task gen
2. task bind
3. task build
1. Download latest release
2. Move the addons folder to the server
To utilize this parameter storage system in your own custom CS2 plugins, declare it as a dependency inside your plugin's .pplugin manifest file:
"dependencies": [
{
"name": "player_params"
}
]
package plugin
import (
"fmt"
"__module_name__/pkg/bindings/player_params"
s2sdk "github.com/fr0nch/go-plugify-s2sdk/v2"
)
func (p *Plugin) start() error {
flags := s2sdk.ConVarFlag_LinkedConcommand | s2sdk.ConVarFlag_Release | s2sdk.ConVarFlag_ClientCanExecute
s2sdk.AddConsoleCommand("testparams", "Test Player Params Plugin API", flags, p.handleTestParamsCommand, s2sdk.HookMode_Post)
return nil
}
func (p *Plugin) handleTestParamsCommand(playerSlot int32, context s2sdk.CommandCallingContext, arguments []string) s2sdk.ResultType {
if playerSlot == -1 || !s2sdk.IsClientInGame(playerSlot) {
return s2sdk.ResultType_Handled
}
steamID := s2sdk.GetClientSteamID64(playerSlot)
if steamID == 0 {
return s2sdk.ResultType_Handled
}
// Set parameter
errStr := player_params.Set("vip_core", steamID, "vip_prefix", "[SUPER VIP]")
if errStr != "" {
s2sdk.PrintToChat(playerSlot, fmt.Sprintf("Failed to set param: %s", errStr))
return s2sdk.ResultType_Handled
}
s2sdk.PrintToChat(playerSlot, "Param 'vip_prefix' successfully saved!")
// Get parameter
prefix := player_params.Get("vip_core", steamID, "vip_prefix")
if prefix == "" {
s2sdk.PrintToChat(playerSlot, "Prefix not found or access denied.")
} else {
s2sdk.PrintToChat(playerSlot, fmt.Sprintf("Loaded prefix: %s", prefix))
}
return s2sdk.ResultType_Handled
}