Left 4 Dead 2/Scripting/Script Functions/AddThinkToEnt: Difference between revisions

From Valve Developer Community
Jump to navigation Jump to search
(AddThinkToEnt's page! With code samples too! Images coming later)
 
m (Images; they don't appear to work properly yet, gotta wait for mediaiwki to do its daily refresh)
Line 23: Line 23:
== Code Samples ==
== Code Samples ==
=== Fastest Rethink Rate ===
=== Fastest Rethink Rate ===
[[File:L4D2ScriptFunctions_AddThinkToEnt-FastestRethinkRate.PNG|thumb|right|text-top|300x400px]]
When ran, the script will use [[List_of_L4D2_Script_Functions/ClientPrint|ClientPrint]] and constantly fill the chat with messages about how long the game has been running as fast as it can. When it sends the messages 30 times, the entity will then kill itself, stopping it from thinking again.
When ran, the script will use [[List_of_L4D2_Script_Functions/ClientPrint|ClientPrint]] and constantly fill the chat with messages about how long the game has been running as fast as it can. When it sends the messages 30 times, the entity will then kill itself, stopping it from thinking again.


Line 51: Line 52:
</source>}}
</source>}}
=== Survivor Health Decay ===
=== Survivor Health Decay ===
[[File:L4D2ScriptFunctions_AddThinkToEnt-SurvivorHealthDecay.PNG|thumb|right|text-top|300x400px]]
This script applies a slow think function onto all players, which will then slowly decay their normal health, and turn it into temporary health.
This script applies a slow think function onto all players, which will then slowly decay their normal health, and turn it into temporary health.
{{ExpandBox|
{{ExpandBox|

Revision as of 11:20, 23 April 2021

AddThinkToEnt()

Turns a function of an entity's script into a think function, which is a function that constantly reruns again and again. By default, think functions attempt to run every 0.1 seconds, though the think function can configure its rethink rate by simplying returning a number. There can only be one think function for each entity at a time, so you can't chain think functions; You can however passnullas an argument under funcname to stop this entity from thinking.

See this sub-section of the Entity Scripts page to know more about think functions.

Parameters

void AddThinkToEnt(CBaseEntity entity,string invTable)

Type Name Description
CBaseEntity entity Target entity to be applied a think function.
string funcname Given the string, find the function of the same name. Passnullto remove it.

Code Samples

Fastest Rethink Rate

When ran, the script will use ClientPrint and constantly fill the chat with messages about how long the game has been running as fast as it can. When it sends the messages 30 times, the entity will then kill itself, stopping it from thinking again.

Since Left 4 Dead 2 runs on 30 ticks by default, think functions can never run faster than 0.03333... seconds. See this sub-section of the Entity Scripts page to know more about think functions.


local timethinker = SpawnEntityFromTable("info_target", { targetname = "timethinker" } )
if( timethinker.ValidateScriptScope() )
{
	const MAX_PRINT_TIMES = 30
	timethinker.GetScriptScope()["PrintCount"] <- 0
	timethinker.GetScriptScope()["Think"] <- function()
	{
		if( timethinker.GetScriptScope()["PrintCount"] < MAX_PRINT_TIMES )
		{
			ClientPrint(null, DirectorScript.HUD_PRINTTALK, "\x04"+"Current Time: "+"\x05"+Time().tostring())
			timethinker.GetScriptScope()["PrintCount"]++
			return 0.01
		}
		else
		{
			ClientPrint(null, DirectorScript.HUD_PRINTTALK, "\x03"+"We printed enough times already.")
			self.Kill()
		}
	}
	AddThinkToEnt(timethinker, "Think")
}

Survivor Health Decay

This script applies a slow think function onto all players, which will then slowly decay their normal health, and turn it into temporary health.


const HEALTH_DECAY_TIME = 2
const HEALTH_DECAY_BUFFERCOUNT = 3
local player = null
while( player = Entities.FindByClassname(player,"player") )
{
	// Team 4 is the L4D1 Passing Survivors; they're invincible!
	if( player.IsSurvivor() && NetProps.GetPropInt(player, "m_iTeamNum") != 4 )
	{
		if( player.ValidateScriptScope() )
		{
			local player_entityscript = player.GetScriptScope()
			player_entityscript["HealthDecayBufferCount"] <- HEALTH_DECAY_BUFFERCOUNT
			player_entityscript["HealthDecay"] <- function()
			{
				if( player_entityscript["HealthDecayBufferCount"] < 0 )
				{
					// Bots lose the think function when they die, anyways
					if( !self.IsIncapacitated() && !self.IsDead() && !self.IsHangingFromLedge() )
					{
						if( self.GetHealth() > 1 )
						{
							self.SetHealth( self.GetHealth()-1 )
							self.SetHealthBuffer( self.GetHealthBuffer()+1 )
							printl(GetCharacterDisplayName(self)+" is decaying health!")
						}
						else
							printl(GetCharacterDisplayName(self)+" isn't able to decay health anymore.")
					}
					else
						printl(GetCharacterDisplayName(self)+" is currently not allowed to decay health.")
				}
				else
				{
					player_entityscript["HealthDecayBufferCount"] -= 1
					printl(GetCharacterDisplayName(self)+" is in health decay buffer")
				}
				return HEALTH_DECAY_TIME
			}
		}
	}
	AddThinkToEnt(player, "HealthDecay")
	printl("Applied health decaying to "+player)
}