Fragen zu Inventarsystem

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

Es gibt Neuigkeiten! Ab sofort könnt ihr dem Donators Club auf Lebenszeit beitreten.
Weitere Infos im Thema Donator's Club ab heute wieder verfügbar!

  • Fragen zu Inventarsystem

    Moin!


    Folgendes Problem, wir möchten ein Inventarsystem via MySQL wo man zb den perso eines anderen Spilers reinlegen kann.


    Z.B: Spieler A raubt Spieler B aus und nimmt sich seine Bankkarte (Die
    Bankkartest aber kein sichtbares Objekt) Man soll die Bankkarte an einen
    anderen Spieler weiergeben oder auf den Boden werfen können. Mit
    dieser Bankkarte soll Spieler A dann das Geld von Spieler B abheben
    können.


    Wie können wir das am Besten machen?


    MfG

    Allrounder18
  • Also soll es ein generelles Inventar System werden oder geht es nur um diese Karte?

    Man wird halt nicht so schlau aus deinem Text, das sind sehr wenige Infos.

    Gibt auch 1000 Arten sowas umzusetzen, je nachdem, was für "Features" man halt benötigt.

    Ich kann es mal grob erklären, also im Endeffekt ist es nur wesentlich z.B. die SQLid von Spieler A dem Item A zuzuordnen.

    Denn Wenn Spieler B das Item bekommt, wird die SQLid von Spieler A auch Spieler B zugewiesen.

    Somit kann Spieler B über diese "Referenz SQLid (kurz refID)" auf das Konto von Spieler A zugreifen.

    Ich habe mal ein kleines Skript in den Spoiler gepackt (weder getestet, noch optimiert oder sonst was).
    Musst es also noch stark anpassen und evtl als Include oder so aufbereiten.
    Ging mir erstmal nur um die grobe Vermittlung meiner Idee.

    Aber so ganz grob, kann man sich das vorstellen. wie ich mir das ungefähr vorgestellt habe.
    Dem Objekt werden dann auch all diese Attribute zugewiesen. Somit kann dann, wenn jemand das Objekt aufhebt durch die refID auf Spieler A zugreifen.

    Und an der Bank musst du dann halt evtl checken, dass er mit der anderen Karte zahlen kann.
    Wobei das System aktuell so geschrieben ist, dass er sogar mehrere Karten haben könnte.
    Musste halt loopen und evtl die Namen aus der Datenbank auslesen, die hinter den SQLids stehen, damit ihm angezeigt wird, von dem wer die Konten abräumen kann.

    Das System, gerade, wenn es so offen bzw "dynamisch" geschrieben ist, ist halt nicht so trivial umzusetzen.

    Spoiler anzeigen

    C-Quellcode

    1. #if !defined MAX_INV_OBJ
    2. #define MAX_INV_OBJ 50 //Wie viele Objekte maximal erstellt werden
    3. #endif
    4. #if !defined MAX_INV_SLOT
    5. #define MAX_INV_SLOT 10 //Wie groß das Inventar ist
    6. #endif
    7. /******************************************************************************/
    8. enum
    9. {
    10. INV_EMPTY,
    11. //Alle Items unter dem hier
    12. INV_CARD,
    13. INV_DEAGLE,
    14. //Alle Items über dem hier
    15. INV_MAX_ID
    16. };
    17. /******************************************************************************/
    18. stock const e_inv_objs[] = { //Jeder Slot muss ein Objekt Model haben (auch wenn es nie verwendet wird)
    19. 1581, //Some Card
    20. 348 //Deagle
    21. };
    22. /******************************************************************************/
    23. enum _e_inv {
    24. _e_ref,
    25. _e_name
    26. };
    27. enum _e__obj {
    28. _e_item,
    29. _e_item_ref,
    30. _e_objID
    31. };
    32. new Inventar[MAX_PLAYERS][MAX_INV_SLOT][e_inf], Inv_Obj[MAX_INV_OBJ][_e__obj];
    33. /******************************************************************************/
    34. stock GivePlayerItem(playerid,item,sqlid=0) //sqlid = PlayerID in Database | Damit Konto & Karte z.B. verknüpft sind (optional)
    35. {
    36. if(item < 0 || item >= INV_MAX_ID) return 0;
    37. new slot = GetFreeItemSlot(playerid);
    38. if(slot == -1) return -1;
    39. Inventar[playerid][slot][_e_name] = item,
    40. Inventar[playerid][slot][_e_ref] = sqlid;
    41. return 1;
    42. }
    43. stock RemoveItemFromPlayer(playerid,slot)
    44. {
    45. if(slot < 0 || slot >= MAX_INV_SLOT) return 0;
    46. Inventar[playerid][slot][_e_ref] = Inventar[playerid][slot][_e_name] = 0;
    47. return 1;
    48. }
    49. stock StealItemFromPlayer(playerid,forplayer,slot) //To rob player
    50. {
    51. if(item < 0 || item >= INV_MAX_ID) return 0;
    52. if(!Inventar[playerid][slot][_e_name]) return 0;
    53. new c = GetFreeItemSlot(forplayer);
    54. if(c == -1) return -1;
    55. Inventar[forplayer][c][_e_ref] = Inventar[playerid][slot][_e_ref],
    56. Inventar[forplayer][c][_e_name] = Inventar[playerid][slot][_e_name],
    57. RemoveItemFromPlayer(playerid,slot);
    58. return 1;
    59. }
    60. stock CreateObjectFromItem(playerid,slot)
    61. {
    62. if(!Inventar[playerid][slot][_e_name]) return 0;
    63. new o = GetFreeObjSlot();
    64. if(o == -1) return -1;
    65. new Float:x,Float:y,Float:z;
    66. GetObjectPos(playerid,x,y,z),
    67. Inv_Obj[o][_e_item] = Inventar[playerid][slot][_e_name],
    68. Inv_Obj[o][_e_item_ref] = Inventar[playerid][slot][_e_ref],
    69. 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)
    70. RemoveItemFromPlayer(playerid,slot);
    71. return 1;
    72. }
    73. stock GivePlayerItemFromObject(playerid,o)
    74. {
    75. if(!Inv_Obj[o][_e_item]) return 0;
    76. new slot = GetFreeItemSlot(playerid);
    77. if(slot == -1) return -1;
    78. Inventar[playerid][slot][_e_name] = Inv_Obj[o][_e_item],
    79. Inventar[playerid][slot][_e_ref] = Inv_Obj[o][_e_item_ref];
    80. DestroyObject(Inv_Obj[o][_e_objID]); //Evtl DestroyDynamicObject | Oder DestroyPickup
    81. Inv_Obj[o][_e_item] = Inv_Obj[o][_e_item_ref] = 0;
    82. return 1;
    83. }
    84. /******************************************************************************/
    85. stock GetFreeItemSlot(playerid)
    86. {
    87. for(new i; i<MAX_INV_SLOT; i++) if(!Inventar[playerid][i][_e_name]) return i;
    88. return -1;
    89. }
    90. stock GetFreeObjSlot()
    91. {
    92. for(new i; i<sizeof(Inv_Obj); i++) if(!Inv_Obj[i][_e_item]) return i;
    93. return -1;
    94. }
    Alles anzeigen




    Mal hier bisschen Pseudo-Code für die Nutzung:

    PAWN-Quellcode

    1. GivePlayerItem(playerid, INV_DEAGLE); //Muss keine SQLid angegeben werden.
    2. 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)

    C-Quellcode

    1. //Zum Speichern des User-Inventars
    2. ("DELETE FROM `inventar` WHERE `userID`='%d'",PlayerInfo[playerid][pSQLid])
    3. for(new i; i<MAX_INV_SLOT; i++)
    4. {
    5. if(!Inventar[playerid][i][_e_name]) continue;
    6. ("INSERT INTO `inventar` (`userID`,`ref_ID`,`item`) VALUES ('%d','%d','%d')",PlayerInfo[playerid][pSQLid],Inventar[playerid][i][_e_ref],Inventar[playerid][i][_e_name])
    7. }
    Zum Laden dann:

    C-Quellcode

    1. ("SELECT * FROM `inventar` WHERE `userID`='%d'",PlayerInfo[playerid][pSQLid])
    2. //und dann halt loopen
    3. for(new i; i<rows; i++)
    4. {
    5. Inventar[playerid][i][_e_name] = cache_get_int(i, "item"); //Pseudo-Code
    6. Inventar[playerid][i][_e_ref] = cache_get_int(i, "ref_ID"); //Pseudo-Code
    7. }


    Für die Objekte

    C-Quellcode

    1. ("DELETE FROM `inv_obj`") //Damit Tabelle Clear is! Beim Beenden des Servers
    2. for(new o; o<sizeof(Inv_Obj); o++)
    3. {
    4. if(!Inv_Obj[o][_e_item]) continue;
    5. ("INSERT INTO `inv_obj` (`item`,`ref`,`x`,`y`,`z`,`r1`,`r2`,`r3`) VALUES ('%d','%d','%f','%f','%f','%f','%f','%f')",
    6. 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)
    7. }
    Erstellen der Objekte beim Laden ist dann trivial oder?
    #ZuFaul


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. X/
  • Ok!

    Es sollte halt so sein, das man /inv machen muss, dabei soll sich n Dialog öffnen wo steht Benutzen, Weitergeben oder Wegwerfen.

    Benutzen: Du kanst zb das Haus mit dem Schlüssel aufschließen.
    Weitergeben: Du kannst d en Schlüssel an einen anderen Spieler weitergeben
    Wegwerfen: Du kasnt den Schlüssel auf den Boden werden, wo er dann wieer aufgehoben oder gelöscht werden kann.

    Was meinst du mit trivial?
  • Allrounder18 schrieb:

    Was meinst du mit trivial?
    Ich zitiere...Als trivial gilt ein Umstand, der als naheliegend, für jedermann leicht ersichtlich oder erfassbar angesehen wird


    Allrounder18 schrieb:

    Es sollte halt so sein, das man /inv machen muss, dabei soll sich n Dialog öffnen wo steht Benutzen, Weitergeben oder Wegwerfen.
    Dann machst du eine Schleife...loopst durch Inventar...

    Dann weißt du ja welche Items er hat, kannst ja ein Array mit namen noch machen (sowie das mit den Objekten).

    Dann wenn er darauf klickt haste den Slot (als listitem) (musst halt die leeren Slots auch auflisten).

    Und die _ref_id muss ja nicht zwingend die SQLid Spielerid sein, kannst du ja vom Item abhängig machen, dass du ihm da kp eben die SQLHausID gibst oder eine SQLVehicleID...

    Und ja, die Funktionen für den Rest gibts ja schon :o


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. X/
  • Allrounder18 schrieb:

    das man einen PIN eingeben muss um an das Geld zu kommen
    Welchen Pin denn?

    Also, da du ja von Spieler A die SQLid hast, kannst du ja auch Spieler B einfach dazu nötigen die PIN von Spieler A eingeben zu müssen.

    Daran kommst du ja easy, oder soll sich Spieler B dann einen neuen Pin ausdenken?! :D


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. X/
  • Jede Karte soll einen Pin haben. Damit Spieler A Geld abheben kan braucht er diesen, sollte Spielr B die Kare klauen braucht er diesen Pin logischerweise auch. Wenn Spieler A "blöd" genug ist ud seinen Pin auf nem Zettel aufgeschrieben hat (Zettel = Inventaritem) oder Spieler B den Pin anderweitig bekommt kann er ja ds Geld abheben.
  • Aber der Pin ist doch mit keiner Karte, sondern mit einem Bankkonto verknüpft.

    Ergo wenn Spieler A ein Konto hat, muss er ja erstmal n Pin sich ausdenken, damit er auf sein Konto zugreifen kann.
    Dieser Pin wird ja in der Tabelle von dem Spieler gespeichert ganz normal.

    Erlangt jetzt Spieler B die Karte von Spieler A, dann gilt die Pin logischerweise von Spieler A noch.
    Ergo kannst du die einfach durch die SQLid von Spieler A aus der Datenbank ermitteln.


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. X/

  • Kaliber schrieb:

    Aber der Pin ist doch mit keiner Karte, sondern mit einem Bankkonto verknüpft.

    Ergo wenn Spieler A ein Konto hat, muss er ja erstmal n Pin sich ausdenken, damit er auf sein Konto zugreifen kann.
    Dieser Pin wird ja in der Tabelle von dem Spieler gespeichert ganz normal.

    Erlangt jetzt Spieler B die Karte von Spieler A, dann gilt die Pin logischerweise von Spieler A noch.
    Ergo kannst du die einfach durch die SQLid von Spieler A aus der Datenbank ermitteln.
    Oh Denkfehler. Dankesehr!
  • @Kaliber ist aber auch nur richtig, wenn der Rest des Systems auch so aussieht.

    Möglich wäre auch eine Tabellezu erstellen, in der ale Ites aufgelistet werden. Dort dann eine Feld einrichten welches die uuid des jeweiligen, aktuellen Halters enthält. Dann vielleicht noch ein Feld mit extra-Daten.

    Beispiel;

    OwnerHolderItemIDItemNameValueCountityChanged
    748274822Bankkarte123410
    3814381416Brot160
    753274822Bankkarte432112



    Spieler 7482 hat also 2 Bankkarten. Er kann nun beim Bankbesuch also auswählen, welche Karte er verwenden möchte. Im Feld "Value" ist in diesem Beispiel die PIN untergebracht. Die "2" in "Changed" besagt in diesem Beispiel dass die Karte geklaut wurde.

    Vorteile;
    • Schnelles Wechseln der Halter ermöglicht
    • Auflistung aller Items auf dem Server
    • Statistik über die Anzahl ein Weitergaben, Wegwerfen, Diebstählen ermöglicht
    • Einfache Auslesung aller Items eines Spielers durch seine uuid


    Das System ist natürlich grenzenlos erweiterbar. Ich denke aber, so ist es am einfachsten & sinnvollsten.

    //via handy autokorrektur und Schreibfehler sind gratis
  • Kaliber schrieb:

    Aber der Pin ist doch mit keiner Karte, sondern mit einem Bankkonto verknüpft.

    Ergo wenn Spieler A ein Konto hat, muss er ja erstmal n Pin sich ausdenken, damit er auf sein Konto zugreifen kann.
    Dieser Pin wird ja in der Tabelle von dem Spieler gespeichert ganz normal.

    Erlangt jetzt Spieler B die Karte von Spieler A, dann gilt die Pin logischerweise von Spieler A noch.
    Ergo kannst du die einfach durch die SQLid von Spieler A aus der Datenbank ermitteln.
    Oh, mir fällt grade auf, das der Pin doch mit der Karte verknüpft ist, weil im Reallife gehst du ja auch zur Bank und musst den Pin eingeben damit du mit der Karte die mit dem Konto verknüpft ist Geld abheben kannst.
  • Talykos schrieb:

    ist aber auch nur richtig, wenn der Rest des Systems auch so aussieht.
    Das versteh ich jetzt nicht so ganz?

    Zumal dein System fast identisch ist..nur du hast mehr extra Variablen..die man eig nicht bräuchte...


    Allrounder18 schrieb:

    Oh, mir fällt grade auf, das der Pin doch mit der Karte verknüpft ist, weil im Reallife gehst du ja auch zur Bank und musst den Pin eingeben damit du mit der Karte die mit dem Konto verknüpft ist Geld abheben kannst.
    Was? Das macht doch gar keinen Sinn, was du da redest.

    Lies dir nochmal meinen Text durch.


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. X/