yoda
Böser Admin
Dabei seit: 21.01.2004
Beiträge: 12.269

|
|
[Tutorial] Erstellung der Spielmodi * |
 |
Erstellung der Spielmodi
by bangingbernie & ergänzend games12345 @ CoD4-Wiki.de
Übersicht:
1 Global_intermission
2 Deathmatch (DM/Free-For-All)
3 Team Deathmatch (TDM/Team-Deathmatch)
4 Herrschaft (DOM/Domination)
5 Suchen und Zerstören (SD/Search and Destroy)
6 Headquarter (HQ/Headquarter)
7 Oldschool Modus
8 Sabotage (SAB)
9 Capture The Flag/Back (CTF/B)
Los geht´s!
Die verschieden Spielmodi könnt Ihr im 2D-Fenster des Radiant einbauen. Macht dort einen Rechtsklick und wählt "mp" im erscheinenden Fenster.

Ihr könnt natürlich auch einen Brush erstellen, geht in das "entity menu" (n-Taste), wählt den Namen aus (z.B. "mp_tdm_spawn") und drückt die Enter-Taste.
Die entsprechenden Prefabs findet Ihr unter "map_source/prefabs/MP".
Nun aber mal zum ersten Punkt, der "global_intermission".
Global_intermission
Wenn Ihr eine Multiplayermap als Zuschauer joint (oder auch am Ende einer Runde), seht Ihr, jedenfalls meistens, einen interessanten Ausblick auf die Map.
Dies habt Ihr der "global_intermission" zu verdanken, ohne die auch keine Map läuft.
Wir sind immer noch (nach Rechtsklick) im 2D-Fenster des Radiant und sehen unter "mp" den Punkt "mp/global_intermission". Wählt diese Einheit aus und plaziert sie so, dass Ihr den eben erwähnten Ausblick habt.
***
Deathmatch (DM/Free-For-All)
Plaziert "mp/dm_spawn" Einheiten nach Eurem Wunsch innerhalb der Map.

***
Team Deathmatch (TDM/Team-Deathmatch)
Hier geht Ihr wie bei den DM-Spawns vor. Plaziert die "mp/tdm/spawn" Einheiten an den gleichen Stellen, wie die DM-Spawns.


In der von Euch gewählten Basis der zwei Parteien setzt Ihr jeweils 8-12 "mp/tdm/spawn/allies_start" und "mp/tdm/spawn/axis_start" Einheiten. Diese Punkte sollten möglichst weit von einander entfernt sein, da man hier zu Beginn des Matches spawnt.
***
Herrschaft (DOM/Domination)
Für Herrschaft plaziert Ihr die "mp/dom/spawn" Einheiten in der Map; sie können auch zu den DM-Spawns gesetzt werden, aber beachtet, dass die Nähe zu einer Flagge bedingt, welche Spawnpunkte zu welcher Flagge verlinkt werden.
In die Basen setzt Ihr jeweils 9-16 "mp/dom/spawn/allies_start" und "mp/dom/spawn/axis_start" Einheiten. Für die Positionierung könnt Ihr die TDM-Basen benutzen.
Als nächstes müsst Ihr die drei Flaggen setzen. Mit einem Rechtsklick in der 2D-Ansicht wählt Ihr "misc/prefab" aus, öffnet den Ordner "map_source/prefabs/MP", sucht nacheinander für den Flaggenpunkt A "dom_flag_primary_a.map", für B "dom_flag_primary_b.map" und für C "dom_flag_primary_c.map" aus und plaziert sie an den von Euch ausgewählten Orten.
In der Nähe jeder Flagge müsst Ihr eine "script/origin" Einheit setzen (Rechstklick 2D-Fenster script -> origin). Das "script/origin" bestimmt, wo Freund und Feind spawnen, wenn die Flagge erobert wird. Dafür müsst Ihr im Entity-Fenster die entsprechenden "Key" und "Value" setzen.
Ein Beispiel für Flaggenpunkt B in einer linearen Map (Die Flaggen A B C in einer Reihe):


