Türen zum Öffnen per Script

yoda

Zitat:

Original von CCL_DESTROYER

Hallihallo,

hier ist dann jetzt das gewünschte Tutorial + Beispielmap

Sorry, dass es etwas länger gedauert hat, aber mein PC hat gesponnen -> Neuinstallation -.-

Wie auch immer, hier ist es:

---

Öffenbare Türen

Zuerst machen wir mal eine Tür:
Dazu ziehen wir einfach einen Brush und packen eine Türen-Textur drauf (die Seiten mit ner Holz-Textur verzieren).

Dann brauchen wir eine Achse, also die "Scharniere" in der die Tür sich nachher öffnen soll - dazu ziehen wir wieder einmal einen Brush, der ungefähr 4x4x[Höhe der Tür] groß ist und packen die Textur "Origin" drauf (ist bei den Tools-Texturen zu finden).

Jetzt markieren wir den "Origin" und den Tür-Brush, Rechte Maustaste in der 2d-Ansicht und dann script -> brushmodel.

Nun drücken wir bei markiertem Brushmodel die Taste N und geben bei Key ->"targetname" und bei Value "door" (der ist frei bestimmbar, muss aber nachher in der gsc richtig angepasst werden) ein.

Als nächstes brauchen wir noch den Auslöser, hierzu stehen uns mehrere Varianten zur Verfügung:

-trigger_use (Tür mit "F" ( = Benutzen) öffnen)

-trigger_use_touch (sollte eigentlich beim Berühren öffnen - hat bei mir aber nicht gefunzt, dafür habe ich den trigger_radius genommen, ist zwar rund, erfüllt aber seine Arbeit genau so gut)

-trigger_radius (gleiche Funktion, die use_touch haben sollte)

-trigger_damage (Tür öffnet sich beim Drauf-Schiessen)

Nun kann man zwei "trigger" benutzen, um die Tür in beide Richtungen zu öffnen, oder aber nur einen, um die Tür nur in eine Richtung öffenbar zu machen.

Ihm/ihnen geben wir den "targetname" "door_trigger" (oder "door_trigger_left" und "door_trigger_right" wenn wir zwei benutzen).

Dann gehts an's Script:

in der mp_meinemap.gsc fügen wir folgendes ein:

Zitat:

maps\mp\mp_meinemap_door::main();

(muss an den Map-Namen angepasst werden)

Dann erstellen wir eine neue [color=darkblue]gsc und nennen sie mp_meinemap_door.gsc

Hierein kommt das eigentliche Script:

Beispiel 1 x "trigger":

Zitat:


main()
{
thread door();
}

door()
{
door = getent ("door","targetname");
doortrigger = getent ("door_trigger","targetname");//wir sagen dem script die namen der tür und des/der trigger
while (1) //begin der funktion
{
doortrigger waittill ("trigger");//wenn der trigger ausglöst wird...
door rotateyaw (90,2);//...dreht sich die tür um 90° in 2 sekunden
door waittill ("rotatedone");//trigger wartet bis die bewegung fertig ist
wait 5;//die tür bleibt 5 sekunden lang geöffnet
door rotateyaw (-90,2);//wir bewegen die tür wieder in die ausgangsposition zurück(-90°)
door waittill ("rotatedone");//trigger wartet bis die bewegung zu ende ist und ist danach wieder funktionstüchtig
}
self thread door();
return;
}


---


Beispiel 2 x "trigger":

Zitat:


main()
{
thread door1();
}

door1()
{
level.door1_open = false;
thread door1_trigger_right();
thread door1_trigger_left();
}

door1_trigger_right()
{
door1 = getent ("door1","targetname");
door1_trigger_right = getent ("door1_trigger_right","targetname");
while (1)
{
door1_trigger_right waittill ("trigger");
if (level.door1_open == true)
{
thread door1_trigger_left();
return;
}
else if (level.door1_open == false)
{
level.door1_open = true;
door1 rotateyaw (-90,2);
door1 waittill ("rotatedone");
wait 5;
door1 rotateyaw (90,2);
door1 waittill ("rotatedone");
level.door1_open = false;
thread door1_trigger_right();
thread door1_trigger_left();
return;
}
}
}

door1_trigger_left()
{
door1 = getent ("door1","targetname");
door1_trigger_left = getent ("door1_trigger_left","targetname");
while (1)
{
door1_trigger_left waittill ("trigger");
if (level.door1_open == true)
{
thread door1_trigger_right();
return;
}
else if (level.door1_open == false)
{
level.door1_open = true;
door1 rotateyaw (90,2);
door1 waittill ("rotatedone");
wait 5;
door1 rotateyaw (-90,2);
door1 waittill ("rotatedone");
level.door1_open = false;
thread door1_trigger_left();
thread door1_trigger_right();
return;
}
}
}


