|
 |
[Tutorial] Zerstörbare Fenster     |
BadMan
Turnbeutelvergesser
 
Dabei seit: 31.01.2008
Beiträge: 278

|
|
[Tutorial] Zerstörbare Fenster |
 |
Hi,
so ich mach mal ein Tut für zerstörbare fenster welches bestimmt auch einige von CoD 4 kennen.
Wieso mache ich das eigentlich? Werden sich jetzt einige fragen. Naja zum einen habe ich ein paar Dinge geändert, außerdem werden sich einige Fragen wieso geht das da? Und so kann ich eventuell ja auch ein paar andere Mapper zum Tutorial schreiben anregen.
Also gut als erstes das Tut von CoD 4 funzt auch noch. Allerdings muss man Effekt und Sound anpassen. Link
Jetzt zum Tut
1. Das Skript
_breakable_windows.gsc
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:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
|
// ---------------------------------------
// Zerstörbare Fenster Geänderte Version 1.1 by BadMan
// Letztes Update: Sonntag, 30. November 2008
// ---------------------------------------
// ---------------------------------------
// Zerstörbare Fenster Version 1.1 by -=FD=-
// Letztes Update: Freitag, 22. Februar 2008
// ---------------------------------------
//
// Dieses Script ermöglicht den Einbau von Fenstern, die nach einer gewissen beschädigung zerbrechen
// Ich habe versucht es so einfach wie möglich zu halten um die Nutzung zu vereinfachen.
// Es enthält einen “Zerbrochen”-Status für das Fenster (wie z. B. bei den Autos!)
// Man kann allerdings NOCH keine Granaten durch das Fenster werfen, um es zu zerbrechen…
// Um die Höhe der Beschädigung zu ändern, die das Fenster vertragen kann, musst Du den Wert bei 'targetdamage' anpassen.
// Credit an: Tally, der mir beim Einstieg ins Scripten geholfen hat.
// Credit an: noobCODmapper und Ghost Death für das Script auf modsonline.com, das mich hierzu inspiriert hat.
// Credit an: IW für dieses großartige Game und die Freigabe der Tools, so dass wir überhaupt damit arbeiten können!
main()
{
windfx = loadfx ("maps/sniper/fx_glass_break");
windtrigs = getentarray("fenster","targetname");
for(i=0;i<windtrigs.size;i++)
{
windtrigs[i] thread dowindow(windfx);
}
}
dowindow(windfx)
{
targetdamage=80;
totaldamage=0;
WindowShattered=false;
WindowShatteredtwo=false;
WindowBroken=false;
self enablegrenadetouchdamage();
NormalState = getent(self.target,"targetname");
ShatteredState = getent(NormalState.target,"targetname");ShatteredState hide();
ShatteredStatetwo = getent(shatteredState.target,"targetname");ShatteredStatetwo hide();
BrokenState = getent(shatteredStatetwo.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;
}
else if(!WindowShatteredtwo)
{
ShatteredState delete();
ShatteredStatetwo show();
WindowShatteredtwo=true;
}
}
BrokenState show();
self playsound("glass_pane_break");
PlayFX(windfx, BrokenState.origin );
ShatteredState delete();
ShatteredStatetwo 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";
}
}
|
|
Dieses kommt in den Ordner (raw\maps\mp\_breakable_windows.gsc)
Als nächstes fügt man in seine (mp_name der Map.gsc) folgende Zeile ein.
Code angehängt. Klicke hier zum Ein-/Ausblenden
| code: |
1:
2:
3:
|
maps\mp\_breakable_windows::main();
|
|
Einfach über die zeile mit maps\mp\_load::main(); einfügen.
So das wars mit dem Skripten.
2. Update Zone File
Da es diese option im Luncher nicht oder noch nicht gibt, muss man halt alles selbst in die mp_name der map.csv einfügen.
Dazu öffnet man die Datei. Die Datei befindet sich im Ordner (zone_source).
Hier fügt man die folgenten zeilen hinzu.
Code angehängt. Klicke hier zum Ein-/Ausblenden
| code: |
1:
2:
3:
4:
|
rawfile,maps/mp/_breakable_windows.gsc
fx,maps/sniper/fx_glass_break
|
|
Das dient dazu das das Skript und der Effekt mit in das FF File deiner Map geladen wird.
3. Der Radiant
Also ich gehe jetzt mal davon aus, das in deiner Map ein Haus oder sonst was ist mit Öffnung fürs Fenster ist.
Ich verwende Die XModels: breakable_window2_pristine und breakable_window2_brkn1 – brkn3.
So der einfachste Weg ist wohl wenn man erst mal das Model (breakable_window2_pristine) in die Map einfügt. Dazu rechtsklick im 2D Fenster und dort unter script/model das gewünschte Model wählen. Jetzt kann man die Öffnung dem Fenster anpassen beziehungsweise das Fenster der Öffnung.
Als nächstens kommt der Trigger. Dazu wieder rechtsklick im 2D Fenster und auf trigger/damage drücken. Den so erstellten Trigger der Fensteröffnung anpassen. Ich habe ihn genau so groß wie das Fenstermodel gemacht. Außerdem bekommt der Trigger noch einen Targetname, dazu markiert man nur den Trigger und drückt auf „N“. So gelangt man in den Entry Editor dort schreibt man bei Key targetname und bei Value fenster anschließend bestätigt man mit ENTER.
Jetzt fehlen noch die zerstörten Modelle und die Verbindung von model und Trigger.
Ich mache das dann so.
Ich stelle den Grid auf 32, so kann ich den Trigger und das Model bewegen aber auch sehr leicht wieder an die Ursprungsposition bringen.
So jetzt kann ich den Trigger aus der öffnung ziehen und das Model auch. Vom Model mache ich noch 3 Kopien (Model markieren und SPACE drücken) und ordne alles in einer Reihe an.
Jetzt habe ich eine Reihe Trigger – Fenster1 – Fenster2– Fenster3 – Fenster4.
Jetzt ändert man die modele von Fenster 2-4. Dazu Markiert man erst Fenster2 drückt auf „N“, jetzt kann man entweder auf Model… drücken und das gewünschte auswählen oder man ändert den model Name manuell.
Code angehängt. Klicke hier zum Ein-/Ausblenden
| code: |
1:
2:
3:
4:
5:
6:
|
Fenster1 = breakable_window2_pristine
Fenster2 = breakable_window2_brkn1
Fenster3 = breakable_window2_brkn2
Fenster4 = breakable_window2_brkn3
|
|
So jetzt habe ich schon mal alles zusammen jetzt noch alles verbinden.
Dazu markiert man den Trigger dann Fenster1 und drückt auf „W“ jetzt sollte eine rote Linie zwischen Trigger und Fenster1 sein. Jetzt Fenster1 dann Fenster2 markieren und „W“ drücken, das gleiche noch mit Fenster2 – Fenster3 und mit Fenster3 – Fenster4.
Jetzt kommt alles übereinander wieder in die Fensteröffnung der Wand.
So jetzt kann man noch eine Clip Textur in den Fensterrahmen legen das man nicht durchlaufen kann.
Man kann auch die modele austauschen, wenn man nur 3 statt 4 modele verwenden will nimmt man das Skript von CoD 4.
So ich hoffe mal das alles so Einigermasen verständlich ist Fragen sind natürlich erwünscht und der Sound und der Effekt werden auch abgespielt.
Der Sound kommt übrigens aus der soundalias Datei (destructibles.csv) welche Sounds noch gehen kann ich nicht sagen aber der von mir verwendete geht.
Gruß
-BadMan-
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von BadMan: 30.11.2008 13:01.
|
|
|
|
|
BadMan
Turnbeutelvergesser
 
