Script für Aufzug mit Aufzugtüren

Ph3n0m PoWeR
Auf "mp_urban" sieht man ein Beispiel für ein perfektes Script. Ich suche eines, mit dem man einen Aufzug bewegen kann, und bei dem sich die Türen oben und unten automatisch schließen, wenn der Aufzug sich bewegt oder wenn er nicht da ist. Perfekt wäre es noch, wenn man ihn auf Knopfdruck (trigger_use) rufen könnte. Ich habe bereits einen Aufzug erstellt, aber nur ohne Türen.


--- Edit by Nightwing: Thema in Scripthilfe verschoben ---
Nightwing
Müsste das hier sein, habs aber nie in Aktion gesehen: _elevator.gsc

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:
main(){

	level.elevDown=true;
	level.elevMove=false;
	
	switchTOP=getentarray("ups","targetname");
	
	for(i=0; i<switchTOP.size; i++)
		switchTOP[i] thread elev_think();
}

elev_think(){

	while(1){
	
		self waittill ("trigger");
		
		if(level.elevMove==false){
		
			level.elevMove=true;
			thread elev_move();
		}
	}
}

elev_move(){

	etime=5;
	zdirec="z";
	zdist1=128;
	zdist2=-128;

	IdoorLEFT=getent("leftindoor", "targetname");
	IdoorRIGHT=getent("rightindoor", "targetname");
	OdoorTL=getent("topleftdoor", "targetname");
	OdoorTR=getent("toprightdoor", "targetname");
	OdoorBL=getent("bottomleftdoor", "targetname");
	OdoorBR=getent("bottomrightdoor", "targetname");
	
	thread door_open(IdoorLEFT, IdoorRIGHT, OdoorBL, OdoorBR);

	Elevator=getent("elevator", "targetname");

	if(level.elevDown==true){

		door_close(IdoorLEFT, IdoorRIGHT, OdoorBL, OdoorBR);
		wait(.1);
		Elevator thread move_func(zdist1, etime, zdirec);
		IdoorLEFT thread move_func(zdist1, etime, zdirec);
		IdoorRIGHT thread move_func(zdist1, etime, zdirec);
		Elevator waittill ("movedone");

		door_open(IdoorLEFT, IdoorRIGHT, OdoorTL, OdoorTR);

		level.elevDown=false;
		level.elevMove=false;
	}
		
	else{
	
		door_close(IdoorLEFT, IdoorRIGHT, OdoorTL, OdoorTR);
		wait(.1);
		Elevator thread move_func(zdist2, etime, zdirec);
		IdoorLEFT thread move_func(zdist2, etime, zdirec);
		IdoorRIGHT thread move_func(zdist2, etime, zdirec);
		Elevator waittill ("movedone");

		door_open(IdoorLEFT, IdoorRIGHT, OdoorBL, OdoorBR);

		level.elevDown=true;
		level.elevMove=false;
	}
	wait(.1);
}


door_close(leftIN, rightIN, leftOUT, rightOUT){

	LDclose=41;
	RDclose=-41;	
	ydirec="y";
	dtime=1.1;

	leftIN thread move_func(LDclose,dtime, ydirec);
	rightIN thread move_func(RDclose,dtime, ydirec);
	wait(1);
	leftOUT thread move_func(LDclose,dtime, ydirec);
	rightOUT thread move_func(RDclose,dtime, ydirec);
	wait(1);
}

door_open(leftyIN, rightyIN, leftyOUT, rightyOUT){

	LDopen=-41;
	RDopen=41;
	ydirec="y";
	dtime=1.1;

	leftyOUT thread move_func(LDopen,dtime, ydirec);
	rightyOUT thread move_func(RDopen,dtime, ydirec);
	wait(1);
	leftyIN thread move_func(LDopen,dtime, ydirec);
	rightyIN thread move_func(RDopen,dtime, ydirec);
}

move_func(dist,time,direc){

	if(direc=="z")
		self movez (dist, time, (time/2), (time/2));
	if(direc=="x")
		self movex (dist, time, (time/2), (time/2));
	if(direc=="y")
        self movey (dist, time, (time/2), (time/2));
    
    self waittill ("movedone");
}


ToM
Ph3n0m PoWeR
Vielen Dank! Ich werde es aber erst später einsetzen, erstmal wieder die ganzen Grundlagen der neuen Map.
OLD MAN WITH GUN
Oder schau dir das hier mal an.
http://www.file-upload.net/download-2172...evator.zip.html
Enthält eine readme, Beispielmap und prefabs.
Ist nicht von mir (hab ich mal von modsonline.com runtergeladen).
Ph3n0m PoWeR
So, ich habe folgendes gemacht:

Den Elevator, dann script_brushmodel mit targetname "elevator".
Die obere Tür, script_brushmodel mit targetname "topleftdoor" und "toprightdoor".
Die untere Tür, script_brushmodel mit targetname "bottomleftdoor" und "bottomrightdoor".
Die Aufzugtür, script_brushmodel mit targetname "leftindoor" und "rightindoor".
Einen trigger_use, der von unten bis nach oben geht, und den Bereich abdeckt, indem man den Aufzug rufen / starten kann.
Das Script an meine Verhältnisse angepasst:

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:
main()
{

	level.elevDown=true;
	level.elevMove=false;
	
	switchTOP=getentarray("ups","targetname");
	
	for(i=0; i<switchTOP.size; i++)
		switchTOP[i] thread elev_think();
}

