[Tutorial] Crear Sistema de Negocios Adquiribles! (Parte 1)
#1

Hola a todos!
Les traigo un tutorial que se que a muchos les servira de gran manera!


Nota: Antes de empezar, no me importa que usen el codigo en su Gamemode obviamente, pero si comparten el tutorial en otros foros,etc. usen el link al original y den creditos!

Paso 1:

Arriba del gamemode pongan lo siguiente:
pawn Код:
#include <a_samp>
#include <YSI\y_ini>
#include <foreach>
#include <zcmd>
#include <sscanf2>
(Si no tienen alguno de esos includes, buscar en el foro y descargar ya que son necesarios)

Paso 2:

Vamos a definir lo siguiente:
pawn Код:
#define MAX_BIZS 100 // numero maximo de negocios que se podran crear

new PickupBiz[MAX_BIZS]; // pickup del negocio
new Text3D:LabelBiz[MAX_BIZS]; // label de texto del negocio
new Iterator:fBizs<MAX_BIZS>;//declaracion a foreach para los negocios
Paso 3:

Vamos a crear un enum para almacenar la informacion de cada negocio(precio,coordenadas,etc.):
pawn Код:
enum InfoB//nombre del enum
{
   Dueno[MAX_PLAYER_NAME],//el dueсo del negocio
   Precio,//almacenamos el precio del negocio
   Nivel,//el nivel..
   Stock,//el stock, o capacidad de items en venta
   Float:Entrada_x,//las cordenadas del interior y exterior
   Float:Entrada_y,
   Float:Entrada_z,
   Float:Salida_x,
   Float:Salida_y,
   Float:Salida_z,
   Int,//el interior
   VW,//el vw
   bool:Comprado//si se compro o no
}

new Biz[MAX_BIZS][InfoB];//el array de los negocios
Paso 4:

Crearemos comandos de '/entrar' y '/salir' al negocio:
pawn Код:
CMD:entrar(playerid,params[])
{
   if(!GetPlayerInterior(playerid))//solo si no esta en un interior
   {
       foreach(fBizs,i)//el loop foreach
       {
           if(IsPlayerInRangeOfPoint(playerid,2,Biz[i][Entrada_x],Biz[i][Entrada_y],Biz[i][Entrada_z]))
           {//busca entre todos los biz a ver si el player se encuentra en alguno
               SetPlayerInterior(playerid,Biz[i][Int]);//lo manda al interior del biz
               SetPlayerVirtualWorld(playerid,Biz[i][VW]);//lo manda al vw del biz
               SetPlayerPos(playerid,Biz[i][Salida_x],Biz[i][Salida_y],Biz[i][Salida_z]); // Envia al jugador a las coordenadas de salida
           new msg[128];// Mandamos mensaje de bienvenida al local
           format(msg,128,"Has entrado al negocio de %s!",Biz[i][Dueno]);
           SendClientMessage(playerid,-1,msg);
               return 1;//retornamos el loop, recorre las demas ids
           }
       }
   }
   return 1;
}

CMD:salir(playerid,params[])
{
   if(GetPlayerInterior(playerid) && GetPlayerVirtualWorld(playerid) >= 100)//solo si esta en un biz
   {
       foreach(fBizs,i)//el loop
       {
           if(IsPlayerInRangeOfPoint(playerid,2,Biz[i][Salida_x],Biz[i][Salida_y],Biz[i][Salida_z]) && (GetPlayerVirtualWorld(playerid) == Biz[i][VW]))
           {//busca entre todos los biz a ver si el player esta en alguno
               SetPlayerInterior(playerid,0);//le da el interior 0
               SetPlayerVirtualWorld(playerid,0);//le da el virtualworld 0
               SetPlayerPos(playerid,Biz[i][Entrada_x],Biz[i][Entrada_y],Biz[i][Entrada_z]); // Envia al jugador a las coordenadas de entrada
               return 1;//retornamos el loop, recorre las demas ids
           }
       }
   }
   return 1;
}
Paso 5:

