Dummy Tutorial

[contentad]


Dummy Tutorial

zum Anfang

Vorwort

In diesem Tutorial möchte ich euch erklären was Dummys sind,
wozu sie gebraucht werden und was man dabei so alles beachten muss.
Viele denken jetzt vielleicht: ´Das kenn ich doch schon alles.´,
dennoch glaube ich, dass der Erklärungsbedarf zu Dummys groß ist.

Nebenbei: Das Tutorial benutzt zwar unter anderem einen Spell als Beispiel,
wird aber nicht erklären wie man im GUI Spells schreibt.
Ebenso sind Memory Leaks entfernt, diese werden hier trotzdem nicht behandelt!

zum Anfang

Einleitung

Ein Dummy ist im ersten Moment genau das, wonach es kling.
Dummys spielen nämlich das Double für Einheiten, wie es die Crashtest-Dummys in den Autotests sind. Sie geraten dabei eher weniger ins Rampenlicht als die
Auto-Pendants, denn Dummys in Wc3 sind im Normalfall unsichtbar.

Wozu benötigen wir unsere unsichtbaren Freunde?
Dummys haben zwei verschiedene Anwendungsgebiete:
(Es gibt sicher noch mehr, das sind die Gängigsten)
Zauber wirken oder Portrait für Geschosse stehen.

zum Anfang

Zauber

Fangen wir mit Zaubern an, dem Haupteinsatz im GUI (auch in Jass).
Nehmen wir mal an, dass wir einen Zauber erstellen wollen, der alle Einheiten in einem Zielgebiete in Schafe verwandelt (ein Spell nach dem doch relativ häufig gefragt wird).
Es gibt keinen Zauber in Wc3 der dies auch nur im Geringsten bewerkstelligen könnte.
Zwar verwandelt Hex wenn man es will eine Einheit in ein Schaf, aber eben nur eine.
In diesem Moment kommen Trigger zum Einsatz.

 MassHex

 Events

 Unit – A unit Starts the effect of an ability

 Conditions

 (Ability being cast) Equal to Mass Hex

 Actions

 Set tempPoint = (Position of (Triggering unit))

 Set tempGroup = (Units within 500.00 of tempPoint matching ((((Matching unit) belongs to an enemy of (Owner of (Triggering unit))) Equal to True) and (((Matching unit) is alive) Equal to True)))

 Unit Group – Pick every unit in tempGroup and do (Actions)

 Loop – Actions

 Unit – Order (Triggering unit) to Orc Shadow Hunter – Hex (Picked unit)

 Custom script: call DestroyGroup(udg_tempGroup)

 Custom script: call RemoveLocation(udg_tempPoint)

Hier wird unserem Helden befohlen, alle Einheiten in Schafe zu verwandeln :D
Jedoch funktioniert das so nicht.
Jede Einheit braucht eine gewisse Zeit um Zauber zu wirken und da Trigger auf einen Schlag abgearbeitet werden, bekommt der Held je nach Fall eine ganze Menge Zauberbefehle auf einmal. Außerdem hat der Held den Spell Hex garnicht und wir müssten es ihm hinzufügen.
An diesem Punkt kommen Dummys zum Einsatz.
Dummys sind in diesem Fall unsichtbare Einheiten, die unsere (gegnerischen) Einheiten in Schafe verwandeln. Wir brauchen also einen Dummy bei dem einiges Berücksichtigt wird:

  • Wir sollten Dummys nicht sehen, zufällig auftauchende Zauberer sehen doof aus
  • Dummys sollten die erwähnte Zauberverzögerung nicht haben
  • Unsere Dummys sollten auch in der Lage sein, Hex zu zaubern!

Um überhaupt Zaubern zu können brauchen wir also Hex ohne Manakosten, oder ein Hex und einen Dummy mit Mana. Es bietet sich immer an, Dummy-Zauber einfach kostenlos zu machen. Danach muss unser Dummy noch ´sofort´ zaubern können, sprich ohne Verzögerung. Unten ist ein Bild der Werte, die dafür benötigt werden.

