MoH:AA Ein Lift mit Schiebetüren, die mitfahren
die auch mitfahren......
Nachdem immer wieder
die Frage nach einem
Aufzug im Forum
auftauchte, haben wir uns entschlossen, mal ein solches Gefährt in Tutorialform zusammenzubauen.......
UPDATE:::::::::::
Die Maperstellung und das script sind weitgehend unter Allied Assault und Spearhead lauffähig. Die Beispielmaps sind z.Z. für Allied Assault ausgelegt.... die Spearheadversionen folgen in Kürze
1. Die Liftkabine
Stelle zuerst dein Map-Grid auf 4 um, sonst wird alles ein wenig grob und klotzig.
Ziehe an der Stelle, wo dein Lift stehen soll einen brush in Würfelform mit 144 Einheiten Kantenlänge
Lasse ihn markiert und mache ihn hohl. Drücke dazu die HOLLOW-Taste.
Demarkiere den Würfel und markiere nun nur die Seite, wo später dein Eingang ist
Verkleinere die Seitelänge dieses brushes auf 36 Einheiten und stelle sicher, dass er an die linke Ecke des Restwürfels anstößt
Kopiere diese brush und verschiebe diese Kopie auf die rechte Seite. Wiederum exakt an die Ecke anstossend, nun allerdings rechtsseitig
Wiederhole diesen Vorgang auf der gegenüberliegenden der Kabineseite.
Markiere nun alle brushes gleichzeitig (Boden-Decke und die 6 brushes der4 Wände) und gehe jetzt in ein 2D-Fenster
Mit RMT das Entity-Auswahlmenü öffnen, gehe auf script und dannach auf object
Immer noch markiert lassen und dann das Entitymenü mit der N-Taste öffnen
Jetzt folgende Einträge vornehmen:
key: targetname
value: lift
Mit Enter bestätigen und demarkieren.
Der targetname sowie die noch folgenden werden später im map-script benötigt.
Die Flächen des Liftes nach belieben texturieren.
Jetzt haben wir schon mal die Liftkabine
Sollte dann mal etwa so aussehen

2. Die Schiebtüren
Jetzt müssen wir noch zwei Schiebetüren davor setzen. Ziehe also vor die linke Hälfte der Eingangsöffnung einen neuen brush (h=64, d=4, b=32) und platziere ich so, dass er direkt vor der Liftkabine steht, lasse ihn markiert und mache ihn ebenfalls zu einem script_object.
Mit N das entitymenü öffnen und vergebe nun die Werte:
key: targetname
value: tuer1
Verschiebe diesen nun ganz auf die linke Seite
Wiederhole den Vorgang entsprechend auf der rechten Seite und vergebe die Werte:
key: targetname
value: tuer2
Sieht dann in der 2D-Draufsicht so aus

Wiederhole diese zuvor beschriebenen Vorgänge nun auf der gegenüberliegenden Seite, deinem späterem Ausgang und vergebe dort die targetnamen „tuer3“ und „tuer4“.
Die Türen nach Bedarf texturieren
3. Die „Origins“
3.a. Das „origin“ für den Lift
War alles bisherige recht einfach, kommen nun die komplizierten Dinge. Wenn wir ein script_object von Punkt A nach Punkt B bewegen wollen, empfiehlt es sich, diese Punkte A+B in Form von script_origins zu definieren.
Grundsätzlich sollte man wissen, dass alle entitys im game einen eigenen Ursprung (origin) besitzen. Also eine Koordinate, welche ihre jeweilige Position beim spawnen angegt. Im Entitymenü wird dies z.B. so dargestellt:
key: origin
value: -1080 184 136
Dies gilt auch für Entitys vom Typ script_object, jedoch wird dieser origin-Wert nicht im Entitymenü mit key + value angezeigt.. Hier sollte man wissen, dass der origin eines script_object immer im geometrischen Mittelpunkt des Objektes selbst liegt. Deshalb setzen wir im geometrischen Mittelpunkt der Liftkabine nun einen script_origin mit folgenden Menüeinträgen:
key: targetname
value: lift_center_origin
An dieses script_origin wird später im map-script unsere Liftkabine gebunden und dient gleichzeitig aus als Ankerpunkt für die Türen und deren script_origins. Diese sollen ja mitfahren. Dazu jedoch später mehr.
3.b. Die „origins“ für die Türen
Auch für die Türen müssen wir ihre origins genau definieren, weil diese ja mitfahren sollen und dann noch von Punkt A nach B gehen sollen. Hierzu platzieren wir „wiederum im geometrischen Mittelpunkt“ einer jeden Tür je ein script_origin und tragen je Tür folgende Werte ein:
tuer1:
key: targetname
value: tuer1_origin
tuer2:
key: targetname
value: tuer2_origin
tuer3:
key: targetname
value: tuer3_origin
tuer4:
key: targetname
value: tuer4_origin
3.c. Die “Origins” für die Liftsteuerung
Das lift_center_origin stellt gleichzeitig auch den Startpunkt unseres Liftes dar. Deshalb markieren wir diesen und klonen ihn. Achtet darauf, dass er an der gleichen Stelle wie das center_origin ist, ggf. nachregulieren. Öffnet das Entitymenü und vergebt folgende Werte:
key: targetname
value: lift_unten_node
Diese “node” beschreibt im Augenblick die Startposition des Liftes und wird beim späteren herunterfahren als Zielnode verwendet. Unsere Liftkabine wird sich mit ihrem Mittelpunkt somit immer an den Mittelpunkt ihrer Zielnode orientieren. Im Map-script machen wir uns das zunutze indem wir den das script_object – hier unsere Liftkabine - zu einem senkrecht oberhalb- bzw. unterhalbliegenden Zielpunkt schicken. Dieser Zielpunkt, ebenfalls ein script_origin, erhält folgende Einträge im Entitymenü:
key: targetname
value: lift_oben_node
Positioniert diese node exakt so, dass sie 72 Einheiten oberhalb der späteren Zielebene liegt. In unserem Beispiel sagen wir mal 1024 Einheiten oberhalb der Startnode. Soll sich ja auch lohnen einen Aufzug einzubauen. Sonst könnten wir ja auch ne Treppe oder ne Leiter bauen.
Sollte dann etwa so aussehen.

