SetPlayerCheckpoint - Größe des Checkpoints - Fehler

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 Leute.


    Ich habe eben versucht ein Tutorial zu erstellen, sobald ich aber den nächsten Checkpoint setze, behält er die Größe des alten Checkpoints bei.
    Also ich setze als allererstes einen Checkpoint am Las Venturas Airport für eine Roller-Vermietung. Die Größe ist auf 2.0 gesetzt, und es klappt alles wunderbar.
    Dann soll der Spieler den Befehl "/Roller" eintippen damit er einen Roller erhält. Sobald er den Roller hat, wird ein neuer Checkpoint vor die Stadthalle gesetzt.
    Das klappt bis dahin auch ganz gut. Und sobald ich dann einen neuen Checkpoint setze, wo die Größe z.B. auf 2.0 anstatt 4.0 gesetzt ist, bleibt die Größe bei 4.0.
    Hier mal ein kleiner Quelltext der Checkpoints.
    public OnPlayerEnterCheckpoint(playerid)
    {
    if(pCheckpoint[playerid] == CP_ROLLER_VERMIETUNG)
    {
    pCheckpoint[playerid] = CP_NONE;
    DisablePlayerCheckpoint(playerid);
    SendClientMessage(playerid, COLOR_GREEN, "Willkommen bei der Roller-Vermietung in Las Venturas.");
    }
    else if(pCheckpoint[playerid] == CP_STADTHALLE_TUT)
    {
    pCheckpoint[playerid] = CP_STADTHALLE_T2;
    SetPlayerCheckpoint(playerid, 2447.6890,2376.2288,12.1635, 2.0);
    SendClientMessage(playerid, COLOR_WHITE, "Gehe nun in die Stadthalle rein. Die meisten Gebäude kannst du mit der Taste \"Enter\" betreten.");
    }
    else if(pCheckpoint[playerid] == CP_STADTHALLE_T3)
    {
    pCheckpoint[playerid] = CP_NONE;
    DisablePlayerCheckpoint(playerid);
    }
    return 1;
    }


    CMD:roller(playerid)
    {
    if(IsPlayerInRangeOfPoint(playerid, 2.0, 1713.8268,1303.3132,10.8279))
    {
    if(pRoller[playerid] != INVALID_VEHICLE_ID)
    {
    SendClientMessage(playerid, COLOR_GREY, "Du hast bereits einen Roller gemietet.");
    return 1;
    }
    if(GetPlayerMoney(playerid) < 30)
    {
    SendClientMessage(playerid, COLOR_GREY, "Um einen Roller mieten zu können, benötigst du 30€.");
    return 1;
    }
    new rZufall = random(sizeof(rRollerSpawn));
    pRoller[playerid] = CreateVehicle(462, rRollerSpawn[rZufall][0],rRollerSpawn[rZufall][1],rRollerSpawn[rZufall][2],rRollerSpawn[rZufall][3],0,0,-1);
    new str[32];
    format(str, sizeof(str), "{26BD00}VRL{FFFFFF} %d", pRoller[playerid]);
    SetVehicleNumberPlate(pRoller[playerid], str);
    SetVehicleToRespawn(pRoller[playerid]);
    PutPlayerInVehicle(playerid, pRoller[playerid], 0);
    if(pDoTut[playerid] == 1)
    {
    SendClientMessage(playerid, COLOR_GREY, "Fahre nun mit deinem Roller zur Stadthalle.");
    pCheckpoint[playerid] = CP_STADTHALLE_TUT;
    SetPlayerCheckpoint(playerid, 2429.9668,2375.9519,10.2714, 4.0);
    }
    }
    else
    {
    SendClientMessage(playerid, COLOR_GREY, "Du bist nicht in der Nähe der Roller-Vermietung.");
    return 1;
    }
    return 1;
    }
    public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
    {
    if(newkeys & KEY_SECONDARY_ATTACK)
    {
    if(IsPlayerInRangeOfPoint(playerid, 2.0, 2447.6890,2376.2288,12.1635))//SH Außen
    {
    if(pCheckpoint[playerid] == CP_STADTHALLE_T2)
    {
    pCheckpoint[playerid] = CP_STADTHALLE_T3;
    SetPlayerCheckpoint(playerid, 362.0343,173.5644,1008.3828, 2.0);
    SendClientMessage(playerid, COLOR_WHITE, "Gehe nun zum Informations-Zeichen und tippe /stadthalle.");
    }
    SendClientMessage(playerid, COLOR_GREEN, "Willkommen in der Las Venturas Stadthalle!");
    SetPlayerInterior(playerid, 3);
    SetPlayerVirtualWorld(playerid, 0);
    SetPlayerPos(playerid, 387.8018,173.6864,1008.3828);
    }
    }
    return 1;
    }


    Danke im Voraus. Ich hoffe es lässt sich eine Lösung finden.


    (e) Rechtschreibfehler
    (e) Noch etwas hinzugefügt
    (e) Kann mir niemand helfen? :(
    (e) Möchte mir irgendwie nie jemand helfen? Ich benötige echt dringend Hilfe!
    (e) Ich versuche mal, bevor ich "SetPlayerCheckpoint" benutze ein "DisablePlayerCheckpoint" zu machen. ;)
    (e) Geht leider auch nicht. Sobald ich den Radius eines CP's auf 4.0 mache und einen anderen anzeigen möchte, wird jeder als 4.0 angezeigt!
    (e) Geht das bei jemandem von euch denn ebenfalls nicht? Wäre sehr interessant.
    (e) Überschrift geändert

  • Möglicherweise ein SAMP oder ein GTA: SA Fehler.


    Versuch dem Clienten zusagen, das er die Informationen über den letzen Checkpoint vergessen soll.
    Normalerweise müsstest du ihn kicken, aber DisablePlayerCheckpoint dürfte den gleichen effekt haben.


    Soll heißen, vor jeder Verwendung von SetPlayerCheckpoint DisablePlayerCheckpoint benutzen

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • @BlackAce
    Benutze ich ja. ;)
    Da passiert nichts.
    Also:
    Ich registriere mich und zeige dem Spieler nen Checkpoint an und gleichzeitig wird eine Variable gesetzt. (auf 1)
    Der Checkpoint geht zur Roller-Mietung. (Größe: 2.0) wird alles angezeigt. Ich renne rein und der Checkpoint verschwindet, was er auch soll. Zugleich erhalte ich eine Nachricht ect, ect.
    Dann nehme ich einen Roller und der Checkpoint der mich vor die "Stadthalle" führt, wird angezeigt. (Größe: 4.0)
    Bis hierhin ist alles okay. Fahre ich in den Checkpoint vor der SH rein, wird ein neuer Checkpoint erstellt, der auf der genauen Marker-Position der Stadthalle anzeigt. Also der eine Checkpoint ist für die Straße vor der SH und dann wird ein neuer angezeigt wo man genau hin muss, und dieser sollte eigentlich 2.0 als Größe haben, hat aber 4.0 genau wie alle anderen danach.

  • if(pDoTut[playerid] == 1)
    {
    SendClientMessage(playerid, COLOR_GREY, "Fahre nun mit deinem Roller zur Stadthalle.");
    pCheckpoint[playerid] = CP_STADTHALLE_TUT;
    SetPlayerCheckpoint(playerid, 2429.9668,2375.9519,10.2714, 4.0);
    }


    bei deinem Befehl ist das ja noch richtig,
    aber schau mal hier


    Es ist genau das was ich meine,
    du hast hier kein DisablePlayerCheckpoint, das wird wohl das Problem sein,
    der Client hat noch die alten Informationen vom vorherigen Checkpoint
    und wird aus mir nicht bekannten Gründen nicht aktuallisiert (Kalcor hat wohl mist gemacht)
    Befolge meinen Rat und das Problem dürfte gelöst sein.

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Das ist ein bekannter Fehler.
    Ein kleiner Trick ist da, denn Checkpoint etwas zeitversetzt anzeigen zu lassen. Am besten eine extra Funktion schreiben,die per SetTimerEx aufgerufen wird.
    Vorher aber natürlich DisablePlayerCheckpoint ausführen.

  • Wie genau "Zeitversetzt", sprich wieviele ms?


    (e) Sollte das hier dann klappen?

    stock v_SetPlayerCheckpoint(playerid, Float:x, Float:y, Float:z, Float:size, type)
    {
    SetTimerEx("CheckpointTimer", 500, 0, "ifffffi", playerid, x,y,z, size, type);
    return 1;
    }


    forward CheckpointTimer(playerid, Float:x, Float:y, Float:z, Float:size, type);
    public CheckpointTimer(playerid, Float:x, Float:y, Float:z, Float:size, type)
    {
    if(IsPlayerConnected(playerid) && Spieler[playerid][pConnected])
    {
    if(type == 0)
    {
    DisablePlayerCheckpoint(playerid);
    pCheckpoint[playerid] = 0;
    return 1;
    }
    DisablePlayerCheckpoint(playerid);
    SetPlayerCheckpoint(playerid, x,y,z,size);
    pCheckpoint[playerid] = type;
    }
    return 1;
    }


    Ich hoffe mal. ;)

  • Nein. So macht das ganze ja gar keinen Sinn.Du sollst erst DisablePlayerCheckpoint aufrufen und danach zeitversetzt SetPlayerCheckpoint. Sonst hast du ja genau das gleiche wie vorher auch.
    Außerdem ist hier ein f zu viel:
    SetTimerEx("CheckpointTimer", 500, 0, "ifffffi", playerid, x,y,z, size, type);


    Ich meinte es eher so:
    stock v_SetPlayerCheckpoint(playerid, Float:x, Float:y, Float:z, Float:size)
    {
    DisablePlayerCheckpoint(playerid);
    SetTimerEx("CheckpointTimer", 37, 0, "iffff", playerid, x,y,z, size); // 500 ist bischen viel. 37 ist gut,Primzahlen |o/
    return 1;
    }


    forward CheckpointTimer(playerid, Float:x, Float:y, Float:z, Float:size);
    public CheckpointTimer(playerid, Float:x, Float:y, Float:z, Float:size)
    {
    SetPlayerCheckpoint(playerid, x,y,z,size);
    return 1;
    }

  • Keine Ahnung auf wieviel. Ausprobieren und daraus schlau werden. Ich hab dir den Code sowieso mit 37ms angegeben. Das 500ms zu viel ist,sollte dir aber auch klar sein.Denn dann dauert es ja eine halbe Sekunden bis der Checkpoint angezeigt wird. Ich hatte es bei mir auf 60ms, hat auch wunderbar geklappt. Weiss aber auch nicht,wie weit du mit der Zeit runter gehen kannst. Ob jetzt 60ms oder 37ms, merken wirst du es sowieso nicht.