---

Das mit den zwei "triggern" funktioniert genau gleich wie mit einem - nur dass wir ihm sagen, dass, wenn der 1."trigger" betätigt wird, die Tür zuerst nach rechts und dann nach links bewegt wird und bei dem 2. "trigger" in der umgekehrten Reihenfolge.

So, das war's dann auch schon, ich hoffe, ich hab mich klar genug ausgedrückt, fall's nicht, könnt ihr euch die testmap mal anschauen (auch wenn ihr alles kapiert habt schadet´s nicht Augenzwinkern )

Download:
http://ccldestroyer.cc.funpic.de/cod2-do...l_reloaded2.zip

Alternativ:
Türenbeispiel.zip
yoda

Zitat:

Original von Zordiac

Als Ergänzung, wenn man nicht möchte, dass die Türen sich nach 5 sec. automatisch schließen (was sie in Echt ja auch nicht machen), geht nocht folgendes:

Zitat:


door()
{
door = getent ("door","targetname");
doortrig = getent ("doortrig","targetname");
while (1)
{
doortrigger waittill ("trigger");
door rotateyaw (90,1.3);
door playsound ("dooropen");
door waittill ("rotatedone");
{
doortrigger waittill ("trigger");
door rotateyaw (-90,1.3);
door playsound ("doorclose");
door waittill ("rotatedone");
}
}
self thread door();
return;
}
yoda

Zitat:

Original von CCL_DESTROYER

So, hier ist nun das angepasste Script.

Hiermit lassen sich die Türen beidseitig öffnen und schliessen sich nichtmehr von selber.
Wem das vorige Script gefallen hat, der wird das hier lieben:

Zitat:

main()
{
thread door1();
}

door1()
{
level.door1_open = false;
level.door1_moving = false;
level.door1_direction = false;
thread door1_trigger_right();
thread door1_trigger_left();
}

door1_trigger_right()
{
door1 = getent ("door1","targetname");
door1_trigger_right = getent ("door1_trigger_right","targetname");
while (1)
{
door1_trigger_right waittill ("trigger");
if (level.door1_open == false)
{
if(level.door1_moving == false)
{
level.door1_moving = true;
level.door1_open = true;
level.door1_dierection = true;
door1 rotateyaw (90,2);
door1 waittill ("rotatedone");
level.door1_moving = false;
thread door1_trigger_right();
return;
}
else if (level.door1_moving == true)
{
thread door1_trigger_right();
return;
}
}
else if(level.door1_open == true)
{
if(level.door1_moving == false)
{
if (level.door1_dierection == true)
{
level.door1_moving = true;
door1 rotateyaw (-90,2);
door1 waittill ("rotatedone");
level.door1_open = false;
level.door1_moving = false;
thread door1_trigger_right();
return;
}
else if (level.door1_dierection == false)
{
level.door1_moving = true;
door1 rotateyaw (90,2);
door1 waittill ("rotatedone");
level.door1_open = false;
level.door1_moving = false;
thread door1_trigger_right();
return;
}
}
else if (level.door1_moving == true)
{
thread door1_trigger_right();
return;
}
}
}
}

door1_trigger_left()
{
door1 = getent ("door1","targetname");
door1_trigger_left = getent ("door1_trigger_left","targetname");
while (1)
{
door1_trigger_left waittill ("trigger");
if (level.door1_open == false)
{
if(level.door1_moving == false)
{
level.door1_moving = true;
level.door1_open = true;
level.door1_dierection = false;
door1 rotateyaw (-90,2);
door1 waittill ("rotatedone");
level.door1_moving = false;
thread door1_trigger_left();
return;
}
else if (level.door1_moving == true)
{
thread door1_trigger_left();
return;
}
}
else if(level.door1_open == true)
{
if(level.door1_moving == false)
{
if (level.door1_dierection == true)
{
level.door1_moving = true;
door1 rotateyaw (-90,2);
door1 waittill ("rotatedone");
level.door1_open = false;
level.door1_moving = false;
thread door1_trigger_left();
return;
}
else if (level.door1_dierection == false)
{
level.door1_moving = true;
door1 rotateyaw (90,2);
door1 waittill ("rotatedone");
level.door1_open = false;
level.door1_moving = false;
thread door1_trigger_left();
return;
}
}
else if (level.door1_moving == true)
{
thread door1_trigger_left();
return;
}
}
}
}



---

Sollte man auch zum Tut hinzufügen
(Hiermit erledigt Augenzwinkern )

Edit:
Wer ´ne Erklärung will muss bis zu meinen Ferien warten, jetzt bin ich mal froh, dass es läuft^^
yoda
Bei Problemen und Fragen bitte in diesem Thread posten:

Türen, leidiges Thema