#if !defined MAX_INV_OBJ
#define MAX_INV_OBJ 50 //Wie viele Objekte maximal erstellt werden
#endif
#if !defined MAX_INV_SLOT
#define MAX_INV_SLOT 10 //Wie groß das Inventar ist
#endif
/******************************************************************************/
enum
{
INV_EMPTY,
//Alle Items unter dem hier
INV_CARD,
INV_DEAGLE,
//Alle Items über dem hier
INV_MAX_ID
};
/******************************************************************************/
stock const e_inv_objs[] = { //Jeder Slot muss ein Objekt Model haben (auch wenn es nie verwendet wird)
1581, //Some Card
348 //Deagle
};
/******************************************************************************/
enum _e_inv {
_e_ref,
_e_name
};
enum _e__obj {
_e_item,
_e_item_ref,
_e_objID
};
new Inventar[MAX_PLAYERS][MAX_INV_SLOT][e_inf], Inv_Obj[MAX_INV_OBJ][_e__obj];
/******************************************************************************/
stock GivePlayerItem(playerid,item,sqlid=0) //sqlid = PlayerID in Database | Damit Konto & Karte z.B. verknüpft sind (optional)
{
if(item < 0 || item >= INV_MAX_ID) return 0;
new slot = GetFreeItemSlot(playerid);
if(slot == -1) return -1;
Inventar[playerid][slot][_e_name] = item,
Inventar[playerid][slot][_e_ref] = sqlid;
return 1;
}
stock RemoveItemFromPlayer(playerid,slot)
{
if(slot < 0 || slot >= MAX_INV_SLOT) return 0;
Inventar[playerid][slot][_e_ref] = Inventar[playerid][slot][_e_name] = 0;
return 1;
}
stock StealItemFromPlayer(playerid,forplayer,slot) //To rob player
{
if(item < 0 || item >= INV_MAX_ID) return 0;
if(!Inventar[playerid][slot][_e_name]) return 0;
new c = GetFreeItemSlot(forplayer);
if(c == -1) return -1;
Inventar[forplayer][c][_e_ref] = Inventar[playerid][slot][_e_ref],
Inventar[forplayer][c][_e_name] = Inventar[playerid][slot][_e_name],
RemoveItemFromPlayer(playerid,slot);
return 1;
}
stock CreateObjectFromItem(playerid,slot)
{
if(!Inventar[playerid][slot][_e_name]) return 0;
new o = GetFreeObjSlot();
if(o == -1) return -1;
new Float:x,Float:y,Float:z;
GetObjectPos(playerid,x,y,z),
Inv_Obj[o][_e_item] = Inventar[playerid][slot][_e_name],
Inv_Obj[o][_e_item_ref] = Inventar[playerid][slot][_e_ref],
Inv_Obj[o][_e_objID] = CreateObject(e_inv_objs[Inv_Obj[o][_e_item]-1],x,y,z,0,0,0), //Sollte zu CreateDynamicObject (oder nutze Pickups)
RemoveItemFromPlayer(playerid,slot);
return 1;
}
stock GivePlayerItemFromObject(playerid,o)
{
if(!Inv_Obj[o][_e_item]) return 0;
new slot = GetFreeItemSlot(playerid);
if(slot == -1) return -1;
Inventar[playerid][slot][_e_name] = Inv_Obj[o][_e_item],
Inventar[playerid][slot][_e_ref] = Inv_Obj[o][_e_item_ref];
DestroyObject(Inv_Obj[o][_e_objID]); //Evtl DestroyDynamicObject | Oder DestroyPickup
Inv_Obj[o][_e_item] = Inv_Obj[o][_e_item_ref] = 0;
return 1;
}
/******************************************************************************/
stock GetFreeItemSlot(playerid)
{
for(new i; i<MAX_INV_SLOT; i++) if(!Inventar[playerid][i][_e_name]) return i;
return -1;
}
stock GetFreeObjSlot()
{
for(new i; i<sizeof(Inv_Obj); i++) if(!Inv_Obj[i][_e_item]) return i;
return -1;
}
Alles anzeigen
Mal hier bisschen Pseudo-Code für die Nutzung:
GivePlayerItem(playerid, INV_DEAGLE); //Muss keine SQLid angegeben werden.
GivePlayerItem(playerid, INV_CARD, PlayerInfo[playerid][pSQLid]);
Als Parameter siehst du oft slot.
Da jemand ja mehrere Items haben kann, muss natürlich immer der richtige slot ausgewählt werden.
Musst halt durch den Spieler loopen und dann z.B. schauen, ob _e_item == INV_CARD && _e_ref == PlayerInfo[playerid][pSQLid]
Dann weißt du z.B. auch wenn er andere Kreditkarten hat, das wäre seine xD
Musst halt noch etwas Arbeit da rein stecken, aber ich denke, das Prinzip sollte klar sein.
Ansonsten einfach nochmal Fragen.
Die Speicherung von den Items kannst du ungefähr so machen: (Die table dann halt eben so aufbauen, denke das ist obvious? xD)
//Zum Speichern des User-Inventars
("DELETE FROM `inventar` WHERE `userID`='%d'",PlayerInfo[playerid][pSQLid])
for(new i; i<MAX_INV_SLOT; i++)
{
if(!Inventar[playerid][i][_e_name]) continue;
("INSERT INTO `inventar` (`userID`,`ref_ID`,`item`) VALUES ('%d','%d','%d')",PlayerInfo[playerid][pSQLid],Inventar[playerid][i][_e_ref],Inventar[playerid][i][_e_name])
}
Zum Laden dann:
("SELECT * FROM `inventar` WHERE `userID`='%d'",PlayerInfo[playerid][pSQLid])
//und dann halt loopen
for(new i; i<rows; i++)
{
Inventar[playerid][i][_e_name] = cache_get_int(i, "item"); //Pseudo-Code
Inventar[playerid][i][_e_ref] = cache_get_int(i, "ref_ID"); //Pseudo-Code
}
Für die Objekte
("DELETE FROM `inv_obj`") //Damit Tabelle Clear is! Beim Beenden des Servers
for(new o; o<sizeof(Inv_Obj); o++)
{
if(!Inv_Obj[o][_e_item]) continue;
("INSERT INTO `inv_obj` (`item`,`ref`,`x`,`y`,`z`,`r1`,`r2`,`r3`) VALUES ('%d','%d','%f','%f','%f','%f','%f','%f')",
Inv_Obj[o][_e_item], Inv_Obj[o][_e_item_ref], x,y,z,r1,r2,r3); //x,y,z GetObjectPos & r1,r2,r3 GetObjectRot (id haste ja)
}
Erstellen der Objekte beim Laden ist dann trivial oder?
#ZuFaul