|
 |
wie script in mod umwandeln? |
serthy
Codemeister
  
Dabei seit: 29.07.2010
Beiträge: 628

|
|
| wie script in mod umwandeln? |
 |
hey ho
nachdem ich nun so die grundlagen beim normalen map-scripten drauf habe (hoffe ich zumindest
)
wollte ich fragen wie man mods generell erstellt
eigentlich geht es ja darum, ich habe quasi einen script geschrieben (allerdings sehr billig) der killstreaks zählt und bei 5 dann man einen airstrike per fernglas rufen kann, er ist zwar nicht rundum perfekt, aber das grundgerüst funktioniert!
hier der code:
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:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
|
/* Serthy
================================================================================================================================================================================================
| erster versuch eines killstreak scriptes -- ideen: |
| - anzeigen der aktuellen abschussserie |
| - airstrike bei 5 durch fernglas rufen (wahlweise napalm-angriff / gas-angriff / normal << nur normal derzeit) |
| - ac 130 bei 10er abschusserie (in arbeit) |
| - entfernungsanzeige im fernglas (in arbeit) |
| - abwurf von packet mit waffe / monition (in arbeit) |
| - sentry-gun (in arbeit) |
| - jet selber fliegen (in arbeit) |
| |
================================================================================================================================================================================================
*/
#include maps\mp\_utility;
main()
{
level.binoculars = 0;
level.airstrike_inuse = 0;
level.airstrike_aviable = 0;
//precache
level._effect["marker"] = loadfx ("fx/misc/flare_artillery_runner.efx");
level._effect["grenadeexplosion_cliffblast"] = loadfx ("fx/explosions/grenadeExp_cliffblast.efx");
level._effect["grenadeexplosion_dirt"] = loadfx ("fx/explosions/grenadeExp_dirt.efx");
level._effect["grenadeexplosion_mud"] = loadfx ("fx/explosions/grenadeExp_mud.efx");
level._effect["grenadeexplosion_wood"] = loadfx ("fx/explosions/grenadeExp_wood.efx");
level._effect["grenadeexplosion_water"] = loadfx ("fx/explosions/grenadeExp_water.efx");
level._effect["grenadeexplosion_windowlast"] = loadfx ("fx/explosions/grenadeExp_windowlast.efx");
level._effect["grenadeexplosion_snow"] = loadfx ("fx/explosions/grenadeExp_snow.efx");
level._effect["grenadeexplosion_concrete"] = loadfx ("fx/explosions/grenadeExp_concrete.efx");
thread playerz();
}
playerz()
{
while(1)
{
player = getentarray("player","classname");
for(i = 0; i < player.size; i++)
{
player[i] thread onoff();
player[i] thread artillery();
player[i] thread counter();
player[i] thread hud();
player[i] thread add();
if(!isdefined(player[i].airstrikes)) player[i].airstrikes = 0;
if(!isdefined(player[i].streak)) player[i].streak = 0;
}
wait 1;
}
}
hud()
{
if( isDefined( self.hud_streak ) ) self.hud_streak destroy();
if(!isDefined(self.streak)) self.streak = 0;
self.hud_streak = newClientHudElem(self);
self.hud_streak.x = 320;
self.hud_streak.y = 440;
self.hud_streak.font = "default";
self.hud_streak.fontscale = 1.75;
self.hud_streak.alpha = 1;
while(1)
{
self.hud_streak setvalue(self.streak);
wait 0.1;
}
}
counter() //zählt abschussserie, bei tot = 0
{
if(isAlive(self))
{
oldscore = self.score;
wait 1;
newscore = self.score;
if( (newscore - oldscore) > 0 && self.sessionstate == "playing")
{
self.streak = (self.streak + (newscore - oldscore));
if( (self.streak >= 5) && (isAlive(self)) )
{
level.airstrike_aviable = 1;
self.airstrikes++;
}
}
if( self usebuttonpressed()) self iprintln( "^1[^7" + self.airstrikes + "^1]" + "^3Airstrikes ^7aviable \n");
}
else if(!isAlive(self)) self.streak = 0;
}
add() // da der bot-mod derzeit nicht geht muss das herhalten, nur für testzwecke!!!
{
adder = getent("platform_trigger","targetname");
while(1)
{
adder waittill("trigger",other);
wait 1;
other.score = (other.score + 1);
wait 1;
}
}
onoff()
{
while(1)
{
self waittill( "binocular_enter" );
level.binoculars = 1;
wait 1;
self waittill( "binocular_exit" );
level.binoculars = 0;
wait 1;
}
}
artillery()
{
radiusdamage = 200;
if(isdefined(self.eyemarker)) // eigentlich nicht wichtig, habs ohne probiert, dann muckt es rum, ich lass es drine für die entfernungsanzeige
{
self.eyemarker unlink();
self.eyemarker delete();
}
self.eyemarker = spawn("script_origin",(0,0,0));
self.eyemarker linkto (self, "tag_eye",(0,0,0),(0,0,0));
while( (level.binoculars == true) && (level.airstrike_inuse == false) && (level.airstrike_aviable == true) )
{
if(self usebuttonpressed() && (self.airstrikes > 0))
{
self iprintln("^1Airstrike called");
self.airstrikes--;
self iprintln( "^1[^7" + self.airstrikes + "^1]" + "^3Airstrikes ^7aviable \n");
level.airstrike_inuse = 1;
start = self.eyemarker.origin;
angles = self getplayerangles();
direction = anglesToForward(angles);
direction = vectorScale(direction,5000);
tracestart = start;
traceend = start + direction;
trace = bulletTrace( tracestart , traceend , false , undefined );
if(trace["fraction"]<1)
{
wait 3;
playfx(level._effect["marker"],trace["position"]);
wait 3;
self iprintln("^2Airstrike incoming");
wait 3;
num = 4; //anzahl der abgeworfenen bomben/explosionen
for( i = 0 ; i < num ; i++ )
{
wait randomint(4);
position = (trace["position"]+(randomint(radiusdamage),randomint(radiusdamage),0));
//alle texturtypen
type = trace["surfacetype"];
switch (type)
{
case "beach" :
case "sand" :
fx = "cliffblast";
break;
case "dirt" :
fx = "dirt";
break;
case "grass" :
case "mud" :
fx = "mud";
break;
case "bark" :
case "wood" :
fx = "wood";
break;
case "water" :
fx = "water";
break;
case "glass" :
fx = "windowblast";
break;
case "ice" :
case "snow" :
fx = "snow";
break;
case "asphalt" :
case "brick" :
case "cloth" :
case "concrete" :
case "default" :
case "gravel" :
case "metal" :
case "paper" :
case "plaster" :
case "rock" :
fx = "concrete";
break;
default :
fx = "concrete";
break;
}
//self playsound ("grenade_explode_default");
playfx (level._effect["grenadeexplosion_" + fx], position);
earthquake( 0.5 , 0.5 , position , 200 );
radiusDamage( position , 200 , 100 , 80 );
//soll die kills für einen selbst dazuzählen, klappt noch nicht 100 prozentig
victims = getentarray("player", "classname");
for(v=0; v<victims.size; v++)
{
victim = victims[v];
away = distance( victim.origin, position );
if(away<radiusdamage)
{
if(victim.health<=0)
{
self.score++;
iprintln(self.name + "^7 killed "+ victim.name + "^7 with Airstrike\n");
}
}
}
}
wait 3;
level.airstrike_inuse = 0;
}
}
else if(self.airstrikes <= 0)
{
self.airstrikes = 0;
level.airstrike_aviable = 0;
self iprintln("^1No ^3Airstrikes ^1aviable!!!");
}
else if(level.airstrike_inuse == true) self iprintln("^1No ^3Airstrikes ^1aviable!!!");
else if(level.airstrike_aviable == false) self iprintln("^1No ^3Airstrikes ^1aviable!!!");
wait 0.1;
}
}
|
|
nunja das ist ein script den ich in einer map aufrufe
ich hoffe ihr könnt mir ein paar hinweise und tipps geben wie ich das als mod mache
ich hoffe das das in den grundzügen auch in ein mod zu packen ist :s
ich weiß das es andere mods gibt wo das alles schon drinne ist, aber ich würde gerne lernen wie das alles funktioniert
ich hab mir auch schon unzählige mods angesehen, bin aber mehr als überfordert gewesen die zu entziffern! ich glaube da ist es für mich sinnvoller mit kleineren dingen anzufangen, zb wie man so etwas (oder von mir aus auch andere kleinere dinge) in einen mod packt
bin für jeden möglichen ratschlag überaus dankbar!
hier noch ein kleines video
http://de.xfire.com/video/40e94e/
ps: hat jemand noch den anti-camper-mod von nightwing? standalone Anti Camper Mod
|
|
|
|
|
serthy
Codemeister
  
