SAPP's Changelog

If your server didn't get auto-updated, it's probably because it doesn't have admin rights and can't write to Halo's directory. Therefore, it can't delete the old dll and copy the new one.
To fix this, run your server as administrator or just update it from this site manually.

Sapp 10.0 (2017.04.29.)

(changelog unknown)

Sapp 10.0 (2017.02.19.)
Fix: Fixed a Halo bug that combo messages (double kill, triple kill, killtacular) weren't announced after ~16 minutes of the start of the game.
Improvement: Message of the day is now synchronized instantly to the players using the sv_motd command.
New: motd [message] command: displays/sets the Message of the day without requiring a file. It is also synchronized instantly to the players.
New: reload_gametypes command: After using this command, you can use new gametypes added to the savegames folder without restarting the server.
New: save_respawn_time [boolean] command: If enabled, respawn time is also saved when a player leaves. This disables players to evade team kill penalty with simply rejoining the game.
New: gravity [value] command to change the gravity. It will be synchronised with Anticheat and HAC2 clients only. Note that default gravity value is ~0.003565.
New: sj_level [level(-1-5)] command: This is the unified command that replaces disable_sj and sj_admin_level commands. -1 means sightjacking is enabled for everyone, 5 means it's disabled.
New: $ticks variable that returns the number of ticks elapsed since the game start (1 sec = 30 ticks).
New: chat_message <player index> <message> [color r g b [a]] command that displays a colored chat message for the player for HAC2 users.
New: rcon_message <player index> <message> [color r g b [a]] command that displays a colored rcon message for the player for HAC2 users.
New: hud_message <player index> <message> command that displays a message on the HUD for the player in the "blue text" field for HAC2 users.
New: play_sound <player index> <sound index> command that plays the selected sound for the given player if he is a HAC2 user. See Lua scripting section for the list of possible sounds and the corresponding indexes (soon).
New: hud_color <player index> <color index> [red] [green] [blue] command that sets the HUD color for HAC2. See Lua scripting section for more information (soon).
New: spawn_object_location <type> <name> <location name> [rotation] [MetaID] command to spawn an object to a given location.
New: add_var <name> <type> command that adds a custom variable.
New:
del_var <name> command that deletes a cusotm variable.
New:
set_var <player_index> <name> <value> [value player index] command that changes a custom variable. See Lua scripting section for more information (soon).
New:
lua_api_version and sapp_version global values in the Lua API.
New:
Lua event is raised when an object is stick to a player: function OnStick(PlayerIndex, VictimPlayerIndex, Object, VictimObject, Where), PlayerIndex is the index of the player who stick the another player (victim), VictimPlayerIndex is the index of the player who got stick, Object is the memory address of the object that was stick to the victim, VictimObject is the object of the victim that was stick (note that it can be a vehicle too), Where is the index of the body part of the victim's object.
New:
An event is now raised on assist: event_assist
Improvement:
Commands from Sapp's init.txt now won't be in the command history unless they are default Halo commands.
Improvement: Stats saved of left players with the save_scores command now won't be deleted at reload, however they will be deleted at map reset.
Improvement: Player's speed, health, and shield now won't be reset to 1 at reload/unload. God and lag mode is still reset.
Fix: Timed custom commands started form the init.txt now won't have output in the console. Such say commands will also have the prefix set with the msg_prefix command instead of the admin_prefix.
Fix: rand Lua API command now won't crash if the minimum and the maximum value is the same. It will simply return the given value.

Lua API version is now 1.11.0.0

Sapp 9.8.1 (2016. 08. 12)
Fix: disable_object command now disables objects for blues too when both teams are specified.
Improvement:
Battery is now instantly synchronized when the battery command is used.
New: sync_ammo Lua API function now has an optional second parameter to sync the secondary mag of the weapon. Use 0 (default) to sync primary, 1 to sync secondary mag.
Fix: $map, $mode and $gt variables are now initialized properly at Sapp load, before settings are loaded.

Sapp 9.8 (2016. 08. 09.)
New: EVENT_SCORE is now raised when someone scores a lap in race.
New: Added feature to block objects for individual players, the commands are the following:
block_object <player_expr> <object name with path>
unblock_object <player_expr> <object name with path>
You can also block every object and vehicle for the given player(s):block_all_objects <player expression> <block(0-1)>
block_all_vehicles <player expression> <block(0-1)>
Fix: Fixed the $score variable broken in 9.7

Sapp 9.7.2 (2016. 08. 06.)
Fix: Time left is now synchronized at map reset.

Sapp 9.7.1 (2016. 08. 05.)
New: Time left from the game is now visible on the scoreboard for the clients with Anticheat and HAC2 (soon).

Sapp 9.7 (2016. 08. 04.)
New: disable_timer_offsets command. Weapons and powerups will spawn exactly in the same rate as they were designed to (like in Halo Xbox).
By default in Halo PC and CE, the object respawn times are "stretched" from a 0 to 10 seconds range for some reason. From reversing the code, respawn timers looks like this:
actual_respawn_rate = object_respawn_rate + floor((netgame_equipment_number / total_netgame_equipments) * 300) ticks.
For example; if there are total 37 netgame equipments, and an equipment is #6 in the netgame equipments list, and it's original respawn rate is 900 ticks (30 sec), then the real respawn rate will be 900 + floor((6 / 37.0f) * 300.0f) = 900 + 48 = 948 ticks ~ 31,6s. The above command fixes this behavior, so objects respawn in the rate as it's defined in the map.
New: slayer_score and ctf_score were replaced by the score command, slayer_score_team and ctf_score_team were replaced with the team_score that works with every game type. The $score, $redscore and $bluescore variables now also return the actual score of the players/teams in every game type. The save_scores feature now also works with every game type, in race even the current lap's progress is saved.
Fix: Fixed a rare crash in no-lead mode.

Sapp 9.6.2 (2016. 07. 17.)
Fix: Fixed a memory leak in Lua timers that persisted until Sapp was reloaded/unloaded (since 9.6).
Fix: EVENT_END_GAME is now called in race gametype when the game ends naturally (someone wins).

Sapp 9.6.1 (2016. 06. 11.)
Fix: Fixed a bug from the previous version when normal players were level 0 instead of -1 initially.
Fix: st (team change) command now won't do anything in non-team games.

Sapp 9.6 (2016. 06. 04.)
New: Added usage for every command which will be printed if you use invalid parameters. You can also check the usage of a command with usage <command>
Changes: Some minor changes in the following command names (underscores were added):
admin add -> admin_add
admin add_manually -> admin_add_manually
admin list -> admin_list
admin change_pw -> admin_change_pw
admin change_level -> admin_change_level
admin del -> admin_del
loc add -> loc_add
loc del -> loc_del
loc list -> loc_list
loc listall -> loc_listal
area add_sphere -> area_add_sphere
area add_cuboid -> area_add_cuboid
area del -> area_del
area list -> area_list
area listall -> area_listall
New: CPU and memory load were added to the cpu command
New: Same info can be queried from Lua scripts:
local CurrentCPULoad, TotalCPULoad, MemoryLoad = system_status()
New: It was also added to the remote console protocol, see the Remote Console page for more info.
New: Added team scores to the remote console scores query.
Improvement: Updated the LuaJIT API to 2.1.0-beta2
Fix: Fixed a bug that caused random hangs/crashes. Thanks for blackfather (admin of the BK servers) for helping me tracking this one down.
Improvement: IP-bans are now stored in the ipbans.txt even if they are not permanent.
Improvement: Refactored huge part of the code again, I might not remember all the changes I made.

Check out the Remote Console web interface by 002.

Remote console version is now 1.2.0.0
Lua API version is now 1.10.0.0

Sapp 9.5.3.1 (2015. 11. 10.)
New: Chat type were added to the Lua chat event.
Fix:
Some aliases weren't always saved.
Fix: Some command's output was always echoed to Lua scripts.

Sapp 9.5.3 (2015. 11. 10.)
Fix: block_tc now always works, not only when autobalance is enabled in the gametype.
Improvement: Remote console is now bind to the same local IP that Halo uses.
Fix: read_* functions now return nil on NoAccess and Guarded addresses.
Improvement: read_* functions are much faster now when safe_read is enabled (but still significantly slower than without).
Fix: Executing commands from the console or the init.txt that are longer than 254 characters won't crash the server anymore.
Other: Small improvements and fixes.

Sapp 9.5.2 (2015. 10. 20.)
New: event_reset, runs when the sv_map_reset command is executed.
Fix: Fixed custom_sleep crashed Wine when called from the init.txt, in the last version.
Other: Minor improvements.

Sapp 9.5.1 (2015. 10. 18.)
Fix: Fixed broken sv_map (crashed) and lua_api_v (showed the old version) command and vehicle-exit hook from the previous version.
Fix: custom_sleep value will be set correctly when Sapp is loaded during a game.

Sapp 9.5 (2015. 10. 17.)

New: Tab-completion in the console now works with Sapp commands too.
New: hill_timer command, changes the time after the hill moves. Default is 60 seconds, works only in "Crazy King" (when moving hill is enabled).
New: antilagspawn command, enables/disables anti-lagspawn. It is disabled by default now.
New: disable_backtap command, if enabled, backtaps won't kill players instantly, just cause normal melee damage.
Improvement: Refactored every codecave, this result in minor performance improvement and also some potential bugs were fixed.
New:
EVENT_DAMAGE_APPLICATION Lua event, it's called when a player takes damage. It is based on the "OnDamageApplication" event in Phasor, thx to Oxide.
Function signature is OnDamageApplication(PlayerIndex, Causer, MetaID, Damage, HitString, Backtap), where PlayerIndex is the index of the player who suffers the damage, Causer is the index of the player who caused the damage, MetaID is the Tag-Index of the damage object, Damage is the amount of damage made, HitString can be "head", "body" or "legs", Backtap is true if the damage was a backtap. It has two optional return values, first is a boolean if the damage should be enabled, the second is the new damage amount you want to apply.

Example snippet for doubling headshot damage:

function OnDamageApplication(PlayerIndex, Causer, MetaID, Damage, HitString, Backtap)
    if HitString == "head" then
        return true, Damage * 2
    end
end

Lua API version is now 1.9.0.0

