Restricción de comandos no funciona con los FilterScript

¿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
xLatt
Aprendiz
Aprendiz
Mensajes: 2
Registrado: 12 Jun 2019 21:27
Reputación: 0

14 Jun 2019 04:53

Hola.
Estoy intentando crear una zona DM con restricción de comandos. O sea que al entrar solo se pueda utilizar el comando de salir.
 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

new bool:indm[MAX_PLAYERS] = false; // Global

public OnPlayerConnect(playerid)
{
	indm[playerid] = false;
}

public OnPlayerCommandReceived(playerid, cmdtext[])
{
    if(indm[playerid] == true  && strfind(cmdtext,"/salirdm",true) == 0)
    {
        SendClientMessage(playerid, -1, "Comandos bloqueados, usa /salirdm");
        return 0;
    }
    return 1;
}
CMD:dm(playerid, params[])
{
    indm[playerid] = true;
    SetPlayerPos(playerid, 1852.007, -1338.001, 13.403);
    GivePlayerWeapon(playerid, 28, cellmax);
	return 1;
}

return 1;
}

CMD:salirdm(playerid, params[])
{
       indm[playerid] = false;
       if(indm[playerid] == false){
       SetPlayerPos(playerid, 1876.31, -1398.76, 13.57);
       }
       return 1
}
  Cantidad de llaves: Abiertas(6)-Cerradas(7) | Lineas Totales: 35
Resulta bien con los comandos que tengo en el GM, pero para los comandos, que vienen con este FS https://forum.sa-mp.com/showthread.php?t=162620 By The_Chaoz
para crear teleports, no sirve la restricción

Imagino que pasará lo mismo con comandos de otros FS, no he probado. ¿Habrá alguna solución?
Avatar de Usuario
Eduardo_1
Master
Master
Mensajes: 1546
Registrado: 13 Dic 2016 17:50
Contactar:
Reputación: 105

14 Jun 2019 07:03

 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

new bool:indm[MAX_PLAYERS] = false; // Global

public OnPlayerConnect(playerid)
{
	indm[playerid] = false;
}

public OnPlayerCommandReceived(playerid, cmdtext[])
{
    if(indm[playerid] == true  && strfind(cmdtext,"/salirdm",true) != -1)
    {
        SendClientMessage(playerid, -1, "Comandos bloqueados, usa /salirdm");
        return 0;
    }
    return 1;
}
CMD:dm(playerid, params[])
{
    indm[playerid] = true;
    SetPlayerPos(playerid, 1852.007, -1338.001, 13.403);
    GivePlayerWeapon(playerid, 28, cellmax);
	return 1;
}

CMD:salirdm(playerid, params[])
{
	if(indm[playerid] == true)
	{
		indm[playerid] = false;
       SetPlayerPos(playerid, 1876.31, -1398.76, 13.57);
	}
	return 1;
}	
  Cantidad de llaves: Abiertas(6)-Cerradas(6) | Lineas Totales: 33

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
MrDave
Ayudante
Ayudante
Mensajes: 1048
Registrado: 05 Oct 2017 12:13
Reputación: 113

14 Jun 2019 19:55

xLatt escribió:
14 Jun 2019 04:53
Hola.
Estoy intentando crear una zona DM con restricción de comandos. O sea que al entrar solo se pueda utilizar el comando de salir.
 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

new bool:indm[MAX_PLAYERS] = false; // Global

public OnPlayerConnect(playerid)
{
	indm[playerid] = false;
}

public OnPlayerCommandReceived(playerid, cmdtext[])
{
    if(indm[playerid] == true  && strfind(cmdtext,"/salirdm",true) == 0)
    {
        SendClientMessage(playerid, -1, "Comandos bloqueados, usa /salirdm");
        return 0;
    }
    return 1;
}
CMD:dm(playerid, params[])
{
    indm[playerid] = true;
    SetPlayerPos(playerid, 1852.007, -1338.001, 13.403);
    GivePlayerWeapon(playerid, 28, cellmax);
	return 1;
}

return 1;
}

CMD:salirdm(playerid, params[])
{
       indm[playerid] = false;
       if(indm[playerid] == false){
       SetPlayerPos(playerid, 1876.31, -1398.76, 13.57);
       }
       return 1
}
  Cantidad de llaves: Abiertas(6)-Cerradas(7) | Lineas Totales: 35
Resulta bien con los comandos que tengo en el GM, pero para los comandos, que vienen con este FS https://forum.sa-mp.com/showthread.php?t=162620 By The_Chaoz
para crear teleports, no sirve la restricción

Imagino que pasará lo mismo con comandos de otros FS, no he probado. ¿Habrá alguna solución?

Esto esta incorrecto:
 Codigo Pawno:
1

new bool:indm[MAX_PLAYERS] = false; // Global
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 1

Con ese código le estarías dando un "false" al primer elemento del arreglo (a indm).
Lo correcto sería hacer esto:
 Codigo Pawno:
1

new bool:indm[MAX_PLAYERS] = {false, ...};
  Cantidad de llaves: Abiertas(1)-Cerradas(1) | Lineas Totales: 1

Aunque es innecesario, porqué por defecto el compilador inicializa todos los elementos del arreglo a "false".
Bueno, con respecto a tu problema, es la siguiente línea:
 Codigo Pawno:
