Lua:Entity typing
Lua is a dynamically typed language--this means that a variable can hold any type of data at any time. C objects, such as those used in Fortress Forever, are accessed as blocks of raw data. Because altering these objects incorrectly can cause the game to crash, It's important that the Lua system correctly knows what type of class it is dealing with. FF Object TypesCBaseEntityThis is the basic type from which all other entities are derived. Consequently there's not a lot you can do with it--see Category:Entity_functions. When naming an object of this type, it's best to use the word "entity" to prevent confusion. The following commands will return a CBaseEntity:
InfoScriptAn InfoScript is created by using the info_ff_script:new() command in lua, and placing an info_ff_script in a map. This is usually a game item such as a flag, ball, or supply pack, The following commands will return an InfoScript:
TriggerScriptThis is similar to InfoScript, but it's brush-based. Cap points and nobuild zones are Trigger scripts. The following commands will return a TriggerScript:
CFFPlayerThis refers to any client on the server. See Category:Player_functions For a list of what you can do with CFFPlayer. The following commands will return a CFFPlayer:
CFFTeamThis refers to one of six teams--"Unassigned" and Spectators, in addition to Blue, Red, Yellow, and Green. See Category:Team_functions For a list of what you can do with CFFTeam. The following commands will return a CFFTeam:
CFFBuildableObjectObjects that the player can place or build. Includes dispensers, sentry guns, mancannons, and detpacks. See Category:Buildable_functions. CFFGrenadeBaseRefers to thrown grenades
CTakeDamageInfoDamageinfo is an object that's passed along whenever a player is damaged or dies. By intercepting this object, you can detect events in the game, or change the outcome of those events. Damageinfo can be accessed from within the callbacks player_ondamage and player_killed. See Category:Damageinfo_functions. Entity CheckingOften in a lua script an entity will be passed to the script as a CBaseEntity. To gain access to more specific functions, we must cast the variable to a more specific type. But before casting to a more specific type of object, it's usually necessary to verify that the object exists, and that it's the kind of object we expect. Failing to do so can cause the script to fail and the game to crash. If these functions return true, it is safe to cast to that type of object.
Casting CommandsA casting function accepts a CBaseEntity and returns the requested type of object, which you can assign to a new variable.
Example--This callback runs when something explodes inside the trigger name detpack_trigger. function detpack_trigger:onexplode( trigger_entity ) --We want to know if this mysterious exploding CBaseEntity is a detpack. If not we can skip the rest. if IsDetpack( trigger_entity ) then local detpack = CastToDetpack( trigger_entity ) --now that we have a detpack object, we can ask it what team it belongs to. if detpack:GetTeamId() == attackers then --This triggers a logic_relay in the map, which opens the hole and can trigger any other effect. OutputEvent( self.prefix .. "_detpack_relay", "Trigger" ) end end --This line tells all grenades, etc. that it's still OK to explode. return EVENT_ALLOWED end |