Folgende Werte (Beispiel Flagge B) müssen gesetzt werden:
Key: script_linkname Value: flag2 (Bestimmt die Flagge)
Key: script_linkto Value: flag1 flag2 (Bestimmt die spawns nach Eroberung / flag1=A, flag3=C)
Key: targetname Value: flag_descriptor (gilt für jede Flagge)
Die Flaggen A ("flag1")und C ("flag3) würden also einen "script_linkto" zu "flag2" benötigen.
In einer asymetrischen Map könnten allerdings andere Links nötig sein; das ist dann Eure Entscheidung ;-)
***
Suchen und Zerstören (SD/Search and Destroy)
Für S&D werden nur zwei Spawnpunkte vergeben. Plaziert 9-16 "mp/sd/spawn/attacker" Einheiten in die Basis der Angreifer und 9-16 "mp/sd/spawn/defender" Einheiten in die Basis der Verteidiger. Dies müssen nicht notwendigerweise die Basen der anderen Spielmodi sein, sondern sind davon abhängig, wo Ihr die zwei Bombenziele plaziert.

Die Bombe solltet Ihr weit genug von den Spawns der Angreifer einbauen, damit ein Spieler nicht automatisch beim spawnen diese aufsammelt. Die Bombe findet Ihr nach Rechtsklick im 2D-Fenster unter misc/prefabs/MP/"sd_bomb.map"

Damit die Bombe auch funktioniert, benötigt Ihr einen Trigger (2D-Fenster-Rechtsklick/misc/prefabs/MP/"sd_bombtrigger.map"). Den Trigger könnt Ihr platzieren, wo Ihr wollt - wir nehmen mal die obere linke Ecke Eurer Map.

Nun müsst Ihr natürlich die zwei Ziele erstellen ("sd_bombzone_nuke_a.map" und "sd_bombzone_nuke_b.map"). Die findet Ihr ebenfalls unter misc/prefabs/MP.

Beachtet bitte, dass diese generell näher beim Spawn der Verteidiger liegen sollten, um ihnen die Gelegenheit zu geben, Ihre Verteidigungsstellungen einnehmen zu können aber auch weit genug von einander entfernt, damit man nicht von einem Punkt beide Ziele verteidigen kann.
***
Headquarter (HQ/Headquarter)
Headquarter nutzt die TDM-Spawns, so dass keine Notwendigkeit besteht, eigene Spawnpunkte einzurichten. Um Eure Map HQ-tauglich zu machen, solltet Ihr bis zu sieben Headquarters plazieren. Das Innere von Gebäuden eignet sich dafür am besten.
Da man ja nicht in unmittelbarer Nähe eines HQ sein muss, um es einzunehmen, setzt Ihr einen "trigger/multiple" Brush um das geplante HQ (2D-Fenster-Rechtsklick/trigger/multiple) mit den Variablen
Key: "targetname"
Value: "radiotrigger"

Innerhalb dieser Trigger gehören nun die "war_hq_obj.map" Prefabs. Achtet bitte darauf, dass die Prefabs komplett innerhalb Eurer Brushes sind (2D-Fenster-Rechtsklick/misc/prefabs/MP/war_hq_obj.map).

***
Oldschool Modus
Um den "Olschool-Modus" in Eure Map einzubauen, benötigt Ihr nur einige Waffen und Perks, die Ihr in der Map plaziert. Die meisten Stock-Maps beinhalten jeweils eine Waffe aus einer Klasse und maximal zwei Perks.
Im 2D-Fenster wählt Ihr nach Rechtsklick eine Waffe mit "mp" im Namen aus und plaziert sie in Eure Map. Dann klickt Ihr im Entity-Fenster ("N"-Taste) "SUSPENDED" und "SPIN" an und tragt unter Key "targetname" und unter Value "oldschool_pickup" ein.


Um die Perks einzubauen, müsst Ihr unter "map_source/prefabs/MP/pickups" einen der Perks auswählen.


***
Sabotage (SAB)
Für Sabotage plaziert Ihr die "mp/sab/spawn/" Einheiten in der Map; sie können auch zu den DM-Spawns gesetzt werden.
In die Basen setzt Ihr jeweils 9-16 "mp/sab/spawn/allies" und "mp/sab/spawn/axis" Einheiten. Für die Positionierung könnt Ihr die TDM-Basen benutzen.
Als nächstes müsst Ihr in die Mitte der Map die Bombe plazieren. Macht einen Rechtsklick in euren 2D Fenster und sucht "misc_prefabs". Sucht nun unter "map_source/prefabs/MP" die Datei "sab_bomb.map" und platziert sie in der Mitte eurer Map.
Nun plaziert "sab_bomb_allies.map" in der Nähe der Basis der Allies und "sab_bomb_axis.map" in der Nähe der Basis der Axis.

