[Tutorial] Zerstörbare Fenster *

Trudel
Morgen,
danke das ich mal wieder wer gemeldet hat.
Also das mit dem Text ist glaub ich nicht das Problem der Text ist mit // command Zeichen (so kenn ich es von C++) abgetrennt und wird einfach überlesen.Oder irre ich ?
Aber ich werde es heute Nachmittag mal ohne diese Text probieren.
Jetzt muss ich gleich zur Schule.

gruß Trudel
Trudel
Hey,
also ich habe jetzt mal ohne den Commmand Text versucht. Es hat leider wieder nicht geklappt. Noch einer ne Idee was ich falsch gemacht habe.

gruß Trudel
Marvin
Hast du schon "Build Fast File" Bei deiner Map gemacht? Könntest du mal deine mapname.gsc und dein Fenster-script posten?

mfg Marvin
Trudel
Okay,
meine gsc:

main()
{
maps\mp\_load::main();
}

und hier das FensterScript:

main()
{
windfx = loadfx ("props/car_glass_large");
windtrigs = getentarray("windtrig","targetname");
for(i=0;i<windtrigs.size;i++)
{
windtrigs[i] thread dowindow(windfx);
}
}

dowindow(windfx)
{
targetdamage=80;
totaldamage=0;
WindowShattered=false;
WindowBroken=false;
self enablegrenadetouchdamage();
NormalState = getent(self.target,"targetname");
ShatteredState = getent(NormalState.target,"targetname");ShatteredState hide();
BrokenState = getent(shatteredState.target,"targetname");BrokenState hide();
while(!windowbroken)
{
self waittill ("damage", amount,attacker, direction_vec, point, type);
totaldamage+=amount;
if(totaldamage>targetdamage || getdamagetype(type)=="melee")
{
WindowBroken=true;
}
if(!WindowShattered)
{
NormalState delete();
ShatteredState show();
WindowShattered=true;
}
}
BrokenState show();
//self playsound("glass_break");
PlayFX(windfx, BrokenState.origin );
ShatteredState delete();
self delete();
}

getDamageType(type)
{
if(!isdefined(type)){return "unknown";}
type = tolower(type);
switch(type)
{
case "mod_melee":
case "mod_crush":
case "melee":
return "melee";
default:
return "other";
}
}


gruß Trudel
Marvin
Also wenn das alles in deiner Mapname.gsc ist dann ist klar warum das ganze nicht geht. Über die Zeile:

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

code:
1:
maps\mp\_load::main();


Diese Eintragen:

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

code:
1:
maps\mp\_breakable_windows::main();


Das sieht dann so aus:

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

code:
1:
2:
3:
4:
5:
main() 
{ 
maps\mp\_breakable_windows::main();
maps\mp\_load::main();
}



Und noch diesen Eintrag bei Update Zone File auf der Rechten Seite vornehmen:
rawfile,maps/mp/_breakable_windows.gsc

mfg Marvin
Trudel
hab ich auch schon mal probiert gehabt, dann kommt beim compelieren der Reflection als auch beim Start eine ERROR Meldung "Script Runtime Error"
Marvin
Script Runtime Error kann viele Gründe haben kannst du mal einen Print machen und hier posten?

mfg Marvin
Trudel
Hey, werde ich machen so bald es mir möglich ist. Kann aber ein paar Wochen dauern, mein Pc hat sich so eben verabschiedet, hoffe ich kann meine map noch von der Festplatte retten

gruß Trudel
Ph3n0m PoWeR
Bei mir kommen keine Fehler, dafür funktioniert es nicht!

Ich habe drei script_brushmodels, ein normales Fenster, ein beschädigtes und eine Schicht aus NoDrawDecal in der selben Größe. Die sind mit dem trigger_damage verbunden. Ansonsten sind Script und CSV-Einträge so, wie sie sein sollten.

Wenn ich im Spiel bin, sehe ich zwei verschiedene Typen von defekten Fenstern:

1. Manche, die meisten, lassen sich durch Beschuss nicht zerstören und gehen erst nach einer Explosion sofort kaputt.

2. Seltener erscheinen welche, die sich im beschädigten Status befinden, die nach drei Schüssen mit dem Effekt aus dem Script zerfallen.

Ich habe für beide jedoch die gleichen Prefabs verwendet (???), warum läuft das nicht richtig? Diese Lösung ist immer besser als script_exploder.
Marvin
Manchmal braucht man mehrere Versuche bis alles richtig klappt. Vieleicht hast du
ja bei den ganzen Sachen die man für zerstörbare Fenster braucht einen Fehler gemacht.
Ich habe auch mehrere Anläufe gebraucht bis es geklappt hat. Hier fehlt dies, hier fehlt das.
Vllt auch Falsch verbunden oder so. Sonst würde mir nichts dazu einfallen als ein Fehler
der sich in die Sache eingeschmuggelt hat. Keinen Plan? (sorry)

