Spawn

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,


    Ich habe versucht das man am Haus spawnt, es geht aber leider nicht, man landet immer an diesem Bauernhof, also am Map Mittelpunkt, weiß aber nicht warum :(


    Spawn:


    for(new hausid; hausid<200; hausid++)
    SetPlayerPos(playerid,HausInfo[hausid][haus_x],HausInfo[hausid][haus_y],HausInfo[hausid][haus_z]);



    Stock:


    stock LoadHaus(hausid)
    {
    new pfad[50];
    format(pfad,50,"/haus/%d.txt",hausid);
    if(!fexist(pfad))return 0; //überprüft ob die Datei existiert, wenn nicht wird 0 zurückgegeben


    HausInfo[hausid][haus_x] = dini_Float(pfad,"x"); // hier laden wir die Werte
    HausInfo[hausid][haus_y] = dini_Float(pfad,"y");
    HausInfo[hausid][haus_z] = dini_Float(pfad,"z");
    HausInfo[hausid][haus_preis] = dini_Int(pfad,"preis");
    HausInfo[hausid][haus_innenraum] = dini_Int(pfad,"innenraum");
    format(HausInfo[hausid][haus_besitzer],32,"%s",dini_Get(pfad,"besitzer"));
    HausInfo[hausid][haus_pickup] = CreatePickup(1273 ,23,HausInfo[hausid][haus_x],HausInfo[hausid][haus_y],HausInfo[hausid][haus_z],0); //erstellt ein Pickup an den Hauskoordinaten
    new s[128]; //Hier erstellen wir einen neuen String, diesen formatieren wir mit den nötigen Infos:
    format(s,128,"{E01B1B}****Haus****\n{FA7D00}Besitzer: %s\n{0AFA2A}Kaufpreis: %d$",HausInfo[hausid][haus_besitzer],HausInfo[hausid][haus_preis]); //dürfte wohl klar sein
    HausInfo[hausid][haus_label] = Create3DTextLabel(s,0xFF00FF,HausInfo[hausid][haus_x],HausInfo[hausid][haus_y],HausInfo[hausid][haus_z],20,0,1); //Hier erstellen wir das Label. Die ID wird in HausInfo[hausid][haus_label] gespeichert (das ist wichtig für uns, da wir das Label später wieder löschen wollen!)
    return print("Das Haus wurde erfolgreich geladen");
    }

  • Dir ist bewusst, dass während deiner Schleife 200x die Spielerposition gewechselt wird? Die Schleife läuft bis 200, wenn dann kein Haus mit der ID 200 existiert (also die Variablen HausInfo[200][haus_x] usw. noch nicht initialisiert sind), wird der Spieler zwangsläufig zu 0,0,0 teleportiert (was ja der Bauernhof ist).
    Du kannst das in etwa so lösen:
    enum haus_info {
    bool:haus_initialisiert; // Diese Bool einfügen zum Abfragen.
    }


    for(new hausid; hausid<200; hausid++) LoadHaus(hausid); // In OnGameModeInit


    // Bei OnPlayerSpawn, idealerweise aber bei OnPlayerClassRequest mit SetPlayerSpawnInfo arbeiten
    new haus = GetPlayerHaus(playerid);
    if(haus == -1) SetPlayerPos(playeryid, 100, 200, 300); // Spieler hat kein Haus -> Anfangsspawn
    else SetPlayerPos(playerid,HausInfo[haus][haus_x],HausInfo[haus][haus_y],HausInfo[haus][haus_z]);


    // Folgendes noch NACH der Existenzprüfung der Datei im Callback LoadHaus einfügen:
    HausInfo[hausid][haus_initialisiert] = true;


    // Neuer Stock - Kannst du auch öfters verwenden
    stock GetPlayerHaus(playerid)
    {
    new pName[24];
    GetPlayerName(playerid, pName, 24);
    for(new i=0; i<200; i++)
    {
    if(!HausInfo[i][haus_initialisiert]) continue;
    if(!strcmp(HausInfo[i][haus_besitzer], pName)) return i;
    }
    return -1;
    }


    Mit freundl. Grüßen
    Padarom

    Ich bin
    .. seit etwa 2007 in der Webentwicklung tätig, seit 2013 professionell
    .. Erfahrener Entwickler in PHP, Swift, Javascript, Typescript und Ruby. Zusätzlich habe ich Erfahrung in Python, Java, C#, C++, Prolog und einigen esoterischen Programmiersprachen
    .. Luftfahrtenthusiast und Segelflieger