***
Capture The Flag/Back (CTF/B)
In diesen Tutorial zeige ich euch wie ihr "Capture The Flag" bzw. "Capture The Flag Back" in eure Map einbauen könnt z.B. für den "AWE" Mod. CTF/B ist leichter einzubauen als "Domination". Öffne zuerst deine Map, erstelle einen "Brush" wo die Flaggen seien soll und gib den "Brush" die "Textur" "Trigger".

Erstelle einen anderen aber kleineren "Brush" und gib ihn die "Textur" "Origin". Da wo der kleine "Brush" ist wird die Flagge sein.
Wähle beide "Brushs" und drücke "N". Setzt die Werte "Key: targetname" und "Value: axis_flag"

Mache das selbe für die andere die andere Flagge aber du must "Value" ändern zu "allies_flag" CTF nutzt die "SAB" "spawns".
Wenn du das Spiel startst werden Automatisch die Flaggen dahin gesetzt wo du die "Brushes" hingesetzt hast.
***
Direkt verlinken:
https://www.opferlamm-clan.de/wbb2/thread.php?threadid=10526
***
__________________ "Fürs Internet sollte das Baumhaus-Prinzip gelten:
Wer zu alt ist, um ohne Hilfe reinzukommen, soll uns darin auch keine Vorschriften machen."
Diskutiere nie mit einem Idioten - zuerst zwingt er Dich auf sein Niveau herab und dann schlägt er Dich mit Erfahrung...
|
|
|
|
|
 | |
 |
|
|
CH und HTF funktionieren automatisch.
Du solltest aber alle standardgametypes in der Map haben, da diese gametypes die spawns unterschielicher standardgametypes benutzen.
Für CTF, CTFB und RE muss man in der map.gsc die benötigten spawns usw. scripten.
Das arena-file kannst du dir im übrigen sparen. Das funktioniert bei CoD4 bislang nicht. Es wird nur die CoD2maps.arena benutzt. Diese kann auch nur per Mod (nicht mit der Map) verändert werden (muss sich in der mod.ff befinden). In deiner Map wird sie einfach ignoriert (also nutzlos).
__________________
Da die Lichtgeschwindigkeit höher ist als die Schallgeschwindigkeit,
hält man so manchen für einen hellen Kopf, bis man ihn reden hört.
|
|
|
|
|
 |
|
|
CTF und CTFB musst du so einbauen, wie yoda es hier beschreiben hat (aber die Trigger nicht setzen). In der Map selber wird garnichts gemacht, alles wird rein aus der map.gsc gesteuert.
[Tutorial] Custom Spiel-Modi CTF und CTFB einbauen *
Für RE ist es ähnlich:
Das muss mit in die main()-Funktion deiner map.gsc
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:
|
if(getDvar("g_gametype") == "re")
{
level.objective_vcr = [];
level.objective_vcr[0] = spawn("script_model", (x, y, z)); //erster Punkt, wo das Videoband spawnen soll (x,y,z in deiner Map ermitteln und hier eintragen
level.objective_vcr[0].angles = (0,0,0);
level.objective_vcr[1] = spawn("script_model", (x, y, z)); //zweiter Punkt, wo das Videoband spawnen soll (x,y,z in deiner Map ermitteln und hier eintragen
level.objective_vcr[1].angles = (0, 0, 0);
level.objective_vcr[2] = spawn("script_model", (x, y, z)); //dritter Punkt, wo das Videoband spawnen soll (x,y,z in deiner Map ermitteln und hier eintragen
level.objective_vcr[2].angles = (0, 0, 0);
// Es können noch weitere Punkte angegeben werden
//dafür immer die zwei entsprechenden Zeilen kopieren, die Zahl in den eckigen Klammern erhöhen und entsprechende Koordinaten (x,y,z) eintragen
level.objective_vcrcase = [];
level.objective_vcrcase[0] = spawn("script_model", (x, y, z)); //erster Punkt, wo der Videorecorder spawnen soll (x,y,z in deiner Map ermitteln und hier eintragen
level.objective_vcrcase[0].angles = (0, 0, 0); //die Winkel kannst du natürlich auch ändern
level.objective_vcrcase[1] = spawn("script_model", (x, y, z)); //zweiter Punkt, wo der Videorecorder spawnen soll (x,y,z in deiner Map ermitteln und hier eintragen
level.objective_vcrcase[1].angles = (0, 0, 0);
level.objective_vcrcase[2] = spawn("script_model", (x, y, z)); //dritter Punkt, wo der Videorecorder spawnen soll (x,y,z in deiner Map ermitteln und hier eintragen
level.objective_vcrcase[2].angles = (0, 0, 0);
//auch hier kann man, wie beim Vidoband auch, entsprechend noch zusätzliche Spawns angeben
addobj_base("objective_base", (x, y, z), (0, 0, 0)); //Punkt (x,y,z auf deiner Map), zu dem das Videoband und der Videorecorder gebracht werden müssen
} |
|
Und das muss unterhalb der main()-Funktion rein
Code angehängt. Klicke hier zum Ein-/Ausblenden
| code: |
1:
2:
3:
4:
5:
6:
|
addobj_base(name, origin, angles)
{
ent = spawn("trigger_radius", origin, 0, 40, 48);
ent.targetname = name;
ent.angles = angles;
} |
|
Alles aus der gsc-Datei heraus zu machen hat dazu noch den Vorteil, das du die Spawns jederzeit noch verändern kannst, ohne die komplette Map noch einmal zu kompilieren (brauchst nur ein neues Fast File erzeugen).
__________________
Da die Lichtgeschwindigkeit höher ist als die Schallgeschwindigkeit,
hält man so manchen für einen hellen Kopf, bis man ihn reden hört.
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von OLD MAN WITH GUN: 01.06.2008 18:46.
|
|
|
|
|
steinacker
Milupa-Fan
  
