Szerző Téma: Sramm\'s Inventory System v. 2.0  (Megtekintve 10646 alkalommal)

Nem elérhető Sramm

  • 596
    • Profil megtekintése
Sramm\'s Inventory System v. 2.0
« Dátum: 2013. január 13. - 15:51:25 »
+15 Show voters
Sramm\'s Inventory System
 
Bevezetõ
Az alábbi filterscript azért jött létre, mert az RPG módomhoz kerestem egy Inventory(Hátizsák) rendszert, de sajnos nem találtam olyat, ami megfelelõ lett volna, ezért kénytelen voltam én írni egyet.
Függvények
AddItem(playerid,item[],amount)


Hozzáad a táskához egy tárgyat.
Paraméterek:


playerid - A játékos, akinek a táskájához hozzá akarsz adni valamit.
item[] - A tárgy neve, amit hozzá akarsz adni.
amount - Amennyi tárgyat akarsz hozzáadni.
Példa:
 

CMD:givememedikit(playerid) //Amikor beírja a parancsot
{
AddItem(playerid,\"Medikit\",1); //Adunk neki egy darab \"Medikit\" nevû tárgyat
return 1;
}

 
Megjegyzés: Ez mindig csak hozzáad tárgyat, nem megváltoztatja. Azaz, ha van már 1 tárgyad, és te 5-t írsz a darabszámhoz, akkor 6 tárgya lesz, és nem 5.
RemoveItem(playerid,item[],amount)


Elvesz a táskából egy tárgyat.
Paraméterek:


playerid - A játékos, akinek a táskájából el akarsz venni valamit.
item[] - A tárgy neve, amit el akarsz venni.
amount - Amennyi tárgyat el akarsz venni.
Példa:
 

CMD:removememedikit(playerid) //Amikor beírja a parancsot
{
RemoveItem(playerid,\"Medikit\",1); //Elveszünk egy darab \"Medikit\" nevû tárgyat
return 1;
}

 
ShowItems(playerid)


Megmutatja a táska tartalmát.
Paraméterek:


playerid - A játékos, akinek megmutatjuk táskát.
Példa:
 

CMD:hatizsakom(playerid) //Amikor beírja a parancsot
{
ShowItems(playerid); //Megmutatjuk neki a táskáját.
return 1;
}

 
GetItemSlot(playerid,item[])


Lekéri, hogy melyik helyen van egy tárgy.
Paraméterek:


playerid - A játékos, akinek a táskájából lekéri.
item[] - A tárgy neve, amit le akarunk kérni.
Példa:
 

CMD:holamedikit(playerid) //Amikor beírja a parancsot
{
new msg[128];
format(msg,128,\"A Medikit ezen a helyen van: \'%d\'\",GetItemSlot(playerid,\"Medikit\"));
SendClientMessage(playerid,-1,msg);
return 1;
}

 
SaveItems(playerid)


Lementi egy játékos hátizsákját.
Paraméterek:


playerid - A játékos, akinek lementjük.
Példa:
 

CMD:saveinv(playerid) //Amikor beírja a parancsot
{
SaveItems(playerid);
return 1;
}

 
LoadItems(playerid)


Betölti egy játékos hátizsákját.
Paraméterek:


playerid - A játékos, akinek betöltjük.
Példa:
 

CMD:loadinv(playerid) //Amikor beírja a parancsot
{
LoadItems(playerid);
return 1;
}

 
OnItemResponse(playerid,response,listitem,inputtext[])


Lementi egy játékos hátizsákját.
Paraméterek:


playerid - A játékos, aki a dialogot megnyomja.
response - Ha a jó gombot nyomja.
listitem - Melyikre nyom.
inputtext[] - A tárgy neve.
FONTOS:
Az alábbi kódot muszáj ide raknod, hogy ki tudd választani a tárgyat.
 

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
      OnItemResponse(playerid,dialogid,response,listitem,inputtext);
      return 0;
}

 
GetItemAmount(playerid,item[])


Lekéri, hogy mennyi van az adott tárgyból.
Paraméterek:


playerid - A játékos, akinek a táskájából lekéri.
item[] - A tárgy neve, aminek a darabszámát le akarjuk kérni.
Példa:
 

CMD:mennyimedikitemvan(playerid) //Amikor beírja a parancsot
{
new msg[128];
format(msg,128,\"Ennyi Medikited van: \'%d\'\",GetItemAmount(playerid,\"Medikit\"));
SendClientMessage(playerid,-1,msg);
return 1;
}

 
IsPlayerOwnItem(playerid,item[])


Lekéri, hogy a játékosnál van-e ilyen item.
Paraméterek:


playerid - A játékos, akinek a táskájából lekéri.
item[] - A tárgy neve, amit le akarunk kérni.
Példa:
 

CMD:vanemedikit(playerid) //Amikor beírja a parancsot
{
if(IsPlayerOwnItem(playerid,\"Medikit\")) return SendClientMessage(playerid,-1,\"Van nálad medikit.\");
else if(!IsPlayerOwnItem(playerid,\"Medikit\")) return SendClientMessage(playerid,-1,\"Nincs nálad medikit.\");
return 1;
}

 
GetItemName(playerid,slot)


Lekéri a sloton lévõ tárgy nevét.
Paraméterek:


playerid - A játékos, akinek lekérjük.
slot - Aminek a nevét lekérjük.
Példa:
 

CMD:getname(playerid) //Amikor beírja a parancsot
{
new msg[128];
format(msg,128,\"Slot 1-en lévõ tárgy neve: \'%s\'\",GetItemName(playerid,1));
SendClientMessage(playerid,-1,msg);
        return 1;
}

 
ResetPlayerItems(playerid)


Nullázza az játékos összes tárgyát.
Paraméterek:


playerid - A játékos, akinek nullázni szeretnénk.
Példa:
 

CMD:resetitem(playerid) //Amikor beírja a parancsot
{
ResetPlayerItems(playerid);
return 1;
}

 
Eljárások
public OnPlayerUseItem(playerid,item[])


Akkor hívódik meg, amikor egy játékos rákattint egy tárgyra a hátiszáknál, ami a ShowItems(playerid)-nél hívódik meg.
 

Paraméterek:

playerid - A játékos, aki rányomott.
item[] - Annak a tárgynak a neve, amelyikre rányomott.
Példa:
Ha pl. én adok valakinek egy Medikit-et:
 

AddItem(playerid,\"Medikit\",1); //Megadom a \"Medikit\" nevû tárgyat a játékosnak

 
És utána õ rákattint:
 
public OnPlayerUseItem(playerid,item[])
{
if(CompareEx(item,\"Medikit\")) //Tehát ha eggyezik annak a tárgynak a neve, amire rákattintottam a \"Medikit\"-tel... (Az inc tartalmazza a CompareEx-et)
{
    SetPlayerHealth(playerid,100); //Beállítjuk a játékos életét 100-ra
    RemoveItem(playerid,\"Medikit\",1); //És elvesszük tõle, mert ugye már használta.
    return 1;
}
return 1;
}

 
Megjegyzés: Ha olyan tárgyat adsz neki, amit aztán itt nem kezelsz, arra hiába kattint rá, nem fog történni semmi.
Fontos:
1. Az alábbi kódot muszáj ide raknod, hogy ki tudd választani a tárgyakat.
 

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
      OnItemResponse(playerid,dialogid,response);
      return 0;
}

 
2. Létre kell hoznod egy \"Inv\" mappát, hogy tudja mibe menteni a rendszer a dolgokat.
Megjegyzések
Ha növeled a maximum tárgyakat, minden játékost, akinek elõtte kevesebb volt szinkronizálnod kell, különben kifagyhat a szerver!
Ha bugot találsz, vagy ötleted van a témában elküldheted. :)
Külön köszönet
F0rian - Compare
TengeriMalac - Tabulátor
Videó, képanyag
 

Letöltés
inventory.rar (Include+Inv mappa tesztfájllal+Teszt filterscript) | inventory.inc
Kód:
 
#include <Dini>
#define MAX_ITEMS 20
#define ITEM_DIALOG 5842
/*
native AddItem(playerid,item[],amount);
native RemoveItem(playerid,item[],amount);
native ShowItems(playerid);
native GetItemSlot(playerid,item[]);
native SaveItems(playerid);
native LoadItems(playerid);
native OnItemResponse(playerid,response,listitem,inputtext[]);
native GetItemAmount(playerid,item[]);
native IsPlayerOwnItem(playerid,item[]);
native ResetPlayerItems(playerid);
native GetItemName(playerid,itemslot);
*/
new itemfile[128];
new ItemName[MAX_PLAYERS][MAX_ITEMS][128];
new ItemAmount[MAX_PLAYERS][MAX_ITEMS];
 

forward OnPlayerUseItem(playerid,item[]);
stock RemoveHexColorFromString(string[])
{
    new
        pos[2];
    pos[0] = strfind(string,\"{\",true,0);
pos[1] = strfind(string,\"}\",true,0);
for(new i;i < strlen(string); i++)
{
    if(pos[0]+7 == pos[1])
    {
        strdel(string, pos[0], pos[1]+1);
        pos[0] = strfind(string,\"{\",true,0);
   pos[1] = strfind(string,\"}\",true,0);
}
}
return 1;
}
stock GetNamei(playerid)
{
new n[MAX_PLAYER_NAME];
GetPlayerName(playerid,n,sizeof(n));
return n;
}
 
stock AddItem(playerid,item[],amount)
{
if(amount <= 0) return 0;
new bool: count[2] = false;
for(new i; i<MAX_ITEMS; i++)
{
    if(CompareEx(ItemName[playerid],item))
    {
   count[0] = true;
        ItemAmount[playerid] += amount;
        return 1;
}
}
if(count[0] == false)
{
    for(new i; i<MAX_ITEMS; i++)
{
    if(CompareEx(ItemName[playerid],\"Üres\"))
    {
      count[1] = true;
      format(ItemName[playerid],128,\"%s\",item);
        ItemAmount[playerid] = amount;
        return 1;
   }
}
}
if(count[1] != true) return SendClientMessage(playerid,-1, \"Betelt a tárhelyed, üríts belõle.\");
return 0;
}
stock RemoveItem(playerid,item[],amount)
{
    for(new i; i<MAX_ITEMS; i++)
{
if(CompareEx(ItemName[playerid],item))
{
    if(ItemAmount[playerid] > amount)
    {
        ItemAmount[playerid] -= amount;
   }
   else if(ItemAmount[playerid] == amount || ItemAmount[playerid] < amount)
   {
      format(ItemName[playerid],128,\"%s\",\"Üres\");
      ItemAmount[playerid] = 0;
   }
}
}
return 1;
}
stock ShowItems(playerid)
{
new msg[128],dialogstr[3000],bool:c;
format( msg, 128,\"Darabszám\\t\\tNév\");
strcat(dialogstr,msg);
for(new i; i<MAX_ITEMS; i++)
{
    if(!CompareEx(ItemName[playerid],\"Üres\"))
    {
        c = true;
   format(msg,128,\"\\n%d\\t\\t%s\",ItemAmount[playerid],ItemName[playerid]);
   strcat(dialogstr,msg);
}
}
if(c != false) ShowPlayerDialog(playerid,ITEM_DIALOG,DIALOG_STYLE_LIST,\"Tárhely\",dialogstr,\"Választ\",\"Mégsem\");
else SendClientMessage( playerid, -1, \"Itt nincs semmi.\" );
return 1;
}
 
stock GetItemSlot(playerid,item[])
{
    for(new i; i<MAX_ITEMS; i++)
    {
        if(CompareEx(ItemName[playerid],item)) return i;
}
return -1;
}
stock IsPlayerOwnItem(playerid,item[])
{
    for(new i; i<MAX_ITEMS; i++)
    {
        if(CompareEx(ItemName[playerid],item)) return 1;
}
return 0;
}
stock GetItemAmount(playerid,item[])
{
    for(new i; i<MAX_ITEMS; i++)
    {
        if(CompareEx(ItemName[playerid],item)) return ItemAmount[playerid];
}
return -1;
}
stock ResetPlayerItems(playerid)
{
for(new i; i<MAX_ITEMS; i++)
{
    format(ItemName[playerid],128,\"%s\",\"Üres\");
ItemAmount[playerid] = 0;
}
return 1;
}
stock OnItemResponse(playerid, dialogid, response,listitem, inputtext[])
{
if(dialogid == ITEM_DIALOG)
    {
       if(!response) return 1;
if(listitem != 0)
{
    new str[128];
    RemoveHexColorFromString(inputtext);
    format(str,128,inputtext[strfind(inputtext,\"\\t\")+2]);
   CallLocalFunction( \"OnPlayerUseItem\", \"is\", playerid, str );
}
}
return 1;
}
stock SaveItems(playerid)
{
new m[128];
    format(itemfile,sizeof(itemfile),\"/Inv/%s.ini\",GetNamei(playerid));
    for(new i; i<MAX_ITEMS; i++)
{
    format(m,128,\"Item%d\",i);
    dini_Set(itemfile,m,ItemName[playerid]);
    format(m,128,\"Itemamount%d\",i);
    dini_IntSet(itemfile,m,ItemAmount[playerid]);
}
return 1;
}
stock LoadItems(playerid)
{
new m[128];
    format(itemfile,sizeof(itemfile),\"/Inv/%s.ini\",GetNamei(playerid));
    if(dini_Exists(itemfile))
    {
        ResetPlayerItems(playerid);
    for(new i; i<MAX_ITEMS; i++)
{
    format(m,128,\"Item%d\",i);
    new item[128];
   format(item,128,\"%s\",dini_Get(itemfile,m));
    format(ItemName[playerid],128,\"%s\",item);
    format(m,128,\"Itemamount%d\",i);
    ItemAmount[playerid] = dini_Int(itemfile,m);
}
}
else
{
dini_Create(itemfile);
ResetPlayerItems(playerid);
SaveItems(playerid);
}
return 1;
}
stock GetItemName(playerid,itemslot) return ItemName[playerid][itemslot];
stock CompareEx(comp[], with[]) //By: Fl0rian
{
new LenghtComp = strlen(comp);
new LenghtWith = strlen(with);
new Character;
if( LenghtComp != LenghtWith ) return false;
for( new i = 0; i < LenghtComp; i++ )
{
    if( comp == with )
    {
        Character++;
}
}
if( LenghtComp == Character ) return true;
return false;
}
« Utoljára szerkesztve: 2013. február 14. - 18:46:22 írta Sramm »

Sramm\'s Inventory System v. 2.0
« Válasz #1 Dátum: 2013. január 13. - 16:03:05 »
0 Show voters
Szép, ment a +.:)

Sramm\'s Inventory System v. 2.0
« Válasz #2 Dátum: 2013. január 13. - 16:28:16 »
0 Show voters
Szép lett!
\"OnItemResponse(playerid,response,listitem)
Lementi egy játékos hátizsákját.\"
Biztos?:D

Nem elérhető Rupert

  • 2301
    • Profil megtekintése
Sramm\'s Inventory System v. 2.0
« Válasz #3 Dátum: 2013. január 13. - 16:29:45 »
0 Show voters
Ez már igen! Nagyon szép lett, csak gratulálni tudok. Van nekem egy szinte ugyanilyen felépítésû inventory system. :O Úgy látszik, hasonlóan gondolkodunk. :)

Nem elérhető Sramm

  • 596
    • Profil megtekintése
Sramm\'s Inventory System v. 2.0
« Válasz #4 Dátum: 2013. január 13. - 16:39:13 »
0 Show voters
Idézetet írta: Pajd Tamás date=1358090896\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"32409\" data-ipsquote-contentclass=\"forums_Topic
Szép lett!
\"OnItemResponse(playerid,response,listitem)
Lementi egy játékos hátizsákját.\"
Biztos?:D
 
Köszi, hogy szóltál :D
 

Ez már igen! Nagyon szép lett, csak gratulálni tudok. Van nekem egy szinte ugyanilyen felépítésû inventory system. :O Úgy látszik, hasonlóan gondolkodunk. :)
 
[/quote]
Köszi :D
Ezek szerint :) Bár ezt túl sok féleképpen nem lehet megoldani :D

Sramm\'s Inventory System v. 2.0
« Válasz #5 Dátum: 2013. január 13. - 16:53:14 »
0 Show voters

Nem elérhető Sramm

  • 596
    • Profil megtekintése
Sramm\'s Inventory System v. 2.0
« Válasz #6 Dátum: 2013. január 13. - 17:19:36 »
+1 Show voters
Idézetet írta: geriking19 date=1358092394\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"32409\" data-ipsquote-contentclass=\"forums_Topic
Powered by Google:
http://forum.sa-mp.com/showthread.php?t=130436
http://joestaff.net/files/scripts/j_inventory_v2.inc
Miért hasonlít nagyon ?
 
Öhm, konkrétan mire gondolsz? Én semmi hasonlóságot nem látok a két kód között.
E: Ha a függvényekre gondolsz, akkor adj tippet, hogy írjam meg másképp, de az, hogy OdaadTargy(playerid) kicsit hülyén hangzik, És AddItem(playerid,amount,item[]) - tehát cserélésnek is semmi értelme, és nem áll kézre. És sajnos angolul így van, tehát nem tudok mit csinálni :)
« Utoljára szerkesztve: 2013. január 13. - 17:26:46 írta Sramm »

Sramm\'s Inventory System v. 2.0
« Válasz #7 Dátum: 2013. január 13. - 17:46:00 »
0 Show voters
Tetszik nagyon szép ment a +!

Sramm\'s Inventory System v. 2.0
« Válasz #8 Dátum: 2013. január 13. - 18:33:30 »
0 Show voters
Srammnak igaza van viszont az egyik példában, idézem:
\"  if(!strcmp(ItemName,\"Medkit\",true)) \"

Nem elérhető The

  • 4384
    • Profil megtekintése
Sramm\'s Inventory System v. 2.0
« Válasz #9 Dátum: 2013. január 16. - 07:32:37 »
0 Show voters
Köszi szépen. :)

Nem elérhető Graduated

  • 938
  • Pályakészítõ Liga Nyertes 2012
    • Profil megtekintése
Sramm\'s Inventory System v. 2.0
« Válasz #10 Dátum: 2013. január 19. - 18:37:50 »
+1 Show voters
Szép lett, gratula.

Nem elérhető Beckham

  • 1693
  • Noresz
  • Discord: Noresz#4265
    • Profil megtekintése
    • OctansV Alt:v szervere
Sramm\'s Inventory System v. 2.0
« Válasz #11 Dátum: 2013. január 21. - 19:04:20 »
0 Show voters
Felhasználom,Great job!

Nem elérhető Amf

  • 1459
    • Profil megtekintése
Sramm\'s Inventory System v. 2.0
« Válasz #12 Dátum: 2013. február 07. - 23:16:22 »
0 Show voters
Csináltam egy ilyet én is, ugyan az a hiba nekem mind a kettõnél.

Ha van két tárgyam a táskába és törlöm az elsõt ( RemoveItem ) utána, ha a másodikra kattintok nem csinál semmit..




Példa:

Ha így néz ki a file, akkor a Cigit már nem lehet használni.



Tárgy1=Üres
Darab1=0
Tárgy2=Cigi
Darab2=10

 

Ha így néz k, akkor lehet.


Tárgy1=Valami
Darab1=1
Tárgy2=Cigi
Darab2=10

 

« Utoljára szerkesztve: 2013. február 08. - 11:35:04 írta AmF »

Nem elérhető Sramm

  • 596
    • Profil megtekintése
Sramm\'s Inventory System v. 2.0
« Válasz #13 Dátum: 2013. február 08. - 16:06:06 »
0 Show voters
Amint gepnel leszek, megnezem, bar nalam a teszt folyaman tokeletesen mukodott.

Nem elérhető Amf

  • 1459
    • Profil megtekintése
Sramm\'s Inventory System v. 2.0
« Válasz #14 Dátum: 2013. február 08. - 16:12:04 »
0 Show voters
Oké, renden. ( Nem akartam egy szavast. )

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal