Ist das in einer map möglich? Scripter gefragt (zufällige trigger verteilung)

Animus
da das scripten mir nicht so liegt (ich nicht kann) muß ich mal fragen ob es möglich ist das in einer map zu realisieren.

es soll sich um ein script handeln was trigger bei start der map per zufall verteilt(eine bestimmte anzahl). die trigger sind natürlich ausgeblendet nehmen wir mal an ich hab 10 gemacht. es sollen nun von den 10 wieder 3 zufällig ausgewählt werden die für den rest des spieles bleiben und aktiv sind, die anderen sollen inaktiv sein. alles so das bei jedem mapstart andere trigger aktiv sind so das keiner weis welche funktionieren und welche nicht.

ist das machbar kann mir jemand helfen wenn ja??
SN!P3R
also nach meiner vorstellung her ist das sicher machbar, kenne mich zwar noch nicht so gut im cod4 programmieren aus, aber im c++ schon...
Animus
hab mir mal überlegt das man das aus badmans script für buchstabenausblenden machen kann. aber ich weis nicht ob ich das mit trigger machen kann. aber bin da wie gesagt nicht gut in solchen sachen was einbinden von scripten und abändern angeht. hinterher geht immer nix mehr und die fehlermeldungen breiten sich aus.

Zitat:


b1 = getent("Buchstabe_1","targetname");
b2 = getent("Buchstabe_2","targetname");
b3 = getent("Buchstabe_3","targetname");
b4 = getent("Buchstabe_4","targetname");
b5 = getent("Buchstabe_5","targetname");

while(1)
{
b1 hide();
wait 1;
b2 hide();
wait 1;
b3 hide();
wait 1;
b4 hide();
wait 1;
b5 hide();
wait 1;
b1 show();
wait 1;
b2 show();
wait 1;
b3 show();
wait 1;
b4 show();
wait 1;
b5 show();
wait 1;
}
Marvin
Ich denke da gibt es schon eine Begrenzung. Ich würd auf der Map bei jedem Start ganz viele Trigger multiple stellen, dann einen clip drumbauen den nur von innen passieren kann. Sprich: Innenseite mit clip_ai belegen und die aussenseite mit clip_player. Die Trigger multiple werden dann mit den Triggern in deiner Map verteilt verbunden und damit sich einige Trigger nicht benutzen lassen musst du für jeden multiple Trigger einen elevator_script benutzen. Aber alle neu einscripten. Viel Spaß beim aufbauen, bin gespannt. Augenzwinkern

Lg Marvin

Edit: Ich würd nicht badmans script benutzen weil die Trigger dann nur blinken also sind alle für eine kurze Zeit benutzbar und dann wieder nicht...
Animus
@Marvin

keine ahnung was du mir damit sagen willst, versteh das nicht was du gepostet hast. das ele.script hat auch keinen zufallsgenerator für auswahl der trigger und einen aufzug will ich auch nicht bauen.
Marvin
Ich will damit sagen dass sich die Trigger bewegen. Also nimm den Trigger als Aufzug. Augenzwinkern
Animus
die trigger sollen sich nicht bewegen!! bessergesagt dürfen es nicht sonst ist die map nicht spielbar. sie liegen zu nahe bei einander und können weder zur seite noch nach oben oder unten verschoben werden. die trigger sollen effekte auslösen oder einen weiteren triggerhurt "dmg 100" wenn du verstehst. das ist ja mein problem und wie gesagt das ganze muss auf zufall basieren da die map sonst den reiz verliert.
Marvin
Aha,

jetzt weis ich was du meinst. cool

Darüber habe ich allerdings keine Ahnung...bestimmt gibt es irgendwo einen script dafür. Augenzwinkern
Animus
hat keiner ne idee oder einen kleinen knochen den er oder sie mir hinwerfen kann?

