Opferlamm-Clan Board
www.opferlamm-clan.de
Verantwortlich für diese bösen Machenschaften: siehe Impressum

Registrierung Kalender Mitgliederliste Suche Häufig gestellte Fragen Zur Startseite

Opferlamm-Clan Board » Call of Duty 4 » Call of Duty 4 - Mapping » CoD4-Mapping-Tutorials / Wiki » [Tutorial] Waffen im Oldschool Style auf der Map spawnen » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen [Tutorial] Waffen im Oldschool Style auf der Map spawnen
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Nightwing
Padawan ;-)


images/avatars/avatar-1617.jpg


Dabei seit: 15.01.2007
Beiträge: 4.857


[Tutorial] Waffen im Oldschool Style auf der Map spawnen Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Dank -tiger- und seiner Map Gold Rush kam mir die Idee, Waffen im Oldschool Style auf einer Map spawnen zu lassen.

OLD MAN WITH GUN hat das Script noch technisch optimiert (Arrays eingefügt) und der erste Spawn der Waffen kann zufällig erfolgen. Danke dafür!

Bei manch Gametype funktionieren die Compass Icons nicht, es wird automatisch auf die HUD Icons umgeschaltet!





Das einbauen in eine Map ist nicht schwer:

Als erstes kommt folgende DVAR Abfrage in Eure mp_deinemap.gsc dazu:

Code einblendenCode angehängt. Klicke hier zum Ein-/Ausblenden

code:
1:
2:
3:
4:
5:
6:
	// Weapon Spawn Oldschool Style
	if(getdvar("weapon_mp_dein_mapname") == "")
		setdvar("weapon_mp_dein_mapname", "0");
	if(getdvar("weapon_mp_dein_mapname") == "1")
		thread maps\mp\_spawn_weapons::main();


Kopiere folgendes Script unter dem Namen _spawn_weapons.gsc in Deinen Ordner "/raw/maps/mp".
Füge die Datei "rawfile,maps/mp/_spawn_weapons.gsc" in Dein Zone File ein.

_spawn_weapons.gsc:

Code einblendenCode 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:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310:
311:
312:
313:
314:
315:
316:
317:
318:
319:
320:
321:
322:
323:
324:
325:
326:
327:
328:
329:
330:
331:
332:
333:
334:
335:
336:
337:
338:
339:
340:
341:
342:
343:
344:
345:
346:
347:
348:
349:
350:
351:
352:
353:
354:
355:
356:
357:
358:
359:
360:
361:
362:
363:
364:
365:
366:
367:
368:
369:
370:
371:
372:
373:
374:
375:
376:
377:
378:
379:
380:
381:
382:
383:
384:
385:
386:
387:
388:
389:
390:
391:
392:
393:
394:
395:
396:
397:
398:
399:
400:
401:
402:
403:
404:
405:
406:
407:
408:
409:
410:
411:
412:
413:
414:
415:
416:
417:
418:
419:
420:
421:
422:
423:
424:
425:
426:
427:
428:
429:
430:
431:
432:
433:
434:
435:
436:
437:
438:
439:
440:
441:
442:
443:
444:
445:
446:
447:
448:
449:
450:
451:
452:
453:
454:
455:
456:
457:
458:
459:
460:
461:
462:
463:
464:
465:
466:
467:
468:
469:
470:
471:
472:
473:
474:
475:
476:
477:
478:
479:
480:
481:
482:
483:
484:
485:
486:
487:
488:
489:
490:
491:
492:
493:
494:
495:
496:
497:
498:
499:
500:
501:
502:
503:
504:
505:
/*

Script to spawn several Weapons in a (custom) map.
This script is taken from the IW _oldschool.gsc.
dvardef() function taken from Wildcard's ACE - Thanks Marc!
createWaypoint(), deletewaypoint(), weapon_think() and weapon_spawn() taken from AWE4 - Thanks RGN Dev Team!
weaponarrays and randomize loadout on spawn are from OLD MAN WITH GUN - Thanks OMWG!

Modified by Nightwing.

To get the coordinates for the weaponspawn, simply walk to the place where the spawn should be and type \viewpos in console.
Subtract 60 from the 'Z' coordinate. They are listed like this (X, Y, Z)
This is because \viewpos is taken from the players eye level, and floor level is 60 units less than the eye level. 

DVARS for serverconfig:

set weapon_mp_your_mapname "1"				// Turns Weapons on or off (0 = off, 1 = on, default = 1)
set weapon_respawn_mp_your_mapname "150"	// Set the number in seconds before new weapon spawns after pickup. (min = 30, max = 300, default = 150)
set weapon_pickupFX_mp_your_mapname "1"		// Base FX on weapon spawn (0 = off, 1 = on, default = 1)
set weapon_soundFX_mp_your_mapname "1"		// Sound on weapon spawn (0 = off, 1 = on, default = 1)
set weapon_objpoints_mp_your_mapname "1"	// Shows objective points in HUD (0 = off, 1 = on, default = 1)
set weapon_minimap_mp_your_mapname "1"		// Shows objective points in Minimap (0 = off, 1 = on, default = 1)
set weapon_rotate_mp_your_mapname "1"		// Rotate weapon on spawn (0 = off, 1 = on, default = 1)
set weapon_random_mp_your_mapname "1"		// Random loadout on first spawn (0 = off, 1 = on, default = 0)

NOTICE: Minimap icons won't work on some gametypes, they are disabled. Instead of this, HUD objectpoints will be shown.

*/	