4. Die “Origins” für die Türsteuerung
Mit den Schiebetüren verhält es sich genauso wie mit dem Lift selbst. Auch hier müssen die Türen – sind ja script_objecte – bewegt werden. Allerdings nun horizontal. Plaziert nun auf der Eingangsseite der Kabine 4 solcher script_origins. Jeweils eins als Tuerstartnode der linken und rechten Tür, sowie je eins an der Stelle, wo eure Tür sein wird, wenn diese geschlossen ist. Richtet diese 4 nodes bitte so aus, dass sie vertikal in der Mitte der Türen sitzen. In der 2d-Draufsicht bitte diese 4 nodes ebenfalls mittig in den Türbrushes platzieren. Es müssen alle vier nun in einer Linie sein. Klingt unverständlich ??…………..
Deshalb ein Bild zur Kontrolle

Jetzt müssen wir diesen 4 script_origins noch jeweils einen Targetnamen verpassen. Von links nach rechts sind dies:
tuer1_opennode tuer1_closenode tuer2_closenode tuer2_opennode
Verfahrt ebenso auf der gegenüberliegenden Seite der Kabine, dort wo später der Ausgang zur Höheren Ebene sein wird.
Von der jetzigen Position aus gesehen lauten dann die Targetnamen wie folgt:
tuer3_opennode tuer3_closenode tuer4_closenode tuer4_opennode
5. Die Schalter
5.1 Unten
Natürlich benötigen wir auch Schalter, um unserem Lift die Befehle „Komme Runter“ und „Komme Hoch“ von außerhalb sowie ,„Fahre hoch“ und „Fahre runter“ innerhalb des Lifts zu geben. Hierzu verwenden wir einen Drehschalter, den wir im Entityauswahlmenü suchen: RMT → animate → equipment → electric-switch-nopulse.
Diesen immer so mit den angle-Werten ausrichten, dass die Pfeilspitze des Models vom Playerstandort wegzeigt.
Wenn ihr im Radianten die Option View → Show → Models As Bounding Boxes Only deaktiviert habt, könnt ihr beim ranzoomen in den 2D-fenstern euren Schalter schön erkennen und diesen sauber platzieren. Baut also vor dem Aufzug so was wie eine Schaltkonsole oder einen Ständer und positioniert den switch.
Folgende Werte gehören ins Entitymenü:
key: targetname
value: lift_call_down
angle: 90 (für mein Beispiel, ggf. andere Werte einstellen)