Also check out the new Lua API summary page by 002.

Sapp 9.4.1 (2015. 09. 24.):

Fix: The remote console query RC_QUERY_STATS now returns the correct Json.
Improvement: Better Json separating algorithm, now every Json query must be terminated by an end line character ('\n'), like the queries Sapp sends.

Sapp 9.4 (2015. 09. 12.):

Fix: Fixed the bug when server crashed if a Lua script blocked a command.
New: Added Json based Remote Console protocol. More details + client in the next week.

The remote console is using TCP ports, the default is the same as the server port (which is UDP).

remote_console [enabled]: Enables/disables the remote console
remote_console_port [port]: Sets the remote console port, only takes effect if used before enabling the remote console.
remote_console_list: Lists the connected remote clients.

Sapp 9.3 (2015. 08. 31.):

Improvement: Reduced Halo's CPU usage by ~5-10%.
Improvement: Completely rewritten no-lead mod, which significantly reduces it's CPU usage, up to ~90%.
New: event_prejoin, runs when a player machine joins.
New: $app even variable, 2: Anticheat, 4: HAC2 (will work when Btcc updates HAC2)
New: sj_admin_level command, enables the usage of HAC2's SightJacker for players with at least the given admin level, value can be between 0 and 5, default value is 5, which means no one can use SJ (will work when Btcc updates HAC2).
New: subtract_afks command, if enabled, the number AFK players will be subtracted in the player number on the server list, except if the server is full). Default value: 0
New: console_input command, if disabled, the console won't accept any input, this slightly improves reg, mostly useful in servers at hosting companies, where you don't have access to the console anyways. Default value: 1
New: The generic game type will be reported and visible on the serverlist.
Improvement: event_login will run every case a player logs in, even when it's automatic.

Sapp 9.2 (2015. 06. 04.):

Improvement: Improved the Anticheat client - Sapp communication. This should fix the problem for some players who were unable to authenticate themselves as AC users.
Note that to be able to play with anticheat, the server always must have the latest Sapp version!
New: antiglitch, which kills the player if he is out of the BSP, useful in maps such as Danger Canyon or Coldsnap. Thx for 002 for this great find.
New: lua_list command that lists the currant state of the Lua scripts in the server.
New:
gamespeed [speed] command which will be synchronized with the HAC2 clients too when it will be ready.
New: zombies [team] command, this will give some information for a future HAC2 with new medals about which team is the Zombies team. 0 - none, 1 - red, 2 - blue
Improvement: MTV and Disabling SJ will be instant too with the new HAC2.
Improvement: event_score has it's own codecave now, like this way it won't be triggered when you set it manually with the ctf_score command.
Fix: Fixed the Time Left feature in the info command which broke when the map was reset.
Fix:
Fixed the rprint command
New: New Lua API function, powerup_interact(ObjectID, PlayerIndex) which makes the player interact with a powerup spawned with the spawn_object function. It returns false if the player was dead, the ObjectID was invalid, or the object wasn't an equipment, otherwise true, even if the player couldn't interact with the object, for example because he had already full HP or Over Shield.
Improvement: enter_vehicle function now returns false if the player was dead, the ObjectID was invalid, or the object wasn't a vehicle, otherwise true.
Lua API version is now 1.8.0.0

Sapp 9.1 (2015. 05. 27.):

Change:  Anti-lagspawn is now only active in the first second instead of the first 2.
Fix: Servers should not "idle-out" randomly anymore (this happened mostly with modded maps). This was a Halo-bug.
Fix: Fixed the mtv command, players can't enter a seat anymore which is already taken.
Improvement: Improved the files and the info command. The files command now shows the full path for every file, the info command now shows the time remaining from the game.
Other: Updated LuaJit to 2.0.4, this mostly contains bugfixes, no change happened in the API.
Other small fixes and improvements.
Compiled with Visual Studio 2015 RC.

Sapp 9.0.2 (2015. 04. 13.):

Fix: Fixed a bug from the previous update where float numbers didn't got parsed if they had a "." in them.
Fix: Anti-lagspawn now should correctly disable jumping in the first two seconds, but it might be still not perfect with laggy players.
Fix: Fixed a lot of typos and grammar mistakes, thx to 002.

Sapp 9.0.1 (2015. 04. 12.):

Important: Anticheat now only works with this latest version!

Fix: vdel_all command will delete every vehicle.
Fix: Player death was buggy when a vehicle was destroyed by a script on some maps.
Fix: Lua script's main chunk was loaded every time when lua_load command was called, and after some loads, this crashed the server.
Fix: Players now can't melee while zooming and can't jump and melee in the first second after they spawned, this fixes phantom-shooting and lag-spawn.
Fix: cheat_spawn_warthog and cheat_all_* commands now disabled in scrim mode.
Fix: Giving wrong arguments to the w8 or wait commands now won't stop the whole sequence to execute, only the w8/wait commands will be ignored.

Sapp 9.0 (2015. 04. 03.):

New: Default Halo commands will have output even if they are executed from the chat, password and rcon_password command were removed due to being deprecated now.
New: Some naughty commands will work without the "me" expression. For example "kill" is equal to "kill me" now. This only works if there are no other arguments or they are optional.
New Command: setadmin, it will make players admin for the current session. Level must be between -1 and 4. Set level to -1 to delete their admin level.
Fix: mapcycle_begin and map_spec commands will disable mapvote now.
Fix: Improved reload command that fixes some bugs that happened after executing it.
New: V2 admins will be automatically logged in at the first time they execute an rcon command with their password, also if sapp_rcon is disabled (not recommended), anyone will be able to login with the default rcon password, use the chat as rcon and not getting kicked for being afk or having high ping. Note that now sapp_rcon must be enabled for the login command to work as the same way as before for the V2 admins, otherwise it will try to compare the password entered to the default rcon password.
New Commands: stfu and unstfu that blocks/unblocks every server and rcon message to you which is generated by events or scripts.
New Command: mapvote_begin, that will launch the game with a randomly chosen mapvote from the first max_votes options.
Fix: Some other small fixes with the mapcycle and mapvote.
Fix: Some Prefs command threw error messages if they were enabled already.
Change: wdel command now deletes the current weapon from the players hand if you specify 0 as the second argument, if you only specify the player index (or 5 as the second argument), it will still delete every weapon.
Change: The boost and the teleport commands will be more instant now.
Change: The $score variable now also works with slayer gametypes.
Fix: Sometimes Sapp counted a player as dead, and therefore some player commands didn't work with him.
Fix: Improved the way Halo kills the players when they quit, now they shouldn't stuck in the server on some modded maps where fall damage is 0.
Improvement: The main loop timer (defined with the custom_sleep command), therefore the pings, the timed events and the Lua timers will be more accurate and effective now.
Improvement: Added thread-pool and memory-pool for Sapp to reduce overhead with lot of events and scripts.
Improvement: Lot of other optimizations to reduce overhead at (Lua) event callbacks.

Lua API:
Change: Now only the syntax checking will run at Sapp load, the main chunk will be only called at the lua_load command.
New: Added 2 global values; halo_type that contains either "PC" or "CE" and pid that contains the Process ID.
New: Added rprint function that lets you to send rcon messages to the player.
New: Added intersect function that checks for collisions form a given point and a vector. First 3 is the starting coordinates, second 3 is the vector, 7th (optional) is the ObjectID to ignore, usually this belongs to a player who's camera vectors you use. Don't forget to multiply the camera vector's coordinates by about 1000 otherwise the intersect won't "reach" anything. Returns values are success,x,y,z,object_hit. success is true if there were an intersection, otherwise false. x, y, z are the coordinates of the intersection, object_hit is the ObjectID if something was hit, otherwise 0xFFFFFFFF.
New: Added lookup_tag Lua function that returns the address of the tag entry and has two variants, lookup_tag(MetaID) and lookup_tag(type, name).
The tag entry has the following structure (Class0 is the 4 letter type):
struct Tag_Entry
{
    DWORD Class0;
    DWORD Class1;
    DWORD Class2;
    DWORD MetaIndex;
    char* TagName;
    void* TagStruct;
    BYTE Unknown[8];
};

Change: execute_command is updated and now takes 2 other optional arguments. Example: execute_command("kill", PlayerIndex, true). The command will be executed as the "PlayerIndex" player were executing it, true means that you will get the output of the command in the "EVENT_ECHO" callback that will be described below. Now it also returns a boolean, false if the command was unknown, wrong or "can't be used now", otherwise true.
New: Added execute_command_sequence function that executes commands separated by semicolons (like the events and the custom commands), it works in the same way as the execute_command except it has no return value.
Fix: Rotation will work with everything now with the spawn_object function (and also with the spawn command), and not only with vehicles.
Fix: The to_real_index command returned wrong converted index if the supported index was invalid.
Change: The assign_weapon function now returns a boolean if it was successful or not.
Change: The spawn_object function now returns 0xFFFFFFFF as ObjectID on an error.
Change: The camo function now takes the time in ticks instead of seconds (1 second = 30 ticks).
Improvement: The optimized the get_var function, now it should have much less overhead.

New Lua events:
"EVENT_COMMAND" that runs whenever a player executes a command.
Example: function OnCommand(PlayerIndex, Command, Enviroment, Password), where PlayerIndex and Command are obvious, Enviroment: 0: console, 1: rcon, 2: chat, Password is the password used in the rcon, otherwise a nil. This event is executed before Sapp checks for admin permissions, and the command will be blocked if the function returns false (same as EVENT_CHAT).

"EVENT_ECHO", Example: function OnEcho(PlayerIndex, Echo) that will return the outputs of the command in the "Echo" parameter if the execute_command were used with the true third parameter. Note that this is called once for every line.

"EVENT_OBJECT_SPAWN" callback which is called when an object is being created. The signature of the callback function is OnObjectSpawn (PlayerIndex, MapID, ParentID, ObjectID)
PlayerIndex is the Index value of the associated player (or 0), MapID is the "MetaIndex" aka the tags table ID, ParentID is the ObjectID of the parent object or 0xFFFFFFFF if there is no parent, ObjectID will be the ID of the object being created, but it's not valid until the callback returns. If you return false, the object creation will be blocked, otherwise you can return a second parameter which is the MapID of the object that you want to change the object which is being created. Note that it must have the same type, otherwise this parameter is ignored.

