Patch Notes


Patch 2.5.0

Released March 27, 2015


  • Added different kill icons for unbounced rails, single bounced rails, and double bounced rails
  • Added airshot detection
    • Airshots show in the console like so: player killed player with weapon (airshot)
    • Airshots are logged to file like so: "player" killed "player" with "weapon" (modifier "airshot")
      • The (modifier "") string only gets added if there actually was an airshot, otherwise the entire parenthetical is absent from the line
  • Added sparks/dust to the feet of rampsliders (cl_rampslidefx cvar for toggling the effects on/off, and cl_rampslidefx_* cvars for controlling how it looks/behaves)
  • Added team-colored trail to flags (cl_flagtrails cvar for toggling it on/off)
  • Allowed bounced rails to collide with their shooter
  • Added hud_weaponselect cvar (briefly shows the weapon select menu whenever switching weapons when hud_fastswitch is enabled; defaulted to enabled)


  • Lowered the hard cap from 180% to 171%
  • Flag touch bounds have been decreased somewhat significantly: touch height is now ~65% of flag height, and touch width is now ~100% of flag width (flag touch bounds used to be larger than the flag itself in both dimensions)
  • Added a middle bhop cap - when you are over it, reduce speed by more. Currently set to 1.55 speed (620 for scout) and it has a lower pcfactor (0.3 rather than 0.65). This means downtrimping is good for one jump and reduces successive conc skim jumps without reducing the hard cap too much
  • Made HH explosive grenades (frag/mirv) work like they do in TFC (HHing a gren now simply adds 1000 speed in the direction that you're currently moving (or 950 speed straight up if you're not moving at all)
  • Capped jump pad + conc horiz and vert speed separately
  • Set jump pad horiz boost to 768 (was 1024 in 2.46)


  • Removed the single shotgun from the hwguy, medic, and pyro (see #82)
  • Removed nailgun from sniper
  • Made the sniper rifle use nails to avoid shared ammo between sniper rifle/autorifle


  • Slimmed down the number of maps included with FF
  • Improved base_shutdown.lua
    • Added built-in support for trigger-based buttons (blue_security_trigger/red_security_trigger)
    • Added built-in support for Lua-defined security shutdown length (SECURITY_LENGTH)
    • Added built-in support for turning on/off lights, brushes, trigger_ff_clips, and trigger_hurts
    • Added some helpful team-oriented trigger definitions in base_teamplay.lua
  • Added a timer on the HUD that reflects how long security is down for on all security maps
  • Reverted all IvD maps that used the time-limited-round-based system to the default IvD system (only switch teams after all caps have been captured)
  • Removed the objective icon on the flag for defenders in IvD/AvD maps (it always points to the cap point that needs to be defended instead)
  • Changed the team names in ff_dm to something more appropriate
  • Removed the map guide menu as it has never been utilized
  • Allowed the speedometer to show while spectating someone


  • Added Spanish translation by VMX and Firefox11
  • Added (incomplete) Russian localization by Gordon
  • Added Portuguese (BR) translation by Gemini Saga
  • Defaulted hud_fastswitch to 1
  • Made 0 prematch the default when using ff_restartround without a parameter (ff_setprematch is better for cases where you just want to add prematch)
  • Added hud_fastswitch and hud_weaponselect to the Fortress Options "HUD" section
  • Reverted back to the 2.4 menu background because it was pretty cool
  • Removed the map guide menu and make the Flythrough button go directly to the flythrough
  • Improved HUD font: add Latin-1 Supplement and other missing chars (adds things like custom accented chars, #, &, $, ~, etc)
  • Optimised Lua HUD network messages (send a number ID over the network rather than a string)


  • Fixed spectators not getting their kills/deaths/fortpoints reset on restart round
  • Fixed getting a frag added when using the 'spectate' console command (it used to be to compensate for the -1 frag from suiciding)
  • Fixed grenades disappearing after falling too far
  • Fixed flags getting stuck in ceilings
  • Fixed ff_training not showing map loading info when launched from the main menu
  • Fixed ff_restartround resetting twice when called with 0 prematch time
  • Fixed unicode character support in VGUI/HUD elements
  • Fixed materials/ff/ff08_sign_up_green material using the yellow texture instead of the green one
  • Fixed the glass material in ff_dm
  • Fixed conc speed being limited for too long after using a jump pad (#80)
  • Fixed Lua HUD timers' seconds getting truncated in the wrong direction when counting down


  • Exposed all safe default Lua library functions (newly exposed packages: package, debug, os)
  • Added lua_dostring server command that will attempt to run the given string in the global Lua environment
  • Made Lua's 'print' function redirect to the console
  • Made Lua's 'require' look in ModDir/maps/includes, ModDir/maps/ and ModDir/ when resolving modules
  • Converted IncludeScript into an alias of require
  • Removed arbitrary restriction on loading script files after the initial load sequence
  • Added tostring support for CBaseEntity, CFFPlayer, CTeam, and Color userdata
  • Removed luabind's 'class' implementation because it seems to be broken
  • Added Luabind's class_info function (see
  • Fixed execution errors not being caught and failing silently
  • Fixed AT.kForceThrowItems and AT.kForceDropItems not doing what they say
  • Fixed entity:SetFriction() not working on players
  • Fixed typo in CF.kInfoScripts (was CF.kInfoScipts) (CF.kInfoScipts will remain for backwards compatibility)
  • Added buildable_killed(buildable, damageinfo) callback
  • Added player_onuse(player) callback
  • Added support for separate collision and touch bounds for info_ff_scripts. The sizes are now controlled by Lua functions:
    • entity_name:gettouchsizes( mins, maxs ) passes min and max vectors by reference for the function to alter in place
    • entity_name:getphysicssizes( mins, maxs ) passes min and max vectors by reference for the function to alter in place
    • entity_name:getbloatsize() expects a float return value, uses the value to inflate the touch bounding box (default bloat is 12)
  • Added Lua-spawned trails on entities, coloured by team
    • Functions added:
      • entity:StartTrail(int teamid)
      • entity:StartTrail(int teamid, float start_width, float end_width, float lifetime)
      • entity:StopTrail()
  • Added global function GetGameDescription
  • Added player functions GetFortPoints, GetFrags, GetDeaths
  • Added player:SetDisguise(int teamId, int classId, bool isInstant)
  • Added player:IsInAir(unitsAboveGround) overload (checks if the player is the specified number of units above the ground)
  • Added player:IsFlashlightOn()
  • Added player:ResetDisguise()
  • Added player:AddHealth(healAmount, allowOverheal) overload
  • Renamed DisplayMessage to SendHintToPlayer and add SendHintToTeam/SendHintToAll functions
  • Added global function GetEntitiesByName(entname) that returns a Lua table containing the matching entities
  • Added global GetPlayers function (returns a table (array) of all players on the server)
  • Added IsJumpPad/CastToJumpPad
  • Added IsEntity
  • Added player functions to get the player's buildables (or nil if they're not built):
    • player:GetSentryGun()
    • player:GetDispenser()
    • player:GetDetpack()
    • player:GetJumpPad()
  • Majorly improved Lua's ability to interact with sentryguns
    • sg:SetLevel(int level) // sets the level (does not play upgrade sounds)
    • sg:Upgrade() // upgrades to the next level
    • sg:Repair(int cells) // adds health based on the number of cells
    • sg:AddAmmo(int shells, int rockets) // adds ammo
    • sg:RocketPosition() // returns the Vector position of where rockets are fired from
    • sg:MuzzlePosition() // returns the Vector position of where bullets are fired from
    • sg:GetRockets() // number of rockets the SG has
    • sg:GetShells() // number of shells the SG has
    • sg:GetHealth() // amount of health the SG has
    • sg:SetRockets(int rockets)
    • sg:SetShells(int shells)
    • sg:SetHealth(int health)
    • sg:GetMaxRockets()
    • sg:GetMaxShells()
    • sg:GetMaxHealth()
    • sg:SetFocusPoint(Vector point) // sets where the SG wants to look
    • sg:GetEnemy() // gets the target of the SG (CBaseEntity)
    • sg:SetEnemy(CBaseEntity enemy)
    • sg:GetVecAiming() // gets the direction vector of the SG's current aim direction
    • sg:GetVecGoal() // gets the direction vector of the SG's goal aim direction
    • sg:Shoot() // makes the SG shoot one shell
    • sg:ShootRocket() // makes the SG shoot one rocket
  • Added IsProjectile/CastToProjectile functions
  • Added IsInfoScript function
  • Added IsBuildable/CastToBuildable functions
  • Added function GetEntitiesInSphere(Vector center, float radius, bool ignore_walls)
  • Added collection filter flag CF.kJumpPad
  • Exposed gEntList as the global variable GlobalEntityList
    • Usage:
      • GlobalEntityList:FirstEntity() // get the first CBaseEntity in the GlobalEntityList
      • GlobalEntityList:NextEntity(CBaseEntity current_entity) // get the next CBaseEntity in the list, after current_entity
      • GlobalEntityList:NumEntities() // get the total number of entities
      • Iteratable with both pairs and ipairs (for ent_id, entity in ipairs(GlobalEntityList) do print(ent_id, entity) end). The iteration order is arbitrary with both functions