Cómo usar flags

¿Tienes dudas sobre un código? Consúltalas aquí y aprende cómo se solucionan diferentes tipos de errores.

Moderador: Ayudantes

Reglas del Foro
  • A la hora de realizar su pregunta, especifique bien los detalles y tenga buena ortografía, de esa manera el resto de los usuarios podrán entender su pregunta.
  • Recuerde proporcionar el código que le trae problemas y sus respectivos errores utilizando el BBCode [Pawn]Código aquí[/Pawn] en su mensaje.
  • En esta sección, sólo podrás publicar preguntas asociadas a programación en PAWN ("¿Cuál es la diferencia entre new y static?"), más no temas relacionados a pedir códigos ("¿Me pueden pasar el sistema de 'X' servidor?"). (Ir a Pedidos para publicar estos temas).
  • Si tu pregunta es relacionada con un GM publicado en PawnScript, no crees tu pregunta en esta sección, créala en el mismo tema desde donde obtuviste el GameMode.
  • Evita colocar títulos como: "[Pregunta]", "[Duda]", "[Ayuda]", etc. Los títulos deben ser descriptivos.
  • Si la pregunta es respondida, no modifiques el título ni el contenido de los mensajes del tema. Quizás le pueda servir a alguien más en otro momento.
  • Si la pregunta es respondida, el tema será movido a "Preguntas Solucionadas".
  • Si la pregunta no cumple con alguna de las reglas antes mencionadas o con las Normas del foro, el tema será movido a "Preguntas Cerradas" o a la Papelera.
Responder
Avatar de Usuario
Jeffersonm11
Aprendiz
Aprendiz
Mensajes: 43
Registrado: 08 Sep 2018 07:13
Reputación: 0

27 Abr 2019 12:05

Hola, el día de hoy estaba terminando un sistema de eventos, pero me es vital tener el bloqueo de comandos cuando los jugadores están en él, por ende utilizé onplayercommandreceived, y los eventos son en el mundo virtual número 3, quería solo permitirles el comando /salir, pero tengo un problema, y es que uso el procesador de comandos Pawn.cmd, y yo estaba acostumbrado a usar OnPlayerCommandreceived de la forma tradicional, y como hace poco utilizo este procesador no tengo ni idea de como usar los famosos flags, si alguien sabe como usarlos de antemano le agradezco, sólo quiero que cuando esté en el mundo virtual 3 le permite usar /salir.
acá mi código ejemplo.
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

#include <Pawn.cmd>

new EnEvento[MAX_PLAYERS]; 

main
{
//código
}
public OnPlayerCommandReceived(playerid, cmd[], params[], flags)
{
//código
return 1;
}

CMD:evento(playerid, params[])
{
EnEvento[playerid] = 1;
return 1;
}
CMD:salir(playerid, params[])
{
if(EnEvento[playerid] == 1)
{
EnEvento[playerid] = 0;
}
return 1;
}
  Cantidad de llaves: Abiertas(5)-Cerradas(5) | Lineas Totales: 27
Las cosas fluirán mejor si tu actuar empieza a cambiar.
Avatar de Usuario
MrDave
Ayudante
Ayudante
Mensajes: 957
Registrado: 05 Oct 2017 12:13
Reputación: 107

27 Abr 2019 12:48


La variable "EnEvento" también puede ser declarada como "bool:", puesto sólo recibe dos valores, true or false.
Los flags de cada comando por defecto son 0, por ende puedes usar un "enum" y adentro agregas los nombres de las banderas para no identificarlos con números.
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

#include <Pawn.cmd>

enum
{
	CMD_SALIR = 1,  //Flag 1
	/*
            CMD_2,
            CMD_3,
           ETC...
       */
};

new bool:EnEvento[MAX_PLAYERS]; 

main
{
	//código
}
public OnPlayerCommandReceived(playerid, cmd[], params[], flags)
{
	if(EnEvento[playerid] == true && flags != CMD_SALIR)
	{
		SendClientMessage(playerid, -1, "Error: No puedes usar comandos en un Evento.");
		return 0;
	}
	return 1;
}

flags:salir(CMD_SALIR);
CMD:salir(playerid)
{
	if(EnEvento[playerid] == true)
	{
		EnEvento[playerid] = false;
	}
	return 1;
}
  Cantidad de llaves: Abiertas(6)-Cerradas(6) | Lineas Totales: 37

Con ese código bloqueas los comandos al jugador estando en el evento y sólo podrán salir usando el comando "/salir", sí eso llegara a pasar, el parámetro "flags" de "OnPlayerCommandReceived" recibe 1 (porqué es el flag del comando /salir) y por ende, la condición se evaluaría, si la primera se cumple, la siguiente también (en este caso no, porqué se usó /salir).

- Temporalmente estoy retirado de SA-MP; por lo tanto no me envíen propuestas de proyectos.
- No respondo dudas por privado, usa la sección de preguntas.
Avatar de Usuario
Jeffersonm11
Aprendiz
Aprendiz
Mensajes: 43
Registrado: 08 Sep 2018 07:13
Reputación: 0

27 Abr 2019 13:51

Me permite usar todos los comandos con normalidad, también me dice "Comando desconocido" después que lo permite, no será porque al enumerador se le debe asignar un nombre?
Las cosas fluirán mejor si tu actuar empieza a cambiar.
Avatar de Usuario
MrDave
Ayudante
Ayudante
Mensajes: 957
Registrado: 05 Oct 2017 12:13
Reputación: 107

27 Abr 2019 15:03

Jeffersonm11 escribió:
27 Abr 2019 13:51
Me permite usar todos los comandos con normalidad, también me dice "Comando desconocido" después que lo permite, no será porque al enumerador se le debe asignar un nombre?

No importa si le das un nombre al "enum", no te lo puse, para evitar un warning por parte de pawncc.exe
Acabé de probar el código que te di, funciona correctamente. Al final estás haciendo algo mal, deberías de mandar el bloque de código de prueba que estás usando.

- Temporalmente estoy retirado de SA-MP; por lo tanto no me envíen propuestas de proyectos.
- No respondo dudas por privado, usa la sección de preguntas.
Avatar de Usuario
Jeffersonm11
Aprendiz
Aprendiz
Mensajes: 43
Registrado: 08 Sep 2018 07:13
Reputación: 0

28 Abr 2019 07:41

Volví a chequear el código sigue igual con lo de comando desconocido,además me deja pasar el comando, en el callback OnplayerCommandPerformed tengo esto
 Codigo Pawno:
1
2
3
4
5
6
7
8
9

public OnplayerCommandPerformed(playerid, cmd[], params[], result, flags)
{
if(result == -1)
{
SendClientMessage(playerid, -1,” comando desconocido, lee /comandos”);
return 0;
}
return 1;
}
  Cantidad de llaves: Abiertas(2)-Cerradas(2) | Lineas Totales: 9
Las cosas fluirán mejor si tu actuar empieza a cambiar.
Avatar de Usuario
Eduardo_1
Master
Master
Mensajes: 1528
Registrado: 13 Dic 2016 17:50
Contactar:
Reputación: 104

28 Abr 2019 08:22

Jeffersonm11 escribió:
28 Abr 2019 07:41
Volví a chequear el código sigue igual con lo de comando desconocido,además me deja pasar el comando, en el callback OnplayerCommandPerformed tengo esto
 Codigo Pawno:
1
2
3
4
5
6
7
8
9

public OnplayerCommandPerformed(playerid, cmd[], params[], result, flags)
{
if(result == -1)
{
SendClientMessage(playerid, -1,” comando desconocido, lee /comandos”);
return 0;
}
return 1;
}
  Cantidad de llaves: Abiertas(2)-Cerradas(2) | Lineas Totales: 9
Debe ser algo así.
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

public OnplayerCommandPerformed(playerid, cmd[], params[], result, flags)
{
	if(result == -1)
	{
		SendClientMessage(playerid, -1, "comando desconocido, lee /comandos");
		return 0;
	}
	if(flags) //Si tiene
	{
		if(GetPVarInt(playerid, "Nivel") < flags)
		{
		}
	}
	return 1;
}
CMD:nivel(playerid)
{
	SetPVarInt(playerid, "Nivel", 2);
	return 1;
}
CMD:sinnivel(playerid)
{
	DeletePVarInt(playerid, "Nivel");
	return 1;
}
CMD:pruebacmd(playerid)
{
	SendClientMessage(playerid, -1, "Felicidades, tienes el nivel para usar este comando");
	return 1;
}
flags:pruebacmd(2);
  Cantidad de llaves: Abiertas(7)-Cerradas(7) | Lineas Totales: 31

