Difference between revisions of "CSGO Vscript Examples"

From Valve Developer Community
Jump to: navigation, search
m (Turn decoys into nukes)
 
(One intermediate revision by one other user not shown)
Line 6: Line 6:
 
===Find the closest player to a known entity===
 
===Find the closest player to a known entity===
  
<source lang=cpp>buttonReference <- Entities.FindByName( null, "button_01" ); // find the in-game entity "button_01" and store its targetname
+
<source lang=cpp>button <- Entities.FindByName( null, "button_01" ) // find the in-game entity "button_01" and store its handle
 
 
player <- Entities.FindByClassnameNearest( "player", buttonReference.GetOrigin(), 512 ); // find the nearest player within 512 hammer units to the button's origin and create a variable.
+
player <- Entities.FindByClassnameNearest( "player", button.GetOrigin(), 512 ) // find the nearest player within 512 hammer units to the button's origin and store their handle.
 
</source>
 
</source>
  
===Turn Decoys into Nukes===
+
=== Turn decoys into nukes ===
  
<source lang=cpp>//The following script needs to be attached to something like a logic_script,
+
<source lang=cpp>// The following script is a think script, it can be attached to any entity.
//but any other entity would work as the script will function regardless,
+
// The Think function will be executed
//as long as the entity is alive and the think function is set to Think()
+
// as long as the entity is alive and has its thinkfunction set to Think
  
EXPLOSION_SOUND <- "c4.Explode"; //This can be found in hammer's sound picker
+
// This can be found in hammer's sound picker
 +
const EXPLOSION_SOUND = "c4.Explode"
  
function Precache() //If this is defined it runs automatically when the script is created
+
// Called after the entity is spawned
 +
function Precache()
 
{
 
{
self.PrecacheScriptSound( EXPLOSION_SOUND );
+
self.PrecacheScriptSound( EXPLOSION_SOUND )
 
}
 
}
  
//Every 0.1 seconds this checks if any decoy_projectiles exist on the map
+
// Every 0.1 seconds this function checks for decoy_projectiles in the map
//When found it compares the velocity of the projectile with a 0,0,0 vector
+
// When found, it checks if the decoy is standing still
//If true the decoy stopped moving so we can run the rest of the script.
+
// If true create an env_explosion, trigger it and kill the decoy
//An env_explosion is created and configured, it's moved to the decoy's
 
//position and then triggered. The decoy is then killed.
 
  
 
function Think()
 
function Think()
 
{
 
{
ent <- null;
+
local decoy = null
while ((ent = Entities.FindByClassname(ent, "decoy_projectile")) != null)
+
while( ( decoy = Entities.FindByClassname( decoy, "decoy_projectile" ) ) != null )
 
{
 
{
if(ent.GetVelocity().Length() == Vector(0,0,0).Length())
+
if( decoy.GetVelocity().LengthSqr() == 0 )
{
+
{
owner <- ent.GetOwner();
+
local owner = decoy.GetOwner()
origin <- ent.GetOrigin();
+
local origin = decoy.GetOrigin()
+
 
exp <- Entities.CreateByClassname("env_explosion");
+
local explosion = Entities.CreateByClassname( "env_explosion" )
exp.__KeyValueFromInt("iMagnitude", 2000);
+
explosion.__KeyValueFromInt( "iMagnitude", 2000 )
+
explosion.SetOrigin( origin )
ent.EmitSound(EXPLOSION_SOUND);
+
explosion.SetOwner( owner )
+
 
exp.SetOrigin(origin);
+
EntFireByHandle( explosion, "Explode", "", 0.1, owner, owner )
exp.SetOwner(owner);
+
DispatchParticleEffect( "explosion_c4_500", origin, origin )
+
 
EntFireByHandle(exp, "Explode", "", 0.1, owner,owner);
+
decoy.EmitSound( EXPLOSION_SOUND )
ent.Destroy();
+
decoy.Destroy()
DispatchParticleEffect("explosion_c4_500", origin, origin);
 
 
}
 
}
 
}
 
}
 
}</source>
 
}</source>
  
===Create a Timer to Fire Off an Assigned Think Function Independently===
+
=== Create a timer to call a function independently ===
  
 
<source lang=cpp>
 
<source lang=cpp>
thinkTimer <- null;
+
timer <- null
  
//name <- function() has to be used here instead of function Think()
+
function OnTimer()  
//when making a function to put into a different scope as a variable.
 
