Medic System

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
  • Hallöle,


    Auf meinem Server kann man mit /service ein Medic rufen.
    Dann bekommt der 90 Sekunden Zeit bei dem Patienten zu sein.


    Nur falls man einen Medic ruft. Fährt er ja nicht ganze Zeit rum um jemanden zu Healen.


    Deswegen möchte ich gerne das wenn man Stirbt, liegt er cracked auf dem Boden, und ist gefreezt.
    Ab da soll sich ein Timer abspielen. Sagen wir 5 Minuten.
    Nach den 5 Minuten wird er wieder Respawnt.


    Ruft er in der Zeit einen Medic und der Medic schreibt /beleben ID oder so, dann wird der Spieler entfreezt, ist nicht mehr cracked und der Timer wird abgebrochen.


    So schwer kann das ja nicht sein.
    Würde mich auf Antworten freuen. ^^


    Mit freundlichen Grüßen,
    Slexout.


    //edit Korrektur
    //edit 2: Hab es zum Teil jetzt glaub ein wenig hinbekommen.
    Aber was soll ich machen wenn playerid nicht Definiert ist?


    Weil ich bekomme 2 Errors hier drin:


    public TodTimer()
    {
    SendClientMessage(playerid, 0x00B9FFFF, "Der Medic war nicht schnell genug, du bist gestorben.");
    SpawnPlayer(playerid);
    }

    Einmal editiert, zuletzt von Slexout ()

  • Ist scripte schon länger.
    Aber so ein Fall hatte ich noch nie :D
    Muss man dann nicht iwas mit MAX_PLAYERS machen oder so? :D


    //Edit: Naja unwichtig.
    Ich hab es nun soweit hin bekommen das wenn ich sterbe, bin ich gefreezt und liege cracked auf dem Boden.


    Ich spawne aber an meinem Spawnort und liege dann da rum.
    Wie mache ich es das meine Position wo ich gerade bin beim Sterben gespeichert wird, und ich dann nach dem Sterben dort wieder hin teleportiert werde?

    Einmal editiert, zuletzt von Slexout ()

  • ...
    Hier ein Beispiel:


    forward TodTimer(playerid);

    SetTimerEx("TodTimer",5000,0,"d",playerid);


    public TodTimer(playerid)
    {
    SendClientMessage(playerid, 0x00B9FFFF, "Der Medic war nicht schnell genug, du bist gestorben.");
    SpawnPlayer(playerid);
    }


    Bitteschön.

  • Wow, genau so hab ich das :D


    Aber das ist ja das wenn ich verräcke.
    Ich meine wenn ich nur verletzt bin. D.h also ein mal gestorben und ich dann da rum liege.
    Ich liege nicht da wo ich "Verletzt" wurde, sondern ich liege an meinem Spawnort und muss dort auf dem Medicwarten.


    Also meine Frage:


    Wie? Bei OnPlayerDeath abfragen wo der Spieler ist.


    Und Wie? Bei dem TodTimer denn Spieler wieder dort hinholen.
    Thx noskillet ;)

  • Nein,
    Genau das was du da gemeint hast. Passiert ja. =D


    Wenn der Spieler gerade Stirbt, also die HP auf 0 ist... dann ist er ja eigentlich schon Tot.


    Dann liegt er gerade an seinem Spawnort und ist gefreezt.


    Er soll aber nicht an seinem Spawnort liegen, sondern an die Position zurückkommen wo er Gestorben ist.
    Also müsste man da die Position abfragen bei OnPlayerDeath.
    Und beim Timer den da wieder hin porten.


    Nur ich weiß nicht wie.


    PS: Vielen Dank für die schnellen Antworten und hilfen noskillget.

  • Ist doch ganz easy :D


    Bei den anderen new's:

    new Float:deathX, Float:deathY, Float:deathZ;



    OnPlayerDeath(...)
    {
    GetPlayerPos(playerid,deathX,deathY,deathZ);
    SetTimerEx("TodTimer",5000,0,"d",playerid);
    }



    public TodTimer(playerid)
    {
    SendClientMessage(playerid, 0x00B9FFFF, "Der Medic war nicht schnell genug, du bist gestorben.");
    SetPlayerPos(playerid,deathX,deathY,deathZ);
    TogglePlayerControllable(playerid,0);
    }

  • Hab nun das bei OnPlayerDeath:

    new Float:deathX, Float:deathY, Float:deathZ;
    GetPlayerPos(playerid,deathX,deathY,deathZ);


    Und das beim Timer:

    new Float:deathX, Float:deathY, Float:deathZ;
    SetPlayerPos(playerid,deathX,deathY,deathZ);


    Ich lande aber beim Blueberry Acker wenn ich sterbe :s
    Aber guter Anfang, echt ;)

  • Hab ich gerade gemerkt ;D
    Danke !! :D


    //edit: Ok, das hätten wir.


    Wie könnte ich den jetzt ein Command machen zum wiederbeleben?
    Ich hab bis jetzt das:

    if(strcmp(cmd, "/wiederbeleben", true) == 0)
    {
    if(IsPlayerConnected(playerid))
    {
    if(PlayerInfo[playerid][pMember] != 2 && PlayerInfo[playerid][pLeader] != 2)
    {
    SendClientMessage(playerid, COLOR_GREY, "** Du bist kein Medic!");
    return 1;
    }
    if(PlayerInfo[playerid][pDuty] != 1 && PlayerInfo[playerid][pMember] == 4)
    {
    SendClientMessage(playerid, COLOR_GREY, "** Du bist nicht im Dienst!");
    return 1;
    }
    // Hier muss nun das hin das der Spieler entfreezt wird, und das MedicBill[playerid] = 0;

    Aber wie mache ich das, das es nicht mit mir geschiet, sondern mit dem Spieler den ich wieder belebe.. giveplayerid?


    //Edit: Korrektur im Code

    Einmal editiert, zuletzt von Slexout ()

  • Hmm..


    könntest es so machen:


    for(new i; i<MAX_PLAYERS; i++)
    {
    if(MedicBill[i] == 1)
    {
    new Float:posX, Float:posY, Float:posZ;
    GetPlayerPos(playerid,posX,posY,posZ);
    if(IsPlayerInRangeOfPoint(i,5.0,posX,posY,posZ))
    {
    TogglePlayerControllable(i,1);
    MedicBill[i] = 0;
    SendClientMessage(i,grau,"Ein Medic hat dich erfolgreich wiederbelebt");
    }
    }
    }

  • Ich hab es gerade so Probiert:

    if(strcmp(cmd, "/wiederbeleben", true) == 0)
    {
    if(IsPlayerConnected(playerid))
    {
    if(PlayerInfo[playerid][pMember] != 2 && PlayerInfo[playerid][pLeader] != 2)
    {
    SendClientMessage(playerid, COLOR_GREY, "** Du bist kein Medic!");
    return 1;
    }
    if(PlayerInfo[playerid][pDuty] != 1 && PlayerInfo[playerid][pMember] == 4)
    {
    SendClientMessage(playerid, COLOR_GREY, "** Du bist nicht im Dienst!");
    return 1;
    }
    giveplayerid = ReturnUser(tmp);
    tmp = strtok2(cmdtext, idx);

    MedicBill[giveplayerid] = 0;
    TogglePlayerControllable(giveplayerid,1)
    return 1;
    }
    }
    return 1;
    }


    Nur dann steht da Pawno Funktioniert nicht mehr, weiß aber nicht warum. :o

  • ... du darfst nicht vergessen dem toten ne variable zu geben... sonst gillt das mit wiederbeleben für jeden spieler der in der nähe ist...
    sprich du machst einfach ne variable, die z.B. mit new TOT[MAX_PLAYERS]; oben definiert ist, und machst dann bei onplayerdeath TOT[playerid] = 1;
    und bei deinerm Timer wieder TOT[playerid] = 0;


    nicht zu vergessen auch in dem command /wiederbeleben TOT[i] = 0;


    ;)


    Edit//


    Sry habe nicht richtig gelesen ^^


    Edit 2//


    Counter nicht deklariert


    forward TodTimer(playerid);
    new MedicBill[MAX_PLAYERS];
    new AlliveCount[MAX_PLAYERS];
    new Float:deathX[MAX_PLAYERS],Float:deathY[MAX_PLAYERS],Float:deathZ[MAX_PLAYERS];


    if(strcmp(cmd, "/wiederbeleben", true) == 0)
    {
    if(IsPlayerConnected(playerid))
    {
    if(PlayerInfo[playerid][pMember] != 2 && PlayerInfo[playerid][pLeader] != 2)
    {
    SendClientMessage(playerid, COLOR_GREY, "** Du bist kein Medic!");
    return 1;
    }
    if(PlayerInfo[playerid][pDuty] != 1 && PlayerInfo[playerid][pMember] == 4)
    {
    SendClientMessage(playerid, COLOR_GREY, "** Du bist nicht im Dienst!");
    return 1;
    }
    for(new i; i<MAX_PLAYERS; i++)
    {
    if(MedicBill[i] == 1)
    {
    if(IsPlayerInRangeOfPoint(i,5.0,deathX[i],deathY[i],deathZ[i]))
    {
    TogglePlayerControllable(i,1);
    MedicBill[i] = 0;
    SetPlayerPos(i,deathX[i],deathY[i],deathZ[i]);
    SendClientMessage(i,0xFFFFFFFF,"Ein Medic hat dich erfolgreich wiederbelebt");
    SendClientMessage(playerid,0xFFFFFFFF,"Du hast den Partienten wiederbelebt!");
    KillTimer(AlliveCount[i];
    }
    }
    }
    return 1;
    }
    }
    return 1;
    }


    public OnPlayerDeath(...)
    {
    GetPlayerPos(playerid,deathX[playerid],deathY[playerid],deathZ[playerid]);
    AlliveCount[playerid] = SetTimerEx("TodTimer",5000,0,"d",playerid);
    MedicBill[playerid] = 1;
    }


    public OnPlayerSpawn(...)
    {
    if(MedicBill[playerid] == 1)
    {
    SetPlayerPos(playerid,deathX,deathY,deathZ);
    TogglePlayerControllable(playerid,0);
    }
    return 1;
    }




    public TodTimer(playerid)
    {
    SendClientMessage(i,0xFFFFFFFF,"Du wurdest nicht rechtzeitig wiederbelebt!");
    SpawnPlayer(playerid);
    MedicBill[playerid] = 0;
    return 1;
    }


    so müsste es gehen (ungetestet)

    MFG.:
    manumeyer


    if (strcmp("/Hatschi", cmdtext, true) == 0)
    {
    SendClientMessage(playerid,0xAA3333,"Gesundheit!");
    return 1;
    }

    2 Mal editiert, zuletzt von manumeyer ()

  • manumeyer: Ich denke bei ihm heist die Abfrage 'MedicBill[playerid]'


    @Selxout: Probier das mal:


    if(strcmp(cmd, "/wiederbeleben", true) == 0)
    {
    if(IsPlayerConnected(playerid))
    {
    if(PlayerInfo[playerid][pMember] != 2 && PlayerInfo[playerid][pLeader] != 2)
    {
    SendClientMessage(playerid, COLOR_GREY, "** Du bist kein Medic!");
    return 1;
    }
    if(PlayerInfo[playerid][pDuty] != 1 && PlayerInfo[playerid][pMember] == 4)
    {
    SendClientMessage(playerid, COLOR_GREY, "** Du bist nicht im Dienst!");
    return 1;
    }
    for(new i; i<MAX_PLAYERS; i++)
    {
    if(MedicBill[i] == 1)
    {
    new Float:posX, Float:posY, Float:posZ;
    GetPlayerPos(playerid,posX,posY,posZ);
    if(IsPlayerInRangeOfPoint(i,5.0,posX,posY,posZ))
    {
    TogglePlayerControllable(i,1);
    MedicBill[i] = 0;
    SendClientMessage(i,grau,"Ein Medic hat dich erfolgreich wiederbelebt");
    }
    }
    }
    }
    return 1;
    }

  • @ n0skillg3t


    wenn jetzt jedoch 2 leute sterben, wird nur die position von letzen sterbenden gespeichert ;)

    MFG.:
    manumeyer


    if (strcmp("/Hatschi", cmdtext, true) == 0)
    {
    SendClientMessage(playerid,0xAA3333,"Gesundheit!");
    return 1;
    }