#1

[HoW to] LUA Boss Script

in Tutorials 25.06.2010 23:53
von ArcUser • 26 Beiträge

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:
Code:
RegisterUnitEvent(ID, 1, "Name_onCombat")
RegisterUnitEvent(ID, 2, "Name_onLeaveCombat")
RegisterUnitEvent(ID, 3, "Name_onKilledTarget")
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:
Code:
function Name_onCombat(Unit, Event)
Unit:SendChatMessage(modus, sprache, "Nachricht" )
Unit:RegisterEvent("Name_Phase1", zeit, 0)
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:
Code:
function Name_Phase1(Unit, Event)
if Unit:GetHealthPct() < 95 then
Unit:RemoveEvents()
Unit:RegisterEvent("Phase1_spell1", zeit, 0)
Unit:SendChatMessage(modus, sprache, "Nachricht")
Unit:RegisterEvent("Name_Phase2", 1000, 0)
end
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:
function Phase1_spell1(Unit, Event)
local spell1ziel = ZIEL
if (spell1ziel~=nil) then
Unit:Methode(ID, spell1ziel)
end
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:

Unit:GetMainTank()= Zauber auf Maintank
Unit:GetClosestPlayer()= Zauber auf das Ziel, das am nächsten steht
Unit:GetRandomPlayer(0)= Zauber auf Zufallsziel
Unit:GetRandomPlayer(4)= Zauber auf Zufallsziel, welches Mana hat
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:
function Name_Phase2(Unit, Event)
if Unit:GetHealthPct() < 50 then
Unit:RemoveEvents()
Unit:RegisterEvent("Phase2_spell1", zeit, 0)
Unit:SendChatMessage(modus, sprache, "Nachricht")
Unit:RegisterEvent("Name_Phase3", 1000, 0)
end
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:
function Phase2_spell1(Unit, Event)
Code:
HTML-Code:
local spell2ziel = ZIEL
if (spell2ziel~=nil) then
Unit:Methode(ID, spell2ziel)
end
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:
Code:
function Name_Phase3(Unit, Event)
if Unit:GetHealthPct() < 20 then
Unit:RemoveEvents()
Unit:RegisterEvent("Phase3_spell1", zeit, 0)
Unit:RegisterEvent("Phase3_spell2", zeit, 0)
Unit:SendChatMessage(modus, sprache, "Nachricht")
end
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:
HTML-Code:
function Phase3_spell1(Unit, Event)
local spell3ziel = ZIEL
if (spell3ziel~=nil) then
Unit:Methode(ID, spell3ziel)
end
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:
HTML-Code:
function Phase3_spell2(Unit, Event)
Unit:Methode(ID)
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:
HTML-Code:
function Name_onKilledTarget(Unit, Event)
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:
HTML-Code:
function Name_onLeaveCombat(Unit, Event)
Unit:RemoveEvents()
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:
HTML-Code:
function Name_onDied(Unit, Event)
Unit:RemoveEvents()
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:
HTML-Code:
RegisterUnitEvent(ID, 1, "Name_onCombat")
RegisterUnitEvent(ID, 2, "Name_onLeaveCombat")
RegisterUnitEvent(ID, 3, "Name_onKilledTarget")
RegisterUnitEvent(ID, 4, "Name_onDied")

function Name_onCombat(Unit, Event)
Unit:SendChatMessage(modus, sprache, "Nachricht" )
Unit:RegisterEvent("Name_Phase1", zeit, 0)
end

function Name_Phase1(Unit, Event)
if Unit:GetHealthPct() < 95 then
Unit:RemoveEvents()
Unit:RegisterEvent("Phase1_spell1", zeit, 0)
Unit:SendChatMessage(modus, sprache, "Nachricht")
Unit:RegisterEvent("Name_Phase2", 1000, 0)
end
end


function Phase1_spell1(Unit, Event)
local spell1ziel = ZIEL
if (spell1ziel~=nil) then
Unit:Methode(ID, spell1ziel)
end
end

function Name_Phase2(Unit, Event)
if Unit:GetHealthPct() < 50 then
Unit:RemoveEvents()
Unit:RegisterEvent("Phase2_spell1", zeit, 0)
Unit:SendChatMessage(modus, sprache, "Nachricht")
Unit:RegisterEvent("Name_Phase3", 1000, 0)
end
end

function Phase2_spell1(Unit, Event)
local spell2ziel = ZIEL
if (spell2ziel~=nil) then
Unit:Methode(ID, spell2ziel)
end
end

function Name_Phase3(Unit, Event)
if Unit:GetHealthPct() < 20 then
Unit:RemoveEvents()
Unit:RegisterEvent("Phase3_spell1", zeit, 0)
Unit:RegisterEvent("Phase3_spell2", zeit, 0)
Unit:SendChatMessage(modus, sprache, "Nachricht")
end
end

function Phase3_spell1(Unit, Event)
local spell3ziel = ZIEL
if (spell3ziel~=nil) then
Unit:Methode(ID, spell3ziel)
end
end

function Phase3_spell2(Unit, Event)
Unit:Methode(ID)
end


function Name_onKilledTarget(Unit, Event)
Unit:SendChatMessage(modus, sprache, "Nachricht")
end

function Name_onLeaveCombat(Unit, Event)
Unit:RemoveEvents()
end

function Name_onDied(Unit, Event)
Unit:RemoveEvents()
Unit:SendChatMessage(modus, sprache, "Nachricht")
end


---------------------------------------------------------------------------------------

Die weiter führung wird folgen.

MFG

CroWn

nach oben springen


Besucher
0 Mitglieder und 4 Gäste sind Online

Wir begrüßen unser neuestes Mitglied: Zudoran
Forum Statistiken
Das Forum hat 44 Themen und 47 Beiträge.