Diese Werte sollten alle auf 0 Sekunden stehen, wobei der Backswing-
Wert für den normalen Gebrauch unwichtig ist,
erst wenn man Dummys recycelt wird es wichtig, ist in GUI aber irrelevant.
Jetzt muss unser Dummy nur noch unsichtbar sein. Dafür gibt es zwei gute Möglichkeiten.
Das Model „dummy.mdx“ von Vexorian benutzen (ist nicht von ihm gemacht,
gehört aber zu seinem System XE), das unsichtbar ist, 36kb hat und einige
Animationen für den Fall, der im späteren Verlauf genauer erklärt wird.
Für einen reinen Zauberer brauchen wir das Model nicht, wir löschen einfach sein Model:

(man kann auch .mdx eintippen, dies wird automatisch in .mdl umgeändert.)
Beides sind nicht existente Models und werden im Editor als Kasten dargestellt.
Im Spiel ist dieser Kasten allerdings nicht zu sehen.
Somit haben wir unseren unsichtbaren, sofort zaubernden Dummy mit Hex.
Jetzt gehen wir zu unserem Trigger zurück.

Anstatt den Originalcaster den Zauber wirken zu lassen, benutzen wir jetzt unseren Dummy.

 MassHex2

 Events

 Unit – A unit Starts the effect of an ability

 Conditions

 (Ability being cast) Equal to Mass Hex

 Actions

 Set tempPoint = (Position of (Triggering unit))

 Set tempGroup = (Units within 500.00 of tempPoint matching ((((Matching unit) belongs to an enemy of (Owner of (Triggering unit))) Equal to True) and (((Matching unit) is alive) Equal to True)))

 Unit Group – Pick every unit in tempGroup and do (Actions)

 Loop – Actions

 Set tempPointEnemy = (Position of (Picked unit))

 Unit – Create 1 Dummy for (Owner of (Triggering unit)) at tempPointEnemy facing tempPointEnemy

 Unit – Add DummyHex to (Last created unit)

 Unit – Order (Last created unit) to Orc Shadow Hunter – Hex (Picked unit)

 Unit – Add a 2.00 second Generic expiration timer to (Last created unit)

 Custom script: call RemoveLocation(udg_tempPointEnemy)

 Custom script: call DestroyGroup(udg_tempGroup)

 Custom script: call RemoveLocation(udg_tempPoint)

Wie ihr seht, hab ich gleich einige Befehlen da hin geklatscht,
obwohl wir nur einen kleinen Dummy haben wollten.
Die erste Zeile erlaubt uns, den Dummy genau auf die Position des Gegners
zu setzen. Somit muss der Dummy-Zauber keine unendliche Reichweite haben,
im Falle eines Geschoss-Dummy-Spells entfällt auch die Beachtung des
Geschosstempos.
Die zweite Zeile in der Pick-Schleife erzeugt unseren Dummy für den Besitzer
des Casters (was nicht dringend notwendig ist, je nach Einsatz).
Danach müssen wir dem Dummy unsere Dummy-Fähigkeit Hex hinzufügen,
damit er überhaupt zaubern kann. Man könnte dem Dummy auch die Fähigkeit
im Objekt-Editor hinzufügen, dann braucht man aber einen Dummy pro Zauber,
dieser Dummy soll universell genutzt werden und hat damit keine Fähigkeiten.
Dann kommt der gewohnte Zauberbefehl.
Die Zeile danach ist ein ´Expiration Timer´.
Ein Expiration Timer tötet die Einheit nach X Sekunden, in diesem Fall nach zwei.
Dann entfernen wir noch unser Leak und unser AoE-Hex ist fertig.

Wenn wir unseren Zauber jetzt testen, funktioniert er. Allerdings gibt es im
wirklichen Anwendungsgebiet einer Map noch einige Probleme:
Was wenn die Dummys sterben?
Was wenn man ´ALT´ drückt um HP-Balken zu sehen (oder dies automatisch an hat)?
Dummys sollen eh nie beeinflusst werden, wie kann ich sie aus Pick-Schleifen ausschließen?

All diese Dinge kann man mit ein paar Fähigkeiten umgehen:

