MoHAA Tutorials
MoH:AA Ein Lift mit Schiebetüren, die mitfahren
20.12.2006 - 01:15

Stelle zuerst dein Map-Rastermass auf 4 um, sonst wird alles ein wenig grob und klotzig

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

 



cubus


gedruckt am 28.03.2024 - 18:49
https://www.bb-mapping-designs.de/community/include.php?path=content&contentid=176