Problem mit OnPlayerDeath

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
  • Also, ich frag ab, ob auf dem Spieler der stirbt ein Contract ist, wenn ja, dann passiert das und dass... wenn nicht dann stribt er ganz normal,
    nun, das Problem ist aber, das garnichts passiert >.>


    Er wird einfach neu gespawnt.


    Code:
    public OnPlayerDeath(playerid, killerid, reason)
    {
    if(PlayerInfo[playerid][pContractValue] > 0)
    {
    new string[256], hitman[MAX_PLAYER_NAME], opfer[MAX_PLAYER_NAME];
    GetPlayerName(playerid,opfer,sizeof(opfer));
    GetPlayerName(killerid,hitman,sizeof(hitman));
    format(string,sizeof(string),"Hitman %s hat den Auftrag auf %s erledigt und erhält %d€.",hitman,opfer,PlayerInfo[killerid][pHCValue]);
    SendHitmanMessage(0xFFE600FF,string);
    PlayerInfo[killerid][pContract] = 0;
    PlayerInfo[killerid][pHCValue] = 0;
    GetPlayerPos(playerid,tX,tY,tZ);
    SetPVarFloat(playerid,"lastx",tX);
    SetPVarFloat(playerid,"lasty",tY);
    SetPVarFloat(playerid,"lastz",tZ);
    SafetyLogoutDeath = SetTimerEx("Tot",60000,0,"d",playerid);
    SafetyLogoutDeath2 = SetTimerEx("TotSpawn",4000,0,"d",playerid);
    SetPVarInt(playerid,"Tot",1);
    SetPVarInt(playerid,"Skin",GetPlayerSkin(playerid));
    }
    else if(PlayerInfo[playerid][pContractValue] < 1)
    {
    GetPlayerPos(playerid,tX,tY,tZ);
    SetPVarFloat(playerid,"lastx",tX);
    SetPVarFloat(playerid,"lasty",tY);
    SetPVarFloat(playerid,"lastz",tZ);
    SafetyLogoutDeath = SetTimerEx("Tot",60000,0,"d",playerid);
    SafetyLogoutDeath2 = SetTimerEx("TotSpawn",4000,0,"d",playerid);
    SetPVarInt(playerid,"Tot",1);
    SetPVarInt(playerid,"Skin",GetPlayerSkin(playerid));
    }
    return 1;
    }


    Ich wäre wirklich sehr Dankbar für eure Hilfe, den ich komm im Moment nicht weiter...


    flamer: Ich glaube es hat euch nicht zu interessieren wieso ich einen neuen Thread aufgemacht habe.


    MfG
    n0skillg3t

  • Das Problem ist,dass du nicht überprüfst ob es ein Selbstmord war, oder er getötet wurde von einem Mitspieler.
    Selbstmord.
    playerid 0 - 499 killerid INVALID_PLAYER_ID - 0xFFFF - 65536
    Mitspieler tötet einen.
    playerid 0 - 499 killerid 0 - 499


    Jetzt gucken wir uns deinen Code an.
    Spätestens bei dem format schmiert der Code ab.
    format(string,sizeof(string),"Hitman %s hat den Auftrag auf %s erledigt und erhält %d€.",hitman,opfer,PlayerInfo[killerid][pHCValue]);
    Bei einem Selbstmord ist killerid 65536. Sieht also so aus:
    format(string,sizeof(string),"Hitman %s hat den Auftrag auf %s erledigt und erhält %d€.",hitman,opfer,PlayerInfo[ 65536 ][pHCValue]);
    Da bei dir PlayerInfo niemals die Größe 65537 hat, wird es crashen.
    Eine einfache Abfrage die dir Hilft,könnte so aussehen.
    if( killerid == INVALID_PLAYER_ID ) // Selbstmord

  • Erstmal vielen Dank!


    Um genau zu sein müsste die Abfrage also so lauten, oder?


    public OnPlayerDeath(playerid, killerid, reason)
    {
    if(PlayerInfo[playerid][pContractValue] > 0)
    {
    if( killerid != INVALID_PLAYER_ID )
    {
    new string[256], hitman[MAX_PLAYER_NAME], opfer[MAX_PLAYER_NAME];
    GetPlayerName(playerid,opfer,sizeof(opfer));
    GetPlayerName(killerid,hitman,sizeof(hitman));
    format(string,sizeof(string),"Hitman %s hat den Auftrag auf %s erledigt und erhält %d€.",hitman,opfer,PlayerInfo[killerid][pHCValue]);
    SendHitmanMessage(0xFFE600FF,string);
    PlayerInfo[killerid][pContract] = 0;
    PlayerInfo[killerid][pHCValue] = 0;
    GetPlayerPos(playerid,tX,tY,tZ);
    SetPVarFloat(playerid,"lastx",tX);
    SetPVarFloat(playerid,"lasty",tY);
    SetPVarFloat(playerid,"lastz",tZ);
    SafetyLogoutDeath = SetTimerEx("Tot",60000,0,"d",playerid);
    SafetyLogoutDeath2 = SetTimerEx("TotSpawn",4000,0,"d",playerid);
    SetPVarInt(playerid,"Tot",1);
    SetPVarInt(playerid,"Skin",GetPlayerSkin(playerid));
    }
    }
    else if( killerid == INVALID_PLAYER_ID )
    {
    GetPlayerPos(playerid,tX,tY,tZ);
    SetPVarFloat(playerid,"lastx",tX);
    SetPVarFloat(playerid,"lasty",tY);
    SetPVarFloat(playerid,"lastz",tZ);
    SafetyLogoutDeath = SetTimerEx("Tot",60000,0,"d",playerid);
    SafetyLogoutDeath2 = SetTimerEx("TotSpawn",4000,0,"d",playerid);
    SetPVarInt(playerid,"Tot",1);
    SetPVarInt(playerid,"Skin",GetPlayerSkin(playerid));
    }
    return 1;
    }

    Oder stehe ich gerade auf dem Schlauch?



    //Edit: Ich habs gerade getestet und es funktioniert immernoch nicht, wäre schön wenn mir jmd den
    Code zusammen setzen könnte.


    MfG

    Einmal editiert, zuletzt von n0skillg3t ()

  • Zitat

    und es funktioniert immernoch nicht


    Hilft keinem. Was funktioniert denn nicht. Debug Nachrichten eingefügt ? Was soll denn überhaupt passieren?


    Probier mal folgendes und poste was in der Konsole ausgegeben wird.
    public OnPlayerDeath(playerid, killerid, reason)
    {
    printf("OnPlayerDeath(%d,%d,%d)",playerid,killerid,reason);
    if(PlayerInfo[playerid][pContractValue] > 0)
    {
    printf("pContractValue > 0");
    if( killerid != INVALID_PLAYER_ID )
    {
    printf("killerid != INVALID_PLAYER_ID #1");
    new string[256], hitman[MAX_PLAYER_NAME], opfer[MAX_PLAYER_NAME];
    GetPlayerName(playerid,opfer,sizeof(opfer));
    GetPlayerName(killerid,hitman,sizeof(hitman));
    printf("killerid != INVALID_PLAYER_ID #2");
    format(string,sizeof(string),"Hitman %s hat den Auftrag auf %s erledigt und erhält %d€.",hitman,opfer,PlayerInfo[killerid][pHCValue]);
    SendHitmanMessage(0xFFE600FF,string);
    printf("killerid != INVALID_PLAYER_ID #3");
    PlayerInfo[killerid][pContract] = 0;
    PlayerInfo[killerid][pHCValue] = 0;
    GetPlayerPos(playerid,tX,tY,tZ);
    printf("killerid != INVALID_PLAYER_ID #4");
    SetPVarFloat(playerid,"lastx",tX);
    SetPVarFloat(playerid,"lasty",tY);
    SetPVarFloat(playerid,"lastz",tZ);
    printf("killerid != INVALID_PLAYER_ID #5");
    SafetyLogoutDeath = SetTimerEx("Tot",60000,0,"d",playerid);
    SafetyLogoutDeath2 = SetTimerEx("TotSpawn",4000,0,"d",playerid);
    SetPVarInt(playerid,"Tot",1);
    SetPVarInt(playerid,"Skin",GetPlayerSkin(playerid));
    printf("killerid != INVALID_PLAYER_ID #6");
    }
    }
    else if( killerid == INVALID_PLAYER_ID )
    {
    printf("killerid == INVALID_PLAYER_ID #1");
    GetPlayerPos(playerid,tX,tY,tZ);
    SetPVarFloat(playerid,"lastx",tX);
    SetPVarFloat(playerid,"lasty",tY);
    SetPVarFloat(playerid,"lastz",tZ);
    printf("killerid == INVALID_PLAYER_ID #2");
    SafetyLogoutDeath = SetTimerEx("Tot",60000,0,"d",playerid);
    SafetyLogoutDeath2 = SetTimerEx("TotSpawn",4000,0,"d",playerid);
    SetPVarInt(playerid,"Tot",1);
    SetPVarInt(playerid,"Skin",GetPlayerSkin(playerid));
    printf("killerid == INVALID_PLAYER_ID #3");
    }
    return 1;
    }

  • Das wird geprinted:


    Code
    [15:49:34] OnPlayerDeath(0,65535,255)
    [15:49:34] killerid == INVALID_PLAYER_ID #1
    [15:49:34] killerid == INVALID_PLAYER_ID #2
    [15:49:34] killerid == INVALID_PLAYER_ID #3


    Komischer Weise geht es wenn ich keine Contract auf mich habe.
    Wenn ich nen Contract auf mich hab, wird das geprinted:


    Code
    [15:55:29] OnPlayerDeath(0,65535,255)
    [15:55:29] pContractValue > 0
    [15:55:29] killerid != INVALID_PLAYER_ID #1
    [15:55:29] killerid != INVALID_PLAYER_ID #2


    Heist dann ja, das es beim format abschmiert..


    Achso ich hab die Zeile kommentiert in der Abgefragt wird ob killerid != INVALID_PLAYER_ID ist
    damit ich mich selbst töten kann.

  • Zitat

    Heist dann ja, das es beim format abschmiert..


    Logisch.Wie sollte es auch nicht ?

    Zitat

    Achso ich hab die Zeile kommentiert in der Abgefragt wird ob killerid != INVALID_PLAYER_ID ist
    damit ich mich selbst töten kann.


    Da liegt auch das Problem.
    Du hast wohl nicht gelesen,was ich geschrieben habe.
    Ließ dir nochmal meinen Post durch.

  • So vielen Dank für deine großartige Hilfe :)


    So nun nurnoch eine letze Frage, der endgültige Code lautet also so:


    public OnPlayerDeath(playerid, killerid, reason)
    {
    if(PlayerInfo[playerid][pContractValue] > 0)
    {
    if( killerid != INVALID_PLAYER_ID )
    {
    new string[256], hitman[MAX_PLAYER_NAME], opfer[MAX_PLAYER_NAME];
    GetPlayerName(playerid,opfer,sizeof(opfer));
    GetPlayerName(killerid,hitman,sizeof(hitman));
    format(string,sizeof(string),"Hitman %s hat den Auftrag auf %s erledigt und erhält %d€.",hitman,opfer,PlayerInfo[killerid][pHCValue]);
    SendHitmanMessage(0xFFE600FF,string);
    PlayerInfo[killerid][pContract] = 0;
    PlayerInfo[killerid][pHCValue] = 0;
    GetPlayerPos(playerid,tX,tY,tZ);
    SetPVarFloat(playerid,"lastx",tX);
    SetPVarFloat(playerid,"lasty",tY);
    SetPVarFloat(playerid,"lastz",tZ);
    SafetyLogoutDeath = SetTimerEx("Tot",60000,0,"d",playerid);
    SafetyLogoutDeath2 = SetTimerEx("TotSpawn",4000,0,"d",playerid);
    SetPVarInt(playerid,"Tot",1);
    SetPVarInt(playerid,"Skin",GetPlayerSkin(playerid));
    }
    }
    else if( killerid == INVALID_PLAYER_ID )
    {
    GetPlayerPos(playerid,tX,tY,tZ);
    SetPVarFloat(playerid,"lastx",tX);
    SetPVarFloat(playerid,"lasty",tY);
    SetPVarFloat(playerid,"lastz",tZ);
    SafetyLogoutDeath = SetTimerEx("Tot",60000,0,"d",playerid);
    SafetyLogoutDeath2 = SetTimerEx("TotSpawn",4000,0,"d",playerid);
    SetPVarInt(playerid,"Tot",1);
    SetPVarInt(playerid,"Skin",GetPlayerSkin(playerid));
    }
    return 1;
    }


    Bitte korrigieren, wenn es nicht stimmt, ich möchte nicht nochmal Fragen..


    MfG
    n0skillg3t

  • Müsste so eigentlich richtig sein, jedenfalls ist es die Abfrage mit killerid & INVALID_PLAYER_ID.


    Ob es das wirklich ist,kann ichauch schlecht wissen.
    Denn woher sollte ich z.B. wissen was folgendes bewirkt / ist:
    PlayerInfo[killerid][pHCValue] // 10
    SafetyLogoutDeath = SetTimerEx("Tot",60000,0,"d",playerid); // 18
    SafetyLogoutDeath2 = SetTimerEx("TotSpawn",4000,0,"d",playerid); // 19
    SafetyLogoutDeath = SetTimerEx("Tot",60000,0,"d",playerid); // 30
    SafetyLogoutDeath2 = SetTimerEx("TotSpawn",4000,0,"d",playerid); // 31


    Denke du müsstest aber noch PlayerInfo[playerid][pContractValue] auf 0 setzen, wenn der Spieler stirbt ( Damit die Abfrage in OnPlayerDeath nicht weiterhin funktioniert , Zeile 3 ). Vorrausgesetzt du hast es nicht schon in OnPlayerSpawn.


    //Edit: Quatsch.Ist nicht richtig.


    public OnPlayerDeath(playerid, killerid, reason)
    {
    if(PlayerInfo[playerid][pContractValue] > 0)
    {
    if( killerid != INVALID_PLAYER_ID )
    {
    new string[256], hitman[MAX_PLAYER_NAME], opfer[MAX_PLAYER_NAME];
    GetPlayerName(playerid,opfer,sizeof(opfer));
    GetPlayerName(killerid,hitman,sizeof(hitman));
    format(string,sizeof(string),"Hitman %s hat den Auftrag auf %s erledigt und erhält %d€.",hitman,opfer,PlayerInfo[killerid][pHCValue]);
    SendHitmanMessage(0xFFE600FF,string);
    PlayerInfo[killerid][pContract] = 0;
    PlayerInfo[killerid][pHCValue] = 0;
    GetPlayerPos(playerid,tX,tY,tZ);
    SetPVarFloat(playerid,"lastx",tX);
    SetPVarFloat(playerid,"lasty",tY);
    SetPVarFloat(playerid,"lastz",tZ);
    SafetyLogoutDeath = SetTimerEx("Tot",60000,0,"d",playerid);
    SafetyLogoutDeath2 = SetTimerEx("TotSpawn",4000,0,"d",playerid);
    SetPVarInt(playerid,"Tot",1);
    SetPVarInt(playerid,"Skin",GetPlayerSkin(playerid));
    }
    else
    {
    GetPlayerPos(playerid,tX,tY,tZ);
    SetPVarFloat(playerid,"lastx",tX);
    SetPVarFloat(playerid,"lasty",tY);
    SetPVarFloat(playerid,"lastz",tZ);
    SafetyLogoutDeath = SetTimerEx("Tot",60000,0,"d",playerid);
    SafetyLogoutDeath2 = SetTimerEx("TotSpawn",4000,0,"d",playerid);
    SetPVarInt(playerid,"Tot",1);
    SetPVarInt(playerid,"Skin",GetPlayerSkin(playerid));
    }
    }
    return 1;
    }
    Ich denke du bräuchtest es so. Wie gesagt, ich kann aber nicht wissen ob es wirklich so bei dir sein soll.Du müsstest wissen, ob folgender Code:
    else
    {
    GetPlayerPos(playerid,tX,tY,tZ);
    SetPVarFloat(playerid,"lastx",tX);
    SetPVarFloat(playerid,"lasty",tY);
    SetPVarFloat(playerid,"lastz",tZ);
    SafetyLogoutDeath = SetTimerEx("Tot",60000,0,"d",playerid);
    SafetyLogoutDeath2 = SetTimerEx("TotSpawn",4000,0,"d",playerid);
    SetPVarInt(playerid,"Tot",1);
    SetPVarInt(playerid,"Skin",GetPlayerSkin(playerid));
    }

    Nur aufgerufen werden soll, wenn PlayerInfo[playerid][pContractValue] größer als 0 ist.

  • Jo, danke dir.


    Ich werd ma nacher nen Freund holen und es mit ihm testen, ich werd mich dann wieder hier melden :)


    //Edit: Diese Timer gehören zu meinem Totensystem :)
    //Edit2:


    Also, wenn der gestorbene Spieler einen Contract auf sich hat, soll das hier passieren:


    new string[256], hitman[MAX_PLAYER_NAME], opfer[MAX_PLAYER_NAME];
    GetPlayerName(playerid,opfer,sizeof(opfer));
    GetPlayerName(killerid,hitman,sizeof(hitman));
    format(string,sizeof(string),"Hitman %s hat den Auftrag auf %s erledigt und erhält %d€.",hitman,opfer,PlayerInfo[killerid][pHCValue]);
    SendHitmanMessage(0xFFE600FF,string);
    PlayerInfo[killerid][pContract] = 0;
    PlayerInfo[killerid][pHCValue] = 0;
    PlayerInfo[playerid][pContractValue] = 0;
    PlayerInfo[playerid][pContractet] = 0;


    Und das hier soll IMMER passieren:


    GetPlayerPos(playerid,tX,tY,tZ);
    SetPVarFloat(playerid,"lastx",tX);
    SetPVarFloat(playerid,"lasty",tY);
    SetPVarFloat(playerid,"lastz",tZ);
    SafetyLogoutDeath = SetTimerEx("Tot",60000,0,"d",playerid);
    SafetyLogoutDeath2 = SetTimerEx("TotSpawn",4000,0,"d",playerid);
    SetPVarInt(playerid,"Tot",1);
    SetPVarInt(playerid,"Skin",GetPlayerSkin(playerid));



    MfG

    Einmal editiert, zuletzt von n0skillg3t ()

  • Na gut,wenn es immer aufgerufen werden soll, dann machste es am besten so:
    public OnPlayerDeath(playerid, killerid, reason)
    {
    if(PlayerInfo[playerid][pContractValue] > 0)
    {
    if( killerid != INVALID_PLAYER_ID )
    {
    new string[256], hitman[MAX_PLAYER_NAME], opfer[MAX_PLAYER_NAME];
    GetPlayerName(playerid,opfer,sizeof(opfer));
    GetPlayerName(killerid,hitman,sizeof(hitman));
    format(string,sizeof(string),"Hitman %s hat den Auftrag auf %s erledigt und erhält %d€.",hitman,opfer,PlayerInfo[killerid][pHCValue]);
    SendHitmanMessage(0xFFE600FF,string);
    PlayerInfo[killerid][pContract] = 0;
    PlayerInfo[killerid][pHCValue] = 0;
    /* Wir später sowieso noch aufgerufen. Daher auskommentieren sonst läuft es 2x ab
    GetPlayerPos(playerid,tX,tY,tZ);
    SetPVarFloat(playerid,"lastx",tX);
    SetPVarFloat(playerid,"lasty",tY);
    SetPVarFloat(playerid,"lastz",tZ);
    SafetyLogoutDeath = SetTimerEx("Tot",60000,0,"d",playerid);
    SafetyLogoutDeath2 = SetTimerEx("TotSpawn",4000,0,"d",playerid);
    SetPVarInt(playerid,"Tot",1);
    SetPVarInt(playerid,"Skin",GetPlayerSkin(playerid));
    */
    }
    }
    // else if( killerid == INVALID_PLAYER_ID )
    {
    // Der Übersicht halber lasse ich die { und }
    GetPlayerPos(playerid,tX,tY,tZ);
    SetPVarFloat(playerid,"lastx",tX);
    SetPVarFloat(playerid,"lasty",tY);
    SetPVarFloat(playerid,"lastz",tZ);
    SafetyLogoutDeath = SetTimerEx("Tot",60000,0,"d",playerid);
    SafetyLogoutDeath2 = SetTimerEx("TotSpawn",4000,0,"d",playerid);
    SetPVarInt(playerid,"Tot",1);
    SetPVarInt(playerid,"Skin",GetPlayerSkin(playerid));
    }
    return 1;
    }