[Tutorial] Zerstörbare Fenster * |
Trudel
Teetrinker
Dabei seit: 22.02.2009
Beiträge: 36
|
|
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
|
|
|
|
|
Ph3n0m PoWeR
Turnbeutelvergesser
Dabei seit: 16.01.2009
Beiträge: 292
|
|
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.
__________________ Mera dil hai hindustani.
|
|
|
|
|
Ph3n0m PoWeR
Turnbeutelvergesser
Dabei seit: 16.01.2009
Beiträge: 292
|
|
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 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 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.
__________________ Mera dil hai hindustani.
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von Ph3n0m PoWeR: 22.01.2010 20:07.
|
|
|
|
|
|
RE: "targetdamage" im entity einstellen? |
|
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 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;
}
} |
|
__________________
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.
|
|
|
|
|
|
RE: "targetdamage" im entity einstellen? |
|
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.
__________________
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 1 mal editiert, zum letzten Mal von OLD MAN WITH GUN: 01.07.2010 19:47.
|
|
|
|
|
SB*Silen.Ced
Tele-Tubbie
Dabei seit: 22.06.2010
Beiträge: 147
|
|
[Tutorial]Granaten durch das Fenster schießen, ohne dass sie abprallen |
|
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
__________________
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von SB*Silen.Ced: 08.07.2010 17:44.
|
|
|
|
|
|
|
|
Impressum ||Datenschutzerklärung
|