Invulnerable entspricht ´Unverwundbarkeit´ im deutschen Editor.
Locust ist DIE Dummyfähigkeit schlechthin, beziehungsweise die Fähigkeit, die
eigentlich alle Dummys haben sollten.
Locust (´Heuschrecke´ im Deutschen) verhindert das Angreifen, Auswählen und ´Picken´ der Einheit,
sprich sämtliche Pick-Schleifen treffen Locust-Einheiten nicht, außer ´All units of Type´.
Locust verhindert allerdings keine Standard-Warcraft-AoE-Effekte
wie Flammenschlag, dafür ist die Unverwundbarkeit da.
Es gibt auch andere Möglichkeiten um Dummys sinnvoll zu schützen, so ist die Anklickbarkeit von der Model-Hitbox abhängig, diese ist in Vexorians Dummy-Model entfernt. (Zumindest kommt Vex mit ´Ghost/Geist´ aus :) )

Das sind die Eigenschaften die jeder Dummy braucht um Nutzbar zu sein, jedoch gibt es noch ein paar Dinge die man ändern sollte:

  • Schatten entfernen (sowohl die Textur, als auch Breite und Länge)
  • Angriffe sollten entfernt sein (falls der Dummy sich mal selbstständig macht),
    das geht unter ´Combat- Attacks enabled

  • 05.02.2010 um 00:36
Soccer im Interview Dummy Tutorial

Dummy Tutorial


Dummy Tutorial

zum Anfang

Vorwort

In diesem Tutorial möchte ich euch erklären was Dummys sind,
wozu sie gebraucht werden und was man dabei so alles beachten muss.
Viele denken jetzt vielleicht: „Das kenn ich doch schon alles.“,
dennoch glaube ich, dass der Erklärungsbedarf zu Dummys groß ist.

Nebenbei: Das Tutorial benutzt zwar unter anderem einen Spell als Beispiel,
wird aber nicht erklären wie man im GUI Spells schreibt.
Ebenso sind Memory Leaks entfernt, diese werden hier trotzdem nicht behandelt!

zum Anfang

Einleitung

Ein Dummy ist im ersten Moment genau das, wonach es kling.
Dummys spielen nämlich das Double für Einheiten, wie es die Crashtest-Dummys in den Autotests sind. Sie geraten dabei eher weniger ins Rampenlicht als die
Auto-Pendants, denn Dummys in Wc3 sind im Normalfall unsichtbar.

Wozu benötigen wir unsere unsichtbaren Freunde?
Dummys haben zwei verschiedene Anwendungsgebiete:
(Es gibt sicher noch mehr, das sind die Gängigsten)
Zauber wirken oder Portrait für Geschosse stehen.

zum Anfang

Zauber

Fangen wir mit Zaubern an, dem Haupteinsatz im GUI (auch in Jass).
Nehmen wir mal an, dass wir einen Zauber erstellen wollen, der alle Einheiten in einem Zielgebiete in Schafe verwandelt (ein Spell nach dem doch relativ häufig gefragt wird).
Es gibt keinen Zauber in Wc3 der dies auch nur im Geringsten bewerkstelligen könnte.
Zwar verwandelt Hex wenn man es will eine Einheit in ein Schaf, aber eben nur eine.
In diesem Moment kommen Trigger zum Einsatz.

 MassHex

 Events

 Unit – A unit Starts the effect of an ability

 Conditions

 (Ability being cast) Equal to Mass Hex

 Actions

 Set tempPoint = (Position of (Triggering unit))

 Set tempGroup = (Units within 500.00 of tempPoint matching ((((Matching unit) belongs to an enemy of (Owner of (Triggering unit))) Equal to True) and (((Matching unit) is alive) Equal to True)))

 Unit Group – Pick every unit in tempGroup and do (Actions)

 Loop – Actions

 Unit – Order (Triggering unit) to Orc Shadow Hunter – Hex (Picked unit)

 Custom script: call DestroyGroup(udg_tempGroup)

 Custom script: call RemoveLocation(udg_tempPoint)

Hier wird unserem Helden befohlen, alle Einheiten in Schafe zu verwandeln :D
Jedoch funktioniert das so nicht.
Jede Einheit braucht eine gewisse Zeit um Zauber zu wirken und da Trigger auf einen Schlag abgearbeitet werden, bekommt der Held je nach Fall eine ganze Menge Zauberbefehle auf einmal. Außerdem hat der Held den Spell Hex garnicht und wir müssten es ihm hinzufügen.
An diesem Punkt kommen Dummys zum Einsatz.
Dummys sind in diesem Fall unsichtbare Einheiten, die unsere (gegnerischen) Einheiten in Schafe verwandeln. Wir brauchen also einen Dummy bei dem einiges Berücksichtigt wird:

  • Wir sollten Dummys nicht sehen, zufällig auftauchende Zauberer sehen doof aus
  • Dummys sollten die erwähnte Zauberverzögerung nicht haben
  • Unsere Dummys sollten auch in der Lage sein, Hex zu zaubern!