main(){

	level.oldschool 	= (getDvarInt("scr_oldschool"));
	level.awe_oldschool = (getDvarInt("awe_oldschool"));

	if(level.oldschool || level.awe_oldschool)
		return;

	level.weapon_respawnTime		= dvardef("weapon_respawn", 150, 10, 300, "int");
	level.weapon_pickupFX 			= dvardef("weapon_pickupFX", 1, 0, 1, "int");
	level.weapon_soundFX 			= dvardef("weapon_soundFX", 1, 0, 1, "int");
	level.weapon_objpoints 			= dvardef("weapon_objpoints", 0, 0, 1, "int");

	switch(getDvar("g_gametype")){
	
		case "dm": 		level.weapon_minimap = dvardef("weapon_minimap", 1, 0, 1, "int");	break;
		case "war": 	level.weapon_minimap = dvardef("weapon_minimap", 1, 0, 1, "int");	break;
		case "sd": 		level.weapon_minimap = dvardef("weapon_minimap", 1, 0, 1, "int");	break;
		case "sab": 	level.weapon_minimap = dvardef("weapon_minimap", 1, 0, 1, "int");	break;
		case "dom": 	level.weapon_minimap = dvardef("weapon_minimap", 1, 0, 1, "int");	break;
		case "koth": 	level.weapon_minimap = 0;	level.weapon_objpoints = 1;		break;
		case "ctf": 	level.weapon_minimap = 0;	level.weapon_objpoints = 1;		break;
		case "ctfb": 	level.weapon_minimap = 0;	level.weapon_objpoints = 1;		break;
		case "re": 		level.weapon_minimap = 0;	level.weapon_objpoints = 1;		break;
		case "vip": 	level.weapon_minimap = 0;	level.weapon_objpoints = 1;		break;
		case "htf": 	level.weapon_minimap = 0;	level.weapon_objpoints = 1;		break;
		case "ch": 		level.weapon_minimap = dvardef("weapon_minimap", 1, 0, 1, "int");	break;
		default:		level.weapon_minimap = dvardef("weapon_minimap", 1, 0, 1, "int");	break;
	}
	
	level.weapon_rotate 			= dvardef("weapon_rotate", 1, 0, 1, "int");
	level.weapon_random 			= dvardef("weapon_random", 1, 0, 1, "int");
	
	level.weapon_pickupSound 		= "oldschool_pickup";
	level.weapon_respawnSound 		= "oldschool_return";
	
	level.pickupAvailableEffect 	= loadfx("misc/ui_pickup_available");
	level.pickupUnavailableEffect 	= loadfx("misc/ui_pickup_unavailable");
	
	level.waypointshader 			= "objpoint_ammo";
	level.compass_waypointshader 	= "compass_objpoint_ammo";
	
	precacheShader(level.waypointshader);
	precacheShader(level.compass_waypointshader);
	
	thread weapon_names();
	thread weapon_setup();
	thread weapon_think();
}

weapon_names(){

	level.weap_name				= [];
	
	level.weap_name[0]   		= "uzi_silencer_mp";
	level.weap_name[1]   		= "deserteaglegold_mp";
	level.weap_name[2]   		= "m1014_grip_mp";
	level.weap_name[3]  		= "ak47_mp";
	level.weap_name[4]   		= "g36c_reflex_mp";
	level.weap_name[5]   		= "mp5_mp";
}

weapon_setup(){

	level.weap_coordinates		= [];
	level.weap_angles			= [];
	level.weap_flag				= [];
	
	level.weap_coordinates[0]	= (333, -1561, 1500);
	level.weap_angles[0] 		= (0, 0, 0);
	level.weap_flag[0]	 		= 3;
	
	level.weap_coordinates[1] 	= (-983, -975, 1528);
	level.weap_angles[1] 		= (0, 0, 0);
	level.weap_flag[1] 			= 3;
	
	level.weap_coordinates[2] 	= (-909, -4, 1768);
	level.weap_angles[2] 		= (0, 0, 0);
	level.weap_flag[2] 			= 3;
	
	level.weap_coordinates[3] 	= (315, 1017, 1405);
	level.weap_angles[3] 		= (0, 0, 0);
	level.weap_flag[3] 			= 3;
	
	level.weap_coordinates[4]	= (1602, -159, 1533);
	level.weap_angles[4] 		= (0, 0, 0);
	level.weap_flag[4] 			= 3;
	
	level.weap_coordinates[5] 	= (850, 1936, 1520);
	level.weap_angles[5] 		= (0, 0, 0);
	level.weap_flag[5] 			= 3;
		
	thread prespawn_randomize();
}	

weapon_think(){

	wait .5;

	pickups = getentarray("weapon_pickup", "targetname");
	
	for(i = 0; i < pickups.size; i++){
	
		if(level.weapon_minimap){
		
			objID = maps\mp\gametypes\_gameobjects::getNextObjID();
			objective_add(objID, "active", pickups[i].origin, level.compass_waypointshader);
		}
		
		else
			objID = i;
	
		thread trackPickup(pickups[i], objID);
		wait 0.02;
	}
}

prespawn_randomize(){

	prefix 		= "weapon_";
	targetname 	= "weapon_pickup";
	
	if(level.weapon_random){
	
		for(i = 0; i < level.weap_coordinates.size; i++){
		
			random_weapon = randomint((level.weap_name.size - 1) * 10);
			j = int(random_weapon / 10);
			
			weapon_spawn(prefix + level.weap_name[j], targetname, level.weap_coordinates[i], level.weap_angles[i], level.weap_flag[i]);
		}
	}
	
	else{
	
		for(i = 0; i < level.weap_coordinates.size; i++){
		
			weapon_spawn(prefix + level.weap_name[i], targetname, level.weap_coordinates[i], level.weap_angles[i], level.weap_flag[i]);
		}
	}
}

weapon_spawn(classname, targetname, origin, angles, flags){

	if(!isdefined(classname) || !isdefined(targetname) || !isdefined(origin))
		return undefined;
	
	if(!isdefined(angles))
		angles = (0, 0, 0);
		
	if(!isdefined(flags))
		flags = 3;
	
	weapon            = spawn(classname, origin+(0,0,30), flags);
	weapon.targetname = targetname;
	weapon.angles     = angles;
	
	weapon thread createwaypoint();

	return weapon;
}

trackPickup(pickup, id){

	groundpoint = getPickupGroundpoint(pickup);
	effectObj 	= spawnPickupFX(groundpoint, level.pickupAvailableEffect);
	
	classname 	= pickup.classname;
	origin 		= pickup.origin;
	angles 		= pickup.angles;
	spawnflags 	= pickup.spawnflags;
	model 		= pickup.model;
	
	isWeapon 	= false;
	weapname 	= undefined;
	trig 		= undefined;
	respawnTime = undefined;

	if(issubstr(classname, "weapon_")){
	
		isWeapon = true;
		weapname = pickup maps\mp\gametypes\_weapons::getItemWeaponName();
		respawnTime = level.weapon_respawnTime;
	}
	
	pickup thread createWaypoint();
	
	while(true){
	
		pickup thread spinPickup();
	
		player = undefined;
		
		if(isWeapon){
		
			pickup setPickupStartAmmo(weapname);
			
			while(true){
			
				pickup waittill("trigger", player, dropped);
				
				if(!isdefined(pickup))
					break;
				
				assert(!isdefined(dropped));
			}
			
			if(isdefined(dropped)){
			
				dropDeleteTime = 5;
				if(dropDeleteTime > respawnTime)
					dropDeleteTime = respawnTime;
				dropped thread delayedDeletion(dropDeleteTime);
			}
		}
		
		if(isWeapon){
		
			if(weaponInventoryType(weapname) == "item" && (!isdefined(player.inventoryWeapon) || weapname != player.inventoryWeapon)){
				player removeInventoryWeapon();
				player.inventoryWeapon = weapname;
				player SetActionSlot( 3, "weapon", weapname );
			}
		}
		
		if(level.weapon_soundFX)
			thread playSoundinSpace(level.weapon_pickupSound, origin);
			
		pickup deletewaypoint();
		
		if(level.weapon_minimap)
			objective_state(id, "invisible");
		
		if(level.weapon_pickupFX)
			effectObj delete();
			
		effectObj = spawnPickupFX(groundpoint, level.pickupUnavailableEffect);

		wait respawnTime;
		
		pickup = spawn(classname, origin, spawnflags);
		pickup.angles = angles;
		
		pickup thread createWaypoint();
		
		if(level.weapon_minimap)
			objective_state(id, "active");
		
		if(level.weapon_soundFX)
			pickup playSound(level.weapon_respawnSound);
		
		if(level.weapon_pickupFX)
			effectObj delete();
			
		effectObj = spawnPickupFX(groundpoint, level.pickupavailableEffect);
	}
}

