Comando terminar script

Sección para misiones y edición ArmA III

Moderador: C. Misiones & Noticias

Avatar de Usuario
<A2>Bhelma
Soldado A2
Soldado A2
Mensajes: 1314
Registrado: 17 Dic 2010, 14:37

Comando terminar script

Mensaje por <A2>Bhelma »

Cual es el comando o funcion que hace falta poner para que cuando se cumpla una condicion se termine de ejecutar un script y no continue con el resto.
Pongo un ejemplo:

Código: Seleccionar todo

a = 0;
b = 2[;
c = a + b;
if (c = 3) then
{
	funcion que termine de ejecutar el script;
}
else
{
	a = 1;
	c = a + b;
};
hint "no se cumple nada";
esto es un ejemplo, lo que quiero es que cuando c = 3, ya no continue y no salga el texto de hint.
Imagen
Imagen

Avatar de Usuario
<A2>Pescadorr
Soldado A2
Soldado A2
Mensajes: 6570
Registrado: 09 Sep 2011, 03:28

Re: Comando terminar script

Mensaje por <A2>Pescadorr »

A ver tienes opciones, de primeras decirte que no hace falta nada, que cuando se acaba el codigo se cierra, no hay ningun comando tipo exit o abort, etc.

Lo que si tienes opciones para salir de bucles o ejecuciones, es el comando if - exitwith te pongo un ejemplo:

Código: Seleccionar todo

if (isserver) exitwith 
{
	noesServer= false;
};	
noesServer= true;
en este caso el servidor dedicado ejecutaría la primera opción y saldría del bucle en el que esta, como esta en el script saldría directamente de el y no ejecutaria nada mas.

otro ejemplo:

Código: Seleccionar todo

waituntil
{
   c =4;
   ....
    .....
   false
};
c= 6;   // la variable c seria igual a 4 
este bucle al llevar un false como condición seria perpetuo y no habria forma de seguir con la ejecucion, c=6 no se ejecutaria nunca.

Código: Seleccionar todo

waituntil
{
   c = 4;
    .....
    if (b==5) exitwith {};
   false
};
c= 6;   // la variable c seria igual a 6 
en este caso si b = 5 saldria del bucle del waituntil y seguiria ejecutando el codigo, c tomaria el valor de 6 si b es igual a 5


Normalmente yo suelo ejecutar los exitwith con cuidado y para cositas puntuales, por ejemplo para discernir entre servidor y clientes:

Código: Seleccionar todo

if (isserver) exitwith {playeroisgay = false;};
_cam = "camera" camCreate (ASLToAGL eyePos player);  
playeroisgay = true;

Esto separa y evita que el servidor cree una camara ya que es innecesario al no tener interfaz (en server dedicado, claro esta), los jugadores tendria la variable playeroisgay a true y el server a false.



aqui el comando en la wiki:
https://community.bistudio.com/wiki/exitWith

Normalmente con una sistaxis adecuada no es necesario usarlo, aunque en donde es necesario salir de un bucle o un script si se puede usar para ser mas eficiente
Caja: DEEP COOL MATREXX 70 3F CPU: Ryzen 7 5800X P. Base: Gigabyte X570 Aorus Elite RAM:Team Group T-Force Dark Z Alpha 2x16 gb ddr4 3600 Mhz CL18
Disipador cpu: Corsair H-100 Hydro series Pasta termica: Thermalright TF8 13.8 W/MK + Coollaboratory Liquid Pro GPU: Asus GeForce TUF Gaming RTX 4070 Ti 12GB GDDR6X
Discos: M2 samsung 970 512 mb 3.0 + M2 Samsung 980 PRO 1 Tb 4.0 + HDD Barracuda 4 Tb Vent: 4 x deep cool RGB pwm + 3 x corsair pwm + 2 x Noctua nf-p12 + controladora rgb + pwm
disipador M2: GLOTRENDS M.2 Alfombrilla: MARSGAMING MMPRGB2 XXL RGB 80x30 Auriculares: Audio-Technica M50x Peines cableado: Uphere 24 pz
Microfono: Boya BY-M1 Raton: Logitech G602 Teclado: Razer Huntsman Elite Switches Optomecánicos Purple
Monitor: Philips 436M6VBPAB 43" 4K HDR1000 AmbiGlow Gsync low input Silla: Diablo X-Horn XL


Avatar de Usuario
<A2>Bhelma
Soldado A2
Soldado A2
Mensajes: 1314
Registrado: 17 Dic 2010, 14:37

Re: Comando terminar script

Mensaje por <A2>Bhelma »

Es el que estoy usando de esta manera

Código: Seleccionar todo

If (true) exitWith {};
Pero sale del while y sigue con el script sin salir de él.

A ver si te veo estos días, y te pongo el script de lo que estoy haciendo, para que entiendas el motivo y me comentes.

No quiero desvelar una cosica para una misión, por eso no lo pongo de momento.
Imagen
Imagen

Avatar de Usuario
<A2>Pescadorr
Soldado A2
Soldado A2
Mensajes: 6570
Registrado: 09 Sep 2011, 03:28

Re: Comando terminar script

Mensaje por <A2>Pescadorr »

<A2>Bhelma escribió: 19 Mar 2023, 17:36 Es el que estoy usando de esta manera

Código: Seleccionar todo

If (true) exitWith {};
Pero sale del while y sigue con el script sin salir de él.

A ver si te veo estos días, y te pongo el script de lo que estoy haciendo, para que entiendas el motivo y me comentes.

No quiero desvelar una cosica para una misión, por eso no lo pongo de momento.
claro, como te he dicho si esta en un bucle sale de el, para salir del script tiene que estar fuera de todo bucle, tiene que estar en la ejecucion principal del script.

Como te digo, no tiene mucho sentido eso que estas haciendo, simplemente dale la condición correcta para salir del bucle de forma normal. No tiene mucho sentido esto porque va a salir siempre, y para eso simplemente configura para que salga del bucle y listo. Un ejemplo:

Código: Seleccionar todo

_i=1000;
waituntil
{
	hintSilent format ["Te quedan %1 segundos para desactivar la bomba", _i];
	_i = _i - 1;
	if (bomba_1 getvariable "desactivada") exitwith {};
	sleep 1;
	_i == 0
};
Esta seria una forma de salir del bucle si la variable desactivada pasa a tener el valor true, ose el tiempo se acaba

Código: Seleccionar todo

_i=1000;
waituntil
{
	hintSilent format ["Te quedan %1 segundos para desactivar la bomba", _i];
	_i = _i - 1;
	sleep 1;
	_i == 0 || bomba_1 getvariable ["desactivada" , false]
};
Y esta haria exactamente lo mismo.
Caja: DEEP COOL MATREXX 70 3F CPU: Ryzen 7 5800X P. Base: Gigabyte X570 Aorus Elite RAM:Team Group T-Force Dark Z Alpha 2x16 gb ddr4 3600 Mhz CL18
Disipador cpu: Corsair H-100 Hydro series Pasta termica: Thermalright TF8 13.8 W/MK + Coollaboratory Liquid Pro GPU: Asus GeForce TUF Gaming RTX 4070 Ti 12GB GDDR6X
Discos: M2 samsung 970 512 mb 3.0 + M2 Samsung 980 PRO 1 Tb 4.0 + HDD Barracuda 4 Tb Vent: 4 x deep cool RGB pwm + 3 x corsair pwm + 2 x Noctua nf-p12 + controladora rgb + pwm
disipador M2: GLOTRENDS M.2 Alfombrilla: MARSGAMING MMPRGB2 XXL RGB 80x30 Auriculares: Audio-Technica M50x Peines cableado: Uphere 24 pz
Microfono: Boya BY-M1 Raton: Logitech G602 Teclado: Razer Huntsman Elite Switches Optomecánicos Purple
Monitor: Philips 436M6VBPAB 43" 4K HDR1000 AmbiGlow Gsync low input Silla: Diablo X-Horn XL


Avatar de Usuario
<A2>Bhelma
Soldado A2
Soldado A2
Mensajes: 1314
Registrado: 17 Dic 2010, 14:37

Re: Comando terminar script

Mensaje por <A2>Bhelma »

Pesca este es el script.

Código: Seleccionar todo

// [dron1] execVM "Dron_Granada.sqf"

dron = _this select 0;
_posM = position player;
pilotdron = driver dron;
controlador = position controller; // Unidad enemiga del misma bando que los drones.

// Verificamos si el dron esta vivo (y le ponemos la granada = esto no funciona, sale hacia arriba el dron sin parar)
if (alive dron) then
{
//	granada = createSimpleObject ["A3\Weapons_f\ammo\Handgrenade", [0,0,0]];
//	granada attachTo [dron, [0,0,-0.15]];
// LLevamos al dron a la posicion de su objetivo
	pilotdron domove _posM;
// Que vuele hasta destino y detecte si lo eliminan
//	while {prueba distance dron > 75} do
	while {player distance dron > 100} do
	{
		if (!alive dron) then
		{
			if (true) exitWith {};
		};
	};
	sleep 5;
// Creamos un activador de presencia del dron y creamos que cuando detecte al jugador le coloque una granada.
	if (isServer) then
	{
		_Trigger = createTrigger ["EmptyDetector", getPos prueba, false];
		_Trigger setTriggerActivation ["GUER", "PRESENT", false];
		_Trigger setTriggerArea [15, 15, getDir this, true];
		_Trigger setTriggerStatements
		[
			"this and dron in thisList",
			"_pos = player modelToWorld [0,0,-0.15]; _gren = 'grenade' createvehicle _pos; pilotdron domove controlador;",
			""
		];
	};
	while {controller distance dron > 100} do
	{
		if (!alive dron) then
		{
			if (true) exitWith {};
		};
	};
	deleteVehicle dron;
};
Sobre un dron puesto en el mapa, y ejecutando este script en un activado hace lo siguiente:

Se pone en movimiento hacia el player que lo ha activado
Se crear un activador en la posición del player para que cuando el dron esté encima se genere una Granada y explote en la posición del player.
El dron vuelve a una posición
Es eliminado del mapa.

La idea es que cuando el dron sea eliminado antes de llegar a su ubicación, no genere el activador, para no crear la Granada accidentalmente, y si es después de la Granada, también, para que el script no elimine un objeto inexistente y haga un error.

Y ya que estas, verás que en el código también había puesto que cuando saliera el dron llevara pegada una granada y así sería más real verlo volar con ella puesta, pero por algún motivo, cuando se le añade la granada, el dron empieza a subir para arriba sin límite y nunca avanza. Por esto esta eliminado de la acción.

Ya me dices.

Gracias.
Imagen
Imagen

Avatar de Usuario
<A2>Pescadorr
Soldado A2
Soldado A2
Mensajes: 6570
Registrado: 09 Sep 2011, 03:28

Re: Comando terminar script

Mensaje por <A2>Pescadorr »

Ok, te adapto el script, entiendo que será para usar en multiplayer, supongo.

Necesito que me aclares unas cositas:
  • Este script donde se ejecuta? En el init del dron? En un activador que se ejecuta a voluntad? Un addaction? Explicame exactamente como se ejecuta y todo el proceso.
  • _posM = position player;
    Esta línea depende como se esté ejecutando el script puede estar mal o no, en principio seria la persona que ejecuta el script, pero luego veo en el script que mandas al dron a su posición, asi que el dron iría encima de uno mismo a matarte, es así?
Caja: DEEP COOL MATREXX 70 3F CPU: Ryzen 7 5800X P. Base: Gigabyte X570 Aorus Elite RAM:Team Group T-Force Dark Z Alpha 2x16 gb ddr4 3600 Mhz CL18
Disipador cpu: Corsair H-100 Hydro series Pasta termica: Thermalright TF8 13.8 W/MK + Coollaboratory Liquid Pro GPU: Asus GeForce TUF Gaming RTX 4070 Ti 12GB GDDR6X
Discos: M2 samsung 970 512 mb 3.0 + M2 Samsung 980 PRO 1 Tb 4.0 + HDD Barracuda 4 Tb Vent: 4 x deep cool RGB pwm + 3 x corsair pwm + 2 x Noctua nf-p12 + controladora rgb + pwm
disipador M2: GLOTRENDS M.2 Alfombrilla: MARSGAMING MMPRGB2 XXL RGB 80x30 Auriculares: Audio-Technica M50x Peines cableado: Uphere 24 pz
Microfono: Boya BY-M1 Raton: Logitech G602 Teclado: Razer Huntsman Elite Switches Optomecánicos Purple
Monitor: Philips 436M6VBPAB 43" 4K HDR1000 AmbiGlow Gsync low input Silla: Diablo X-Horn XL


Avatar de Usuario
<A2>Pescadorr
Soldado A2
Soldado A2
Mensajes: 6570
Registrado: 09 Sep 2011, 03:28

Re: Comando terminar script

Mensaje por <A2>Pescadorr »

Código: Seleccionar todo

// [dron1] execVM "Dron_Granada.sqf"

_dron = _this select 0;
_posM = position player;
_pilotodron = driver _dron;
_controlador = position controller; 

if (alive dron) then
{
	_granada = "HandGrenade" createvehicle  [0,0,0];
        _granada attachTo [_dron, [0,0,-0.15]];
        // LLevamos al dron a la posicion de su objetivo
	_pilotdron domove _posM;
        Waituntil
        {
               If (!Alive _dron) exitwith {};
                _dron distance2D _posM < 2
        };
        Detach _granada;
        Waituntil {isTouchingGround _granada};
        _gren = 'grenade' createvehicle getpos _granada;
        Deletevehicle _granada;
        _pilotdron domove _controlador;
        Waituntil{ _dron distance2D _posM < 2};
        Sleep 1;
        Deletevehicle _dron;
};
En principio seria algo así, a falta de depurarlo y ver detalles, como por ejemplo si la granada detona nada más soltarla, y cosas así.
El tema de definir al que le cae la granada es un tema importante, sobretodo en multiplayer, si dos o más activan el script a la vez, dejaría de funcionar. Esto hay que tenerlo muy bien definido.

Yo lo que haría es que el dron volará sobre el enemigo, recargue un par de granadas, vaya hacia el objetivo y se las vaya soltando a la gente encima, y luego vuelva a recarga, así hasta que lo derriben.
Caja: DEEP COOL MATREXX 70 3F CPU: Ryzen 7 5800X P. Base: Gigabyte X570 Aorus Elite RAM:Team Group T-Force Dark Z Alpha 2x16 gb ddr4 3600 Mhz CL18
Disipador cpu: Corsair H-100 Hydro series Pasta termica: Thermalright TF8 13.8 W/MK + Coollaboratory Liquid Pro GPU: Asus GeForce TUF Gaming RTX 4070 Ti 12GB GDDR6X
Discos: M2 samsung 970 512 mb 3.0 + M2 Samsung 980 PRO 1 Tb 4.0 + HDD Barracuda 4 Tb Vent: 4 x deep cool RGB pwm + 3 x corsair pwm + 2 x Noctua nf-p12 + controladora rgb + pwm
disipador M2: GLOTRENDS M.2 Alfombrilla: MARSGAMING MMPRGB2 XXL RGB 80x30 Auriculares: Audio-Technica M50x Peines cableado: Uphere 24 pz
Microfono: Boya BY-M1 Raton: Logitech G602 Teclado: Razer Huntsman Elite Switches Optomecánicos Purple
Monitor: Philips 436M6VBPAB 43" 4K HDR1000 AmbiGlow Gsync low input Silla: Diablo X-Horn XL


Avatar de Usuario
<A2>Bhelma
Soldado A2
Soldado A2
Mensajes: 1314
Registrado: 17 Dic 2010, 14:37

Re: Comando terminar script

Mensaje por <A2>Bhelma »

<A2>Pescadorr escribió: 22 Mar 2023, 12:42 Ok, te adapto el script, entiendo que será para usar en multiplayer, supongo.

Necesito que me aclares unas cositas:
  • Este script donde se ejecuta? En el init del dron? En un activador que se ejecuta a voluntad? Un addaction? Explicame exactamente como se ejecuta y todo el proceso.
  • _posM = position player;
    Esta línea depende como se esté ejecutando el script puede estar mal o no, en principio seria la persona que ejecuta el script, pero luego veo en el script que mandas al dron a su posición, asi que el dron iría encima de uno mismo a matarte, es así?
Primera pregunta.
Se ejecuta en un activador a voluntad. Cuando un jugador entre en un área, lo activa.


Segunda pregunta.
Si, iría a tu última posición, no la de la activación, sino la última que tengas antes de crear el activador y va a matarte
Imagen
Imagen

Avatar de Usuario
<A2>Bhelma
Soldado A2
Soldado A2
Mensajes: 1314
Registrado: 17 Dic 2010, 14:37

Re: Comando terminar script

Mensaje por <A2>Bhelma »

<A2>Pescadorr escribió: 22 Mar 2023, 13:14

Código: Seleccionar todo

// [dron1] execVM "Dron_Granada.sqf"

_dron = _this select 0;
_posM = position player;
_pilotodron = driver _dron;
_controlador = position controller; 

if (alive dron) then
{
	_granada = "HandGrenade" createvehicle  [0,0,0];
        _granada attachTo [_dron, [0,0,-0.15]];
        // LLevamos al dron a la posicion de su objetivo
	_pilotdron domove _posM;
        Waituntil
        {
               If (!Alive _dron) exitwith {};
                _dron distance2D _posM < 2
        };
        Detach _granada;
        Waituntil {isTouchingGround _granada};
        _gren = 'grenade' createvehicle getpos _granada;
        Deletevehicle _granada;
        _pilotdron domove _controlador;
        Waituntil{ _dron distance2D _posM < 2};
        Sleep 1;
        Deletevehicle _dron;
};
En principio seria algo así, a falta de depurarlo y ver detalles, como por ejemplo si la granada detona nada más soltarla, y cosas así.
El tema de definir al que le cae la granada es un tema importante, sobretodo en multiplayer, si dos o más activan el script a la vez, dejaría de funcionar. Esto hay que tenerlo muy bien definido.

Yo lo que haría es que el dron volará sobre el enemigo, recargue un par de granadas, vaya hacia el objetivo y se las vaya soltando a la gente encima, y luego vuelva a recarga, así hasta que lo derriben.
Nada que ver con el mío...jajajajja

Vale, lo de si explota antes de tiempo , simplemente es ponerle un poco de tiempo, aunque mirándolo explotaria nada más hacer contacto la Granada creada en el suelo. No lo veo mal.

Se ejecutara en servidor dedicado, el nuestro, así que la parte de que no falle por si la activan varios, no sabría por donde tirar.

Lo estuve pensando, es decir, poner le como 3 granadas y que sobrevolara al grupo y fuese tirando las granadas conforme fuese pasando x tiempo, pero lo único que se me ocurrio fue crear mediante waypoints y el último que fuese de radio de acción y que durante 30 segundos fuese tirando granadas, pero como has visto la posición es _posM que es la del jugador, cuando esta muerto, primera Granada, se va al traste todo, y por eso lo dejé con una sola Granada y eliminar al dron al final
Imagen
Imagen

Avatar de Usuario
<A2>Bhelma
Soldado A2
Soldado A2
Mensajes: 1314
Registrado: 17 Dic 2010, 14:37

Re: Comando terminar script

Mensaje por <A2>Bhelma »

La idea de este script es que cuando un pelotón de jugadores entre en un área, un dron se dirija a ellos y les granadee.
Es como si el dron lo enviase la IA.
Imagen
Imagen

Responder