Um überhaupt Zaubern zu können brauchen wir also Hex ohne Manakosten, oder ein Hex und einen Dummy mit Mana. Es bietet sich immer an, Dummy-Zauber einfach kostenlos zu machen. Danach muss unser Dummy noch „sofort“ zaubern können, sprich ohne Verzögerung. Unten ist ein Bild der Werte, die dafür benötigt werden.

Diese Werte sollten alle auf 0 Sekunden stehen, wobei der Backswing-
Wert für den normalen Gebrauch unwichtig ist,
erst wenn man Dummys recycelt wird es wichtig, ist in GUI aber irrelevant.
Jetzt muss unser Dummy nur noch unsichtbar sein. Dafür gibt es zwei gute Möglichkeiten.
Das Model „dummy.mdx“ von Vexorian benutzen (ist nicht von ihm gemacht,
gehört aber zu seinem System XE), das unsichtbar ist, 36kb hat und einige
Animationen für den Fall, der im späteren Verlauf genauer erklärt wird.
Für einen reinen Zauberer brauchen wir das Model nicht, wir löschen einfach sein Model:

(man kann auch .mdx eintippen, dies wird automatisch in .mdl umgeändert.)
Beides sind nicht existente Models und werden im Editor als Kasten dargestellt.
Im Spiel ist dieser Kasten allerdings nicht zu sehen.
Somit haben wir unseren unsichtbaren, sofort zaubernden Dummy mit Hex.
Jetzt gehen wir zu unserem Trigger zurück.

Anstatt den Originalcaster den Zauber wirken zu lassen, benutzen wir jetzt unseren Dummy.

 MassHex2

 Events

 Unit – A unit Starts the effect of an ability

 Conditions

 (Ability being cast) Equal to Mass Hex

 Actions

 Set tempPoint = (Position of (Triggering unit))

 Set tempGroup = (Units within 500.00 of tempPoint matching ((((Matching unit) belongs to an enemy of (Owner of (Triggering unit))) Equal to True) and (((Matching unit) is alive) Equal to True)))

 Unit Group – Pick every unit in tempGroup and do (Actions)

 Loop – Actions

 Set tempPointEnemy = (Position of (Picked unit))

 Unit – Create 1 Dummy for (Owner of (Triggering unit)) at tempPointEnemy facing tempPointEnemy

 Unit – Add DummyHex to (Last created unit)

 Unit – Order (Last created unit) to Orc Shadow Hunter – Hex (Picked unit)

 Unit – Add a 2.00 second Generic expiration timer to (Last created unit)

 Custom script: call RemoveLocation(udg_tempPointEnemy)

 Custom script: call DestroyGroup(udg_tempGroup)

 Custom script: call RemoveLocation(udg_tempPoint)

Wie ihr seht, hab ich gleich einige Befehlen da hin geklatscht,
obwohl wir nur einen kleinen Dummy haben wollten.
Die erste Zeile erlaubt uns, den Dummy genau auf die Position des Gegners
zu setzen. Somit muss der Dummy-Zauber keine unendliche Reichweite haben,
im Falle eines Geschoss-Dummy-Spells entfällt auch die Beachtung des
Geschosstempos.
Die zweite Zeile in der Pick-Schleife erzeugt unseren Dummy für den Besitzer
des Casters (was nicht dringend notwendig ist, je nach Einsatz).
Danach müssen wir dem Dummy unsere Dummy-Fähigkeit Hex hinzufügen,
damit er überhaupt zaubern kann. Man könnte dem Dummy auch die Fähigkeit
im Objekt-Editor hinzufügen, dann braucht man aber einen Dummy pro Zauber,
dieser Dummy soll universell genutzt werden und hat damit keine Fähigkeiten.
Dann kommt der gewohnte Zauberbefehl.
Die Zeile danach ist ein „Expiration Timer“.
Ein Expiration Timer tötet die Einheit nach X Sekunden, in diesem Fall nach zwei.
Dann entfernen wir noch unser Leak und unser AoE-Hex ist fertig.

