Gebäude automatisch betreten | Beim Verlassen wird die Falsche 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
  • Hey, wie mache ich das, dass wenn der Spieler automatisch in den Interior geht, er nicht gleich wieder raus geht? Also wie muss der Timer aussehen?


    Ich hab das bis jetzt so gemacht:


    public OnPlayerPickUpPickup(playerid, pickupid)
    {
    for(new i=0; i<sizeof(iInfo); i++){
    if(!IsPlayerInRangeOfPoint(playerid,1,iInfo[i][IP_X],iInfo[i][IP_Y],iInfo[i][IP_Z]))continue;
    SetPlayerPos(playerid,iInfo[i][IP_IntX],iInfo[i][IP_IntY],iInfo[i][IP_IntZ]);
    SetPlayerInterior(playerid,iInfo[i][IP_Interior]);
    SetPlayerVirtualWorld(playerid,i);
    return 1;
    }
    return 1;
    }


    enum InteriorPos{
    Float:IP_X,
    Float:IP_Y,
    Float:IP_Z,
    Float:IP_IntX,
    Float:IP_IntY,
    Float:IP_IntZ,
    IP_Interior
    }


    new iInfo[][InteriorPos] = {
    {1554.8782,-1675.6160,16.1953,238.6850,139.3324,1003.0234,3},
    {238.6850,139.3324,1003.0234,1554.8782,-1675.6160,16.1953,0}
    };


    Noch dazu wird der Spieler beim Verlassen nicht in die Virtuelle Welt 0 gesetzt.

    Mit freundlichen Grüßen,
    Derakar

  • Kannst du so schreiben:
    public OnPlayerPickUpPickup(playerid, pickupid)
    {
    static lastIn[MAX_PLAYERS];
    if(gettime() > lastIn[playerid] + 3)
    {
    for(new i=0; i<sizeof(iInfo); i++)
    {
    if(!IsPlayerInRangeOfPoint(playerid,1,iInfo[i][IP_X],iInfo[i][IP_Y],iInfo[i][IP_Z]))continue;
    lastIn[playerid] = gettime();
    SetPlayerPos(playerid,iInfo[i][IP_IntX],iInfo[i][IP_IntY],iInfo[i][IP_IntZ]);
    SetPlayerInterior(playerid,iInfo[i][IP_Interior]);
    SetPlayerVirtualWorld(playerid,i);
    return 1;
    }
    }
    return 1;
    }

  • Was heißt, "die falsche Welt"? Du setzt die Welt zum Index in iInfo. Wenn das falsch ist, dann erstelle eine neue Spalte im iInfo, nenne es IP_World und schreibe die Welt zu den Daten dazu, ebenso bei SetPlayerVirtualWorld.
    Und was meinst du mit "nicht sofort"? Was passiert, wenn du in das Pickup läufst?

  • ja das mit der Welt ist mir aufgefallen durch die schleife bekommt er jeder eine neue Welt und beim Verlassen bekommt er dann wieder eine andere Welt.


    Wenn ich in das Pickup laufe passiert erst nichts und danach portet der dann. (Type: 1)

    Mit freundlichen Grüßen,
    Derakar

  • Nach dem Teleport, also wenn du wieder raus geht dauert es? Das ist ja klar, es ist für 3 Sekunden gesperrt.


    Das Problem mit der Welt verstehe ich nicht.
    Rein => Welt 0 => Raus => Welt 1 => Rein => Welt 0 => Raus => Welt 0 => ... Ist das falsch?


  • Ich verstehe das problem zwar nicht ganz, aber wenn er in die falsche VirtualWorld kommt..


    SetPlayerVirtualWorld(playerid,i);
    wuerde ich einfach zu
    SetPlayerVirtualWorld(playerid,0);
    ändern.. oder sehe ich da was falsch?


    weil er setzt die VW ja nicht auf 0, so wie es standart ist.. so wuerde ich jetzt denken.. korrigiere mich wenn ich falsch liege

  • Also. Wenn ich (nicht im Interior) in das Pickup gehe portet er mich nicht direkt sondern dauert etwas (auch ohne den Timer).


    Und das mit der VW. Ja ich denke das muss dann so gemacht werden. Aber wie mache ich das dann, wenn ich mehrere BugerShots oder so hab. Wenn alle die WV 0 haben sehen sich ja spieler die z.B. im BSN und im BSS.

    Mit freundlichen Grüßen,
    Derakar

  • Die Verzögerung kann an allem möglichen liegen. Von der Hardware der Maschine bis zu irgendeinem Code. Das kann ich dir leider nicht sagen, da musst du nach dem Grund suchen.


    Zwecks der Virtual World:
    Mache es wie mit dem Interior. Lege es einfach in dem iInfo an, nach dem Interior. Dann kannst du angeben, wann welche Welt vergeben werden soll.
    Beim Teleport machst du dann:
    SetPlayerVirtualWorld(playerid,iInfo[i][IP_World]);