Dabei seit: 31.01.2008
Beiträge: 278

|
|
Hi
Ich habe das ganze nochmal ein wenig bearbeitet und habe beim fenster mal jede scheibe einzeln eingefügt. Da das ganze etwas Arbeit ist hab ichs mal hochgeladen.
Fenster Prefab Download
Das ganze is im Prinzip das gleiche wie oben nur, dass ich den Fensterrahmen als normales model und halt jede scheibe einzeln als script_model eingefügt habe(so wie oben beschrieben).
Das Skript hab ich auch etwas angepasst.
Änderungen:
1. Effekt ausgetauscht (Der von oben ist etwas übertrieben)
2. Sound bei jedem Treffer
Den Effekt habe ich allerding auskommentiert da es mir ohne besser gefällt das kann aber jeder für sich entscheiden.
Skript:
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:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
|
main()
{
windfx = loadfx ("misc/fx_glass_window_brk");
windtrigs = getentarray("fenster","targetname");
for(i=0;i<windtrigs.size;i++)
{
windtrigs[i] thread dowindow(windfx);
}
}
dowindow(windfx)
{
targetdamage=80;
totaldamage=0;
WindowShattered=false;
WindowShatteredtwo=false;
WindowBroken=false;
self enablegrenadetouchdamage();
NormalState = getent(self.target,"targetname");
ShatteredState = getent(NormalState.target,"targetname");ShatteredState hide();
ShatteredStatetwo = getent(shatteredState.target,"targetname");ShatteredStatetwo hide();
BrokenState = getent(shatteredStatetwo.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)
{
self playsound("glass_pane_break");
NormalState delete();
ShatteredState show();
WindowShattered=true;
}
else if(!WindowShatteredtwo)
{
self playsound("glass_pane_break");
ShatteredState delete();
ShatteredStatetwo show();
WindowShatteredtwo=true;
}
}
BrokenState show();
self playsound("glass_pane_break");
//PlayFX(windfx, BrokenState.origin );
ShatteredState delete();
ShatteredStatetwo 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";
}
}
|
|
|
|
|
|
|
|
|
|
 |
Impressum ||Datenschutzerklärung
|