Team Fortress 2

Team Fortress 2

Not enough ratings
VScript guia en español
By H-V-S-N
Basado en
https://wiki.teamfortress.com/wiki/VScript

Luego la completare con mas detalles y no quede incompleto
   
Award
Favorite
Favorited
Unfavorite
¿que es el Vscript?
es una máquina virtual para scripts utilizada en algunos juegos con Source Engine, que permite a los desarrolladores y creadores de mapas escribir e incrustar scripts personalizados que interactúan con el mundo del juego y sus entidades. VScript se implementó en Team Fortress 2 en el parche del 1 de diciembre de 2022 y se ha utilizado en varios mapas desde entonces.
¿como ponerlo?
en la carpeta
csgo/scripts/vsripts es donde se guardan los códigos en formato ".nut"

debes usar el visual studio y ciertos complementos para programar
VScripts on the VDC: https://developer.valvesoftware.com/w...

Visual Studio Code: https://code.visualstudio.com/
VSC Extensions:
Electric Imp Squirrel: https://marketplace.visualstudio.com/...
Squirrel Language Linter: https://marketplace.visualstudio.com/...
VSCRIPT Snippets: https://marketplace.visualstudio.com/...

base por "TopHATTwaffle"
https://www.dropbox.com/sh/d29ooepf2v8luoq/AAAWOFKOz0HvcXZ1oiC3VFToa?dl=0

ahora con la entidad "Logic_script" en valve hammer deberías elegir el archivo en formato ".nut"
en donde dice "Entity Scripts" y como a todas las entidades que se deben activar con algo, ponle un nombre para identificarlo.

ahora con un boton o cualquier activador le pones en las entradas "RunScriptFile"
y luego pones el comando del archivo que quieres activar.

ejemplos de cosas que se pueden lograr
Comandos de ejemplo
Iterar a través de entidades
Con awhileloop y una función Entities.FindByClassname(), puedes iterar a través de todas las entidades de un nombre de clase coincidente, basándote en tus argumentos.

El primer parámetro de Entities.FindByClassname() se llama 'previous' y acepta un manejador de script (si una entidad hereda 'CBaseEntity' específicamente), que verifica si la entidad coincidente que encuentra tiene un índice de entidad que sea mayor que el actual en el argumento 'previous'. Si resulta que no, entonces se ignora.

local entity = null while (entity = Entities.FindByClassname(entity, "prop_physics")) { printl(entity) }

Alternativamente, los bucles de iteración de entidad también pueden escribirse de forma idéntica pero más compacta, como se muestra aquí:

for (local entity; entity = Entities.FindByClassname(entity, "prop_physics");) { printl(entity) }

Iterar a través de jugadores
Puede ser útil iterar sólo a través de los jugadores. Sin embargo, hacer esto con Entities.FindByClassname() es ineficiente ya que necesita buscar en cada entidad. Una peculiaridad puede ser utilizada para iterar eficientemente a través de los jugadores. Cada entidad en red tiene un «índice de entidad» asociado, que va de 0 a MAX_EDICTS. Normalmente estos son impredecibles, sin embargo hay 2 grupos de entidades que tienen índices de entidad reservados: worldspawn y jugadores. Worldspawn siempre está reservado en el índice de entidad 0, y los jugadores están reservados desde el índice de entidad 1 hasta maxplayers + 1. Usando este hecho, los jugadores pueden ser simplemente iterados como se muestra a continuación:

Nota:
La antigua forma de iterar jugadores era usando Constants.FServers.MAX_PLAYERS. Esto ya no se recomienda. En su lugar utilice MaxClients().tointeger() como se muestra a continuación (sólo necesita ser definido una vez en cualquier archivo). MaxClients() sólo itera el límite de jugadores establecido en el servidor en lugar de la cantidad máxima posible, lo cual es más eficiente, especialmente ahora que soporta 100 jugadores, ¡pero la mayoría de los servidores sólo tendrán 24/32!

::MaxPlayers <- MaxClients().tointeger(); for (local i = 1; i <= MaxPlayers ; i++) { local player = PlayerInstanceFromIndex(i) if (player == null) continue printl(player) }

Iteración a través de las armas del jugador
El número máximo de armas que un jugador puede tener en condiciones normales de juego es de 8. (Como ingeniero: primaria, secundaria, cuerpo a cuerpo, PDA de construcción, PDA de destrucción, la caja de herramientas, el gancho de agarre y la «pistola de pasatiempo» cuando se tiene la passtime_ball).

::MAX_WEAPONS <- 8; for (local i = 0; i < MAX_WEAPONS; i++) { local weapon = NetProps.GetPropEntityArray(player, "m_hMyWeapons", i); if (weapon == null) continue; printl(weapon); }

Iterando a través de los cosméticos del jugadorIterando a través de los cosméticos del jugador
Los cosméticos se llaman «wearables» internamente.

for (local wearable = player.FirstMoveChild(); wearable != null; wearable = wearable.NextMovePeer()) { if (wearable.GetClassname() != «tf_wearable») continue; printl(wearable); }

Creación de una entidad
El siguiente código muestra cómo generar una entidad, concretamente un cohete. El cohete será generado delante del primer jugador disponible.

rocket.SetOwner(ply) // hace que no colisione con el dueño y da los créditos de muerte adecuados
Cambiando el equipo del activador
Cada vez que el código de un script es ejecutado por entradas (por ejemplo)

RunScriptCode/CallScriptFunction en una entidad con un script de entidad adjunto), las variables activator y caller serán establecidas a los manejadores del !activator y !caller de la entrada respectivamente, permitiéndote acceder a ellos en código.

Podemos usar esto para hacer algo fácilmente a los jugadores que caminan en un trigger específico, por ejemplo.

En cuanto al cambio de equipo del activador, tenemos que cambiar su equipo en función del equipo en el que se encuentre y, a continuación, cambiar el equipo de sus objetos cosméticos por el nuevo equipo del activador.

Primero tenemos que averiguar de qué equipo es el activador. Para ello, podemos utilizar el método GetTeam() en el activador (activator.GetTeam()) para obtener el número de índice de su equipo. Se puede utilizar una función if para comparar el valor devuelto con el índice del equipo deseado, o almacenarlo en una variable para utilizarlo más tarde. Esto último en este caso puede ser mejor para reducir la longitud del script. Como referencia: 0 es Sin asignar (ningún equipo todavía), 1 es Espectador, 2 es Rojo, 3 es Azul.

Para cambiar el equipo del activador, debemos utilizar el método ForceChangeTeam(Int : Índice de equipo, Bool : Matar jugador si el juego está en modo Highlander + eliminar sus dominaciones) sobre ellos a través de activator.ForceChangeTeam(...).

Para cambiar el color de sus objetos cosméticos, tenemos que iterar sobre cada entidad tf_wearable, y luego cambiar su equipo a través de SetTeam(Int : Índice de equipo) si son usados por el activador.

Para iterar, necesitamos especificar una variable null (por ejemplo local cosmetic = null), y luego pasarla al siguiente bucle while:
local cosmetic = null // Asigna la variable «cosmetic» a null, se le asignarán nuevos valores al recorrer los ítems cosméticos
while (cosmetic = Entities.FindByClassname(cosmetic, «tf_wearable»))
{
// Realiza acciones en entidades tf_wearables individuales, la variable «cosmetic» se asigna a la entidad tf_wearable actual que estamos recorriendo.
}
Para comprobar si el elemento cosmético pertenece al activador, podemos simplemente comparar el valor devuelto por el método GetOwner() cuando lo usamos en el tf_wearable (por ejemplo, cosmetic.GetOwner()) contra el activador. Código de ejemplo:

if (cosmetic.GetOwner() == activator) { // Hacer cosas si el portador del cosmético es el !activador }

Para cambiar el equipo del cosmético, debemos usar el método SetTeam(Int : Indice de equipo) en la entidad del ítem cosmético.
Código completo con comentarios:

function ActivatorSwapTeam() // Llama a esto en el mapa a través de RunScriptCode > ActivatorSwapTeam() o CallScriptFunction > ActivatorSwapTeam en un logic_script que tenga un Entity Script con esta función
{
// El siguiente fragmento comprueba si se ha especificado un !activador y si es un jugador
// Si la respuesta a cualquiera de las preguntas es no, entonces no ejecutes el resto de la función


if (activator == null || activator.IsPlayer() == false) { return }

// El siguiente fragmento compara el número de equipo del activador (que va de 0 a 3) con los utilizados por Unassigned (0) y Spectator (1).
// Si coinciden con Unassigned o Spectator, no ejecutamos el resto de la función
// Se utiliza para ignorar cualquier espectador potencial !activadores
if (activator.GetTeam() == 0 || activator.GetTeam() == 1) { return }

aquí mas de los ejemplos de comandos
https://developer.valvesoftware.com/wiki/Team_Fortress_2/Scripting/VScript_Examples