Dabei seit: 29.07.2010
Beiträge: 628

|
|
okay hab es geschafft
man muss halt nur wissen was man machen muss
also wenn man einen eigenen mod basteln will, zb. nehmen wir das einfachste was es gibt, man will einen text aller 5 sekunden erscheinen lassen
man erstellt sich eine neue .iwd datei (hier aufpassen mit winzip und winrar, es geht nur ein, glaube rar!!)
darin kommt dann folgendes verzeichnis (3 ordner anlegen):
maps/mp/gametypes
dann geht ihr in euren main ordner und sucht in der iw_7.iwd unter maps/mp/gametypes die dm.gsc datei raus
diese kopiert ihr euch auf euren desktop und schreibt in der main funktion das rein:
Code angehängt. Klicke hier zum Ein-/Ausblenden
| code: |
1:
|
thread maps/mp/gametypes/_text::main(); |
|
dann erstellt ihr euch ein neues textdokument und nennt es _text.gsc
darein kommt dann folgender kleiner code:
Code angehängt. Klicke hier zum Ein-/Ausblenden
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
|
main()
{
thread text();
}
text()
{
while(1)
{
wait 5;
iprintln("^1Das ist nur ein Test");
}
} |
|
nun packt ihr eure modifizierte dm.gsc und eure _text.gsc in eure meinmod.iwd datei rein und zwar n den maps/mp/gametypes ordner
und die iwd in euer main verzeichnis
achso, wenn ihr nun eine map startet sollte im spieltyp deathmatch dann alle 5 sekunden ein text erscheinen, allerdings nur in dm, da ihr nur die dm datei bearbeitet habt, um es auch bei den anderen zu machen, einfach diese noch dazufügen
somit kann man auch den campermod von nightwing gaaaanz einfach nachmachen, und er funktioniert super
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von serthy: 16.02.2011 10:02.
|
|
|
|
|
serthy
Codemeister
  
