Spieler wird nicht in eine neue Virtuale Welt gesetzt

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 der Befehl:
    ocmd:betreten(playerid)
    {
    if(NearestHaus(playerid) == -1)return SendClientMessage(playerid,-1,"Du bist nicht in der Nähe eines Hauses!");
    if(Haus[NearestHaus(playerid)][haus_lock] == 1)return SendClientMessage(playerid,-1,"Das Haus ist verschlossen!");


    SetPlayerPos(playerid,Haus[NearestHaus(playerid)][haus_xi],Haus[NearestHaus(playerid)][haus_yi],Haus[NearestHaus(playerid)][haus_zi]);
    SetPlayerInterior(playerid,Haus[NearestHaus(playerid)][haus_int]);
    SetPlayerVirtualWorld(playerid,Haus[NearestHaus(playerid)][haus_vw]);
    SetPVarInt(playerid,"ImHaus",NearestHaus(playerid));
    return SendClientMessage(playerid,-1,"Du hast das Haus betreten.");
    }


    Hier wird das mit dem haus_vw nochmal genutzt:
    stock NearestExit(playerid)
    {
    new Float:dist0,ID = -1;
    new Float:dist1 = 2,Float:px,Float:py,Float:pz;
    for(new i = 1; i<MAX_HAUS; i++)
    {
    if(Haus[i][haus_vw]!=GetPlayerVirtualWorld(playerid)) continue;
    GetPlayerPos(playerid,px,py,pz);
    dist0 = GetPlayerDistanceFromPoint(playerid,Haus[i][haus_xi],Haus[i][haus_yi],Haus[i][haus_zi]);
    if(dist0 < dist1) dist1 = dist0,ID = i;
    }
    return ID;
    }


    Was genau bewirkt denn die Abfrage bei dem Stock?
    Eigentlich setzen man die Spieler doch damit in eine ander VirtualeWorld: SetPlayerVirtualWorld(playerid,+1);
    Das Problem ist das mit der VirtualenWorld in dem ocmd: Befehl funktioniert nicht.

  • Mach mal das SetPlayerPos vor dem 'return ...'


    Die Abfrage bei der stock-Funktion gibt das näheste Haus (die ID) zurück. .
    Bei dem Befehl 'betreten' kannst du 'NearestHaus' auch einer Integer-Variable zuteilen, dann frisst das auch noch weniger Ressourcen. Dann musst du aber auch überall anstatt 'NearestHaus (playerid)' 》beispielsweise 'h_id' machen...

    Mit freundlichen Grüßen
    ErikSon



    Scripte kleine Systeme auf Anfrage umsonst!
    Per PN könnt ihr mir gerne Scriptingfragen stellen.

    Einmal editiert, zuletzt von ErikSon ()

  • Mach mal das SetPlayerPos vor dem 'return ...'


    Die Abfrage bei der stock-Funktion gibt das näheste Haus (die ID) zurück. .
    Bei dem Befehl 'betreten' kannst du 'NearestHaus' auch einer Integer-Variable zuteilen, dann frisst das auch noch weniger Ressourcen. Dann musst du aber auch überall anstatt 'NearestHaus (playerid)' 》beispielsweise 'h_id' machen...


    Danke für die schnelle Antwort.
    Meinst du das so:
    ocmd:betreten(playerid)
    {
    if(NearestHaus(playerid) == -1)return SendClientMessage(playerid,-1,"Du bist nicht in der Nähe eines Hauses!");
    if(Haus[NearestHaus(playerid)][haus_lock] == 1)return SendClientMessage(playerid,-1,"Das Haus ist verschlossen!");


    SetPlayerInterior(playerid,Haus[NearestHaus(playerid)][haus_int]);
    SetPlayerVirtualWorld(playerid,Haus[NearestHaus(playerid)][haus_vw]);
    SetPVarInt(playerid,"ImHaus",NearestHaus(playerid));
    SendClientMessage(playerid,-1,"Du hast das Haus betreten.");
    return SetPlayerPos(playerid,Haus[NearestHaus(playerid)][haus_xi],Haus[NearestHaus(playerid)][haus_yi],Haus[NearestHaus(playerid)][haus_zi]);
    }


    Und mit nearest Haus meinst du das so:
    if(NearestHaus(playerid) == -1)return SendClientMessage(playerid,-1,"Du bist nicht in der Nähe eines Hauses!");
    Zu
    if(h_id(playerid) == -1)return SendClientMessage(playerid,-1,"Du bist nicht in der Nähe eines Hauses!");

  • 1. Ja, genau..
    2. Nein.. So
    ocmd:betreten(playerid)
    {
    new h_id = NearestHaus (playerid);
    if(h_id == -1)return SendClientMessage(playerid,-1,"Du bist nicht in der Nähe eines Hauses!");
    if(Haus[h_id][haus_lock] == 1)return SendClientMessage(playerid,-1,"Das Haus ist verschlossen!");


    SetPlayerInterior(playerid,Haus[h_id][haus_int]);
    SetPlayerVirtualWorld(playerid,Haus[h_id][haus_vw]);
    SetPVarInt(playerid,"ImHaus",h_id);
    SendClientMessage(playerid,-1,"Du hast das Haus betreten.");
    return SetPlayerPos(playerid,Haus[h_id][haus_xi],Haus[h_id][haus_yi],Haus[h_id][haus_zi]);
    }


    #Handy


  • Danke für die schnelle Antwort habe das mit h_id jetzt wirklich überall gemacht.
    Aber das mit der Virtuelen Welt klappt nicht ganz.
    Beide gehen in verschieden Interiors rein doch spwanen trotzdem in einem.

  • Aber das mit der Virtuelen Welt klappt nicht ganz.
    Beide gehen in verschieden Interiors rein doch spwanen trotzdem in einem.


    Versuch mal bitte folgenden Code und sag, was dann ausgegeben wird:]ocmd:betreten(playerid)
    {
    new _str[128]; // <-- diese
    new h_id = NearestHaus (playerid);
    if(h_id == -1)return SendClientMessage(playerid,-1,"Du bist nicht in der Nähe eines Hauses!");
    if(Haus[h_id][haus_lock] == 1)return SendClientMessage(playerid,-1,"Das Haus ist verschlossen!");


    SetPlayerInterior(playerid,Haus[h_id][haus_int]);
    SetPlayerVirtualWorld(playerid,Haus[h_id][haus_vw]);
    SetPVarInt(playerid,"ImHaus",h_id);
    SendClientMessage(playerid,-1,"Du hast das Haus betreten.");
    format(_str, 128, "VWorld: %d", Haus[h_id][haus_vw]); // <-- diese
    SendClientMessage(playerid, -1, _str); // <-- diese
    return SetPlayerPos(playerid,Haus[h_id][haus_xi],Haus[h_id][haus_yi],Haus[h_id][haus_zi]);
    }Dann siehst du, ob es vll daran liegen könnte, dass haus_vw falsch gesetzt sein könnte ^^

  • Mach anstatt "Haus [h_id][haus_vw]" 》 "h_id"


    Klappt jetzt aber es wird immernoch ausgebeben bei beiden Virtual World: 0!
    Und /Verlassen klappt nicht.
    Aber danke trotzdem schonmal!
    ocmd:betreten(playerid)
    {
    new _str[128]; // <-- diese
    new h_id = NearestHaus (playerid);
    if(h_id == -1)return SendClientMessage(playerid,-1,"Du bist nicht in der Nähe eines Hauses!");
    if(Haus[h_id][haus_lock] == 1)return SendClientMessage(playerid,-1,"Das Haus ist verschlossen!");


    SetPlayerInterior(playerid,Haus[h_id][haus_int]);
    SetPlayerVirtualWorld(playerid,h_id);
    SetPVarInt(playerid,"ImHaus",h_id);
    SendClientMessage(playerid,-1,"Du hast das Haus betreten.");
    format(_str, 128, "VWorld: %d", Haus[h_id][haus_vw]); // <-- diese
    SendClientMessage(playerid, -1, _str); // <-- diese
    return SetPlayerPos(playerid,Haus[h_id][haus_xi],Haus[h_id][haus_yi],Haus[h_id][haus_zi]);
    }

  • Ist klar, dass 0 ausgegeben wird. .. Du musst 'h_id' ausgeben, nicht Haus [..][..]


    Funktioniert bis dahin tadellos, doch leider geht das verlassen nicht mehr:
    ocmd:verlassen(playerid)
    {
    if(!GetPVarInt(playerid,"ImHaus"))return SendClientMessage(playerid,-1,"Du bist in keinem Haus!");
    if(NearestExit(playerid) == -1)return SendClientMessage(playerid,-1,"Du bist nicht in der Nähe der hausabschliessen!");

    new ID = GetPVarInt(playerid,"ImHaus");
    SetPlayerPos(playerid,Haus[ID][haus_x],Haus[ID][haus_y],Haus[ID][haus_z]);
    SetPlayerInterior(playerid,0);
    SetPlayerVirtualWorld(playerid,0);
    SendClientMessage(playerid,-1,"Du hast das Haus verlassen.");
    return DeletePVar(playerid,"ImHaus");
    }


    //Edti habe bei:
    NearsExit einfach das rausgemacht: if(Haus[i][haus_vw]!=GetPlayerVirtualWorld(playerid)) continue;