BOTS erschießen können + HP Anzeige

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • BOTS erschießen können + HP Anzeige


      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.

      PAWN-Quellcode

      1. if(IsPlayerNPC(playerid)==1)
      2. {
      3. SetPVarFloat(playerid, "Leben", 100.00);
      4. }


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

      PAWN-Quellcode

      1. new curweapon = GetPlayerWeapon(playerid);
      2. new curammo = GetPlayerAmmo(playerid);
      3. if(curweapon == GetPVarInt(playerid, "CurWeapon"))
      4. {
      5. if(curammo != GetPVarInt(playerid, "curammo"))
      6. {
      7. if(curammo < GetPVarInt(playerid, "curammo"))
      8. {
      9. OnPlayerShoot(playerid, curweapon);
      10. }
      11. SetPVarInt(playerid, "curammo", curammo);
      12. }
      13. }
      14. else
      15. {
      16. SetPVarInt(playerid, "CurWeapon", curweapon);
      17. }
      Alles anzeigen


      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.

      PAWN-Quellcode

      1. stock OnPlayerShoot(playerid, weaponid)
      2. {
      3. if(GetPlayerTargetPlayer(playerid) != INVALID_PLAYER_ID)
      4. {
      5. SetPVarInt(playerid, "TargetPlayer", GetPlayerTargetPlayer(playerid));
      6. if(IsPlayerNPC(GetPVarInt(playerid, "TargetPlayer"))==1)
      7. {
      8. if(GetPVarInt(GetPVarInt(playerid,"TargetPlayer"), "tot")!=1)
      9. {
      10. }
      11. }
      12. }
      13. }
      Alles anzeigen


      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.

      PAWN-Quellcode

      1. new Float:wpReichweite[] = {
      2. 1.0,
      3. 1.0,
      4. 1.2,
      5. 1.2,
      6. 1.1,
      7. 1.2,
      8. 1.2,
      9. 1.3,
      10. 1.2,
      11. 1.3,
      12. 0.5,
      13. 0.5,
      14. 0.5,
      15. 0.5,
      16. 0.5,
      17. 1.4,
      18. 12.0,
      19. 12.0,
      20. 12.0,
      21. 0.0,
      22. 0.0,
      23. 0.0,
      24. 28.0,
      25. 29.0,
      26. 30.0,
      27. 26.0,
      28. 25.0,
      29. 27.0,
      30. 28.0,
      31. 31.0,
      32. 35.0,
      33. 35.0,
      34. 26.0,
      35. 38.0,
      36. 65.0,
      37. 40.0,
      38. 40.0,
      39. 23.0,
      40. 37.0,
      41. 0.0,
      42. 0.0,
      43. 0.0,
      44. 0.0,
      45. 0.0,
      46. 0.0,
      47. 0.0
      48. };
      Alles anzeigen


      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.

      PAWN-Quellcode

      1. stock OnPlayerShoot(playerid, weaponid)
      2. {
      3. if(GetPlayerTargetPlayer(playerid) != INVALID_PLAYER_ID)
      4. {
      5. SetPVarInt(playerid, "TargetPlayer", GetPlayerTargetPlayer(playerid));
      6. if(IsPlayerNPC(GetPVarInt(playerid, "TargetPlayer"))==1)
      7. {
      8. if(GetPVarInt(GetPVarInt(playerid,"TargetPlayer"), "tot")!=1)
      9. {
      10. new Float:x, Float:y, Float:z;
      11. GetPlayerPos(GetPVarInt(playerid, "TargetPlayer"), x,y,z);
      12. if(IsPlayerInRangeOfPoint(playerid, wpReichweite[weaponid], x,y,z))
      13. {
      14. }
      15. }
      16. }
      17. }
      18. }
      Alles anzeigen


      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.

      PAWN-Quellcode

      1. new wpSchaden[] = {
      2. 1,
      3. 2,
      4. 4,
      5. 4,
      6. 5,
      7. 4,
      8. 4,
      9. 4,
      10. 6,
      11. 15,
      12. 1,
      13. 1,
      14. 1,
      15. 1,
      16. 1,
      17. 4,
      18. 80,
      19. 2,
      20. 0,
      21. 10,
      22. 0,
      23. 10,
      24. 35,
      25. 30,
      26. 35,
      27. 15,
      28. 17,
      29. 15,
      30. 8,
      31. 9,
      32. 40,
      33. 12,
      34. 100,
      35. 0,
      36. 55,
      37. 40,
      38. 0,
      39. 4,
      40. 2,
      41. 0,
      42. 0,
      43. 0,
      44. 0,
      45. 0,
      46. 0
      47. };
      Alles anzeigen


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

      PAWN-Quellcode

      1. stock OnPlayerShoot(playerid, weaponid)
      2. {
      3. if(GetPlayerTargetPlayer(playerid) != INVALID_PLAYER_ID)
      4. {
      5. SetPVarInt(playerid, "TargetPlayer", GetPlayerTargetPlayer(playerid));
      6. if(IsPlayerNPC(GetPVarInt(playerid, "TargetPlayer"))==1)
      7. {
      8. if(GetPVarInt(GetPVarInt(playerid,"TargetPlayer"), "tot")!=1)
      9. {
      10. new Float:x, Float:y, Float:z;
      11. GetPlayerPos(GetPVarInt(playerid, "TargetPlayer"), x,y,z);
      12. if(IsPlayerInRangeOfPoint(playerid, wpReichweite[weaponid], x,y,z))
      13. {
      14. new player = GetPVarInt(playerid, "TargetPlayer");
      15. new dmg = wpSchaden[weaponid];
      16. new Float:health = GetPVarFloat(player, "Leben");
      17. }
      18. }
      19. }
      20. }
      21. }
      Alles anzeigen


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

      PAWN-Quellcode

      1. stock OnPlayerShoot(playerid, weaponid)
      2. {
      3. if(GetPlayerTargetPlayer(playerid) != INVALID_PLAYER_ID)
      4. {
      5. SetPVarInt(playerid, "TargetPlayer", GetPlayerTargetPlayer(playerid));
      6. if(IsPlayerNPC(GetPVarInt(playerid, "TargetPlayer"))==1)
      7. {
      8. if(GetPVarInt(GetPVarInt(playerid,"TargetPlayer"), "tot")!=1)
      9. {
      10. new Float:x, Float:y, Float:z;
      11. GetPlayerPos(GetPVarInt(playerid, "TargetPlayer"), x,y,z);
      12. if(IsPlayerInRangeOfPoint(playerid, wpReichweite[weaponid], x,y,z))
      13. {
      14. new player = GetPVarInt(playerid, "TargetPlayer");
      15. new dmg = wpSchaden[weaponid];
      16. new Float:health = GetPVarFloat(player, "Leben");
      17. health = health - float(dmg);
      18. SetPVarFloat(player, "Leben", health);
      19. }
      20. }
      21. }
      22. }
      Alles anzeigen


      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.

      PAWN-Quellcode

      1. stock OnPlayerShoot(playerid, weaponid)
      2. {
      3. if(GetPlayerTargetPlayer(playerid) != INVALID_PLAYER_ID)
      4. {
      5. SetPVarInt(playerid, "TargetPlayer", GetPlayerTargetPlayer(playerid));
      6. if(IsPlayerNPC(GetPVarInt(playerid, "TargetPlayer"))==1)
      7. {
      8. if(GetPVarInt(GetPVarInt(playerid,"TargetPlayer"), "tot")!=1)
      9. {
      10. new Float:x, Float:y, Float:z;
      11. GetPlayerPos(GetPVarInt(playerid, "TargetPlayer"), x,y,z);
      12. if(IsPlayerInRangeOfPoint(playerid, wpReichweite[weaponid], x,y,z))
      13. {
      14. new player = GetPVarInt(playerid, "TargetPlayer");
      15. new dmg = wpSchaden[weaponid];
      16. new Float:health = GetPVarFloat(player, "Leben");
      17. health = health - float(dmg);
      18. SetPVarFloat(player, "Leben", health);
      19. if(health <= 0.0)
      20. {
      21. SetPVarInt(player, "tot", 1);
      22. }
      23. }
      24. }
      25. }
      26. }
      27. }
      Alles anzeigen


      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.

      PAWN-Quellcode

      1. stock OnPlayerShoot(playerid, weaponid)
      2. {
      3. if(GetPlayerTargetPlayer(playerid) != INVALID_PLAYER_ID)
      4. {
      5. SetPVarInt(playerid, "TargetPlayer", GetPlayerTargetPlayer(playerid));
      6. if(IsPlayerNPC(GetPVarInt(playerid, "TargetPlayer"))==1)
      7. {
      8. if(GetPVarInt(GetPVarInt(playerid,"TargetPlayer"), "tot")!=1)
      9. {
      10. new Float:x, Float:y, Float:z;
      11. GetPlayerPos(GetPVarInt(playerid, "TargetPlayer"), x,y,z);
      12. if(IsPlayerInRangeOfPoint(playerid, wpReichweite[weaponid], x,y,z))
      13. {
      14. new player = GetPVarInt(playerid, "TargetPlayer");
      15. new dmg = wpSchaden[weaponid];
      16. new Float:health = GetPVarFloat(player, "Leben");
      17. health = health - float(dmg);
      18. SetPVarFloat(player, "Leben", health);
      19. if(health <= 0.0)
      20. {
      21. ClearAnimations(player);
      22. SetPVarInt(player, "tot", 1);
      23. ApplyAnimation(player, "CRACK", "crckdeth2", 4.0, 1, 1, 1, 1, 1, 1);
      24. new tid = GetPVarInt(player, "IrgendeinTimerVomZombie");
      25. KillTimer(tid);
      26. }
      27. }
      28. }
      29. }
      30. }
      31. }
      Alles anzeigen



      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.

      PAWN-Quellcode

      1. if(IsPlayerNPC(playerid)==1)
      2. {
      3. new Text3D:label;
      4. SetPVarFloat(playerid, "Leben", 100.00);
      5. new string[128];
      6. format(string,128,"{00D7FF}Leben: {FF0023}100%");
      7. label = Create3DTextLabel(string, 0x008080FF, 0.0, 0.0, 0.0, 20.0, 0);
      8. SetPVarInt(playerid, "Label", _:label);
      9. Attach3DTextLabelToPlayer(label, playerid, 0.0, 0.0, 0.1);
      10. }


      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.

      PAWN-Quellcode

      1. stock OnPlayerShoot(playerid, weaponid)
      2. {
      3. if(GetPlayerTargetPlayer(playerid) != INVALID_PLAYER_ID)
      4. {
      5. SetPVarInt(playerid, "TargetPlayer", GetPlayerTargetPlayer(playerid));
      6. if(IsPlayerNPC(GetPVarInt(playerid, "TargetPlayer"))==1)
      7. {
      8. if(GetPVarInt(GetPVarInt(playerid,"TargetPlayer"), "tot")!=1)
      9. {
      10. new Float:x, Float:y, Float:z;
      11. GetPlayerPos(GetPVarInt(playerid, "TargetPlayer"), x,y,z);
      12. if(IsPlayerInRangeOfPoint(playerid, wpReichweite[weaponid], x,y,z))
      13. {
      14. new string[128]; // Der neue String
      15. new player = GetPVarInt(playerid, "TargetPlayer");
      16. new dmg = wpSchaden[weaponid];
      17. new Float:health = GetPVarFloat(player, "Leben");
      18. health = health - float(dmg);
      19. SetPVarFloat(player, "Leben", health);
      20. format(string,128,"{00D7FF}Leben: {FF0023}%d%",floatround(health,floatround_round)); // Die neue HP wird in den String gesetzt
      21. if(health <= 0.0)
      22. {
      23. ClearAnimations(player);
      24. SetPVarInt(player, "tot", 1);
      25. ApplyAnimation(player, "CRACK", "crckdeth2", 4.0, 1, 1, 1, 1, 1, 1);
      26. new tid = GetPVarInt(player, "IrgendeinTimerVomZombie");
      27. KillTimer(tid);
      28. format(string,128,"{00D7FF}Leben: {FF0023}0%"); // Falls der Bot stirbt, wird 0% angezeigt, anstatt die negative HP
      29. }
      30. new ee = GetPVarInt(player, "Label");
      31. new Text3D:label;
      32. label = Text3D:ee;
      33. Update3DTextLabelText(label, 0xFFFFFFFF, string);
      34. }
      35. }
      36. }
      37. }
      38. }
      Alles anzeigen



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








      Angewöhnung geistiger Grundsätze ohne Gründe nennt man Glauben.

      Friedrich Nietzsche

      Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von Aki ()

    • Showtek schrieb:


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


      Mysteriöser Unbekannter schrieb:


      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.






      Angewöhnung geistiger Grundsätze ohne Gründe nennt man Glauben.

      Friedrich Nietzsche

    • Pall. schrieb:

      Das Tutorial funkzt nicht....habs genauso gemacht wie du nur angepasst und der Bot stirbt einfach nicht :/


      Bots können nicht wie normale Spieler "sterben". Sie können den Tod lediglich durch Animationen "vortäuschen".






      Angewöhnung geistiger Grundsätze ohne Gründe nennt man Glauben.

      Friedrich Nietzsche

    • DarkRevolution schrieb:

      Tja. Jetzt wäre es noch cool, wenn OnPlayerShoot nicht aufgerufen wird, wenn ich einfach nur meine Waffe wechsle. Hast du das überhaupt mal getestet?


      Wurde getestet, funktioniert einwandfrei.
      Ich danke dir aber, dass du mich auf den logischen Fehler aufmerksam gemacht hast.

      €: Logischer Fehler behoben.






      Angewöhnung geistiger Grundsätze ohne Gründe nennt man Glauben.

      Friedrich Nietzsche

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Showtek ()

    • Soll ich mirs mal anschauen? - Wenn ja, dann adde mich in Skype, oder poste es in 'Scripting Base'






      Angewöhnung geistiger Grundsätze ohne Gründe nennt man Glauben.

      Friedrich Nietzsche


    • 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


      Mein Facebook Profil: Klick mich [FACEBOOK]

      Youtube Kanal: Klick mich [YOUTUBE]

      Skype: Klick mich "SKYPE"

      Windows Live: lala16@hotmail.de


      Role of German Mein Server.

      Server ip: Noch im Aufbau (0.1 Alpha)

      Forum: kommt rog-reallife.de/

      Role of German befindet sich derzeit noch in der Entwicklung es handelt sich um ein Komplett Selfmade was in Richtung Life of German geht




      #Server Trailer #1


      Video entfernt


      Xbox 360

      Steam : Ronny19



      Meine Werke könnt ihr hier auf Mein Profil Finden Klick hier im meine Werke zu sehen



      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Ronny16 () aus folgendem Grund: //Frage

    • Ronny16 schrieb:


      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.






      Angewöhnung geistiger Grundsätze ohne Gründe nennt man Glauben.

      Friedrich Nietzsche

    • 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.


      Mein Facebook Profil: Klick mich [FACEBOOK]

      Youtube Kanal: Klick mich [YOUTUBE]

      Skype: Klick mich "SKYPE"

      Windows Live: lala16@hotmail.de


      Role of German Mein Server.

      Server ip: Noch im Aufbau (0.1 Alpha)

      Forum: kommt rog-reallife.de/

      Role of German befindet sich derzeit noch in der Entwicklung es handelt sich um ein Komplett Selfmade was in Richtung Life of German geht




      #Server Trailer #1


      Video entfernt


      Xbox 360

      Steam : Ronny19



      Meine Werke könnt ihr hier auf Mein Profil Finden Klick hier im meine Werke zu sehen



    • Ronny16 schrieb:

      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.






      Angewöhnung geistiger Grundsätze ohne Gründe nennt man Glauben.

      Friedrich Nietzsche

    • kannst du mir vielleicht da beim timer helfen


      Mein Facebook Profil: Klick mich [FACEBOOK]

      Youtube Kanal: Klick mich [YOUTUBE]

      Skype: Klick mich "SKYPE"

      Windows Live: lala16@hotmail.de


      Role of German Mein Server.

      Server ip: Noch im Aufbau (0.1 Alpha)

      Forum: kommt rog-reallife.de/

      Role of German befindet sich derzeit noch in der Entwicklung es handelt sich um ein Komplett Selfmade was in Richtung Life of German geht




      #Server Trailer #1


      Video entfernt


      Xbox 360

      Steam : Ronny19



      Meine Werke könnt ihr hier auf Mein Profil Finden Klick hier im meine Werke zu sehen



    • Ronny16 schrieb:

      kannst du mir vielleicht da beim timer helfen

      Sowas gehört in die Scripting Base, sonst schreiben wir hier noch den ganzen Thread voll :D






      Angewöhnung geistiger Grundsätze ohne Gründe nennt man Glauben.

      Friedrich Nietzsche

    • obergamler schrieb:

      Bei OnPlayerSpawn muss noch

      PAWN-Quellcode

      1. new Text3D:label;

      rein und beim letzten OnPlayerShoot fehlt eine } Klammer

      :)


      Vielen Dank.
      Aber schade, dass es erst jetzt einem User aufgefallen ist.






      Angewöhnung geistiger Grundsätze ohne Gründe nennt man Glauben.

      Friedrich Nietzsche