spawnPickupFX(groundpoint, fx){

	if(!level.weapon_pickupFX)
		return;
		
	effect = spawnFx(fx, groundpoint, (0, 0, 1), (1, 0, 0));
	triggerFx(effect);
	
	return effect;
}

getPickupGroundpoint(pickup){

	trace 		= bullettrace(pickup.origin, pickup.origin + (0, 0, -128), false, pickup);
	groundpoint = trace["position"];
	
	finalz = groundpoint[2];
	
	for (radiusCounter = 1; radiusCounter <= 3; radiusCounter++){
	
		radius = radiusCounter / 3.0 * 50;
		
		for (angleCounter = 0; angleCounter < 10; angleCounter++){
		
			angle = angleCounter / 10.0 * 360.0;
			
			pos = pickup.origin + (cos(angle), sin(angle), 0) * radius;
			
			trace = bullettrace( pos, pos + (0, 0, -128), false, pickup );
			hitpos = trace["position"];
			
			if (hitpos[2] > finalz && hitpos[2] < groundpoint[2] + 15)
				finalz = hitpos[2];
		}
	}
	
	return (groundpoint[0], groundpoint[1], finalz);
}

spinPickup(){

	if(!level.weapon_rotate)
		return;
				
	if(self.spawnflags & 2 || self.classname == "script_model"){
	
		self endon("death");
		
		org = spawn("script_origin", self.origin);
		org endon("death");
		
		self linkto(org);
		self thread deleteOnDeath(org);
		
		while(true){
		
			org rotateyaw(360, 3, 0, 0);
			wait 2.9;
		}
	}
}

setPickupStartAmmo(weapname){

	curweapname = weapname;
	altindex 	= 0;
	
	while(altindex == 0 || (curweapname != weapname && curweapname != "none")){
	
		allammo = weaponStartAmmo(curweapname);
		clipammo = weaponClipSize(curweapname);
		
		reserveammo = 0;
		
		if(clipammo >= allammo){
		
			clipammo = allammo;
		}
		else{
		
			reserveammo = allammo - clipammo;
		}
		
		self itemWeaponSetAmmo(clipammo, reserveammo, altindex);
		curweapname = weaponAltWeaponName(curweapname);
		altindex++;
	}
}

removeInventoryWeapon(){

	if(isDefined(self.inventoryWeapon))
		self takeWeapon(self.inventoryWeapon);
	self.inventoryWeapon = undefined;
}

deleteOnDeath(ent){

	ent endon("death");
	self waittill("death");
	ent delete();
}


delayedDeletion(delay){

	self thread delayedDeletionOnSwappedWeapons(delay);
	
	wait delay;
	
	if(isDefined(self)){
	
		self notify("death");
		self delete();
	}
}

delayedDeletionOnSwappedWeapons(delay){

	self endon("death");
	
	while(true){
	
		self waittill("trigger", player, dropped);
		
		if(isdefined(dropped))
			break;
	}
	
	dropped thread delayedDeletion(delay);
}

playSoundinSpace(alias, origin){

	org = spawn("script_origin", origin);
	org.origin = origin;
	org playSound(alias);
	wait 10;
	org delete();
}

createWaypoint(){

	if(!level.weapon_objpoints)
		return;
				
	self deletewaypoint();
	
	waypoint 			= newHudElem();
	waypoint.x 			= self.origin[0];
	waypoint.y 			= self.origin[1];
	waypoint.z 			= self.origin[2] + 20;
	waypoint.alpha 		= .35;
	waypoint.isShown 	= true;
	
	waypoint setShader(level.waypointshader, 10, 10);

	waypoint setwaypoint(true);
	self.weapon_waypoint = waypoint;
}

deletewaypoint(){

	if(!level.weapon_objpoints)
		return;
				
	if(isdefined(self.weapon_waypoint))
		self.weapon_waypoint destroy();
}

