Difference between revisions of "Lua:Entity typing"

From Fortress Forever Wiki
Jump to navigationJump to search
(New page: 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 stored as blocks of raw data. ...)
 
Line 1: Line 1:
 +
{{Infobox manual/Header}}
 
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 stored as blocks of raw data. Lua can only access this data through functions that are made available by the API.
 
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 stored as blocks of raw data. Lua can only access this data through functions that are made available by the API.
  
Often in a lua script an entity will be passed to the script as a CBaseEntity. This is a basic type of object used in the SDK, from which other types are derived. To gain access to more specific functions, we must ''cast'' the variable to a more specific type.  
+
==FF Object Types==
 +
===BaseEntity===
 +
This is the basic type from which all other entities are derived. Consequently there's not much you can do with it. When naming a variable of this type, it's best to use the word "entity" to prevent confusion.
 +
 
 +
The following commands will return a CBaseEntity:
 +
*[[Lua:GetEntity|GetEntity]]( int ) Every entity in the game has a unique ID number. Use the [[Lua:GetId|GetId]]() function to access this number for a particular entity.
 +
*[[Lua:GetEntityByName|GetEntityByName]]( String )
 +
===InfoScript===
 +
An InfoScript is created by using the [[Lua:info_ff_script | 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:
 +
*[[Lua:GetInfoScriptById|GetInfoScriptById]]( int )
 +
*[[Lua:GetInfoScriptByName|GetInfoScriptByName]]( String )
 +
 
 +
===TriggerScript===
 +
This is similar to InfoScript, but it's brush-based. Cap points and nobuild zones are Trigger scripts.
 +
 
 +
The following commands will return a TriggerScript:
 +
*[[Lua:GetTriggerScriptByName|GetTriggerScriptByName]]( String )
 +
 
 +
===CFFPlayer===
 +
This 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:
 +
*[[Lua:GetPlayer|GetPlayer]]( entity ) --This would appear to do the same thing as CastToPlayer (see below). Use that instead.
 +
*[[Lua:GetPlayerByID|GetPlayerByID]]( int )
 +
 
 +
===CFFTeam===
 +
This 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:
 +
*[[Lua:GetPlayer|GetTeam]]( teamId ) This returns a CFFTeam object when given a team number. See [[Lua:Flags#Team]].
 +
===CFFBuildableObject===
 +
===CFFDispenser===
 +
===CFFSentryGun===
 +
===CFFGrenadeBase===
 +
===CTakeDamageInfo===
  
 
==Entity Checking==
 
==Entity Checking==
Before casting to a more specific type of object, it's usually necessary to verify that the object exists, and is 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.
+
Often in a lua script an entity will be passed to the script as a CBaseEntity. This is a basic type of object used in the SDK, from which other types are derived. To gain access to more specific functions, we must ''cast'' the variable to a more specific type.
 +
 
 +
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.
  
 
These are pretty self-explanatory.
 
These are pretty self-explanatory.
Line 15: Line 53:
  
 
==Casting Commands==
 
==Casting Commands==
A casting function returns the requested type of object, which you can assign to a new variable.
+
A casting function accepts a CBaseEntity and returns the requested type of object, which you can assign to a new variable.
 
*[[Lua:CastToBeam|CastToBeam]]( ent_id ) tries to cast the entity to a beam (to see if whatever triggered the event was a laser beam, a la SD2). If it fails, it returns null.
 
*[[Lua:CastToBeam|CastToBeam]]( ent_id ) tries to cast the entity to a beam (to see if whatever triggered the event was a laser beam, a la SD2). If it fails, it returns null.
 
*[[Lua:CastToPlayer|CastToPlayer]]( ent_id ) used to cast the passed in entity to a player, often used for touch commands.
 
*[[Lua:CastToPlayer|CastToPlayer]]( ent_id ) used to cast the passed in entity to a player, often used for touch commands.
Line 43: Line 81:
  
 
[[Category:Lua]]
 
[[Category:Lua]]
 +
{{Infobox manual/Footer}}

Revision as of 19:03, 26 June 2009


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 stored as blocks of raw data. Lua can only access this data through functions that are made available by the API.

FF Object Types

BaseEntity

This is the basic type from which all other entities are derived. Consequently there's not much you can do with it. When naming a variable of this type, it's best to use the word "entity" to prevent confusion.

The following commands will return a CBaseEntity:

  • GetEntity( int ) Every entity in the game has a unique ID number. Use the GetId() function to access this number for a particular entity.
  • GetEntityByName( String )

InfoScript

An 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:

TriggerScript

This is similar to InfoScript, but it's brush-based. Cap points and nobuild zones are Trigger scripts.

The following commands will return a TriggerScript:

CFFPlayer

This 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:

  • GetPlayer( entity ) --This would appear to do the same thing as CastToPlayer (see below). Use that instead.
  • GetPlayerByID( int )

CFFTeam

This 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:

CFFBuildableObject

CFFDispenser

CFFSentryGun

CFFGrenadeBase

CTakeDamageInfo

Entity Checking

Often in a lua script an entity will be passed to the script as a CBaseEntity. This is a basic type of object used in the SDK, from which other types are derived. To gain access to more specific functions, we must cast the variable to a more specific type.

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.

These are pretty self-explanatory.

Casting Commands

A 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