yoda
Böser Admin
Dabei seit: 21.01.2004
Beiträge: 12.269

|
|
[Tutorial] JumpPad erstellen * |
 |
Ursprüngliche Vorlage von Marshall2006 auf MODSonline.com
Danke an Vernichter für´s Testen!
Überarbeitet und erweitert von OLD MAN WITH GUN - nun kann man mehr als nur ein JumpPad in die Map einbauen.
Danke an OLD MAN WITH GUN für die Mühe!
***
Lust ein wenig rumzuhüpfen?
Multiple Jump Pads im Quake III-Style

Erstelle als erstes mal Deine Landezone:

Erstelle nun einen Auslöser (= trigger): einfach einen Brush erstellen, während er markiert ist in der 2D-Ansicht die rechte Maustaste drücken und auswählen:
-> trigger -> multiple
Öffne anschließend das Entity-Fenster mit der Taste "N" - vergib anschließend folgende Werte:
Key: targetname
Value: jump

***
Origins (quasi "Übergänge" oder "Verbindungen")
Nun müssen noch die "Origins" gesetzt werden:
Klicke in der 2D-Ansicht mit der rechten Maustaste und wähle
-> script -> origin
Platziere es an der Stelle, von der Du abspringen möchtest:

Stelle sicher, daß es 4 Units über dem Untergrund liegt (hat mit dem Effekt zu tun).
Wähle nun zuerst den trigger_multiple an und dann das script_origin (Wichtig: Reihenfolge beachten, nicht anders herum!).
Drücke anschließend die Taste "W". Der trigger_multiple wird dadurch mit dem script_origin verbunden
(gekennzeichnet durch eine rote Linie mit einem Pfeil, der in Richtung script_origin zeigt).
Kopiere nun das script_origin und füge es 4x wieder ein.
Platziere sie z. B. so:

Wähle nun das erste script_origin an (den du eben mit dem trigger verbunden hast) und das erste script_origin in der Luft
(Wichtig: wieder Reihenfolge beachten) und drücke anschließend die Taste "W".
Damit ist jetzt der script_origin auf dem Boden mit dem ersten script_origin in der Luft verbunden (wieder durch rote Linie gekennzeichnet).
Das Gleiche machst du jetzt mit dem zuletzt verbundenen script_origin und dem nächsten in der Luft befindlichen script_origin (usw., bis alle script_origins wie auf dem vorherigen Bild miteinander verbunden sind.
Die script_origins stellen den Flugweg während des Sprunges dar.
Je mehr man hinzufügt, desto "weicher" wird der Flug.
Anmerkung:
Beachte die Höhendifferenz zwischen dem JumpPad und der Landezone!
***
Der Script:
Erstelle im Ordner /raw/maps/mp eine neue Textdatei und nenne diese dann in jump_pad.gsc um.
Füge in diese jump_pad.gsc dann folgenden Script ein:
jumper()
{
level._effect[ "beacon_glow" ] = loadfx( "misc/ui_pickup_available" );
jumpx = getentarray ("jump","targetname");
for(i = 0; i < jumpx.size; i++)
jumpx[i] thread jump_pad_think();
}
jump_pad_think()
{
glow = getent (self.target, "targetname");
air1 = getent (glow.target, "targetname");
air2 = getent (air1.target, "targetname");
air3 = getent (air2.target, "targetname");
air4 = getent (air3.target, "targetname");
maps\mp\_fx::loopfx("beacon_glow", (glow.origin), 3, (glow.origin) + (0, 0, 90));
while (1)
{
self waittill ("trigger",user);
if (user istouching(self))
{
//throw = user.origin + (100, 100, 0);
air = spawn ("script_model",(0,0,0));
air.origin = user.origin;
air.angles = user.angles;
user linkto (air);
air moveto (air1.origin, 1);
wait 1;
air moveto (air2.origin, 1);
wait .5;
air moveto (air3.origin, 1);
wait .5;
air moveto (air4.origin, 1);
wait 1;
user unlink();
wait 1;
}
}
}
Anschließend muss folgende Zeile noch in die eigene map.gsc eingefügt werden:
(unterhalb der Zeile maps\mp\_load::main();)
thread maps\mp\jump_pad::jumper();
Zu guter letzt muss dann noch folgende Zeile in der Zone-Datei eingetragen werden:
rawfile,maps/mp/jump_pad.gsc
***
Die Fluggeschwindigkeit anpassen:
= Die Geschwindigkeit mit der man zur Landezone befördert wird für jedes Origin.
Schau Dir folgende Zeile an:
air moveto (air1.origin, 1);
Um nun die Geschwindigkeit zu ändern einfach folgende Zahl anpassen:
air moveto (air1.origin, 1);
Spiele einfach ein wenig mit der Geschwindigkeit herum, könnte dann z. B. so aussehen:
air moveto (air1.origin, 2);
Oder so:
air moveto (air1.origin, .5);
Vielleicht aus so:
air moveto (air1.origin, .1);
Einfach ein wenig ausprobieren und testen.
***
Die "Zeit in der Luft" anpassen
= Eine Pause in der man kurz wartet bis es zum nächsten Origin weitergeht.
Wirf einen Blick in die jump_pad.gsc und zwar auf folgende Zeilen:
air moveto (air1.origin, 1);
wait 1;
air moveto (air2.origin, 1);
wait .5;
air moveto (air3.origin, 1);
wait .5;
air moveto (air4.origin, 1);
Nach jeder Bewegung, z. B. bei "air moveto (air1.origin, 1);"...
... gibt es eine kurze Wartezeit.
Wenn Du genau hinschaust siehst Du, dass die letzten beiden Übergänge von der Geschwindigkeit her ein wenig erhöht wurden, um es ein wenig "realistischer" zu gestalten... Spiel einfach selbst ein bisschen mit der Geschwindigkeit herum.
Anmerkung:
Wenn Du die Wartezeit zu kurz setzt, kannst Du einen Übergang komplett herausnehmen und musst mit einer Störung des JumpPads rechnen. Also stelle lieber sicher, dass Du dem Spieler genug Zeit für die Bewegung lässt...
... um zum nächsten Origin zu gelangen, aber trotzdem die Zeit gering hälst, damit kein "in der Luft hängen" entsteht.
Dies hängt von der jeweiligen Entfernung der origins ab.
Wie im folgenden z. B.:
air moveto (air1.origin, 1);
wait 1;
Das könntest Du ändern in:
air moveto (air1.origin, 1);
wait .3;
Auf diese Weise gäbe es einen kürzeren "Time Out" in der Luft.
****
Benötigt man mehr als ein JumpPad, so muss man in der Map lediglich den trigger_multiple zusammen mit den dazugehörigen script_origins kopieren und an einer anderen Stelle in der Map wieder einfügen.
***
Direkt verlinken:
https://www.opferlamm-clan.de/wbb2/thread.php?threadid=10868
***
|
|
|
|
|
BadMan
Turnbeutelvergesser
 
Dabei seit: 31.01.2008
Beiträge: 278

|
|
Das Script vom JumpPad kann man noch für ganz andere Sachen verwenden, quasi für alles, bei dem der Spieler bewegt werden muss oder soll.
JumpPad-Testpaket -> da kannst Du alles laden, fertige Maps und für den Radianten *.map, Sound, Script, usw.
Die Zahlen auf der Map bedeuten z.B.:
"0" heißt (thread jumper0(); // Jumppad)
"1" heißt (thread jumper1(); // Rohr, schneller Kriechen, Eingang 1), usw.
***
Jumper 1 und 2:
Dieses Script kann man verwenden, wenn man Bewegungen hat, die gegenüberliegend sind, also Jump1 zieht den Spieler durch Jump2. Da gibt es das Problem, dass man, wenn man von Jump1 kommend über Jump2 gezogen wird, hängen bleibt, sobald man auf den Trigger von Jump2 kommt. Das heißt, das Script muss geändert werden.
jumper1(){
pad1 = getent ("jump1","targetname");
pad2 = getent ("jump2","targetname");
glow2 = getent ("glow2","targetname");
air21 = getent ("air21","targetname");
air22 = getent ("air22","targetname");
air23 = getent ("air23","targetname");
air24 = getent ("air24","targetname");
level._effect[ "beacon_glow" ] = loadfx( "misc/ui_pickup_available" );
maps\mp\_fx::loopfx("beacon_glow", (glow2.origin), 3, (glow2.origin) + (0, 0, 90));
while (1){
pad2 waittill ("trigger",user);
if (user istouching(pad2)){
//throw = user.origin + (100, 100, 0);
air = spawn ("script_model",(0,0,0));
air.origin = user.origin;
air.angles = user.angles;
user linkto (air);
time = 1;
air moveto (air21.origin, 1);
wait .5;
air moveto (air22.origin, 1);
wait .5;
air moveto (air23.origin, 1);
wait .5;
air moveto (air24.origin, 1);
pad1 TriggerOff();
//air moveto (throw, time, 0.5,0.5);
//air moveto (throw, time, 0.5,0.5);
wait 1;
user unlink();
pad1 TriggerOn();
wait 1;
}
}
}
Hinzugefügt sind die Zeilen 43
pad1 TriggerOff();
und Zeile 51
pad1 TriggerOn();
Um allerdings die Trigger zu deaktivieren mit Tigger ON/OFF muss noch ganz nach oben über main(){ die Zeile
#include maps\mp\_utility;
Diese Zeile ist für die Befehle Trigger ON/OFF - außerdem muss zusätzlich vom gegenüberliegenden Trigger der Zielname (= targetname) angegeben werden -> Zeile 3 und 4
Jumper 3:
Jumper 3 ist einfach ein Weg mit Krümmung im Rohr, wobei man bei stärkeren Biegungen aufpassen muss, dass der Spieler nicht aus dem Rohr guckt.
Jumper 4 und 5:
Bei Jumper 4 und 5 ist der trigger_ multiple mit einem trigger_use ersetzt, so dass man ihn mit der BENUTZEN-Taste aktivieren kann. Trigger ON/OFF wird nicht benutzt, da der Trigger ja nicht durch Berührung aktiviert wird.
Jumper 6:
Ist eine einfache Bewegung nach vorne.
Jumper 0:
Das normale Jumppad.
***
Anmerkung:
Wenn ein Trigger aktiviert wird, zieht der einen egal, was im Weg ist (außer ein Trigger mit neuen Befehlen) an den Bestimmungsort - also muss man z.B. beim Rohr darauf achten, dass der Trigger im Rohr liegt durch das man kriechen muss um ihn zu berühren - ansonsten kann es passieren, dass man stehend durchgezogen wird wie bei der 1.
Wenn man den Glow-Effekt nicht haben will, kann man die zwei Zeilen einfach auskommentieren:
//level._effect[ "beacon_glow" ] = loadfx( "misc/ui_pickup_available" );
//maps\mp\_fx::loopfx("beacon_glow", (glow.origin), 3, (glow.origin) + (0, 0, 90));
***
So, das war es erst mal - es gibt wahrscheinlich noch zig andere Sachen, bei denen man das Script verwenden kann, das hier sind nur ein paar Beispiele.
---
Edit by yoda: Danke schön!
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von yoda: 19.04.2008 14:59.
|
|
|
|
|
|
|
Infothread zu BadMans und Nightwings JumpPad-Experimenten:
Schneller Kriechen bei Trigger
__________________ "Mögest du in interessanten Zeiten leben"
Rincewind, Zaubberer
|
|
|
|
|
serthy
Codemeister
  
Dabei seit: 29.07.2010
Beiträge: 628

|
|
Hilfe bei Cod4 Script (Jump Pads)
Code angehängt. Klicke hier zum Ein-/Ausblenden
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
|
main()
{
setupJumppads();
if( isDefined( level.jumppads ) && level.jumppads.size )
{
for( i = 0 ; i < level.jumppads.size ; i++ )
{
pad = level.jumppads[i];
if( !isDefined( pad ) )
continue;
spawnJumppad( pad.origin , pad.angles , pad.height , pad.radius , pad.dirPos , pad.model , pad.power , pad.sound );
}
}
jumppads = getEntArray( "jumppad" , "targetname" );
if( isDefined( jumppads ) && jumppads.size )
{
for( i = 0 ; i < jumppads.size ; i++ )
{
pad = jumppads[i];
if( !isDefined( pad ) )
continue;
pad thread monitorUsage();
}
}
}
setupJumppads() //3 als beispiel
{
precacheModel( "xmodel/serthy_buildzone" ); //falls model erwünscht, unbeding precachen! sonst crasht der server
level.jumppads = []; // ganz wichtig! muss zuerst stehen!
level.jumppads[level.jumppads.size] = spawnStruct(); //muss immer zuerst stehen bei jedem neuen jumppad
level.jumppads[level.jumppads.size - 1].origin = ( -1993 , 2939 , 100 ); //wo?
level.jumppads[level.jumppads.size - 1].angles = ( 0 , 0 , 0 ); //winkel?
level.jumppads[level.jumppads.size - 1].height = 32; //trigger höhe
level.jumppads[level.jumppads.size - 1].radius = 64; //trigger radius
level.jumppads[level.jumppads.size - 1].dirPos = ( -2001 , 292 , 132 ); //richtung, sollte im bereich von +/- 50 neben dem origin sich befinden: origin + ( 50 , -30 , 32 )
level.jumppads[level.jumppads.size - 1].model = "xmodel/serthy_buildzone"; //damit man es erkennt? muss precached werden!!!
level.jumppads[level.jumppads.size - 1].power = 2; //wie stark das jumppad ist
level.jumppads[level.jumppads.size - 1].sound = "minefield_click"; //sound welcher abgespielt wird
level.jumppads[level.jumppads.size] = spawnStruct(); //minimale anforderungen
level.jumppads[level.jumppads.size - 1].origin = ( 2342 , 123 , 73 ); //minimale anforderungen
level.jumppads[level.jumppads.size] = spawnStruct(); //minimale anforderungen
level.jumppads[level.jumppads.size - 1].origin = ( 3434 , 32 , -17 ); //minimale anforderungen
}
spawnJumppad( origin , angles , height , radius , dirPos , model , power , sound )
{
if( !isDefined( radius ) ) radius = 64;
if( !isDefined( height ) ) height = 32;
if( !isDefined( angles ) ) angles = ( 0 , 0 , 0 );
jumppad = spawn( "trigger_radius" , origin , 0 , radius , height );
jumppad.angles = angles;
jumppad.targetname = "jumppad";
jumppad.jumpSound = sound;
jumppad.power = power;
if( isDefined( model ) )
{
jumppad.vis = spawn( "script_model" , origin );
jumppad.vis setmodel( model );
}
if( isDefined( dirPos ) )
jumppad.dir = vectorNormalize( dirPos - origin );
}
monitorUsage()
{
if( isDefined( self.target ) )
{
target = getEnt( self.target , "targetname" );
if( isDefined( target ) )
{
self.dir = vectorNormalize( self.target.origin - self.origin );
self.target delete();
}
}
if( isDefined( self.script_noteworthy ) )
{
tokens = strTok( self.script_noteworthy , "," );
self.power = tokens[0];
self.jumpSound = tokens[1];
}
while( isDefined( self ) )
{
wait( 0.05 );
self waittill( "trigger" , player );
if( !isDefined( player.isOnJumppad ) )
self bouncePlayer( player , self.power , self.dir );
}
}
bouncePlayer( player , power , dir )
{
player endon( "disconnect" );
player.isOnJumppad = undefined;
if( isDefined( self.jumpSound ) && self.jumpSound != "" )
self playSound( self.jumpSound );
if( !isDefined( dir ) )
dir = ( 0 , 0 , 1 );
if( !isDefined( power ) )
power = 1;
player iPrintLnBold( "Yippieeeh!" );
while( isDefined( self ) && isDefined( player ) )
{
if( player.sessionstate != "playing" )
break;
else if( !player isTouching( self ) )
break;
power = int( player.maxhealth * power );
health = player.health;
player.health += power;
player finishPlayerDamage( self , self , power , 0 , "MOD_PROJECTILE" , "none" , self.origin , dir , "none" , 0 );
player.health = health;
wait( 0.05 );
}
player.isOnJumppad = undefined;
} |
|
entweder jumppads per hand einfügen wie im beispiel (setupJumppads()-funktion) oder im radiant:
trigger erstellen
K/V: targetname/jumppad
K/V: script_noteworthy/<power>,<sound>
script_origin erstellen
trigger auswählen, script_origin auswählen >>> W
sieht dann so aus:
>>>Klick mich<<<
wobei der teddy nur da ist um zu sehen in welche richtung man springt
|
|
|
|
|
|
|
 |
Impressum ||Datenschutzerklärung
|