Como hacer comandos con varias opciones
#1

Quisiera saber como puedo hacer comandos con varias opciones como por ejemplo usar /puerta id interior
ya que solo se crear comandos con 1 solo parametro, si me pueden ayudar o dar un ejemplo de alguno es que estoy creando el sistema de doors y me falta el comando para editarlos
Reply
#2

Код:
CMD:puerta(playerid, params[])
{
   if(strcmp("id", params, true) == 0)
   {
        SendClientMessage(playerid, -1, "ID");
   }

   if(strcmp("interior", params, true) == 0)
   {
        SendClientMessage(playerid, -1, "Interior");
   }

   return 1;
}
Reply
#3

Quote:
Originally Posted by F1N4L
Посмотреть сообщение
Код:
CMD:puerta(playerid, params[])
{
   if(strcmp("id", params, true) == 0)
   {
        SendClientMessage(playerid, -1, "ID");
   }

   if(strcmp("interior", params, true) == 0)
   {
        SendClientMessage(playerid, -1, "Interior");
   }

   return 1;
}
ID e interior no es estбtico, la idea es que se pueda elegir el ID y el interior.


pawn Код:
CMD:puerta(playerid, params[])
{
    new id, interior;
    if(!sscanf(params, "ri", id, interior))
    {
        //Funciуn
    }
    else SendClientMessage(playerid, -1 "Uso: /puerta [ID] [Interior]");
    return 1;
}
Reply
#4

Pero no solo es usar el interior tambien colocar otras funciones como el exterior, el nombre, he visto varios comandos que usan el strcmp pero de verdad que no se como hacer para que primero pida la ID correcta
Reply
#5

їTe refieres a йsto?

Код:
CMD:dar(playerid, params[])
{
	if(pInfo[playerid][jFaccion] == Zombie) return SCM(playerid, -1, "Debes ser un humano para usar este comando.");
    new texto[24];
	if(sscanf(params, "rs[24]i", params[0], texto, params[1]))
	{
		SCM(playerid, -1, "Modo de uso: /dar [ID] [Item] [Cantidad]");
		SCM(playerid, -1, "Utilidades: ejemplo1, ejemplo2, ejemplo3, etc...");
		return true;
	}
	if(params[0] == playerid) return SCM(playerid, -1, "No puedes darte utilidades a ti mismo");
	if(!IsPlayerConnected(params[0])) return SCM(playerid, -1, "Al jugador a quiйn quieres darle el item no estб conectado.");
    new Float:x, Float:y, Float:z;
	GetPlayerPos(params[1],	x, y, z);
	GetPlayerPos(playerid, x, y, z);
	if(!IsPlayerInRangeOfPoint(params[0], 7.0, x, y, z)) return SCM(playerid, -1, "Al jugador a quiйn quieres darle el item no estб cerca de tн.");
	if(params[1] <= 0) return SCM(playerid, -1, "Cantidad invбlida, nъmeros mayor a 1...");
    if(strcmp(texto,"ejemplo1",true) == 0)
	{
		// cуdigo.
	}
	else if(strcmp(texto,"ejemplo2",true) == 0)
	{
		// cуdigo.
	}
	else if(strcmp(texto,"ejemplo3",true) == 0)
	{
		// cуdigo.
	}
	else SCM(playerid, -1, "Item invбlido.")
	return true;
}
Reply
#6


Normalmente para no complicarte mucho usas sscanf.

pawn Код:
#include a_samp
#include sscanf
#include zcmd

enum _Interiores
{
    Float:intPos[3],
    intErior
}
new Interiores[][_Interiores] =
{
    {{0.0, 0.0, 0.0}, 15},
    {{0.0, 0.0, 0.0}, 3},
    {{0.0, 0.0, 0.0}, 16}
};

COMMAND:puerta(playerid, args[])
{
    new id, opcion[24];
    if(sscanf(args, "ds[24]", id, opcion))
        return SendClientMessage(playerid, -1, "Use /interior [ID][Opciуn]");
       
    if(!(0 <= id <= (sizeof(Interiores)-1)))
        return SendClientMessage(playerid, -1, "IDs: 0 al 2");
       
    if(strfind(opcion, "interior", true) != -1)
    {
       
    }
    else if(strfind(opcion, "exterior", true) != -1)
    {
       
    }
    else
    {
        SendClientMessage(playerid, -1, "Opciones: interior, exterior");
    }
    return 1;
}
Reply
#7

Editado, termine el comando pero no me funciona aun no se como verificar la ID de la puerta que quiero editar

