Zerstörbare Kisten (multiplayer)

T.R.Graves
Hallo zusammen

Ich habe mich mal hingesetzt und mich mal daran versucht eine zerstörebare Kiste zu
bauen.

Als erstes erstellt ihr ein script_model mit dem xmodel/crate01.

Danach macht ihr ein script_brushmodel gebt diesen die Textur Player_Clip.

Dieses script_brushmodel sollte die gleiche Grösse besitzen wie euer Model.

Danach macht ihr einen Brush und gebt diesem die Textur Trigger und macht daraus

einen Trigger-Damage.Gebt diesen Trigger den targetname crate_trigger.

Jetzt wählt ihr euren Trigger an und danach euer script_model(xmodel/crate01) und

drückt die Taste W. Jetzt sollte ein roter Pfeil vom Trigger auf euer Model zeigen.

Danach wählt ihr erneut euren Trigger an und danach euer script_brushmodel(textur player_clip)

und drückt erneut die taste w. Danach sollte ein blauer Pfeil vom Trigger auf euer Brushmodel zeigen.

Nun schiebt ihr euer Brushmodel(Player_clip) genau über euer Model.Somit könnt ihr im Spiel nicht mehr

durch euer Model laufen.

Jetzt schiebt ihr euer Trigger über das Model und den Playerclip. Er sollte etwas überstehen.

Das wars im Radianten.

Jetzt erstellt ihr euch eine crate.gsc und kopiert das untere script rein.
Diese crate.gsc legt ihr in das gleiche Verzeichnis wo eure map.gsc liegt.

Und jetzt müsst ihr in eure map.gsc noch folgende Zeile reinschreiben.

maps\mp\crate::main();

Für euren Sound schreibt ihr Folgende Zeile in eure Soundaliases.
Vorsicht nicht vergessen euren Mapnamen anzupassen.

crate,,doors/Door_WD_Kick.wav,0.72,0.8,,,,300,450,,streamed,,,,,,,,,,mp_eue
rmapname

Nachtrag: beim Laden der Map kommt es zu einer Fehlermeldung bezüglich des Sounds nicht weiter tragisch aber um Fehler zu vermeiden solltet ihr den Sound aus eurem Soundordner(Orginal) rausnehmen und umbenennen.
Und danach in eurem eigenem main/sound/misc Ordner legen.
Neue Soundaliases
crate,,misc/eurersoundname.mp3 oder wav,0.72,0.8,,,,300,450,,streamed,,,,,,,,,,mp_euermapname

Wie ihr im Script seht sind einige Befehle mit /// Zeichen davor. Wenn ihr diese entfernt
werden im Spiel bei Beschuss des Triggers die verschiedenen Schadenspunkte der Waffen angezeigt.
Desweiteren habe ich ein Damage befehl eingebaut so das die kiste nicht bei einem Schuss
kaputtgeht.Die Hitpoints stehen jetzt bei 200,je höher diese Zahl umso länger bleibt die
Kiste intakt.

main()
{
thread breaking_crate();
}
breaking_crate()
{
level._effect["crate_break"] = loadfx ("fx/explosions/grenadeExp_wood.efx");
level._effect["crate_dust"] = loadfx ("fx/props/crateExp_dust.efx");
precacheModel("xmodel/prop_destroyedcratecorner02");
precacheModel("xmodel/prop_destroyedcratecorner01");
ctrig = getentarray ("crate_trigger","targetname");
for (i=0; i<ctrig.size; i++) ctrig[i] thread crate_think();
}

crate_think()
{
dmg = 0; //Schadenzaehler
hitpoints = 200; //Schadenhoechstgrenze
wait(1);
/// iprintlnbold ("Start: DMG= ",dmg," HP= ",hitpoints);
while (dmg < hitpoints) //solange Schadenzaehler kleiner Hoechstgrenze ist
{
self waittill ("damage", amount); //Schaden der verwendeten Waffe ermitteln
dmg += amount; //Schaden aufsummieren
/// iprintln ("Health= ",self.health);//Schadensanzeige der verwendeten waffe--health
/// iprintln ("Schaden= ",amount);//Schadensanzeige der verwendeten waffe--hitpoints
/// iprintln ("DMG= ",dmg);//Schadensanzeige der verwendeten waffe dmg
if (dmg >= hitpoints) //wenn Schaden gleich oder hoeher der Hoechstgrenze is
{
//iprintlnbold ("crate broken!");
crate = getentarray(self.target,"targetname");
for (c=0; c<crate.size; c++) crate[c] thread crate_break();
wait.5;
self delete();
}
}
}