dvardef(varname, vardefault, min, max, type){

	mapname = getdvar("mapname");
	gametype = getdvar("g_gametype");
	multigtmap = gametype + "_" + mapname;

	// check against gametype
	tempvar = varname + "_" + gametype;
	if(getdvar(tempvar) != "") varname = tempvar;

	// check against the map name
	tempvar = varname + "_" + mapname;
	if(getdvar(tempvar) != "") varname = tempvar;

	// check against the gametype and the map name
	tempvar = varname + "_" + multigtmap;
	if(getdvar(tempvar) != "") varname = tempvar;

	// get the variable's definition
	switch(type){
	
		case "int":
		if(getdvar(varname) == "") definition = vardefault;
		else definition = getdvarint(varname);
		break;

		case "float":
		if(getdvar(varname) == "") definition = vardefault;
		else definition = getdvarfloat(varname);
		break;

		case "string":
		default:
		if(getdvar(varname) == "") definition = vardefault;
		else definition = getdvar(varname);
		break;
	}

	// check to see if the value is within the min & max parameters
	if(type != "string"){
	
		if(min != 0 && definition < min) definition = min;
		else if(max != 0 && definition > max) definition = max;
	}

	return definition;
}


Für die Serverconfig gibt es dann noch folgende DVAR's:

Code einblendenCode angehängt. Klicke hier zum Ein-/Ausblenden

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
set weapon_mp_your_mapname "1"				// Waffen aktivieren / deaktivieren (0=off, 1=on, default=1)
set weapon_respawn_mp_your_mapname "150"	// Wieviele Sekunden bis zum nächsten Respawn (min=30, max=300, default 150)
set weapon_pickupFX_mp_your_mapname "1"		// FX Effekt am Spawn (0=off, 1=on, default=1)
set weapon_soundFX_mp_your_mapname "1"		// Sound am Spawn (0=off, 1=on, default=1)
set weapon_objpoints_mp_your_mapname "1"	// Zeigt Objekt Icons im HUD (0=off, 1=on, default=1)
set weapon_minimap_mp_your_mapname "1"		// Zeigt Objekt Icons in der Minimap (0=off, 1=on, default=1)
set weapon_rotate_mp_your_mapname "1"		// Rotierende Waffe im Spawn (0=off, 1=on, default=1)
set weapon_random_mp_your_mapname "0"		// Zufallsloadout der Waffen beim ersten Spawn (0=off, 1=on, default=0)


Das mp_your_mapname in der DVAR ersetzt Ihr durch den Namen Eurer Map.

Man kann die Variablen für die cfg auch nach Gametype variieren.
Möchte man z.B. keine Waffen beim Gametype SD, gibt man folgendes zusätzlich in der cfg an: set weapon_mp_your_mapname_sd "0"

Die Koordinaten für die Spawnpunkte findet Ihr ganz einfach raus:

Starte die Map und laufe an die Stelle, wo später die Waffe spawnen soll.
Öffne die Konsole und gib /viewpos ein.
Öffne dann die grosse Konsole und schreib Dir die Koordinaten auf, die in diesem Muster erscheinen: (X, Y ,Z)
Von der Z Koordinate noch 60 subtrahieren, da die Koordinate auf Augenhöhe des Spielers gemacht wird, wir aber den Boden benötigen.
Im Script in den Array eintragen und fertig.

Wichtiger Hinweis:

Solltet Ihr eigene Waffen bzw. Waffen aus dem Singleplayer einbauen, müssen die weaponfiles in eine zusätzliche IWD gepackt werden (z_mp_mapname.iwd).
Diese IWD muss zwingend im Modordner sein, da es sonst zu Downloadloops kommen kann (insbesondere bei Base- Homepathinstallationen).
Falls Ihr einen globalen Modordner (z.B. ace) nutzt, dürfen diese Waffen nicht verwendet werden, da Clients auf anderen Server wegen der zusätzlichen IWD gekickt werden.
Deshalb bitte einen eigenen, individuell benannten Modordner anlegen.

Viel Spass!

__________________

Nightwing ist offline E-Mail an Nightwing senden Homepage von Nightwing Beiträge von Nightwing suchen Nehmen Sie Nightwing in Ihre Freundesliste auf
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Opferlamm-Clan Board » Call of Duty 4 » Call of Duty 4 - Mapping » CoD4-Mapping-Tutorials / Wiki » [Tutorial] Waffen im Oldschool Style auf der Map spawnen

Impressum ||Datenschutzerklärung

Forensoftware: Wbb - WoltLab GmbH || zum Archiv