ok ich lass mal die katze aus dem sacke wie es werden soll! bei der map handelt es sich wieder mal um eine themenmap und zwar von the cube. ärger macht mir jetzt das scripten von den fallenräumen da die per zufall festgelegt werden sollen. nun bräuchte ich hilfe von einem guten scripter oder zumindest jemand der sagen kann ob es möglich ist oder nicht.
OLD MAN WITH GUN
Hab da mal eben schnell was zusammengestrickt

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:
#include maps\mp\_utility;
randomttrigger()
{
	
	//get all triggers and switch them off
	randomtrig = getentarray("randomtrigger","targetname");
	for (i = 0; i < randomtrig.size; i++)
		randomtrig[i] triggerOff();
	
	// now randomly turn on 3 of them
	level.t1 = randomintrange (1,randomtrig.size);
	randomtrig[level.t1] triggerOn();

	got_2nd = false;
	while(!got_2nd)
	{
		level.t2 = randomintrange (1,randomtrig.size);
		if (level.t2 != level.t1)
		{
			randomtrig[level.t2] triggerOn();
			got_2nd = true;
		}
	}	

	got_3rd = false;
	while(!got_3rd)
	{
		level.t3 = randomintrange (1,randomtrig.size);
		if (level.t3 != level.t1 && level.t3 != level.t2)
		{
			randomtrig[level.t3] triggerOn();
			got_3rd = true;
		}
	}	
}


Einfach allen Triggern (egal wie vielen) die du verwenden willst den targetname randomtrigger geben.
Der Script schaltet alle Trigger mit dem Namen randomtrigger aus, um anschließend 3 zufällig gewählte wieder einzuschalten.
wgs./w@Lly
Die Beta-Version der mp_chelm von Cod2 hatte doch sowas ähnliches, da waren verschiedene Durchgänge (Türen, Löcher, Fenster) entweder vorhanden oder weg, das wurde bei jedem Mapstart anders festgelegt.

Also machbar ist es und ich denke dass dies sich auch auf CoD4 umstricken ließe.
Animus
Danke Old Man With Gun!!!

hab mir über das script den schädel zerbrochen, da ich von scripten eigentlich nix verstehe. was jetzt noch probleme macht(hab das script noch nicht probiert obs geht. mach ich aber gleich) ist wie man mehr trigger wieder an machen kann. versteh den abgleich nicht mit an oder aus. mein cube hat 125 räume 3 fallen is da bisl wenig. hab so an 25 gedacht kannst du mir das hinzufügen erklären.

Zitat:


#include maps\mp\_utility;
randomttrigger()
{

//get all triggers and switch them off
randomtrig = getentarray("randomtrigger","targetname");
for (i = 0; i < randomtrig.size; i++)
randomtrig[i] triggerOff();

// now randomly turn on 3 of them
level.t1 = randomintrange (1,randomtrig.size); sucht per zufall einen aus
randomtrig[level.t1] triggerOn(); der ausgesuche wird aktiviert

got_2nd = false; ich nehme an der name der random2
while(!got_2nd)
{
level.t2 = randomintrange (1,randomtrig.size);
if (level.t2 != level.t1) den abgleich ob an oder nicht. das versteh ich nicht die würde ja sehr lang sein bei 25. wie ist der aufbau dieser zeile? zwischen 2 u. 3 nur ein ?
{
randomtrig[level.t2] triggerOn();
got_2nd = true;
}
}

got_3rd = false;
while(!got_3rd)
{
level.t3 = randomintrange (1,randomtrig.size);
if (level.t3 != level.t1 && level.t3 != level.t2)
{
randomtrig[level.t3] triggerOn();
got_3rd = true;
}
}
}


sorry hört sich bestimmt alles bisl dumm an was ich da schreibe aber 3 trigger aktiv reichen mir nicht. bekomme leider keine weitere zeile daraus assoziirt. könntest du mir noch eine "got_4rd" schreiben damit mir das system klar wird?

danke nochmal für die mühe die du dir gemacht hast!
steinacker
ich hab das script jetzt zwar nicht erstellt, aber nach meinen kenntnissen sollte das so sein:

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:
#include maps\mp\_utility;