crate_break()
{
playfx (level._effect["crate_break"],self.origin);
deadcrate = spawn("script_model",(self.origin + (0,0,0)));
deadcrate setmodel("xmodel/prop_destroyedcratecorner02");
deadcrate playsound("crate");
deadcrate1 = spawn("script_model",(self.origin + (0,30,0)));
deadcrate1 setmodel("xmodel/prop_destroyedcratecorner01");
playfx (level._effect["crate_dust"],self.origin);

self delete();
}


Falls ihr Fragen oder Verbesserungsvorschläge habt schreibt es in diesen Tread.

Ciao
G*Skillz Jack
Hi

Das was du vorhast gibts auch als prefabs

in Activision\Call of Duty 2\map_source\prefabs\interactable_objects


das kann dir ja dabei etwas helfen
T.R.Graves
Ich denke diese Prefabs funktionieren nur im Singleplayer und dieses Script klappt auch im Multiplayer.

Ciao
bangingbernie
Richtig, die interactable_objects sind nur für Singleplayermaps.
Private Grob
Und dieses, sehr gute Tut von T.R.Graves wird ebenfalls in die Tutorial Sektion von CoD2 übernommen.

Klasse Arbeit !!!

Grüße
Private Grob
(Micka)
bangingbernie
...und die Kiste mal als Prefab.

Download: Filefront 2,49 kb

LG
Bernie
OLD MAN WITH GUN
Hätte da noch eine kleine Anregung.
Man kann auch jeder Kiste einen anderen Wert für den Maximalschaden mitgeben (damit z.B. kleine Kisten eher kaputt gehen als große Kisten).
Dazu dem trigger_damage noch folgendes hinzufügen:
Key: script_notewothy
Value: 200
Der Value bestimmt also den Maximalschaden und ist somit individuell anpassbar.
Im Script dann die Zeile
hitpoints = 200; //Schadenhoechstgrenze
durch folgende Zeile ersetzen
hitpoints = int(self.script_noteworthy); //Schadenhoechstgrenze
Private Grob
Nur mal so als Anmerkung zu sämtlichen zerstörbaren Dingen (Panzer, Fässer, Flaschen, etc). Leider ist es bei uns auf unserem Server (Admiralmod) so, daß sobald einer die erste Brandgranate wirft, alles zerstörbare automatisch mit in die Luft fliegt, egal wo die Dinger auf der Map stehen. Nervt dann doch etwas, zumal wenn die zerstörbaren Sachen dann respawnen und das spiel von vorne losgeht.

Deswegen lasse ich in meiner neuen Map diese Sachen alle weg.

Grüße
Private Grob
(Micka)
bangingbernie
...und noch eine Anmerkung:

Wenn Ihr das xmodel crate01 benutzt, solltet Ihr die FETT markierten Stellen im Script so ändern. Das sieht schöner aus, da die jew. Ecken der Größe der unzerstörten Kiste entsprechen.

crate_break()
{
playfx (level._effect["crate_break"],self.origin);
deadcrate = spawn("script_model",(self.origin + (0,-25,0)));
deadcrate setmodel("xmodel/prop_destroyedcratecorner02");
deadcrate playsound("crate");
deadcrate1 = spawn("script_model",(self.origin + (0,25,0)));
deadcrate1 setmodel("xmodel/prop_destroyedcratecorner01");
playfx (level._effect["crate_dust"],self.origin);

self delete();
}
Schulzi
Mir ist da mal was aufgefallen.
Wenn ich eine Kiste zerstöre, erscheint der dust Effekt nicht nur bei der Kiste, sondern auch bei den Koordinaten 0,0,0.
Kann man das irgendwie fixen?
Sieht nämlich ein bisschen doof aus, wenn plötzlich Rauch aus der Luft kommt.