Crearemos el comando '/crearnegocio' que sera usado por el Admin RCON para crear los negocios IG:
pawn Код:
CMD:crearnegocio(playerid,params[])
{
   if(!IsPlayerAdmin(playerid)) return 0;//solo si el player es el admin RCON
   new Float:eX,Float:eY,Float:eZ;
   new pPrecio,pNivel,pInt,pStock;
   if(sscanf(params,"iiiifff",pPrecio,pNivel,pStock,pInt,eX,eY,eZ)) return SendClientMessage(playerid,-1,"/crearnegocio [precio] [nivel] [stock] [interior] [cordenada x interior] [cordenada y interior] [cordenada z interior]");
   new i = SlotBizLibre();//almacena en "i" un slot de biz que este vacante
   if(i == -1) return SendClientMessage(playerid,-1,"ЎNo se pueden crear mбs negocios! (MБXIMO "#MAX_BIZS")");//slotbiz retorna -1 si no encuentra espacio
   GetPlayerPos(playerid,Biz[i][Entrada_x],Biz[i][Entrada_y],Biz[i][Entrada_z]); //almacenamos en esas arrays las coordeandas del PJ
   Biz[i][Salida_x] = eX;//almacenamos las cordenadas de los paremetros introducidos con el comando
   Biz[i][Salida_y] = eY;
   Biz[i][Salida_z] = eZ;
   Biz[i][Precio] = pPrecio;
   Biz[i][Nivel] = pNivel;
   Biz[i][Stock] = pStock;
   Biz[i][Int] = pInt;
   Biz[i][VW] = i+100;//el id del biz + 100
   PickupBiz[i] = CreatePickup(1272,1,Biz[i][Entrada_x],Biz[i][Entrada_y],Biz[i][Entrada_z]);//creamos un pickup con las coords del biz
   new Str[128];
   format(Str,sizeof Str,"Negocio en venta\nNivel: %d\nPrecio: %d",pNivel,pPrecio); //Contenido para la text label
   LabelBiz[i] = Create3DTextLabel(Str,0xFFFFFFFF,Biz[i][Entrada_x],Biz[i][Entrada_y],Biz[i][Entrada_z],20,0);// crea la text label junto con el pickup con info del negocio
   Iter_Add(fBizs,i);//agregamos el valor al loop de foreach.
   ActualizarBiz(i);//guarda el archivo .ini, (forma de almacenamiento de datos)
   print(" Admin %s | ID: %d | Precio %d | VW: %d | Int: %d | Stock %d "); // Imprime en la consola el nombre del admin, y info del negocio creado
   return 1;
}

//y el stock SlotBizLibre
stock SlotBizLibre()
{
   for(new i; i < MAX_BIZS; i++)
   {
       if(!strlen(Biz[i][Dueno]) && !Biz[i][Salida_x] && !Biz[i][Salida_z]) //Si el numero de MAX_BIZS no es el 'siguiente', le asigna un valor al negocio creado
       {
           return i;
      }
   }
   return -1;
}

Paso 6:

Continuaremos a crear el comando '/comprarcasa', que sera utilizado por los jugadores:
pawn Код:
CMD:comprarnegocio(playerid,params[])
{
   if(!GetPlayerInterior(playerid))//solo si no esta en un interior
   {
       foreach(fBizs,i)//el loop
       {
           if(IsPlayerInRangeOfPoint(playerid,2,Biz[i][Entrada_x],Biz[i][Entrada_y],Biz[i][Entrada_z]))
           {//busca entre todos los biz a ver si el player esta en las coords de alguno
            if(Biz[i][Comprado]) return SendClientMessage(playerid,-1,"ЎEste negocio ya tiene dueсo!");
            if(GetPlayerScore(playerid) < Biz[i][Nivel]) return SendClientMessage(playerid,-1,"ЎNo tienes el nivel suficiente!");//restringimos nivel, dinero
            if(GetPlayerMoney(playerid) < Biz[i][Precio]) return SendClientMessage(playerid,-1,"ЎNo tienes el dinero suficiente!");
            Biz[i][Comprado] = true; // si todo esta ok, verificamos que compro el negocio y lo almacenamos en la variable
            GetPlayerName(playerid,Biz[i][Dueno],24);//almacenamos el nombre del dueсo del negocio
            GivePlayerMoney(playerid,-Biz[i][Precio]);//resta el dinero para la compra
            GameTextForPlayer(playerid,"~w~Negocio ~r~adquirido!",3000,1);//manda mensaje al comprador
            Delete3DTextLabel(LabelBiz[i]);
            new Str[128];//actualizamos la label
            format(Str,sizeof Str,"Negocio de %s\nID:%d",Biz[i][Dueno],i);
            LabelBiz[i] = Create3DTextLabel(Str,0xFFFFFFFF,Biz[i][Entrada_x],Biz[i][Entrada_y],Biz[i][Entrada_z],20,0);
            ActualizarBiz(i);//guarda el archivo .ini
            return 1;
         }
      }
   }
   return 1;
}
Paso 7:

Continuaremos a crear el 'CargarBizs' que cargara cada negocio creado, y tambien a la funcion que lee del archivo INI de cada negocio 'CargarBiz_data':
pawn Код:
stock CargarBizs()
{
   new BArch[22],b;
   print("\t\tCargando negocios ...\n");
   while(b < MAX_BIZS)//el loop
   {
       format(BArch,sizeof(BArch),"Bizs/%d.ini",b);//el destino para cargar
       if(fexist(BArch))//si existe el archivo formateado
       {
         INI_ParseFile(BArch,"CargarBiz_%s",.bExtra = true, .extra = b);//carga del archivo INI
         printf("Dueсo: %s | Precio: $%d",Biz[b][Dueno],Biz[b][Precio]);
         Iter_Add(fBizs, b);
         if(Biz[b][Comprado]) //Si el negocio esta comprado, carga la label con los datos
         {
            new Str[128];//creamos el label
            format(Str,sizeof Str,"Negocio de %s",Biz[b][Dueno]);
            LabelBiz[b] = Create3DTextLabel(Str,0xFFFFFFFF,Biz[b][Entrada_x],Biz[b][Entrada_y],Biz[b][Entrada_z],20,0);
         }
         else
         {// Si esta a la venta carga la label como 'en venta'
            new Str[128];
            format(Str,sizeof Str,"Casa en venta\nNivel: %d\nPrecio: %d",Biz[b][Nivel],Biz[b][Precio]);
            LabelBiz[b] = Create3DTextLabel(Str,0xFFFFFFFF,Biz[b][Entrada_x],Biz[b][Entrada_y],Biz[b][Entrada_z],20,0);
         }
         PickupBiz[b] = CreatePickup(1272,1,Biz[b][Entrada_x],Biz[b][Entrada_y],Biz[b][Entrada_z]);//creamos un pickup con las cords del biz.
       }
       b++;
   }
   return 1;
}

forward CargarBiz_data(i,name[],value[]);

public CargarBiz_data(i,name[],value[])
{
   /* Ahi, cargamos los datos, segun sean Float, bool, o string */

   INI_Int("Precio",Biz[i][Precio]);
   INI_Int("Nivel",Biz[i][Nivel]);
   INI_Int("Stock",Biz[i][Stock]);

   INI_Float("Entrada_x",Biz[i][Entrada_x]);
   INI_Float("Entrada_y",Biz[i][Entrada_y]);
   INI_Float("Entrada_z",Biz[i][Entrada_z]);

   INI_Float("Salida_x",Biz[i][Salida_x]);
   INI_Float("Salida_y",Biz[i][Salida_y]);
   INI_Float("Salida_z",Biz[i][Salida_z]);

   INI_Int("Interior",Biz[i][Int]);
   INI_Int("VirtualWorld",Biz[i][VW]);

   INI_Bool("Comprado",Biz[i][Comprado]);
   
   INI_String(Biz[i][Dueno],Biz[i][Dueno],MAX_PLAYER_NAME);
   return 1;
}
Paso 8:

Definiremos 'ActualizarBiz' que sera la funcion que actualizara la informacion de los negocios:
pawn Код:
stock ActualizarBiz(i)
{
   new BArch[19];
   format(BArch,sizeof(BArch),"Bizs/%d.ini",i);//el destino para guardar
   new INI:Arch = INI_Open(BArch);

   INI_SetTag(Arch,"data");//el TAg con el que lo leeremos al archivo (en el ini saldrб [data])
   INI_WriteString(Arch,"Dueсo",Biz[i][Dueno]);
   //aca escribimos el archivo segun las variables.
   INI_WriteInt(Arch,"Precio",Biz[i][Precio]);
   INI_WriteInt(Arch,"Nivel",Biz[i][Nivel]);
   INI_WriteInt(Arch,"Stock",Biz[i][Stock]);

   INI_WriteFloat(Arch,"Entrada_x",Biz[i][Entrada_x]);
   INI_WriteFloat(Arch,"Entrada_y",Biz[i][Entrada_y]);
   INI_WriteFloat(Arch,"Entrada_z",Biz[i][Entrada_z]);

   INI_WriteFloat(Arch,"Salida_x",Biz[i][Salida_x]);
   INI_WriteFloat(Arch,"Salida_y",Biz[i][Salida_y]);
   INI_WriteFloat(Arch,"Salida_z",Biz[i][Salida_z]);

   INI_WriteInt(Arch,"Interior",Biz[i][Int]);
   INI_WriteInt(Arch,"VirtualWorld",Biz[i][VW]);

   INI_WriteBool(Arch,"Comprado",Biz[i][Comprado]);
   INI_Close(Arch);//cerramos el archivo
   return 1;
}
Paso 9:

Por ultimo, agreguen la funcion para cargar los negocios en 'OnGameModeInit':
pawn Код:
CargarBizs();


Bueno, ese es el fin de la parte 1 por ahora. En la proxima parte les traere comandos como '/comprar', '/borrarnegocio', '/vendernegocio' y otros, que por asuntos de tiempo y otros proyectos/tutoriales en simultaneo no puedo brindarles en el momento.

Igual, cualquiera puede hacerse los comandos si tiene los conocimientos necesarios (que no son muy altos) como '/comprar' '/borrarnegocio' y '/vendernegocio'.

Ademas, se viene la utilizacion de la variable "stock", pero mejor lo dejo de sorpresa eso


Por favor digan si los ayude, y acuerdense, usar en su servidor sin creditos - tranquilamente, postear en otros foros sin link a este post - no definitivamente no.

PD: Gracias OTACON por indicarme la seccion correcta

PD2: Creditos 50% a Spell por basarme en su "CargarBizs" y funciones que involucran el cargado de archivos ini.
Reply
#2

Excelente tutorial! le servirб a algunos. Te recomiendo usar [pawn] en vez de [code] para mejorar un poco la lectura de los cуdigos.
Reply
#3

buen tutorial, le servira a los nuevos .
saludos.
Reply
#4

Quote:
Originally Posted by OTACON
Посмотреть сообщение
buen tutorial, le servira a los nuevos .
saludos.
Quote:
Originally Posted by LuiisRubio
Посмотреть сообщение
Excelente tutorial! le servirб a algunos. Te recomiendo usar [pawn] en vez de [code] para mejorar un poco la lectura de los cуdigos.
Gracias a los 2, el codigo es ahora pawn para mejor facilidad al leer y una mejor estetica en general del post. Y si, la idea es que le serviria a todos los nuevos que quieren armar su RP de a poco y de cero.

Saludos!
Reply
#5

oye! que bien. buen tutorial. yo pondrнa menos lineas y crearнa "EntradaXYZ" y "SalidaXYZ" y todas las coordenadas se encontrarбn alli, seguido se cargan con sscanf, en mi tutorial deje algo parecido a eso.
Reply
#6

Quote:
Originally Posted by Adoniiz
Посмотреть сообщение
oye! que bien. buen tutorial. yo pondrнa menos lineas y crearнa "EntradaXYZ" y "SalidaXYZ" y todas las coordenadas se encontrarбn alli, seguido se cargan con sscanf, en mi tutorial deje algo parecido a eso.
No es mala la idea, pero la razon por la que separe el x,y,z es para despues poder acceder y/o modificar a cada uno individualmente.


Saludos!
Reply
#7

Buen tutorial!

Quote:
Originally Posted by Adoniiz
Посмотреть сообщение
oye! que bien. buen tutorial. yo pondrнa menos lineas y crearнa "EntradaXYZ" y "SalidaXYZ" y todas las coordenadas se encontrarбn alli, seguido se cargan con sscanf, en mi tutorial deje algo parecido a eso.
Si lo quieres hacer asн yo creo que serнa mбs sencillo haciendo: Float:EntradaXYZ[3], Entonces despuйs te quedarнa Biz[id][EntradaXYZ][0], Biz[id][EntradaXYZ][1], etc.
Reply
#8

Es de spell identico al tutorial Sistema de casas desde 0...
Reply
#9

Quote:
Originally Posted by deryan
Посмотреть сообщение
Es de spell identico al tutorial Sistema de casas desde 0...
Es parecido porque las partes de el cargado de archivos ini me base en el, lo demas es mio. Pd: Si te tomaras la molestia de leer el titulo te darias cuenta de que es de negocios, y si leyeras mas abajo incluira en la 2da parte como borrarlos, venderlos y submisiones involucrando la variable stock
Reply
#10

Si lo leн pero bueno al menos debes decir que te basaste en el, en fin es bueno, saludos!
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)