20.12.2013, 02:39
(
Последний раз редактировалось Galileo; 20.12.2013 в 18:03.
Причина: [PAWN] code optimization + Credits added
)
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:
(Si no tienen alguno de esos includes, buscar en el foro y descargar ya que son necesarios)
Paso 2:
Vamos a definir lo siguiente:
Paso 3:
Vamos a crear un enum para almacenar la informacion de cada negocio(precio,coordenadas,etc.):
Paso 4:
Crearemos comandos de '/entrar' y '/salir' al negocio:
Paso 5:
Crearemos el comando '/crearnegocio' que sera usado por el Admin RCON para crear los negocios IG:
Paso 6:
Continuaremos a crear el comando '/comprarcasa', que sera utilizado por los jugadores:
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':
Paso 8:
Definiremos 'ActualizarBiz' que sera la funcion que actualizara la informacion de los negocios:
Paso 9:
Por ultimo, agreguen la funcion para cargar los negocios en 'OnGameModeInit':
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.
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>
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
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
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;
}
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;
}
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;
}
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;
}
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.