Dabei seit: 29.07.2010
Beiträge: 628

|
|
also
ich habe es soweit, das ich auf eine taste drücke und ich dann die zahl mir mit iprintln printen lassen kann solange bis ich # oder - drücke die das beenden
die tasten werden durch switch(response) ausgelesen
deine möglichkeit werde ich auch einmal überdenken
man müsste dann allerdings 6x11 neue menüs sich anlegen (maximal 64 spieler) um alle zu erfassen
ich werde mal ausprobieren ob die .menu-files auch variable die sich ändern können anzeigen
aber danke schonmal mit dem onlykick ^^
aber es ist eigentlich einfacher die nummer zu nehmen oder?
sind ja maximal 2 stellen, denk ich
nur dabei ist das problem das man erst mal nachschauen muss welche nummer zu welchen spieler gehört, und das ist ja wieder sinnlos, kann man gleich in die console eingeben :p
also würden mir hier variable gut weiterhelfen, die je nach slotnummer den namen im menü anzeigen
dann brauch ich nur den namen anklicken und schon ist er gekickt
wenns klappt mach ich nen mimimod damit hehehe
habs grad eben mal ausprobiert scheint nicht zu klappen
hab aber auch schon eine andere idee, die ist aber mehr als aufwendig...
einfach für jeden (64 -.-) spieler ein hud erstellen, der nur erscheint wenn man im customquickmessageadmimmenü (lol) ist, das menü so legen das es von der größe passt (vollbild)
dann mit einer abfrage spielernamen und alles bekommen (kein problem) und dann kicken
soo ich muss mal überlegen einen moment
überprüft mal meine gedanken
also man macht ne simple arrayabfrage von den spielern und hat dann player[i]
dann bastelt man sich ne liste die nur angezeigt wird, wenn man im kick/ban menü ist
dann wird jeder spieler:
player[1].name = opferlamm
player[2].name = gast
player[3].name = unknown soldier
usw
erfasst und wird angezeigt
wenn ich nun 1 drücke mache ich es so, dass player[1] gekickt wird
und da ist schon der fehler, wie soll ich bitte 64 wieder eingeben? -.-
ich überleg mal schön weiter^^
hier mal das script wo ich die zahlen herbekomme:
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:
|
switch(response)
{
case "1":
level.kicknumber = 1;
self iprintln(level.kicknumber);
break;
case "2":
level.kicknumber = 2;
self iprintln(level.kicknumber);
break;
case "3":
level.kicknumber = 3;
self iprintln(level.kicknumber);
break;
case "4":
level.kicknumber = 4;
self iprintln(level.kicknumber);
break;
case "5":
level.kicknumber = 5;
self iprintln(level.kicknumber);
break;
case "6":
level.kicknumber = 6;
self iprintln(level.kicknumber);
break;
case "7":
level.kicknumber = 7;
self iprintln(level.kicknumber);
break;
case "8":
level.kicknumber = 8;
self iprintln(level.kicknumber);
break;
case "9":
level.kicknumber = 9;
self iprintln(level.kicknumber);
break;
case "0":
level.kicknumber = 0;
self iprintln(level.kicknumber);
break;
default:
break;
} |
|
also das level.kicknumber kann nat. verändert werden!
und hier ein script das zeimlich schön ist
es liest die zahlen der reihe nach ab und wenn was falsch ist fängt es von vorne an, vll könnt ihr damit etwas anfangen ^^
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:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
|
init()
{
/* Max number can be 25 (set in the for loop below)
make sure that all sequential triggers are included
key: targetname
value: b#
where # is the number of that button. Can use trigger uses or trigger damage (you shoot the buttons instead)
*/
// List the code here - supports any length of code - always start at zero and increase by 1 each time
// CODE IS 5349
level.doorCode[0] = 5;
level.doorCode[1] = 3;
level.doorCode[2] = 4;
level.doorCode[3] = 9;
thread keypad();
}
keypad()
{
nextButton = level.doorCode[0];
entryPosition = 0;
level.lastButton = level.doorCode[(level.doorCode.size - 1)];
for(i=1; i <= 25; i++)
{
button = getent(("b" + i), "targetname"); // get sequential buttons
if(!isdefined(button)) break; // no more triggers - exit setup
button thread watchTrigger(i);
}
level.buttonPressed = undefined;
while(1)
{
if(isDefined(level.buttonPressed))
{
if(level.buttonPressed == nextButton)
{
entryPosition++;
if(entryPosition >= level.doorCode.size) // Code finished so when it matches reset the code and open the door
{
// Do your door stuff here - not threaded so can wait there for door to close again
door_open();
nextButton = level.doorCode[0];
entryPosition = 0;
}
else
{
nextButton = level.doorCode[entryPosition];
}
level.buttonPressed = undefined;
}
else
{
nextButton = level.doorCode[0]; // button selected did not match nextButton - reset code
level.buttonPressed = undefined;
entryPosition = 0;
continue;
}
}
wait 0.05;
}
}
watchTrigger(number)
{
while(1)
{
self waittill("trigger");
level.buttonPressed = number;
wait 0.05;
}
}
door_open()
{
// the rest....
iprintln("open the door");
door = getent("sliding_door","targetname");
if(isdefined(door))
{
door movex(-70,2,0.5,0.25);
door waittill("movedone");
wait 3;
door movex(70,2,0.5,0.25);
door waittill("movedone");
}
}
|
|
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von serthy: 20.02.2011 04:18.
|
|
|
|
|
|
|
Die Funktion <rect>:
rect x y Breite Höhe (B/H des Rechteckes)
Musst Du halt etwas probieren....
__________________

|
|
|
|
|
|
|
Der Modder war Matthias Lorenz. Wenn ich mich recht entsinne, hat der aufgehört, weil er keine "Killerspiele" mehr unterstützen wollte....
__________________

|
|
|
|
|
|
|
|
 |
Impressum ||Datenschutzerklärung
|