SourceMod plugin collection for the saka-gg Team Fortress 2 Dodgeball
ecosystem. This repo is both a source archive and a build/release repo that
produces deployable .smx bundles.
For full project orientation, read README.md. This file is the short version for AI agents and contributors who need to act, not browse.
sakaBASE/,sakaCOLORS/,sakaDONATE/,sakaMAPVOTE/,sakaNER/,sakaSESSION/,sakaSOLO/,sakaSTATS/,sakaGameDescription/,sakaMapDelete/— plugin source treesinclude/— project-specific and third-party non-SourceMod headersvendor/sourcemod-current/include/— vendored official SourceMod headers, kept separate on purposescripts/— build and packaging scripts.github/workflows/— CI and release automationspcomp— vendored SourcePawn compiler (1.13.0.7246, macOS arm64)
Typical plugin layout:
PLUGIN/scripting/*.sp— plugin entrypointPLUGIN/scripting/PLUGIN/*.inc— local split modules (when modularized)PLUGIN/translations/*.txt— phrase filesPLUGIN/configs/*.cfg,PLUGIN/cfg/*.cfg— runtime configs
Full repo:
./scripts/build-all.shCompiled .smx files land in .build/plugins/.
Package a release:
./scripts/package-release.sh v2026.04.30Manual single-plugin compile must use this include order:
- matching official SourceMod
1.13.0-git7246headers - repo
include/ - plugin-local
PLUGIN/scripting
Some plugins expose libraries other plugins compile against. Before changing
any public API, check CROSS_PLUGIN_CONTRACTS.md
and the relevant include/saka*.inc.
Provider summary:
sakaDONATE→sakaDONATElibrary,SD_*nativessakaSOLO→sakaSOLOlibrary,SakaSolo_*nativessakaSTATS(seasonal) →sakaSTATSlibrary,SakaStats_*nativessakaMAPVOTE→ preserves themapchooserlibrary contractsakaWeightedVoting→ shared include used bysakaMAPVOTEandsakaNER
If you are editing this repo, follow these to avoid breaking things:
- treat
include/as project-specific and non-SourceMod support headers only - do not put official SourceMod headers back into
include/ - do not assume every plugin is standalone — check whether it exposes a library or depends on another saka include first
- before changing a plugin API, inspect its public include file in
include/ - before changing build behavior, inspect
scripts/build-all.shand the GitHub workflow - for split plugins, prefer editing the focused local module rather than adding more top-level monolith code
When exploring a plugin, look for:
public Plugin myinfo— plugin metadata and version stringAskPluginLoad2— registers libraries and natives for cross-plugin use- local
#include "PLUGIN/*.inc"— module boundaries in split plugins
Conventions used across the codebase. Follow these in new code; minor drift exists in older files and gets cleaned up in dedicated passes.
- Globals:
g_<type><Name>Hungarian prefix.g_bforbool,g_iforint,g_fforfloat,g_hforHandle,g_cvforConVar,g_sforchar[]arrays. Example:g_bRoundStarted,g_cvNERVotingTimeout,g_iLastDeadTeam. - Constants and
#define:UPPER_SNAKE_CASE. Example:SAKA_MAX_MESSAGE_LENGTH,STATS_MAX_NAME_LENGTH. - Public natives (cross-plugin API surface):
- New providers:
<Plugin>_<Function>— e.g.SakaSolo_PlayerIsInSolo,SakaStats_GetPlayerStat. sakaDONATE'sSD_*short prefix is grandfathered for compatibility; do not introduce newSD_*-style short prefixes elsewhere.
- New providers:
- Commands: lowercase
sm_<verb>— e.g.sm_solo,sm_rtv. - ConVars: lowercase
<plugin>_<feature>— e.g.sakasolo_debug,sakaner_voting_timeout.sakaBASE's legacysakambrs_*/sakafov_*/sakarobot_*are slated for a follow-up consolidation pass and should not be expanded. - Pragmas: every plugin starts with
#pragma semicolon 1and#pragma newdecls required. - Logging: use the
Saka_LogInfo/Saka_LogErrorhelpers from<sakaLogging>rather than rawLogMessage/LogError. SetSAKA_LOG_DEFAULT_COMPONENTandSAKA_LOG_INTERCEPT_LEGACYbefore including. - Shared helpers: prefer
<sakaClientValidation>,<sakaConstants>,<sakaColors>,<sakaMessageFormatting>over redefining the same helpers per plugin.
- scripts/build-all.sh — authoritative build logic
- scripts/package-release.sh — packaging logic
- include/ — shared project and third-party headers
- sakaMAPVOTE/scripting/sakaMAPVOTE.sp
- sakaCOLORS/scripting/sakaCOLORS.sp
- sakaSTATS/scripting/sakaSTATS.sp
-
sakaGameDescriptionrequires the SteamWorks extension and sets the server browser Game field tosaka Dodgeball. Extension binaries are not bundled. -
sakaMapDeletepreservessm_mapdeleter_regexand the console-onlysm_deletemapscommand. Loading it never initiates cleanup. -
sakaMAPVOTEis a compatibility-preserving consolidation of older map vote plugins. -
sakaBASEis a compatibility-preserving consolidation of several smaller gameplay/QoL plugins. -
sakaSTATSruns the season system by default; setenableSeasonSystem=0insakaSTATS/configs/sakastats.cfgto disable it at runtime. The retiredsakaSTATS_w-o_seasons.spbuild is no longer shipped — see sakaSTATS/README.md for the upgrade path. -
sakaCOLORSandsakaSTATSare good examples of the split-module style.