Dabei seit: 13.03.2008
Beiträge: 662

|
|
das probier ich mal aus bei gelegenheit, muss mir da mal im radiant noch die geeigneten koordinaten rauslesen...
würde das auch bei hq(koth) und bei dom funktionieren, über das scripten, so wie das beim cod uo ist:
hier mal ein auszug aus der UO_flak88
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:
|
//Flag Setup
//There must be a set of the following for each flag in your map.
flag1 = getent("flag1","targetname"); // identifies the flag you're setting up
flag1.script_timer = 8; // how many seconds a capture takes with one player
flag1.description = "Abbey Ruins";
flag2 = getent("flag2","targetname");
flag2.script_timer = 12;
flag2.description = "Marsh Land";
flag3 = getent("flag3","targetname");
flag3.script_timer = 18;
flag3.description = "Bombed Church";
flag4 = getent("flag4","targetname");
flag4.script_timer = 12;
flag4.description = "Road to Beach";
flag5 = getent("flag5","targetname");
flag5.script_timer = 8;
flag5.description = "Bunker Complex";
//wait 0.5;
//parameters HeadQuarter
if (getcvar("g_gametype") == "hq")
{
radio = spawn ("script_model", (0,0,0));
radio.origin = (184, -8976, 98);
radio.angles = (0, 0, 0);
radio.targetname = "hqradio";
radio = spawn ("script_model", (0,0,0));
radio.origin = (388, -6428, 80);
radio.angles = (0, 0, 0);
radio.targetname = "hqradio";
radio = spawn ("script_model", (0,0,0));
radio.origin = (2424, -4208, -102);
radio.angles = (0, 180, 0);
radio.targetname = "hqradio";
radio = spawn ("script_model", (0,0,0));
radio.origin = (-3408, -5108, -6);
radio.angles = (0, 0, 0);
radio.targetname = "hqradio";
}
|
|
__________________ Steinacker, Hans Adam - der letzte Scharfrichter von Bad Mergentheim
der mit der Schärfe eines Schwertes richtende
|
|
|
|
|
 | |
|
|
Linear: A---B---C (in einer Reihe)
Nicht linear: Im Norden A, jeweils im Osten und Westen B + C
__________________

|
|
|
|
|
|
|
Natürlich kannst Du auch noch D + E verwenden; intelligenterweise hat IW allerdings keine Sounds (wie Flagge D/E wird eingenommen etc.) für diese Flaggen eingebaut (kann man schön bei der Map Pripyat ausprobieren).
Die anderen .map-Dateien sagen mir im Moment nichts; müsste ich selbst nachschauen, ob das dokumentiert ist.
__________________

|
|
|
|
|
Verni@hter
*bM.Verni@hter~
Dabei seit: 24.01.2006
Beiträge: 1.461