Wenn wir unseren Zauber jetzt testen, funktioniert er. Allerdings gibt es im
wirklichen Anwendungsgebiet einer Map noch einige Probleme:
Was wenn die Dummys sterben?
Was wenn man „ALT“ drückt um HP-Balken zu sehen (oder dies automatisch an hat)?
Dummys sollen eh nie beeinflusst werden, wie kann ich sie aus Pick-Schleifen ausschließen?

All diese Dinge kann man mit ein paar Fähigkeiten umgehen:

Invulnerable entspricht „Unverwundbarkeit“ im deutschen Editor.
Locust ist DIE Dummyfähigkeit schlechthin, beziehungsweise die Fähigkeit, die
eigentlich alle Dummys haben sollten.
Locust („Heuschrecke“ im Deutschen) verhindert das Angreifen, Auswählen und „Picken“ der Einheit,
sprich sämtliche Pick-Schleifen treffen Locust-Einheiten nicht, außer „All units of Type“.
Locust verhindert allerdings keine Standard-Warcraft-AoE-Effekte
wie Flammenschlag, dafür ist die Unverwundbarkeit da.
Es gibt auch andere Möglichkeiten um Dummys sinnvoll zu schützen, so ist die Anklickbarkeit von der Model-Hitbox abhängig, diese ist in Vexorians Dummy-Model entfernt. (Zumindest kommt Vex mit „Ghost/Geist“ aus :) )

Das sind die Eigenschaften die jeder Dummy braucht um Nutzbar zu sein, jedoch gibt es noch ein paar Dinge die man ändern sollte:

  • Schatten entfernen (sowohl die Textur, als auch Breite und Länge)
  • Angriffe sollten entfernt sein (falls der Dummy sich mal selbstständig macht),
    das geht unter „Combat- Attacks enabled???
  • Dummys sollten keine Kollision haben, zu finden unter Pathing/Verlauf
  • Sie sollten keine Nahrungskosten haben
  • Man sollte sie auf der Minimap nicht sehen (Stats/Werte)
  • Sichtradius sollte auf 1 sein, man will doch keinen Maphack mit ihnen ;)

zum Anfang

Geschosse

Jetzt zum zweiten Part der Dummys: Projektile/Geschosse (Eher für Jass brauchbar).
Sicher kennt jeder den Fall, dass man einen Shockwave-artigen Zauber basteln möchte,
der noch einige Zusatzeffekte hat, wie Stun, Slow, usw…

Es gibt für dieses Problem viele Ansätze, der simpelste wäre wohl der xecollider/xefx von Vexorian, aber wir wollen ja verstehen was da passiert und wie wir es selber machen ;)

In diesem Fall wird ebenfalls ein Dummy genutzt.
Dieser Dummy wird dann, periodisch, immer wieder ein kleines Stück nach vorne
„teleportiert“. Ab einer Bildrate von etwa 25 FPS wirkt diese Bewegung flüssig und
man kann keinen Unterschied zur normalen Shockwave erkennen:

 Missle

 Events

 Unit – A unit Starts the effect of an ability

 Conditions

 (Ability being cast) Equal to Shockwave

 Actions

 Set tempPoint = (Position of (Triggering unit))

 Unit – Create 1 ShockwaveDummy for (Owner of (Triggering unit)) at tempPoint facing Default building facing degrees

 Set ShockwaveMissle = (Last created unit)

 Set tempPointEnemy = (Target point of ability being cast)

 Set ShockwaveAngle = (Angle from tempPoint to tempPointTarget)

 Set ShockwaveDistance = 0.00

 Trigger – Turn on MissleMove <gen>

 Custom script: call RemoveLocation(udg_tempPoint)

 Custom script: call RemoveLocation(udg_tempPointTarget)

 MissleMove

 Events

 Time – Every 0.04 seconds of game time

 Conditions

 Actions

 Set tempPoint = (Position of ShockwaveMissle)

 Set tempPointTarget = (tempPoint offset by 20.00 towards ShockwaveAngle degrees)

 Unit – Move ShockwaveMissle instantly to tempPointTarget

 Set ShockwaveDistance = (ShockwaveAngle + 20.00)

 If (All Conditions are True) then do (Then Actions) else do (Else Actions)

 If – Conditions

 ShockwaveAngle Greater than or equal to 1000.00

 Then – Actions

 Unit – Kill ShockwaveMissle

 Trigger – Turn off (This trigger)

 Else – Actions

 Custom script: call RemoveLocation(udg_tempPoint)

 Custom script: call RemoveLocation(udg_tempPointTarget)