elev_think()
{

	while(1)
{
	
		self waittill ("trigger");
		
		if(level.elevMove==false){
		
			level.elevMove=true;
			thread elev_move();
		}
	}
}

elev_move()
{

	etime=5;
	zdirec="z";
	zdist1=120;
	zdist2=-120;

	IdoorLEFT=getent("leftindoor", "targetname");
	IdoorRIGHT=getent("rightindoor", "targetname");
	OdoorTL=getent("topleftdoor", "targetname");
	OdoorTR=getent("toprightdoor", "targetname");
	OdoorBL=getent("bottomleftdoor", "targetname");
	OdoorBR=getent("bottomrightdoor", "targetname");
	
	thread door_open(IdoorLEFT, IdoorRIGHT, OdoorBL, OdoorBR);

	Elevator=getent("elevator", "targetname");

	if(level.elevDown==true)
{

		door_close(IdoorLEFT, IdoorRIGHT, OdoorBL, OdoorBR);
		wait(.1);
		Elevator thread move_func(zdist1, etime, zdirec);
		IdoorLEFT thread move_func(zdist1, etime, zdirec);
		IdoorRIGHT thread move_func(zdist1, etime, zdirec);
		Elevator waittill ("movedone");

		door_open(IdoorLEFT, IdoorRIGHT, OdoorTL, OdoorTR);

		level.elevDown=false;
		level.elevMove=false;
	}
		
	else
{
	
		door_close(IdoorLEFT, IdoorRIGHT, OdoorTL, OdoorTR);
		wait(.1);
		Elevator thread move_func(zdist2, etime, zdirec);
		IdoorLEFT thread move_func(zdist2, etime, zdirec);
		IdoorRIGHT thread move_func(zdist2, etime, zdirec);
		Elevator waittill ("movedone");

		door_open(IdoorLEFT, IdoorRIGHT, OdoorBL, OdoorBR);

		level.elevDown=true;
		level.elevMove=false;
	}
	wait(.1);
}


door_close(leftIN, rightIN, leftOUT, rightOUT)
{

	LDclose=50;
	RDclose=-50;	
	ydirec="y";
	dtime=1.1;

	leftIN thread move_func(LDclose,dtime, ydirec);
	rightIN thread move_func(RDclose,dtime, ydirec);
	wait(1);
	leftOUT thread move_func(LDclose,dtime, ydirec);
	rightOUT thread move_func(RDclose,dtime, ydirec);
	wait(1);
}

door_open(leftyIN, rightyIN, leftyOUT, rightyOUT)
{

	LDopen=-50;
	RDopen=50;
	ydirec="y";
	dtime=1.1;

	leftyOUT thread move_func(LDopen,dtime, ydirec);
	rightyOUT thread move_func(RDopen,dtime, ydirec);
	wait(1);
	leftyIN thread move_func(LDopen,dtime, ydirec);
	rightyIN thread move_func(RDopen,dtime, ydirec);
}

move_func(dist,time,direc)
{

	if(direc=="z")
		self movez (dist, time, (time/2), (time/2));
	if(direc=="x")
		self movex (dist, time, (time/2), (time/2));
	if(direc=="y")
        self movey (dist, time, (time/2), (time/2));
    
    self waittill ("movedone");
}



Habe ich es richtig gemacht?

//Edit: Ich habe es nun getestet, das Spiel läuft sogar, die Scripts sind sauber eingebunden. Allerdings sehe ich weder meinen hinttring, noch kann ich irgendetwas bewegen. Kann mir nochmal jemand erklären, wo bzw. wie der "ups" Trigger eingebaut werden muss? Ich will das Gebäude zwei Mal benutzen, und es muss lauffähig sein, bevor ich es kopiere. Solange werde ich jetzt noch an den schönen Kleinigkeiten arbeiten, Salatauslagen, Theken, Terrarien, Computern...
Ph3n0m PoWeR
Kann mir jemand sagen, wie ich die Trigger setzen muss?
OLD MAN WITH GUN
Du musst den ups use_trigger 2x setzen.
1x an den oberen Aufzugtüren und 1x unten (um den Aufzug zu rufen, bzw. die Türen zu öffen wenn der Aufzug schon da ist).
Ph3n0m PoWeR
Also soll der Trigger oben und unten den Bereich abdecken, wo man ihn rufen und bewegen kann (2 verschiedene Trigger)? Und er ist nicht mit dem "ElevatorGetent" verbunden?
OLD MAN WITH GUN
Die ups trigger machen nichts weiter als jeweils für sich selbst die Funktion trigger_think zu starten. Diese Funktion prüft dann beim aktivieren der ups trigger lediglich ob der Aufzug schon in Benutzung ist oder nicht. Ist er bereits in Benutzung, passiert nichts weiter. Ist er nicht in Benutzung wird die Funktion elevator_move gestartet welche den Aufzug dann in Bewegung setzt (diese Funktion sammelt dann auch erst die für den Aufzug benötigten teile auf, wie den Aufzug selber und die Türen).
Ph3n0m PoWeR
Ich wollte wissen, wo ich die genau platzieren muss. Beide haben jetzt den targetname "ups", einer deckt oben den Bereich des Auslösers im Innenraum und an der Außenwand ab, der andere das gleiche unten. Aber es funktioniert nicht, keine Bewegung.
OLD MAN WITH GUN
Die trigger müssen nicht so groß sein.
Ein kleiner an der Wand reicht (so, das du ihn benutzen kannst).
Ph3n0m PoWeR
Es ist ein Prefab, damit ich es zweimal benutzen kann, aber das spielt auch keine Rolle.



