[Erledigt] Haus Interior Spawn setzen

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
  • Hallo Community,


    ich bin dabei ein Haussystem zu scripten.
    Nur das Problem ist.. wenn ich ein Haus Ingame erstellt wird es nach einem Restart nicht gespeichert und geladen...
    Wie kann ich alle Häuser beim Server Start laden?
    Da muss doch irgendwas bei OnGameModeInit hin oder^^?
    *Muss ich eigentlich irgendein Stock wie SaveHaus oder LoadHaus hinzufügen?


    Mfg, Markus

    2 Mal editiert, zuletzt von [Markus] () aus folgendem Grund: Header

  • Am besten schreibst du eine Funktion, in welcher du die Häuser laden lässt. Diese rufst du dann beim Start des Servers auf.
    Wie du Daten aus deiner Datenbank laden lässt, wird unter anderem hier erklärt.
    Ist nicht die beste Lösung aber sollte für den Anfang reichen.

  • Zitat

    Und wie mache ich die Schleife bei OnGameModeInit und OnGameModeExit?
    Ich komme da nicht weiter xD :D
    Das erste mal das ich überhaupt soweit gekommen bin mit so einem System :(

  • OK, hier ein Beispiel für eine Lösung die ich dir kurz geschrieben habe.


    stock LoadHouses()
    {
    new query[512],count,get[32];
    format(query,sizeof(query),"SELECT MAX(`HAUSNUMMERIERUNG`) FROM `TABELLENNAME`"); // eingene Informationen -> wir lassen die maximale hausnummer für unseren loop auslesen
    mysql_query(query);
    mysql_store_result();
    mysql_fetch_row(get);
    mysql_free_result();
    count = strval(get);
    if(count == 0) return 1;
    for(new i=1;i<(count+1);i++) // loop für alle hausid's zum laden
    {
    format(query,sizeof(query),"SELECT HausID,Besitzer,Preis,Variablenwieauchimmer FROM `TABELLENNAME` WHERE `HAUSNUMMERIERUNG`='%d'",i); // logischerweiese eigene Informationen
    mysql_query(query);
    mysql_store_result();
    if(mysql_fetch_row(query))
    {
    sscanf(query,"p<|>iis[32]",DEINEVARIABLEN);
    // Dein oben geladener String wird wie folgt übergeben INFO|INFO|INFO, durch diese Zeile lassen wir sscanf den String an jedem | splitten, trag also (wie bei format auch ) d bzw i für integer und s für strings ein und lass sscanf den rest machen
    }
    }
    mysql_free_result();
    return 1;
    }


    Ich hoffe du kannst meinen Gedankengang im Groben nachvollziehen. Copy&Paste wird dir wenig bringen, somit musst du dich jetzt wohl mit dem Code auseinander setzen.
    Ich habe ihn auch schon getestet und bei mir verlief das ganze Reibungslos.

  • Würde das auch in OnGameModeInit gehen? :D


    for(new i=0; i <MAX_HOUSES; i++)
    {
    new query[300];
    format(query, sizeof(query), "SELECT * FROM `Houses`");
    mysql_query(query);
    }


    ich denke nicht oder? xD

  • Okay danke.
    Nur ich kappiere das hier nicht:
    sscanf(query,"p<|>iis[32]",DEINEVARIABLEN);


    Und bei OnGameModeInit muss doch LoadHouse(); aufgerufen werden oder?


    for(new i=1;i<(count+1);i++)
    {
    format(query,sizeof(query),"SELECT HausID,Besitzer,Kaufpreis,IconX,IconY,IconZ,SpawnX,SpawnY,SpawnZ,InteriorID FROM `Houses` WHERE `HausID`='%d'",i); // logischerweiese eigene Informationen
    mysql_query(query);
    mysql_store_result();
    if(mysql_fetch_row(query))
    {
    sscanf(query,"p<|>iis[32]",DEINEVARIABLEN);
    // Dein oben geladener String wird wie folgt übergeben INFO|INFO|INFO, durch diese Zeile lassen wir sscanf den String an jedem | splitten, trag also (wie bei format auch ) d bzw i für integer und s für strings ein und lass sscanf den rest machen
    }
    }

  • Nein, dass musst du schon noch selber unter OnGameModeInit eintragen. Für die SSCANF Funktion benötigst du das SSCANF-Plugin.


    Diese Funktion unterteilt deinen String in die einzelnen Teile und weißt sie direkt deinen Variablen zu. Poste deine Variablen und ich gebe dir noch ein Beispiel.


    Edit: Hier das Plugin

  • Öhm ich weiß nicht was du damit meinst aber glaube das hier :D


    #define MAX_HOUSES 50
    enum HausDaten
    {
    hBesitzer[MAX_PLAYER_NAME],
    hKaufpreis,
    Float: hIconX,
    Float: hIconY,
    Float: hIconZ,
    Float: hSpawnX,
    Float: hSpawnY,
    Float: hSpawnZ,
    hInteriorID
    }
    new HausInfo[MAX_HOUSES][HausDaten];
    *Ach ja wenn ich z. B. eine Abfrage mache: HausInfo[MAX_HOUSES][hKaufpreis] usw.. dann bekomme ich einen Fehler ich denke das liegt an MAX_HOUSES aber weiß nicht wie ich den beheben kann.



    OGI ist denke ich falsch..
    for(new i=0; i <MAX_HOUSES; i++)
    {
    LoadHouse(i);
    }


    LoadHouse
    stock LoadHouses()
    {
    new query[512],count,get[32];
    format(query,sizeof(query),"SELECT MAX(`HausID`) FROM `Houses`"); // eingene Informationen
    mysql_query(query);
    mysql_store_result();
    mysql_fetch_row(get);
    mysql_free_result();
    count = strval(get);
    if(count == 0) return 1;
    for(new i=1;i<(count+1);i++)
    {
    format(query,sizeof(query),"SELECT HausID,Besitzer,Kaufpreis,IconX,IconY,IconZ,SpawnX,SpawnY,SpawnZ,InteriorID FROM `Houses` WHERE `HausID`='%d'",i); // logischerweiese eigene Informationen
    mysql_query(query);
    mysql_store_result();
    if(mysql_fetch_row(query))
    {
    sscanf(query,"p<|>iis[32]",DEINEVARIABLEN);
    // Dein oben geladener String wird wie folgt übergeben INFO|INFO|INFO, durch diese Zeile lassen wir sscanf den String an jedem | splitten, trag also (wie bei format auch ) d bzw i für integer und s für strings ein und lass sscanf den rest machen
    }
    }
    mysql_free_result();
    return 1;
    }



    Danke das du mir so hilfst :)

  • Unter OnGameModeInit einfach LoadHouses() eintragen.


    Das Beispiel kommt gleich über #Edit


    Edit:


    new c; // für die HausID, für die du keine Variable hast. ( Unwichtig, der Integer wird nicht weiter genutzt. )
    sscanf(query,"p<|>is[24]iffffffi",
    c,
    HausInfo[i][hBesitzer],
    HausInfo[i][hKaufpreis],
    HausInfo[i][hIconX],
    HausInfo[i][hIconY],
    HausInfo[i][hIconZ],
    HausInfo[i][hSpawnX],
    HausInfo[i][hSpawnY],
    HausInfo[i][hSpawnZ],
    HausInfo[i][hInteriorID]);

  • Okay danke :love:
    Noch eine Frage...
    Wenn ich jetzt sowas habe:
    switch(HausInfo[i][hInteriorID])
    {
    case 2:
    {
    new query[128];
    format(query, sizeof(query), "UPDATE `Houses` SET `SpawnX`='271.884979' AND SpawnY='306.631988' AND SpawnZ='999.148437' WHERE `Besitzer` = '%s'", PlayerName[playerid]);
    mysql_query(query);


    }
    case 4:
    {
    new query[128];
    format(query, sizeof(query), "UPDATE `Houses` SET `SpawnX`='302.180999' AND SpawnY='300.722991' AND SpawnZ='999.148437' WHERE `Besitzer` = '%s'", PlayerName[playerid]);
    mysql_query(query);
    }
    }


    Bekomme ich in der ersten Zeile ein Fehler wegen dem "i" oder wenn ich allgemein sowas mache: HausInfo[WAS MUSS HIER EIGENTLICH REIN???][hInteriorID])
    Wie kann ich den Fehler beheben?


    Oben habe ich ja das hier:


    #define MAX_HOUSES 50
    enum HausDaten
    {
    hBesitzer[MAX_PLAYER_NAME],
    hKaufpreis,
    Float: hIconX,
    Float: hIconY,
    Float: hIconZ,
    Float: hSpawnX,
    Float: hSpawnY,
    Float: hSpawnZ,
    hInteriorID
    }
    new HausInfo[MAX_HOUSES][HausDaten];

  • Jetzt habe ich ein neues Problem werkel da die ganze Zeit schon rum..
    Es wird kein Pickup und auch kein 3DTextLabel erstellt.


    stock LoadHouses()
    {
    new query[512],count,get[32];
    new c;
    new string[300];
    format(query,sizeof(query),"SELECT MAX(`HausID`) FROM `Houses`");
    printf("Selectiere max haus IDS from houses...");
    mysql_query(query);
    mysql_store_result();
    mysql_fetch_row(get);
    mysql_free_result();
    count = strval(get);
    if(count == 0) return 1;
    for(new i=1;i<(count+1);i++)
    {
    format(query,sizeof(query),"SELECT HausID,Besitzer,Kaufpreis,IconX,IconY,IconZ,IconID,SpawnX,SpawnY,SpawnZ,InteriorID FROM `Houses` WHERE `HausID`='%d'",i); // logischerweiese eigene Informationen
    mysql_query(query);
    mysql_store_result();
    if(mysql_fetch_row(query))
    {
    sscanf(query,"p<|>is[24]ifffifffi",
    c,
    HausInfo[i][hBesitzer],
    HausInfo[i][hKaufpreis],
    HausInfo[i][hIconX],
    HausInfo[i][hIconY],
    HausInfo[i][hIconZ],
    HausInfo[i][hIconID],
    HausInfo[i][hSpawnX],
    HausInfo[i][hSpawnY],
    HausInfo[i][hSpawnZ],
    HausInfo[i][hInteriorID]);
    format(string,sizeof(string),"--== Freistehendes Haus ==--\nDieses Haus steht zum Verkauf\nBenutze: /buyhouse\nKaufpreis: {FFCC00}$%d",HausInfo[i][hKaufpreis]);
    Create3DTextLabel(string,COLOR_WHITE,HausInfo[i][hIconX],HausInfo[i][hIconY],HausInfo[i][hIconZ],15,0,1);
    CreatePickup(HausInfo[i][hIconID],1,HausInfo[i][hIconX],HausInfo[i][hIconY],HausInfo[i][hIconZ]);
    }
    }
    mysql_free_result();
    return 1;
    }


    Und bei OnGameModeInit einfach LoadHouses(); oder?


    Hm langsam bin ich am verzweifeln..
    Habe immer ein printf reingesetzt diese werden auch alle geladen und angezeigt im Serverlog..

  • Ihr solltet euch mal das MySQL Referenzbuch durchlesen
    Was ihr hier für ein Müll reinpostet kann man nicht fassen


    Wozu 2 Querys?!


    Einer reicht
    stock LoadHouses()
    {
    new query[512],string[128];
    mysql_query("SELECT Besitzer,Kaufpreis,IconX,IconY,IconZ,IconID,SpawnX,SpawnY,SpawnZ,InteriorID FROM `Houses`");
    mysql_store_result();
    for(new i=0;i<mysql_num_rows();i++)
    {
    mysql_fetch_row(query);
    sscanf(query,"p<|>s[24]ifffifffi",
    HausInfo[i][hBesitzer],
    HausInfo[i][hKaufpreis],
    HausInfo[i][hIconX],
    HausInfo[i][hIconY],
    HausInfo[i][hIconZ],
    HausInfo[i][hIconID],
    HausInfo[i][hSpawnX],
    HausInfo[i][hSpawnY],
    HausInfo[i][hSpawnZ],
    HausInfo[i][hInteriorID]);
    format(string,sizeof(string),"--== Freistehendes Haus ==--\nDieses Haus steht zum Verkauf\nBenutze: /buyhouse\nKaufpreis: {FFCC00}$%d",HausInfo[i][hKaufpreis]);
    Create3DTextLabel(string,COLOR_WHITE,HausInfo[i][hIconX],HausInfo[i][hIconY],HausInfo[i][hIconZ],15,0,1);
    CreatePickup(HausInfo[i][hIconID],1,HausInfo[i][hIconX],HausInfo[i][hIconY],HausInfo[i][hIconZ]);
    }
    mysql_free_result();
    return 1;
    }

    All in all it's just another brick in the wall

  • Hallo,


    wenn ich den Server stoppe und dann starte und InGame gehe dann ist nichts mehr da (Haus"Technisch") also kein Pickup kein Label :/ Irgendwie komisch...
    Normal sollte doch alles angezeigt werden...
    Die Daten sind doch im 3DTextLabel richtig eingetragen...


    Mfg, Markus

  • das plugin von Blue G nutzt du oder?
    Dann schreib ich es dir mal eben um


    Teste mal das hier
    stock LoadHouses()
    {
    new query[512],string[128];
    mysql_query("SELECT Besitzer,Kaufpreis,IconX,IconY,IconZ,IconID,SpawnX,SpawnY,SpawnZ,InteriorID FROM `Houses`");
    mysql_store_result();
    for(new i=0;i<mysql_num_rows();i++)
    {
    mysql_fetch_row_format(query);
    sscanf(query,"p<|>s[24]ifffifffi",
    HausInfo[i][hBesitzer],
    HausInfo[i][hKaufpreis],
    HausInfo[i][hIconX],
    HausInfo[i][hIconY],
    HausInfo[i][hIconZ],
    HausInfo[i][hIconID],
    HausInfo[i][hSpawnX],
    HausInfo[i][hSpawnY],
    HausInfo[i][hSpawnZ],
    HausInfo[i][hInteriorID]);
    format(string,sizeof(string),"--== Freistehendes Haus ==--\nDieses Haus steht zum Verkauf\nBenutze: /buyhouse\nKaufpreis: {FFCC00}$%d",HausInfo[i][hKaufpreis]);
    Create3DTextLabel(string,COLOR_WHITE,HausInfo[i][hIconX],HausInfo[i][hIconY],HausInfo[i][hIconZ],15,0,1);
    CreatePickup(HausInfo[i][hIconID],1,HausInfo[i][hIconX],HausInfo[i][hIconY],HausInfo[i][hIconZ]);
    }
    mysql_free_result();
    return 1;
    }

    All in all it's just another brick in the wall

  • Ja ich denke schon.
    Gibts da unterschiede?
    Liegt es an sscanf vielleicht?