[SAMMELTHREAD] Kleine Scripting Fragen

Dein Problem konnte durch einen User gelöst werden? Bedank dich bei ihm indem du seinen Beitrag als Hilfreich markierst sowie einen Daumen oben dalässt
Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Dem Log nach wurde erneut ocmd aufgerufen, für den Befehl. Prüfe das bitte nochmal.
    ocmdOnPlayerCommandText

    Ah, stimmt das wollte ich auch noch kommentieren! Liegt es vielleicht daran, weil sich ocmd zwischen OnPlayerCommandText klemmt? Weil der ocmd Befehl ist auf jeden Fall auskommentiert.

  • Weil der ocmd Befehl ist auf jeden Fall auskommentiert.

    Hast du irgendwo im Code noch etwas anderes, das "inventory" heißt?



    Liegt es vielleicht daran, weil sich ocmd zwischen OnPlayerCommandText klemmt?

    ocmd setzt sich vor OnPlayerCommandText hin, von daher kommt er wohl dort erst gar nicht an.
    Klappt es denn, wenn du den strcmp Befehl mal "/xinventoy" nennst?

  • Hast du irgendwo im Code noch etwas anderes, das "inventory" heißt?

    Keinen weiteren Befehl, aber ein enum.

    Code
    enum enum_Inventory {
        inventoryID,
        inventoryBesitzerID,
        inventorySize
    }
    new Inventory[MAX_INVENTORY][enum_Inventory];


    ocmd setzt sich vor OnPlayerCommandText hin, von daher kommt er wohl dort erst gar nicht an.
    Klappt es denn, wenn du den strcmp Befehl mal "/xinventoy" nennst?

    Leider der gleiche Fehler.

  • Leider der gleiche Fehler.

    Trotz dass du /xinventory im Spiel eingegeben hast, und den ocmd Befehl nicht geändert hast (auskommentiert gelassen)?
    Falls ja, was passiert, wenn du es zu /abcxyz umbenennst?



    Keinen weiteren Befehl, aber ein enum.

    Es wäre ansonsten eventuell ein Versuch wert, das enum, die Werte im enum und das Array umzubenennen, von Inventory zu "xyInventar" (nur testweise, kann dann ja nochmal umbenannt werden).
    Wäre zumindest eine gewisse Erklärung, dass ocmd versucht, das Array, da es fast gleich heißt, auszuführen, was ja nicht geht.

  • Trotz dass du /xinventory im Spiel eingegeben hast, und den ocmd Befehl nicht geändert hast (auskommentiert gelassen)?

    Ja...


    Falls ja, was passiert, wenn du es zu /abcxyz umbenennst?

    Gleicher Fehler...


    Es wäre ansonsten eventuell ein Versuch wert, das enum, die Werte im enum und das Array umzubenennen, von Inventory zu "xyInventar" (nur testweise, kann dann ja nochmal umbenannt werden).
    Wäre zumindest eine gewisse Erklärung, dass ocmd versucht, das Array, da es fast gleich heißt, auszuführen, was ja nicht geht.

    Wie von dir beschrieben ein Prefix eingefügt, aber ändern tut sich leider auch nichts...

  • Hey, wie kann ich einen String anders definieren als mit:

    #define DELETE "Entfernen"


    Ich hab vor das man in einem Dialog erst Entfernen eintippten muss bevor man ein Objekt löschen kann.. das Problem ist das mit der #define Methode die Gänsefüße mit geschrieben werden müssen. Wie kann ich es am besten lösen das man Entfernen ohne Gänsefüße eintippen kann?

  • Hast du dir die Werte denn per Print mal vor und nach MapAndreas ausgeben lassen? Wenn ja, was kommt raus?


    Die Meldung kam in dem Fall dann vom Debug Modus.
    Tritt der Fehler denn nur bei dem Befehl auf, oder auch bei anderen Befehlen?
    Hast du mal versucht, den Befehl als "strcmp" Befehl anzulegen, und den ocmd Befehl zu entfernen, klappt es dann?


    2102.222656 SpielerWert
    2102.222656 SpielerWert


    das bekomme ich raus so habe ich es jetzt



    GetPlayerPos(playerid, SpielerInfo[playerid][pLastX], SpielerInfo[playerid][pLastY], SpielerInfo[playerid][pLastZ]);
    printf("%f SpielerWert",SpielerInfo[playerid][pLastX], SpielerInfo[playerid][pLastY], SpielerInfo[playerid][pLastZ]);
    MapAndreas_FindZ_For2DCoord(SpielerInfo[playerid][pLastX], SpielerInfo[playerid][pLastY], SpielerInfo[playerid][pLastZ]);
    printf("%f SpielerWert",SpielerInfo[playerid][pLastX], SpielerInfo[playerid][pLastY], SpielerInfo[playerid][pLastZ]);

  • ...das sind schlechte prints ^^


    Du musst 3x %f für die einzelnen Werte verwenden, damit man das vergleichen kann ^^

    ast2ufdyxkb1.png


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

  • Wie von dir beschrieben ein Prefix eingefügt, aber ändern tut sich leider auch nichts...

    Füge bitte mal den Befehl ein:
    if(!strcmp(cmdtext, "/testabc", true))
    {
    printf("Befehl ausgrführt.");
    return 1;
    }
    Kommt der Print dann im Server Log an, oder erscheint auch wieder ein Fehler?


    Falls das geht, poste bitte, wie du "getItemName" definiert hast, und wie "Items" deklariert ist.

  • Falls das geht, poste bitte, wie du "getItemName" definiert hast, und wie "Items" deklariert ist.

    Jetzt funktioniert's! Du hast mich mit dem Satz daran erinnert, dass ich vergessen habe die Array Größe in der Variable einzutragen. :thumbup:
    Anschließend hab ich es noch mal getestet, jetzt wird der Befehl ausgeführt und kein Error mehr in der Konsole ausgelöst. Danke!! ^^

  • Jetzt funktioniert's! Du hast mich mit dem Satz daran erinnert, dass ich vergessen habe die Array Größe in der Variable einzutragen.

    Ahh perfekt! Sowas dachte ich mir nämlich, als es mit keinem der Befehle ging.
    Nur blöd, dass crashdetect das nicht sauber aus gibt. Eine "Index out of bound" Meldung wäre sinnvoller gewesen. Gut, dass es jetzt geht.




    @\gamemode\GTA SERVER\pawno\include\core.inc(12) : error 042: invalid combination of class specifiers

    Ich verweise hier mal auf:
    [jTool] PAWN Errors & Warnungen - Deutsche Übersetzung +++ Erklärungen


    Eine Funktion oder eine Variable ist unerlaubterweise sowohl als "public" als auch als "native" gekennzeichnet. Andere Kombinationen können ebenfalls nicht unterstützt werden, so kann eine Funktion zum Beispiel nicht gleichzeitig "public" und "stock" sein (eine Variable jedoch kann jedoch mit "public" und "stock" deklariert werden).


    Da der Fehler in der core.inc Zeile 12 kommt, welche folgende ist:
    [pwn=12]native heapspace();[/pwn]
    Könnte es sein, dass du irgendwo nochmal "heapspace" definiert hast, in einer Include oder im Gamemode?


    Andernfalls kannst du versuchen, die aktuellen Includes nochmal herunterzuladen:
    http://www.sa-mp.com/download.php


    Achte auch darauf, die pawno.exe direkt zu öffnen, und deinen Gamemode dann über "Öffnen" auszuwählen. Sonst kann es sein, der Compiler wird aus einem anderen Verzeichnis gezogen.

  • Wie schreibt man am besten Array-Übergreifend?
    Ich habe nämlich eine kleine Struktur von drei Enums, die aber miteinander "kommunizieren" müssen.


    Als Beispiel: Ich möchte aus dem Enum "Items" über die 'itemID' den korrekten 'itemName' aus dem Enum "ItemList" herausbekommen.
    Dieses Prinzip halt auch mit anderen Variablen wie z.B. 'itemInventoryID' aus Enum "Items" um es mit der 'inventoryID" aus dem Enum "Inventory" zu vergleichen.


    Ich habe es schon mit Schleifen ausprobiert, allerdings bekomme ich nicht die gewünschte Variable heraus.


  • Als Beispiel: Ich möchte aus dem Enum "Items" über die 'itemID' den korrekten 'itemName' aus dem Enum "ItemList" herausbekommen.

    Kommt drauf an, wie die Zuweisung stattfindet, sprich welchen Wert itemID hat, den von item1ID, oder den des Indexes.


    Beim Index:
    printf("Name: %s", ItemList[Items[idx][itemID]][item1Name]);


    Beim Wert von item1ID:
    for(new i = 0; i < sizeof(ItemList); i++)
    {
    if(ItemList[i][item1ID] == Items[idx][itemID])
    {
    printf("Name: %s", ItemList[i][item1Name]);
    break;
    }
    }


    idx steht dabei beides mal für den Index aus MAX_PLAYER_ITEMS, der sollte bekannt sein.


    Sinnvoller ist die erste Variante, ebenfalls performanter.

  • Kommt drauf an, wie die Zuweisung stattfindet, sprich welchen Wert itemID hat, den von item1ID, oder den des Indexes.


    Beim Index:


    printf("Name: %s", ItemList[Items[idx][itemID]][item1Name]);

    Ich lese die itemID aus der Datenbank aus:


    Mein Problem ist gerade allerdings, wie ich den von dir beschriebenen korrekten Index für das Item bekomme. Nebenbei: wie definiere ich MAX_PLAYER_ITEMS so, dass jeder Spieler maximal z.B. 20 verschiedene Items tragen kann. MAX_PLAYER_ITEMS (20*MAX_PLAYERS) ? :/ Ich kriege nämlich, wenn ich das Gewicht von Item 2 haben möchte, dass Gewicht von Item 3.

  • Mein Problem ist gerade allerdings, wie ich den von dir beschriebenen korrekten Index für das Item bekomme.

    Das kann ich dir so nicht sagen, da ich nicht weiß was du vor hast, und es keinen Code dazu gibt.



    Nebenbei: wie definiere ich MAX_PLAYER_ITEMS so, dass jeder Spieler maximal z.B. 20 verschiedene Items tragen kann.

    [MAX_PLAYERS][MAX_PLAYER_ITEMS]


    Für weitere Fragen zu dem Thema mache bitte einen separaten Thread auf, da es sich bei der Entwicklung eines kompletten Systems nicht um eine kleine Frage handelt.