Community-Tutorials (Source)

Kanonen

Ein lustiges Thema für Funmaps in CS oder auch HL2DM: Beide Teams besitzen Schussvorrichtungen irgendeiner Art, z.B. Kanonen, und hauen sich Fässer oder explodierende Gegenstände damit um die Ohren. Aber wie erstellt man so etwas, eine Kanone? Dazu muss zunächst gesagt werden, dass es da nicht nur eine Möglichkeit gibt, sondern viele, je nachdem, wie die Kanone funktionieren soll. Ich erkläre in diesem Tutorial, wie man die folgende erstellt:

- Sie ist frei drehbar
- Sie hat unendliche Munition
- Die Munition ist eine Kugel, die beim Kontakt mit anderen Dingen explodiert

Dazu gibt’s noch 4 optionale „Features“:

- Sie ist „physikalisch drehbar“
- Sie verursacht eine Erschütterung
- Sie ist kaputtbar
- Sie hat eine variable Schussstärke

Klingt nicht allzu schwer, jedoch braucht man für eine realistische Kanone diesen Typs eine Menge Entities:

Zunächst zwei prop_dynamics, die das Kanonenmodel darstellen. Ich habe dazu die Folgenden gewählt, zu finden im props/de_inferno – Ordner:

themoon005.jpg

cannon_base

themoon006.jpg

cannon_gun

Die sollten ineinander passen. (einfach so verschieben, dass die Kreuze übereinander liegen).

Nun braucht ihr eine Kanonenkugel. Brusht einfach eine (Durchmesser 8), oder, falls ihr Modeln könnt, modelt sie euch (oder nehmt die hier. Ich benutze in diesem Tutorial erstmal einen Sphere-Brush, den ich zum func_physbox mache, in einen von der Map separaten Raum setze und mit einer möglichst dunklen Textur belege.

Natürlich soll man mit der Kanone nicht nur einmal schießen können, das heißt, ihr benötigt ein point_template, das ihr „kugelspawn“ nennt und in das ihr bei Template 1 den Namen eurer Kugel eintragt (bei mir im Folgenden einfach „kugel“). Aber die Kugel ist nicht alles, was verschossen werden soll. Mit ihr soll eine Explosion einhergehen, und außerdem soll sie „erkennen“, wenn sie auf einen Spieler/ein Model trifft, und dann explodieren!

Wir editieren also nochmal die Einstellungen unserer Kugel und geben bei "Explosion Damage" und "Explosion Radius" jeweils passende Werte ein. So etwas wie Schaden 70 und Radius 128 könnte passend sein, die Einstellung könnt ihr euch aber natürlich selbst überlegen.

Jetzt zum „Erkennungsmechanismus“: dieser besteht aus einem trigger_once, der „triggerkugel“ heißt und als Parent ebenfalls die Kugel selbst hat. Dieser Trigger muss als Kasten einfach um die Kugel herum gebaut werden.
Im Klartext: einen Würfel (ca 48 Kantenlänge), der genau mittig die Kugel komplett einschließt, bauen, mit Trigger-textur belegen, zu trigger_once machen, „triggerkugel“ nennen, „kugel“ als Parent eingeben, unter Flags ein Häkchen bei „Everything“ machen.
(Kleine Anmerkung: Je größer ihr den Brush macht, desto empfindlicher wird eure Kugel, explodiert also evtl. schon bevor sie irgendwo eintrifft, je kleiner er ist, desto genauer muss man zielen, was ein wenig die Action rausnimmt, weil Schüsse oft danebengehen)
Jetzt zu dem Output dieses Triggers:

OnTrigger | kugel | Break | 0.00

Wird er aktiviert, zerbricht die Kugel (und verschwindet mitsamt ihren Anhängseln), außerdem wird die eingestellte Explosion ausgelöst.
Leider würde auch die Kugel selbst diesen trigger auslösen, daher müssen wir einen Filter einbauen, der das verhindert. Dazu erstellen wir ein filter_activator_name und geben ihm den Namen "filterkugel". Wir stellen den Filter Mode auf "Disallow..." und geben bei Filter Name "kugel" ein. Auch unser Kanonenrohr könnte potenziell den trigger auslösen, die Kugel würde direkt an der Kanone explodieren. Daher geben wir dem Rohr zunächst einen Namen, hier "cannongun" .Dann müssen wir auch für dieses ein filter_activator_name erstellen, hier geben wir als namen "filtercannongun" ein, Filter Mode ist wieder "Disallow...", und Filter Name diesmal logischerweise "cannongun".
Leider kann man beim trigger_once nur einen Filternamen angeben, daher brauchen wir etwas, das die beiden filter verknüpft. Dazu erstellen wir ein filter_multi, nennen es "filtertrigger" und geben unter Filter 1 "filtercannongun" und bei Filter 2 "filterkugel" an. Negate Outcome muss auf "No" und Logic Type auf "AND" stehen, aber dies sind glaube ich auch die Standardwerte.
Jetzt noch beim trigger_once ("triggerkugel") als Filter Name "filtertrigger" eintragen, schon werden die Kugel selbst, sowie das Kanonenrohr nicht mehr von diesem erkannt.

[UPDATE]

Zusätzlich zu diesem Erkennungsmechanismus für Entities könnt ihr die Kugel auch beim Kontakt mit Worldbrushes/Displacements explodieren lassen (wenn sie von solchen abprallt und dann reglos liegen bleibt, kann das schon seltsam aussehen). Dazu ist allerdings erforderlich, dass ihr ein Model für die Kugel verwendet. In den "prop_data" Abschnitt der .qc müsst ihr dann

"damage_table" "glass"

einfügen. Das bewirkt, dass die Kugel sehr zerbrechlich wird (so wie auch die Flaschen in HL2, welche schon beim Herunterfallen zerbrechen). Außerdem müsst ihr dafür sorgen, dass die Kugel überhaupt zerstörbar ist (keine Metal/Plastic templates für die prop_data benutzen und die health manuell auf 1 stellen).

Jetzt zerbricht eure Kugel beim Kontakt mit jedem Brush/Displacement in eurer Map. Weil ihr "Explosion Damage" und "Explosion Radius" eingestellt habt, gibts dabei auch ordentlich Wumms, genau wie bei der durch den Trigger "triggerkugel" ausgelösten Explosion.

Da einige von euch wahrscheinlich keine Lust haben, sich nur hierfür ein Modelprogramm zu laden und alles mühsam selbst zu machen, habe ich euch hier mal ein fertiges Kugelmodel hochgeladen, mit dem es klappt. Das ist allerdings nur ein pfuschig decompiltes Flaschenmodel, d.h. es erscheinen Flaschengibs und Glas-Sounds beim zerbrechen (fällt aber kaum auf, da es ja ohnehin eine Explosion gibt). Wer es korrekter will, muss selbst Hand anlegen :P
[/UPDATE]

"triggerkugel" schreibt ihr in eurem point_template als Template 2 rein, denn der sollen ja auch bei jedem schuss wieder mit dabei sein.

Soweit, so gut. Jetzt muss die Kugel aber auch irgendwie zur Kanone gelangen (wir erinnern uns, sie befindet sich in einem von der Map separaten Raum). Dazu brusht ihr ein trigger_teleport um sie herum, dass ihr teleportkugel nennt, und gebt als „Remote Destination“ schon einmal provisorisch „punktkugel“ ein. Unter Flags auf jeden Fall „Physics Objects“ aktivieren.

Das o.g. „punktkugel“ ist ein info_teleport_destination, das ihr Direkt vor euren Kanonenlauf setzt. Stört euch nicht daran, dass es wie ein Spawn aussieht, eure Kugel teleportiert sich zwischen die Füße. Ihr braucht aber noch ein Menge anderer Dinge bei eurer Kanone:

- 1 trigger_push
Dieses setzt ihr ebenfalls vor den Kanonenlauf, um „punktkugel“ herum.
Name: pushkugel
Push Direction: In Richtung eures Kanonenlaufes. Wenn dieser in der Top-Ansicht nach rechts verläuft, müsst ihr lediglich den Y-Wert (den ersten) etwas negativ machen, damit die Kugel etwas hochfliegt.
Speed of Push: 1000
Flags: Clients aus, dafür Physics Objects an.

- 1 env_explosion; ebenfalls direkt vor den Lauf.
Name: explosionkanone
An Magnitude und an den Flags dürft ihr nach Gutdünken rumdoktorn, ich habe hier Damage und Smoke ausgeschaltet . „Repeatable“ muss aber unbedingt an sein!

- 1 func_rotating; möglichst klein und flach, nodraw, direkt mittig unter die Kanone. Ganz nah ranzoomen und den kleinen weißen Kreis in der Mitte nach gerade nach oben ziehen.
Name: Base

-1 ambient_generic; mittig über die Kanone
Name: soundkanone
Sound Name: irgendein Explosionssound, der euch gefällt.
Max Audible Distance: entweder so, dass man es nur bei euch hört (ist weniger chaotisch im Spiel, aber unrealistischer), oder so, dass man es überall hört (IMHO die bessere Lösung)

- 1 func_button; klein, mit tools/invisible –Textur, ans andere Ende des Laufes (also dort wo man beim Schießen besser steht ;-) )
Flags: Don’t move, Use activates an, der Rest aus.
Die restlichen Einstellungen sind standardmäßig OK. Jetzt die Outputs:

themoon008.jpg

- 2 weitere func_button; jeweils rechts und links direkt an der Kanone dran (also an der „Bedienseite“), belegt mit Pfeiltexturen, wie z.B. der aus dem de_chateau – Ordner (einfach unter „arrow“ suchen). Mit diesen Buttons soll die Kanone gedreht werden. Also:
Flags: Don’t Move, Use activates an, alles andere aus.
Delay Before Reset: 0.01
Outputs:

Für den linken:

themoon009.jpg

Für den rechten:

themoon010.jpg

So, das hätten wir. Jetzt bekommen alle Entities, die sich in der Hauptmap befinden als Parent „Base“ (das func_rotating). Ausnahme ist natürlich Base selbst und „soundkanone“, das ambient_generic.

Jetzt ist Die Map für einen ersten Test bereit. Es sollte mit dem Drehen und dem Schießen schon alles klappen. Wenn nicht, check noch mal ob alle Parents, Flags und Outputs richtig gesetzt sind, zum Vergleich kannst du die Samplemap heranziehen.

Im Folgenden erkläre ich noch einige zusätzliche „Features“, die man ebenfalls mit einbauen kann:

1. Die „physikalische“ Kanone:

Hier brauchst du kein func_rotating. Stattdessen machst du das untere Kanonenmodel, also die Base, zum prop_physics, und nennst diese einfach „Base“ (dann stimmen die Parents auch wieder). Damit die Kanone allerdings nicht ganz frei beweglich ist, brauchst du noch ein phys_hinge. Dies setzt du mittig in die Kanone hinein, zoomst wieder heran und ziehst den weißen Kreis gerade nach oben. Dann gibst du bei den Properties als „Entity 1“ „Base“ ein. Bei „Friction“ kannst du justieren, wie leicht man die Kanone drehen kann. Tipp: hoch genug einstellen, sonst kann man nicht wirklich genau zielen weil die Kanone sich immer zu weit dreht.

2. Eine Erschütterung

Sollte eigentlich dabei sein. Dazu ist ein env_shake (Name: shake) vonnöten. Man kann auch mehrere nehmen, und eines an die Kugel parenten, aber ich finde ein einzelnes völlig ausreichend, bei dem der „Effect Radius“ so hoch ist, dass man es in der ganzen Map spürt. Properties:
Amplitude: 16
Duration: 0.5
Frequency: 50
Natürlich könnt ihr auch hier wieder reinpfuschen, sind nur die Werte die ich für gut halte.
Dann muss man nur noch zweimal Outputs erweitern: Einmal die des func_button, mit dem man schießt, und einmal die von „triggerkugel“, undzwar um:

func_button:
OnPressed shake StartShake 0.20
trigger_once (triggerkugel):
OnTrigger shake StartShake 0.00

3. Die Zerstörbare Kanone

Gebt zuerst eurem Button, mit dem man schießt, einem Namen (hier: buttonkanone). Dann braucht ihr ein func_breakable. Setzt es einfach unter die Kanone, damit niemand dran hängen bleibt oder so. Aber macht es möglichst flach, sonst könnte es sich mit der Kanone verhaken, wenn ihr Feature 1 benutzt ^^ .
Setzt die Strength wie ihr sie wollt, aber macht sie nicht zu klein, sonst ist der Spaß schnell vorbei. Außerdem solltet ihr bei Material Type z.B. auf Rocks stellen.
Dann noch den Output:

OnBreak buttonkanone Kill 0.00

Am besten ist es, ihr setzt noch einige env_fire auf das Model (Parent : „Base“ nicht vergessen), die ihr z.B. „feuerkanone“ nennt. StartDisabled auf „Yes“ stellen.
Dann beim func_breakable diesen Output setzen:

OnBreak feuerkanone StartFire 0.00

Und eure Kanone fängt an zu brennen, wenn sie kaputt ist.

4. Variable Schussstärken

Hier setzt ihr statt einem trigger_push gleich drei oder so viele ihr wollt (alle an der gleichen, oben genannten Stelle, einfach durchnummerieren). Bis auf die Tatsache, dass nur einer von ihnen „Start Disabled“ auf No gestellt haben sollte und „Speed of Push“ sich natürlich unterscheiden sollte, sollten alle identische Einstellungen haben. Dann braucht ihr noch etwas, wo man diese ingame aktiviert/deaktiviert. Dazu könnt ihr z.B. 3 weitere func_button nehmen. Diese bekommen dann folgende Outputs:

1. Button (aktiviert pushkugel)

OnPressed pushkugel Enable 0.00
OnPressed pushkugel1 Disable 0.00
OnPressed pushkugel2 Disable 0.00

2. Button (aktiviert pushkugel1)

OnPressed pushkugel Disable 0.00
OnPressed pushkugel1 Enable 0.00
OnPressed pushkugel2 Disable 0.00

3.Button (aktiviert pushkugel2)

OnPressed pushkugel Disable 0.00
OnPressed pushkugel1 Disable 0.00
OnPressed pushkugel2 Enable 0.00

Das war’s! Das Tutorial habe ich komplett selbst erdacht/entwickelt/geschrieben, mal abgesehen von Azraels nettem Hinweis auf die Filter!

Btw: so könnte das im Hammer aussehen:

Die Kanone selbst:

themoon011.jpg

Der separate Raum:

themoon012.jpg

Falls ihr einen Fehler entdeckt, oder es bei euch nicht klappt wie es soll, oder etwas zu undeutlich erklärt ist, einfach sagen/fragen; ich bin (leider ;) ) auch nur ein Mensch und kann Fehler meinerseits nicht ausschließen, gerade bei so einem etwas längeren Tut vergisst man doch gerne Mal ein kleines, aber wichtiges Detail weil man viele Dinge für selbstverständlich hält… ansonsten hf damit und ByeBye

TheMoon

Samplemap
|
|
v