Ich habe ein Bild davon gemacht, vielleicht kannst du mir jetzt den Fehler zeigen.
OLD MAN WITH GUN

Zitat:

Original von Ph3n0m PoWeR
Ich habe ein Bild davon gemacht, vielleicht kannst du mir jetzt den Fehler zeigen.
Sieht (abgesehen von der Größer der trigger, die ruhig kleiner hätte sein können) eigentlich in Ordnung aus.

Edit: Ganz vergessen, trigger_use funktionieren nicht, wenn sie durch einen brush hindurchgehen. Du musst also oben und unten jeweils 2 trigger_use mit dem Namen ups erstellen (draußen und drinnen jeweils einen).
Ph3n0m PoWeR
Also meinst du vier Trigger, zwei oben, zwei unten? Mein Rolltreppenproblem hat sich erledigt, ich habe "script_noteworty" geschrieben.
OLD MAN WITH GUN

Zitat:

Original von Ph3n0m PoWeR
Also meinst du vier Trigger, zwei oben, zwei unten?
Ja.
Rein theoretisch würde auch nur einer oben und einer unten (jeweils aussen). Nur wenn man dann nicht aussteigt bevor sich die Türen wieder schließen, sitzt man in der Falle, bis von außen wieder einer den Aufzug ruft.
Ph3n0m PoWeR
Du solltest wirklich bei IW anfangen...

Ich habe jetzt vier Trigger gemacht, jeweils an den Stellen, an denen der Fahrstuhl ausgelöst werden soll, mit dem targetname "ups". Jetzt kommt folgender Fehler...



Ich konnte leider keinen richtigen Screenshot machen, da das Spiel dies einfach nicht wollte. Es war harte Arbeit, überhaupt ein Bild davon machen zu können.
OLD MAN WITH GUN

Zitat:

Original von Ph3n0m PoWeR
Du solltest wirklich bei IW anfangen...

Ich habe jetzt vier Trigger gemacht, jeweils an den Stellen, an denen der Fahrstuhl ausgelöst werden soll, mit dem targetname "ups". Jetzt kommt folgender Fehler...
Du hast mehr als ein Objekt in deiner Map, was den targetname 'leftindoor' hat.
Dir ist schon bewust, das der Script nur mit einem Aufzug funktioniert oder?

Zitat:

Original von Ph3n0m PoWeR
Ich konnte leider keinen richtigen Screenshot machen, da das Spiel dies einfach nicht wollte.
Weil die Tastenbinds nicht gehen solange die Console offen ist. Einfach /Screenshotjpeg eintippen.
Ph3n0m PoWeR
Ich habe den Aufzug als Prefab gemacht, das kenne ich schon seit meiner mp_r_infection, dass man es nicht alles in einer World haben kann, sondern jedes einzeln als Prefab. Eben war eine Door kein Script_Brushmodel, ich werde jetzt noch eine Kontrolle vornehmen.
Ph3n0m PoWeR
Ich habe einen Aufzug, die VIER Trigger an den Schaltstellen, die nicht in eine Wand hineinragen, funktionieren nicht. Keine Bewegung...
OLD MAN WITH GUN
Ich hab mir jetzt mal den script etwas genauer angeschaut.
Der steckt voller Fehler.
z.B. werden in Zeile 44 die Türen geöffnet (aber als eigenständige Funktion). Dadurch wartet die Funktion elev_move nicht, bis die Funktion door_open fertig ist, sondern läuft sofort weiter. Und in Zeile 51 bzw. 67 werden die Türen schon wieder geschlossen. Die Türen bekommen also den Befehl sich zu öffnen und nur Millisekunden später gleich den Befehl sich wieder zu schließen. Öffnen und schließen läuft also gleichzeitig. Was wird da wohl passieren? Wahrscheinlich nichts.
Und wenn der Aufzug sich nach oben bzw. unten bewegt hat werden die Türen geöffnet (Zeile 58 bzw. 74) und bleiben offen, da kein weiterer Schließbefehl kommt. Und wenn der Aufzug jetzt wieder getriggert wird, sollen die Türen geöffnet werden (aber die sind doch schon offen, und werden jetzt noch weiter geöffnet).