bangingbernie
Tutorial für explodierende Fässer (Multiplayer) / Englisches Original von FlesyM
1. Radiant
Erstellt ein script_model mit jedem xmodel eines Fasses, welches Ihr benutzen wollt.
(Rechtsklick 2D-Fenster -> script_model, xmodel auswählen und dann dorthin platzieren, wo
Ihr es hinhaben wollt)
Taste "N" drücken und dann unter "Key" targetname und unter "Value" barrel# eingeben, wobei
die Raute für eine Zahl steht, falls Ihr mehrere Fässer benutzen wollt.
Dann erstellt einen trigger_damage, der das Fass ziemlich eng umfasst.
(Rechtsklick 2D-Fenster -> trigger/damage und dann die entsprechende Grösse eingeben)
Klickt "MELEE_NO" an, damit beim bashen kein Fass explodiert. ;-)
Dann die folgenden Werte eingeben:
"target" barrel#
"targetname" barrel_trig
Dann erstellt Ihr ein script_brushmodel aus einem clip brush, der das Fass umgibt (gleiche Grösse wie der trigger)
und einen origin brush, der sich mit dem script_model deckt, damit kein Spieler durch das Fass läuft.
(Jedes script_brushmodel braucht einen origin brush; die Texturen findet Ihr im tools-Untermenü. Alle brushes auswählen,
inklusive des origin_brush. Rechtsklick 2D-Fenster -> shift und Linksklick, um nur einen brush der entity zu wählen; shift,
alt und Linksklick, um die ganze entity auszuwählen)
Entsprechend dem trigger gebt Ihr nun die folgenden Werte ein:
"target" barrel#
"targetname" barrel_clip
2. Scripting
Erstellt eine neue Text-Datei und gebt Ihr den Namen barrels.gsc (kommt dann im iwd-File in maps/mp).
Tragt dort folgendes ein:
barrelInit()
{
level._effect["barrel_fire"] = loadfx ("fx/fire/tank_fire_engine.efx");
level._effect["barrel_explosion"] = loadfx("fx/explosions/ammo_supply_exp.efx");
precacheModel("xmodel/prop_barrel_black");
barrel_trig = getentarray("barrel_trig", "targetname");
barrel_clip = getentarray("barrel_clip", "targetname");
//nebeneinander stehende Fässer explodieren ebenfalls
for( k = 0 ; k < barrel_trig.size ; k++ ) {
barrel1 = getent(barrel_trig[k].target, "targetname");
barrel1.trig = barrel_trig[k];
level.barrels[k] = barrel1;
}
for( k = 0 ; k < barrel_clip.size ; k++ ) {
barrel2 = getent(barrel_clip[k].target, "targetname");
barrel2.clip = barrel_clip[k];
}
//Zustand (explodiert/nicht explodiert) und Namen der Fässer, Löst dann den thread für jedes Fass aus
for( k = 0 ; k < level.barrels.size ; k++ ) {
level.barrels[k].name = "barrel ^" + k + "#" + k;
level.barrels[k].exploded = false;
level.barrels[k].soundOrigin = spawn("script_origin", level.barrels[k].origin);
level.barrels[k] thread barrelThink();
}
}
barrelThink()
{
if (self.exploded == true)
wait(120);
self entityOn();
self.trig entityOn();
self.clip entityOn();
self.accDamage = 0;
self.onfire = false;
self.exploded = false;
while(isdefined (self))
{
self.trig waittill("damage", amount);
self.accDamage = self.accDamage + amount;
//iprintlnbold(self.name + " 's damage = " + self.accDamage);
if (self.exploded != true)
{
if (self.accDamage > 80 && self.onfire != true) //catch fire
{
self.onfire = true;
self thread barrelFire(); //fire start
self thread barrelFireDamage(); //self injury start
}
if (self.accDamage > 80 && self.onfire == true)
{
//nothing
}
if (self.accDamage > 200) //explosion
{
self.onfire = false;
self.exploded = true;
self.soundOrigin playsound("barrel_explosion_imminent");
wait(4); //lenght of sound file
self thread barrelExplode();
self.trig entityOff();
self.clip entityOff();
self entityOff();
self barrelThink();
break;
}
} else //(self.exploded == true)
break;
}
}
//Schaden. Nur ein thread pro Fass
barrelFireDamage()
{
while (self.exploded != true)
{
self.trig notify ("damage", 10);
wait(randomint(2)+1);
}
}
//FX wird ausgelöst. Nur ein thread pro Fass existiert
barrelFire()
{
while(self.exploded != true) //keeps playing the effect until exploded
{
self.soundOrigin playsound("barrel_fire");
playfx(level._effect["barrel_fire"], self.origin + (0,0,32));
radiusDamage(self.origin + (0,0,12), 75, 10, 0);
wait(2);
}
}
barrelExplode()
{
//Nebenstehende Fässer explodieren; abhängig vom Schadensradius
for (k = 0; k < level.barrels.size; k++)
{
if ( level.barrels[k].exploded != true && level.barrels[k] != self)
{
dist = distance(level.barrels[k].origin, self.origin);
if (dist < 100 && dist != 0)
level.barrels[k].trig notify("damage", ((1-(dist/100))*100)+100); // zwischen 100 und 200 Schaden
}
}
self.soundOrigin playsound("barrel_explosion");
playfx(level._effect["barrel_explosion"], self.origin);
//Rundherum grosser Schaden
radiusDamage(self.origin + (0,0,12), 400, 200, 30);
//self.trig notify ("damage", 5); //Finale Explosion
}
//Fässer-Respawn
entityOff()
{
if (!isdefined (self.realOrigin))
self.realOrigin = self.origin;
if (self.origin == self.realorigin)
self.origin += (0, 0, -10000);
}
entityOn()
{
if (isDefined (self.realOrigin) )
self.origin = self.realOrigin;
}
3. Auslösen des Thread
Tragt in Eure mp_EureMap.gsc folgendes ein:
maps\mp\barrels::barrelInit();
Das sollte dann so aussehen:
main()
{
maps\mp\mp_EureMap_fx::main(); //falls Ihr eine fx.gsc habt
maps\mp\barrels::barrelInit();
maps\mp\_load::main();
//...usw.
}
Damit Ihr auch den entsprechenden Sound habt, tragt Ihr in Eurer csv.Datei im soundaliases-Ordner
noch folgende Werte ein:
barrel_explosion,,explosions/exp_armoredcar.wav,0.8,1,,,,50,1000,local,stre
amed,,,,mp_EureMap,,,,,,,,
barrel_explosion_imminent,,misc/metal_stress01.wav,0.6,1,,,,50,500,local,st
reamed,,,,mp_EureMap,,,,,,,,
barrel_fire,,fire/Fire_Sm_loop01.wav,0.01,1,,,,50,400,auto,streamed,,,,mp_E
ureMap,,,,,,,,
Das War's.
Falls ich was vergessen/falsch übersetzt habe; hier ist der Original-Thread:
http://www.modsonline.com/Forums-top-22940.html
P.S.: Wenn Ihr ein's der folgenden Fässer verwendet, fällt die Prozedur des Erstellens eines script_brushmodels und origin brush weg, da es hierfür collmaps gibt:
prop_barrel_benzin
prop_barrel_benzin_snow
prop_barrel_benzin_wet
Dann folgendes in der barrels.gsc weglassen:
barrel_clip = getentarray("barrel_clip", "targetname");
und
for( k = 0 ; k < barrel_clip.size ; k++ ) {
barrel2 = getent(barrel_clip[k].target, "targetname");
barrel2.clip = barrel_clip[k];
}
Funktioniert einwandfrei; Bilder anbei :-)




