OnPlayerStateChange wird nicht aufgerufen

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 Community!
    Anscheind wird bei mir nicht OnPlayerStateChange aufgerufen.
    Ich möchte abfragen ob er im Autohaus car ist wenn ja soll ein Dialog kommen, aber es kommt rein garnix.
    Nun habe ich versucht es zu printen leider ohne erfolg, bei dem print kam garnix raus, deshalb vermute ich dass er OnPlayerStateChange nicht aufruft.


    public OnPlayerStateChange(playerid, newstate, oldstate)
    {
    if(newstate == PLAYER_STATE_DRIVER)
    {
    new vID = GetPlayerVehicleID(playerid);
    for(new i=0; i<sizeof(ahCars); i++)
    {
    if(ahCars[i][id_x]!=vID)continue;
    printf("%s ist im Autohaus car %s, id: %i drinne.",SpielerName(playerid),VehicleName[vID-400],ahCars[i][id_x]);
    SetPVarInt(playerid,"BuyCarID",i);
    new string[250];
    format(string,250,"{0089E5}Fahrzeug: {FEFEFE}%s\n{0089E5}Kaufpreis: {FEFEFE}%d$\n{0089E5}Kauflevel: {FEFEFE}%d\n\n\
    Möchten sie das Fahrzeug kaufen?",VehicleName[vID-400],ahCars[i][c_preis],ahCars[i][c_level]);
    ShowPlayerDialog(playerid,DIALOG_AHKAUFEN,DIALOG_STYLE_MSGBOX,"Autohaus",string,"Kaufen","Abbrechen");
    printf("Dialog wurde aufgerufen\n%s",string);
    break;
    }
    return 1;
    }
    return 1;
    }

  • Du kannst ganz einfach abfragen ob OnPlayerStateChange aufgerufen wird. Füge einfach oben in dem Callback ein print ein, und schaue dann was in die Konsole eingetragen wird.

  • public OnPlayerStateChange(playerid, newstate, oldstate)
    {
    print("OnPlayerStateChange wurde aufgerufen!");
    if(newstate == PLAYER_STATE_DRIVER)
    {
    printf("%d ist im Auto als Fahrer",playerid);
    new vID = GetPlayerVehicleID(playerid);
    printf("Vehicle-ID: %d",vID);
    for(new i=0; i<sizeof(ahCars); i++)
    {
    if(ahCars[i][id_x]!=vID)continue;
    printf("%s ist im Autohaus car %s, id: %i drinne.",SpielerName(playerid),VehicleName[vID-400],ahCars[i][id_x]);
    SetPVarInt(playerid,"BuyCarID",i);
    new string[250];
    format(string,250,"{0089E5}Fahrzeug: {FEFEFE}%s\n{0089E5}Kaufpreis: {FEFEFE}%d$\n{0089E5}Kauflevel: {FEFEFE}%d\n\n\
    Möchten sie das Fahrzeug kaufen?",VehicleName[vID-400],ahCars[i][c_preis],ahCars[i][c_level]);
    ShowPlayerDialog(playerid,DIALOG_AHKAUFEN,DIALOG_STYLE_MSGBOX,"Autohaus",string,"Kaufen","Abbrechen");
    printf("Dialog wurde aufgerufen\n%s",string);
    break;
    }
    return 1;
    }
    return 1;
    }
    Mach das mal so, und schicke mir was geprintet wurde.

  • Es wurde folgendes geprintet,
    dabei ist der server auch abgestürzt.


    Code
    [20:59:29] OnPlayerStateChange wurde aufgerufen!
    [20:59:29] 0 ist im Auto als Fahrer
    [20:59:29] Vehicle-ID: 9
    [20:59:31] OnPlayerStateChange wurde aufgerufen!
    [21:00:11] --- Server Shutting Down.
  • Sorry für die späte antwort.
    Habe das jetzt nochmal getestet diesmal ist der Server nicht abgestürzt.


    Hier das enum:
    enum autohauscarSystem {
    model,
    Float:c_x,
    Float:c_y,
    Float:c_z,
    Float:c_r,
    c_preis,
    c_level,
    ah_id,
    id_x
    }

  • Lass es mal so laufen:
    public OnPlayerStateChange(playerid, newstate, oldstate)
    {
    printf("OnPlayerStateChange wurde aufgerufen! (playerid: %d)", playerid);
    if(newstate == PLAYER_STATE_DRIVER)
    {
    printf("%d ist im Auto als Fahrer",playerid);
    new vID = GetPlayerVehicleID(playerid);
    printf("Vehicle-ID: %d",vID);
    for(new i=0; i<sizeof(ahCars); i++)
    {
    printf("id_x: %d (i=%d)", ahCars[i][id_x],i);
    if(ahCars[i][id_x]!=vID) continue;
    printf("%s ist im Autohaus. Fahrzeug: %s | i: %d ",SpielerName(playerid),VehicleName[vID-400],i);
    SetPVarInt(playerid,"BuyCarID",i);
    new string[250];
    format(string,250,"{0089E5}Fahrzeug: {FEFEFE}%s\n{0089E5}Kaufpreis: {FEFEFE}%d$\n{0089E5}Kauflevel: {FEFEFE}%d\n\n\
    Möchten sie das Fahrzeug kaufen?",VehicleName[vID-400],ahCars[i][c_preis],ahCars[i][c_level]);
    ShowPlayerDialog(playerid,DIALOG_AHKAUFEN,DIALOG_STYLE_MSGBOX,"Autohaus",string,"Kaufen","Abbrechen");
    printf("Dialog wurde aufgerufen\n%s",string);
    break;
    }
    return 1;
    }
    return 1;
    }


    Falls der Server abstürzt: crashdetect + Log
    ansonsten nur den Log posten.


    Falls dir er Log komisch vorkommt kannst du auch gleich noch die Erstellung der Fahrzeuge mitposten.

  • Der Log sieht so aus:

  • Ah, jetzt seh ich den Fehler. vID - 400 ist falsch. Das muss die Model ID sein, nicht die Vehicle ID.
    Debugging ist einfach toll! :thumbup:



    public OnPlayerStateChange(playerid, newstate, oldstate)
    {
    printf("OnPlayerStateChange wurde aufgerufen! (playerid: %d)", playerid);
    if(newstate == PLAYER_STATE_DRIVER)
    {
    printf("%d ist im Auto als Fahrer",playerid);
    new vID = GetPlayerVehicleID(playerid);
    new mID = GetVehicleModel(vID);
    printf("Vehicle-ID: %d",vID);
    for(new i=0; i<sizeof(ahCars); i++)
    {
    printf("id_x: %d (i=%d)", ahCars[i][id_x],i);
    if(ahCars[i][id_x]!=vID) continue;
    printf("%s ist im Autohaus. Fahrzeug: %s | i: %d ",SpielerName(playerid),VehicleName[mID-400],i);
    SetPVarInt(playerid,"BuyCarID",i);
    new string[250];
    format(string,250,"{0089E5}Fahrzeug: {FEFEFE}%s\n{0089E5}Kaufpreis: {FEFEFE}%d$\n{0089E5}Kauflevel: {FEFEFE}%d\n\n\
    Möchten sie das Fahrzeug kaufen?",VehicleName[mID-400],ahCars[i][c_preis],ahCars[i][c_level]);
    ShowPlayerDialog(playerid,DIALOG_AHKAUFEN,DIALOG_STYLE_MSGBOX,"Autohaus",string,"Kaufen","Abbrechen");
    printf("Dialog wurde aufgerufen\n%s",string);
    break;
    }
    return 1;
    }
    return 1;
    }


    Falls es noch immer nicht klappt, nochmal den Log posten.