TimerThink <- function()  
 
 
{
 
{
//put your think function here
+
print(".")
//since this will be used the timer's scope self will be the timer handle.
 
//imagine as if this function is in a separate script that's attached to the timer.
 
 
print("Tick - ");
 
 
}
 
}
  
 +
// Called after the entity is spawned
 
function OnPostSpawn()
 
function OnPostSpawn()
 
{
 
{
if(thinkTimer == null)
+
if( timer == null )
 
{
 
{
thinkTimer = Entities.CreateByClassname("logic_timer"); //create timer
+
timer = Entities.CreateByClassname( "logic_timer" )
thinkTimer.ValidateScriptScope(); //ensure it's scope is created
 
local timerScope = thinkTimer.GetScriptScope(); //get the scope
 
 
timerScope.Think <- TimerThink; //function Think in the timer scope is now a copy of TimerThink from this script scope
 
EntFireByHandle(thinkTimer, "AddOutput", "OnTimer !self:RunScriptCode:Think():0:-1", 0, null, null);
 
//ent_fire convention you can use in console or in hammer
 
//ent_fire name Addoutput "OutputName Target:Input:Delay:RepeatTimes"
 
 
thinkTimer.__KeyValueFromFloat("RefireTime", 0.1); //set the frequency of the timer. You get RefireTime when disabling smartedit in hammer.
 
EntFireByHandle(thinkTimer, "Enable", "", 0, null, null); //finally, start the timer
 
}
 
}
 
  
</source>
+
// set refire time
 +
timer.__KeyValueFromFloat( "RefireTime", 0.1 )
  
===Attach a Think Function to an Entity at Runtime Using a Timer===
+
timer.ValidateScriptScope()
 +
local scope = timer.GetScriptScope()
 +
 +
// add a reference to the function
 +
scope.OnTimer <- OnTimer
  
<source lang=cpp>
+
// connect the OnTimer output,
thinkTimer <- null;
+
// every time the timer fires the output, the function is executed
 +
timer.ConnectOutput( "OnTimer", "OnTimer" )
  
function OnPostSpawn()
+
// start the timer
{
+
EntFireByHandle( timer, "Enable", "", 0, null, null )
//Creates the timer and sets it up to run the function Think in this script.
 
if(thinkTimer == null)
 
{
 
thinkTimer = Entities.CreateByClassname("logic_timer"); //create timer
 
thinkTimer.ValidateScriptScope(); //ensure it's scope is created
 
local timerScope = thinkTimer.GetScriptScope(); //get the scope
 
 
timerScope.mainScriptScope <- self.GetScriptScope(); //save the scope of this script to a variable in timer's scope
 
timerScope.DoThink <- function() { mainScriptScope.Think() }; //create a DoThink function in the timer's scope to call the Think in this script
 
 
thinkTimer.ConnectOutput("OnTimer", "DoThink"); //Run DoThink on every timer tick
 
 
thinkTimer.__KeyValueFromFloat("RefireTime", 0.1); //set the frequency of the timer. You get RefireTime when disabling smartedit in hammer.
 
EntFireByHandle(thinkTimer, "Enable", "", 0, null, null); //finally, start the timer
 
 
}
 
}
 
}
 
}
  
//Think function the timer will run
 
function Think()
 
{
 
print("Tick - ");
 
}
 
 
</source>
 
</source>
 
{{todo}}
 
  
 
==See also==
 
==See also==
Line 131: Line 98:
 
==External links==
 
==External links==
 
* [http://en.wikipedia.org/wiki/Squirrel_(programming_language) Squirrel (programming language)] - Wikipedia Article on Squirrel
 
* [http://en.wikipedia.org/wiki/Squirrel_(programming_language) Squirrel (programming language)] - Wikipedia Article on Squirrel
* {{sq}}[http://squirrel-lang.org/ Squirrel: The Programming Language - Documentation and Sample Code]
+
* {{sq}}[http://www.squirrel-lang.org/doc/squirrel2.html Squirrel Reference Manual]
 
[[Category:Counter-Strike:_Global_Offensive]]
 
[[Category:Counter-Strike:_Global_Offensive]]
 
[[Category:Scripting]]
 
[[Category:Scripting]]

Latest revision as of 19:50, 3 May 2020

Русский

<Counter-Strike: Global Offensive> The following are example vscripts for Counter-Strike: Global Offensive.

Find the closest player to a known entity

button <- Entities.FindByName( null, "button_01" ) // find the in-game entity "button_01" and store its handle
	
player <- Entities.FindByClassnameNearest( "player", button.GetOrigin(), 512 ) // find the nearest player within 512 hammer units to the button's origin and store their handle.

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

External links