SAPP Cheat Sheet
Table of Contents
- Loading table of contents...
Lookup tables for SAPP (server) Lua scripting: pointers, signatures, variables, commands, and console colors. Memory offsets, game constants, unit conversions, and stock Halo commands are shared with Chimera and live in Common Reference.
Hardcoded Pointers
Addresses below apply to both PC and CE. The halo_type global is defined by SAPP; the snippet
below probes when it is absent. Use these pointers when no reliable signature exists
(see Signature Reference). Addresses are hex and - means unavailable. Pick
PC or CE with halo_type ("PC" or "CE"):
local timelimit_address = halo_type == "PC" and 0x626630 or 0x5AA5B0
| Pointer Name | PC Address | CE Address | Description |
|---|---|---|---|
banlist_header |
0x641280 |
0x5C52A0 |
Banlist structure header |
banlist_path_address |
0x69B950 |
0x61FB80 |
Banlist file path |
broadcast_game_address |
0x5E4768 |
0x569EAC |
Broadcast type (PC/CE/Trial) |
broadcast_version_address |
0x5DF840 |
0x564B34 |
Broadcast server version |
camera_base |
0x69C2F8 |
0x62075C |
Per-player camera data base |
collideable_objects_pointer |
0x744C34 |
0x6C69F4 |
Collideable objects list pointer |
color_patch |
0x4828FE |
0x45EB5E |
Byte patch (0xEB = patched, 0x74 = normal) |
computer_name_address |
0x62CD40 |
0x5B0D20 |
Server computer/domain name |
computer_specs_address |
0x662CE4 |
0x5E6E3C |
Server hardware info, CPU brand/speed |
ctf_globals |
0x639B78 |
0x5BDB98 |
CTF global data |
ctf_msgs_patch |
0x481545 |
0x45DA95 |
CTF announcement messages patch (0xEB = patched, 0x74 = normal) |
devmode_patch1 |
0x4A4DBF |
0x47DF0C |
Byte patch (0xEB = patched, 0x74 = normal) |
devmode_patch2 |
0x4A4E7F |
0x47DFBC |
Byte patch (0xEB = patched, 0x74 = normal) |
flags_pointer |
0x6A590C |
- |
- |
game_globals |
- |
0x61CFE0 |
Global game data |
gametime_base |
0x671420 |
0x5F55BC |
Game time info header |
gametype_base |
0x671320 |
0x5F5478 |
Current gametype settings. +0x0 name (UTF-16LE), +0x30 game type, +0x34 team play, +0x58 score limit. |
gametype_patch |
0x481F3C |
0x45E50C |
Byte patch |
hash_duplicate_patch |
0x59C516 |
0x5302E6 |
Hash duplicate check patch. See note below. |
hash_table_base |
0x6A2AE4 |
0x5AFB14 |
CD key validation hash table base |
hashcheck_patch |
0x59C280 |
0x530130 |
CD key hash check patch (0xEB = patched, 0x74 = normal) |
init_file_address |
0x8EB38 |
0x8EB26 |
- |
koth_globals |
0x639BB0 |
0x5BDBD0 |
King of the Hill global data |
machine_pointer |
0x745B80 |
0x6C7960 |
Network machine info pointer |
map_header_base |
- |
- |
Not available on dedi (the dedi does not cache the .map header). |
map_name_address |
0x63BC58 |
0x5BFC78 |
Map display name, UTF-16LE |
map_name_address2 |
- |
- |
Use read_string(network_struct + 0x8C, 0x80) instead |
map_pointer |
0x63523C |
0x5B925C |
Map data base pointer, resolves to 0x40440000 |
mapcycle_header |
0x614B4C |
0x598A8C |
Mapcycle data header |
mapcycle_timeout |
0x614AC0 |
0x598A00 |
Mapcycle intermission timer |
name_base |
0x745D4A |
0x6C7B6A |
- |
network_server_globals |
0x69B934 |
0x61FB44 |
Server network globals |
network_struct |
0x745B80 |
0x6C7960 |
Main server/client network structure |
obj_header_pointer |
0x744C18 |
0x6C69F0 |
Object header pointer |
oddball_globals |
0x639E38 |
0x5BDE58 |
Oddball global data |
player_globals |
- |
0x6E1478 |
Player global data |
player_header_pointer |
0x75ECE4 |
0x6E1480 |
Player header pointer |
profile_path_address |
0x635610 |
0x5B9630 |
Profile directory path |
public_value_address |
0x6164C0 |
0x59A424 |
- |
race_globals |
0x639F80 |
0x5BDFA0 |
Race global data. +0x0 = course checkpoint mask; +0x44 + real_idx*4 = per-player progress |
race_locs |
0x670F20 |
0x5F5078 |
Race checkpoint world coordinates. Not required for lap tracking |
rcon_password_address |
0x69BA5C |
0x61FC8C |
Current server RCON password |
server_password_address |
0x69B93C |
0x61FB6C |
Current server password (null if unset) |
server_path_address |
0x62C390 |
0x5B0670 |
haloded.exe server path |
server_port_address |
0x625230 |
0x5A91A0 |
Broadcast server port |
servername_patch |
0x517D6B |
0x4CE0CD |
Server name patch (0x9090 = patched, 0x4B74 = normal) |
slayer_globals |
0x63A0E8 |
0x5BE108 |
Slayer global data (base for the score array; see note below) |
sockaddr_pointer |
0x6A1F08 |
0x626388 |
- |
special_chars_patch |
0x517D6B |
0x4CE0CD |
- |
stats_globals |
0x639878 |
0x5BD898 |
Player statistics data |
stats_header |
0x639720 |
0x5BD740 |
Statistics header (decal locations, etc.) |
timelimit_address |
0x626630 |
0x5AA5B0 |
Game time limit (ticks) |
version_info_address |
0x5E02C0 |
0x5650B4 |
Halo version info string |
versioncheck_patch |
0x5152E7 |
0x4CB587 |
Version check patch (0xEB = patched, 0x7D = normal) |
Notes:
-
gametype_base + 0x0is the gametype name as UTF-16LE. UsereadWideString, notread_string(see Wide Strings). The other fields are listed under Gametype Struct. There is no working PC sig for this pointer; use0x671320. -
map_name_addressis UTF-16LE. UsereadWideString. For the map filename, useread_string(network_struct + 0x8C, 0x80).map_name_address2is not populated on the dedi. -
map_pointerresolves to0x40440000on both PC and CE. If you only need the tag table, use0x40440000directly (tag array at0x40440028, tag count at0x4044000C). -
The
race_globalsfields are listed under Race Globals. On SAPP the player index isto_real_index(i).race_locsis not required for lap timing. -
ctf_globals + 0x0is a pointer to the red flag spawn coords (vector3d).+0x4is a pointer to the blue flag spawn coords. Read withread_vector3d(read_dword(ctf_globals + team * 4)), whereteam = 0is red andteam = 1is blue.
Memory Offsets
Player, object, weapon, vehicle, and tag entry offsets are shared with Chimera. See Memory Offsets in the Common Reference.
SAPP player API indices run 1-16, and any memory array indexed 0-15 must be reached through
to_real_index(i). get_dynamic_player(i) returns 0 when the player is dead, and
get_object_memory(object_id) returns 0 when the id is invalid, so compare against 0 before
reading. Loop from 1 to 16.
Tag Table
The tag table base is 0x40440000 on both PC and CE. Read the tag array pointer from the base and
the tag count from base + 0xC. You can reach the base directly without map_pointer. The entry
layout is under Tag Entry.
Signature Reference
Signatures below use sig_scan, which works on both PC and CE. Use the
hardcoded pointers above as a fallback. halo_type is a
case-sensitive string ("PC" or "CE") and is the correct way to pick a fallback when
sig_scan returns 0.
| Pointer name | Expression |
|---|---|
banlist_header |
read_dword(sig_scan("A3??????00A1??????0033DB3BC3") + 1) |
banlist_path_address |
read_dword(sig_scan("68??????00E8??????0083C41068") + 0x1) |
banlist_path_address2 |
read_dword(sig_scan("CCCCC605??????0000E8??????0085C0") + 0x4) |
broadcast_game_address |
read_dword(sig_scan("CCCCBA??????002BD08A08") + 0x3) |
broadcast_version_address |
read_dword(sig_scan("751768??????0068??????00BA") + 0x3) |
color_patch1 |
read_dword(sig_scan("741F8B482085C9750C")) |
color_patch2 |
read_dword(sig_scan("EB1F8B482085C9750C")) |
computer_name_address |
read_dword(sig_scan("68??????0068??????0068000401006A00") + 0x1) |
ctf_globals |
read_dword(sig_scan("8B3C85????????3BF9741FE8????????8B8E2C0200008B4610") + 3) |
gameinfo_header |
read_dword(sig_scan("A1????????8B480C894D00") + 0x1) |
gametype_base |
read_dword(sig_scan("B9360000008BF3BF????????") + 0x8) (CE only; see note below) |
hardware_info_address |
read_dword(sig_scan("BE??????008BC68B4DF064890D000000005F5E5B8BE55DC36A0C") + 0x1) |
kill_message_address |
read_dword(sig_scan("8B42348A8C28D500000084C9") + 3) |
koth_globals |
read_dword(sig_scan("BF??????00F3ABB96B000000") + 0x1) |
logfile_path_address |
read_dword(sig_scan("740ABB????5C00E8????0300") + 0x3) (CE only) |
map_name_address |
read_dword(sig_scan("66A3??????00890D??????00C3") + 0x2) |
map_name_address2 |
read_dword(sig_scan("B8??????00E8??????0032C983F813") + 0x1) |
network_struct |
read_dword(sig_scan("F3ABA1????????BA????????C740??????????E8????????668B0D") + 3) |
nonslayer_score_patch |
sig_scan("8B??3883C404????74??57FFD0") + 0x8 |
object_header_pointer |
read_dword(sig_scan("8B0D????????8B513425FFFF00008D") + 2) |
oddball_globals |
read_dword(sig_scan("BF??????00F3ABB951000000") + 0x1) |
player_header_pointer |
read_dword(sig_scan("DDD8A1??????008944244835") + 0x3) |
profile_path_address |
read_dword(sig_scan("68??????008D54245468") + 0x1) |
race_globals |
read_dword(sig_scan("BF??????00F3ABB952000000") + 0x1) |
rcon_failed_address |
read_dword(sig_scan("B8????????E8??000000A1????????55") + 1) |
rcon_password_address |
read_dword(sig_scan("7740BA??????008D9B000000008A01") + 0x3) |
server_ip_argument |
read_dword(sig_scan("BA??????008BC72BD78A08880C024084C975F68B442404") + 0x1) |
server_password_address |
read_dword(sig_scan("F3ABA3??????00A3??????00A2??????00C705") + 0x3) |
server_path_address |
read_dword(sig_scan("0000BE??????005657C605") + 0x3) |
server_port_address |
read_dword(sig_scan("668B0D??????000BF2C605") + 0x3) |
slayer_globals |
read_dword(sig_scan("5733C0B910000000BFE8E05B00F3ABB910000000") + 19) |
slayer_score_patch |
sig_scan("74178B94242808000052518B8C24280800005157FFD083C4108B8424240800003BF8530F94C383FFFF") |
stats_globals |
read_dword(sig_scan("33C0BF??????00F3AB881D") + 0x3) |
sv_map_reset_tick_address |
read_dword(sig_scan("8B510C6A018915????????E8????????83C404") + 7) |
tick_counter_sig |
sig_scan("8B2D????????807D0000C644240600") |
tick_counter_address |
read_dword(read_dword(tick_counter_sig + 2)) + 0xC |
timelimit_address |
read_dword(sig_scan("8B0D????????83C8FF85C97E17") + 2) |
tick_counter_address is a two-step lookup: scan tick_counter_sig, read the pointer at + 2,
dereference it, then add 0xC. For pointers without a reliable signature (e.g. map_pointer),
use the PC/CE addresses under Hardcoded Pointers.
The slayer_globals signature embeds a CE address and its offset reads past the end of the
pattern. Use the hardcoded pointer values for it (see Hardcoded Pointers).
The gametype_base signature is CE only. Use the hardcoded PC value 0x671320.
Generating Signatures
| Tool | Plugin / Method | Output |
|---|---|---|
| IDA Pro | SigMaker (e.g., IDA_SigMaker.dll) |
Right-click on assembly, generate AOB signature, copy from output window. |
| Ghidra | MakeSig script | Right-click a function, “Generate Signature”, copy pattern. |
| Cheat Engine | Array of bytes scan + Auto Assembler | Find the instruction in memory disassembler, use aobscan or generate AOB from context menu. |
A signature is a byte string with wildcards (??) where values vary. Example:
"F3ABA1????????BA????????C740??????????E8????????668B0D".
Verifying a Signature
- Attach to the game process.
- Open Memory View, Search, Array of bytes.
- Paste the signature (with
??for wildcards). - Confirm exactly one unique result. If none or many, adjust the pattern length or add more unique bytes.
Variables
- Global variables: Use
0as the target ID. - Player variables: Use the player’s index as the target ID.
- Numeric values: Wrap the result in
tonumber()becauseget_varreturns strings. - Examples:
get_var(1, "$name")tonumber(get_var(0, "$gt"))- Returns the gametype string (e.g.,ctf,slayer).
Scope: G = global (index 0), P = per player, E = event-only (populated only while the matching
callback or event fires, see Callbacks).
| Variable | Scope | Description |
|---|---|---|
$afk |
P | Seconds the player has been AFK |
$app |
P | Bitfield: 1 SAPP, 2 Anticheat, 4 HAC2, 8 RefleX |
$area |
E | Area name for EVENT_AREA_ENTER / EVENT_AREA_EXIT |
$assists |
P | Assist count |
$blues |
G | Players on blue team |
$bluescore |
G | Blue team score |
$botscore |
P | Aimbot score |
$campkills |
P | Kills while camping |
$combo |
P | Current kill combo (resets after 4 s without a kill) |
$deaths |
P | Deaths this game |
$ename |
E | Name passed to cevent for EVENT_CUSTOM |
$ffa |
G | 1 if FFA, 0 if teams |
$gt |
G | Gametype: ctf, slayer, king, race, oddball; n/a when no game is running |
$hash |
P | CD-key hash |
$hp |
P | Health as a decimal |
$index |
E | Weapon slot index for EVENT_WEAPON_DROP / EVENT_WEAPON_PICKUP |
$invis |
P | 1 if active camo |
$ip |
P | IP:Port |
$killed |
E | Victim player index for EVENT_KILL / EVENT_BETRAY |
$killer |
E | Killer player index for EVENT_DIE; -1 unknown, 0 AI/vehicle/world |
$kills |
P | Kills this game |
$lvl |
P | Admin level |
$map |
G | Loaded map |
$mode |
G | Game variant name |
$n |
P | Player index |
$name |
P | Player name |
$oteam |
P | Opposite team name |
$ping |
P | Ping in ms |
$pn |
G | Players on server (stale during EVENT_LEAVE, see Known SAPP Quirks) |
$rand |
G | Random number 1-16 |
$reds |
G | Players on red team |
$redscore |
G | Red team score |
$running |
G | 1 if a game is running |
$score |
P | Player score |
$sh |
P | Shield as a decimal |
$snapscore |
E | Aimbot score from the snap for EVENT_SNAP |
$streak |
P | Kills since last respawn |
$suicides |
P | Suicides this game |
$svname |
G | Server name |
$team |
P | red / blue |
$ticks |
G | Ticks since match start |
$tk |
P | Team kills this game |
$type |
E | Picked-up type for EVENT_WEAPON_PICKUP; 1 weapon, 2 grenade |
$valid |
P | Whether the CD key is valid |
$x $y $z |
P | Player coordinates |
Notes:
w8andwaitonly work inside an event command sequence. In Lua usetimer()(see SAPP timer ()).- Player-scoped variables (types 3-5) clear when the player leaves.
- Custom variables are the only channel for sharing state between Lua scripts (see Reference Files).
Event Types
Names usable in events.txt and targetable with cevent. Event-only variables
(see Variables) are populated only while the matching event fires.
| Event | Event vars | Fires when |
|---|---|---|
event_enter |
$area |
A player enters a custom area. |
event_aexit |
$area |
A player exits a custom area. |
event_alive |
Once per second while a player is alive. | |
event_assist |
A player gains an assist. | |
event_camp |
A player kills while anticamp is enabled. |
|
event_custom |
$ename |
cevent is invoked. |
event_die |
$killer |
A player dies. |
event_end |
The game ends. | |
event_join |
A player joins. | |
event_kill |
$killed |
A player kills another player. |
event_leave |
A player disconnects. | |
event_login |
An admin logs in via login. |
|
event_prejoin |
A player is joining (not yet announced). | |
event_prespawn |
A player has spawned (not yet announced). | |
event_reset |
sv_map_reset was executed. |
|
event_score |
A player scores. | |
event_snap |
$snapscore |
A player snaps while aimbot_ban is enabled. |
event_spawn |
A player has finished spawning. | |
event_start |
The game starts. | |
event_suicide |
A player suicides. | |
event_teamswitch |
A player switches teams. | |
event_tick |
Every tick (1/30 s). | |
event_tk |
$killed |
A player team-kills. |
event_venter |
A player enters a vehicle. | |
event_vexit |
A player exits a vehicle. | |
event_warp |
A player warps past the antiwarp threshold. |
|
event_wdrop |
$index |
A player drops a weapon. |
event_wpickup |
$index, $type |
A player picks up a weapon or grenade ($type: 1 weapon, 2 grenade). |
File Formats
- events.txt:
event_name 'conditional 1' 'conditional 2' 'command1;command2'
Quotes optional unless a section contains spaces. Conditionals optional. Example:
event_join 'var_set money 100 $n'
event_score 'var_set money +50 $n; say $n "+50 ($money)"'
event_custom $name=buynades $money<100 'say $n "Insufficient funds ($money)"'
event_custom $name=buynades $money>=100 'var_set money -100 $n; nades $n 4; say $n "Nades maxed ($money)"'
- commands.txt:
command_name #arg1 #arg2 'command1;command2' level
Arguments use # (not $). Level optional, defaults to 4. Example:
buynades 'cevent buynades $n' -1
Console Colors
cprintwrites to the server console with classic Windows console color attributes.cprint(msg, color)uses the classic Windows console color attributes.color_number = foreground + (background * 16)
Both foreground and background take a value from 0 to 15. Examples: green text on black is
10 + (0 * 16) = 10, and red on light aqua is 12 + (11 * 16) = 188.
| Value | Color | Value | Color |
|---|---|---|---|
0 |
Black | 8 |
Gray |
1 |
Dark Blue | 9 |
Blue |
2 |
Dark Green | 10 |
Green |
3 |
Dark Aqua | 11 |
Aqua |
4 |
Dark Red | 12 |
Red |
5 |
Dark Purple | 13 |
Light Purple |
6 |
Dark Yellow | 14 |
Yellow |
7 |
Light Gray | 15 |
White |
cprint("Script loaded successfully!", 10)
cprint("Player connected.", 14)
cprint("ERROR: Invalid command!", 12 + (14 * 16))
Common picks:
| Use | Color |
|---|---|
| Success | Green (10) |
| Info | Aqua (11) or yellow (14) |
| Warning | Yellow (14) |
| Error | Red (12) |
| Admin | Light purple (13) |
| Debug | Gray (8) |
Command Reference
Admin levels: -1 = public, 0 = server, 1-4 = admins (4 highest). setcmd can re-level
commands. Player commands (about, afk, info, login, stats, etc.) cannot be renamed,
re-leveled, or run through execute_command.
<player_expr> accepts the expressions below. Stock Halo sv_* commands need a plain player index.
Expressions
Player expressions (<player_expr>):
| Expression | Matches |
|---|---|
1-16 |
Player index |
* |
Wildcard in names; alone = all |
me |
The player executing the command |
rt / bt |
All red / all blue team players |
pl |
All non-admins |
admin |
All admins |
rand |
A random player |
randred / randblue |
A random red / blue player |
Number expressions (<int_expr>, <decimal_expr>). A <decimal_expr> is a float where 1.0 =
100% (1% = 0.01).
| Expression | Effect |
|---|---|
:<n> |
Set exact value (required for negatives, e.g. :-5) |
+<n> / -<n> |
Add to / subtract from current value |
*<n> / /<n> |
Multiply / divide current value |
%<n> |
Modulo of current value |
Stock Halo Commands (Vanilla)
The stock sv_* command table is shared with Chimera. See
Stock Halo Commands.
SAPP Loader Commands
| Command | Usage | Description |
|---|---|---|
| load | load |
Load SAPP (requires strings.dll enabled, sapp.dll present). |
| reload | reload |
Reload SAPP configuration and scripts (faster than unload+load). |
| unload | unload |
Unload SAPP - reverts to stock. Console/cron only. |
Player Commands (Level -1 / 0)
Available to all players.
| Command | Level | Usage | Description |
|---|---|---|---|
| about | -1 | about |
Display current SAPP version. |
| afk | 0 | afk |
Mark player as AFK - disables future respawns. |
| clead | -1 | clead [ping] |
Set player lead at a certain ping (requires no_lead enabled, lead disabled). Default: 0 ms. |
| info | -1 | info |
Show server name, player count, current map, scrim mode status. |
| lead | -1 | lead [enabled] |
Toggle leading when no-lead mode is enabled. Default: false. |
| list | -1 | list ['generic'/'player'/'custom'] |
List commands available to the player. |
| login | -1 | login <password> |
Log into a V2 (name/password) admin account. |
| report | -1 | report [message] |
Send a report (requires anticheat). |
| stats | -1 | stats |
Show player’s kills, deaths, and K/D ratio. |
| stfu | 0 | stfu |
Block messages from say and scripted rcon messages. |
| sv_stats | 0 | sv_stats |
Display server statistics (queries, joins, commands, events, games, etc.). |
| unstfu | 0 | unstfu |
Disable stfu. |
| usage | -1 | usage <command> |
Show usage for a command. |
| whatsnext | -1 | whatsnext |
Show the next game in the mapcycle. |
General Commands (Admin Moderation)
| Command | Level | Usage | Description |
|---|---|---|---|
| afks | 0 | afks |
List AFK players. |
| b | 3 | b <player_id> [reason] [time] |
Hash-ban a player. Avoid using this command where possible: many players use cracked clients with shared CD keys, which can result in innocent players being banned as well. |
| balance_teams | 2 | balance_teams |
Balance teams based on stats. |
| bans | 3 | bans |
Alias for sv_banlist. |
| beep | 4 | beep [Hz] [ms] |
Play a beep on the host machine. |
| cpu | 4 | cpu |
Display CPU load, memory usage, OS info. |
| d | 4 | d <player_id> |
Show detailed player info (health, shield, coords, weapons, vehicle, etc.). |
| files | 4 | files |
Locate all SAPP .txt files. |
| ipban | 3 | ipban <player_id> [time] [reason] |
IP-ban a player (0 or no time = indefinite). |
| ipbans | 3 | ipbans |
List all IP bans with indices. |
| iprangeban | 3 | iprangeban <name> <IP range> [reason] [time] |
Ban an IP range using CIDR (e.g., 192.168.1.0/24). |
| ipunban | 3 | ipunban <index> |
Unban an IP by index. |
| inf | 3 | inf <player_id> |
Show player’s CD-key hash, IP address, and index. |
| k | 2 | k <player_id> [reason] |
Kick a player and announce to server. |
| kdr | 0 | kdr <player_id> |
Display player’s kill/death ratio. |
| log_note | 4 | log_note [message] |
Write a note to SAPP’s log. |
| map | 3 | map <map> <gametype> |
Alias for sv_map. |
| maplist | 3 | maplist |
List maps in three columns (like sv_maplist). |
| mute | 2 | mute <player_id> [time] |
IP-ban player from chat (no time = indefinite). |
| mutes | 2 | mutes |
List active mutes. |
| unmute | 2 | unmute <index> |
Remove a mute. |
| pl | 2 | pl |
Alias for sv_players. |
| skips | 0 | skips |
List players who voted to skip the game. |
| teamup | 2 | teamup |
Group clan members together. |
| textban | 2 | textban <player_id> [time] |
CD-key ban from chat (no time = indefinite). |
| textbans | 2 | textbans |
List active textbans. |
| textunban | 2 | textunban <index> |
Remove a textban. |
| uptime | 0 | uptime |
Show server and OS uptime. |
Configuration Commands
Used to configure server behavior. Settings lost on reload unless placed in init.txt.
| Command | Level | Usage | Description |
|---|---|---|---|
| admin_prefix | 4 | admin_prefix <prefix> |
Prefix for admin messages via say. Default: ** ADMIN **. |
| adminadd_samelevel | 4 | adminadd_samelevel [0-2] |
Allow admins to add V1 admins: 0=no, 1=lower, 2=lower/equal. Default: 0. |
| adminban | 4 | adminban [0-2] |
Admin ban permissions: 0=any, 1=no higher, 2=only lower. Default: 0. |
| admindel_samelevel | 4 | admindel_samelevel [0-2] |
Allow admins to delete V1 admins: 0=no, 1=lower, 2=lower/equal. Default: 0. |
| afk_kick | 4 | afk_kick [seconds] |
Auto-kick AFK players after given seconds (0=disabled). |
| aimbot_ban | 4 | aimbot_ban [length] [type] |
Auto kick/ban aimbotters. Type: 0=CD hash,1=IP,2=both,3=kick. Default: 0 (off). |
| alias | 4 | alias <player_id> |
Search for aliases in aliases.txt. |
| anticamp | 4 | anticamp [time] [distance] |
Raise event_camp if player kills while camping. Disabled by default. |
| anticaps | 4 | anticaps [enabled] |
Prevent excessive capital letters. Default: false. |
| anticheat | 4 | anticheat [enabled] |
Require anticheat client. Must be set in init.txt. Default: false. |
| antiglitch | 4 | antiglitch [enabled] |
Kill players who leave map BSP. Default: false. |
| antihalofp | 4 | antihalofp [enabled] |
IP ban (5 min) for too-frequent join attempts. Default: false. |
| antilagspawn | 4 | antilagspawn [enable] |
Prevent lag-spawning. Default: false. |
| antispam | 4 | antispam [type] |
Auto mute spammers: 0=disabled,1=CD-key,2=IP. Default: 0. |
| antiwarp | 4 | antiwarp [warp_num] |
Raise event_warp after given warps. 0=disabled. |
| auto_update | 4 | auto_update [enabled] |
Auto-update SAPP when available. Default: true. |
| network_thread | 4 | network_thread [enabled] |
Disable to stop SAPP server list, map download, anticheat. Default: true. |
| block_tc | 4 | block_tc [enabled] |
Block team changing. Default: false. |
| chat_console_echo | 4 | chat_console_echo [enabled] |
Output chat to console. Default: false. |
| cmdstart1 | 4 | cmdstart1 [character] |
Primary command prefix in chat. Default: \. |
| cmdstart2 | 4 | cmdstart2 [character] |
Secondary command prefix. Default: /. |
| collect_aliases | 4 | collect_aliases [enabled] [valid CD keys only] |
Collect aliases into alias.txt. Default: false. |
| console_input | 4 | console_input [enabled] |
Allow console to accept input. Default: true. |
| custom_sleep | 4 | custom_sleep [ms] |
Modify Halo thread sleep per cycle (ms). Default: 8. |
| disable_backtap | 4 | disable_backtap [enabled] |
When enabled, backtapping won’t insta-kill. |
| disable_timer_offsets | 4 | disable_timer_offsets [enabled] |
Use fixed Xbox-style spawn timers. Default: false. |
| dns | 4 | dns [url] |
Master server address for broadcasting. |
| full_ipban | 4 | full_ipban [enabled] |
Block all traffic from banned IPs (may reduce performance). Default: false. |
| hide_admin | 4 | hide_admin [enabled] |
Hide admin names when using kick/ban commands. Default: false. |
| hill_timer | 4 | hill_timer [int_expr] |
Seconds hill changes in “Crazy King”. Default: 60. |
| log | 4 | log [enabled] |
Log events to file. Default: false. |
| log_rotation | 4 | log rotation [kb] |
Max log size (kB) before archiving. Default: 4096. |
| log_name | 4 | log_name [name] |
Log file name (.log appended). Default: log. |
| lua | 4 | lua [enabled] |
Enable Lua scripting. Default: false. |
| lua_api_v | 4 | lua_api_v |
Display current Lua API version. |
| lua_call | 4 | lua_call <script> <function> [arguments...] |
Call a function in a loaded Lua script. |
| lua_load | 4 | lua_load <script> |
Load a Lua script and call OnScriptLoad(). |
| lua_unload | 4 | lua_unload <script> |
Unload a Lua script and call OnScriptUnload(). |
| map_skip | 4 | map_skip [%] |
Enable skip command when % of players want skip. 0=disabled. |
| mapvote | 4 | mapvote [enabled] |
Enable map voting at end of game. Default: false. |
| max_idle | 4 | max_idle [time] |
Restart mapcycle if server idle for this many seconds. Default: 60. |
| max_votes | 4 | max_votes [count] |
Maximum displayed votes per round. Default: 5. |
| motd | 4 | motd [string] |
Set the server Message of the Day. |
| msg_prefix | 4 | msg_prefix <string> |
Prefix used in server messages. Default: **SAPP**. |
| mtv | 4 | mtv [enabled] |
Enable multi-team vehicles (requires anticheat/HAC2). Default: false. |
| no_lead | 4 | no_lead [enabled] |
Enable no-lead mode (ping compensation). Default: false. |
| packet_limit | 4 | packet_limit [amount] |
Max packets per second from an IP. Default: 1000. |
| ping_kick | 4 | ping_kick [ping] |
Kick players with ping exceeding this value (ms). 0=disabled. |
| reload_gametypes | 4 | reload_gametypes |
Reload game variants from savegames folder. |
| remote_console | 4 | remote_console [enabled] |
Enable remote console (TCP). Default: false. |
| remote_console_list | 4 | remote_console_list |
List connected remote console clients. |
| remote_console_port | 4 | remote_console_port [port] |
Set TCP port for remote console (requires restart). |
| sapp_console | 4 | sapp_console [enabled] |
Suppress periodic sv_status; show join/leave/game start. Default: false. |
| sapp_mapcycle | 4 | sapp_mapcycle [enabled] |
Enable SAPP’s map cycle. Default: false. |
| sapp_rcon | 4 | sapp_rcon [enabled] |
Require rcon users to be SAPP admins. Default: false. |
| save_scores | 4 | save_scores [enabled] |
Prevent score reset when player leaves. Default: false. |
| say_prefix | 4 | say_prefix [enabled] |
Enable SERVER prefix on server messages (CE only). Default: true. |
| scorelimit | 4 | scorelimit [int_expr] |
Get or edit current game’s score limit. |
| scrim_mode | 4 | scrim_mode [enabled] |
Disable naughty commands, Lua scripts, sightjacking. Default: false. |
| set_ccolor | 4 | set_ccolor [value] |
Set console color (foreground + background x 16). |
| setcmd | 4 | setcmd <command> <name/level> |
Change name or required admin level of a command. |
| sj_level | 4 | sj_level [level] |
Minimum level to use HAC2 sightjacker. Default: -1 (everyone). |
| spawn_protection | 4 | spawn_protection [time] |
Invulnerability time (seconds) upon spawn. 0=disabled. |
| timelimit | 4 | timelimit [int_expr] |
Get or edit time limit on the fly (minutes). |
| unlock_console_log | 4 | unlock_console_log <enabled> |
Make console more verbose (CE only). Default: false. |
| v | 4 | v [version] |
View or modify Halo version string. |
| zombies | 4 | zombies [team] |
Enable zombies medals for HAC2: 0=none,1=red,2=blue. Default: 0. |
Map Cycle Commands
Manage SAPP’s map cycle (stored in mapcycle.txt).
| Command | Level | Usage | Description |
|---|---|---|---|
| map_next | 4 | map_next |
Start the next game in the map cycle. |
| map_prev | 4 | map_prev |
Start the previous game in the map cycle. |
| map_spec | 4 | map_spec <index> |
Skip to a specific map cycle entry. |
| mapcycle | 0 | mapcycle |
List all games in the map cycle with indices. |
| mapcycle_add | 4 | mapcycle_add <map> <game variant> [min players] [max players] [index] |
Add a map cycle entry. |
| mapcycle_begin | 4 | mapcycle_begin |
Begin the map cycle from the start. |
| mapcycle_del | 4 | mapcycle_del <index> |
Remove a map cycle entry. |
| sapp_mapcycle | 4 | sapp_mapcycle [enabled] |
Enable SAPP’s map cycle (see Configuration). |
Map Vote Commands
Manage map voting (stored in mapvotes.txt). Enabling map voting disables the map cycle.
| Command | Level | Usage | Description |
|---|---|---|---|
| mapvote | 4 | mapvote [enabled] |
Enable map voting at end of game. |
| mapvote_add | 4 | mapvote_add <map> <game variant> <name> [min players] [max players] [index] |
Add a map vote entry. |
| mapvote_del | 4 | mapvote_del <index> |
Delete a map vote entry. |
| mapvotes | 4 | mapvotes |
List map votes. |
| max_votes | 4 | max_votes [count] |
Maximum votes displayed per round (see Configuration). |
Event and Custom Commands
Commands for events (events.txt), custom commands (commands.txt), and custom variables. File
formats follow the tables.
| Category | Command | Level | Usage | Description |
|---|---|---|---|---|
| Event | cevent |
4 | cevent <name> [player number] |
Raise event_custom, set $ename, and optionally the triggering player. See Event Types and Event Variables. |
| Event | events |
4 | events |
List all events and their indices. |
| Event | eventsdel |
4 | eventsdel <index> |
Delete an event by index. |
| Event | w8 |
event only | w8 <seconds> |
Delay the current event by N seconds. Only valid inside an event command sequence. |
| Event | wait |
event only | wait <milliseconds> |
Delay the current event by N milliseconds. Only valid inside an event command sequence. |
| Command | cmd_add |
4 | cmd_add <command> [arguments] <command sequence> [level] |
Append a custom command to commands.txt. Defaults to level 4 when omitted. |
| Command | cmd_del |
4 | cmd_del <command> |
Remove a custom command from commands.txt. |
| Variable | var_add |
4 | var_add <name> <type> |
Create a custom variable. Types: 0 global str, 1 global int, 2 global float, 3 player str, 4 player int, 5 player float. |
| Variable | var_conv |
4 | var_conv <name> |
Convert between integer and float types. |
| Variable | var_del |
4 | var_del <name> |
Delete a custom variable. |
| Variable | var_list |
4 | var_list |
List all custom variables. |
| Variable | var_set |
4 | var_set <name> <value_expr> [player number] |
Set a custom variable. value_expr supports +, -, *, /, %, and : prefixes (see Expressions). Player number is required for player-scoped variables. |
Admin Management Commands (users.txt)
CD-Key Based Admins
CD-key admins are stored in users.txt and authenticate using a player’s Halo CD-key hash. If a
CD-key hash is cracked, anyone using that CD-key can automatically receive the assigned admin level
when joining the server.
To reduce abuse, you can optionally restrict CD-key admins to specific IP ranges. For example,
adding an IP range such as 192.168.1.100/24 limits admin access to players connecting from that
subnet.
You can validate whether a hash is cracked, use the Hash Checker tool.
| Command | Level | Usage | Description |
|---|---|---|---|
| adminadd | 0 | adminadd <player_id> <level> [allowed IP ranges...] |
Add a CD-key based admin using the player’s current CD-key hash. Optional IP ranges can restrict where the admin may log in from. |
| adminlevel | 0 | adminlevel <index> <level> |
Set new level for a CD-key admin. |
| admindel | 0 | admindel <index> |
Remove a CD-key admin (requires admindel_samelevel). |
| admins | 4 | admins |
List CD-key based admins. |
Name and Password Based Admins (admins.txt)
Name/password admins authenticate using their current in-game name and assigned password.
When using admin_add, the player’s current username is saved to admins.txt.
| Command | Level | Usage | Description |
|---|---|---|---|
| admin_add | 4 | admin_add <player_name> <password> <level> |
Add name/password admin using the player’s current in-game name (player must be online). |
| admin_add_manually | 4 | admin_add_manually <name> <password> <level> |
Add name/password admin without player being present. |
| admin_change_pw | 4 | admin_change_pw <index> <password> |
Change password of name/password admin. |
| admin_change_level | 4 | admin_change_level <index> <level> |
Change level of name/password admin. |
| admin_del | 4 | admin_del <index> |
Delete name/password admin. |
| admin_list | 4 | admin_list |
List name/password admins. |
| change_password | 0 | change_password <old password> <new password> |
Change password of currently logged-in name/password admin. |
| login | -1 | login <password> |
Log into a name/password admin account using the assigned admin name. |
Naughty Commands (Level 4)
Directly modify player attributes. Cannot be used when scrim_mode is enabled.
| Command | Usage | Description |
|---|---|---|
| ammo | ammo <player_id> [int_expr] [weapon] |
Change unloaded ammo (0=current,1-4=weapon slots,5=all). |
| area_add_cuboid | area_add_cuboid <name> <a_x> <a_y> <a_z> <b_x> <b_y> <b_z> |
Add a rectangular area. |
| area_add_sphere | area_add_sphere <name> <x> <y> <z> <r> |
Add a spherical area. |
| area_del | area_del <name> |
Remove an area. |
| area_list | area_list |
List areas for loaded map. |
| area_listall | area_listall |
List areas for all maps. |
| assists | assists <player_id> [int_expr] |
Change player’s assist count. |
| battery | battery <player_id> [decimal_expr] [weapon] |
Change weapon battery (weapon index as in ammo). |
| boost | boost <player_id> |
Move player to location they are looking at. |
| camo | camo <player_id> [time] |
Apply active camouflage for time (ticks). No effect if already camo. |
| color | color <player_id> [index] |
Change player’s FFA color. |
| coord | coord <player_id> |
Return player’s coordinates. |
| deaths | deaths <player_id> [amount] |
Change player’s death count. |
| disable_all_objects | disable_all_objects <team> <disable> |
Disable all objects for a team. |
| disable_all_vehicles | disable_all_vehicles <team> <disable> |
Disable all vehicles for a team. |
| disable_object | disable_object <tag_path> [team] |
Disable an object, optionally for a specific team. |
| disabled_objects | disabled_objects |
List all disabled objects. |
| enable_object | enable_object <index or tag_path> |
Enable a disabled object by index or tag path. |
| gamespeed | gamespeed [speed] |
Change ticks per second (default 30). Requires anticheat/HAC2 for sync. |
| god | god <player_id> |
Enable invulnerability (use ungod to remove). |
| gravity | gravity [float] |
Set server gravity (default 0.003656 units/tick). Requires anticheat. |
| hp | hp <player_id> [decimal_expr] |
Get or set player health (decimal). |
| kill | kill <player_id> |
Kill the player. |
| kills | kills <player_id> [int_expr] |
Get or set player’s kill count. |
| lag | lag <player_id> |
Prevent player from moving (use unlag to remove). |
| loc_add | loc_add <location_name> [x] [y] [z] |
Add a location at player’s position or given coordinates. |
| loc_del | loc_del <location_name> |
Delete a location. |
| loc_list | loc_list |
List locations for current map. |
| loc_listall | loc_listall |
List locations for all maps. |
| m | m <player_id> <x> <y> <z> |
Teleport player relative to their current position. |
| mag | mag <player_id> [int_expr] [weapon] |
Get or edit loaded ammo (weapon index as in ammo). |
| nades | nades <player_id> [int_expr] [type] |
Get or edit grenade count (1=primary,2=secondary). Values >7 may not sync. |
| s | s <player_id> [decimal_expr] |
Get or edit player speed. |
| score | score <player_id> [int_expr] |
Get or edit player’s score. |
| sh | sh <player_id> [decimal_expr] |
Get or edit player’s shield (decimal). |
| spawn | spawn <type> <tag_path> [player_number] [rotation] |
Spawn object at player’s location. |
| spawn | spawn <type> <tag_path> [location_name] [rotation] |
Spawn object at named location. |
| spawn | spawn <type> <tag_path> [<x> <y> <z>] [rotation] |
Spawn object at coordinates. Rotation in radians. |
| st | st <player_id> [red/blue] |
Change player’s team. If team name provided, only switches if on opposite team. |
| t | t <player_id> <location_name> |
Teleport player to named location. |
| t | t <player_id> <x> <y> <z> |
Teleport player to coordinates. |
| team_score | team_score [red/blue/both] [int_expr] |
Get or edit team score(s). |
| tp | tp <player_id> <player_number> |
Move one player to another player. |
| ungod | ungod <player_id> |
Remove god mode. |
| unlag | unlag <player_id> |
Remove lag effect. |
| vdel | vdel <player_id> |
Delete all vehicle(s) assigned to player via spawn. |
| vdel_all | vdel_all |
Delete all vehicles spawned with SAPP. |
| venter | venter <player_id> [seat] |
Force player into a previously spawned vehicle (seat index, 1=driver). |
| vexit | vexit <player_id> |
Force player to exit all vehicles. |
| wadd | wadd <player_id> |
Add previously spawned weapon to player’s inventory. |
| wdel | wdel <player_id> <weapon> |
Remove weapon from inventory (0=current,1-4=slots,5=all). |
| wdrop | wdrop <player_id> |
Drop player’s currently held weapon. |
Remote Console Commands
Manage the TCP remote console.
| Command | Level | Usage | Description |
|---|---|---|---|
| remote_console | 4 | remote_console [enabled] |
Enable remote console. Default: false. |
| remote_console_list | 4 | remote_console_list |
List connected remote console clients. |
| remote_console_port | 4 | remote_console_port [port] |
Set TCP port for remote console (requires restart). |
Query Packet Manipulation
Add custom fields to Halo’s query response.
| Command | Level | Usage | Description |
|---|---|---|---|
| query_add | 4 | query_add <key> <value> |
Add or overwrite a query key/value pair. |
| query_del | 4 | query_del <index or name> |
Remove a query entry. |
| query_list | 4 | query_list |
List custom query entries. |
Custom Variables
Custom variables come from these commands, or from add_var, del_var, and set_var in Lua. Since
scripts cannot call each other directly, a custom variable is the way to share data between them.
| Command | Level | Usage | Description |
|---|---|---|---|
| var_add | 4 | var_add <name> <type> |
Type: 0 = global str, 1 = global int, 2 = global float, 3 = player str, 4 = player int, 5 = player float. |
| var_conv | 4 | var_conv <name> |
Convert between integer and float variable. |
| var_del | 4 | var_del <name> |
Delete a variable. |
| var_list | 4 | var_list |
List all custom variables. |
| var_set | 4 | var_set <name> <value_expr> [player number] |
Set a custom variable (player number required for player variables). |