BOTS erschießen können + HP Anzeige

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

  • In diesem Tutorial geht es darum, die BOTs HP verlieren zu lassen, wenn man sie abschießt und dazu noch eine HP Anzeige.
    Vorausgesetzt für dieses Tutorial ist, dass ihr genügend Grundwissen über BOTS habt, oder mein anderes Tutorial gelesen habt.
    Wie im anderen Tutorial wird wieder mal RNPC benötigt.


    Also wir haben den BOT jetzt connected auf unserem Server, doch nun wollen wir, dass er HP verliert, sobald man auf ihn schießt, wie bei normalen Spielern.


    Da BOTS keine "richtige HP" wie bei Spielern haben, geben wir ihnen eine PVar dafür unter OnPlayerSpawn.



    if(IsPlayerNPC(playerid)==1)
    {
    SetPVarFloat(playerid, "Leben", 100.00);


    }


    Als nächstes machen wir uns ein Callback unter OnPlayerUpdate, das immer aufgerufen wird, wenn ein Spieler schießt.



    new curweapon = GetPlayerWeapon(playerid);
    new curammo = GetPlayerAmmo(playerid);
    if(curweapon == GetPVarInt(playerid, "CurWeapon"))
    {
    if(curammo != GetPVarInt(playerid, "curammo"))
    {
    if(curammo < GetPVarInt(playerid, "curammo"))
    {
    OnPlayerShoot(playerid, curweapon);

    }
    SetPVarInt(playerid, "curammo", curammo);
    }
    }
    else
    {
    SetPVarInt(playerid, "CurWeapon", curweapon);
    }


    Unter dem neuen Callback von uns, das wir OnPlayerShoot genannt haben, müssen wir jetzt noch abfragen, ob ein Spieler anvisiert wird, und ob der Spieler ein NPC ist.
    Zusätzlich legen wir den anvisierten Spieler in eine PVar, weil wir das später noch brauchen. Dann müssen wir noch eine PVar abfragen, die wir ihm bei seinem tot später geben.



    stock OnPlayerShoot(playerid, weaponid)
    {
    if(GetPlayerTargetPlayer(playerid) != INVALID_PLAYER_ID)
    {
    SetPVarInt(playerid, "TargetPlayer", GetPlayerTargetPlayer(playerid));
    if(IsPlayerNPC(GetPVarInt(playerid, "TargetPlayer"))==1)
    {
    if(GetPVarInt(GetPVarInt(playerid,"TargetPlayer"), "tot")!=1)
    {

    }
    }
    }
    }


    Jetzt können wir noch die Reichweite abfragen, falls man Waffen für nur bestimmte Reichweiten einstellen will.
    Dazu fügen wir dies hier erstmal ganz oben unter den Includes ins Script ein. Dieses Array enthält alle abgeschätzten Reichweiten der Waffen.



    new Float:wpReichweite[] = {
    1.0,
    1.0,
    1.2,
    1.2,
    1.1,
    1.2,
    1.2,
    1.3,
    1.2,
    1.3,
    0.5,
    0.5,
    0.5,
    0.5,
    0.5,
    1.4,
    12.0,
    12.0,
    12.0,
    0.0,
    0.0,
    0.0,
    28.0,
    29.0,
    30.0,
    26.0,
    25.0,
    27.0,
    28.0,
    31.0,
    35.0,
    35.0,
    26.0,
    38.0,
    65.0,
    40.0,
    40.0,
    23.0,
    37.0,
    0.0,
    0.0,
    0.0,
    0.0,
    0.0,
    0.0,
    0.0
    };


    Jetzt können wir abfragen. Dazu brauchen wir erstmal die Koordinaten des angeschossenen BOTs und können dann abfragen, ob er in der jeweiligen Reichweite ist.



    stock OnPlayerShoot(playerid, weaponid)
    {
    if(GetPlayerTargetPlayer(playerid) != INVALID_PLAYER_ID)
    {
    SetPVarInt(playerid, "TargetPlayer", GetPlayerTargetPlayer(playerid));
    if(IsPlayerNPC(GetPVarInt(playerid, "TargetPlayer"))==1)
    {
    if(GetPVarInt(GetPVarInt(playerid,"TargetPlayer"), "tot")!=1)
    {
    new Float:x, Float:y, Float:z;
    GetPlayerPos(GetPVarInt(playerid, "TargetPlayer"), x,y,z);
    if(IsPlayerInRangeOfPoint(playerid, wpReichweite[weaponid], x,y,z))
    {

    }

    }
    }
    }
    }


    Jetzt brauchen wir erstmal den Waffenschaden, da ja nicht jede Waffe den gleichen Schaden machen soll, machen wir dafür auch ein Array.
    Diese sind auch einigermaßen angepasst.



    new wpSchaden[] = {
    1,
    2,
    4,
    4,
    5,
    4,
    4,
    4,
    6,
    15,
    1,
    1,
    1,
    1,
    1,
    4,
    80,
    2,
    0,
    10,
    0,
    10,
    35,
    30,
    35,
    15,
    17,
    15,
    8,
    9,
    40,
    12,
    100,
    0,
    55,
    40,
    0,
    4,
    2,
    0,
    0,
    0,
    0,
    0,
    0
    };


    Damit es gleich etwas weniger zu Schreiben gibt, legen wir den Waffenschaden und ein paar PVars erstmal in normale Vars.



    stock OnPlayerShoot(playerid, weaponid)
    {
    if(GetPlayerTargetPlayer(playerid) != INVALID_PLAYER_ID)
    {
    SetPVarInt(playerid, "TargetPlayer", GetPlayerTargetPlayer(playerid));
    if(IsPlayerNPC(GetPVarInt(playerid, "TargetPlayer"))==1)
    {
    if(GetPVarInt(GetPVarInt(playerid,"TargetPlayer"), "tot")!=1)
    {
    new Float:x, Float:y, Float:z;
    GetPlayerPos(GetPVarInt(playerid, "TargetPlayer"), x,y,z);
    if(IsPlayerInRangeOfPoint(playerid, wpReichweite[weaponid], x,y,z))
    {
    new player = GetPVarInt(playerid, "TargetPlayer");
    new dmg = wpSchaden[weaponid];
    new Float:health = GetPVarFloat(player, "Leben");
    }

    }
    }
    }
    }


    Jetzt müssen wir noch den Waffenschaden von der alten HP abziehen und sie in die HP PVar des BOTs legen.


    stock OnPlayerShoot(playerid, weaponid)
    {
    if(GetPlayerTargetPlayer(playerid) != INVALID_PLAYER_ID)
    {
    SetPVarInt(playerid, "TargetPlayer", GetPlayerTargetPlayer(playerid));
    if(IsPlayerNPC(GetPVarInt(playerid, "TargetPlayer"))==1)
    {
    if(GetPVarInt(GetPVarInt(playerid,"TargetPlayer"), "tot")!=1)
    {
    new Float:x, Float:y, Float:z;
    GetPlayerPos(GetPVarInt(playerid, "TargetPlayer"), x,y,z);
    if(IsPlayerInRangeOfPoint(playerid, wpReichweite[weaponid], x,y,z))
    {
    new player = GetPVarInt(playerid, "TargetPlayer");
    new dmg = wpSchaden[weaponid];
    new Float:health = GetPVarFloat(player, "Leben");
    health = health - float(dmg);
    SetPVarFloat(player, "Leben", health);
    }

    }
    }
    }


    Jetzt brauchen wir noch eine Abfrage dafür, wenn health weniger oder gleich 0 ist.
    Dort weisen wir im dann die vorhin abgefragte PVar zu.



    stock OnPlayerShoot(playerid, weaponid)
    {
    if(GetPlayerTargetPlayer(playerid) != INVALID_PLAYER_ID)
    {
    SetPVarInt(playerid, "TargetPlayer", GetPlayerTargetPlayer(playerid));
    if(IsPlayerNPC(GetPVarInt(playerid, "TargetPlayer"))==1)
    {
    if(GetPVarInt(GetPVarInt(playerid,"TargetPlayer"), "tot")!=1)
    {
    new Float:x, Float:y, Float:z;
    GetPlayerPos(GetPVarInt(playerid, "TargetPlayer"), x,y,z);
    if(IsPlayerInRangeOfPoint(playerid, wpReichweite[weaponid], x,y,z))
    {
    new player = GetPVarInt(playerid, "TargetPlayer");
    new dmg = wpSchaden[weaponid];
    new Float:health = GetPVarFloat(player, "Leben");
    health = health - float(dmg);
    SetPVarFloat(player, "Leben", health);
    if(health <= 0.0)
    {
    SetPVarInt(player, "tot", 1);


    }
    }

    }
    }
    }
    }


    Jetzt könnt ihr machen was ihr wollt, um den BOT tot aussehen zu lassen.
    Z.b. alte Animationen entfernen, neue Animation zuteilen, laufende Timer killen.



    stock OnPlayerShoot(playerid, weaponid)
    {
    if(GetPlayerTargetPlayer(playerid) != INVALID_PLAYER_ID)
    {
    SetPVarInt(playerid, "TargetPlayer", GetPlayerTargetPlayer(playerid));
    if(IsPlayerNPC(GetPVarInt(playerid, "TargetPlayer"))==1)
    {
    if(GetPVarInt(GetPVarInt(playerid,"TargetPlayer"), "tot")!=1)
    {
    new Float:x, Float:y, Float:z;
    GetPlayerPos(GetPVarInt(playerid, "TargetPlayer"), x,y,z);
    if(IsPlayerInRangeOfPoint(playerid, wpReichweite[weaponid], x,y,z))
    {
    new player = GetPVarInt(playerid, "TargetPlayer");
    new dmg = wpSchaden[weaponid];
    new Float:health = GetPVarFloat(player, "Leben");
    health = health - float(dmg);
    SetPVarFloat(player, "Leben", health);
    if(health <= 0.0)
    {
    ClearAnimations(player);
    SetPVarInt(player, "tot", 1);
    ApplyAnimation(player, "CRACK", "crckdeth2", 4.0, 1, 1, 1, 1, 1, 1);
    new tid = GetPVarInt(player, "IrgendeinTimerVomZombie");
    KillTimer(tid);
    }
    }

    }
    }
    }
    }



    So, jetzt kommen wir mal zur HP Anzeige.
    Dazu geben wir dem BOT nach dem Spawn einen 3DTextLabel unter OnPlayerSpawn und speichern die ID des Labels gleich als PVar, damit wir es später updaten können.



    if(IsPlayerNPC(playerid)==1)
    {
    new Text3D:label;
    SetPVarFloat(playerid, "Leben", 100.00);
    new string[128];
    format(string,128,"{00D7FF}Leben: {FF0023}100%");
    label = Create3DTextLabel(string, 0x008080FF, 0.0, 0.0, 0.0, 20.0, 0);
    SetPVarInt(playerid, "Label", _:label);
    Attach3DTextLabelToPlayer(label, playerid, 0.0, 0.0, 0.1);
    }


    Jetzt müssen wir das Label noch updaten, wenn der BOT angeschossen wird. Dies machen wir wieder unter OnPlayerShoot.
    Dazu erstellen wir einen String, der den neuen Inhalt der HP Anzeige haben wird. Also im normalen Fall wird die neue HP des BOTs angezeigt und beim Tod wird 0% angezeigt.
    Die HP wandeln wir vom Float zum Integer um, weil wir keine Kommazahl angezeigt haben wollen. Dann holen wir uns noch die ID des Labels, die wir in eine PVar gelegt haben und legen
    sie in eine Text3DVar, weil es anders nicht geht. Schon können wir das Label updaten.



    stock OnPlayerShoot(playerid, weaponid)
    {
    if(GetPlayerTargetPlayer(playerid) != INVALID_PLAYER_ID)
    {
    SetPVarInt(playerid, "TargetPlayer", GetPlayerTargetPlayer(playerid));
    if(IsPlayerNPC(GetPVarInt(playerid, "TargetPlayer"))==1)
    {
    if(GetPVarInt(GetPVarInt(playerid,"TargetPlayer"), "tot")!=1)
    {
    new Float:x, Float:y, Float:z;
    GetPlayerPos(GetPVarInt(playerid, "TargetPlayer"), x,y,z);
    if(IsPlayerInRangeOfPoint(playerid, wpReichweite[weaponid], x,y,z))
    {
    new string[128]; // Der neue String
    new player = GetPVarInt(playerid, "TargetPlayer");
    new dmg = wpSchaden[weaponid];
    new Float:health = GetPVarFloat(player, "Leben");
    health = health - float(dmg);
    SetPVarFloat(player, "Leben", health);
    format(string,128,"{00D7FF}Leben: {FF0023}%d%",floatround(health,floatround_round)); // Die neue HP wird in den String gesetzt
    if(health <= 0.0)
    {
    ClearAnimations(player);
    SetPVarInt(player, "tot", 1);
    ApplyAnimation(player, "CRACK", "crckdeth2", 4.0, 1, 1, 1, 1, 1, 1);
    new tid = GetPVarInt(player, "IrgendeinTimerVomZombie");
    KillTimer(tid);
    format(string,128,"{00D7FF}Leben: {FF0023}0%"); // Falls der Bot stirbt, wird 0% angezeigt, anstatt die negative HP
    }
    new ee = GetPVarInt(player, "Label");
    new Text3D:label;
    label = Text3D:ee;
    Update3DTextLabelText(label, 0xFFFFFFFF, string);

    }

    }
    }
    }
    }




    Dies ist das Ende des Tutorials. Wenn ihr Syntaxfehler oder logische Fehler findet, bitte posten.


    7 Mal editiert, zuletzt von Aki ()


  • Vorausgesetzt für dieses Tutorial ist, dass ihr genügend Grundwissen über BOTS habt



    [color=#ff0000]fördert die "Noobs" die immer Code wollen


    Man kann den Code einfach kopieren, das ist wahr. Ob das die Reader machen oder nicht, daran kann ich nichts ändern.
    Würde ich jede einzelne Funktion erklären, würde das Tutorial viel zu groß werden und folglich würde sich auch niemand die Mühe machen, es durchzulesen.


    Das ist kein Grundkurs für Anfänger, sondern eine Offenlegung der Möglichkeiten für Fortgeschrittene.
    Meiner Meinung nach gibt es genügend Tutorials für Anfänger, wenn dir diese jedoch nicht reichen, kannst du ja hier nachschauen.

  • Also mein Bot Stirbt Also Verliert keine HP !!!! ich kann drauballern wie ich will trotzdem läuft er mir nach


    //EDIT Also HP Verliert er jetzt habe den Fehler gefunden.
    Aber Leider Funktionieren die Animationen nicht wenn der Bot Tötet. Ich habe schon sehr viele andere versucht etc
    wenn ich den BOT kicken lasse geht es Einwandfrei ich möchte aber gerne das er auf dem Boden Crackt kannst du mir da vielleicht helfen.
    Und könntest du noch Erklären das die Zombies einen Spieler ANgreifen zb boxen oder so?


    Wenn ja Adde mich in Skype: ronny-nwm


    Einmal editiert, zuletzt von Ronny16 () aus folgendem Grund: //Frage


  • wenn ich den BOT kicken lasse geht es Einwandfrei ich möchte aber gerne das er auf dem Boden Crackt kannst du mir da vielleicht helfen.
    Und könntest du noch Erklären das die Zombies einen Spieler ANgreifen zb boxen oder so?


    Den Bug mit der Animation habe ich auch, dieser sollte aber nur bei dem Zombie auftreten, der als erstes getötet wird. Bei allen darauf folgenden, sollte die Animation ausgeführt werden.
    Und wegen der Angreif-Animation: Du musst einfach dort, wo der Spieler HP verliert, weil er zu nah am Zombie ist, dem Zombie eine Schlag Animation geben.

  • Okay ich hätte noch ne frage.


    Also ich habe gesehen wenn ich den Bot auf dem Server Spawn lasse das im Ordner npcmodes\recordings\ Die Bots erstellt beispiel. rnpc003-00
    Wie mach ich es aber das der Bot zb nach dem Serverneustart wieder da Spawnt. also wenn ich die alles Einzelnt rufen muss ist auch blöd da ich ja nen DayZ Server machen möcht.

  • Okay ich hätte noch ne frage.


    Also ich habe gesehen wenn ich den Bot auf dem Server Spawn lasse das im Ordner npcmodes\recordings\ Die Bots erstellt beispiel. rnpc003-00
    Wie mach ich es aber das der Bot zb nach dem Serverneustart wieder da Spawnt. also wenn ich die alles Einzelnt rufen muss ist auch blöd da ich ja nen DayZ Server machen möcht.


    Du kannst auch alle BOTS mit nem Timer unter OnGameModeInit spawnen lassen und bei OnPlayerSpawn die BOTS immer an die jeweilige stelle teleportieren.