1. Radiant
Erstellt ein script_model mit jedem xmodel eines Fasses, welches Ihr benutzen wollt.
(Rechtsklick 2D-Fenster -> script_model, xmodel auswählen und dann dorthin platzieren, wo
Ihr es hinhaben wollt)
Taste "N" drücken und dann unter "Key" targetname und unter "Value" barrel# eingeben, wobei
die Raute für eine Zahl steht, falls Ihr mehrere Fässer benutzen wollt.
Dann erstellt einen trigger_damage, der das Fass ziemlich eng umfasst.
(Rechtsklick 2D-Fenster -> trigger/damage und dann die entsprechende Grösse eingeben)
Klickt "MELEE_NO" an, damit beim bashen kein Fass explodiert. ;-)
Dann die folgenden Werte eingeben:
"target" barrel#
"targetname" barrel_trig
Dann erstellt Ihr ein script_brushmodel aus einem clip brush, der das Fass umgibt (gleiche Grösse wie der trigger)
und einen origin brush, der sich mit dem script_model deckt, damit kein Spieler durch das Fass läuft.
(Jedes script_brushmodel braucht einen origin brush; die Texturen findet Ihr im tools-Untermenü. Alle brushes auswählen,
inklusive des origin_brush. Rechtsklick 2D-Fenster -> shift und Linksklick, um nur einen brush der entity zu wählen; shift,
alt und Linksklick, um die ganze entity auszuwählen)
Entsprechend dem trigger gebt Ihr nun die folgenden Werte ein:
"target" barrel#
"targetname" barrel_clip
2. Scripting
Erstellt eine neue Text-Datei und gebt Ihr den Namen barrels.gsc (kommt dann im iwd-File in maps/mp).
Tragt dort folgendes ein:
barrelInit()
{
level._effect["barrel_fire"] = loadfx ("fx/fire/tank_fire_engine.efx");
level._effect["barrel_explosion"] = loadfx("fx/explosions/ammo_supply_exp.efx");
precacheModel("xmodel/prop_barrel_black");
barrel_trig = getentarray("barrel_trig", "targetname");
barrel_clip = getentarray("barrel_clip", "targetname");
//nebeneinander stehende Fässer explodieren ebenfalls
for( k = 0 ; k < barrel_trig.size ; k++ ) {
barrel1 = getent(barrel_trig[k].target, "targetname");
barrel1.trig = barrel_trig[k];
level.barrels[k] = barrel1;
}
for( k = 0 ; k < barrel_clip.size ; k++ ) {
barrel2 = getent(barrel_clip[k].target, "targetname");
barrel2.clip = barrel_clip[k];
}
//Zustand (explodiert/nicht explodiert) und Namen der Fässer, Löst dann den thread für jedes Fass aus
for( k = 0 ; k < level.barrels.size ; k++ ) {
level.barrels[k].name = "barrel ^" + k + "#" + k;
level.barrels[k].exploded = false;
level.barrels[k].soundOrigin = spawn("script_origin", level.barrels[k].origin);
level.barrels[k] thread barrelThink();
}
}
barrelThink()
{
if (self.exploded == true)
wait(120);
self entityOn();
self.trig entityOn();
self.clip entityOn();
self.accDamage = 0;
self.onfire = false;
self.exploded = false;
while(isdefined (self))
{
self.trig waittill("damage", amount);
self.accDamage = self.accDamage + amount;
//iprintlnbold(self.name + " 's damage = " + self.accDamage);
if (self.exploded != true)
{
if (self.accDamage > 80 && self.onfire != true) //catch fire
{
self.onfire = true;
self thread barrelFire(); //fire start
self thread barrelFireDamage(); //self injury start
}
if (self.accDamage > 80 && self.onfire == true)
{
//nothing
}
if (self.accDamage > 200) //explosion
{
self.onfire = false;
self.exploded = true;
self.soundOrigin playsound("barrel_explosion_imminent");
wait(4); //lenght of sound file
self thread barrelExplode();
self.trig entityOff();
self.clip entityOff();
self entityOff();
self barrelThink();
break;
}
} else //(self.exploded == true)
break;
}
}
//Schaden. Nur ein thread pro Fass
barrelFireDamage()
{
while (self.exploded != true)
{
self.trig notify ("damage", 10);
wait(randomint(2)+1);
}
}
//FX wird ausgelöst. Nur ein thread pro Fass existiert
barrelFire()
{
while(self.exploded != true) //keeps playing the effect until exploded
{
self.soundOrigin playsound("barrel_fire");
playfx(level._effect["barrel_fire"], self.origin + (0,0,32));
radiusDamage(self.origin + (0,0,12), 75, 10, 0);
wait(2);
}
}
barrelExplode()
{
//Nebenstehende Fässer explodieren; abhängig vom Schadensradius
for (k = 0; k < level.barrels.size; k++)
{
if ( level.barrels[k].exploded != true && level.barrels[k] != self)
{
dist = distance(level.barrels[k].origin, self.origin);
if (dist < 100 && dist != 0)
level.barrels[k].trig notify("damage", ((1-(dist/100))*100)+100); // zwischen 100 und 200 Schaden
}
}
self.soundOrigin playsound("barrel_explosion");
playfx(level._effect["barrel_explosion"], self.origin);
//Rundherum grosser Schaden
radiusDamage(self.origin + (0,0,12), 400, 200, 30);
//self.trig notify ("damage", 5); //Finale Explosion
}
//Fässer-Respawn
entityOff()
{
if (!isdefined (self.realOrigin))
self.realOrigin = self.origin;
if (self.origin == self.realorigin)
self.origin += (0, 0, -10000);
}
entityOn()
{
if (isDefined (self.realOrigin) )
self.origin = self.realOrigin;
}
3. Auslösen des Thread
Tragt in Eure mp_EureMap.gsc folgendes ein:
maps\mp\barrels::barrelInit();
Das sollte dann so aussehen:
main()
{
maps\mp\mp_EureMap_fx::main(); //falls Ihr eine fx.gsc habt
maps\mp\barrels::barrelInit();
maps\mp\_load::main();
//...usw.
}
Damit Ihr auch den entsprechenden Sound habt, tragt Ihr in Eurer csv.Datei im soundaliases-Ordner
noch folgende Werte ein:
barrel_explosion,,explosions/exp_armoredcar.wav,0.8,1,,,,50,1000,local,stre
amed,,,,mp_EureMap,,,,,,,,
barrel_explosion_imminent,,misc/metal_stress01.wav,0.6,1,,,,50,500,local,st
reamed,,,,mp_EureMap,,,,,,,,
barrel_fire,,fire/Fire_Sm_loop01.wav,0.01,1,,,,50,400,auto,streamed,,,,mp_E
ureMap,,,,,,,,
Das War's.
Falls ich was vergessen/falsch übersetzt habe; hier ist der Original-Thread:
http://www.modsonline.com/Forums-top-22940.html
P.S.: Wenn Ihr ein's der folgenden Fässer verwendet, fällt die Prozedur des Erstellens eines script_brushmodels und origin brush weg, da es hierfür collmaps gibt:
prop_barrel_benzin
prop_barrel_benzin_snow
prop_barrel_benzin_wet
Dann folgendes in der barrels.gsc weglassen:
barrel_clip = getentarray("barrel_clip", "targetname");
und
for( k = 0 ; k < barrel_clip.size ; k++ ) {
barrel2 = getent(barrel_clip[k].target, "targetname");
barrel2.clip = barrel_clip[k];
}
Funktioniert einwandfrei; Bilder anbei :-)




Zitat: