Bestatterid 1 geht nur , wieso?

In 10 Minuten startet der nächtliche Backupvorgang! Es kann währenddessen (ca. 10 Minuten) zu Einschränkungen bei der Nutzung des Forums kommen
Weitere Infos findet ihr im Thema Backup des Forums
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 Com,


    Immer wenn ich /takecorpse eingebe und die Bestatterid nicht 0 ist steht da du bist bei keiner Leiche


    Wieso ist das so :D


    Code:


    ocmd:takecorpse(playerid,params[])
    {
    new text[36];
    for(new i = 0; i < MAX_BESTATTER; i++)
    {
    if(PlayerInfo[playerid][pJob] != 36) return SendClientMessage(playerid,WHITE,"Du bist kein Bestatter!");
    if(BestatterInfo[i][Bestatterid] != playerid)
    if(!IsPlayerInRangeOfPoint(playerid,5.0,BestatterInfo[i][Todx],BestatterInfo[i][Tody],BestatterInfo[i][Todz])) return SendClientMessage(playerid,WHITE,"Du bist bei keiner Leiche!");
    if(BestatterInfo[i][Bestatterid] != playerid) return SendClientMessage(playerid,WHITE,"Dieser Auftrag gehört dir nicht!");
    if(IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid,WHITE,"Im Auto ist es nicht möglich eine Leiche aufzuheben!");
    if(sscanf(params,"s",text)) return SendClientMessage(playerid,WHITE,"Nutzung: /takecorpse [Name]");
    if(strcmp(text,BestatterInfo[i][Opfer],true)) return SendClientMessage(playerid,WHITE,"Falscher Name, schreibe den Namen bitte Vollständig aus!");
    {
    SendClientMessage(playerid,COLOR_LIGHTBLUE,"** Du hast eine Leiche aufgesammelt!");
    SendClientMessage(playerid,COLOR_LIGHTBLUE,"** Gehe nun zum Kofferraum und gebe ein /laycorpse!");
    DestroyPickup(TotenKopf[bestattervar[playerid]]);
    Delete3DTextLabel(TotenLabeli[bestattervar[playerid]]);
    KillTimer(totentimer[BestatterInfo[i][Spielerid]]);
    hatleiche[playerid] = 1;
    bestatterpoint[playerid] = 1;
    break;
    }
    }
    return 1;
    }


    Danke

  • und wo wird etwas in die bestatterinfo geschrieben


    Beim Tod


    for(new ix = 0; ix < MAX_BESTATTER; ix++)
    {
    if(BestatterInfo[ix][Inuse] == 0)
    {
    BestatterInfo[ix][Spielerid] = playerid;
    format(BestatterInfo[ix][Opfer],24,"%s",Namei);
    BestatterInfo[ix][Todx] = Tod[0];
    BestatterInfo[ix][Tody] = Tod[1];
    BestatterInfo[ix][Todz] = Tod[2];
    BestatterInfo[ix][TodesGeld] = floatround(ergebnis);
    BestatterInfo[ix][Angenommen] = 0;
    BestatterInfo[ix][Inuse] = 1;
    format(BestatterInfo[ix][Auftragnehmer],24,"No-One");
    break;
    }
    else print("A Fail has found, yet");
    }


    Edit bei der Bestatterid 0 gehts aj bei der darüber nicht?

  • if(!IsPlayerInRangeOfPoint(playerid,5.0,BestatterInfo[i][Todx],BestatterInfo[i][Tody],BestatterInfo[i][Todz])) return SendClientMessage(playerid,WHITE,"Du bist bei keiner Leiche!");


    Kann auch nicht gehen. Wenn du bei diesem Code nicht bei der ersten Person (Id 0) stehst, bricht er die gesamte Schleife ab und gibt dir die Nachricht heraus.


    Mfg

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Aber in meinen anderen gehts auch soll ich da dann else schreiben?


    Ist ja schön und gut, aber die return's müssen raus. Überleg dir doch einfach mal logisch, was passiert, wenn du den Befehl eingibst. Wenn ein return auftaucht, bricht die Schleife ab, ob du es glaubst oder nicht.
    Wie du es machen kannst:
    1. Alles "positiv" Scripten. Sprich, du machst, dass er den Code ausführt, wenn die Umstände gegeben sind. (Bsp.: Statt !IsPlayerInRangeOfPoint machst du IsPlayerInRangeOfPoint)
    2. In einer Schleife die Id des nächstgelegenen Toten in einer Variable schreiben und danach den Code in der Schleife ausführen.


    Mfg

  • Ist ja schön und gut, aber die return's müssen raus. Überleg dir doch einfach mal logisch, was passiert, wenn du den Befehl eingibst. Wenn ein return auftaucht, bricht die Schleife ab, ob du es glaubst oder nicht.
    Wie du es machen kannst:


    So?


    ocmd:takecorpse(playerid,params[])
    {
    new text[36];
    for(new i = 0; i < MAX_BESTATTER; i++)
    {
    if(PlayerInfo[playerid][pJob] == 36)
    {
    if(BestatterInfo[i][Bestatterid] != playerid)
    {
    if(IsPlayerInRangeOfPoint(playerid,5.0,BestatterInfo[i][Todx],BestatterInfo[i][Tody],BestatterInfo[i][Todz]))
    {
    if(BestatterInfo[i][Bestatterid] == playerid)
    {
    if(!IsPlayerInAnyVehicle(playerid))
    {
    if(sscanf(params,"s",text))
    {
    if(strcmp(text,BestatterInfo[i][Opfer],true))
    {
    SendClientMessage(playerid,COLOR_LIGHTBLUE,"** Du hast eine Leiche aufgesammelt!");
    SendClientMessage(playerid,COLOR_LIGHTBLUE,"** Gehe nun zum Kofferraum und gebe ein /laycorpse!");
    DestroyPickup(TotenKopf[bestattervar[playerid]]);
    Delete3DTextLabel(TotenLabeli[bestattervar[playerid]]);
    KillTimer(totentimer[BestatterInfo[i][Spielerid]]);
    hatleiche[playerid] = 1;
    bestatterpoint[playerid] = 1;
    }
    else { return SendClientMessage(playerid,WHITE,"Falscher Name, bitte schreibe vollständig den Namen!"); }
    }
    else { return SendClientMessage(playerid,WHITE,"Nutzung: /takecorpse [Name der Leiche]"); }
    }
    else { return SendClientMessage(playerid,WHITE,"Du darfst nicht in einem Fahrzeug sein!"); }
    }
    else { return SendClientMessage(playerid,WHITE,"Dieser Auftrag gehört dir nicht!"); }
    }
    else { return SendClientMessage(playerid,WHITE,"Du bist nicht bei der Leiche"); }
    }
    else { return SendClientMessage(playerid,WHITE,"Dieser Auftrag gehört dir nicht"); }
    }
    else { return SendClientMessage(playerid,WHITE,"Du bist kein Bestatter"); }
    }
    return 1;
    }


    Wenn da kein return ist dann kommt die MEssage 20 mal ?

  • Das else ändert auch nichts daran, dass die Schleife durch das return abgebrochen wird. Wenn du es nach Methode 1 machst, darfst du natürlich keine Nachrichten senden, sonst kommt es zu Spam.


    So würde ich es machen:



    ocmd:takecorpse(playerid,params[])
    {
    new text[36], id = -1;
    if(PlayerInfo[playerid][pJob] != 36)
    {
    return SendClientMessage(playerid,WHITE,"Du bist kein Bestatter");
    }
    if(IsPlayerInAnyVehicle(playerid))
    {
    return SendClientMessage(playerid,WHITE,"Du darfst nicht in einem Fahrzeug sein!");
    }
    if(sscanf(params,"s",text)) //Ich weiß nicht wie du es haben willst, aber für ID's gibt es ja auch "u", das gibt dir ja die userid aus.
    {
    return SendClientMessage(playerid,WHITE,"Nutzung: /takecorpse [Name der Leiche]");
    }
    for(new i; i < MAX_BESTATTER; i++)
    {
    if(IsPlayerConnected(i))
    {
    if(!strcmp(text,BestatterInfo[i][Opfer],true))
    {
    id = i;
    break;
    }
    }
    }
    if(id == -1)
    {
    return SendClientMessage(playerid,WHITE,"Falscher Name, bitte schreibe vollständig den Namen!");
    }
    if(!IsPlayerInRangeOfPoint(playerid,5.0,BestatterInfo[id][Todx],BestatterInfo[id][Tody],BestatterInfo[id][Todz]))
    {
    return SendClientMessage(playerid,WHITE,"Du bist nicht bei der Leiche");
    }
    if(BestatterInfo[id][Bestatterid] == playerid)
    {
    return SendClientMessage(playerid,WHITE,"Dieser Auftrag gehört dir nicht");
    }
    SendClientMessage(playerid,COLOR_LIGHTBLUE,"** Du hast eine Leiche aufgesammelt!");
    SendClientMessage(playerid,COLOR_LIGHTBLUE,"** Gehe nun zum Kofferraum und gebe ein /laycorpse!");
    DestroyPickup(TotenKopf[bestattervar[playerid]]);
    Delete3DTextLabel(TotenLabeli[bestattervar[playerid]]);
    KillTimer(totentimer[BestatterInfo[id][Spielerid]]);
    hatleiche[playerid] = 1;
    bestatterpoint[playerid] = 1;
    return 1;
    }


    Ich weiß aber natürlich nicht, wie du den Befehl genau haben willst. Als Denkanstoß sollte es aber reichen. :)

    Einmal editiert, zuletzt von UncleSub () aus folgendem Grund: Kleiner Fail