Nun setzen wir noch einen Trigger_use um den switch, damit der Player später auch einen Aktion per Benutzen-Taste auslösen kann. Macht ihn nicht zu groß, ich denke das 12 x 18 Einheiten auslangen. RMT → trigger → use. Im Entitymenü tragen wir ein:
key: targetname
value: call_down_trigger
5.2 Oben
Verfahrt wie unter Unten beschrieben auf eurer Zielebene und setzt dort ebenfalls einen Schalter und einen Trigger. Folgende Werte müssen hier in den Entitymenüs gesetzt werden:
Schalter:
key: targetname
value: lift_call_up
angle: 0 (für mein Beispiel, ggf. andere Werte einstellen)
Trigger:
key: targetname
value: call_up_trigger
5.3 Lift
Auch im Lift müssen wir einen Schalter einsetzen, damit wir, wenn wir drinnen sind, den Lift starten können. Wir verwenden hier die gleichen Elemente wie zuvor beschrieben.
Folgende Werte müssen hier in den Entitymenüs gesetzt werden:
Schalter:
key: targetname
value: liftswitch
angle: 180 (für mein Beispiel, ggf. andere Werte einstellen)
Trigger:
key: targetname
value: liftswitch_trigger
Soweit vorerst zum Teil, der mit dem Radianten erledigt wird. Also mal die Map schnell als Außenterrain fertiggestellt und mal compilt………………
Wenn alles richtig gemacht wurde sollte es dann sooooooooo aussehen.

