Explodierende Fässer (Multiplayer) |
|
|
| Explodierende Fässer (Multiplayer) |
 |
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 :-)



__________________

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von bangingbernie: 09.07.2006 16:49.
|
|
|
|
|
Verni@hter
*bM.Verni@hter~
Dabei seit: 24.01.2006
Beiträge: 1.461

|
|
Da hat sich einer ja richtig Mühe gegeben und des mal auf deutsch erklärt. Da sag ich nur, saubere Arbeit!
__________________

Frauen sind wie Signaturen, haste keine willste eine, haste eine willste ne andere.
My Facebook
|
|
|
|
|
|
|
| RE: Explodierende Fässer (Multiplayer) |
 |
Bin jetzt auch nicht so der QuakeC Profi aber wenn ich mir das Script anschaue dann würde ich fast vermuten, das du im Script selber nichts ändern mußt sondern nur in der Map die Fässer durchnummerieren mußt......
Also:
barrel1
barrel2
barrel3
etc.....
Wie gesagt, bin mir nicht sicher aber wenn ich mir die barrel Variablen im Script ansehe könnte man das fast vermuten. Probiere es doch einfach mal aus.
Bin jetzt leider das Wochenende über in Frankreich, sonst würde ich es selber mal ausprobieren.....
Grüße
Private Grob
(Micka)
|
|
|
|
|
|
|
Richtig, so habe ich es auch gemacht; einfach durchnummeriert. Wenn Du z.B. die Panzerschreck in die Map einbaust und dann auf ein Fass schießt, geht das gleich gut ab
__________________

|
|
|
|
|
T.R.Graves
*bM.sprite~
 
Dabei seit: 19.05.2006
Beiträge: 340

|
|
Ok habe alles so durchnummeriert wie ihr gesagt habt: Klappt super. Habe das script noch etwas geändert so das jetzt etwas ruckelt wenn die Fässer explodieren.
Einfach" earthquake(0.5, 3, self.origin +(0,0,12), 400);" unter der
Zeile" radiusDamage(self.origin + (0,0,12), 400, 200, 30);" eintragen.
__________________

Wie habe ich gemerkt, dass ich Gott bin:
Ich habe gebetet und stellte fest, dass ich Selbstgespräche führe.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von T.R.Graves: 24.07.2006 15:47.
|
|
|
|
|
|
|
Wichtig!!!
nennt eure barrels.gsc lieber meinemap_barrels.gsc, denn wenn man auf einem server mehrere maps mit einer barrels.gsc laufen hat, kann es vorkommen dass eine map nicht geht weil es 2 versionen von der barrels.gsc gibt.
Also nennt eure barrels.gsc so, dass sie eindeutig eurer map zugeordnet ist und keine fehler entstehen, vergesst nicht sie nachher auch richtig in der meinemap.gsc einzubinden
MfG -=CCL=-DESTROYER
|
|
|
|
|
|
|
Von FlesyM gibt's auch ein fertiges Prefab eines Fasses unter LINK.
Sehr praktisch; man kann das beliebig oft einfügen.
Bei Modsonline habe ich mal nachgefragt, ob der Clip nicht nach der Explosion gelöscht werden kann; ist schon blöd, wenn man gegen ein unsichtbares Hindernisss läuft.
Deswegen habe ich die Fässer auch bisher immer in Ecken, neben Kisten usw. gestellt.
Mal schauen, was daraus wird.
Bernie
__________________

|
|
|
|
|
|
|
Aha! Dann werde ich das am WE mal ausprobieren. Schönen Dank.
Gruss
Bernie
__________________

|
|
|
|
|
|
|
Danke für's hochladen, aber beim compilen kommt folgende Fehlermeldlung:
Map prefabs/Graves_Fass.map, Entity 0, Brush 0, Origin 2437.00000 4975.00000 60.00000: Model is an origin brush only.
Das Fass ist hinterher auch nicht zu sehen.
Schade.
Bernie
__________________

|
|
|
|
|
Matrixpro
Milupa-Fan
  
Dabei seit: 16.04.2006
Beiträge: 607

|
|
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,,,,,,,,
Hast du den text so stehen, oder alles in einer weil es muss in einer zeile stehen jetzt sind es ja so zu sagen 3 teile, jeder teil muss komplett in einer zeile stehen. cu
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Matrixpro: 04.09.2006 12:59.
|
|
|
|
|
|
|
|
 |
Impressum ||Datenschutzerklärung
|