Komischer Server-Bug beim Killen einer Person

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
  • Nabend ihr Fische,


    und zwar habe ich und mein Kollege mal eine Runde geskriptet und haben einen merkwürdigen
    Fehler entdeckt. Wenn ich ihn kille, sagen wir mal als Beispiel als Cop und er Wanteds hat, so passiert
    es manchmal, dass er nicht von mir gekillt wird, obwohl ich ihm die drei Schüsse mit der Deagle gebe.
    Rechts bei der SendDeathMessage wird gezeigt, dass er entweder Selbstmord begangen hat oder
    gar nichts. Ungefähr jeden 2. bis 3. Kill wird es gültig und er kommt mal mit Glück in den Knast.
    So als würde das Skript seine eigenen Regeln irgendwie aufbauen und danach gehen. Keine
    Ahnung was das ist, haben wir so auch noch nie gesehen, aber vielleicht kennts ja einer von euch.


  • public OnPlayerDeath(playerid, killerid, reason)
    {
    SendDeathMessage(killerid, playerid, reason); //Kill - Log Anzeige rechts
    new string[128];


    //Munitionsdrop-System
    new randdropspawn = random(12);
    new Float:dX, Float:dY, Float:dZ;
    GetPlayerPos(playerid, Float:dX, Float:dY, Float:dZ);


    switch(randdropspawn)
    {
    case 0:
    {
    return 0;
    }
    case 1:
    {
    wDropPick = CreatePickup(2041, 1, Float:dX, Float:dY+3, Float:dZ, 0);
    SetTimer("dropdespawn", 80000, 0);
    }
    case 2:
    {
    return 0;
    }
    case 3:
    {
    return 0;
    }
    case 4:
    {
    wDropPick = CreatePickup(2041, 1, Float:dX, Float:dY+3, Float:dZ, 0);
    SetTimer("dropdespawn", 80000, 0);
    }
    case 5:
    {
    return 0;
    }
    case 6:
    {
    return 0;
    }
    case 7:
    {
    wDropPick = CreatePickup(2041, 1, Float:dX, Float:dY+3, Float:dZ, 0);
    SetTimer("dropdespawn", 80000, 0);
    }
    case 8:
    {
    return 0;
    }
    case 9:
    {
    return 0;
    }
    case 10:
    {
    wDropPick = CreatePickup(2041, 1, Float:dX, Float:dY+3, Float:dZ, 0);
    SetTimer("dropdespawn", 80000, 0);
    }
    case 11:
    {
    wDropPick = CreatePickup(2041, 1, Float:dX, Float:dY+3, Float:dZ, 0);
    SetTimer("dropdespawn", 80000, 0);
    }
    }


    //Streak-System
    OnStreakTXDOffline(killerid);
    AktuelleKills[killerid] ++;
    MedaillenStreak[killerid] = 0;
    Spieler[killerid][Level] += 1;


    if(AktuelleKills[killerid] == 2)
    {
    format(string,sizeof(string),"{FF6E00}[STREAK] {FFFFFF}%s hat einen Doublekill, 2 Kills",SpielerName(killerid));
    SendClientMessageToAll(COLOR_GREY,string);


    if(Tog[killerid][KillstreakSoundTog] == 1)
    {
    PlayAudioStreamForPlayer(killerid,"http://k003.kiwi6.com/hotlink/aqfplw51hl/2_doublekill.wav");
    }
    }
    else if(AktuelleKills[killerid] == 5)
    {
    format(aktext, sizeof(aktext),"Blutruenstig(5)");
    OnStreakTXDOnline(killerid);
    TextDrawSetString(TDStreak[4], aktext);
    }
    else if(AktuelleKills[killerid] == 7)
    {
    format(string,sizeof(string),"{FF6E00}[STREAK] {FFFFFF}%s macht einen Monsterkill, 7 Kills",SpielerName(killerid));
    SendClientMessageToAll(COLOR_GREY,string);


    if(Tog[killerid][KillstreakSoundTog] == 1)
    {
    PlayAudioStreamForPlayer(killerid,"http://k003.kiwi6.com/hotlink/sv7iwhlqhh/7_monsterkill.wav");
    }
    }
    else if(AktuelleKills[killerid] == 10)
    {
    format(aktext, sizeof(aktext),"Gnadenlos(10)");
    OnStreakTXDOnline(killerid);
    TextDrawSetString(TDStreak[4], aktext);
    }
    else if(AktuelleKills[killerid] == 12)
    {
    format(string,sizeof(string),"{FF6E00}[STREAK] {FFFFFF}%s ist Unstoppable, 12 Kills",SpielerName(killerid));
    SendClientMessageToAll(COLOR_GREY,string);


    if(Tog[killerid][KillstreakSoundTog] == 1)
    {
    PlayAudioStreamForPlayer(killerid,"http://k003.kiwi6.com/hotlink/24stibsoxz/12_unstoppable.wav");
    }
    }
    else if(AktuelleKills[killerid] == 15)
    {
    format(aktext, sizeof(aktext),"Skrupelllos(15)");
    OnStreakTXDOnline(killerid);
    TextDrawSetString(TDStreak[4], aktext);
    }
    else if(AktuelleKills[killerid] == 17)
    {
    format(string,sizeof(string),"{FF6E00}[STREAK] {FFFFFF}%s ist eine War-Machine, 17 Kills",SpielerName(killerid));
    SendClientMessageToAll(COLOR_GREY,string);


    if(Tog[killerid][KillstreakSoundTog] == 1)
    {
    PlayAudioStreamForPlayer(killerid,"http://k003.kiwi6.com/hotlink/8jaude6d1z/17_killingspree.wav");
    }
    }
    else if(AktuelleKills[killerid] == 20)
    {
    format(aktext, sizeof(aktext),"Unnachgiebig(20)");
    OnStreakTXDOnline(killerid);
    TextDrawSetString(TDStreak[4], aktext);
    }
    else if(AktuelleKills[killerid] == 22)
    {
    format(string,sizeof(string),"{FF6E00}[STREAK] {FFFFFF}%s ist der Exterminator in Person, 22 Kills",SpielerName(killerid));
    SendClientMessageToAll(COLOR_GREY,string);


    if(Tog[killerid][KillstreakSoundTog] == 1)
    {
    PlayAudioStreamForPlayer(killerid,"http://k003.kiwi6.com/hotlink/hilsefrcls/22_megakill.wav");
    }
    }
    else if(AktuelleKills[killerid] == 25)
    {
    format(aktext, sizeof(aktext),"Brutal(25)");
    OnStreakTXDOnline(killerid);
    TextDrawSetString(TDStreak[4], aktext);
    }
    else if(AktuelleKills[killerid] == 27)
    {
    format(string,sizeof(string),"{FF6E00}[STREAK] {FFFFFF}%s ist auf Snackhunting-Tour, 27 Kills",SpielerName(killerid));
    SendClientMessageToAll(COLOR_GREY,string);


    if(Tog[killerid][KillstreakSoundTog] == 1)
    {
    PlayAudioStreamForPlayer(killerid,"http://k003.kiwi6.com/hotlink/s4a3clvica/27_godlike.wav");
    }
    }
    else if(AktuelleKills[killerid] == 30)
    {
    format(string, sizeof(string),"Nuklearkiller(30)");
    OnStreakTXDOnline(killerid);
    TextDrawSetString(TDStreak[4], aktext);


    format(string, sizeof(string),"{FF6E00}[STREAK] {FFFFFF}%s gleicht einer KR-Einheit(%s)", SpielerName(killerid), AktuelleKills[killerid]);
    SendClientMessageToAll(COLOR_GREY,string);


    for(new a; a < MAX_PLAYERS; a++)
    {
    if(Tog[a][KillstreakSoundTog] == 1)
    {
    PlayAudioStreamForPlayer(a,"http://k003.kiwi6.com/hotlink/5e0l7it84k/30_holyshit.wav");
    }
    }
    }
    else if(AktuelleKills[killerid] > 30)
    {
    format(string, sizeof(string),"{FF6E00}[STREAK] {FFFFFF}%s gleicht einer KR-Einheit(%s)", SpielerName(killerid), AktuelleKills[killerid]);
    SendClientMessageToAll(COLOR_GREY,string);
    }
    else if(IsDoingBankrobLS[playerid] == 1 || IsDoingBankrobSF[playerid] == 1 && Spieler[killerid][Fraktion] == 1)
    {
    format(string,sizeof(string),"<< {00FFFA}Polizist {FFFFFF}%s {00FFFA}konnte den Bankräuber stoppen! {00FFFA}Er erhält dafür {FFFFFF}$%d. >>",SpielerName(killerid),Geld[RobtotGeld]);
    GivePlayerCash(killerid,Geld[RobtotGeld]);
    SendClientMessageToAll(COLOR_TÜRKIS,string);
    SendClientMessageToAll(COLOR_YELLOW,"** {00FFFA}Der {FFFFFF}Banküberfall {00FFFA}ist gescheitert.");
    SetSpawnInfo(playerid, 0, Spieler[playerid][Skin], 264.4773,86.4873,1001.0391, 0, 0, 0,0,0,0,0);
    SetPlayerInterior(playerid, 6);
    SetPlayerVirtualWorld(playerid, 32);
    }
    if(Spieler[playerid][Wanteds] >= 1 && Spieler[killerid][Fraktion] == 1)
    {
    // An den Polizisten
    new pricecop = Geld[Jailcashcop]*Spieler[playerid][Wanteds];
    new pricerobber = Geld[Jailcashrobber]*Spieler[playerid][Wanteds];
    format(string, sizeof(string), "~w~Gesuchten umgebracht~n~Bonus: ~g~$%d", pricecop);
    GameTextForPlayer(killerid, string, 5000, 1);
    GivePlayerCash(killerid,pricecop);
    PlayerPlaySound(killerid, 1058, 0.0, 0.0, 0.0);
    // An den Gesuchten
    GivePlayerCash(playerid, -pricerobber);
    Spieler[playerid][Jailed] = 1;
    Spieler[playerid][JailType] = 1;
    Spieler[playerid][JailTime] = Spieler[playerid][Wanteds]*60;
    Spieler[playerid][Wanteds] = 0;
    SetPlayerHealth(playerid,100);
    Cuffed[playerid]=0;
    format(string, sizeof(string), "* Du bist nun für %d Sekunden (%d Minuten) im Gefängnis und musst $%d bezahlen.", Spieler[playerid][JailTime],Spieler[playerid][JailTime]/60, pricerobber);
    SendClientMessage(playerid, COLOR_LIGHTRED, string);
    SendClientMessage(playerid, COLOR_LIGHTRED, "** Tippe /jailtime um deine restliche Haftzeit zu sehen.");


    format(string, sizeof(string), "Alle Einheiten, Officer %s hat den Auftrag ausgeführt.",SpielerName(killerid));
    SendFamilyMessage(1, TEAM_BLUE_COLOR, string);
    format(string, sizeof(string), "%s wurde verhaftet, getötet. Haftzeit: %d Minuten, Geldstrafe: $%d.",SpielerName(playerid), Spieler[playerid][JailTime]/60,pricerobber);
    SendFamilyMessage(1, TEAM_BLUE_COLOR, string);

    SetSpawnInfo(playerid, 0, Spieler[playerid][Skin], 264.4773,86.4873,1001.0391, 0, 0, 0,0,0,0,0);
    SetPlayerInterior(playerid, 6);
    SetPlayerVirtualWorld(playerid, 32);


    new da, mont, yea, hou, minut;
    getdate(yea, mont, da);
    gettime(hou, minut);
    format(string, sizeof(string), "Polizist %s hat %s mit %d Wanteds eingesperrt, getötet. Date: %d.%d.%d Time: %02d:%02d", SpielerName(killerid), SpielerName(playerid),Spieler[playerid][Wanteds], da, mont ,yea, hou, minut);
    ArrestLog(string);
    }
    else if(Spieler[killerid][Fraktion] != 1 && IsDoingBankrobLS[playerid] == 1 || IsDoingBankrobSF[playerid] == 1)
    {
    format(string,sizeof(string),"<< {FFFFFF}%s {00FFFA}ist gestorben. Der Banküberfall ist gescheitert. >>",SpielerName(killerid),Geld[RobtotGeld]);
    SendClientMessageToAll(-1, string);
    }
    if(Spieler[killerid][Fraktion] != 1 && Spieler[playerid][Fraktion] != 1)
    {
    Spieler[killerid][Wanteds] += 1;
    Spieler[killerid][Verbrechen] += 1;
    GameTextForPlayer(killerid,"Gangwarkill",3000,3);
    }
    for(new i; i < MAX_PLAYERS; i++)
    {
    if(Spieler[i][ContractGeld] > 0)
    {
    if(Auftrag[i] == 1 && AktuellerAuftrag[i] == playerid)
    {
    if(Spieler[killerid][Fraktion] == 8)
    {
    GameTextForPlayer(playerid, "~r~Auftragsmord", 3000, 1);
    GivePlayerCash(killerid, Spieler[playerid][ContractGeld]);
    format(string,128,"<< Hitman %s hat den Vertrag mit %s vervollständigt und $%d gesammelt. >>",SpielerName(killerid),SpielerName(playerid), Spieler[playerid][ContractGeld]);
    SendFamilyMessage(8, COLOR_YELLOW, string);
    Spieler[playerid][ContractGeld] = 0;
    Auftrag[i] = 0;
    AktuellerAuftrag[i] = 999;
    }
    }
    }
    }
    SpawnPlayer(playerid);
    return 1;
    }

  • Abgesehen von der schlechten Scriptweise, fällt mir kein Fehler auf. Vielleicht löst du ja dein Problem wenn du vorher überprüfst ob killerid nicht INVALID ist.



    if(killerid != INVALID_PLAYER_ID)
    {
    //Hier zwischen ganze OnPlayerDeath Code
    }


    Außerdem, wofür Spawnplayer am Ende von OnPlayerDeath? Es wird sowieso OnPlayerSpawn danach aufgerufen..


    Mit freundlichen Grüßen
    JustMe.77 8)

  • Hast du ein System was dem angeschossen eventuell von Script aus Leben entziehen könnte?


    Z.b. Hunger, verbluten etc.
    Ansonsten mal unter OnPlayerTakeDamage einen print durchlaufen lassen von wem/was der Schaden den nun kam.

  • Nein nicht ganz, aber ich hatte eine Vermutung bezüglich dem, dass dem Spieler nach "OnPlayerDeath" bzw. während OnPlayerDeath in
    Ereignis tritt das Leben per SetPlayerHealth(playerid, 100); wieder mit sofortiger Wirkung hergestellt wird. Was ich damit sagen will,, ist, dass
    ich so eine Funktion im Skript habe ^^ Mal schauen, ob sich das Problem löst. Danke.