DjTranceFire
Hallo Leute.
Ganz neu bin ich beim Mappen zwar nicht, habe bis jetzt aber nur eine kleine Anfängermap für einen Jumpmod gebastelt welche von allem nur das einfachste in sich hatte.
Nun hab ich mich nach einigen Monaten doch mal wieder ans mappen gesetzt da mich das Thema einfach nicht losgelassen hat, macht halt einfach Spaß. Mein momentanes Projekt wird wieder eine Jumpmap nur soll sie diesmal etwas aufwändiger werden was für mich im Klartext bedeutet: auf gehts mit den Scripts. Bisher habe ich damit keiner Erfahrung, habe es aber gestern schonmal hinbekommen einen funktionierenden Teleporter einzubauen. Jetzt will ich aber etwas einbauen für das ich leider nirgends etwas gefunden habe..
Meine Idee ist ein Gebiet in welchem die Laufgeschwindigkeit der Person beeinflusst wird. Ungefähr so wie bei Minecraft mit dem Soul Sand. Wichtig ist aber das es wirklich nur auf die Person einfluss nimmt welche sich genau in dem Gebiet befindet und nicht auf andere. Auch sollte das ganze aufhören sobald das Gebit verlassen wird. Nun war meine Hoffnung das ich hier jemanden finde der vllt schonmal sowas gebaut hat bzw. sowas erstellen könnte. Aber eins direkt vornweg. Ich würde mich zwar tierisch über eine kleine Anleitung sowie ein fertiges Script freuen welches ich dann nur noch einbauen muss, eine kleine Erklärung von der ganzen Sache wäre aber wirklich super damit ich dabei wenigstens etwas lerne und in Zukunft vllt das ein oder andere auch mal selber hinbekomme. Bin halt lernbegierig!