Код:
CMD:puerta(playerid, params[])
{
	new id, opcion[24];
	if(sscanf(params, "ds[24]", id, opcion)) return SendClientMessage(playerid, COLOR_BLANCO, "Uso correcto, /puerta id opciуn");
	if(id < 0 || id >= MAX_DOORS) return SendClientMessage(playerid, COLOR_ROJO, "ERROR: {C7C7C7} Especifica un ID valido de una puerta.");
	if(strcmp(opcion, "Interior", true) == 0)
	{
		GetPlayerPos(playerid, DoorInfo[id][dIntX], DoorInfo[id][dIntY], DoorInfo[id][dIntZ]);
		GetPlayerFacingAngle(playerid, DoorInfo[id][dIntA]);
		DoorInfo[id][dInterior] = GetPlayerInterior(playerid);
		DoorInfo[id][dInteriorVW] = GetPlayerVirtualWorld(playerid);
		GuardarEntradas(id);
		SendClientMessage(playerid, COLOR_AMARILLO, "Modificaste el interior de la puerta.");
	}
	else if(strcmp(opcion, "Exterior", true) == 0)
	{
		GetPlayerPos(playerid, DoorInfo[id][dPosX], DoorInfo[id][dPosY],DoorInfo[id][dPosZ]);
		DoorInfo[id][dVirtualWorld] = GetPlayerVirtualWorld(playerid);
		ActualizarEntrada(id);
		GuardarEntradas(id);
		SendClientMessage(playerid, COLOR_AMARILLO, "Modificaste el exterior de la puerta.");
	}
	else if(strcmp(opcion, "Nombre", true) == 0)
	{
	    new nombre[36];
	    if(sscanf(params, "s[36]", nombre)) return SendClientMessage(playerid, COLOR_BLANCO, "Uso correcto, /puerta id nombre");
	    format(DoorInfo[id][dNombre], 36, nombre);
		ActualizarEntrada(id);
		GuardarEntradas(id);
		SendClientMessage(playerid, COLOR_AMARILLO, "Modificaste el nombre de la puerta.");
	}
	else if(strcmp(opcion, "Seguro", true) == 0)
	{
		if(DoorInfo[id][dPuerta])
		{
			DoorInfo[id][dPuerta] = true;
			ActualizarEntrada(id);
			GuardarEntradas(id);
			SendClientMessage(playerid, COLOR_AMARILLO, "ЎAbriste la puerta!");
		}
		else
		{
			DoorInfo[id][dPuerta] = false;
			ActualizarEntrada(id);
			GuardarEntradas(id);
			SendClientMessage(playerid, COLOR_AMARILLO, "ЎCerraste la puerta!");
		}
	}
	return 1;
}
Reply
#8

Asi puedes hacer comandos con multiples opciones y parametros distintos para cada uno de ellos (fue hecho de manara mas amigable y sencillo para el usuario, por ejemplo, al poner /cmd 1st, te da el uso del opcion "1st"):
pawn Код:
// ** INCLUDES

#include <a_samp>
#include <sscanf>
#include <zcmd>

// ** DEFINES

// *** FUNCTIONS

#define isnull(%1) ((!(%1[0])) || (((%1[0]) == '\1') && (!(%1[1]))))
#define strcpy(%0,%1,%2) strcat((%0[0] = '\0', %0), %1, %2)

// ** MAIN

main()
{
    print("Loaded \"one_command_multiple_syntaxes.amx\".");
}

// ** CALLBACKS

public OnGameModeInit()
{
    return 1;
}

public OnGameModeExit()
{
    return 1;
}

// ** COMMANDS

CMD:cmd(playerid, params[])
{
    new space_pos = strfind(params, " ", true), option[128];
    if(space_pos != -1)
    {
        strmid(option, params, 0, space_pos);
    }
    else
    {
        strcpy(option, params, 128);
    }

    if(isnull(option))
    {
        SendClientMessage(playerid, -1, "Usage: /cmd (1st/2nd/3rd) [arguments]");
    }
    else if(!strcmp(option, "1st", true))
    {
        new integer_1;
        if(sscanf(params, "{s[128]}i", integer_1))
        {
            SendClientMessage(playerid, -1, "Usage: /cmd 1st (integer)");
        }
        else
        {
            new string[144];
            format(string, sizeof(string), "Integer 1: %d", integer_1);
            SendClientMessage(playerid, -1, string);
        }
    }
    else if(!strcmp(option, "2nd", true))
    {
        new integer_1, integer_2;
        if(sscanf(params, "{s[128]}ii", integer_1, integer_2))
        {
            SendClientMessage(playerid, -1, "Usage: /cmd 2nd (integer) (integer)");
        }
        else
        {
            new string[144];
            format(string, sizeof(string), "Integer 1: %d, integer 2: %d", integer_1, integer_2);
            SendClientMessage(playerid, -1, string);
        }
    }
    else if(!strcmp(option, "3rd", true))
    {
        new integer_1, integer_2, integer_3;
        if(sscanf(params, "{s[128]}iii", integer_1, integer_2, integer_3))
        {
            SendClientMessage(playerid, -1, "Usage: /cmd 2nd (integer) (integer) (integer)");
        }
        else
        {
            new string[144];
            format(string, sizeof(string), "Integer 1: %d, Integer 2: %d, Integer 3: %d", integer_1, integer_2, integer_3);
            SendClientMessage(playerid, -1, string);
        }
    }
    else
    {
        SendClientMessage(playerid, -1, "Usage: /cmd (1st/2nd/3rd) [arguments]");
    }
    return 1;
}
Reply
#9

Alguien me puede ayudar con la condiciуn de la ID no me funciona con la que hice, funciona pero por 1 numero menos y no me da el error de que la ID no existe. uso esto
Код:
if(id < 0 || id >= MAX_DOORS) return SendClientMessage(playerid, COLOR_ROJO, "ERROR: {C7C7C7}Especifica un ID valido de una entrada.");
PD: Agradezco sus repuesta me ayudaron a entender como hacer el comando!
Reply
#10

if(id < 0 || id >= MAX_DOORS)

>= Mayor o igual quй.

Cбmbialo por >, que es mayor quй.
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)