CS:GO VScript Examples

The following are example VScripts for .
===Find the closest player to a known entity===
// find an entity named "button_01" and store its handle (or null if not found)
button <- Entities.FindByName( null, "button_01" )
	
// find the nearest player within 512 hammer units to the button's origin and store their handle (or null if not found)
player <- Entities.FindByClassnameNearest( "player", button.GetOrigin(), 512 )
=== Functions to distinguish bots and human players ===
To test players other than the activator, give the functions a parameter that replaces activator.
// returns true if the activator is a bot
function IsBot()
{
	if (!activator) return false
	
	local ent = null
	while ( ent = Entities.FindByClassname(ent, "cs_bot") )
	{
		if (ent == activator) return true
	}
	return false
}	
// returns true if the activator is a human player
function IsHuman()
{
	if (!activator) return false
	
	local ent = null
	while ( ent = Entities.FindByClassname(ent, "player") )
	{
		if (ent == activator) return true
	}
	return false
}
// returns true if the activator is a human player or a bot
function IsPlayer()
{
	// both bots and human players have the classname "player" in this case
	return activator && activator.GetClassname() == "player"
}	
// returns true if the activator is a human player or a bot
function IsPlayer()
{
	// both bots and human players have the classname "player" in this case
	return activator && activator.GetClassname() == "player"
}
=== Equip players ===
A slightly modified version from csgo/scripts/vscripts/warmup/warmup_arena.nut.
// equips the specified players with the specified weapon class
function GiveGun( weapon, playerarray )
{
	local equipper = Entities.CreateByClassname( "game_player_equip" )
	// set flags and keyvalues
	equipper.__KeyValueFromInt( "spawnflags", 5 ) // "Use Only" and "Only Strip Same Weapon Type"
	equipper.__KeyValueFromInt( weapon, 0 )
//	equipper.__KeyValueFromInt( "weapon_knife", 0 )
//	equipper.__KeyValueFromInt( "item_kevlar", 0 )
	equipper.ValidateScriptScope()
	foreach (player in playerarray)
	{
		EntFireByHandle( equipper, "Use", "", 0, player, null ) // each player "Use"s the equipper
	}
	
	EntFireByHandle( equipper, "Kill", "", 0.1, null, null ) // equipper is no longer needed, so remove it
}
===Iterating over all hostages===
On hostage scenario maps, it is up to the mapper whether to use or for their hostages. In VScript, using the function to iterate over all hostages requires two loops because both classnames must be searched for using that function. However, no matter how the handle of a hostage was obtained, the following applies: . Using this fact, an iteration over all hostages can be done as seen in the following. In this example, a global function is defined that returns whenever there is a CT carrying a hostage.
::IsAnyHostageBeingCarried <- function()
{
	for (local hostage = Entities.First(); hostage = Entities.Next(hostage); )
	{
		if (hostage.GetClassname() == "hostage_entity")
		{
			if (hostage.IsBeingCarried())
				return true
		}
	}
	return false
}
=== Turn decoys into nukes ===
The following script is a think script, it can be attached to any entity.
The Think function will be executed as long as the entity is alive and has its thinkfunction keyvalue set to "Think".
// This can be found in hammer's sound picker
const EXPLOSION_SOUND = "c4.Explode"
// Called after the entity is spawned
function Precache()
{
	self.PrecacheScriptSound( EXPLOSION_SOUND )
}
// Every 0.1 seconds this function checks for decoy_projectiles in the map
// When found, it checks if the decoy is standing still
// If true create an env_explosion, trigger it and kill the decoy
function Think()
{
	local decoy = null
	while( ( decoy = Entities.FindByClassname( decoy, "decoy_projectile" ) ) != null )
	{		
		if( decoy.GetVelocity().LengthSqr() == 0 )
		{
			local owner = decoy.GetOwner()
			local origin = decoy.GetOrigin()
			local explosion = Entities.CreateByClassname( "env_explosion" )
			explosion.__KeyValueFromInt( "iMagnitude", 2000 )
			explosion.SetOrigin( origin )
			explosion.SetOwner( owner )	
			EntFireByHandle( explosion, "Explode", "", 0.1, owner, owner )
			DispatchParticleEffect( "explosion_c4_500", origin, origin )
			decoy.EmitSound( EXPLOSION_SOUND )
			decoy.Destroy()
		}		
	}
}
=== Create a timer to call a function independently ===
timer <- null
function OnTimer() 
{
	print(".")
}
// Called after the entity is spawned
function OnPostSpawn()
{
	if( timer == null )
	{
		timer = Entities.CreateByClassname( "logic_timer" )
		// set refire time
		timer.__KeyValueFromFloat( "RefireTime", 0.1 )
		timer.ValidateScriptScope()
		local scope = timer.GetScriptScope()
		
		// add a reference to the function
		scope.OnTimer <- OnTimer
		// connect the OnTimer output,
		// every time the timer fires the output, the function is executed
		timer.ConnectOutput( "OnTimer", "OnTimer" )
		// start the timer
		EntFireByHandle( timer, "Enable", "", 0, null, null )
	}
}
==See also==
* logic_script
* VScript
* VScript Fundamentals
* Squirrel
* List of CS:GO Script Functions
==External links==
* Squirrel (programming language) - Wikipedia Article on Squirrel
* Squirrel Reference Manual
Category:Counter-Strike: Global Offensive
Category:VScript
Category:Scripting