Bevor sich irgendjemand beschwert: Nein das Beispiel ist weder MUI noch MPI,
wie gesagt, ich bin kein Spell-Tutorial :P

Hier wird unser Dummy alle 0.04 Sekunden 20 Wc3-Einheiten weiter bewegt, macht bei 25 Ausführungen die Sekunde eine Geschwindigkeit von 500, über 1000 Range, also 2 Sekunden. Danach wird das Geschoss zerstört und der Trigger abgeschaltet.

In diesem GUI-Beispiel hat das Geschoss bereits das gewünschte Model, was jedoch bedeutet, dass wir für jeden Zauber einen neuen Dummy erstellen müssen.
Ätzend? Man kann das ganze relativ leicht umgehen, auch im GUI.
Wir nutzen einfach Vexorians Model als Dummy und benutzen einen Spezial Effekt um unserem unsichtbaren Dummy den Effekt hinzuzufügen.
Vexorians Model hat den Vorteil, Attachment-Punkte zu besitzen, an die man die Effekte heften kann. Außerdem enthält es Animationen, um den Dummy sofort (!) zu drehen, die Befehle in Jass oder GUI, die die Blickrichtung einer Einheit verändern sind verzögert.

 Missle

 Events

 Unit – A unit Starts the effect of an ability

 Conditions

 (Ability being cast) Equal to Shockwave

 Actions

 Set tempPoint = (Position of (Triggering unit))

 Unit – Create 1 ShockwaveDummy for (Owner of (Triggering unit)) at tempPoint facing Default building facing degrees

 Set ShockwaveMissle = (Last created unit)

 Special Effect – Create a special effect attached to the chest of ShockwaveMissle using Abilities\Spells\Orc\Shockwave\ShockwaveMissile.mdl

 Set ShockwaveSFX = (Last created special effect)

 Set tempPointEnemy = (Target point of ability being cast)

 Set ShockwaveAngle = (Angle from tempPoint to tempPointTarget)

 Set ShockwaveDistance = 0.00

 Trigger – Turn on MissleMove <gen>

 Custom script: call RemoveLocation(udg_tempPoint)

 Custom script: call RemoveLocation(udg_tempPointTarget)

 MissleMove

 Events

 Time – Every 0.04 seconds of game time

 Conditions

 Actions

 Set tempPoint = (Position of ShockwaveMissle)

 Set tempPointTarget = (tempPoint offset by 20.00 towards ShockwaveAngle degrees)

 Unit – Move ShockwaveMissle instantly to tempPointTarget

 Set ShockwaveDistance = (ShockwaveAngle + 20.00)

 If (All Conditions are True) then do (Then Actions) else do (Else Actions)

 If – Conditions

 ShockwaveAngle Greater than or equal to 1000.00

 Then – Actions

 Unit – Kill ShockwaveMissle

 Special Effect – Destroy ShockwaveSFX

 Trigger – Turn off (This trigger)

 Else – Actions

 Custom script: call RemoveLocation(udg_tempPoint)

 Custom script: call RemoveLocation(udg_tempPointTarget)

zum Anfang

Schlusswort

Wenn ihr mehr Details braucht, wie ihr Geschosse bewegen könnt, sucht am besten nach „Knockback-Systemen“, die genau das was ich euch gezeigt habe mit normalen Einheiten veranstalten.

Ich hoffe, dass dieses Dummy-Grundlagen Tutorial euch geholfen hat, Dummys etwas besser zu verstehen oder gar zu nutzen.
Wendet euch, wenn ihr Fragen habt, ruhig an mich.

MfG Justify

zum Anfang

  • 04.02.2010 um 23:36
Dummy Tutorial Audiocomments von cZ-lueMmeL