Shop Tutorial?

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
  • (hier noch mal der aktuelle code im überblick)



    Jetzt wird ShopFinished nicht mehr aufgerufen

  • Das cache_insert_id musst du bei OnHausCreated machen, da dort das INSERT Query ausgeführt wurde.


    Das ShopFinished brauchst du nicht über das mysql_pquery aufrufen, sondern kannst es direkt aufrufen. Einen Cache hast du bei einem Update ja nicht, du liest ja nichts aus, sondern schreibst nur in die Datenbank.

  • Also das Ding ist einfach:


    Es werden nicht alle Shops geladen, bzw vermutlich werden die Textdraws nicht richtig gesetzt,



    wenn ich jetzt einen Shop erstelle passiert erstmal garnichts, erst nach einem Server Start sehe


    ich jetzt das Pickup und den rest aber das nur bei einem shop.


    Bei den anderen wird das pickup nicht angezeigt.


    Aktuell sehe ich nur 2



    Und labels die ich ein paar mal vorher erstellt habe sind auch weg,


    and den tatsächlichen Shop Einträgen in der mysql db habe ich nichts mehr gelöscht


    Finde ich sehr seltsam....




  • Das Problem ist, dass du die ID 0 immer direkt wieder löschst. Das ist ein Problem, welches ich schon zu dutzenden hier gesehen habe, sprich irgendwo her kommt, wo es falsch erklärt ist.


    Um das Problem zu beheben, füge folgendes ganz oben in OnGameModeInit ein:
    for(new i = 0; i < sizeof(ShopInfo); i++)
    {
    ShopInfo[id][spickup] = -1;
    ShopInfo[id][stext] = Text3D:-1;
    }


    Ändere dann
    if(ShopInfo[id][spickup])
    {
    DestroyPickup(ShopInfo[id][spickup]);
    }
    if(ShopInfo[id][stext])
    {
    Delete3DTextLabel(ShopInfo[id][stext]);
    }
    zu:
    if(ShopInfo[id][spickup] != -1)
    {
    DestroyPickup(ShopInfo[id][spickup]);
    }
    if(ShopInfo[id][stext] != Text3D:-1)
    {
    Delete3DTextLabel(ShopInfo[id][stext]);
    }

  • Schreibe die Funktion so:
    getFreeShopID()
    {
    for(new i=0; i<sizeof(ShopInfo); i++)
    {
    if(ShopInfo[i][shopid]==-1) return i;
    }
    ABroadCast(0xFF0000FF, "Error: Maximale Anzahl an Shops erreicht.")
    return -1;
    }


    Das hatte ich ganz zu Anfangs schon angemerkt.
    Sonst klappt es nicht, da du immer nur die 0 oder 1 zurück bekommst.

  • / probiere ich mal aus.



    Und kann leider nicht mitreden, da ich das auch nicht zu 100% verstehe



    Jetzt kriege ich tatsächlich den Fehler, dass die max anzahl an shops erreicht wurde,


    auch nachdem ich MAX_SHOPS auf 500 gesetzt habe (die shop id wäre in dem falle falls der shop erstellt werden würde 431)



    Würde der Code allein von der logik her (alles zusammen) funktionieren



  • Bei OnGameModeInit in die Schleife noch das aufnehmen:
    ShopInfo[i][shopid] = -1;


    Und beim Shopausgang:
    mysql_pquery(handle, query, "ShopFinished", "i", ShopInfo[MakeShop[playerid]][shopid]);
    zu:
    mysql_pquery(handle, query, "ShopFinished", "i", MakeShop[playerid]);

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Super, danke ^^


    Jetzt werden alle Pickups und Labels angezeigt


    /Edit


    Meine Frage wäre jetzt tatsächlich noch, wie es möglich wäre mehrere Ausgänge in einem Interior zu nutzen?


    Heißt wenn ich in ein 24/7 Shop gehe und rausgehen möchte, dass ich dann auch zurück an den richtigen ausgang gebracht werde


    und nicht ausversehen in der nähe eines anderen bin

  • Meine Frage wäre jetzt tatsächlich noch, wie es möglich wäre mehrere Ausgänge in einem Interior zu nutzen?
    Heißt wenn ich in ein 24/7 Shop gehe und rausgehen möchte, dass ich dann auch zurück an den richtigen ausgang gebracht werde

    Speichere die ID (Index i) des Shops, den du betrittst, beim Betreten in eine Spieler-Variable (PlayerInfo...).
    Beim Verlassen des Shops brauchst du nur prüfen, ob der Spieler an einem Ausgang ist. Wenn ja, setzt du ihn an die Position des Eingangs, von der ID (Index i), die du zuvor gespeichert (PlayerInfo) hast.

  • Wie finde ich raus ob ein bestimmter Shop Owner Online ist?


    Bspw. bei einem Rob Command, falls der Owner von dem Shop connected ist,



    soll er eine Nachricht bekommen wer seinen shop ausgeraubt hat.


    Da man dabei ja 2 for new schleifen braucht (oder so) kann ich das vom code her noch nicht


  • Am besten du machst es so:
    getShopOwnerID(id)
    {
    if(id < 0 || id >= sizeof(ShopInfo)) return -1;
    if(!strlen(ShopInfo[id][owner])) return INVALID_PLAYER_ID;
    new pname[MAX_PLAYER_NAME];
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(!IsPlayerConnected(i)) continue;
    GetPlayerName(playerid, pname, MAX_PLAYER_NAME);
    if(!strcmp(ShopInfo[id][owner], pname)) return i;
    }
    return INVALID_PLAYER_ID;
    }


    Und dann beim Ausrauben:
    new ownerid = getShopOwnerID(i);
    if(ownerid != INVALID_PLAYER_ID)
    {
    //ownerid = Besitzer, online
    }
    else
    {
    //Besitzer nicht online
    }


    EDIT:
    IsPlayerConnected-Abfrage noch hinzugefügt. Bitte passe deinen Code auch ein.

    3HZXdYd.png

    Einmal editiert, zuletzt von Jeffry ()

  • Hi,


    ich bin gerade dabei eine Versicherung für meinen Shop zu scripten,


    bisher geht auch alles gut, bis auf ein Problem wo ich nicht genau weiß


    wie ich das anpacken soll.


    Das Ding ist, wenn der Spieler Online kommt soll dieser wissen ob er eine Versicherung hat und


    wenn ja wann diese abläuft, bisher habe ich nur eine abfrage OB der spieler einen Shop hat,


    aber der Shop muss ja auch dem besitzer zugeteilt werden, da rätsel ich ein bisschen



    Das hier ist unter OnUserLogin,




    Das hier ist der Dialog, da klappt auch alles, da ich hier ja auch MakeShop[playerid] = i; benutze bei /edit


    Mit OwnedShop gehts nicht, da ich bei hatPlayerShop ja auch nicht wirklich den richtigen shop (den, den der spieler beistzt)


    als "i" zuordnen kann.



  • Das klappt dann so nicht, da du bei OnUserLogin ja die Daten aus der Tabelle "user" hast, und nicht die Daten aus "Houses".
    In OnUserLogin musst du ein neues SELECT Query machen, welches aus der Tabelle "Houses" das Haus ausliest, welches der Spieler besitzt.


    Dann kannst du in OnHouseLoad z.B. den Cache für das Hause des Spielers auslesen, dort hast du dann auch die Versicherungsdaten und die Haus ID.