Beiträge von Jeffry

    Setze vor if(Mobile[playerid] != 255) bitte mal einen print:
    printf("mobile: %d / playerid: %d", Mobile[playerid], playerid);
    Was gibt dieser Print aus, wenn du etwas im Handychat schreiben willst?


    Und bitte nach dem format noch:
    printf("text: %s", string);

    Ok, gut.
    Vertauschen kann er das aber eigentlich nicht, da du ja beim Betreten nur auf die Exit Position abfragst, somit ist ihm die Position des Pfeils innen egal.


    Könnte es sein, dass du die Enter/Exit Positionen bei der Bank vertauscht hast? Drehe diese mal um und prüfe ob es dann geht.

    Wie kann ich aus einem Timer auslesen, wieviel Minuten er noch beträgt?

    Zum Beispiel so:

    Das solltest du so nicht ohne weiteres machen, da die Timer in SA-MP sehr ungenau sind und du somit bei längerer Laufzeit des Timers (mehrere Minuten) falsche Werte angezeigt bekommst.
    Entweder du nutzt das TimeFix Include (https://forum.sa-mp.com/showthread.php?t=289675) bzw. Plugin (https://forum.sa-mp.com/showthread.php?t=650736), dann kannst du den Code so nutzen, auch wenn es nicht die sauberste Variante ist.


    Die Alternative wäre, einen einzigen globalen Timer zu nutzen und diesen jede Sekunde einmal aufzurufen und darin dann solche Variablen abfragen und sobald diese kleiner gleich dem Timestamp sind, die gewünschte Funktion ausführen. Dann sparst du dir die x Timer, die am Laufen sind und hast alles übersichtlich an einer Stelle.


    Oder, wenn es nur darum geht, z.B. einen Befehl für eine bestimmte Zeit zu sperren, dann einfach so:
    blockedUntil[playerid] = gettime() + 5 * 60; //5 Minuten gesperrt
    Und dann:
    if(blockedUntil[playerid] > gettime())
    {
    //Befehl ist noch "remain_min" Minuten und "remain_sec" Sekunden gesperrt.
    }


    Kommt eben drauf an, für was du das brauchst.

    if(Mobile[playerid] != 255)
    Ist richtig.


    Du musst allerdings folgendes zusätzlich ändern:
    Mobile[playerid] = 0;
    zu:
    Mobile[playerid] = 255;


    Und, ganz wichtig, bei OnPlayerConnect bzw. beim Login:
    Mobile[playerid] = 255;
    Sonst ist die Variable initial 0, daher schreibst du dann immer im Handychat.

    Hat es was damit zutun, dass beide Punkte in der Range sind?

    Ja.


    Versuche es so, das liest den am nächsten liegenden Einstiegs-Punkt aus und nimmt den dann:
    if(GetPVarInt(playerid,"InBuilding")!=-1)
    {
    new e=GetPVarInt(playerid,"InBuilding");
    if(IsPlayerInRangeOfPoint(playerid,3.0,Building[e][IX],Building[e][IY],Building[e][IZ]))
    {
    SetPlayerPos(playerid,Building[e][EX],Building[e][EY],Building[e][EZ]);
    SetPlayerInterior(playerid,0);
    SetPlayerVirtualWorld(playerid,0);
    SetPVarInt(playerid,"InBuilding",-1);
    return 1;
    }
    }
    else
    {
    new Float:dist = 3.0, Float:tmp, e = -1;
    for(new i; i<sizeof(Building); i++)
    {
    tmp = GetPlayerDistanceFromPoint(playerid, Building[i][EX],Building[i][EY],Building[i][EZ]);
    if(tmp < dist)
    {
    dist = tmp;
    e = i;
    }
    }
    if(e != -1)
    {
    SetPlayerPos(playerid,Building[e][IX],Building[e][IY],Building[e][IZ]);
    if(Building[e][Interior]!=0)SetPlayerInterior(playerid,Building[e][Interior]);
    if(Building[e][Welt]!=0)SetPlayerVirtualWorld(playerid,Building[e][Welt]);
    SetPVarInt(playerid,"InBuilding",e);
    return 1;
    }
    }

    ConnectNPC("dodo1","dodo1rec");

    Das "dodo1rec" unterscheidet sich zum "dodo" in der NPC pwn. Passe das bitte gleichermaßen an.


    Bei ConnectNPC muss der Name der pwn Datei angegeben werden, und bei RECORDING der Name der rec Datei. Im besten Fall heißen alle Dateien gleich, um Fehler zu vermeiden.

    Erstelle die Dodo bitte mal an der Position 0 0 0, es könnte sein, dass dies auf Grund des integrierten Streamers beim Spawn des NPCs nicht klappt, wenn sie zu weit weg ist, sowas hatte ich auch mal.

    Soll ich das alte so lassen oder deins übernehmen, beide funktionieren.

    Ich bin da bei Douq, die Variablen sind nicht wirklich sprechend, es ist schwer zu sagen, we deine Umsetzung tatsächlich aussehen soll, aber ich vermute, dass es so passt, wie dein Code aktuell aussieht, da du das ja auf zwei Arrays getrennt hast, daher passt der Ansatz von Kaliber für mich auch nicht.
    Wenn dein Code funktioniert, dann nutze deinen Code.



    Kann ich eine easy Abfrage machen ob ein Biz betretbar ist mit dieser Variable?

    Ja, das könntest du so machen. Den Index (0, 1, 2) im zugehörigen Array des Biz speichern und entsprechend dem Wert dann den Text dieses Arrays ausgeben.

    Ich kann jetzt aber die Virtuelle Welt ID nicht mitnehmen, da hier ja Floats abgespeichert werden, was soll ich tun? 1.0 ?

    Sauber wäre es, über ein enum zu arbeiten, dann kannst du mitgeben, welcher Wert Float und welcher Integer ist.
    Ansonsten, mit 1.0 und im loop mit floatround den Wert zum Integer "runden". Das wäre die "Quick & Dirty" Lösung.

    Schreibe den gleichen Code bitte mal zwei mal hintereinander hin, sprich:
    CreateDynamicPickup(1239,1,supermarkt[i][0],supermarkt[i][1],supermarkt[i][2]);
    Create3DTextLabel("x", YELLOW,supermarkt[i][0],supermarkt[i][1],supermarkt[i][2], 9.0, 0, 0);
    CreateDynamicPickup(1239,1,supermarkt[i][0],supermarkt[i][1],supermarkt[i][2]);
    Create3DTextLabel("x", YELLOW,supermarkt[i][0],supermarkt[i][1],supermarkt[i][2], 9.0, 0, 0);


    Klappt es dann?


    Wenn ja, dann ist dies das erste Label (ID 0) und du löschst das irgendwo weiter unten im Code fälschlicherweise.