randomttrigger()
{
	randomtrig = getentarray("randomtrigger","targetname");
	for (i = 0; i < randomtrig.size; i++)
		randomtrig[i] triggerOff();	//get all triggers and switch them off

	level.t1 = randomintrange (1,randomtrig.size);
	randomtrig[level.t1] triggerOn();	// now randomly turn on 3 of them

	got_2nd = false;
	while(!got_2nd)
	{
		level.t2 = randomintrange (1,randomtrig.size);
		
		if (level.t2 != level.t1)
		{
			randomtrig[level.t2] triggerOn();
			got_2nd = true;
		}
	}

	got_3rd = false;
	while(!got_3rd)
	{
		level.t3 = randomintrange (1,randomtrig.size);
		
		if (level.t3 != level.t1 && level.t3 != level.t2)
		{
			randomtrig[level.t3] triggerOn();
			got_3rd = true;
		}
	}

	got_4rd = false;
	while(!got_4rd)
	{
		level.t4 = randomintrange (1,randomtrig.size);
		
		if (level.t4 != level.t1 && level.t4 != level.t2 && level.t4 != level.t3)
		{
			randomtrig[level.t4] triggerOn();
			got_4rd = true;
		}
	}
}



wenn du jetzt noch einen fünften haben willst, dann kopierst du einfach den 4. part und änderst alle 4er in 5en und fügst bei der if-abfrage zusätzlich noch
&& level.t5 != level.t4
ein
Animus
danke steinacker!!!

Fehlermeldung:
also nach meinem wissen ist der name der scriptdatei in demfall doch egal aber er wirft mir immer fehler aus beim laden des script.

maps\mp\_randomt.gsc::main(); (pfad stimmt, dateiname auch schon verändert, zonefileeintrag auch schon nach oben verschoben)



hab natürlich das unveränderte von "Old Man With Gun" genommen!
OLD MAN WITH GUN
Ich bin in dem Script deiner obigen Beschreibung gefolgt, 10 Trigger von denen 3 zufällig da sein sollen. Desshalb ist der script so geschrieben, das bei der zufälligen auswahl der Trigger am Ende auch wirklich 3 Trigger wieder an sind. Es kann bei der Generierung der Zufallszahl ja durchaus passieren (und das leider nicht selten) das 2x die gleiche Zahl als Ergebnis raus kommt. Desshalb hab ich den Script so geschrieben, das er die zweite Zufallszahl mit der ersten vergleichen soll (ist sie gleich, soll eine andere generiert werden). Das Gleiche habe ich dann mit der 3 Zufallszahl gemacht (die wird mit der ersten und der zeiten verglichen und wird nur dann benutzt, wen sie sich von ihnen unterscheidet). Nur so werden auch sicher 3 Trigger aktiviert (und nicht nur einer oder 2). Je mehr Trigger aktiviert werden sollen, desto komplizierter wird es dann natürlich.
Bei 4 Triggern die da sein sollen, müsstest du die 4. Zahl mit allen 3 vorherigen vergleichen, beim 5. Trigger dann schon mit den 4 vorherigen usw.

um den Script mal ein wenig zu erklären

randomtrig = getentarray("randomtrigger","targetname"); //Ein Array mit dem Namen randomtrig bilden und mit allen Triggern füllen, die den targetname randomtrigger haben
for (i = 0; i < randomtrig.size; i++) //Schleife. Schleife so oft durchlaufen, bis i die Anzahl der Elemente im Array randomtrig erreicht hat (i beginnt bei 0 und wird pro durchlauf um 1 erhöht
randomtrig[i] triggerOff(); //das Element (den Trigger) mit der Nummer i im Array randomtrig ausschalten

level.t1 = randomintrange (0,randomtrig.size-1); //der Variablen level.t1 eine Zufallszahl zuweisen, die zwischen 0 und der Anzahl-1 der Elemente im Array randomtrig liegt
randomtrig[level.t1] triggerOn(); //Das Element (den Trigger), der im Array randomtrig an Position level.t1 steht, wieder einschalten
got_2nd = false; // der Variablen got_2nd den Wert "falsch" zuweisen (wird für die nächste Schleife benötigt)
while(!got_2nd) //die folgenden Zeilen so oft wiederholen, so lange die Variable got_2nd den Wert "falsch" hat
level.t2 = randomintrange (0,randomtrig.size-1); //der Variablen level.t2 eine Zufallszahl zuweisen, die zwischen 0 und der Anzahl-1 der Elemente im Array randomtrig liegt
if (level.t2 != level.t1) // Die Befehle innerhalb des if-Zweiges nur ausführen, wenn die Zufallszahl in der Variablen level.t2 sich von der Zufallszahl aus level.t1 unterscheidet. Sonst wird die Schleife wiederholt
randomtrig[level.t2] triggerOn(); //Das Element (den Trigger), der im Array randomtrig an Position level.t2 steht, wieder einschalten
got_2nd = true; // die Variable got_2nd auf "wahr" setzen. Somit wird die While-Schleife beendet.

got_3rd = false;// der Variablen got_3rd den Wert "falsch" zuweisen (wird für die nächste Schleife benötigt)
while(!got_3rd) //die folgenden Zeilen so oft wiederholen, so lange die Variable got_3rd den Wert "falsch" hat
level.t3 = randomintrange (0,randomtrig.size-1); //der Variablen level.t3 eine Zufallszahl zuweisen, die zwischen 0 und der Anzahl-1 der Elemente im Array randomtrig liegt
if (level.t3 != level.t1 && level.t3 != level.t2) // Die Befehle innerhalb des if-Zweiges nur ausführen, wenn die Zufallszahl in der Variablen level.t3 sich von der Zufallszahl aus level.t1 und der Zufallszahl aus level.t2 unterscheidet. Sonst wird die Schleife wiederholt
randomtrig[level.t3] triggerOn(); //Das Element (den Trigger), der im Array randomtrig an Position level.t3 steht, wieder einschalten
got_3rd = true; // die Variable got_3rd auf "wahr" setzen. Somit wird die While-Schleife beendet.

Edit: hab noch einen kleinen Fehler korrigiert. Ein Array beginnt bei 0 und nicht bei 1 darum die roten Passagen ändern.
OLD MAN WITH GUN

Zitat:

Original von Animus
danke steinacker!!!

Fehlermeldung:
also nach meinem wissen ist der name der scriptdatei in demfall doch egal aber er wirft mir immer fehler aus beim laden des script.
Der Name der Scriptdatei schon, aber nicht der Name der Funktion, die du in dieser Scriptdatei aufrufen willst.

Bei mir im Script heißt die Hauptfunktion randomtrigger()
Du versuchst aber eine Funktion mit den Namen main() aufzurufen, und die gibt es nicht (also error, unknown function)
also entweder nennst du im script die Funktion randomtrigger() um in main(), oder du rufst den Script mit maps\mp\_randomt::randomtrigger(); auf
Animus
ok hat geklappt aber jetzt sagt er das was mit dem script nicht stimmt:

OLD MAN WITH GUN
Schau mal mein Edit bei der Erklärung.

Du musst auch unbedingt mindestens 2 Trigger haben, bei einem geht es nicht. (Sieht in deiner Fehlermeldung nämlich so aus, als ob er versucht eine Zufallszahl zwischen 1 und 1 zu finden, was natürlich nicht geht.)
Animus
stimmt hatte zu wenig nur 3! hab 6 jetzt geht trotzdem nicht da sich mein recher aufhängt( eigentlich nur das spiel kann auf meinem 2tft weiter arbeiten aber cod läßt sich nicht beenden)

loadscreen läde fertig
dann kommt herausforderung wird gestartet ...1... (hier schreibt er nur noch die letzten 3 punkte immer und immer wieder)
aber die map startet nicht

kann es sein das er die trigger nicht unterscheiden kann? die haben ja alle den selben targetname und als test hab ich den einen hintstring verpasst. alle vollkommen gleich.
OLD MAN WITH GUN
Die müssen alle den gleichen Namen haben, sonst geht es nämlich nicht (unterschieden werden die durch ihre Position im Array).
Bei 3 hätte es aber gehen müssen. Sicher, das alle den gleichen Targetname haben?
In der Fehlermeldung von dir stand RandomIntRange parms: 1 1
Der Zweite Parameter sagt also, es ist nur 1 Element im Array und nicht 3.
Sonst hätte da RandomIntRange parms: 1 3 stehen müssen