Me pueden guiar un poco en esto?
#1

Buenas, he estado haciendo una especie de "base" para un sistema de inventario, reciйn empiezo a hacerlo, pero tengo lo siguiente, me he basado un poco en un sistema que he encontrado en un post del foro:
Код:
enum _InventarioItems
{
	_ItemID,
	_ItemNombre[24],
	_ItemModel,
	_ItemTipo
};

#define ITEM_COMIDA 1
#define ITEM_BEBIDA 2
#define ITEM_ARMA 3
#define ITEM_CONSUMIBLE 4

new const _Item[][_InventarioItems] = {
	{0,"Pizza",2814,ITEM_COMIDA},
	{1,"Soda",2647,ITEM_BEBIDA},
	{2,"Naranja",19574,ITEM_COMIDA},
	{3,"Banana",19578,ITEM_COMIDA},
	{4,"Manzana",19575,ITEM_COMIDA},
	{5,"Jugo de manzana",19564,ITEM_BEBIDA},
	{6,"Jugo de naranja",19563,ITEM_BEBIDA},
	{7,"Cereales",19562,ITEM_COMIDA},
	{8,"Kit de medicina",11738,ITEM_CONSUMIBLE},
	{9,"Leche",19570,ITEM_BEBIDA}
};
Ahora yo con esa informaciуn querrнa poder crear un objeto con dicha informaciуn en la misma variable de _Item para poder obtener la informaciуn de cada objeto en un futuro.

Se me ha ocurrido agregar '_ItemObjectID' al enum, pero no sй como aplicarlo en dicha variable para crear el objeto, no sй si me explico.
Код:
_Item[/*no sй que irнa acб*/][_ItemObjectID] = CreateObject
Aunque dentro de todo estoy dudando, no sй si ese '[]'
Код:
new const _Item[][_InventarioItems] = {
Estй de mбs.

Me gustarнa que alguien mбs experimentado en esto me pudiese dar una mano, desde ya muchнsimas gracias.
Reply
#2

Puedes trabajar de una de dos formas o de ambas formas al mismo tiempo, me refiero a lo siguiente:

En tu array "Soda" es el нndice 1 del array entonces al hacer _Item[1][_ItemModel] obtienes el modelo de la soda.

Tu podrias entonces:

#define ITEM_SODA 1

y posteriormente

_Item[ITEM_SODA][_ItemModel]

y obtendrias el modelo de la soda.. Sin embargo, en forma dinamica seria distinto (esto te brinda mas "facilidad" o flexibilidad pero al final le das un poquito mas de trabajo al codigo):

PHP код:
stock getItemByName(str[]) {
    for(new 
isizeof(_Item); i++ ) {
        if(!
strcmp(_Item[i][_ItemNombre], str)) {
            return 
i;
        }
    }
    return -
1;

y posteriormente para saber cual es el id de la soda

getItemByName("Soda") y obtienes 1 que es el id de la soda..

PHP код:
    new item[] = "Jugo de manzana";
    new 
id getItemByName(item);
    
printf("El item %s es el id %i"itemid); 
Ambos puedes complementarlos para ciertos casos de todas formas. En el lugar en que dices va a ir el indice al que quieres acceder para obtener ciertos datos.

Igual el _itemID esta de mas, ya que el indice te dice el id (la posicion) salvo que en el futuro agregues uno antes de ellos y corras todos los objetos por lo que tendrias que agregarlos delante y otra cosa que te recomiendo es que el primer indice de tu array de objetos agregues uno NULO

porque si tienes lo siguiente:

PHP код:
#define MAX_PLAYER_ITEMS 12
new items[MAX_PLAYERS][MAX_PLAYER_ITEMS];
CMD:item(playeridparams[]) {
    for(new 
iMAX_PLAYER_ITEMSi++ ) {
        if(!
items[playerid][i]) {
            
// no tiene item en ese index
        
}
    }

en tu array si tiene "Pizza" y lo haces de ese modo dira que no tiene ningun objeto en ese index, si lo dejas como esta tendrias que hacer el indice nulo sea un numero negativo como -1 pero para eso tendrias que setear el valor de cada index del array de objetos que posee el jugador a -1 (te restas el trabajo a cierto punto en el futuro para ciertas cosas que igualmente son peque;as)
Reply
#3

Muchas gracias, me aclaraste muchas dudas.
Ahora no sй si estarб bien asн, aunque ahora no entiendo el porque no puedo compilar al implementar tu cуdigo de 'getItemByName'
Код:
new const _Item[][_InventarioItems] = {
 	{},
	{"Pizza",2814,ITEM_COMIDA},
	{"Soda",2647,ITEM_BEBIDA},
	{"Naranja",19574,ITEM_COMIDA},
	{"Manzana",19575,ITEM_COMIDA},
	{"Jugo de manzana",19564,ITEM_BEBIDA},
	{"Jugo de naranja",19563,ITEM_BEBIDA},
	{"Cereales",19562,ITEM_COMIDA},
	{"Kit de medicina",11738,ITEM_CONSUMIBLE},
	{"Leche",19570,ITEM_BEBIDA}
};

new _ObjectsItems[MAX_ITEMS][_ItemObjectID],ultimoitem;

stock CrearItem(itemname[],Float:x,Float:y,:Float:z){
	new i = ultimoitem;
	if(i >= MAX_ITEMS) return print("El item no fue creado (lнmite alcanzado).");
	new id = getItemByName(itemname);
	switch(_Item[id][_ItemType]){
	    case ITEM_COMIDA,ITEM_BEBIDA:{
			_ObjectsItems[i][_ItemObjectID] = CreateObject(_Item[id][_ItemModel],x,y,z-1.0,0.0,0.0,0.0);
		}
		case ITEM_ARMA:{
		    _ObjectsItems[i][_ItemObjectID] = CreateObject(_Item[id][_ItemModel],x,y,-1.0,90.0,0.0,0.0);
		}
	}
	i++;
}
Reply
#4

al dejarlo nulo me referia que estableciaras valores que no sirvan en caso de que alguien tuviera el item (por mera tipicidad), porque si lo dejas como lo has dejado te dara errores
Reply
#5

Ya lo he arreglado, pero aъn no me deja compilar. "Pawn Compiler library dejу de funcionar", al retirar 'getItemByName', compila. їUna ъltima ayuda? Por favor, y muchas gracias por aclararme todo lo anterior. Te darнa reputaciуn pero no me deja darte.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)