|
|
Könnte mir bitte mal jemand erklären wie der Gametype Retrival funktioniert oder wie man das spielt?
Ich stelle es mir im Moment so vor:
zum Videoband laufen aufnehmen und zum Videorecorder laufen und aufnehmen, mit diesen Dingen zur Base gehen von der es nur eine gibt und einnehmen wie bei ctf und dann das nächste Zeugs aufheben usw. hat man alles zusammen hat man die Runde gewonnen?
Wie spawnen die Bänder und Recorder, nach dem Script von oben nach unten abgearbeitet oder aus dem Script zufällig wie bei HQ?
Gruss
__________________

Frauen sind wie Signaturen, haste keine willste eine, haste eine willste ne andere.
My Facebook
|
|
|
|
|
|
|
Mmmh, spiele das so selten, dass ich das noch nicht so beobachtet habe. Ist vllt. das aus der koth.gsc:
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:
|
PickRadioToSpawn()
{
// find average of positions of each team
// (medians would be better, to get rid of outliers...)
// and find the radio which has the least difference in distance from those two averages
avgpos["allies"] = (0,0,0);
avgpos["axis"] = (0,0,0);
num["allies"] = 0;
num["axis"] = 0;
for ( i = 0; i < level.players.size; i++ )
{
player = level.players[i];
if ( isalive( player ) )
{
avgpos[ player.pers["team"] ] += player.origin;
num[ player.pers["team"] ]++;
}
}
if ( num["allies"] == 0 || num["axis"] == 0 )
{
radio = level.radios[ randomint( level.radios.size) ];
while ( isDefined( level.prevradio ) && radio == level.prevradio ) // so lazy
radio = level.radios[ randomint( level.radios.size) ];
level.prevradio2 = level.prevradio;
level.prevradio = radio;
return radio;
}
avgpos["allies"] = avgpos["allies"] / num["allies"];
avgpos["axis" ] = avgpos["axis" ] / num["axis" ];
bestradio = undefined;
lowestcost = undefined;
for ( i = 0; i < level.radios.size; i++ )
{
radio = level.radios[i];
// (purposefully using distance instead of distanceSquared)
cost = abs( distance( radio.origin, avgpos["allies"] ) - distance( radio.origin, avgpos["axis"] ) );
if ( isdefined( level.prevradio ) && radio == level.prevradio )
{
continue;
}
if ( isdefined( level.prevradio2 ) && radio == level.prevradio2 )
{
if ( level.radios.size > 2 )
continue;
else
cost += 512;
}
if ( !isdefined( lowestcost ) || cost < lowestcost )
{
lowestcost = cost;
bestradio = radio;
}
}
assert( isdefined( bestradio ) );
level.prevradio2 = level.prevradio;
level.prevradio = bestradio;
return bestradio;
} |
|
__________________

|
|
|
|
|
steinacker
Milupa-Fan
  
Dabei seit: 13.03.2008
Beiträge: 662

|
|
die radios und videos spawnen zufällig und die spawns der axis und allies werden vertauscht
deshalb hab ich bei mir eine abfrage eingebaut und die attacker und die defender anders definiert
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:
|
////////////////////////////////////////////////////////////////////Gametype Retrieval////////////////////
if(getDvar("g_gametype") == "re")
{
game["attackers"] = "allies";
game["defenders"] = "axis";
level.objective_vcr = [];
level.objective_vcr[0] = spawn("script_model", (0, 1984, -376)); //erster Punkt, Videorecorder
level.objective_vcr[0].angles = (0, 0, 0);
level.objective_vcr[1] = spawn("script_model", (2090, 664, -46)); //zweiter Punkt, Videorecorder
level.objective_vcr[1].angles = (0, 0, 0);
level.objective_vcrcase = [];
level.objective_vcrcase[0] = spawn("script_model", (0, 1664, 8)); //erster Punkt, Videoband
level.objective_vcrcase[0].angles = (0, 0, 0);
level.objective_vcrcase[1] = spawn("script_model", (3180, 1954, 32)); //zweiter Punkt, Videoband
level.objective_vcrcase[1].angles = (0, 0, 0);
addobj_base("objective_base", (2757, -2400, -408), (0, 0, 0)); //retrieval target
} |
|
__________________ Steinacker, Hans Adam - der letzte Scharfrichter von Bad Mergentheim
der mit der Schärfe eines Schwertes richtende
|
|
|
|
|
|
|
 |
Impressum ||Datenschutzerklärung
|