Hoffe das mir hier vllt jemand helfen kann, vielen dank schonmal im vorraus!
serthy
trigger_multiple in die map mit KVP : targetname/soulsand_trigger
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:
|
init()
{
// alle trigger mit KVP : targetname/soulsand_trigger in ein array schreiben
trigger = getentArray( "soulsand_trigger" , "targetname" );
// alle einzelnen trigger rufen die Think()-funktion auf
for( i = 0 ; i < trigger.size ; i++ )
{
triggers[i] thread soulSandThink();
}
}
soulSandThink()
{
// self = ein trigger aus dem array
while( isDefined( self ) ) //solange es den trigger gibt...
{
self waittill( "trigger" , player ); // ...wartet er bis er von einem spieler ausgelöst wird
// falls der spieler am leben ist, soll er schneller laufen (soulSandTrigger()-funktion aufrufen)
// falls der spieler schon im trigger ist, ignore...
if( isAlive( player ) && player.sessionstate == "playing" && !isDefined( player.soulsandtrigger ) )
player thread soulSandTrigger( self );
// mit "thread" rufst du die funktion glaichzeitig auf, würde das fehlen wartet diese funktion solange bis die andere fertig ist
}
}
soulSandTrigger( trigger )
{
// self = der spieler
// falls dem spieler eines von den events passiert, stoppe die funktion
self endon( "disconnect" );
self endon( "death" );
// kleiner fix, sonst geht es nur 1x ^^
self thread onDeath();
// solange der spieler den trigger berührt, veränder den speed
while( isDefined( trigger ) && self isTouching( trigger ) && isAlive( self ) && self.sessionstate == "playing" )
{
self setMoveSpeedScale( 1.5 );
}
// falls er ihn nicht mehr berührt, wieder normal
self setMoveSpeedScale( 1.0 );
}
onDeath()
{
self.soulsandtrigger = undefined;
}
|
|
ich weiß allerdings nicht ob der geht, aber das ist was mir so sponatn dazzu einfiel
DjTranceFire
Danke, habs mal ausprobiert aber es scheint nicht zu funktionieren. Die Geschwindigkeit bleibt die selbe wenn man durchläuft..
Zeile 9 musste ich ändern weil er mit "triggers" nichts anfangen konnte, daran dürfte es aber wohl nicht liegen oder?^^
Da ich ja neu bin hier im Forum und dazu nichts gefunden habe frage ich hier einfach mal ganz direkt.. Wie siehts hier aus wenn es mehrere Probleme/Fragen gibt? Alles in einen Thread oder lieber mehrere aufmachen? Also wenn sie nicht grad was miteinander zutun haben..^^
serthy
habs getestet + geht, falls nicht, wschreib nochmal
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:
|
init()
{
// alle trigger mit KVP : targetname/soulsand_trigger in ein array schreiben
triggers = getentArray( "soulsand_trigger" , "targetname" );
// alle einzelnen trigger rufen die Think()-funktion auf
for( i = 0 ; i < triggers.size ; i++ )
{
triggers[i] thread soulSandThink();
}
}
soulSandThink()
{
// self = ein trigger aus dem array
while( isDefined( self ) ) //solange es den trigger gibt...
{
self waittill( "trigger" , player ); // ...wartet er bis er von einem spieler ausgelöst wird
// falls der spieler am leben ist, soll er schneller laufen (soulSandTrigger()-funktion aufrufen)
// falls der spieler schon im trigger ist, ignore...
if( isAlive( player ) && player.sessionstate == "playing" && !isDefined( player.soulsandtrigger ) )
player thread soulSandTrigger( self );
// mit "thread" rufst du die funktion glaichzeitig auf, würde das fehlen wartet diese funktion solange bis die andere fertig ist
}
}
soulSandTrigger( trigger )
{
// self = der spieler
// falls dem spieler eines von den events passiert, stoppe die funktion
self endon( "disconnect" );
self endon( "death" );
// kleiner fix, sonst geht es nur 1x ^^
self thread onDeath();
self.soulsandtrigger = true;
self thread onEnter();
// solange der spieler den trigger berührt, bleibe bei dem speed
while( isDefined( trigger ) && self isTouching( trigger ) && isAlive( self ) && self.sessionstate == "playing" )
{
wait( 1.0 );
self thread onTouch();
}
// falls er ihn nicht mehr berührt, wieder normal
self thread onExit();
self.soulsandtrigger = undefined;
self notify( "soulsand_exit" );
}
onDeath()
{
self endon( "soulsand_exit" );
self waittill( "death" );
self.soulsandtrigger = undefined;
}
onEnter()
{
// hier kommt das rein was passieren soll wenn du den trigger zum 1. mal berührst
self iprintln( "Enter" );
}
onTouch()
{
// hier das während du im trigger bist (wiederholt sich dann jede sekunde)
self iprintln( "..." );
}
onExit()
{
// hier das wenn du ihn wieder verlässt
self iprintln( "Exit" );
} |
|
DjTranceFire
Also irgendwie habe ich das Gefühl das ich momentan einfach zu dumm zum scripten bin..
Habe das ganze jetzt mal ausprobiert aber es funktioniert bei mir einfach nicht..
Irgendwo mach ich was verkehrt, nur wo?
Rechtsklick > Trigger > Multiple
targetname/soulsand_trigger
Dann das ganze in die .gsc rein und dann sollte doch eigentlich alles klappen oder?
serthy
genau mehr hab ich auch nicht gemacht
du musst natürlich das aufrufen in deiner mapname.gsc
also thread init();
und darunter dann mein script
DjTranceFire
Irgendwie bekomme ich das ganze nicht so richtig hin..
Hättest du vllt Zeit und Lust dich mal mit mir im TS zusammen zu setzen um mir bei dem Problem zu helfen? Irgendwo mache ich wohl einen entscheidenen Fehler.. :x
serthy
klar würde es mit TS gehen, aber dann wäre ja ein forum sinnlos
ich kann dir da auch nur erklären was ich hier schreiben würde, und mit cod4 modden (außer scripting) kenne ich mich nicht aus
mal eine checkliste:
- ist eine mapname.gsc vorhanden?
- wenn SP dann muss sie in maps-ordner
- wenn MP dann muss sie in den maps/mp-ordner
- in der mapname.gsc muss eine main() {} funktion sein
- in die main() schreibst du einfach thread init();
- dann fügst du den script ein
- map compilieren, ff erstellen, was auch immer nötig ist
- testen
DjTranceFire
Hab das Problem behoben..

Hab wärend ich auf eine Antwort gewartet habe mit einem anderem Script rumgespielt und dadurch gemerkt das ich "thread init();" an der falschen Stelle eingefügt habe..

Beim compilen dann grade mal in den Thread geguckt und deine Antwort gesehen..

Klappt alles wunderbar <3 Vielen Dank für deine Hilfe!