1

if(indm[playerid] == true  && strfind(cmdtext,"/salirdm",true) == 0))
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 1

La función strfind devuelve dos valores:
- Retorna -1 si la subcadena (en nuestro caso es /salirdm) no se encuentra en la cadena principal (en nuestro caso es "cmdtext").
- Retorna el índice donde se encuentre el caracter inicial de la subcadena en la cadena principal. Por ejemplo, si la cadena es "Karina es hermosa y bella" y la subcadena es "hermosa", retornará 10. ¿Por qué? Porqué el caracter inicial de hermosa está en la posición o índice 10.
La condición correcta sería:
 Codigo Pawno:
1

if(indm[playerid] == true  && strfind(cmdtext,"/salirdm",true)  ==  -1))
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 1

La interpretación de ese código es la siguiente:
Si el jugador se encuentra en una zona deathmatch, la subcondición se cumple y pasamos a evaluar la siguiente subrestricción. Asumamos que el jugador escribe /armas, la función strfind devolverá -1 porqué la subcadena /salirdm no se encuentra en la cadena principal (que es /armas). Por lo tanto, la condición se cumplirá y mandará un mensaje diciendo: "Debes usar /salirdm".
Este código esta mal:
 Codigo Pawno:
1
2
3
4
5
6
7
8

CMD:salirdm(playerid, params[])
{
       indm[playerid] = false;
       if(indm[playerid] == false){
       SetPlayerPos(playerid, 1876.31, -1398.76, 13.57);
       }
       return 1
}
  Cantidad de llaves: Abiertas(2)-Cerradas(2) | Lineas Totales: 8

Pues cualquier jugador podrá usar el comando /salirdm, la solución es la que te propuso Eduador_1.
Saludos!

- 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.
xLatt
Aprendiz
Aprendiz
Mensajes: 2
Registrado: 12 Jun 2019 21:27
Reputación: 0

16 Jun 2019 21:50

Lamento la tardanza. Gracias por responder.
Eduardo_1 escribió:
14 Jun 2019 07:03
 Codigo Pawno:
1
2
3
4
5
6
7
8
9

public OnPlayerCommandReceived(playerid, cmdtext[])
{
    if(indm[playerid] == true  && strfind(cmdtext,"/salirdm",true) != -1)
    {
        SendClientMessage(playerid, -1, "Comandos bloqueados, usa /salirdm");
        return 0;
    }
    return 1;
}
  Cantidad de llaves: Abiertas(2)-Cerradas(2) | Lineas Totales: 9
con != -1 se pueden utilizar todos los comandos del GM, con == -1, e, == 0 (que es como lo tenia) si va perfecto, pero de nuevo, solo con los comandos propios del gamemode. En cuanto a los FS, algunos les aplica la restricción; como los que vienen por default con el servidor (con strcmp) y a otros no. Como el que puse en el post y otro FS que hice con zcmd para probar.

Gracias Mr.Dave por lo del array, no lo sabia. Lo tendré en cuenta la proxima.
Avatar de Usuario
MrDave
Ayudante
Ayudante
Mensajes: 1048
Registrado: 05 Oct 2017 12:13
Reputación: 113

17 Jun 2019 10:56

xLatt escribió:
16 Jun 2019 21:50
Lamento la tardanza. Gracias por responder.
Eduardo_1 escribió:
14 Jun 2019 07:03
 Codigo Pawno:
1
2
3
4
5
6
7
8
9

public OnPlayerCommandReceived(playerid, cmdtext[])
{
    if(indm[playerid] == true  && strfind(cmdtext,"/salirdm",true) != -1)
    {
        SendClientMessage(playerid, -1, "Comandos bloqueados, usa /salirdm");
        return 0;
    }
    return 1;
}
  Cantidad de llaves: Abiertas(2)-Cerradas(2) | Lineas Totales: 9
con != -1 se pueden utilizar todos los comandos del GM, con == -1, e, == 0 (que es como lo tenia) si va perfecto, pero de nuevo, solo con los comandos propios del gamemode. En cuanto a los FS, algunos les aplica la restricción; como los que vienen por default con el servidor (con strcmp) y a otros no. Como el que puse en el post y otro FS que hice con zcmd para probar.

Gracias Mr.Dave por lo del array, no lo sabia. Lo tendré en cuenta la proxima.
Lo correcto sería usar el == -1.
Con == 0 no funcionará.
Porqué si el jugador escribe /dm (asumiendo que es un comando válido), entonces cmdtext valdría "/dm" y la subcadena sería "/salirdm".
Al momento de comparar, dará como resultado -1. Porqué "/salirdm" no se encontró en la cadena principal y dejaría que el jugador pueda usar cualquier comando.
En cambio cuando el jugador escriba /salirdm, la condición se cumple y le saldrá el mensaje de error al jugador, porqué cmdtext valdría "/salirdm" y la subcadena "/salirdm", como la subcadena se encuentra en la cadena principal, devuelve 0.
Ese cero es la posición/índice donde está la primera letra de la subcadena "/salirdm".
Con respecto a los comandos que estén en un FS, debes usar un procesador de comandos para todos los casos. En tu situación debe ser zcmd.

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