Un sabio escribió: No a todo el mundo se puede ayudar porque siempre hay un mal agradecido que termina pagándote mal. Corrige al sabio y será más sabio, corrige al necio y será tu enemigo.
Anónimo escribió: El orgulloso no reconoce sus defectos, errores o la contradicción. En el fondo su ignorancia es debida a su falta de humildad.
Vendo modo de juego Roleplay (GM-RP): New states sin bugs con PCU (UCP) no responsive (Y-INI). Interesados al imbox.


Avatar de Usuario
Jeffersonm11
Aprendiz
Aprendiz
Mensajes: 43
Registrado: 08 Sep 2018 07:13
Reputación: 0

28 Abr 2019 11:21

Eduardo_1 escribió:
28 Abr 2019 08:22
Jeffersonm11 escribió:
28 Abr 2019 07:41
Volví a chequear el código sigue igual con lo de comando desconocido,además me deja pasar el comando, en el callback OnplayerCommandPerformed tengo esto
 Codigo Pawno:
1
2
3
4
5
6
7
8
9

public OnplayerCommandPerformed(playerid, cmd[], params[], result, flags)
{
if(result == -1)
{
SendClientMessage(playerid, -1,” comando desconocido, lee /comandos”);
return 0;
}
return 1;
}
  Cantidad de llaves: Abiertas(2)-Cerradas(2) | Lineas Totales: 9
Debe ser algo así.
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

public OnplayerCommandPerformed(playerid, cmd[], params[], result, flags)
{
	if(result == -1)
	{
		SendClientMessage(playerid, -1, "comando desconocido, lee /comandos");
		return 0;
	}
	if(flags) //Si tiene
	{
		if(GetPVarInt(playerid, "Nivel") < flags)
		{
		}
	}
	return 1;
}
CMD:nivel(playerid)
{
	SetPVarInt(playerid, "Nivel", 2);
	return 1;
}
CMD:sinnivel(playerid)
{
	DeletePVarInt(playerid, "Nivel");
	return 1;
}
CMD:pruebacmd(playerid)
{
	SendClientMessage(playerid, -1, "Felicidades, tienes el nivel para usar este comando");
	return 1;
}
flags:pruebacmd(2);
  Cantidad de llaves: Abiertas(7)-Cerradas(7) | Lineas Totales: 31
Hola, muchas gracias por responder, en sí lo que me gustaría conocer es como bloquear comandos al jugador si está en determinado lugar, en este caso en el evento, así como de la forma tradicional, en el OnPlayerCommandReceived que es muy sencilla porque se usa "strcmp", pero sucede que al intentar hacerlo de esta forma no funciona y me arroja "comando desconocido" cuando está la variable activada, mientras no, cambié al procesador Pawn.cmd porque he oído que es el procesador más rápido hasta la actualidad, entonces, no me gustaría eliminarlo sólo por no saber usar el OnPlayerCommandReceived en pawn.cmd xd
Las cosas fluirán mejor si tu actuar empieza a cambiar.
Avatar de Usuario
MrDave
Ayudante
Ayudante
Mensajes: 957
Registrado: 05 Oct 2017 12:13
Reputación: 107

28 Abr 2019 11:55


@Jeffersonm11
No entiendo cual es el problema, el "OnPlayerCommandReceived" de pawncmd es casi lo "mismo" que el de zcmd (ya que también lo tiene).
Yo no puedo hacer esto:
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10
11
12
13

public OnPlayerCommandPerformed(playerid, cmd[], params[], result, flags)
{
	if(result == -1)
	{
		return 0;
	}
	if(EnEvento[playerid] == true && flags != CMD_SALIR)
	{
		SendClientMessage(playerid, -1, "Error: No puedes usar comandos en un Evento.");
		return 0;
	}
	return 1;
}
  Cantidad de llaves: Abiertas(3)-Cerradas(3) | Lineas Totales: 13

El código de arriba compilaría, el problema es que no es eficaz y no hará lo que tú quieres; ya que ese mensaje de "Error: No puedes usar comandos en un Evento" se enviará al jugador pero igualmente el comando se ejecutará (claro si es válido).
Aquí te dejo el código de prueba que usé:
Spoiler:
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

#include <a_samp>
#include <Pawn.CMD>

new bool:EnEvento[MAX_PLAYERS];

const CMD_SALIR = 1;

main()
{
}

public OnPlayerCommandPerformed(playerid, cmd[], params[], result, flags)
{
	if(result == -1)
	{
		return 0;
	}
	if(EnEvento[playerid] == true && flags != CMD_SALIR)
	{
		SendClientMessage(playerid, -1, "Error: No puedes usar comandos en un Evento.");
		return 0;
	}
	return 1;
}

CMD:evento(playerid)
{
	EnEvento[playerid] = true;
	return 1;
}

CMD:money(playerid)
{
	GivePlayerMoney(playerid, 9000);
	print("money");
	return 1;
}

flags:salir(CMD_SALIR);
CMD:salir(playerid)
{
	if(EnEvento[playerid] == true)
	{
		EnEvento[playerid] = false;
	}
	return 1;
}

  Cantidad de llaves: Abiertas(8)-Cerradas(8) | Lineas Totales: 48

Por esa razón usamos "OnPlayerCommandReceived", ese callback es llamado cuando el comando aun no es procesado, eso quiere decir que el procesador de comandos aún no evalúa si el comando existe o no y de ese modo tenemos la oportunidad de bloquear el envío de ese comando, para que no se ejecute (por esa razón usamos el "return 0;" en ese callback).
El código que te pasa en mi primer comentario, funciona correctamente, pues lo probé antes de enviarlo.
Te recomiendo que pruebes este código en un archivo .pwn separado al que estés usando actualmente y ejecútalo, ahí te darás cuenta del funcionamiento.
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53

#include <a_samp>
#include <Pawn.CMD>

new bool:EnEvento[MAX_PLAYERS];

const CMD_SALIR = 1;

main()
{
}

public OnPlayerCommandPerformed(playerid, cmd[], params[], result, flags)
{
	if(result == -1)
	{
	    SendClientMessage(playerid, -1, "Error: Comando desconocido");
	    return 0;
	}
	return 1;
}

public OnPlayerCommandReceived(playerid, cmd[], params[], flags)
{
	if(EnEvento[playerid] == true && flags != CMD_SALIR)
	{
		SendClientMessage(playerid, -1, "Error: No puedes usar comandos en un Evento.");
		return 0;
	}
	return 1;
}

CMD:evento(playerid)
{
	EnEvento[playerid] = true;
	return 1;
}

CMD:money(playerid)
{
	GivePlayerMoney(playerid, 9000);
	print("money");
	return 1;
}

flags:salir(CMD_SALIR);
CMD:salir(playerid)
{
	if(EnEvento[playerid] == true)
	{
		EnEvento[playerid] = false;
	}
	return 1;
}
  Cantidad de llaves: Abiertas(9)-Cerradas(9) | Lineas Totales: 53

Si el problema aún persiste, deberás mandar el código de prueba que estés usando, así puedo analizar cual es el inconveniente.

- Temporalmente estoy retirado de SA-MP; por lo tanto no me envíen propuestas de proyectos.
- No respondo dudas por privado, usa la sección de preguntas.
Avatar de Usuario
Jeffersonm11
Aprendiz
Aprendiz
Mensajes: 43
Registrado: 08 Sep 2018 07:13
Reputación: 0

01 May 2019 09:52

Probaré de nuevo y te aviso.
Edito: Listo, he comprobado que sí funciona, y... el problema ha sido que solo funciona el entorno, es decir en el script en el que esté el callback OnPlayerCommandReceived, pero yo buscaba que funcionará en todos los scripts, por eso me dejaba pasar los comandos, será posible que funcione en todos los scripts? tengo que poner el callback en todos los scripts? o será que debe retornar a 0 para que pase a los siguientes scripts?
Las cosas fluirán mejor si tu actuar empieza a cambiar.
Responder