die auch mitfahren......
auftauchte, haben wir uns entschlossen, mal ein solches Gefährt in Tutorialform zusammenzubauen.......
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