OnPlayerDeath Probleme?

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
  • Guten Morgen, breadfish'ler!


    Mir ist die public OnPlayerDeath bereits seit einiger Zeit ein Rätsel, da es dort zu den häufigsten Bugs
    im Script kommt, ohne, dass es einen ersichtlichen Grund dafür gibt.


    Ich kann beispielsweise folgende Abfrage einbauen:


    if(killerid == INVALID_PLAYER_ID)
    {
    //Spieler ins Krankenhaus setzen
    }


    Trotzdem wird nichts ausgeführt, man landet immer am Standard Spawn.


    Das das jetzt speziell bei mir so ist wegen bestimmten Abfragen die miteinander arbeiten etc. ist mir klar, aber ich hab mal nach dem
    Problem gesucht und da gab es schonmal einen Thread.


    Habt ihr bei OnPlayerDeath auch solche Probleme und evtl. eine Lösung gefunden?


    Wäre für paar Ratschläge sehr dankbar.


    LG SoulMan


  • new Suizide[MAX_PLAYERS];


    public OnPlayerDeath(playerid, killerid, reason)
    {
    if(killerid == INVALID_PLAYER_ID)
    {
    //Spieler ins Krankenhaus setzen
    Suizide[playerid] = 1;
    printf("[suizide] %d", playerid);
    }
    return 1;
    }


    public OnPlayerSpawn(playerid)
    {
    if(Suizide[playerid])
    {
    Suizide[playerid] = 0;
    SetPlayerPos(playerid, X, Y, Z);
    return 1;
    }
    return 1;
    }


    Solltest du mal testen...


    Gruß, Piet

  • Ich wollte nur wissen, ob es anderen ähnlich geht bei OnPlayerDeath, denn das ist der einzige Abschnitt im Script, in dem
    theoretisch korrekter Code permanent nicht funktioniert.


    Nein.
    Generell ist OnPlayerDeath nichts anderes als jedes andere callback. Viele Fehler passieren eben, weil viele Leute nicht auf die killerid achten, die ist nämlich INVALID_PLAYER_ID bei suizid.
    Kann auch daran liegen, dass ein Filterscript davor schon den Code abschießt, falls du da welche am Laufen hast.


    Ansonsten poste doch einfach mal deinen theoretisch korrekten Code, am besten das ganze OnPlayerDeath, vielleicht findet sich doch ein Fehler. Am callback liegt's jedenfalls nicht, sondern an einem deiner Codes.

  • So, jetzt hab ich Zeit, zu antworten.


    Ich werde jetzt einfach mal OnPlayerDeath komplett reinhauen.


    public OnPlayerDeath(playerid, killerid, reason)
    {
    GivePM(playerid,100);
    SetPVarInt(playerid,"mech_dienst",0);
    SetPVarInt(playerid,"pizza_dienst",0);
    SetPVarInt(playerid,"farm_dienst",0);
    SetPVarInt(playerid,"taxiduty",0);
    SetPVarInt(playerid, "d_dienst", 0);
    SetPVarInt(playerid, "m_dienst", 0);
    SetPVarInt(playerid, "dienst", 0);
    SetPVarInt(playerid, "fdienst", 0);
    LoseProperty(playerid);
    SetPVarInt(playerid,"Dead",1);
    lastkillerID[playerid] = killerid;
    if(pVars[playerid][Auswahl] == 1)return 0;
    if(pInfo[killerid][Fraktion] != 4 && pInfo[killerid][Fraktion] != 9)
    {
    new Zeuge = GetNearestPlayer(killerid,25.0);
    if(Zeuge != -1 && pInfo[killerid][Fraktion] > 0 && pInfo[Zeuge][Fraktion] != pInfo[killerid][Fraktion])
    {
    new str3[128],strZ[128];
    new grund[128] = "Mord";
    pInfo[killerid][lastreason] = grund;
    format(strZ,sizeof(strZ),"Du hast ein Verbrechen [Mord] begangen - Zeuge: %s",SpielerName[Zeuge]);
    format(str3,sizeof(str3),"Aktuelles Wantedlevel: %i",pInfo[killerid][Wanteds]);
    SendClientMessage(killerid,0xFFFA00FF,str3);
    SendClientMessage(killerid,COLOR_RED,strZ);
    SendCrimeMessageEx("[HQ] Verbrechen: {FF9933}%s hat einen Mord begangen, Zeuge: %s",SpielerName[killerid],SpielerName[Zeuge]);
    new Wantedsterne = GetPlayerWantedLevel(killerid);
    SetPlayerWantedLevel(killerid,Wantedsterne+1);
    pInfo[killerid][Wanteds]++;
    new Float:x,Float:y,Float:z;
    GetPlayerPos(killerid,x,y,z);
    SetCrimeMarker(x,y,z);
    }
    else SendClientMessage(killerid,COLOR_RED,"Du hast ein Verbrechen [Mord] begangen - Zeuge: Keiner");
    }
    else if(pInfo[killerid][Fraktion]==4 || pInfo[killerid][Fraktion]==9 && pInfo[playerid][Wanteds] > 0)
    {
    new Bonus = pInfo[playerid][Wanteds] * 1000;
    pInfo[playerid][JailTime] = pInfo[playerid][Wanteds] * 60000 * 4;
    GameTextForPlayer(killerid,"~g~Straftaeter getoetet",3000,3);
    GivePM(killerid,Bonus/10);
    FrakInfo[pInfo[playerid][Fraktion]][f_Kasse] += Bonus;
    }
    if(Spawned[playerid] == 1 && pInfo[playerid][JailTime] < 1 || killerid == INVALID_PLAYER_ID)
    {
    ResetPlayerWeapons(playerid);
    new str[128];
    format(str,sizeof(str),"Du bist im Krankenhaus~n~~g~Behandlung: ~r~%d Minuten",sVars[KrankenhausZeit]*1000/60000);
    GameTextForPlayer(playerid,str,sVars[KrankenhausZeit]*1000,3);
    SetTimerEx("KrankenhausTimer",sVars[KrankenhausZeit]*1000,0,"i",playerid);
    TogglePlayerControllable(playerid, 0);
    new Float:xx, Float:yy, Float:zz;
    GetPlayerPos(playerid, xx, yy, zz);
    if((xx > -992.5172 && xx < 4000.0000) && (yy < 528.0000 && yy > -4000.0000)) //Los Santos
    {
    KrankenhausLS[playerid] = 1;
    SetPlayerPos(playerid,1162.871704, -1339.109619, 14.297291);
    SetPlayerCameraPos(playerid, 1223.379028, -1333.354126, 33.809105);
    SetPlayerCameraLookAt(playerid, 1178.824829, -1325.804077, 13.284119);
    SetPlayerInterior(playerid, 0);
    //Los Santos
    }
    if((xx > -4000.0000 && xx< -992.5172) && (yy < 4000.0000 && yy > -4000.0000)) //San Fierro
    {
    KrankenhausSF[playerid] = 1;
    SetPlayerPos(playerid,1162.871704, -1339.109619, 14.297291);
    SetPlayerCameraPos(playerid, -2452.4099,628.8833,64.9522);
    SetPlayerCameraLookAt(playerid, -2618.7205,649.4597,67.2017);
    SetPlayerInterior(playerid, 0);
    //San Fierro
    }
    if((xx > -992.5172 && xx< 4000.0000) && (yy < 4000.0000 && yy > 528.0000)) //Las Venturas
    {
    KrankenhausLV[playerid] = 1;
    SetPlayerPos(playerid,1162.871704, -1339.109619, 14.297291);
    SetPlayerCameraPos(playerid,1617.1127,1889.3317,33.4111);
    SetPlayerCameraLookAt(playerid,1607.3221,1818.3948,31.4688);
    SetPlayerInterior(playerid, 0);
    //Las Venturas
    }
    }
    if((GangWar[pInfo[playerid][Fraktion]][Gegner]==pInfo[killerid][Fraktion] && GangWar[pInfo[playerid][Fraktion]][Gegner]!=0) || (GangWar[pInfo[killerid][Fraktion]][Gegner]==pInfo[playerid][Fraktion] && GangWar[pInfo[killerid][Fraktion]][Gegner]!=0))
    {
    GameTextForPlayer(playerid,"~r~Gangwarkill",2000,6);
    GameTextForPlayer(killerid,"~g~Gangwarkill",2000,6);
    new frak = pInfo[killerid][Fraktion];
    FrakInfo[frak][f_Kasse] += 200;
    UpdateFrak(FrakInfo[frak][f_Kasse],GangWar[frak][Gegner],GangWar[frak][WarGrund],FrakInfo[frak][f_Gehalt],frak);
    }
    pInfo[playerid][MaskeOben]=0;
    pInfo[playerid][Maske]=0;
    RemovePlayerAttachedObject(playerid,1);
    for(new i; i<MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i) && !IsPlayerNPC(i))
    {
    ShowPlayerNameTagForPlayer(i, playerid, 1);
    }
    }
    return 1;
    }


    Funktionieren tut nicht:


    - Verbrecher töten (GameText: "Straftaeter getoetet")
    -> Auch nicht Cops erhalten teilweise (nicht immer) die Nachricht
    - Bei Selbstmord in das Krankenhaus kommen.

  • Wie ich es gesagt hatte. Lebenswichtig ist bei [killerid] abfragen IMMER:
    if(killerid != INVALID_PLAYER_ID)


    public OnPlayerDeath(playerid, killerid, reason)
    {
    GivePM(playerid,100);
    SetPVarInt(playerid,"mech_dienst",0);
    SetPVarInt(playerid,"pizza_dienst",0);
    SetPVarInt(playerid,"farm_dienst",0);
    SetPVarInt(playerid,"taxiduty",0);
    SetPVarInt(playerid, "d_dienst", 0);
    SetPVarInt(playerid, "m_dienst", 0);
    SetPVarInt(playerid, "dienst", 0);
    SetPVarInt(playerid, "fdienst", 0);
    LoseProperty(playerid);
    SetPVarInt(playerid,"Dead",1);
    lastkillerID[playerid] = killerid;
    if(pVars[playerid][Auswahl] == 1)return 0;
    if(killerid != INVALID_PLAYER_ID)
    {
    if(pInfo[killerid][Fraktion] != 4 && pInfo[killerid][Fraktion] != 9)
    {
    new Zeuge = GetNearestPlayer(killerid,25.0);
    if(Zeuge != -1 && pInfo[killerid][Fraktion] > 0 && pInfo[Zeuge][Fraktion] != pInfo[killerid][Fraktion])
    {
    new str3[128],strZ[128];
    new grund[128] = "Mord";
    pInfo[killerid][lastreason] = grund;
    format(strZ,sizeof(strZ),"Du hast ein Verbrechen [Mord] begangen - Zeuge: %s",SpielerName[Zeuge]);
    format(str3,sizeof(str3),"Aktuelles Wantedlevel: %i",pInfo[killerid][Wanteds]);
    SendClientMessage(killerid,0xFFFA00FF,str3);
    SendClientMessage(killerid,COLOR_RED,strZ);
    SendCrimeMessageEx("[HQ] Verbrechen: {FF9933}%s hat einen Mord begangen, Zeuge: %s",SpielerName[killerid],SpielerName[Zeuge]);
    new Wantedsterne = GetPlayerWantedLevel(killerid);
    SetPlayerWantedLevel(killerid,Wantedsterne+1);
    pInfo[killerid][Wanteds]++;
    new Float:x,Float:y,Float:z;
    GetPlayerPos(killerid,x,y,z);
    SetCrimeMarker(x,y,z);
    }
    else SendClientMessage(killerid,COLOR_RED,"Du hast ein Verbrechen [Mord] begangen - Zeuge: Keiner");
    }
    else if(pInfo[killerid][Fraktion]==4 || pInfo[killerid][Fraktion]==9 && pInfo[playerid][Wanteds] > 0)
    {
    new Bonus = pInfo[playerid][Wanteds] * 1000;
    pInfo[playerid][JailTime] = pInfo[playerid][Wanteds] * 60000 * 4;
    GameTextForPlayer(killerid,"~g~Straftaeter getoetet",3000,3);
    GivePM(killerid,Bonus/10);
    FrakInfo[pInfo[playerid][Fraktion]][f_Kasse] += Bonus;
    }
    }
    if(Spawned[playerid] == 1 && pInfo[playerid][JailTime] < 1 || killerid == INVALID_PLAYER_ID)
    {
    ResetPlayerWeapons(playerid);
    new str[128];
    format(str,sizeof(str),"Du bist im Krankenhaus~n~~g~Behandlung: ~r~%d Minuten",sVars[KrankenhausZeit]*1000/60000);
    GameTextForPlayer(playerid,str,sVars[KrankenhausZeit]*1000,3);
    SetTimerEx("KrankenhausTimer",sVars[KrankenhausZeit]*1000,0,"i",playerid);
    TogglePlayerControllable(playerid, 0);
    new Float:xx, Float:yy, Float:zz;
    GetPlayerPos(playerid, xx, yy, zz);
    if((xx > -992.5172 && xx < 4000.0000) && (yy < 528.0000 && yy > -4000.0000)) //Los Santos
    {
    KrankenhausLS[playerid] = 1;
    SetPlayerPos(playerid,1162.871704, -1339.109619, 14.297291);
    SetPlayerCameraPos(playerid, 1223.379028, -1333.354126, 33.809105);
    SetPlayerCameraLookAt(playerid, 1178.824829, -1325.804077, 13.284119);
    SetPlayerInterior(playerid, 0);
    //Los Santos
    }
    if((xx > -4000.0000 && xx< -992.5172) && (yy < 4000.0000 && yy > -4000.0000)) //San Fierro
    {
    KrankenhausSF[playerid] = 1;
    SetPlayerPos(playerid,1162.871704, -1339.109619, 14.297291);
    SetPlayerCameraPos(playerid, -2452.4099,628.8833,64.9522);
    SetPlayerCameraLookAt(playerid, -2618.7205,649.4597,67.2017);
    SetPlayerInterior(playerid, 0);
    //San Fierro
    }
    if((xx > -992.5172 && xx< 4000.0000) && (yy < 4000.0000 && yy > 528.0000)) //Las Venturas
    {
    KrankenhausLV[playerid] = 1;
    SetPlayerPos(playerid,1162.871704, -1339.109619, 14.297291);
    SetPlayerCameraPos(playerid,1617.1127,1889.3317,33.4111);
    SetPlayerCameraLookAt(playerid,1607.3221,1818.3948,31.4688);
    SetPlayerInterior(playerid, 0);
    //Las Venturas
    }
    }
    if(killerid != INVALID_PLAYER_ID)
    {
    if((GangWar[pInfo[playerid][Fraktion]][Gegner]==pInfo[killerid][Fraktion] && GangWar[pInfo[playerid][Fraktion]][Gegner]!=0) || (GangWar[pInfo[killerid][Fraktion]][Gegner]==pInfo[playerid][Fraktion] && GangWar[pInfo[killerid][Fraktion]][Gegner]!=0))
    {
    GameTextForPlayer(playerid,"~r~Gangwarkill",2000,6);
    GameTextForPlayer(killerid,"~g~Gangwarkill",2000,6);
    new frak = pInfo[killerid][Fraktion];
    FrakInfo[frak][f_Kasse] += 200;
    UpdateFrak(FrakInfo[frak][f_Kasse],GangWar[frak][Gegner],GangWar[frak][WarGrund],FrakInfo[frak][f_Gehalt],frak);
    }
    }
    pInfo[playerid][MaskeOben]=0;
    pInfo[playerid][Maske]=0;
    RemovePlayerAttachedObject(playerid,1);
    for(new i; i<MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i) && !IsPlayerNPC(i))
    {
    ShowPlayerNameTagForPlayer(i, playerid, 1);
    }
    }
    return 1;
    }



    Wegen dem Problem des "nicht-spawnens":
    Setze bei OnPlayerDeath KrankenhausLS[playerid] = 1 bei LS, = 2 bei SF und = 3 bei LV.
    Bei OnPlayerSpawn:
    if(Krankenhaus[playerid] == 1)
    {
    SetPlayerPos(playerid,1162.871704, -1339.109619, 14.297291);
    SetPlayerCameraPos(playerid, 1223.379028, -1333.354126, 33.809105);
    SetPlayerCameraLookAt(playerid, 1178.824829, -1325.804077, 13.284119);
    SetPlayerInterior(playerid, 0);
    }
    if(Krankenhaus[playerid] == 2)
    //usw...


    Position bei OnPlayerDeath zu setzen ist schlecht, das geht nicht.

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen