[Tutorial] Öffnende Tür erstellen *

yoda
Vorlage von HarkoninVSC auf MODSonline.com

Danke an Verni@hter und OLD MAN WITH GUN für´s Testen!

Wie man eine sich öffnen lassende Tür erstellt

HarkoninVSC zeigt uns hier, wie man eine Tür erstellt, die sich öffnen lässt.

Schritt 1:

Gehen wir davon aus, dass Du eine "Tür-Öffnung" aus Deiner Wand ausgeschnitten hast - nun musst Du aus einem texturierten Brush Deine "Tür" bauen, die in diese Türöffnung hineinpasst.

In diesem Tutorial nehmen wir mal die Tür ch_door_18.
(Wenn Du auch einen Türrahmen einsetzen möchtest, kannst Du einen aus den Prefabs auswählen, z. B. das folgende: /prefabs/zipline/door_64_frame_02.)

Schritt 2:

Unser nächster Schritt ist die Erstellung eines "Scharnier"-Brushes, belegt mit der "origin"-Textur, die man unter
-> textures -> tools
findet.

Dieser Origin-Brush wird als "Scharnier" fungieren - also platziere ihn genau an der Stelle, an der Du die sich öffnen und schließen lassende Tür platzieren möchtest.

Schritt 3:

Markiere nun in der 2D-Ansicht sowohl Deine "Tür" als auch Dein "Scharnier" und klicke mit der rechten Maustaste. Wähle nun im Menü
-> script -> brushmodel

Schritt 4:

Nun brauchen wir noch einen Auslöser (= Trigger) für die Tür, damit sie sich auch öffnet. Erstelle einen Brush in dem Bereich, in dem der Spieler in der Lage sein soll, die Tür zu öffnen.

Ist der Brush erstellt und markiert, klicke mit der rechten Maustaste in der 2D-Ansicht und wähle
-> trigger -> use_touch

Schritt 5:

Jetzt, nachdem der Auslöser (= Trigger) gesetzt ist, musst Du das Entity-Fenster mit der Taste "N" öffnen.
Hier verpasst Du dem Trigger diese Werte:

Key: Tagretname
Value: doortrig

Wenn Du auch einen Hilfetext anzeigen lassen möchtest, wenn der Spieler vor der Tür steht, dann musst Du noch folgendes setzen:

Key: hintstring
Value: Dein gewünschter Text

Schritt 6:

Markiere Deinen Trigger und Deine Tür und drücke dann die Taste "W", um sie miteinander zu verknüpfen.

So, das war´s im Editor, auf geht´s zum Script-Teil.

1.) Vorausgesetzt natürlich Du hast bereits eine "Dein_Mapname.gsc": öffne Du sie und füge diese Zeile ein:

maps\mp\_door::main();

... und zwar über der Zeile:

maps\mp\_load::main();

2.) Kopiere dieses Script und füge es in eine neue Text-Datei ein und benenne diese Text-Datei dann um in
_door.gsc
Speichere die _door.gsc anschließend in Deinem Ordner maps/mp

main()
{
*Dein eigener Map-Kram an dieser Stelle*

doortriggers = getentarray("doortrig","targetname");
for(i = 0; i < doortriggers.size; i++)
doortriggers[i] thread door_think();
}

door_think()
{
self.doormoving = false;
self.doorclosed = true;
self.doormodel = getent(self.target, "targetname");

while (1)
{
self waittill("trigger");
if(!self.doormoving)
self thread door_move();
}
}

door_move()
{
self.doormoving = true;
if(self.doorclosed)
{
self.doormodel rotateyaw(-90,1,0.5,0.5);
self.doormodel waittill("rotatedone");
self.doorclosed = false;
}
else
{
self.doormodel rotateyaw(90,1,0.5,0.5);
self.doormodel waittill("rotatedone");
self.doorclosed = true;
}
self.doormoving = false;
}


Stelle sicher, dass Du Deine Zone-Datei nach dem Compiling der Map updatest!
Wichtiger Zusatz:

rotateyaw
Grad des Drehens, Zeit des Drehens, Beschleunigungs- und Verlangsamunszeit

doorclosed
doormoving

Lässt das Script wissen, ob die Tür geöffnet/geschlossen oder in Bewegung ist

doortrig
Ist der Name Deines Auslösers (= Trigger)

Man kann rotateyaw auch ändern in:

rotateto
Hoch-/Runter-Rotation

moveto
X, Y, Z, Zeit

movex
Bewegen auf der X-Achse

movey
Bewegen auf der Y-Achse

movez
Bewegen auf der Z-Achse

Wenn Du 360 Grad für die Rotation verwendest, kannst Du eine Drehtür erstellen.

Hoffe mal, das hilft weiter.

Hark

---

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

***
Verni@hter
Hier scheint noch ein kleiner Fehler zusein. Der Trigger der mit der Tür verbunden wurde bewegt sich nicht mit. Vielleicht weiß jemand warum.

Gruss
BadMan
Also bei mir will´s noch garnicht was muss den bei
*Map-Kram an dieser Stelle*
im Skript hin
OLD MAN WITH GUN

Zitat:

Original von BadMan
Also bei mir will´s noch garnicht was muss den bei
*Map-Kram an dieser Stelle*
im Skript hin
Damit sind die Sachen gemeint, die du schon von vornherein in deiner mp_deinmapname.gsc drin hast, also z.B. welches Team angreift, welches Team verteidigt, welche Fraktionen (Marines vs. Opfor oder SAS vs. Spez.) gegeneinander spielen usw.

@Vernichter: Dass sich der trigger mit bewegt ist auch nicht vorgesehen Augenzwinkern
BadMan
Verstehe ich da jetzt was falsch?

Ich erstelle die Datei _door.gsc mit folgenden Inhalt

Zitat:

main()
{
*Map-Kram an dieser Stelle*

doortriggers = getentarray("doortrig","targetname");
for(i = 0; i < doortriggers.size; i++)
doortriggers[i] thread door_think();
}

door_think()
{
self.doormoving = false;
self.doorclosed = true;
self.doormodel = getent(self.target, "targetname");

while (1)
{
self waittill("trigger");
if(!self.doormoving)
self thread door_move();
}
}

door_move()
{
self.doormoving = true;
if(self.doorclosed)
{
self.doormodel rotateyaw(-90,1,0.5,0.5);
self.doormodel waittill("rotatedone");
self.doorclosed = false;
}
else
{
self.doormodel rotateyaw(90,1,0.5,0.5);
self.doormodel waittill("rotatedone");
self.doorclosed = true;
}
self.doormoving = false;
}


In meine mp_meine Map.gsc füge ich maps\mp\_door::main(); ein womit ich die Datei _door.gsc öffne oder?

Wieso muss da dann nochmal der Inhalt von meiner mp_meine map.gsc rein
Verni@hter

Zitat:

Original von BadMan
Verstehe ich da jetzt was falsch?

Ich erstelle die Datei _door.gsc mit folgenden Inhalt

*Map-Kram an dieser Stelle*


Wieso muss da dann nochmal der Inhalt von meiner mp_meine map.gsc rein



Erstelle einfach die Datei und kopiere alles rein ausser die Zeile da oben und in dein zone File kommt die zeile:

rawfile,maps/mp/_door.gsc

Zitat:

Original von BadMan
In meine mp_meine Map.gsc füge ich maps\mp\_door::main(); ein womit ich die Datei _door.gsc öffne oder?



Ja
OLD MAN WITH GUN

Zitat:

Original von BadMan
Verstehe ich da jetzt was falsch?
Jein.
Das Tutorial ist so geschrieben, das man das komplette Script direkt in seine mp_mapname.gsc schreibt (also nicht als extra gsc-Datei).

Du kannst natürlich auch das Script in eine eigene gsc-Datei packen und diese dann aus deiner mp_mapname.gsc aufrufen. Dann fällt das mit dem Map-Kram im door-Script natürlich weg (der steht ja in deiner mp_mapname.gsc).

Entweder hast du es so, wie oben beschrieben, oder du hast es so:

mp_deinmapname.gsc

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

code:
1:
2:
3:
4:
5:
6:
main()
{
  *Map-Kram an dieser Stelle*

  thread maps\mp\_door::main();
}


und _door.gsc

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

code:
1:
2:
3:
4:
5:
main()
{
  doortriggers = getentarray("doortrig","targetname");
  ...und der ganze Rest des Scripts
}

UF | Sorc

Zitat:

Original von Verni@hter
Hier scheint noch ein kleiner Fehler zusein. Der Trigger der mit der Tür verbunden wurde bewegt sich nicht mit. Vielleicht weiß jemand warum.

Gruss


Jo das habe ich auch schon mitbekommen. Weiß da jemand eine Lösung?
yoda

Zitat:

Original von OLD MAN WITH GUN

@Vernichter: Dass sich der trigger mit bewegt ist auch nicht vorgesehen Augenzwinkern
UF | Sorc
Hmm das der Trigger sich nicht mitbewegt hat aber de Nachteil, das die Tür nur an dem Punkt geschlossen werden kann wo man sie auch geöffnet hat. Ich habe es jetzt erstmal so gemacht das ich den Trigger sehr groß gemacht habe. Ich finde allerdings das er der Realität nicht gerade sehr nah ist wenn ich Tür schon von weiten Öffnen kann. Gibt es denn die Möglichkeit das der Trigger sich mit bewegt?
OLD MAN WITH GUN
Mit ein wenig Überredungskunst (sprich ein paar Zeilen mehr) geht das auch.
Im obigen Script in der Funktion door_think() die folgenden grün gekennzeichneten Zeilen einfügen:

Zitat:

door_think()
{
self.doormoving = false;
self.doorclosed = true;
self.doormodel = getent(self.target, "targetname");
self enableLinkTo();
self linkto(self.doormodel);

while (1)
{
self waittill("trigger");
if(!self.doormoving)
self thread door_move();
}
}

Die zwei Zeilen kleben den Trigger an die Tür, worauf dieser sich dann mit der Tür mitbewegt.
UF | Sorc
Super danke dir Old Man.

Und dann hätte ich da noch was anderes.
Und zwar dem Gamplay zu liebe hätte ich es gerne so das die Tür sich immer vom Spieler wegbewegt. Hatte mir überlegt einfach nen Trigger auf jede seite zu setzten und dann den Wert bei self.doormodel rotateyaw(90,1,0.5,0.5); einmal auf 90...-90 und -90...90 zu setzten. So das ich dann 2 _door.gcs files hätte mit verschiedenen key und value. Aber da wäre das Problem, was ist wenn 2 Spieler die Tür gleichzeitig öffnen? Kann während sich die Tür bewegt den anderen Trigger deaktivieren?

Danke schonmal für eure hilfe.

Gruß UF | Sorc
OLD MAN WITH GUN
Schau mal in den CoD2 Bereich, die Scripts funktionieren bei CoD4 genau so.
Türen zum Öffnen per Script
Nebenbei, bei mir zu Hause gehen die Türen nur in eine Richtung auf (wer baut schon überall Schwingtüren ein) Augenzwinkern
UF | Sorc
Ich weiß, bei gehen sie auch nur in eine richtung auf. Aber es soll ja dem Gameplay zu gute kommen Augenzwinkern . Also das Script funzt nicht wenn ich es so übernehme. Habe auch keine Ahnung wie ich es ändern muss das es funzt.
-tiger-
Und was genau funkz nicht, wird dir eine Fehlermeldung angezeigt oder geht die tür nicht auf. Ich nutze auch das CoD2-skript und musste bei einigen Türen den winkel ändern, zb. 90 > -90 oder umgekehrt.
OLD MAN WITH GUN

Zitat:

Original von UF | Sorc
Also das Script funzt nicht wenn ich es so übernehme. Habe auch keine Ahnung wie ich es ändern muss das es funzt.
Dann wäre es sinnvoll zu schreiben, was genau passiert (detaillierte Fehlerbeschreibung/Fehlermeldungen in der Console etc).
Du musst beim verlinkten Script z.B. bedenken, das oben beim Erstellen der Tür als targetname "door" verwendet wurde, im Script für die Tür mit zwei Triggern aber "door1" angegeben ist (somit findet der Script die Tür nicht, was zu einem Fehler führt).
-tiger-
So ich war mal so frei und habe das skript für zwei Trigger erweitert und es getestet, es sollte funktionieren.

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:
main()
{
//door1
door1_trigger1 = getentarray("door1_trigger_right","targetname");
for(i = 0; i < door1_trigger1.size; i++)
door1_trigger1[i] thread door1_think1();

door1_trigger2 = getentarray("door1_trigger_left","targetname");
for(i = 0; i < door1_trigger2.size; i++)
door1_trigger2[i] thread door1_think2();
}

//door1
door1_think1()
{
self.door1_moving1 = false;
self.door1_closed1 = true;
self.door1_model1 = getent(self.target, "targetname");

while (1)
{
self waittill("trigger");
if(!self.door1_moving1)
self thread door1_move1();
}
}

door1_move1()
{
self.door1_moving1 = true;
if(self.door1_closed1)
{
self.door1_model1 rotateyaw(90,2,1,1);
self.door1_model1 waittill("rotatedone");
self.door1_closed1 = false;
}
else
{
self.door1_model1 rotateyaw(-90,2,1,1);
self.door1_model1 waittill("rotatedone");
self.door1_closed1 = true;
}
self.door1_moving1 = false;
}

door1_think2()
{
self.door1_moving2 = false;
self.door1_closed2 = true;
self.door1_model2 = getent(self.target, "targetname");

while (1)
{
self waittill("trigger");
if(!self.door1_moving2)
self thread door1_move2();
}
}

door1_move2()
{
self.door1_moving2 = true;
if(self.door1_closed2)
{
self.door1_model2 rotateyaw(-90,2,1,1);
self.door1_model2 waittill("rotatedone");
self.door1_closed2 = false;
}
else
{
self.door1_model2 rotateyaw(90,2,1,1);
self.door1_model2 waittill("rotatedone");
self.door1_closed2 = true;
}
self.door1_moving2 = false;
}

UF | Sorc
Also ich habe jetzt den Key: targetname gegeben und dem Value: door1_trigger_right bzw door1_trigger_left.

Bekomme aber folgenden Fehler:
http://www.bilder-space.de/show.php?file=g08LZs6lvZqep9o.jpg
http://www.bilder-space.de/show.php?file=Ps1vg1y3vCiUyGx.jpg

Das ist das Script von -tiger-.

Danke schonmal für eure Hilfe.

Gruß UF | Sorc
-tiger-

Zitat:

Original von UF | Sorc
Also ich habe jetzt den Key: targetname gegeben und dem Value: door1_trigger_right bzw door1_trigger_left.

Bekomme aber folgenden Fehler:
http://www.bilder-space.de/show.php?file=g08LZs6lvZqep9o.jpg
http://www.bilder-space.de/show.php?file=Ps1vg1y3vCiUyGx.jpg

Das ist das Script von -tiger-.

Danke schonmal für eure Hilfe.

Gruß UF | Sorc


Komisch bei meinem test funkz es ohne Probleme, > rotateyaw(90,1,1,1); < das löst den fehler aus. ändere es mal überall in > 2,1,1 < Die erste Zahl ist die Gesamtzeit und die muss doppelt so groß sein wie die Bewegungszeit, zweite und dritte Zahl ist die Bewegungszeit. Das kann man ganz schnell im Texteditor ändern mit suchen ersetzen. Oder nimm das Skript ihr aus dem Tutorial, habe es aktualisiert.

Edit:

rotateyaw(90,2,1,1); die erste zahl (90) ist der Winkel, zweite zahl (2) ist die Bewegungszeit, dritte zahl (1) ist die Beschleunigung-Zeit und die letzte ist die Verlangsamung-Zeit.
UF | Sorc

Zitat:

Original von -tiger-

Komisch bei meinem test funkz es ohne Probleme, > rotateyaw(90,1,1,1); < das löst den fehler aus. ändere es mal überall in > 2,1,1 < Die erste Zahl ist die Gesamtzeit und die muss doppelt so groß sein wie die Bewegungszeit, zweite und dritte Zahl ist die Bewegungszeit. Das kann man ganz schnell im Texteditor ändern mit suchen ersetzen. Oder nimm das Skript ihr aus dem Tutorial, habe es aktualisiert.


Super daran lag es. Danke dir.