New: Better error reporting; if an error happens in your Lua script, not only the error information will be a bit more detailed, but the OnError function will be called in your script (only if you declared it). Just add the following code to (possible the top) of your script and you also get stack trace information that will might help a lot:
function OnError(Message)
    print(debug.traceback())
end
You can also use StackTracePlus which gives even more information.

New: Added read_bit and write_bit functions. Usage:
read_bit(address, bit)
write_bit(address, bit, value)
The address always belongs to a byte, therefore the bit parameter should be always between 0 and 7, and the value parameter will be always converted to 0 or 1.

api_version = "1.7.0.0"

Strings.dll:

Fix: Map caching added for 1.10 exe's, this strings.dll won't work with older servers anymore, please use the exe provided in the archive.
Fix: Now it fixes the "Using profile path ." bug in the server console, the path will be displayed properly.
Fix: Small fixes for the client and for Anticheat login.
Other: It's also packed with UPX now to reduce the size.

Sapp 8.7.2 (2015. 02. 20.):

Fixed false aimbot detection that happened randomly at player spawn.
st/teamup/balance_teams commands now won't give -1 death for already dead people.
Other minor fixes and optimizations.

Sapp 8.7.1.1:

Fixed the bug where anticheat usernames were displayed incorrectly in servers where anticheat is not enabled.

Sapp 8.7.1:

Updates to support new features for the anticheat. Players with Anticheat ON won't be able to join to lower versions anymore. Please update your server ASAP if it didn't do it automatically yet.

Custom maps will be automatically loaded for Halo PC, you don't have to use the "map_load" command anymore in the init.txt. Also Sapp won't try to checksum at map_load in Halo PC since it's useless and caused crash at some badly converted maps.
Potential fix for aimbot-scan being too sensitive and generates many false positives.

Sapp 8.6.4:

Bug fixes:

Map won't get automatically skipped anymore when the last player leaves.
Unbanning an IP-range ban will unban the proper IP now.

New features:

Sapp will use the custom IP to connect to the global server if it's specified with the -ip switch.
query_add will now overwrite the existing values, query_del can be used with the key name to delete a query pair.

Sapp 8.6.3:

Bug fixes:

destroy_weapon won't crash the server anymore.
query_delete command won't crash the server with too big index.
AFK kick won't kick players anymore when they are in passenger/gunner seat in the vehicle for long.
Setting too big value for clead won't cause random lead (sometimes even negative) anymore.

When a player leaves, Sapp will recount the "skips" and runs the next map if there are enough votes.

Sapp 8.6.2:

Fixed AFK timer when players are in vehicles.
Players using the /afk command won't respawn anymore at new game.

Sapp 8.6.1:

AFK timer won't reset anymore if a frag grenade explosion hits the player.
Fixed the bug when antispam always used textban even if it was set to mute.
sapp_mapcycle will now automatically disable mapvoting if it was enabled and vice versa.

Sapp 8.6:

New event:
event_prespawn: Runs at player spawn, before client notification.

New variables:
$afk: The afk timer of the player.
$ping: The ping of the player.

Mapvote now checks if map and gametype are correct before they are added.

Lua API version changed to 1.6.0.0

Sapp 8.5.2:

Fixed the cmd_add and cmd_del command taking wrong argument as command name.
Fixed when the server sometimes hang at unload if there were a Lua timer running.

Sapp 8.5.1:

Fixed the bug that the 16th wasn't recognized.
Fixed the bug that the aimbot_ban command wasn't working after the first time it's used.

Sapp 8.5:

Bug fixes:
bans command will be fixed and won't crash the server.
ipbans command will be fixed too and it won't crash the server if two admins ban the same player in the same time.
"Amount" expressions for the battery command (For ex.: battery $n +10) will work properly (did anyone noticed they don't?). Not like there is any point using it since the battery must be between 0 and 100 otherwise it won't really work.
Lua timers will stop when a script is unloaded.

Removed or changed commands:
cmd list: Removed, same as "list custom", it was always undocumented.
cmd change: Removed, undocumented, unpractical.
cmd add: Changed to cmd_add, added documentation
cmd del: Changed to cmd_del, added documentation
despawn: Removed, useless.
olist: Removed, useless.
c4_ag: Removed, people used it in every map without knowing what it does or how it works, you can write a better one with Lua scripts anyways.
event: Removed, undocumented, unpractical (could add an event in the same way they are in the events.txt, but only worked form the console because the "$variables" got replaced otherwise).
clear_object_cache: Removed, undocumented, got deprecated with optimizations.
cmdstart: Renamed to cmdstart1.
cmdstart1: Renamed to cmdstart2.

New command:
wdrop: Forces player to drop his current weapon.

New event:
event_tick: It will be called every thread cycle (30 times / sec), so you don't have to create Lua threads (timers) just for this.

New Lua API functions:
read_vector3d and write_vector3d: They read/write 3 floats in the same time, useful for getting player coordinates or other 3D vectors.
exit_vehicle: Ejects the given player from the vehicle.
drop_weapon: Forces the player to drop the current weapon in his hands.
camo: Makes a player invisible.
kill: Kills the given player.
unregister_callback: Unregisters a Lua callback.
Visit Lua scripting page for more information.

Others:
eventdel and cmd_del won't affect the files anymore.
enable_object command now can take the object name too, not only the index (why I didn't do it like this at first o.O)
vdel command is split into two commands; the original vdel which now takes a player expression, and to vdel_all that deletes every vehicle spawned with Sapp.
Added documentation for custom variables.
Added "unalterable" attribute for some commands which means you can't change their name or level.
These commands are the following: about, info, lead, clead, login, change_password.
Spawn event is moved back after client notification since it caused clients crash with some mods that used the wadd/wdel commands.
Kill command doesn't display the "xy died" message anymore when the game is ending.
Aimbot detection will detect lock-ons.

Due to a change in a network structure, querying maps for download won't work correctly from older Sapp versions.

Sapp 8.4.1:

Fixed the bug that alias command sometimes showed names duplicated.

Improved thread handling, unloading Sapp shouldn't randomly freeze the server anymore.

Sapp will work on Windows XP again, you can download the XP version from the downloads page.

Sapp 8.4:

New features:
Added timer function for Lua API.
Usage:
timer(<milliseconds>, <callback>, [arguments]...)

This means that the "callback" function will be called with the given argument(s) after the specified "milliseconds" passed. If the callback function returns true, the timer will be called again with the same arguments, if returns false or nothing then it won't be called again.

For example if you want a function to run once after 5 seconds a player joined, then it looks like:

function OnPlayerJoin(PlayerIndex)
    timer(5000, "hello", PlayerIndex)
end

function hello(PlayerIndex)
    say(PlayerIndex, "Hello, "..get_var(PlayerIndex, "$name").."!")
    return false
end

This equals to the following:
event_join 'w8 5;say $n "Hello, $name!"'

An example for a "ticking" timer:

stop = false
ticks = 0
function OnGameStart()
    stop = false
    ticks = 0
    timer(1000, "test")
end

function OnGameEnd()
    stop = true
end

function test()
    ticks = ticks + 1
    say_all(ticks.."s passed since game start)
    if stop == false then
        return true
    else
        return false
    end
end

Note that doing anything from the scripts is fully thread safe.

Other:
OnScriptUnload will be called now at unload/reload commands for every script that was loaded.
Fixed that PlayerIndex was broken if there were more than one script registered for a callback.

LuaAPI version is now 1.4.0.0

Vehicles spawned with Sapp will now respawn automatically using the vehicle respawn timer defined in the gametype.

Added "rotation" option for object spawning (only works with vehicles when spawned to a given coordinate).
spawn <type> <name> <x> <y> <z> [rot]
The value is in radians.

Option for spawning object based on their MetaID (for protected custom maps) from Lua scripts.
spawn_object(<type>, <name>, [[x], [y], [z]], [rot], [MetaID])

For example if you want to spawn a weapon in a protected map and give it to a player:
local obj = spawn("weap", "thatweaponyoualwayswanted", 0, 0, 0, 0, 0xE25E00EA)
assign_weapon(obj, PlayerIndex)

If the MetaID is specified, you don't have to give a real path to the object, only should give the type correctly.
You can get the MetaID of a weapon or a vehicle with this Lua script.

Other changes:
Spawn event is now before client notification.
Vehicle enter event now have a "$seat" special argument.
Mapvote allows the same option multiple times.
Ping kicking works properly again.
The afk command is now "naughty" (can't be used in scrim mode).
Reduced CPU usage of no-lead mod especially with vehicles.
Lot of code optimizations and bug fixes.
Sapp is now packed with UPX to reduce the size.

Sapp 8.3:

Warning! Some of these features aren't fully tested due to lack of time. Please use them cautiously and report bugs on the forum.

Added safe_read, safe_write and sig_scan functions. Please read the Lua scripting page for more details.

Lua API version is now 1.3.0.0

Removed double broadcasting since GameSpy shut down. Also removed v1 and v2 commands.

Fixed the bug when admins didn't got checked against the IPs specified in the users.txt

Mapvotes now can have player ranges just like the mapcycle. Example entry from mapvotes.txt:

bloodgulch:ctf:Bloodgulch CTF:4:12

Which means mapvote option will only be shown if there are 4-12 players in the server.

Sapp 8.2.2:

Since it looks like GameSpy won't shut down for another month, I added back v1, v2 commands and double broadcasting.

Sapp 8.2.1:

Fixed a bug when Sapp crashed at reload command if no map was running.

Added new command to call a lua script function:
lua_call <script name> <function name> [arguments]

For example if your "test.lua" script has a function like:
function TestFunc(index, msg)
    say(tonumber(index), msg)
end

Then it can be called from Sapp like lua_call test TestFunc 1 Hello!

Note that every argument of the function is passed as a string.

Lua API version is now 1.2.1.0

 

Sapp 8.2:

disable_all_objects command now does not effects interacting with vehicles. Instead, use the new command; disable_all_vehicles to prevent teams entering any vehicle.

Replaced random number generator function in Sapp to Windows's default CSPRNG.

Removed the $boolrand variable.

Added some more Lua API commands to make scripting easier:

say(PlayerIndex, message)

Sends a chat message to the given player (equals to say $n "message").

say_all(message)

Sends a chat message to every player in the server (equals to say * "message")

cprint(message, color)

Prints a message to the console, the color argument is a number and optional, if not specified the default console color will be used.

rand(min, max)

Returns a cryptographically secure pseudo-random number.

If no arguments are specified, the number will be between 0 and 2^31, if only 1 argument is specified, the number will be between 0 and the specified argument, if both, then the random number will be between the two arguments. Note that the random number can be the minimum value, but the maximum will be always one less than the max argument. For example: rand(1, 5) will return either 1, 2, 3 or 4.

Lua API version is now 1.2.0.0

 

Sapp 8.1:

Removed the gs_ping_fix command, since it's not needed with the new GS-emulator.

Rewrote event_wpickup and added event_wdrop.

event_wpickup now has two special arguments.
$type: 1 means weapon, 2 means nade
$index: If $type is 1, this is the weapon slot where the new weapon got added, can be 1 to 4. If $type is 2, this is the type of the nade that got picked up, 1 means frag nade and 2 means plasma nade.
Edit: Please note that now if you wdel from event_wpickup, and then assign a new weapon to the player, it will trigger event_wpickup again. Instead, just use the disable_all_objects command to prevent the specified teams picking up any weapon. Check the Naughty Commands page for more information about the command.

Corresponding Lua event can be like:
function OnWeaponPickup(PlayerIndex, index, type)

event_wdrop: Called when a player drops a weapon or a flag\oddball.
Special argument is $index, which is the number of the slot where the player dropped the weapon from, can be 1 to 4.

Corresponding Lua event can be like:
function OnWeaponDrop(PlayerIndex, index)

Added some more Lua API functions that you can call from your script:

to_player_index(RealPlayerIndex)
Converts back to PlayerIndex (1-16) from real player index (0-15), 0 means that the player is not in the server.

player_present(PlayerIndex)
Returns true if the player is present in the server, false if not.

player_alive(PlayerIndex)
Returns true if the player is alive, false if player is dead or not in the server.

Lua API version is now 1.1.0.0

Sapp 8.0:

From this version, Sapp stops broadcasting to the old GameSpy master server, and automatically replaces the DNS to Btcc22's emulator, and also changes the version to 01.00.10.0621
The v1, v2 and vspec commands got removed.

Mayor change in map downloading: From now on, Sapp downloads maps compressed as .7z instead of .zip, this will result faster downloading and extracting.
All Sapp version before 8.0 will be unable to download maps in the future.

If you get the red 'Error: Failed to find signature for "QueryMapName Fix"!' message in the console with the new 1.10 exe, just ignore it. It was a bug in older exes that got fixed in 1.10, so Sapp doesn't find it anymore.

Added basic Lua API, which is using LuaJIT-2.0.3.

Important notes:

First of all, please don't use any Lua script that you don't know to be 100% safe.

Later I'll have a list of safe scripts here.

Also, it's not compatible with Phasor scripts at all, so please don't try to load them and then wonder why it's not working.

This feature is for users who already have experience with Lua, or for people who want to learn it by themselves. I can't give any support about scripting in Lua, so please only talk to me about this if you found a bug or have an idea what else I should add.

Sapp will try to process every .lua file from the gametypes\sapp\lua folder and compile them. You will likely to get an error message here if you made a syntax mistake in your script and it won't be available.

To enable lua callbacks, use the lua 1 command. This is the general switch to enable\disable calling any lua scripts.

However, to make a lua script active, you have to use the lua_load <script_name> command. If you want to disable a script, use the lua_unload <script_name> command.

Things that must be in your lua script:

API Version: This is the version of the Lua API of Sapp that your script is compatible with, in this first version it's 1.0.0.0
So when you writing your script, put the actual version from the latest Sapp into your script file like:
api_version = "1.0.0.0"

You can get the current version from Sapp with the lua_api_v command.

If the mayor API version is different in your script that the one in Sapp that tries to load it, it means they are not compatible and your script won't be loaded.
If the minor version is different, you will get a warning message, but Sapp will still load your script, but it might won't work correctly.

function OnScriptLoad()
function OnScriptUnload()

This two functions are necessary, they will be called when you use the lua_load and lua_unload commands.
In the first one, you have to register the callbacks that you want Sapp to call your function at an event.
For the best performance, only register the callbacks that you actually need and using it.

For Example:
function OnScriptLoad()
    register_callback(cb['EVENT_SPAWN'], "OnPlayerSpawn")
    register_callback(cb['EVENT_DIE'], "OnPlayerDeath")
    register_callback(cb['EVENT_CHAT'], "OnChatMessage")
end

function OnScriptUnload()
    -- Not really necessary to fill this if you have nothing to reset.
end

And your function will be:

function OnEventDie(PlayerIndex)
...
end

function OnEventDie(PlayerIndex, Killer)
...
end

And a special one:

function OnChatMessage(PlayerIndex, Message)
    return true
end

This is the only event that has a return value, a boolean. If you return true, the chat message will be visible, if false, the chat message will be blocked.
Message is just a copy of the original chat message, therefore you can't modify that.

cb is a table of the possible callbacks, which are the following:

EVENT_ALIVE, EVENT_AREA_ENTER, EVENT_AREA_EXIT, EVENT_SPAWN, EVENT_KILL, EVENT_DIE, EVENT_SNAP, EVENT_WARP,
EVENT_WEAPON_PICKUP, EVENT_WEAPON_DROP, EVENT_VEHICLE_ENTER, EVENT_VEHICLE_EXIT, EVENT_BETRAY, EVENT_SUICIDE, EVENT_SCORE,
EVENT_TEAM_SWITCH, EVENT_JOIN, EVENT_LEAVE, EVENT_CAMP, EVENT_LOGIN, EVENT_GAME_START, EVENT_GAME_END, EVENT_CHAT

You can give any name to your functions. The first parameter is always the player index (1-16), which is used for Halo and Sapp commands.
If there are special arguments, they will be the second, third, etc. parameters, but atm. every event has only 0-1 special arguments.

Sapp functions that you can call:

execute_command(string)
Executes any Halo or Sapp command.
Example:
execute_command("k "..PlayerIndex.." 'no reason'")

get_var(player_index, var)
Returns any default or custom sapp variable.
Example:
local hp = get_var(PlayerIndex, "$hp")
local warnings = get_var(PlayerIndex, "$warnings")

The following functions are only for advanced users:

to_real_index(PlayerIndex)
Returns the real index (0-15) that Halo uses for player tables and some other score tables, -1 if the player is not present.

get_player(PlayerIndex)
Returns the memory address of the player's player table entry.

get_dynamic_player(PlayerIndex)
Returns the memory address of the dynamic player object. 0 if the player is not present or dead.

get_object_memory(ObjectID)
Returns the dynamic memory of an object. 0 if the object doesn't exist anymore.

spawn_object(type, name, x, y, z)
Spawns an object to the given coordinates and returns it's ObjectID that you can use in the other commands.
Example:
local ball = spawn_object("weap", "weapons\\ball\\ball", 12.34, -20.5, 10)
Note that here you have to use double backslash in the object names.

destroy_object(ObjectID)
Destroys the given object.

sync_ammo(ObjectID)
Synchronizes the ammo for the given ObjectID (weapon).

assign_weapon(ObjectID, PlayerIndex)
Assigns the weapon with the ObjectID to the given player.

enter_vehicle(ObjectID, PlayerIndex, seat)
Enters the player to the vehicle with the given ObjectID into the specified seat.

Memory management functions:

Note that these functions have no security check if you pass them a valid address or not, and if you don't you will probably crash the whole server, so be careful when using these.
Read functions take one argument, the address to read from, and returns the value they have read.
Write functions take two arguments, the address to write to, and the value to write, and have no return value. They are not able to write read-only memory regions (like Halo's asm code etc.).
Later I'll probably add safe_read_* and safe_write_* functions.

Functions to read memory:

    read_char(address)
    read_byte(address)
    read_short(address)
    read_word(address)
    read_int(address)
    read_dword(address)
    read_float(address)
    read_double(address)
    read_string(address)

Functions to write memory:

    write_char(address, value)
    write_byte(address, value)
    write_short(address, value)
    write_word(address, value)
    write_int(address, value)
    write_dword(address, value)
    write_float(address, value)
    write_double(address, value)
    write_string(address, value)

(byte is unsigned char, word is unsigned short, dword is unsigned int, float is 4, double is 8 byte floating point numbers.
strings are array of chars, and not wide-char strings (with 2 byte characters such as player names).

Sapp 7.3.1:

Bug fixes:

event_leave now should work again on Halo PC 1.10.

Memory leak is fixed for Halo 1.10.

cevent <name> [player_number]  Now should always affect the correct player, if no player_number specified, will apply to the player or player's event who executes it, same goes for var_set now.

Sapp 7.3:

There will be an official 1.10 patch to save Halo, and from this version, Sapp will also broadcast to the new master server (made by Btcc22), which is going to completely replace the current gamespy server after May 31. Note that until then, servers will be on both serverlist.
Read more here about this topic.

New features:

From now you can use custom variables to store text/numbers and use them for more flexible modding.The commands are the following:

var_add <name> <type> Adds a new variable, where type 0 - global string, 1 - global int, 2 - global float, 3 - player string, 4 - player int, 5 - player float
Globals are containing only 1 variable, while player ones has a different variable for each player.

var_del <name> Deletes the given variable.

var_set <name> <value_expression> [player_number] Sets a given value, player_number is only required for player variables.

var_conv <name> Converts int variable to float and vice versa, not available for string.

var_list Lists all variable name and their types.

Some simple examples for usage for globals:

This makes a time command that tells since how long the current game is running:
var_add time 1
var_add min 1
var_add sec 1

events.txt:
event_start 'var_set time 0'
commands.txt:
timeloop 'w8 1;var_set time +1;timeloop'
time 'var_set min $time;var_set min /60;var_set sec $time; var_set sec `;say $n "Current game is running since $min minutes and $sec seconds!"' -1
init.txt:
timeloop

This one sets the assists to everyone's health:
init.txt:
var_add health 2
(As a global variable, since it's only used as temporary, no need one for every player)

events.txt:
event_alive 'var_set health $hp;var_set health *100;var_conv health;cevent hpassists $n;var_conv health'
event_custom $ename:hpassists 'assists $n $health'
event_die 'assists $n 0'

And a simple warning system and for player variables:
var_add warnings 4
events.txt:
event_tk 'var_set warnings +1 $n;say $n "You got a warning for betraying! ($warnings)";cevent warn'
event_custom $ename:warn $warnings=3 'say $n "One more warn and you will be kicked, $name!"'
event_custom $ename:warn $warnings=4 'k $n "Too many warnings."'
commands.txt:
warn #n 'var_set warnings +1 #n;say #n "You got a warning from admin $name! ($warnings)";cevent warn #n' 3

Other changes:

cevent command now has a second argument to specify the player number.
ip should not freeze forever anymore when can't return the DNS.
Fixed map_next and map_prev commands crashing when there was no Sapp mapcycle running.
Fixed some code for the version 1.10

 

Sapp 7.2:

Server messages now have two different prefix, ** SAPP ** for auto-messages and events, and ** ADMIN ** for messages that an admin typed "real-time".
You can set the first with the msg_prefix [text] and with admin_prefix [text] the second one.

No-Lead now works on vehicle-guns, and also using less CPU, except if many player is on moving vehicles, the CPU usage can increase significantly.

Improved aimbot-detection a bit.

list command is now level -1 and only lists the commands that you have rights to use.

Fixes some rare crash with the $ip variable and some other cases.

New event variable: $boolrand, returns a random 0 or 1.

random_bonus command has been removed, since you can do it with events and custom commands.

Optimization in command and event execution.

There might be some other changes I don't remember, if so, report to me on xfire, also if you found (new) bugs.

 

Sapp 7.1:

The real version 7!

New threading core, this will result better performance and faster unloading.
Fixed some memory leaks at the object spawn command, some player commands, and at unloading.
Fixed huge memory leak in Halo at player join, now your server's memory usage won't keep growing until you restart it.
Faster command and event execution with less memory usage.
Basic arithmetics and custom event for events system:
Now you can use arithmetic operations on the condition variables. Allowed operators are: +, -, *, /.
Note that the variable must be in the left side and the modifier number in the right side.
New event type: event_custom, special argument: $ename. To launch a custom event, use the cevent <ename> command.
Examples:
event_score $reds>$blues+1 'say * "Poor blues, that wasn't really fair, $name!"'
event_score $blues>$reds+1 'say * "Poor reds, that wasn't really fair, $name!"'
event_leave $reds*2<=$blues 'say * "The teams are too unbalanced!";st randblue'
event_leave $blues*2<=$reds 'say * "The teams are too unbalanced!";st randred'

With custom events:
event_custom $ename:autobalancered $reds>$blues+1 'st randred;say * "Teams Have Been Balanced"'
event_custom $ename:autobalanceblue $blues>$reds+1 'st randblue;say * "Teams Have Been Balanced"'
event_leave 'w8 15;cevent autobalancered'
event_leave 'w8 15;cevent autobalanceblue'

teamup: Will set up the two teams based on the tags in the player names.
This only works if at least one team has proper tags and all are the same, otherwise it won't be always 100% accurate.

The loader.dll is included in the downloaded archive, which is the same as Anticheat's loader, it also reduces CPU usage at loading maps both for server and client.

Sapp 7.0.1:

Fixed the bug when some players didn't respawn.

Sapp 7.0:
Anticheat!

This version supports client sided anticheat.
To enable anticheat in your server, put anticheat 1 to the sapp's init.txt
Note that once it's enabled, this feature can't be disabled until you restart your server!
Also, you will need the anticheat client in order to play in anticheat servers!

The info command now shows the sapp version, and the state of the nolead and anticheat mode too.

Sapp 6.4:
Optimized code with the C++11 features.

Edit:
I forgot to add last time that I also fixed the bug in Halo when the server crashes if you spawned vehicles in maps where are no vehicles available (like ratrace, boardingaction, etc.) and there was vehicle respawn time set or you used the sv_map_reset command.

Fixed the setcmd command which was crashing in 6.3 if you changed the name of a command.

The k, b and ipban commands now tells the name of the admin who issued the kick/ban.
To disable this feature, add hide_admin 1 to the init.txt.

New feature: adding custom entry to the server query string, will be useful with HAC2 to auto-join to a voice server.
query_add <key> <value>: Adds a new entry to the query string. For example: query_add xfire lgbalazs or query_add ventrilo 12.34.56.78:91011
query_list: list the all custom query entry.
query_del <id>: Deletes a custom query entry (id from query_list command).

Tab, and some other "bad" characters now filtered (removed) from the player's name at join.

Sapp 6.3:
Built with Visual Studio 2013 RC for more optimized code!

Bug fixes:
event_snap's custom argument changed from $score to $snapscore.
log_name command now have effect from sapp's init.txt too.
Auto-Update won't keep reloading sapp if failed, instead displays a message every 15 minutes about the new update in the chat and the console. Note that you can disable auto-update completely with the auto_update 0 command (not recommended).

Other:
Added a download page where you can get No-SSE versions of Sapp for crappy old CPUs like the Athon XP etc.
Also, for some people the mapcycle stops randomly, and after that they get a message like "Server was automatically restarted after it was inactive for 60 seconds.". This is because they using some buggy patched haloceded.exe instead of the original. Sapp doesn't request a patched exe and it's always recommended to use the original haloceded.exe with the custom strings.dll which is included in the archive. You can download it too from the new downloads page among with Optic, Halo Chat V2 and a NameHack made by me, which works with all versions of Halo PC and CE.

Sapp 6.2:

Upgraded No-Lead mode:
Depending on the ping, sometimes no-lead wasn't perfect but might had to lead 33 ms, this should be fixed now.

New command, clead: If no-lead mode is enabled, you can set custom lead for yourself, but only lower or equal to your ping.
For example if you have 200 ms ping, but you only want to lead 66 ms, then use /clead 66 command in the chat.

Others:
Fixed the bug from 6.1 when admins randomly lost their admin rights at new game (and therefore they might got afk-kicked), also optimized the online-admin management code.
balance_teams command now should work as before.

For Halo PC version:
Added the c4_ag, map_load, map_query and map_download commands, but this doesn't mean you can play Halo CE maps, only that there are some custom maps made for the PC version, so now you can load/download them.

For this reason, the size of the dll is equal to the CE version, so don't confuse them because they are incompatible.

Sapp 6.1:
Players should not be kicked again when they come back after they got AFK kicked (though they had 10 sec to move their camera in 6.0).
Changes in handling online admins and other minor fixes.

As Sapp changed a lot since 5.0 I decided to increase the main version number:
Sapp 6.0:

New features:
Area events: Events raised when a player enter or exit to/from an area on a certain map.
The commands are similar to loc:
area list: Lists all the areas for the current map.
area listall: Lists all the areas.
area add_sphere <name> <x> <y> <z> <r>: Adds a new sphere to the current map. x,y,z are the coordinates of the center of the sphere, r is the radius in world units.
area add_cuboid <name> <a_x> <a_y> <a_z> <b_x> <b_y> <b_z>: Adds a new cuboid to the current map. The cuboid will between the given 'a'-'b' coordinates.
area del <name>: Deletes an area from the current map.
The area information will be stored in the Halo CE\sapp folder in the following format:
map:name:Sphere:x y z:r
and
map:name:Cuboid:ax ay az:bx by bz
Example for Dangercanyon antiglitch:
dangercanyon:antiglitch:Cuboid:-1.00 2.00 -5.00:1.00 -15.00 0.00
The events:
event_aenter: A player enter to an area.
event_aexit: A player leaves an area.
Special argument:
$area: The name of the area where the player enter/exit.
For Dangercanyon antiglitch:
event_aenter $area:antiglitch 'kill $n;say * "No glitching, $name!"'

New commands:
coord <player_expr>: Shows the coordinates of the given players.
timelimit [amount]: Changes the timelimit on the fly, value smaller than 1 means infinitive.
Note that at the [amount] expression, you can use the following operators: [+, -, *, /, :], see naughty commands page for more information.
scorelimit [amount]: Changes the scorelimit on the fly. Works with all gametypes, both FFA and Team games. Note that in special gametypes like KingOfTheHill or OddBall, amount is in minutes.
disable_sj [enabled]: Disables the usage of SightJacker for HAC users like in ScrimMode.
c4_ag [enabled]: C4-antiglitch that works in all maps.
coldsnap_ag is deprecated and removed. Instead, use c4_ag and area events. I will post here the events soon.

New event argument:
$ffa - 1 if it's a FreeForAll game, 0 if it's a team game.

Bug Fixes:
Sapp crashed at loading if there were half-connected players in the server.
maplist command crashed the server in Halo PC version.
disable_all_objects command didn't work for blues if you specified both teams.
afk command now respawns you after <2sec if your respawn timer ended.

Code optimizations:
SappThreadHook is now more precise, alive events, afk kick, ping kick etc. should work better now.
Also removed some old and unnecessary code.
Rewritten my vect3f class, this should reduce CPU usage a bit in anticamp, aimbotscan, etc.

Other:
Sapp now sends a message to every player at load, unload and reload.


Sapp 5.20:


Rewrote whole Sapp mapcycle handling and added an extra feature with you can set the min. and max. amount of players for a mapcycle entry.
mapcycle.txt will be like this:
map:mode:min:max

For example:
bloodgulch:ctf:0:16
hangemhigh:ctf:4:12
ratrace:ctf:0:12
sidewinder:ctf:8:16

First number means the minimum required players to play the map, second is the maximum amount of players that can be in the server in order to run that option, otherwise it will be skipped. However, if no map matches the requirements simply the next one will be executed.

Sapp 5.19:

Bug Fixes:
- \n always printed the name of the 1st player.
- pl and some other commands crashed with only 1 or 2 players in the server.
- Very long server messages made the clients disconnect.
- Performance improvements in command handling, it also reduced the site by ~15 kb.

Sapp 5.18:

- Fixed the bug in 5.17 where pl  and some other commands crashed if there were less than 2 players in the server.
- Rewrote and optimised Team-Balance code.
- "Old-style" message expressions like \n \t etc. now only gets replaced with say command, and not in Sapp's output messages.

Sapp 5.17:

- New player expressions, check "Command expression" article for more information.
- Map downloading now tells you if downloading failed.
- Improved the effectivity of the wait command, also its no-more rounded up to 100ms but using exactly the amount you specified.

Sapp 5.16:

- Suicide, Betray, Kill, Die Events now run after Halo's chat messages as it supposed to be.
- Fixed the bug when at new game Sapp didn't handle the "leaving" players and this caused bugs like it said "You already voted for skip this map." at the following game.

Sapp 5.15:

- Fixed crash in Halo FV version.
- st command now triggers TeamSwitch event too if a player is switched.
- Rewrote Player-Death codecave, now always the correct event will run (Kill, Betray or Suicide), note that event_die is always executed.
For ex. if player A kills B, then a event_kill will be executed for A and an event_die for B, or if player A suicides, then both event_suicide and event_die will be executed for A.

Sapp 5.14:

- Fixed the bug in 5.13 when IPBanning lagged out all players from the server if full_ipban was on (which is not recommended anyway).
- Removed No-Lead compensation from Aimbotscan that only used too much resources without making particular differences.
- Improved code around Event-Kill and Event-Betray.
- TeamSwitch event now only runs if the players switch teams by itself and wont run occasionally anymore at joining.

Sapp 5.13:

- Thread cycle is back to ~120 ticks/sec to improve reg again (custom_sleep 8 is the default value now).
- Fixed a bug when players with invalid name could crash the server or lag players out.
- Other small changes in the code.

Sapp 5.12.1:

- Added feature that prevents admins from banning themself.
- Changed compiler optimisation settings.

Sapp 5.12:

- Admin add command now should work properly again.
- If a server can't access to the logfile because another server is writing it in the same time, sapp will retry it a bit later, instead of stop logging.
- Fixed a possible memory leak in threading code.
- Fixed signature for "Team Change Block" for 1.00 exes.
- Other small changes in the code.

Sapp 5.11:

- Added feature to restore the previous fast thread cycle with the "smaller" pings and better reg:
custom_sleep [value]: Set the amount that the Halo thread Sleeps every cycle, to use the default value set 0 (with the "33 pings"), add custom_sleep 1 to the init for the "lower pings" like before update 5.10.
collect_aliases [enabled] [valid_only]: Now you can specify if you only want to collect aliases for players with valid hash.

- Other optimisations in the core functions, that results lower CPU usage and smaller file again.

- Added sapp_flags to the query string for HAC2.

Sapp 5.10:

- Added backup IPs for connecting to the Global Server, if your server didn't got updated to 5.10 then manual update required, otherwise they won't get auto-updates in the future and won't shown in the online Serverlist.

- Since some players still expected weird bugs, thread cycle is back to the original 30 cycle/second speed, but it's still handled by Sapp, therefore CPU usage will stay low.

New commands:

adminadd_samelevel <value>: The value is 0 by default, if set to 1, admins can add other players as admin with the adminadd command with lower level than them, if value is set to 2, admins can add others as admin with lower or equal level.
admindel_samelevel <value>: The value is 0 by default, if set to 1, admins can delete other players as admin with the admindel command with lower level than them, if value is set to 2, admins can delete others as admin with lower or equal level.

chat_console_echo [enabled]: If enabled, chat messages will shown in the console window.

mtv [enabled]: Multi Team Vehicles: If enabled, players from different teams can use the same vehicle. Note that you have to use HAC2 and enable mtv in client side too for the proper effect.

Others:

$campkills event value is now public, which means any kind of event can use it.

Code optimizations of some core functions which are called from many part, therefore Sapp's CPU usage and size is reduced.


Sapp 5.9:

- Fixed the "desync" bug.

Sapp 5.8.1:

- v1 now changes version to 01.00.04.0607 in the PC version.
- Some other small changes.

I also updated the site, all command should be documented here now. =)

Sapp 5.8:

News:

- From now, SAPP is available for Halo PC too! More over, you don't have to replace the exe anymore, the archive contains a custom strings.dll that handles load/unload and patches the exe everything you need (like ASCII name, Dev mode, etc.). Please report any bugs you found in SAPP to me on Xfire: lgbalazs

Also added a new command to disable interactions with any object for a team.
- disable_all_objects <team> <disable>; team: 0 - both, 1 - red, 2 - blue; disable: 0 - the team can interact with any object (default), 1 - the given team(s) can't interact with any object (weapons, vehicles, etc.).

- Some other small changes that needed for the HPC port.

Sapp 5.7.2:

- gs_ping_fix now works if you have more than 1 local IPs.
- event_tk won't get raised anymore at new game or at rejoin if a player has tk (teamkill/betray) score.

Sapp 5.7.1:

- Improved antiwarp: The distance is now normalised with the moving vector, so speed doesn't affects it anymore. For Ex. if you fell down or get hit by a vehicle you won't get warp scores.
- Server now sends a message to every player if the no lead mode is changed by the admin.

Sapp 5.7:

New command:
antiwarp [warp_num] : Raises an event_warp after the player warped "warp_num" times. Recommended value: 5, 0 means this function is disabled.
Example:
sapp's init.txt:
antiwarp 5
events.txt:
event_warp 'kill $n;say $n "You were killed because you are warping."'

Small CPU optimisation in aimbot-scan.
Other minor changes and fixes.

Sapp 5.6.3:

- Fixed the bug with the ipban and some other commands, also fixed the mapcycle commands when they stuck or executed wrong maps.


Sapp 5.6.1:
- Fixed stability of the global server.
- Minor bug fixes and optimisations.
- whatsnext command is now level -1, mapcycle is level 0.


Sapp 5.6:
New features:
Map loading and map downloading, for Btcc22's suggestion.
The commands:
- maplist: Level 3 command that lists all the available maps.

- map_load <map_name>: Loads a new map from the maps folder, therefore no need for restart the server anymore if you want to install new maps.
Example: map_load coldsnap

- map_query <string>: Query the list of the maps from the server that's available for download and has the "string" in the name.
Example: map_query cold
Returns:
ID  Name
 0  coldaphobia
 1  coldaphobia_2
 2  coldrush
 3  coldsnap
 4  icecold
 5  [h3]cold_v1

- map_download <map_ID>: Downloads and install the map that you choose from the query list. Note that you don't have to use the map_load command for the maps you downloaded, just be patient while it gets downloaded, extracted and installed.
Example: After you executed the map_query cold command, use map_download 3 to download coldsnap.

Also, a special strings.dll is now available on the site. With this dll you don't have to replace the haloceded.exe anymore, because it patches the exe for everything (load/unload command, ascii name, devmode, etc.) + it got the map cache from HAC2.

Special Thanks for Btcc22 for the map loader and map caching code, and for Gijs (elitegameservers.net) for hosting all the ~1000 maps for Sapp and Hac2!

V 5.5
New features:
- disable_object <object_name> [team] : Now you can specify team : 0/unset: both, 1: red, 2: blue.
Ex. disable shotgun for the blue team: disable_object "weapons\shotgun\shotgun" 2
If Sapp mapcycle is running, whatsnext command tells you the next Map and Gametype.
CPU usage of haloceded.exe is reduced to minimal.
Features for HAC2 users:
- HAC can get the mapcylce of server if it's using Sapp mapcycle.
Server Query fixes:
- Fixed the bug when Halo cut the end of the map name after a dot.
- Added the server port.
- Added Sapp version.
- Added next map and next mode (not working if you using basic Halo mapcycle).
This feature will help HAC for pre-downloading the following map when the game ends.

Basically, for supporting HAC users, please change your default Halo mapcyle to Sapp's one, especially if it contains custom maps.
It's some steps only. There is a mapcycle.txt (ANSI encoding) in the gametypes\sapp folder. From your init.txt move the mapcycle options here without the "sv_mapcycle_add" part in the "map:mode" format. Also, put "mapcycle_begin" command (without the sv_) after the load command in your init.txt. And finally, put sapp_mapcycle 1 to Sapp's init.txt.

Example:
Halo format:
init.txt:

...
sv_mapcycle_add bloodgulch ctf
sv_mapcycle_add ratrace slayer
sv_mapcycle_add sidewinder ctf
sv_mapcycle_add carousel slayer

sv_mapcycle_begin
load


Sapp format:
mapcycle.txt:
bloodgulch:ctf
ratrace:slayer
sidewinder:ctf
carousel:slayer


init.txt:
...
load
mapcycle_begin

Sapp's init.txt:
...
sapp_mapcycle 1


Bug fixes:
On single core systems, Halo froze for ~10 sec at new game (Halo threading fail).
map command got ignorant if you mistyped the map/mode name until a new game (lol).
sv_map now should cancel the mapvote too.
Small bug fixes in sapp mapcycle + optimisations.
Some other small changes and bug fixes that I don really remember... ^^

V 5.3

- The bug got fixed when players with high ping (~400ms<) lost connection at the end of the game.
- Code Optimizations in command execution and chat module.
- Antispam Fixed (weren't function really well during the game since 5.0).
- stats function updated, now it remembers all of you kills/assists/deaths of the games since joined, not only the last one. Check /stats =)
- Some Progress to SAPP towards Halo PC. ^^
- Some other minor fixes.

V 5.1.5


- Bug fixed when server crashed if a player got killed by an "event_alive".
- Rare bug fixed when server with no-lead mod could crash if a player changed from a vehicle to a different type of vehicle very fast.
- Improved memory handling in no-lead mod, this should reduce CPU usage.
- Some other minor changes at threads.

V 5.1 No-Lead mode now works with vehicles too

V 5.0 New Hooking engine, argumetns for custom commands and No-Lead mod!

Hooking is now totally rewritten, code is more clear and hooking is faster. This means Sapp is some step closer to port to HPC.

Arguments for custom commands:
Between the command name and the command, you can put arguments starting with the '#' character. Example:
You add to the commands.txt the max #n 'sv_maxplayers #n' line and you execute the max 4 command, sapp will execute the sv_maxplayers 4 command.
Or spawnw #n #weap 'spawn weap "weapons\#weap\#weap" #n; wadd #n' and you execute the spawnw 4 "sniper rifle" it will execute the spawn weap "weapons\sniper rifle\sniper rifle" 4 and the wadd 4 command, and gives a sniper for player 4.
Here I had to note that lately kids using sapp to cheat on scrims. There is a feature to fix this already:
Scrim Mode:
"scrim_mode [enabled]: If enabled, no one can execute any naughty commands.
Server sends a message to every player if this status is changed.
You can also check it's status with the info command."
Ask the admins to turn this function ON with scrim_mode 1 command if it's not enabled. If they try to turn it off during the game, server will alert the players.
If they reject to enable it or change it meanwhile just leave them there cuz they prolly only want to cheat.


No Lead Mode:
This mod is disabled by default, you can enable/disable it with the no_lead [enabled] command, (so just put no_lead 1 to sapp's init.txt to enable it.)
You can check and change the state of leading with the lead command.
If the admins didn't enable no-lead mod, you can't turn it on for yourself, but if they enabled it, everyone can disable this mod for themselves by typing /lead 1 to the chat. Also, you can re-enable it ofc with the /lead 0 command).

 

V 4.5 New network/auto update core, SAPP mapcycle etc.

New Network Core for SAPP

Now Auto Updates will be more native, using Winsock and TCP stream (make sure that your outgoing TCP 2501 port is open).
This network core that I was working on lately will allow me great new functions in the future, like Remote Console and implementation of HAC2 (btcc working on it hard, beta clients will be available in few weeks =).
When I'm writing this article, about 100 Server already updated to 4.5 and connected to the global server. :D

Sapp Mapcycle Commands

mapcycle: Displays the mapcycle items and their ID + indicates the current one.
mapcycle_add <map> <mode> [ID]: Inserts a new element to the mapcycle. If ID is undefined, the new mapcycle item will be added to the end, othervise to 'ID' position, and the following maps will be "slided down".
mapcycle_del [ID]: Deletes the mapcycle item at "ID" position. (You can get the ID with the mapcyle command)
mapcycle_begin: Starts the mapcycle from the first map.
map_next: Runs the next map in the mapcycle.
map_prev: Runs the previous map in the mapcycle.
map_spec <ID>: Runs the mapcycle from the specified ID.

Benefits are that you can edit the mapcycle "on the fly", don't need to restart the server to apply it. Also you can "jump into" any position in the cycle.
The mapcyle is in the My Games\Halo CE\sapp\mapcycle.txt in ANSI format. If you edited this file and want to apply it, simply run the reload command. Format in the file: map:mode, For Example:
bloodgulch:ctf
ratrace:slayer
If you want to use this method, put the mapcycle_begin command after the load command in the init.txt, and sapp_mapcycle 1 to the another init.txt (sapp's) in the ..\My Games\Halo CE\sapp folder.
Of course you still can use the original mapcycle of Halo CE :)

Disabling objects from picking up

Using the object lookup code from Phasor, thx to Oxide.

disabled_objects: Displays the disabled objects and their ID.
disable_object <object_name>: It will deny the usage of the given objects. You can get the object names from the bottom of the "Naughty Commands" page.
enable_object [ID]: Allows the usage of the given object. (ID from disabled_objects).

Scrim Mode

scrim_mode [enabled]: If enabled, no one can execute naughty commands. Server sends a message to every player if this status is changed.
You can also check it's status with the info command.

New event for aimbot scan

event_snap: Runs when a player snaps to another player. Special argument: $score which is the amount of score "earned" by this snap. Also new argument: $botscore, the total aimbot score of the player.

Low CPU usage

low_cpu_usage [enabled]: Reduces the CPU Usage of the dedicated server by 60-80%. It won't affects Pings IF you have a decent CPU.

Server list ping fix:

gs_ping_fix [enabled]: Use this if your server has no ping on the GameSpy server list (usually when you have router). To apply it, you must put this command to the init.txt and restart your server. Also make sure that outgoing TCP 2501 port is open.
The problem is that Halo dedi sends your local IP (like 192.168.1.1) to GS and clients try to ping this IP. If the fix enabled, the Global SAPP Server sends your external IP to the dedicated server, and it will send this IP to GS. =)

Another ping fix

Halo servers doesn't include the ping data of the players (lol), therefore you can't see their pings from out of the server for ex. in Xfire. Now this issue is fixed too.

Changing Sapp's logfile name

log_name [name]: name is without the .log! For ex: log_name "Zombies" will name the log file to Zombies.log

Again, if you find any issues please report it to me ASAP =)

Xfire: lgbalazs

V 4.0: Alias function and Auto Update

I made significant code optimizations in log thread, in loading, and in command and event execution.

Some bug fixes: "mag" command will now sync ammo, so you can spawn with empty human weapons too etc. ("ammo update" function call from Phasor, thanks to Oxide).

Improved the aimbot detection; less false positive snaps at short range, and more sensitivity at long range (thx the help for Sean :). Therefore min. score limit to ban has been reduced to 1000. Despite this, I recommend to don't go under 2000, because laggy server or client, or packet loss still could cause false detections.
Also there are events now if a palyer snapped to another: event_snap, special argument is $score which is the amount of score "earned" with that snap. Note that 1-2 or some snaps with few hundred score doesn't mean that the player is aimbotting! Also added new variable: $botscore, which is the total amount of aimbot-score of the player.

Sapp Mapcycle handling: mapcycle can be edited "on the fly", no need to restart it to apply the new cycle. Also ability to jump to a given mapcycle ID. For further details, read the Mapcycle menu (coming soon lol).

Alias function: You can track what other names used a player in your server, IF he/she has valid CD-Key (so I don't recommend to enable this function in 1.00, since it's just a waste of resources...) To enable it, put the 'collect_aliases 1' command into your init.txt. The command to check the aliases of the player is 'alias <player_expr>'

Auto Update: It checks for new version of SAPP every 15m. I also use this function to count the number of serevrs running on SAPP 4.0+
This function is enabled by default, you can disable it with the 'auto_update 0' command (not recommended).

V 3.4: Advanced Aimbot Detection


Finally I had time and mood to improve aimbot detection, so I kinda rewrote the whole code.
While the first version made only for catch the most obvious botters, this one is supposed to ban everyone who trying to use aimbots.
The aimbot scanning module is now like a real SightJacker which keeps watching all of the players in the same time, and analyze their "snaps".

How it works exactly?

If someone had a "suspicious camera change" it checks if the suspect aims to someone's head after the snap. If yes, the suspect will get snap angle*distance (between the suspect and the target) score. In additional, if there was a wall/object etc. before the target, the score gets multiplied by 2. Same happens, when the snap was right after a kill with a bullet. And finally, AimbotScan calculates the player who might be the target in the "next moment" if the suspect push shift. If after the snap this "expected" player is "in the corsair", scores will multiplied by 2 again.

The command is the same to enable AimbotScan: aimbot_ban <scores> [type] [lenght]
Recommended: aimbot_ban 10000 1 1440 (1 day IP-Ban after 10000 scores)

Although even few thousand score would be enough to say if someone is using an aimbot, the minimum value is 10000 to avoid false detections caused by possible lag. This will might change in the future.
Note: Just because someone's score is not 0, it doesn't means he/she is cheating, pro players can get few hundred score in short-ranged fights with pistol or with very lucky/laggy sniper shots, while real botters usually gains thousand of scores with a snap.
Aimbot Scores still have "cooldown", every player lose 2 score/sec (if he/she has any).

I'm looking forward to your feedbacks on Xfire!

Others: Some bug fixes, and a minor change: at kick/ban/mute etc. when you specify the length, it will be now in minutes instead of seconds..


V 3.3: Important Update

This release contains fix against an exploit when players with name like "$name" could freeze the server.

Also because the increased numbers of DoS attacks against Halo CE servers, SAPP now includes basic DoS protection, which means if the server receives more packet from a client in 1 second than the threshold, SAPP keeps blocking every packet from that IP.
Although these IPs will be in the IPBan-list, with the reason "DOS_ATTACK", they will be also in a separated 'DoS-List' for the fast processing, which means they remain blocked until you restart the server or unoad/load Sapp. You can clear this list manually with the clear_dos_list command.
DoS Protection is ON by default, with the threshold 1024 packet/sec. You can change it with the packet_limit [maxnumber] command, the minimum limit is 256, or you can turn it off with the packet_limit 0 value (not recommended).

V 3.2:

The main improvements are in stability and much more optimized and flexible code.
For example R.O.C.K was up for more than 20 days with this version, before I restarted it.


Important: Since I changed the code to fully widechar-compatible, you'll have to convert every Sapp file to UCS-2 LE format.

First you have to download Notepad++
After you Installed it, open the SAPP files with it, and at the top bar, choose "Encoding->Convert to UCS-2 Little Endian" (last one), then save.
You have to convert every .txt file of SAPP, except the init.txt and the log file (since this one is already in that format).
In additional, you have to add admins who were in the admins.txt again, because their name was converted from UCS-2 LE to ANSI, and in result of the data-loss, it won't work anymore, more over, the password is now stored as a md5-hash.
Basically this means you have to delete the admins.txt and re-add them.
Also, now you can remove the first line "[Name]:[ID]:[Hash]:[Level]:IP List" from the users.txt

Well, thats was the "bad news", the good are the stable and optimized code, and sum other cool features ^^ :

boost <player_expr> : Teleports the given player to the location where he/she looks. Thank You to Skyline for the code and for helping me setting it up in VS2010.

block_tc <enabled> : Blocks players from changing their team.

Updated mapvoting; Sapp now cycling the mapvotes, instead of showing all the 8-12+ in the same time. For ex. if the max_votes are 5, then the players only can vote for the first 5 options, and after the voted game ended, they can choose from the next 5 option, etc.
You can specify the amount of displayed mapvotes / round with the max_votes <number> command.
The default value is 5.

New event arguments:

$gt - The type of the current game (ex: ctf, slayer, etc.)
$reds - # of the players in the red team
$blues - # of the players in the blue team

kill event now has a special argument; $killed; its value can be 1 to 16 which referrers the $n of the killed player.
The more useful thing is that die event has a special argument too; $killer, which can be; -1: player simply "died", 0: "was killed by a vehicle/guardians", etc., and 1 to 16, the $n of the player who killed the current one

Some other smaller changes, I can't remember for all, they are like Sapp now remembers for the 'betray scores' after a player left, so now the n00bs can't evade autoban with rejoining =)

With these some new features, now you can make Zombies mod finally :)

 


v 3.0

From 2.6 to 3.0 I made lot of changes and new functions, I can't list all of them here.

The main changes are in stability, optimizations, bug fixes and new, more flexible event system.

+ Object creation / destruction, vehicle enter, weapon assignment/delete. These commands are from Phasor, credits to Oxide, he made a great job. I ported the functions to CE and made commands for them, which was a lot of work too.
Check the Naughty commands page for more details.

Note that you might have to update your events.txt to be compatible with the new argument system. Check the Event system page for more info.

Added reload command which reloads all SAPP files without unload/load.

Also some other commands like mute (same as textban just based on IP), "adminban" function, which prevents admins from banning another admin with higher level, and some other commands.
The command_t.txt has been changed to locations.txt, you can use these locations for t and spawn command.

Replaced Halo's "Teambalance" function, the new one works correctly, which means it wont let players switch unfairly, if "auto teambalance" is enabled in the current gametype.

Version 1.08 is not supported anymore, since there are no servers and players, so v3 command changed to v2, altough you don't have to put this to your init, since the haloceded.exe's version is 1.09 by default.

Unify exe is not supported either, since it was very unstable. Instead, you can use a small script.
Put this to your commands.txt:
unify 'v1;w8 10;v2;w8 10;unify'
and the unify command to the sapp's init.txt.

Note that your server must have ping on GS list, otherwise this wont work correctly.

v 2.6.0

New features:
camo player_expr [seconds] (0 = forever / till die) : makes the given player(s) invisible. Thx to Oxide for the code =)
adminban [0/1/2] : 0 - admin can kick/ban/ipban another admin (default), 1 - prevents admins from kick/ban/ipban another admin who have higher level, 2 - -"- higher or equal level
text "message": writes a text to the environment output (console/rcon/chat), useful for custom commands for informing the users/admins what happened.
vspec "versionstring": You can specify your own version if you want to run it in diff. v. than 1.00/1.08/1.09
Examples: v1 is the same as vspec 01.00.00.0609 while 1.09 is vspec 01.00.09.0620 aka v3
Change: notgod command changed to ungod

"Fixed": when people (who didn't read the description) used the b (banning) command like "b player reason", it didn't banned the player (cuz the correct usage is "b player time reason", ex: b 4 1d n00b),
but the server still said "xy was banned by the admin..." so they thought there is a backdoor which prevent people from getting banned .
Now if they use it like this the 3rd argument will be the reason (because in the past it was the TIME, and if u use banning like "b 4 asdasd" it wouldn't work)

v 2.5.5

Fix:

A critical bug was fixed in sapp logging.
Some string fixes.

New:

Admin notice: adminnotice [enabled]
If enabled, a message will be displayed to all players if an admin v1 joins or an admin v2 login the game.

 

v 2.5.1

Fix:

A bug is fixed when occasionally cmd scripts locked sapp and Halo thread, therefore server got frozen or crashed.

v 2.5

New:

- New executing engine, now it doesn't "spam" the console, and it again works with the old sapp-patched haloceded.exe (before v1.6), so there is again new exes in the archive, but it's not necessary to replace it.

- New Logging Engine, now it logs everything with wide-characters like halo does, so player names, chat messages will be the same as ingame. I recommend you to archive old sapp.log before starting v2.5+
- Player's team at join, team-switch and chat type (global, team or vehicle) is now also logged.

- scores command's name changed to ctf_scores (usage is the same)
New commands: ts_scores (usage is the same as ctf_scores), ctf_scores_team [team] [score], ts_scores_team [team] [score] : displays/sets the ctf/ts(TeamSlayer) scores of the red/blue or both teams.

- Ping-kick now has cooldown time.

- camp detection (ßeta); anticamp [time(s)] [distance(m)] Raises event_camp <killnumber> 'command' event. For ex. anticamp 30 5 : if the distance between the player's coordinates is less than 5m in the last 30 sec, it will raise event_camp event with the number of the kills he did while he was in this "camping stage". Example events:
event_camp 3 'say $n "$name Please change your position!"'
event_camp 4 'say $n "$name stop camping or you will be kicked!"'
event_camp 5 'say * "Warning! $name will be kicked for camping!"'
event_camp 6 'k $n Camping'

- I finished updating of the custom command's code (wich existed for ages tbh), so some commands were ripped; debug(its useless for u), begin, next, reset, lo3: you can create these if you need them.
You can add custom commands by using the cmd add <name> 'command' [level], or putting the <name> 'command' [level] string to the "..gametypesfolder\sapp\commands.txt" file (if you don't know where is it, use the files command to check it).
If the level is not specified, the command will be lvl 4. Note: If the player's level who execute the custom command is <= than the command level, the command will execute despite it contains higher level commands.
To delete a command, use cmd del [name], to check all custom commands, use cmd list.
Example commands.txt file

Fixes:

- Sometimes switch_team event were raised when a player joined, wrong player-name was logged if the player joined "slowly", or the admin didn't got logged in automatically.
- Occasionally sapp crashed when two admins executed commands in the same time.
- Players now can change back to the previous team if they were changed with st or balance_teams command.

I also made lot of optimizations which cause more stability and faster code.

v 2.3.2

Fixed:

- If sapp couldn't rename the log file at rotation then it felt infi-loop and generated huge log file while the server was still running fine.
- Occasionally console or server messages didn't show up.

v 2.3.1

 

New:

 

battery player_expr amount type : works same way as ammo, you can set the battery of the covenant weapons (in %)

 

mag player_expr amount type : set the loaded bullets in the given weapon(s), works same way as ammo too

 


- Some stability improvements at unload, a bug was fixed when you edited sapp files by your hand (wich you should not to do), sapp was unable to load if you let empty lines in the file.


v 2.3

New:

remove_password - no comment
remove_rcon_password -

 nades <player_expr> [amount] [type] : set the [amount] of nades of the given players, [type]; 0/ungiven= both, 1= frag nades, 2= plasma nades

ammo <player_expr> [amount] [type] : set the amount of the ammo of the given players, type; 0/ungiven= current weapon, 1= primary, 2= secondary, 3= both

ammo_mult <player_expr> [multiplier] [type]  : same as the previous command, just its multiple the current ammo

random_bonus <player_expr> : the given players gets some gift

 

v 2.2

event_start and event_end are now "map events";
event_start hangemhigh 'cheat_jetpack 1'
event_end hangemhigh 'cheat_jetpack 0'
If you don't define a map, then the event will apply for all maps.

sapp_rcon [enabled]
If enabled, only admins can use rcon with they admin name & password or with the default rcon password if their CD key is added.
+ rcon bruteforce protection

secondary cmdstart, 'cmdstart1', default is '/'

w8 command, same as wait just in seconds instead of milliseconds

Change:
You have to add this:
[Name]:[Password]:[Level]
to the begin of the admins.txt file, and this:
[Name]:[ID]:[Hash]:[Level]:IP List
to the begin of the users.txt file

some bug fixes in the haloceded.exe files

 

v 2.1.1
You can change the name and the level of the commands.
Example: setcmd k kick this will change k command to kick
setcmd k 3 this will change k (kick) command's level to level 3

Commands:
tp player_expr player_number : Teleports player(s) to another player =)
Ex: tp me 6, tp 7 1, tp * 2

hp player_expr [health_to_set] : displays / sets the given player(s) health
sh player_expr [shield_to_set] : displays / sets the given player(s) shield

sv_map_prev / prev : jumps to previous played map

iprangeban <name> <IP/mask> [reason]
Example: iprangeban EK 109.127.86.0/24 moron
This will ban all ips from 109.127.86.0 to 109.127.86.255
iprangeban _InViCiBlE_ 117.192.0.0/10 AIMBOT
This will ban all ips from 117.192.0.0 to 117.255.255.255
Mask: /24 for the last number, /16 for the last 2, and /8 for the last 3
You can find the full mask table here.

msg_prefix "prefix" : this will set the prefix of the server messages. Ex.: msg_prefix "** SAPP ** " (default)
You can use the default halo prefix "** SERVER **", by turning this off (msg_prefix "") and enabling say_prefix (say_prefix 1)


Change:
list command changed to inf player_expr
For Ex.: inf * = old list command, inf rt / inf bt shows only the red / blue team, inf 4 displays only info about player 4

New in 1.6.3:

ripped spawn protect because it crashed the server.
improved god -now players really cant get killed except with kill expr
say_prefix [enabled] -This will add ** server ** before say messages.

An Unify Halo CE Patched exe is included in the zip. Read More here.
the following commands: \info \stats \about
AFK (if enabled, player_afk 1), players wont respawn if they type \afk untill they type it again. Note that they still can be kicked by afk-kick.
Now you can temporary Ban/IPban/Textban players, Example:
b 4 2h "betraying" = cd key hash ban player 4 for 2 hours ('x'd = 'x' day, 'x'h = 'x' hour, 'x'm = 'x' minute long ban)
ipban 3 3600 "hogs in tuns" = IP-ban player 3 for 3600 seconds = 1 hour
textban 13 600 = TextBan player 13 for 10 min (600 sec)
Player commands (if enabled, player_commands 1): every playercan run
kdr player_expr: Displays Kill\Death ratio of the given player.
sv_stats: Displays some cool stats about the server =)


Changes: Events, Mapvotes, sapp init and sapp log file are now in that gametypes folder wich u choosed with -path, default is Documents\My Games\Halo CE\sapp
spawn_protect command changed to spawn_protection (lol), also enable_afk to player_afk ...

1.5-1.5.2
the issues with shared cd keys have been fixed, stability problems and disconnect caused by say function have been fixed.
\afk makes you not respawn, so you don't get killed, type it again to spawn.
\stats shows your kill death ratio and time in server.

Copyright © 2024 SAPP: Halo and Halo Custom Edition Server App. All Rights Reserved.
SAPP is sponsored by Elite Game Servers