[Tutorial] Aufzug fahren macht Spass *

yoda
Vorlage von nuthowz auf www.zeroy.com</a>

Danke an OLD MAN WITH GUN für die Ergänzungen!
Danke an Verni@hter für´s Testen!

Wir basteln einen Aufzug...!

Baue Deinen Aufzug und wandle ihn in ein script_brushmodel um
Markiere den Aufzug, drücke die Taste "N" um das Entity-Fenster zu öffnen und weise diese Werte zu:
Key = targetname
Value = elevator

Nun musst Du die Auslöser (=Trigger) erstellen.
Erstelle sie als
-> trigger -> use_touch
und erstelle zwei Stück davon, einen für den Start und einen für das Ziel.

Weise den Triggern jeweils diese Werte im Entity-Fenster (markieren und dann Taste "N") zu:
Key = targetname
Value = switch

Verknüpfe sie nun mit Deinem Brushmodel, in dem Du das Model und die Trigger markierst und die Taste "W" drückst. Das war´s erst mal auf der Map-Seite.

Anmerkung OLD MAN WITH GUN:
Eigentlich unnötig - jedenfalls, was das Script dazu weiter unten sagt, da dort die Entities direkt per Namen angesprochen werden und nicht über target.



Jetzt brauchst Du noch das Script, mit dem sich der Aufzug bewegen lässt.

main()
{
level.elevatorDown = true;
level.elevatorMoving = false;
thread elevator_start();
}

elevator_start()
{
elevator = getentarray ("switch","targetname");
if ( isdefined(elevator) )
for (i = 0; i < elevator.size; i++)
elevator[i] thread elevator_think();
}

elevator_think()
{
while (1)
{
self waittill ("trigger");
if (!level.elevatorMoving)
thread elevator_move();
}
}

