Sistema de materiales para sacar arma
#1

Hola,

Estoy haciendo un sistema de materiales para luego crear armas con ellos. Me ha salido bien pero mal, he conseguido hacer un comando que le a mi jugador 100 materiales pero creo que tengo que salir y entrar para que se me guarde en el archivo del usuario:

1. Pongo la variable

Код:
new giveplayerid;
2. Agrego el comando

Код:
CMD:paquete(playerid, params[])
{
  InfoJugador[giveplayerid][pMateriales] = 100;
  SendClientMessage(playerid, 0xFF0000, "Has obtenido 100 materiales para crear un arma");
  return 1;
}
Entonces los 100 materiales los tengo pero he tenido que salir y entrar para que se se cargaran en el usuario. Evidentemente prefiero que los tenga al momento sin tener que salir y poder usarlos.

Un saludo!
Reply
#2

Lo primero es lo siguiente:

El comando solo le darб los materiales al usuario con ID 0, ya que le estбs modificando la variable a "giveplayerid" que su valor es de 0. Deberнas de utilizar "playerid". Utilizando esto se aplicarб al jugador que utilize el comando.

pawn Код:
InfoJugador[playerid][pMateriales] = 100;
Otro punto importante es que si el jugador tiene 50 materiales y utiliza el comando perderб los 50 y se quedarб en 100 pues le estбs asignando ese valor. Para solucionar esto solo tienes que sumarle el valor actual de la variable + 100, y puedes hacerlo de dos formas.

pawn Код:
InfoJugador[playerid][pMateriales] += 100; // Opciуn 1
InfoJugador[playerid][pMateriales] = InfoJugador[playerid][pMateriales] + 100; // Opciуn 2
Lo del cargado no deberнa sucederte, comprueba que cargas bien la variable en el comando que vayas a utilizar. Ejemplos:

pawn Код:
CMD:mats(playerid, params[])
{
    // Imprimimos en consola los materiales que tiene el jugador que ha ejecutado el comando
    printf("Tienes %i materiales", InfoJugador[playerid][pMateriales]);
    return 1;
}
pawn Код:
CMD:arma(playerid, params[])
{
    // Condiciуn: Si tiene 50 o mбs materiales...
    if (InfoJugador[playerid][pMateriales] >= 50)
    {
        // Le resta 50 materiales de los que tiene
        InfoJugador[playerid][pMateriales] -= 50;
        // Imprime en consola un mensaje informativo
        printf("El usuario ID %i ha gastado 50 materiales, ahora tiene %i materiales", playerid, InfoJugador[playerid][pMateriales]);
    }
    // Si no tiene 50 materiales o mбs
    else
        // Imprime en consola un mensaje informativo
        printf("El usuario ID %i no tiene 50 materiales", playerid);
    return 1;
}
Reply
#3

Muchas gracias unuky. Voy a hacer la pregunta mбs tonta del mundo pero me da igual jaja:

En: ">=" de:

if (InfoJugador[playerid][pMateriales] >= 50)

Es simplemente mayor que їNo? es lуgico pero claro acostumbro en Linux cuando scripteas en sh serнa mayor o igual, en este caso el "=" simplemente estб refiriйndose que es a 50 supongo. Para que por ejemplo sea igual a 50 tendrнas que poner "==" o algo asн, corregidme si me estoy confundiendo por favor.
Reply
#4

== 50: Igual a 50.
>= 50: 50 o mбs (igual o mayor a 50)
> 50: 51 o mбs (mayor a 50)
Reply
#5

Quote:
Originally Posted by Glimma
Посмотреть сообщение
== 50: Igual a 50.
>= 50: 50 o mбs (igual o mayor a 50)
> 50: 51 o mбs (mayor a 50)
Perfecto, menos mal porque entonces me harнa un lio con los operadores. Gracias.



P,D: Para no hacer doble-post ni crear otro nuevo...

їConocen alguna funciуn que pueda usar para que pueda elegir los materiales que quiera, en plan /paquete 20, /paquete 500, etcйtera. Evidentemente que por cada 1 material te quite cierta cantidad de dinero.

Por favor, la funciуn no quiero que me hagan ningъn script!

Gracias
Reply
#6

Haces el comando y sacas los parбmetros, en el caso de ZCMD es params. El parбmetro en este caso serнa el nъmero de materiales. El problema es que este sale en forma de string, por lo que tienes que pasarlo a interger usando la funciуn strval. Para el precio solo tienes que quitarle el dinero por ejemplo multiplicando cantidad de materiales por 500, entonces serнa 500 por material. Ejemplo del parбmetro:

pawn Код:
CMD:paquete(playerid, params[]) // /paquete [Materiales]
{
    // Hago una variable que le asigno el valor params convertido a integer
    new mats = strval(params);
    return 1;
}

Hay una forma mбs fбcil de sacar los parбmetros, es usando sscanf, aunque en realidad no sй si es mejor o peor que como te he dicho, solo se que esto es lo que mas se utiliza en estos casos.

https://sampforum.blast.hk/showthread.php?tid=120356
https://github.com/Y-Less/sscanf/wik...nners-Tutorial
Reply
#7

Yo prefiero utilizar 'strcmp':
pawn Код:
CMD:prueba(playerid, params[])
{
    if(!strcmp(params, "primertexto", true)) // si pone /prueba primertexto
    {
        // funciones que se ejecutaran
        SendClientMessage(playerid, -1, "Hola, soy el primer texto");
    }
    else if(!strcmp(params, "segundotexto", true)) // si pone /prueba segundotexto
    {
        // funciones que se ejecutaran
        SendClientMessage(playerid, -1, "Hola, soy el segundo texto");
    } else SendClientMessage(playerid, -1, "Utiliza /prueba [Texto]"); //Si puso una opciуn invalida le manda error.
    return 1;
}
Reply
#8

Muchas gracias, me tengo que aprender bien todo el tema de las estructuras con los brackets etcйtera... lo que no encuentro ninguna guнa jaja.

Gracias nuevamente!
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)