How To LUA

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

    • Tut Für Lua Boss
      Bin mir nicht sicher wohin dann habe ich es mal dahin gemacht wenn es falsch ist kann man ja es verschieben.


      Ich werde euch hier zeigen, wie man in wenigen Schritten einen Boss mit 3 Phasen und 4 spells schreibt!
      Unter den ScriptBoxen werde ich jeweils erklären, was die einzelnen neuen Zeilen bewirken!

      Also fangen wir mal an:


      SCHRITT 1: Was brauche ich?
      Man Braucht für LUA Scripte im prinzip nicht mehr als ein Textprogramm. Für windows nutzer reicht schon der Editor aus!
      Ich empfehle allerdings, programme wie Weaverslave und Notepad++ zu nutzen, beide findet man ganz einfach über google!

      SCHRITT 2: Wie beginne ich?
      Erstellt euch einfach eine neue Textdatei, diese sollte komplett leer sein

      SCHRITT 3: Wie gebe ich an, welcher NPC Das Script hat?

      Damit auf eurem Server nicht Irgendwelche wölfe mit CastScripten von Illidan rumlaufen ist es sinnvoll, Zuerst mal festzulegen, wem euer Cast Script denn gehört!

      Das ganze geht ganz einfach so:
      Code:

      Quellcode

      1. RegisterUnitEvent(ID, 1, "Name_onCombat")
      2. RegisterUnitEvent(ID, 2, "Name_onLeaveCombat")
      3. RegisterUnitEvent(ID, 3, "Name_onKilledTarget")
      4. RegisterUnitEvent(ID, 4, "Name_onDied")
      Das ganze gehört erstmal in eure Textdatei rein!

      Nun müsst ihr noch folgendes verändern:
      für ID fügt ihr immer die ID eures Bosses ein, der casten soll!
      für Name fügt ihr einfach den Namen des Bosses ein! (Ohne leerzeichen!)

      Dies Sorgt nun dafür, dass euer folgendes Castscript dem NPC mit der ID zugewiesen wird!

      SCHRITT 4: Beginnen des Kampfes!

      Und schon geht's los!
      Der wilde kampf mit eurem Boss geht (zumindest in euren gedanken) hier los! Wir basteln das mal ganz einfach: Wenn euer Boss in eien Kampf gerät, soll er erstmal nur etwas schreien, sobald er dann unter 95% HP gerät, beginnt der eigentliche Kampf!

      Code:


      Quellcode

      1. function Name_onCombat(Unit, Event)
      2. Unit:SendChatMessage(modus, sprache, "Nachricht" )
      3. Unit:RegisterEvent("Name_Phase1", zeit, 0)
      4. end
      Für Modus setzt ihr eine Zahl ein. Sie gibt an, wie die Chatnachricht ausgegeben wird. 12 = sagen , 14 = schreien!

      Für sprachesetzt ihr ebenfalls eine Zahl ein, diese sollte aber 0 sein!
      0 Bedeutet dass die nachricht für jeden zu lesen ist, andere Zahlen bedueten andere Sprachen!

      für Nachricht tragt ihr einfach die Nachricht ein, die der Boss verkünden soll!

      mit Unit:RegisterEvent(...) wird festgelegt, dass der NPC nun ein gewisses Event in einer bestimmten zeit immer wieder wiederholt!

      "Name_Phase1" gibt an, welches Event denn wiederholt werden soll!

      Zeit gibt die Zeit in millisekunden an (1000 = 1 sek) , die zwischen dem 1. mal abspielen von Name_Phase1 und dem 2. mal abspielen liegt. Über die 0 lässt sich begrenzen, wie oft das ganze maximal passiert, 1= max. 1x ; 5 = max. 5x , 0 = Unendlich mal. Hier wird das Event aber im Prinzip nur ein überprüfen der % HP des Bosses sein, daher solltet ihr für zeit einfach 1000 schreiben!

      Schritt 5: Was Passiert in Phase 1?
      Nun sollten wir angeben, was genau der Boss in der Phase1 machen soll!
      Das geht so:
      Code:

      Quellcode

      1. function Name_Phase1(Unit, Event)
      2. if Unit:GetHealthPct() < 95 then
      3. Unit:RemoveEvents()
      4. Unit:RegisterEvent("Phase1_spell1", zeit, 0)
      5. Unit:SendChatMessage(modus, sprache, "Nachricht")
      6. Unit:RegisterEvent("Name_Phase2", 1000, 0)
      7. end
      8. end
      if Unit:GetHealthPct < 95 :
      Hier wird überprüft, ob der Boss unter 95% hp ist! Wenn das zutrifft passiert:

      Unit:RemoveEvents() ; Heißt: Alles was vorher passiert ist passiert nun nichtmehr, auch die vorher angegeben events (Unit:RegisterEvent("Name_Phase1",zeit, 0) ) werden nun nichtmehr abgespielt!

      Unit:RegisterEvent("Phase1_spell1", zeit, 0) heißt: Nun kommt der boss zu seinen Spells! zeit und 0 haben die selbe bedeutung wie oben!
      Jetzt wird also in regelmäßigen abständen das Event "Phase1_spell1" abgespielt!

      Unit:RegisterEvent("Name_Phase2", 1000, 0) lässt den boss nun erneut alle 1000 millisekunden überprüfen, ob Phase1 überwunden ist und man so zu Phase2 übergehen kann!

      Außerdem schickt der boss ebenso wie oben eine neue Nachricht ab!

      das 1. end bedeutet: ende , heißt: wenn der Boss unter 95% leben gerät, passiert alles was bis hierhin eingegeben wurde.

      das 2. end bedeutet: falls der Boss NICHT unter 95% leben gerät, passiert alles was zwischen dem 1. und dem 2. end steht, also hier garnichts

      Schritt 6: Was passiert beim 1. Spell?

      Ebenso wie bei Phase1, müssen wir nun festlegen, was denn beim event "Phase1_spell1" passiert!
      Code:

      HTML Code:

      Quellcode

      1. function Phase1_spell1(Unit, Event)
      2. local spell1ziel = ZIEL
      3. if (spell1ziel~=nil) then
      4. Unit:Methode(ID, spell1ziel)
      5. end
      6. end
      über local spell1ziel = ZIEL
      wird zuerst mal festgelegt, Wen denn der Zauber trifft.
      ZIEL müsst ihr hierzu ersetzen, die wichtigsten möglichkeiten zähle ich euch heir mal auf:

      Quellcode

      1. Unit:GetMainTank()= Zauber auf Maintank
      2. Unit:GetClosestPlayer()= Zauber auf das Ziel, das am nächsten steht
      3. Unit:GetRandomPlayer(0)= Zauber auf Zufallsziel
      4. Unit:GetRandomPlayer(4)= Zauber auf Zufallsziel, welches Mana hat
      5. Unit:GetRandomPlayer(7)= Zauber auf Zufallsziel, aber nicht auf den Maintank
      if (spell1ziel~=nil) then Ist eine einfache if- Abfrage, die existieren muss, damit das script zu 100% auf jeder Ascent emu läuft!

      Unit:Methode(ID, spell1ziel) Ist nun der tatsächliche spell!

      Methode ist hierbei die Art, wie der Zauber gewirkt werden soll!
      Ersetzt es durch:

      FullCastSpellOnTarget= Zauber voll auf das Ziel wirken
      CastSpellOnTarget= Zauberzeit wird nicht berücksichtigt, der Zauber wird sofort auf das Ziel gewirkt! (Klappt nicht bei allen Spells!)

      fürID müsst ihr einfach nur die ID eures Zaubers einfügen!

      spell1ziel gibt hier nun an, dass der Zauber auch auf das vorher festgelegte ziel (welches wir in der variable spell1ziel abgespeichert haben) gewirkt wird!

      die beiden 'end' haben die selbe bedeutung wie oben!

      Schritt 7: Die Phase 2!

      In eurer Vorstellung habt ihr Phase1 nun überwunden! Jetzt kommt die Phase 2 dran! Im prinzip passiert hier das selbe wie in Phase1, lediglich mit einem anderen Spell und einer anderen nachricht! Außerdem wird nun überprüft, ob die spieler bereit für Phase3 sind, nicht mehr wie oben für Phase2 !
      Code:

      HTML Code:

      Quellcode

      1. function Name_Phase2(Unit, Event)
      2. if Unit:GetHealthPct() < 50 then
      3. Unit:RemoveEvents()
      4. Unit:RegisterEvent("Phase2_spell1", zeit, 0)
      5. Unit:SendChatMessage(modus, sprache, "Nachricht")
      6. Unit:RegisterEvent("Name_Phase3", 1000, 0)
      7. end
      8. end
      Die Textzeilen haben die selbe bedeutung wie oben, aber nun haben wir ein neues Event, nämlich: Phase2_spell1 , welches wir definieren müssen!

      Schritt 8: Der 2. Spell eures Bosses!

      Da euer boss wegen des Unit:RemoveEvents() den spell aus phase1 nicht mehr beherrscht, sollten wir ihm nun einen neuen beibringen!
      Auch hier läuft es ähnlich ab wie bei Spell1, nur müssen wir diesmal die variable umbenennen!
      Code:
      Code:

      Quellcode

      1. function Phase2_spell1(Unit, Event)
      Code:
      HTML Code:

      Quellcode

      1. local spell2ziel = ZIEL
      2. if (spell2ziel~=nil) then
      3. Unit:Methode(ID, spell2ziel)
      4. end
      5. end
      Beachtet hier, dass wir oben genau 3x "spell1ziel" hatten, solltet ihr Kopieren und Einfügen um schreibarbeit zu sparen, müsst ihr auch aus allen 3x "spell1ziel" ein "spell2ziel" machen, sonst bekommt ihr eine fehlermeldung!!

      Schritt 9: Die 3. und letzte Phase des Kampfes!
      In dieser letzten Phase soll euer Boss es in sich haben! Deswegen Bekommt er in dieser Phase nicht nur eine, sondern gleich 2 Fähigkeiten verpasst!
      Das läuft auch wieder über
      Unit:RegisterEvent(...) , nur dass er diesmal 2 events bekommt!
      Außerdem müssen wir nun keinen erneuten Check durchführen, wieviel %HP euer boss hat, da die Phase3 hier die letzte sein wird!
      Code:

      Quellcode

      1. function Name_Phase3(Unit, Event)
      2. if Unit:GetHealthPct() < 20 then
      3. Unit:RemoveEvents()
      4. Unit:RegisterEvent("Phase3_spell1", zeit, 0)
      5. Unit:RegisterEvent("Phase3_spell2", zeit, 0)
      6. Unit:SendChatMessage(modus, sprache, "Nachricht")
      7. end
      8. end
      Nun Hat euer boss 2 Fähigkeiten zur verfügung, die wir ihm festlegen müssen!
      Phase3_spell1 wird ebenso ablaufen wie bereits Phase1spell1 und Phase2spell1 , das solltet ihr mittlerweile selbst beherrschen!
      Code:
      HTML Code:


      Quellcode

      1. function Phase3_spell1(Unit, Event)
      2. local spell3ziel = ZIEL
      3. if (spell3ziel~=nil) then
      4. Unit:Methode(ID, spell3ziel)
      5. end
      6. end
      Schritt 10: Ein AoE Spell, BZW ein Stärkungszauber für den Boss!

      Phase3spell2 wird etwas besonderes!

      Hier soll der boss sich nun nicht einen einzelnen spieler rauspicken und ihm schaden zufügen, sondern Hier kann er sich
      a) Selbst Verstärken (Berserker Buff etc.)
      b) Einen AOE Spell (mit flächenschaden) wirken!

      aber wie legen wir das fest? - Ganz einfach!
      Code:
      HTML Code:

      Quellcode

      1. function Phase3_spell2(Unit, Event)
      2. Unit:Methode(ID)
      3. end
      Methode wird hier in beiden fällen durch: CastSpell ersetzt!
      für ID gebt ihr wieder die ID eures spells ein!

      Das Praktische: Je Nach spell wirkt der Boss entweder einen Stärkungszauber auf sich selbst, oder Macht eine Attacke mit flächenschaden!! Für euch zum scripten macht das keinerlei unterschied!

      Hier entfällt das 2. end, weil keine if abfrage eingebaut ist!

      Schritt 11: Was, wenn der Boss einen Spieler tötet, stirbt oder die Gruppe Scheitert?
      Natürlich werden die Leute die euren Boss Killen nicht immer Erfolg haben! Daher müssenw ir nun festlegen, was passiert wenn:

      Der Boss ein ziel tötet:


      Code:
      HTML Code:

      Quellcode

      1. function Name_onKilledTarget(Unit, Event)
      2. end
      Im Prinzip muss nichts passieren, nach belieben könnt ihr hier aber wie oben auch, eine Chatnachricht einfügen!

      Der Boss aus dem Kampf gerät:
      Code:
      HTML Code:

      Quellcode

      1. function Name_onLeaveCombat(Unit, Event)
      2. Unit:RemoveEvents()
      3. end
      Damit euer Boss wieder auf seinen Normalen stand zurückkommt, nachdem der Kampf endet sollte hier ein
      Unit:RemoveEvents() stehen! So geht alles von vorne los, wenn er wieder angegriffen wird!

      Der Boss stirbt:


      Code:
      HTML Code:

      Quellcode

      1. function Name_onDied(Unit, Event)
      2. Unit:RemoveEvents()
      3. end
      Auch hier ist das Unit:RemoveEvents pflicht, wenn ihr wollt könnt ihr aber auch hier wieder eine Chatnachricht einbauen!!

      Damit ist euer Boss Script nun fertig!

      Ihr habt es geschafft! Euer erstes Boss Script ist nun Fertig!
      Speichert das ganze nun als .lua Datei ab und legt es in den "scripts" ordner eurer Emu!

      Zur Kontrolle Hier nochmal das ganze script:



      Code:
      HTML Code:

      Quellcode

      1. RegisterUnitEvent(ID, 1, "Name_onCombat")
      2. RegisterUnitEvent(ID, 2, "Name_onLeaveCombat")
      3. RegisterUnitEvent(ID, 3, "Name_onKilledTarget")
      4. RegisterUnitEvent(ID, 4, "Name_onDied")
      5. function Name_onCombat(Unit, Event)
      6. Unit:SendChatMessage(modus, sprache, "Nachricht" )
      7. Unit:RegisterEvent("Name_Phase1", zeit, 0)
      8. end
      9. function Name_Phase1(Unit, Event)
      10. if Unit:GetHealthPct() < 95 then
      11. Unit:RemoveEvents()
      12. Unit:RegisterEvent("Phase1_spell1", zeit, 0)
      13. Unit:SendChatMessage(modus, sprache, "Nachricht")
      14. Unit:RegisterEvent("Name_Phase2", 1000, 0)
      15. end
      16. end
      17. function Phase1_spell1(Unit, Event)
      18. local spell1ziel = ZIEL
      19. if (spell1ziel~=nil) then
      20. Unit:Methode(ID, spell1ziel)
      21. end
      22. end
      23. function Name_Phase2(Unit, Event)
      24. if Unit:GetHealthPct() < 50 then
      25. Unit:RemoveEvents()
      26. Unit:RegisterEvent("Phase2_spell1", zeit, 0)
      27. Unit:SendChatMessage(modus, sprache, "Nachricht")
      28. Unit:RegisterEvent("Name_Phase3", 1000, 0)
      29. end
      30. end
      31. function Phase2_spell1(Unit, Event)
      32. local spell2ziel = ZIEL
      33. if (spell2ziel~=nil) then
      34. Unit:Methode(ID, spell2ziel)
      35. end
      36. end
      37. function Name_Phase3(Unit, Event)
      38. if Unit:GetHealthPct() < 20 then
      39. Unit:RemoveEvents()
      40. Unit:RegisterEvent("Phase3_spell1", zeit, 0)
      41. Unit:RegisterEvent("Phase3_spell2", zeit, 0)
      42. Unit:SendChatMessage(modus, sprache, "Nachricht")
      43. end
      44. end
      45. function Phase3_spell1(Unit, Event)
      46. local spell3ziel = ZIEL
      47. if (spell3ziel~=nil) then
      48. Unit:Methode(ID, spell3ziel)
      49. end
      50. end
      51. function Phase3_spell2(Unit, Event)
      52. Unit:Methode(ID)
      53. end
      54. function Name_onKilledTarget(Unit, Event)
      55. Unit:SendChatMessage(modus, sprache, "Nachricht")
      56. end
      57. function Name_onLeaveCombat(Unit, Event)
      58. Unit:RemoveEvents()
      59. end
      60. function Name_onDied(Unit, Event)
      61. Unit:RemoveEvents()
      62. Unit:SendChatMessage(modus, sprache, "Nachricht")
      63. end
      Alles anzeigen
      Natürlich habt ihr bei eurem script nichtmehr
      Modus ,Sprache oder ähnliches stehen, weil ihr das alles wie bereits oben angegeben ersetzt habt!!

      Ihr könnt eurem Boss natürlich nach belieben mehr Phasen und Spells einbauen, wie das funktioniert solltet ihr nach dem Tutorial so einigermaßen verstanden haben! Ich hab das Tutorial halt relativ kurz gehalten, is ja für einsteiger!
      Ihr solltet außerdem darauf achten, dass eure Nachrichten nicht zu lang sind, da sie sonst von einigen Emu's einfach ignoriert werden !
    • Werbung zur Unterstützung des Forums ( Bitte AddBlocker deaktivieren )

    • Fehlermeldung

      Fehlermeldung

      Bei mir wird dann beim verarbeiten in der arcemu-world.exe angezeigt:

      Quellcode

      1. [ARCEMU]Server: Initializing LUA script engine...
      2. [ARCEMU]LuaEngine: Scanning Directory (scripts)
      3. [string "scripts\99000.lua"]:1: Reference creation failed!
      4. (testboss_onCombat) is not a valid Lua function.
      5. [ARCEMU]LuaEngine: Successfully loaded [0/1] scripts.