elevator_move()
{
elevatormodel = getent ("elevator", "targetname");
level.elevatorMoving = true;
speed = 10;
height =581;

if (level.elevatorDown) {

elevatormodel playsound ("elevator");

elevatormodel movez (height, speed);
elevatormodel waittill ("movedone");
level.elevatorDown = false;

}

else
{

elevatormodel playsound ("elevator");

elevatormodel movez (height - (height * 2), speed);
elevatormodel waittill ("movedone");
level.elevatorDown = true;
}
level.elevatorMoving = false;


-> Wohin genau damit?

Antwort OLD MAN WITH GUN:

Da gibt es zwei Möglichkeiten:
Direkt in der mp_map.gsc Datei oder als eigenständige gsc-Datei.

Möglichkeit 1:
(-> in der mp_map.gsc)

main()
{
maps\mp\_load::main();
// hier folgen noch andere mapspezifische Einstellungen
thread elevator();
}

elevator() //hier stand im script main, darf es in einem Script aber nur einmal geben und deshalb umbenannt.
{
evel.elevatorDown = true;
level.elevatorMoving = false;
// und der ganze Rest
}


Möglichkeit 2:
(-> als eigenständige gsc-Datei)

Im Ordner /raw/maps/mp eine neue Textdatei erzeugen und das Script dann dort hinein kopieren. Die Textdatei nennt man dan z.B. elevator.gsc
Dann muss in der mp_map.gsc noch eine Zeile hinzugefügt werden:

main()
{
maps\mp\_load::main();
// hier folgen noch andere mapspeziefische Einstellungen
thread maps\mp\elevator::main();
}


Bei der Methode 2 muss man dann noch folgenden Eintrag im Zone File hinzufügen:

rawfile,maps/mp/elevator.gsc

---

Und hier ein vorbereiteter Aufzug in einer .map-Datei + den Inhalt für die .gsc-Datei in einer Textdatei, bereitgestellt von steinacker. Danke schön für die Mühe!
Download Beispiel-Aufzug @ Dr. Long

---

Direkt verlinken:
https://www.opferlamm-clan.de/wbb2/thread.php?threadid=10481

---
games12345
hi ich hab es versucht das mit dem aufzug aber es klappt nicht.
könnt ihr vieleicht ein prefab mit dem aufzug und dies gsc datei senden.
danke
steinacker
also bei funzt das, hab mal was testweise erstellt und schick dir das in nem zip-file
du musst natürlich die variable height deiner aufzughöhe anpassen, sonst schießt dein aufzug darüber hinaus, oder kommt nicht an
yoda
Könntest Du das evtl. per rapidshare oder so hier zum DL bereit stellen? Dann schieb ich das auf den Download-Server und füge das mit in die Anleitung ein, wäre bestimmt auch für andere hilfreich Augenzwinkern
steinacker
sorry, aber ich hab keene ahnung was rapidshare sein soll verwirrt wenn du willst, kann ich dir das auch per email schicken
Verni@hter
Hier einfach hochladen. Klick mich
steinacker
ok iss drauf
aufzug

den programm-code hab ich in ne txt-datei geschrieben und so "gestaltet", dass der in die mp_map.gsc rein muss
yoda
Ok, hab´s geuppt:
Download @ Dr. Long

Danke schön!!!

Werd´s im Laufe des Tages auch noch in die Anleitung einfügen.
games12345
nochma ne frage und zwar ich möchte zu den aufzug sound dazuhaben aber ers klappt nicht könnt ihr mir vieleicht nochmal helfen oder noch einen download inklusieve sound erstellen
danke
steinacker
damit hab ich mich auch schon beschäftigt
dazu brauchst du ersma ne sound datei am besten als .wav
da ich die nich hab, hab ich in dem elevator script das mit dem sound auskommentiert, weil sonst immer ne fehlermeldung kommt
script: in der funktion elevator_move()

Code einblendenCode 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:
	if (level.elevatorDown)
	{
//		elevatormodel playsound ("elevator");

		elevatormodel movez (height, speed);
		elevatormodel waittill ("movedone");
		level.elevatorDown = false;
	}
	else
	{
//		elevatormodel playsound ("elevator");

		elevatormodel movez (height - (height * 2), speed);
		elevatormodel waittill ("movedone");
		level.elevatorDown = true;
	}
	level.elevatorMoving = false;



die "//" bedeuten kommentar, somit wird das nicht vom game "gelesen"
um den sound zu aktivieren machst du die "//" am anfang weg vor elevatormodel

damit du da dann keine fehlermeldung im game bekommst brauchst du noch ne soundalias datei, die du mp_deineMap.csv nennst (mit editor erstellen)
darin platzierst du dann folgende zeile:

Code einblendenCode angehängt. Klicke hier zum Ein-/Ausblenden

code:
1:
2:
3:
4:
5:
6:
name,sequence,file,vol_min,vol_max,vol_mod,pitch_min,pitch_max,dist_min,dist_max,channel,type,probability,loop,masterslave,loadspec,subtitle,compression,secondaryaliasname,volumefalloffcurve,startdelay,speakermap,reverb,lfe percentage,center percentage,platform,envelop_min,envelop_max,envelop percentage


elevator,,misc/elevator.wav,,1,na,0.95,1.05,100,200,,,,,,all_mp,,,,,,,,,,,50,100,0.55



diese csv-datei speicherst du in:
raw/soundaliases
und deine elevator.wav datei (das ist deine sound datei) die kommt in:
raw/sound/misc

kannst dir hierzu auch mal die schon bestehenden soundalias dateien anschauen und vielleicht gibts in irgendeiner map vom cod2 oder uo, die einen aufzug hat eine entsprechende sound-datei dafür

eine erläuterung der einzelnen teile der soundalias-datei (name,sequence,file,usw.) findest du auch in den schon bestehenden dateien
file ist z.b. die angabe deiner sound.wav (mit pfad)
z.b. eigene_sounds/aufzug/elevator.wav
steinacker
ok ich habs getestet, was ich hier gepoustet hab, aber irgendwie funzt des net.
ich bekomm trotzdem ne fehermeldung, dass der sound nicht gefunden wird

vielleicht kann man da ja mal einen extra fred aufmachen, wie das mit den soundalias dateien ist

eines kann ich jedoch sagen, bei dem eintrag:
,all_mp,
kann (muss nicht) dein mapname stehen, ansonsten leer lassen ,,

ein elevator sound hab ich in:
Return to Castle Wolfenstein gefunden, falls das game einer (noch) hat
in:
main/pak0.pk3/sound/movers/elevators

-wie gut, dass man nich immer das alte zeugs wegwirft- Zunge raus
BadMan

Code einblendenCode angehängt. Klicke hier zum Ein-/Ausblenden

code:
1:
2:
3:
4:
name,sequence,file,vol_min,vol_max,vol_mod,pitch_min,pitch_max,dist_min,dist_max,channel,type,probability,loop,masterslave,loadspec,subtitle,compression,secondaryaliasname,volumefalloffcurve,startdelay,speakermap,reverb,lfe percentage,center percentage,platform,envelop_min,envelop_max,envelop percentage

elevator,,misc/elevator.wav,,1,na,0.95,1.05,100,200,,,,,,all_mp,,,,,,,,,,,50,100,0.55



so muss die meinemap.csv aussehen jeweils eine zeile


so verzert der ton nicht Pitch min max

Code einblendenCode angehängt. Klicke hier zum Ein-/Ausblenden

code:
1:
2:
3:
4:
name,sequence,file,vol_min,vol_max,vol_mod,pitch_min,pitch_max,dist_min,dist_max,channel,type,probability,loop,masterslave,loadspec,subtitle,compression,secondaryaliasname,volumefalloffcurve,startdelay,speakermap,reverb,lfe percentage,center percentage,platform,envelop_min,envelop_max,envelop percentage

elevator,,misc/elevator.wav,,1,na,,,100,200,,,,,,all_mp,,,,,,,,,,,50,100,0.55

steinacker
ich hatte das auch als code hier reingesetzt, nur der böse admin hat es als zitat abgeändert....
wichtig iss, da darf kein zeilenumbruch sein, jede "sound-description" in eine zeile
weil die komma's (,,,,,) sind als trennzeichen declariert, d.h. alles was zwischen den ,,,,steht,,,, wird vom "game ausgelesen"
wenn nun ein zeilenumbruch erfolgt, wird der rest nicht "gelesen"

ich hab nochmal ne studie angestellt:
einfach bei Update Zonefiles folgende eintragung "händisch" vornehmen:
sound,mp_deinemap
eintragen, dann wird die soundaliasfile zur "kenntnis genommen"

@badman, werd deine einstellungen mal übernehmen....
für heut iss dann mal schluss
yoda
Der böse Admin hat es wieder rückgängig gemacht - ich ändere so was ab und an wegen der Lesbarkeit ab, nicht böse gemeint Augenzwinkern
steinacker
jou, geht schon klar Herr Admin grosses Grinsen iss kein problem
einer muss ja nach dem rechten schauen
steinacker
hab hier mal noch ne erweiterung, wenn man mehrere auzüge in seine map einbauen will

die variablen heigth und speed müssen natürlich dementsprechend angepasst werden, wie weit und schnell der aufzug fahren soll

(aufzug 3 und 4 sind noch nicht fertig, deshalb fehlen die in dem script noch)

bei aufzug 5 und 6 erfolgt eine bewegung entlang der x-achse (movex), das ist einfach eine "platte" um eine große distanz (2048 WE) schnell zurücklegen zu können
und aufzug 1 und 2 haben oben den startpunkt und fahren dann nach unten

Code einblendenCode 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:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
main()
{
	level.elevatorDown1 = true;
	level.elevatorMoving1 = false;

	level.elevatorDown2 = true;
	level.elevatorMoving2 = false;


	level.elevatorDown5 = true;
	level.elevatorMoving5 = false;

	level.elevatorDown6 = true;
	level.elevatorMoving6 = false;

	thread elevator_start1();
	thread elevator_start2();

	thread elevator_start5();
	thread elevator_start6();
}

elevator_start1()
{
	elevator1 = getentarray ("switch1","targetname");

	if ( isdefined(elevator1) )
		for (i = 0; i < elevator1.size; i++)
		elevator1[i] thread elevator_think1();
}

elevator_think1()
{
	while (1)
	{
	self waittill ("trigger");

	if (!level.elevatorMoving1)
		thread elevator_move1();
	}
}

elevator_move1()
{
	elevatormodel1 = getent ("elevator1", "targetname");

	level.elevatorMoving1 = true;

	speed = 3;
	height =112;

	if (level.elevatorDown1)
	{
		elevatormodel1 playsound ("elevator_start");
		elevatormodel1 playsound ("elevator");
		elevatormodel1 movez (height - (height * 2), speed);
		elevatormodel1 waittill ("movedone");
		elevatormodel1 playsound ("elevator_stop");
		level.elevatorDown1 = false;
	}
	else
	{
		elevatormodel1 playsound ("elevator_start");
		elevatormodel1 playsound ("elevator");
		elevatormodel1 movez (height, speed);
		elevatormodel1 waittill ("movedone");
		elevatormodel1 playsound ("elevator_stop");
		level.elevatorDown1 = true;
	}
	level.elevatorMoving1 = false;
}
////////////////////////////////////////////elevator2////////////////////
elevator_start2()
{
	elevator2 = getentarray ("switch2","targetname");

	if ( isdefined(elevator2) )
		for (j = 0; j < elevator2.size; j++)
		elevator2[j] thread elevator_think2();
}

elevator_think2()
{
	while (1)
	{
	self waittill ("trigger");

	if (!level.elevatorMoving2)
		thread elevator_move2();
	}
}
elevator_move2()
{
	elevatormodel2 = getent ("elevator2", "targetname");

	level.elevatorMoving2 = true;

	speed = 3;
	height =112;

	if (level.elevatorDown2)
	{
		elevatormodel2 playsound ("elevator_start");
		elevatormodel2 playsound ("elevator");
		elevatormodel2 movez (height - (height * 2), speed);
		elevatormodel2 waittill ("movedone");
		elevatormodel2 playsound ("elevator_stop");
		level.elevatorDown2 = false;
	}
	else
	{
		elevatormodel2 playsound ("elevator_start");
		elevatormodel2 playsound ("elevator");
		elevatormodel2 movez (height, speed);
		elevatormodel2 waittill ("movedone");
		elevatormodel2 playsound ("elevator_stop");
		level.elevatorDown2 = true;
	}
	level.elevatorMoving2 = false;
}

////////////////////////////////////////////elevator5////////////////////
elevator_start5()
{
	elevator5 = getentarray ("switch5","targetname");

	if ( isdefined(elevator5) )
		for (m = 0; m < elevator5.size; m++)
		elevator5[m] thread elevator_think5();
}

elevator_think5()
{
	while (1)
	{
	self waittill ("trigger");

	if (!level.elevatorMoving5)
		thread elevator_move5();
	}
}

elevator_move5()
{
	elevatormodel5 = getent ("elevator5", "targetname");

	level.elevatorMoving5 = true;

	speed = 2;
	height =2048;

	if (level.elevatorDown5)
	{
		elevatormodel5 playsound ("elevator_med");
		elevatormodel5 movex (height, speed);
		elevatormodel5 waittill ("movedone");
		level.elevatorDown5 = false;
	}
	else
	{
		elevatormodel5 playsound ("elevator_med");
		elevatormodel5 movex (height - (height * 2), speed);
		elevatormodel5 waittill ("movedone");
		level.elevatorDown5 = true;
	}
	level.elevatorMoving5 = false;
}

////////////////////////////////////////////elevator6////////////////////
elevator_start6()
{
	elevator6 = getentarray ("switch6","targetname");

	if ( isdefined(elevator6) )
		for (n = 0; n < elevator6.size; n++)
		elevator6[n] thread elevator_think6();
}

elevator_think6()
{
	while (1)
	{
	self waittill ("trigger");

	if (!level.elevatorMoving6)
		thread elevator_move6();
	}
}

elevator_move6()
{
	elevatormodel6 = getent ("elevator6", "targetname");

	level.elevatorMoving6 = true;

	speed = 2;
	height =-2048;

	if (level.elevatorDown6)
	{
		elevatormodel6 playsound ("elevator_med");
		elevatormodel6 movex (height, speed);
		elevatormodel6 waittill ("movedone");
		level.elevatorDown6 = false;
	}
	else
	{
		elevatormodel6 playsound ("elevator_med");
		elevatormodel6 movex (height - (height * 2), speed);
		elevatormodel6 waittill ("movedone");
		level.elevatorDown6 = true;
	}
	level.elevatorMoving6 = false;
}


die trigger und brushmodel müssen dann auch den entsprechenden targetname im entity-editor bekommen (targetname switch6 bzw. elevator6)

Zitat:

Verknüpfe sie nun mit Deinem Brushmodel, in dem Du das Model und die Trigger markierst und die Taste "W" drückst. Das war´s erst mal auf der Map-Seite.

Anmerkung OLD MAN WITH GUN:
Eigentlich unnötig - jedenfalls, was das Script dazu weiter unten sagt, da dort die Entities direkt per Namen angesprochen werden und nicht über target.


diese verknüpfung ist wirklich unnötig, ich habs getestet und ohne verknüpfung ist's auch im radiant übersichtlicher
damR
Sehr cooles Tutorial (:

nur eine frage habe ich zum elevator-script:

ganz am schluss (nach level.elevatorMoving = false;) gehört noch ein } um elevator_move() zu schließen, oder?
sonst gehts nämlich nicht.

grüße,

damR