mfg Marvin
Ph3n0m PoWeR
EDIT: Was sollte das denn? Ich habe mir BadMans Beispielfenster runtergelanden, und mich gewundert, was ich denn falsch gemacht haben könnte. Im Beispiel war der Trigger nicht genauso groß oder kleiner (tiefer) als das Fenster, sondern schaute darüber hinaus. Ich habe meine Fenster auch umgeändert, und plötzlich funktionieren sie alle einwandfrei...

Ihr könntet also im Haupttutorial ändern, dass der Trigger überlappen muss, und nicht eine Unit an jeder Seite ins Fenster reingehen soll.
Ph3n0m PoWeR
Ich habe einen weiteren Vorschlag, zerstörbare Fenster zu erstellen, für die Anfänger, die mit den Scripts verzweifeln:

Beim Mappen ist mir aufgefallen, dass die Script-Variante viel mehr Aufwand und Ressorucen erfordert. Dann habe ich mir nochmal das Prefab "com_copypaper_box" angesehen.

Wird die 200-Health-Schadensgrenze überschritten, so wird das Model gelöscht und der Effekt an der gleichen Stelle abgespielt, den man vorher bestimmt hat.

---------------------------------------------------------------------------


1.: Erstelle die Fensterscheibe, und verwandle sie in ein dyn_brushmodel.
2.: Gib dem Brushmodel im Entity-Editor (n) folgende Werte:

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

code:
1:
2:
3:
4:
5:
6:
Key: destroyEfx
Value: props\car_glass_large.efx
Key: health
Value: 300
Key: type
Value: destruct



3.: Kompiliere deine Map, und trage diese Zeile bei "Update Zone File" ein:

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

code:
1:
fx,props/car_glass_large



4.: Jetzt sollten die Scheiben nach 300 Schadenspunkten zerspringen.

---------------------------------------------------------------------------


In meiner Lösung gibt es keinen "Shattered"-Status, daher benutze ich beide Lösungen, je nach Nutzung.
SB*Silen.Ced
hi ich hab ne Frage:

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:
main()
{
windfx = loadfx ("props/car_glass_large");
windtrigs = getentarray("windtrig","targetname");
for(i=0;i<windtrigs.size;i++)
{
windtrigs[i] thread dowindow(windfx);
}
targetdamage = getentarray(targetdamage, "targetdamage");
for(i=0;i<targetdamage.size;i++);
}

dowindow(windfx)
{
targetdamage= getentarray(targetdamage, "targetdamage");
totaldamage=0;
WindowShattered=false;


kann ich im trigger dann sowas machen:

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

code:
1:
2:
3:
4:
tagetname   windtrig
targetdamage 10000


und dass er es im script dann aber auch annimmt?
(dass ich z.B. ein fenster "1000" damage hab und eins "20" oder so?)
MfG SB*Silen.Ced
OLD MAN WITH GUN
Ja und Nein,
Ja, du kannst jedem Fenster separat über den Trigger einen unterschiedlichen damage zuweisen.
Nein, aber nicht so, wie du es machen willst da das Spiel "targetdamage" nicht kennt (nebenbei, dein Script hätte auch so nicht funktioniert, selbst wenn das Spiel targetdamage kennen würde).

Du must dem trigger neben dem targetname noch einen Parameter hinzufügen der sich script_noteworthy nennt.
Also z.B.:
key: script_noteworthy
value: 1000

Damit definierst du dann den Wert für jeden Trigger.

Der Scriptteil sähe dan so aus:

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:
main()
{
	windfx = loadfx ( "props/car_glass_large" );
	windtrigs = getentarray( "windtrig", "targetname" );
	for( i = 0; i < windtrigs.size; i++ )
	{
		windtrigs[i] thread dowindow( windfx );
	}
}

dowindow( windfx )
{
	if( !isDefined( self.script_noteworthy ))			// check if the trigger have a script_noteworthy
		targetdamage = 80;					// if not, use value 80 for targetdamage
	else
		targetdamage = int( self.script_noteworthy );		// otherwise use its script_noteworthy as targetdamage
	
	totaldamage = 0;
	WindowShattered = false;
	WindowBroken = false;
	self enablegrenadetouchdamage();
	NormalState = getent( self.target,"targetname" );
	ShatteredState = getent( NormalState.target, "targetname" );
	ShatteredState hide();
	BrokenState = getent( shatteredState.target, "targetname" );
	BrokenState hide();
	while( !windowbroken )
	{
		self waittill( "damage", amount, attacker, direction_vec, point, type);
		totaldamage += amount;
		if( totaldamage > targetdamage || getdamagetype( type ) == "melee" )
		{
			WindowBroken = true;
		}
			if( !WindowShattered )
		{
			NormalState delete();
		ShatteredState show();
		WindowShattered = true;
	}
}

SB*Silen.Ced
bei mir funktioniert keine der bisher genannten varianten.
ich habe:
•UNZERBROCHEN script_brushmodel
•SHATTERED script_brushmodel
•ZERBROCHEN script_brushmodel
•Trigger_hurt:
->targetname: windtrig
->script_noteworthy: 1000
ich habe Trigger_hurt -> Unzerbrochen -> Shattered -> zerbrochen verbunden.
im script habe ich den teil von OMWG übernommen.
in der mp_scripttestmap.gsc steht:

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

code:
1:
2:
3:
4:
5:
6:
gabba()
{
     maps\mp\_breakable_windows::main();
     maps\mp\_load::main();
}


Anmerkung: wenn ich "main()" eintippte, kam script compile error:
bad Syntax 'main()' oder so.

nichts von den fenstern wird ausgeblendet, ich sehe von anfang an alle 3 stadien und kann nichts zerstören.
Es kommt kein error.
MfG SB*Silen.Ced
OLD MAN WITH GUN

Zitat:

Original von SB*Silen.Ced
in der mp_scripttestmap.gsc steht:

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

code:
1:
2:
3:
4:
5:
6:
gabba()
{
     maps\mp\_breakable_windows::main();
     maps\mp\_load::main();
}


in deiner mp_scripttestmap.gsc muss die erste Funktion unbedingt main() heißen. Das ist die einzige Funktion nach der das Spiel sucht und diese dann auch ausführt. Dein gabba() kennt das Spiel nicht. Somit wird die Funktion auch nicht aufgerufen und dann kann da natürlich nichts passieren. Es muss schon so lauten:

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

code:
1:
2:
3:
4:
5:
6:
main()
{
     maps\mp\_load::main();
     maps\mp\_breakable_windows::main();
}

SB*Silen.Ced
ja das weis ich. aber wenn ich "main()" hinschreibe, sagt der mir "Syntax Error".
bei beiden versionen gehts nicht und ich hab das ganze auch schon als dyn_brushmodel versucht und es hat nicht geklappt.
was könnte das sein?
MfG SB*Silen.Ced
OLD MAN WITH GUN

Zitat:

Original von SB*Silen.Ced
ja das weis ich. aber wenn ich "main()" hinschreibe, sagt der mir "Syntax Error".
Das liegt aber mit 100%er Sicherheit nicht am main(), sondern eher daran, das du irgendwo im Script einen Syntax error hast.
Es ist natürlich klar, das der Syntax error weg ist, wen keine main() Funktion da ist, da ja dann deine Scripts auch nicht ausgeführt werden (und was nicht ausgeführt wird, kann logischerweise auch keine Fehler verursachen, aber passieren tut dann halt auch nichts).

Das wäre so, als ob du ein Auto anlassen willst und vom Bordcomputer einen Motorfehler gemeldet bekommst.
Das die Fehlermeldung dann nicht kommt, wenn du versucht mit dem Autoschlüssel die Wohnung zu öffnen, dürfte dir dann auch klar sein. Aber der Wagen läuft dadurch auch nicht.

Starte deine map mal mit developer und developer_script. Dann bekommst du normalerweise auch Zeilen angezeigt, wo im Script der Fehler auftritt.
SB*Silen.Ced
hat sich erledigt. weis nicht, woran es lag.
aber der error lautete: 'Syntax Error:
unknown function 'main()' line 1"
ich habs auf ner neuen map versucht und es klappte.
----------------------------
kann ich auch sowas wie "script_noteworthy_2" oder so benutzen?
(will nähmlich sowas wie einen "repawn" der fenster einbauen.)
----------------------------
MfG SB*Silen.Ced
SB*Silen.Ced
Hi ich habe etwas herumgetüftelt und kam auf eine idee, wie man es hinbekommt, dass das Fenster bei berührung der Granaten zerbricht und die granate nicht abprallt, sondern durchfliegt, ohne dass ich den trigger vergrößern musste.
•1 Das fenster UNZERBROCHEN, Non- Kolliding, und ein deckungsgleiches Clip zu einem script_brushmodel machen.
•2 das gleiche nochmal für SHATTERED, script_brushmodel
•3 das Fenster BROKEN, Non- Kolliding, script_brushmodel
•4 trigger_damage überall eine Einheit größer als das Fenster
•5 Trigger_damage ---> UNZERBROCHEN ---> SHATTERED ---> BROKEN verbinden
•6 dem Trigger_damage:
• Key: targetname Value: windtrig
zuweisen.
PS: habe es an ca. 15 vereschiedenen fenstern getestet, funktioniert.
PPS: hier das Video:

MfG SB*Silen.Ced