6. Beispiellevel
Hier findet ihr die Beispielmap zum Tutorial. <<< test_lift_tut >>>
Kopiert die PK3-Datei einfach ins main-Verzeichnis und startet die map via Konsole test_lift_tut.bsp im Sp-Modus oder via dm_lift_tut.bsp für den MP-Modus.
Jetzt kommt der schwierigste Teil – Das Mapscript
Das unten aufgeführte mapscript bedarf sicherlich noch einiger Kommentare und Anmerkungen. Diese werden in der nächsten Zeit folgen….
7. Das „Mapscript“
// Tutorial-map + script für die SP-Version
// Aufzug mit Schiebetueren die mitfahren und auf verschiedenen Seiten öffnen
// by cubus 12/2006 http://www.bbmd.de
main:
exec global/auto.scr
level waittill prespawn
level.script = "maps/test_lift_tut.scr"
exec global/ambient.scr obj_team2
waitthread lift_setup
level.liftpos = 0
$liftswitch.pos = 0
$call_switch anim off
thread lift_trigger_activate
level waittill spawn
end
// Hier kommen nun die einzelnen Threads
lift_setup:
$lift bind $lift_center_origin
$liftswitch_trigger bind $lift
$liftswitch bind $lift
$tuer1 glue $tuer1_origin
$tuer2 glue $tuer2_origin
$tuer3 glue $tuer3_origin
$tuer4 glue $tuer4_origin
$tuer1_opennode bind $lift_center_origin
$tuer1_closenode bind $lift_center_origin
$tuer2_opennode bind $lift_center_origin
$tuer2_closenode bind $lift_center_origin
$tuer3_opennode bind $lift_center_origin
$tuer3_closenode bind $lift_center_origin
$tuer4_opennode bind $lift_center_origin
$tuer4_closenode bind $lift_center_origin
end
door_unten_close:
iprintlnbold " door_unten schließt"
$tuer1_origin unbind
$tuer2_origin unbind
$tuer1_origin time 1
$tuer2_origin time 1
$tuer1_origin playsound subclamp_close
$tuer1_origin moveto $tuer1_closenode
$tuer2_origin playsound subclamp_close
$tuer2_origin moveto $tuer2_closenode
$tuer1_origin waitmove
$tuer1_origin bind $lift_center_origin
$tuer2_origin waitmove
$tuer2_origin bind $lift_center_origin
$tuer3_origin unbind
$tuer4_origin unbind
$tuer3_origin time 1
$tuer4_origin time 1
$tuer3_origin playsound subclamp_close
$tuer3_origin moveto $tuer3_closenode
$tuer4_origin playsound subclamp_close
$tuer4_origin moveto $tuer4_closenode
$tuer3_origin waitmove
$tuer3_origin bind $lift_center_origin
$tuer4_origin waitmove
$tuer4_origin bind $lift_center_origin
iprintlnbold " door_unten ist zu"
end
door_unten_open:
iprintlnbold " door_unten öffnet"
$tuer1_origin unbind
$tuer2_origin unbind
$tuer1_origin time 1
$tuer2_origin time 1
$tuer1_origin playsound subclamp_close
$tuer1_origin moveto $tuer1_opennode
$tuer2_origin playsound subclamp_close
$tuer2_origin moveto $tuer2_opennode
$tuer1_origin waitmove
$tuer1_origin bind $lift_center_origin
$tuer2_origin waitmove
$tuer2_origin bind $lift_center_origin
$tuer3_origin unbind
$tuer4_origin unbind
$tuer3_origin time 1
$tuer4_origin time 1
$tuer3_origin playsound subclamp_close
$tuer3_origin moveto $tuer3_opennode
$tuer4_origin playsound subclamp_close
$tuer4_origin moveto $tuer4_opennode
$tuer3_origin waitmove
$tuer3_origin bind $lift_center_origin
$tuer4_origin waitmove
$tuer4_origin bind $lift_center_origin
iprintlnbold " door_unten ist offen"
end
door_oben_open:
iprintlnbold " door_oben öffnet"
$tuer3_origin unbind
$tuer4_origin unbind
$tuer3_origin time 1
$tuer4_origin time 1
$tuer3_origin playsound subclamp_close
$tuer3_origin moveto $tuer3_opennode
$tuer4_origin playsound subclamp_close
$tuer4_origin moveto $tuer4_opennode
$tuer3_origin waitmove
$tuer3_origin bind $lift_center_origin
$tuer4_origin waitmove
$tuer4_origin bind $lift_center_origin
iprintlnbold " door_oben ist offen"
end
door_oben_close:
iprintlnbold " door_oben schließt"
$tuer3_origin unbind
$tuer4_origin unbind
$tuer3_origin time 1
$tuer4_origin time 1
$tuer3_origin playsound subclamp_close
$tuer3_origin moveto $tuer3_closenode
$tuer4_origin playsound subclamp_close
$tuer4_origin moveto $tuer4_closenode
$tuer3_origin waitmove
$tuer3_origin bind $lift_center_origin
$tuer4_origin waitmove
$tuer4_origin bind $lift_center_origin
iprintlnbold " door_oben ist zu"
end
liftswitch_up:
$liftswitch anim turn
$liftswitch anim waittill animdone
$liftswitch anim on
$liftswitch.pos = 1
$liftswitch playsound door_metal_locked_clue
wait .5
thread lift_move_up
end
liftswitch_down:
$liftswitch anim turn
$liftswitch anim waittill animdone
$liftswitch anim off
$liftswitch.pos = 0
$liftswitch playsound door_metal_locked_clue
wait .5
thread lift_move_down
end
lift_move_up:
waitthread door_unten_close
$lift playsound elevator_start
$liftswitch_trigger loopsound lighthouse_run
$lift_center_origin moveto $lift_oben_node
$lift_center_origin speed 80
$lift_center_origin waitmove
$liftswitch_trigger stoploopsound
$lift playsound elevator_stop
waitthread door_oben_open
level.liftpos = 1
$liftswitch_trigger triggerable
thread lift_standby
end
lift_move_down:
waitthread door_oben_close
$lift playsound elevator_start
$liftswitch_trigger loopsound lighthouse_run
$lift_center_origin moveto $lift_unten_node
$lift_center_origin speed 80
$lift_center_origin waitmove
$liftswitch_trigger stoploopsound
$lift playsound elevator_stop
waitthread door_unten_open
level.liftpos = 0
$liftswitch_trigger triggerable
thread lift_standby
end
lift_trigger_activate:
thread lift_standby
thread lift_call_up
thread lift_call_down
end
lift_standby:
$liftswitch_trigger waittill trigger
$liftswitch_trigger playsound door_metal_locked_clue
wait 1
if (level.liftpos == 0)
{
thread liftswitch_up
}
if (level.liftpos == 1)
{
thread liftswitch_down
}
end
lift_call_up:
$call_up_trigger waittill trigger
$call_up_trigger playsound door_metal_locked_clue
wait 1
if (level.liftpos == 0)
{
thread lift_move_up
thread call_switch_anim
}
goto lift_call_up
end
lift_call_down:
$call_down_trigger waittill trigger
$call_down_trigger playsound door_metal_locked_clue
wait 1
if (level.liftpos == 1)
{
thread lift_move_down
thread call_switch_anim
}
goto lift_call_down
end
call_switch_anim:
$call_switch anim turn
$call_switch playsound door_metal_locked_clue
$call_switch anim waittill animdone
$call_switch anim on
wait 1
$call_switch anim off
//$call_switch.pos = 1
end
call_switch_down:
$call_switch anim turn
$call_switch anim waittill animdone
$call_switch anim off
$call_switch.pos = 0
$call_switch playsound door_metal_locked_clue
end
Ich hoffe, das mappen ist hiermit ein wenig einfacher, vielleicht auch interessanter geworden.
© Das BBMD-Team / cubus 2006