MODSon[line.com] Wiki - Beta 1.0

World at War: SP Nazi Zombies

From MODSonline Wiki

Jump to: navigation, search

Contents

[edit] Player Setup

Radiant

You will need:

1 x info_player_start

4 x script_struct (4 or more means random spawning?)

Script_struct Keys and Values:

"targetname" "initial_spawn_points"

Note: Re-spawning seems to be handled by any Alive players position (info_player_respawn appears useless)

[edit] Treasure Chest (random box)

Some things in nazi_zombie are ready made prefabs:

map_source/_prefabs/zombiemode/treasure_chest.map

[edit] Weapons Cabinet

map_source/_prefabs/zombiemode/weapon_cabinet.map

[edit] Buyable Weapons

(prefab link coming)

Weapon Decal

There are decals for most weapons under:

textures>usage>signs textures>locale>decals

Weapon Model The weapon model that appears once a player buys the gun:

script_model

kvp:

classname   script_model
model       weapon_usa_flamethrower_wet (any weapon)
targetname  flamer (anything, must match the triggers target)

This model should be placed infront of the decal slightly.

Buy Trigger A Trigger_use most be covering the weapon so the player gets the hint to buy it when they are near the decal.

zombie_weapon_upgrade  m2_flamethrower_zombie
targetname             weapon_upgrade
target                 flamer
classname              trigger_use

[edit] Zombie Scripts

raw/maps/yourmapname.gsc

#include common_scripts\utility; 
#include maps\_utility;

main()
{
	level thread maps\_callbacksetup::SetupCallbacks();

	include_weapons();
	include_powerups();
	
	maps\nazi_zombie_yourmapname_fx::main();
	maps\nazi_zombie_yourmapname_anim::main();
	maps\_zombiemode::main();
	
	init_sounds();

	// If you want to modify/add to the weapons table, please copy over the _zombiemode_weapons init_weapons() and paste it here.
	// I recommend putting it in it's own function...
	// If not a MOD, you may need to provide new localized strings to reflect the proper cost.
}

init_sounds()
{
	maps\_zombiemode_utility::add_sound( "break_stone", "break_stone" );
}

// Include the weapons that are only inr your level so that the cost/hints are accurate
// Also adds these weapons to the random treasure chest.
include_weapons()
{
	// Pistols
	//include_weapon( "colt" );
	//include_weapon( "colt_dirty_harry" );
	//include_weapon( "walther" );
	include_weapon( "sw_357" );
	
	// Semi Auto
	include_weapon( "m1carbine" );
	include_weapon( "m1garand" );
	include_weapon( "gewehr43" );

	// Full Auto
	include_weapon( "stg44" );
	include_weapon( "thompson" );
	include_weapon( "mp40" );
	
	// Bolt Action

	include_weapon( "kar98k" );
	include_weapon( "springfield" );

	// Scoped
	include_weapon( "ptrs41_zombie" );
	include_weapon( "kar98k_scoped_zombie" );
		
	// Grenade
	include_weapon( "molotov" );
	// JESSE: lets go all german grenades for consistency and to reduce annoyance factor
	//	include_weapon( "fraggrenade" );
	include_weapon( "stielhandgranate" );

	// Grenade Launcher
	include_weapon( "m1garand_gl" );
	include_weapon( "m7_launcher" );
	
	// Flamethrower
	include_weapon( "m2_flamethrower_zombie" );
	
	// Shotgun
	include_weapon( "doublebarrel" );
	include_weapon( "doublebarrel_sawed_grip" );
	include_weapon( "shotgun" );
	
	// Bipod
	include_weapon( "fg42_bipod" );
	include_weapon( "mg42_bipod" );
	include_weapon( "30cal_bipod" );

	// Heavy MG
	include_weapon( "bar" );

	// Rocket Launcher
	include_weapon( "panzerschrek" );

	// Special
	include_weapon( "ray_gun" );
}

include_powerups()
{
	include_powerup( "nuke" );
	include_powerup( "insta_kill" );
	include_powerup( "double_points" );
	include_powerup( "full_ammo" );
}

include_weapon( weapon_name )
{
	maps\_zombiemode_weapons::include_zombie_weapon( weapon_name );
}

include_powerup( powerup_name )
{
	maps\_zombiemode_powerups::include_zombie_powerup( powerup_name );
}

raw/maps/yourmapname_fx.gsc

#include maps\_utility; 
#include common_scripts\utility;

main()
{

	scriptedFX();
	precache_createfx_fx();
	footsteps(); 

}

footsteps()
{
	animscripts\utility::setFootstepEffect( "asphalt",    LoadFx( "bio/player/fx_footstep_dust" ) );
	animscripts\utility::setFootstepEffect( "brick",      LoadFx( "bio/player/fx_footstep_dust" ) );
	animscripts\utility::setFootstepEffect( "carpet",     LoadFx( "bio/player/fx_footstep_dust" ) );
	animscripts\utility::setFootstepEffect( "cloth",      LoadFx( "bio/player/fx_footstep_dust" ) );
	animscripts\utility::setFootstepEffect( "concrete",   LoadFx( "bio/player/fx_footstep_dust" ) );
	animscripts\utility::setFootstepEffect( "dirt",       LoadFx( "bio/player/fx_footstep_sand" ) );
	animscripts\utility::setFootstepEffect( "foliage",    LoadFx( "bio/player/fx_footstep_dust" ) );
	animscripts\utility::setFootstepEffect( "gravel",     LoadFx( "bio/player/fx_footstep_sand" ) );
	animscripts\utility::setFootstepEffect( "grass",      LoadFx( "bio/player/fx_footstep_sand" ) );
	animscripts\utility::setFootstepEffect( "ice",        LoadFx( "bio/player/fx_footstep_snow" ) );
	animscripts\utility::setFootstepEffect( "metal",      LoadFx( "bio/player/fx_footstep_dust" ) );
	animscripts\utility::setFootstepEffect( "mud",        LoadFx( "bio/player/fx_footstep_mud" ) );
	animscripts\utility::setFootstepEffect( "paper",      LoadFx( "bio/player/fx_footstep_dust" ) );
	animscripts\utility::setFootstepEffect( "plaster",    LoadFx( "bio/player/fx_footstep_dust" ) );
	animscripts\utility::setFootstepEffect( "rock",       LoadFx( "bio/player/fx_footstep_sand" ) );
	animscripts\utility::setFootstepEffect( "sand",       LoadFx( "bio/player/fx_footstep_sand" ) );
	animscripts\utility::setFootstepEffect( "snow",       LoadFx( "bio/player/fx_footstep_snow" ) );
	animscripts\utility::setFootstepEffect( "water",      LoadFx( "bio/player/fx_footstep_water" ) );
	animscripts\utility::setFootstepEffect( "wood",       LoadFx( "bio/player/fx_footstep_dust" ) );
}

// --- Ambient_Effects ---//

precache_createfx_fx()
{
	level._effect["smoke_plume_xlg_slow_blk"]			= loadfx ("maps/ber2/fx_smk_plume_xlg_slow_blk_w");
	level._effect["smoke_hallway_faint_dark"]			= loadfx ("env/smoke/fx_smoke_hallway_faint_dark");
	level._effect["smoke_bank"]							      = loadfx ("env/smoke/fx_battlefield_smokebank_ling_lg_w");
	level._effect["battlefield_smokebank_sm_tan"]			= loadfx ("env/smoke/fx_battlefield_smokebank_ling_sm_w");
	level._effect["ash_and_embers"]					      = loadfx ("env/fire/fx_ash_embers_light");
	level._effect["smoke_window_out_small"]				= loadfx ("env/smoke/fx_smoke_door_top_exit_drk");
	level._effect["brush_smoke_smolder_sm"]			= loadfx ("env/smoke/fx_smoke_brush_smolder_md");
	level._effect["smoke_impact_smolder_w"]		  = loadfx ("env/smoke/fx_smoke_crater_w");
	level._effect["fire_window"]			        = loadfx ("env/fire/fx_fire_win_nsmk_0x35y50z");
	level._effect["fire_wall_100_150"]	  	= loadfx ("env/fire/fx_fire_wall_smk_0x100y155z");
  level._effect["water_heavy_leak"]			    = loadfx ("env/water/fx_water_drips_hvy");
  level._effect["water_heavy_leak_long"]			    = loadfx ("env/water/fx_water_drips_hvy_long");
  level._effect["wire_sparks"]		          = loadfx ("env/electrical/fx_elec_wire_spark_burst");
  level._effect["wire_sparks_blue"]		      = loadfx ("env/electrical/fx_elec_wire_spark_burst_blue");
  level._effect["fire_distant_150_600"]			= loadfx ("env/fire/fx_fire_150x600_tall_distant");
  level._effect["water_pipe_leak_md"]		      = loadfx ("env/water/fx_wtr_pipe_spill_md");
  level._effect["water_pipe_leak_sm"]		      = loadfx ("env/water/fx_wtr_pipe_spill_sm");
  level._effect["water_spill_fall"]		      = loadfx ("env/water/fx_wtr_spill_sm_thin"); 
  level._effect["water_wake_md"]		      = loadfx ("env/water/fx_water_wake_flow_md");
  level._effect["water_leak_runner"]	  		= loadfx ("env/water/fx_water_leak_runner_100");
  level._effect["water_wake_sm"]		      = loadfx ("env/water/fx_water_wake_flow_sm");
  level._effect["water_wake_mist"]		      = loadfx ("env/water/fx_water_wake_flow_mist");
  level._effect["water_splash_md"]		      = loadfx ("env/water/fx_water_splash_leak_md");
  level._effect["debris_dust_motes"]		      = loadfx ("maps/ber2/fx_debris_dust_motes");  
	level._effect["fire_bookcase_wide"]			 = loadfx ("env/fire/fx_fire_bookshelf_wide");
	level._effect["fire_column_creep_xsm"]	 = loadfx ("env/fire/fx_fire_column_creep_xsm");
	level._effect["fire_column_creep_sm"]		 = loadfx ("env/fire/fx_fire_column_creep_sm");
	level._effect["smoke_room_fill"]			  	= loadfx ("maps/ber2/fx_smoke_fill_indoor");
	level._effect["ash_and_embers_hall"]			  	= loadfx ("maps/ber2/fx_debris_hall_ash_embers");
	level._effect["fire_detail"]			           = loadfx ("env/fire/fx_fire_debris_xsmall");
	level._effect["fire_ceiling_50_100"]			   = loadfx ("env/fire/fx_fire_ceiling_50x100");
	level._effect["fire_ceiling_100_100"]			   = loadfx ("env/fire/fx_fire_ceiling_100x100");
	level._effect["ash_and_embers_small"]			  	= loadfx ("maps/ber2/fx_debris_fire_motes");
	level._effect["god_rays_large"]					   = loadfx("env/light/fx_light_god_rays_large");	
	level._effect["god_rays_medium"]				   = loadfx("env/light/fx_light_god_rays_medium");	
	level._effect["god_rays_small"]					   = loadfx("env/light/fx_light_god_ray_sm_single");
	level._effect["god_rays_small_short"]			 = loadfx("env/light/fx_light_god_ray_sm_shrt_single");
	level._effect["god_rays_dust_motes"]			 = loadfx("env/light/fx_light_god_rays_dust_motes");
	level._effect["fog_thick"]		 			    = loadfx("env/smoke/fx_fog_rolling_thick_600x600");
  level._effect["falling_lf_elm"]       			= loadfx("env/foliage/fx_leaves_fall_elm");
  level._effect["light_ceiling_dspot"]		  = loadfx ("env/light/fx_ray_ceiling_amber_dim_sm");
  level._effect["dlight_fire_glow"]			       = loadfx ("env/light/fx_dlight_fire_glow");
  level._effect["fire_static_small"]			     = loadfx ("env/fire/fx_static_fire_sm_ndlight");
	level._effect["fire_static_blk_smk"]			   = loadfx ("env/fire/fx_static_fire_md_ndlight");
}

scriptedFX()
{
	level._effect["large_ceiling_dust"]		= LoadFx( "env/dirt/fx_dust_ceiling_impact_lg_mdbrown" );
	level._effect["poltergeist"]			= LoadFx( "misc/fx_zombie_couch_effect" );
}

raw/maps/yourmapname_amb.gsc

//
// file: template_amb.csc
// description: clientside ambient script for template: setup ambient sounds, etc.
// scripter:
//

#include common_scripts\utility; 
#include maps\_utility;
#include maps\_ambientpackage;
#include maps\_music;
#include maps\_busing;

main()
{
	//************************************************************************************************
	//                                              Ambient Packages
	
//************************************************************************************************

	//declare an ambientpackage, and populate it with elements
	//mandatory parameters are <package name>, <alias name>, <spawnMin>, <spawnMax>
	//followed by optional parameters <distMin>, <distMax>, <angleMin>, <angleMax>
	
            declareAmbientPackage( "zombies" );
                addAmbientElement( "zombies", "amb_spooky_2d", 5, 8, 300, 2000 );

 		declareAmbientRoom( "zombies" );
 			//setAmbientRoomTone( "zombies", "bgt_base" );
 			setAmbientRoomReverb ("zombies","stoneroom", 1, 1);
	//************************************************************************************************
	//                                      ACTIVATE DEFAULT AMBIENT SETTINGS
	//************************************************************************************************

  activateAmbientPackage( 0, "zombies", 0 );
  activateAmbientRoom( 0, "zombies", 0 );



  declareMusicState("SPLASH_SCREEN"); //one shot dont transition until done
	musicAlias("mx_splash_screen", 12);	
	musicwaittilldone();
 

  declareMusicState("WAVE_1"); 
	musicAliasloop("mx_zombie_wave_1", 0, 4);	

	thread radio_init();

}


add_song(song)
{
	if(!isdefined(level.radio_songs))
 		level.radio_songs = [];
	level.radio_songs[level.radio_songs.size] = song;
}

fade(id, time)
{
	rate = 0;
	if(time != 0)
		rate = 1.0 / time;

	setSoundVolumeRate(id, rate);
	setSoundVolume(id, 0.0);

	while(SoundPlaying(id) && getSoundVolume(id) > .0001)
	{
		wait(.1);
	}

	stopSound(id);
}


radio_advance()
{
	for(;;)
	{
		while(SoundPlaying(level.radio_id) || level.radio_index == 0)
		{
			wait(1);
		}
		level notify("kzmb_next_song");
		wait(1);
	}
	
}


radio_thread()
{
	assert(isdefined(level.radio_id));
	assert(isdefined(level.radio_songs));
	assert(isdefined(level.radio_index));
	assert(level.radio_songs.size > 0);

	println("Starting radio at "+self.origin);

	for(;;)
	{
		level waittill("kzmb_next_song");

		println("client changing songs");

		playsound(0, "static", self.origin);

		if(SoundPlaying(level.radio_id))
		{
			fade(level.radio_id, 1);
		}
		else
		{
			wait(.5);
		}

		level.radio_id = playsound(0, level.radio_songs[level.radio_index], self.origin);
	
		level.radio_index += 1;
		
		if(level.radio_index >= level.radio_songs.size)
		{
			level.radio_index = 0;
		}

		wait(1);
	}
}


radio_init()
{

	level.radio_id = -1;
	level.radio_index = 0;
	add_song( "wtf" );
	add_song( "dog_fire" );
	add_song( "true_crime_4" );
	add_song( "all_mixed_up" );
	add_song( "dusk" );	
	add_song( "the_march" );
	add_song( "drum_no_bass" );
	add_song( "russian_theme" );
	add_song( "sand" );
	add_song( "stag_push" );
	add_song( "pby_old" );
	add_song( "wild_card" );
	add_song( "" ); //silence must be last

	// kzmb, for all the latest killer hits

	radios = getentarray(0, "kzmb","targetname");
	
	while (!isdefined(radios) || !radios.size)
	{
		wait(5); //make sure we wait around until targetname for this ent is sent over
		radios = getentarray(0, "kzmb","targetname");
	}

	println("client found "+radios.size+" radios");
	
	array_thread(radios, ::radio_thread );
	array_thread(radios, ::radio_advance );
}

raw/maps/yourmapname_anim.gsc

#include common_scripts\utility; 
#include maps\_utility; 
#include maps\_anim; 
#using_animtree( "generic_human" ); 
main()
{
	// Example Anim
	// level.scr_anim["intro_officer"]["intro"] = %ch_makinraid_intro_officer_a; 
}

[edit] Zombie Spawns

Radiant The actor in radiant:

(actor/axis/zombie_ger_ber_sshonor)

Key Values: (never include anything in rackets in the entity dialogue)

classname   actor_axis_zombie_ger_ber_sshonor
model       char_ger_wemcht_fullbody1

Making him a Zombie spawner:

add key values of:

script_forcespawn  1
targetname         zombie_spawner_init (so he spawns when the level starts)
count              9999 (number of times he can spawn)
script_noteworthy  zombie_spawner
spawnflags         3 (this ticks spawner and forcespawn for us)

Spawners are always placed out of the players line of sight (to increase realism) and are always placed above the ground by a few units to prevent them spawning in the ground.

[edit] End Cameras

This is the camera(intermission) style view you get when all players die. The camera can be static or can move from one position to the next. There can be many cameras, the game cycles through them randomly.

Radiant

1 script_struct with kvp:

"targetname" "intermission"
"speed" "10" (speed can be anything you want)

Target this first struct to a second one (no need to add more kvps to the 2nd)

The camera will now travel from the 1st to the 2nd

[edit] Zombie Radio

Radiant

misc/_prefab/zombiemode/kzmb

For the radio to function correctly a number of files are needed:

zone_source setup:

// This calls for zombie scripts including the radio
include,zombiemode
sound,common,yourmapname,all_sp
sound,generic,yourmapname,all_sp
sound,voiceovers,yourmapname,all_sp
sound,requests,yourmapname,all_sp
sound,weapons,audio_test_tuey,all_sp
sound,character,yourmapname,all_sp
sound,yourmapname,yourmapname,all_sp
sound,physics,yourmapname,all_sp
sound,projectiles,yourmapname,all_sp
sound,destructibles,yourmapname,all_sp
sound,levels,yourmapname,all_sp

rawfile,maps/yourmapname_anim.gsc
rawfile,maps/yourmapname.gsc
rawfile,maps/yourmapname_fx.gsc
rawfile,maps/yourmapname_amb.gsc
rawfile,clientscripts/yourmapname.csc
rawfile,clientscripts/yourmapname_amb.csc
rawfile,clientscripts/yourmapname_fx.csc
rawfile,clientscripts/createFX/yourmapname_fx.csc

// radio effect
fx,env/electrical/fx_elec_wire_spark_burst
fx,env/electrical/fx_elec_wire_spark_burst_blue

Soundalias

Copy and rename the nazi_zombie_prototype.csv in 'raw/soundaliases' to 'yourmapname.csv'

Scripts

'raw\clientscripts\yourmapname_amb.csc'

//
// file: template_amb.csc
// description: clientside ambient script for template: setup ambient sounds, etc.
// scripter: 		(initial clientside work - laufer)
//

#include clientscripts\_utility; 
#include clientscripts\_ambientpackage;
#include clientscripts\_music;

main()
{
	//************************************************************************************************
	//                                              Ambient Packages
	
//************************************************************************************************

	//declare an ambientpackage, and populate it with elements
	//mandatory parameters are <package name>, <alias name>, <spawnMin>, <spawnMax>
	//followed by optional parameters <distMin>, <distMax>, <angleMin>, <angleMax>
	
            declareAmbientPackage( "zombies" );
                addAmbientElement( "zombies", "amb_spooky_2d", 5, 8, 300, 2000 );

 		declareAmbientRoom( "zombies" );
 			//setAmbientRoomTone( "zombies", "bgt_base" );
 			setAmbientRoomReverb ("zombies","stoneroom", 1, 1);
	//************************************************************************************************
	//                                      ACTIVATE DEFAULT AMBIENT SETTINGS
	//************************************************************************************************

  activateAmbientPackage( 0, "zombies", 0 );
  activateAmbientRoom( 0, "zombies", 0 );



  declareMusicState("SPLASH_SCREEN"); //one shot dont transition until done
	musicAlias("mx_splash_screen", 12);	
	musicwaittilldone();
 

  declareMusicState("WAVE_1"); 
	musicAliasloop("mx_zombie_wave_1", 0, 4);	

	thread radio_init();

}


add_song(song)
{
	if(!isdefined(level.radio_songs))
 		level.radio_songs = [];
	level.radio_songs[level.radio_songs.size] = song;
}

fade(id, time)
{
	rate = 0;
	if(time != 0)
		rate = 1.0 / time;

	setSoundVolumeRate(id, rate);
	setSoundVolume(id, 0.0);

	while(SoundPlaying(id) && getSoundVolume(id) > .0001)
	{
		wait(.1);
	}

	stopSound(id);
}


radio_advance()
{
	for(;;)
	{
		while(SoundPlaying(level.radio_id) || level.radio_index == 0)
		{
			wait(1);
		}
		level notify("kzmb_next_song");
		wait(1);
	}
	
}


radio_thread()
{
	assert(isdefined(level.radio_id));
	assert(isdefined(level.radio_songs));
	assert(isdefined(level.radio_index));
	assert(level.radio_songs.size > 0);

	println("Starting radio at "+self.origin);

	for(;;)
	{
		level waittill("kzmb_next_song");

		println("client changing songs");

		playsound(0, "static", self.origin);

		if(SoundPlaying(level.radio_id))
		{
			fade(level.radio_id, 1);
		}
		else
		{
			wait(.5);
		}

		level.radio_id = playsound(0, level.radio_songs[level.radio_index], self.origin);
	
		level.radio_index += 1;
		
		if(level.radio_index >= level.radio_songs.size)
		{
			level.radio_index = 0;
		}

		wait(1);
	}
}


radio_init()
{

	level.radio_id = -1;
	level.radio_index = 0;
	add_song( "wtf" );
	add_song( "dog_fire" );
	add_song( "true_crime_4" );
	add_song( "all_mixed_up" );
	add_song( "dusk" );	
	add_song( "the_march" );
	add_song( "drum_no_bass" );
	add_song( "russian_theme" );
	add_song( "sand" );
	add_song( "stag_push" );
	add_song( "pby_old" );
	add_song( "wild_card" );
	add_song( "" ); //silence must be last

	// kzmb, for all the latest killer hits

	radios = getentarray(0, "kzmb","targetname");
	
	while (!isdefined(radios) || !radios.size)
	{
		wait(5); //make sure we wait around until targetname for this ent is sent over
		radios = getentarray(0, "kzmb","targetname");
	}

	println("client found "+radios.size+" radios");
	
	array_thread(radios, ::radio_thread );
	array_thread(radios, ::radio_advance );
}

[edit] Zombie Blockers

Blockers are buyable obstructions in a level that move to one side in order to allow a player to move through the level/into the next room.

A blocker can be a script_brushmodel or a script_model.

Example

A buyable door would consist of:

A door made of a brush with KVPs:

classname script_brushmodel
targetname door1
script_linkto 15
Image:Note.pngNote: If this is door1 then the next door would be door2 and so on

To make the door move out of the way you have to define a location for it to move to:

classname script_struct
script_linkname 15

A condition needs to be defined in order to trigger the blocker:

classname trigger_use
targetname zombie_debris
target door1
script_flag
zombie_cost 1000
Image:Note.pngNote: The Value for Script_flag is left blank, this prevents errors when loading the level in developer mode

Zombie_cost is how many points the player must spend to buy this blocker and trigger the door to move, it can be set to one of these values:

100
200
250
500
750
1000
1250
1500
1750
2000
Image:Note.pngNote: If you can access the door from both sides then you must make a trigger for both sides of the door

-- --

Image:Note.pngNote: This next part is optional

To have this blocker spawn a zombie when bought: Add these KVPs to the script_brushmodel or script_model:

target zombie_spawner_doorspawn

Then make a spawner:

script_noteworthy zombie_spawner
count 9999
script_forcespawn 1
targetname zombie_spawner_doorspawn
spawnflags 3

[edit] Zombie Barricades

Barricades are normally boarded up windows or entry ways that zombies break down and then climb through in order to gain entry to the playable space. Players can repair these barricades in order to earn points and help to slow down the zombie horde.

Barricades are made up of 4 pieces. {Note|Save a single barricade and load it into your map as a prefab in order to use it multiple times}

Script_structs

Place 1 script_struct at a position above the ground and not touching anything where the zombies will approach from:

classname script_struct
targetname exterior_goal

now place a second script_struct where you want your barricade to actually be and joine the 1st one to this one, slect the first one, select the second one and press "W".

Now make this second stript_struct with a radius:

height 64
radius 36
classname script_struct

This creates a radius which allows for when a player is touching it to see the "press f to build barrier" and for the zombies to know where to break down a barrier.

You can increase the radius if your having problems with zombies not knowing where the barricade is or the player not seeing the hint.

barricade Pieces

Now make the pieces (bricks/wooden planks, whatever you want) that the zombies have to break through (script_models work too!) and make your creation a script_brushmodel, you can have as few or as many pieces as you want, but bear in mind that how long the zombie takes to knock down a barrier will have a direct affect on gameplay, Treyach have used around 6 pieces per barricade.

You can now select your 1st script struct and connect it the individual pieces of the barricade one by one.

All barricade pieces must have key: "script_noteworthy" value: "window_south_1".

AI CLIP

Use a clip_ai (from textures>tools a red texture with "MON" on it) brush to cover your entrance way so that AI do not simply walk through the barrier. make it a script_brushmodel, and press N and make it a "Dynamic path". Connect the 1st script_struct to this clip brush.

[edit] Zombie Traverse and navigation

Zombies move around the environment much like regular AI through the use of pathnodes.

Place path nodes at 128 unit intervals (keeps the bsp size down) throughout the playable area of your level and create paths from the non_playable area which lead to barricades for the zombies to break though.

The wall_hop traverse works for zombies to allow them to climb over small (32 units high) obstacles. (misc/_prefab/traverse/wall_hop.map)

Note: Action nodes with 'dont_stand' (or crouch or prone) appear not to work for zombies.

[edit] Zombie Zone_source

A complete source for all zombie related stuff:

zone_source: yourmapname.csv

ignore,code_post_gfx,,
ignore,common,,

sound,common,yourmapname,all_sp
sound,generic,yourmapname,all_sp
sound,voiceovers,yourmapname,all_sp
sound,requests,yourmapname,all_sp
sound,weapons,audio_test_tuey,all_sp
sound,character,nyourmapname,all_sp
sound,yourmapname,nyourmapname,all_sp
sound,physics,nyourmapname,all_sp
sound,projectiles,nyourmapname,all_sp
sound,destructibles,yourmapname,all_sp
sound,levels,yourmapname,all_sp

// for zombie specific assets,,,
include,zombiemode,,

// for coop players,
include,common_player_us
rawfile,maps/yourmapname_anim.gsc
rawfile,vision/yourmapname.vision
rawfile,maps/yourmapname.gsc
rawfile,maps/yourmapname_fx.gsc
rawfile,maps/yourmapname_amb.gsc
col_map_sp,maps/yourmapname.d3dbsp
xmodel,viewmodel_usa_marine_arms
xmodel,viewmodel_usa_marine_player
rawfile,clientscripts/yourmapname.csc
rawfile,clientscripts/nyourmapname_amb.csc
rawfile,clientscripts/yourmapname_fx.csc
rawfile,clientscripts/createFX/yourmapname_fx.csc

xanim,ch_dazed_d_death
xanim,ch_dazed_c_death
xanim,ch_dazed_b_death
xanim,ch_dazed_a_death
xanim,ch_dazed_d
xanim,ch_dazed_c
xanim,ch_dazed_b
xanim,ch_dazed_a

xmodel,skybox_zombie

// WEAPONS,
// regular weapons,
weapon,sp/colt
weapon,sp/colt_dirty_harry
weapon,sp/m1garand
weapon,sp/kar98k_scoped_zombie
weapon,sp/kar98k
weapon,sp/fraggrenade
weapon,sp/m2_flamethrower_zombie
weapon,sp/molotov
weapon,sp/napalmblob
weapon,sp/napalmbloblight
weapon,sp/doublebarrel
weapon,sp/m1carbine
weapon,sp/doublebarrel_sawed_grip
weapon,sp/gewehr43
weapon,sp/ptrs41_zombie
weapon,sp/shotgun
weapon,sp/stg44
weapon,sp/thompson
weapon,sp/mp40
weapon,sp/bar
weapon,sp/springfield
weapon,sp/m1garand_gl
weapon,sp/panzerschrek
weapon,sp/mk2_frag
weapon,sp/m7_launcher
weapon,sp/walther
weapon,sp/sw_357
weapon,sp/zombie_colt
weapon,sp/stielhandgranate
weapon,sp/ray_gun

// zombie fx
fx,misc/fx_zombie_couch_effect
fx,env/smoke/fx_fog_zombie_amb
fx,bio/player/fx_footstep_dust
fx,bio/player/fx_footstep_water
fx,bio/player/fx_footstep_sand
fx,bio/player/fx_footstep_mud

fx,env/electrical/fx_elec_wire_spark_burst
fx,env/electrical/fx_elec_wire_spark_burst_blue

The zombiemode.csv (not included with the tools by default)

include,flamethrower

// strings
localize,zombie

// viewmodel arms
xmodel,viewmodel_usa_marine_arms
xmodel,viewmodel_usa_marine_player

// player zombie melee arms - the "weapon"
weapon,sp/zombie_melee

// Needed for laststand
weapon,sp/fraggrenade
weapon,sp/colt

// zombie anims
xanim,ai_zombie_attack_forward_v1
xanim,ai_zombie_attack_forward_v2
xanim,ai_zombie_attack_v1
xanim,ai_zombie_attack_v2
xanim,ai_zombie_crawl_death_v1
xanim,ai_zombie_crawl_death_v2
xanim,ai_zombie_crawl_v1
xanim,ai_zombie_death_v1
xanim,ai_zombie_death_v2
xanim,ai_zombie_door_pound_v1
xanim,ai_zombie_door_pound_v2
xanim,ai_zombie_door_tear_v1
xanim,ai_zombie_idle_v1
xanim,ai_zombie_idle_v1_delta
xanim,ai_zombie_shot_arm_left
xanim,ai_zombie_shot_arm_right
xanim,ai_zombie_shot_leg_left_2_crawl
xanim,ai_zombie_shot_leg_right_2_crawl
xanim,ai_zombie_sprint_v1
xanim,ai_zombie_sprint_v2
xanim,ai_zombie_walk_fast_v1
xanim,ai_zombie_walk_fast_v2
xanim,ai_zombie_walk_fast_v3
xanim,ai_zombie_walk_v1
xanim,ai_zombie_walk_v2
xanim,ai_zombie_walk_v3
xanim,ai_zombie_walk_v4
xanim,ai_zombie_door_tear_v2
xanim,ai_zombie_walk_fast_v1
xanim,ai_zombie_walk_fast_v2
xanim,ai_zombie_walk_fast_v3
xanim,ai_zombie_sprint_v1
xanim,ai_zombie_sprint_v2
xanim,ai_zombie_crawl
xanim,ai_zombie_crawl_v1
xanim,ai_zombie_crawl_death_v1
xanim,ai_zombie_crawl_death_v2	
xanim,ai_zombie_crawl_sprint
xanim,ai_zombie_idle_crawl
xanim,ai_zombie_idle_crawl_base
xanim,ai_zombie_idle_crawl_delta
xanim,ai_zombie_attack_crawl
xanim,ai_zombie_attack_crawl_lunge

// tear anims
xanim,ai_zombie_door_tear_v1
xanim,ai_zombie_door_tear_v2
xanim,ai_zombie_door_tear_high
xanim,ai_zombie_door_tear_left
xanim,ai_zombie_door_tear_right
xanim,ai_zombie_door_tear_low

// pound door animations
xanim,ai_zombie_door_pound_v1
xanim,ai_zombie_door_pound_v2

// after gib shot anims
xanim,ai_zombie_shot_arm_left
xanim,ai_zombie_shot_arm_right
xanim,ai_zombie_shot_leg_left_2_crawl
xanim,ai_zombie_shot_leg_right_2_crawl

// melee anims
xanim,ai_zombie_attack_forward_v1
xanim,ai_zombie_attack_forward_v2
xanim,ai_zombie_attack_v1
xanim,ai_zombie_attack_v2

// idle
xanim,ai_zombie_idle_v1
xanim,ai_zombie_idle_base

// traverse
xanim,ai_zombie_traverse_v1
xanim,ai_zombie_traverse_v2
xanim,ai_zombie_traverse_crawl_v1
		
rawfile,maps/_zombiemode.gsc
rawfile,maps/_zombiemode_score.gsc
rawfile,maps/_zombiemode_blockers.gsc
rawfile,maps/_zombiemode_utility.gsc
rawfile,maps/_zombiemode_spawner.gsc
rawfile,maps/_zombiemode_weapons.gsc
rawfile,maps/_zombiemode_powerups.gsc
rawfile,maps/_zombiemode_radio.gsc

rawfile,vision/zombie.vision

// materials 
material,zombie_intro
material,nazi_intro
material,hud_chalk_1
material,hud_chalk_2
material,hud_chalk_3
material,hud_chalk_4
material,hud_chalk_5

// leaderboard materials
material,scorebar_zom_1
material,scorebar_zom_2
material,scorebar_zom_3
material,scorebar_zom_4
material,scorebar_zom_long_1
material,scorebar_zom_long_2
material,scorebar_zom_long_3
material,scorebar_zom_long_4

// fog at edge of level
fx,env/smoke/fx_fog_zombie_amb
fx,env/light/fx_ray_sun_sm_short

// neckstump
xmodel,char_ger_honorgd_zomb_behead

// head gib stuff
fx,misc/fx_zombie_bloodsplat
fx,misc/fx_zombie_bloodspurt

// eye piece
xmodel,char_ger_zombieeye

// SRS 9/2/2008: for playing fx that we need to stop
xmodel,tag_origin

// FX for the eyes
fx,misc/fx_zombie_eye_single

// FX for player being a zombie
fx,misc/fx_zombie_grain_cloud

//zombie powerups
fx,misc/fx_zombie_powerup_on
fx,misc/fx_zombie_powerup_grab
fx,misc/fx_zombie_powerup_wave
fx,misc/fx_zombie_mini_nuke
fx,misc/fx_zombie_mini_nuke_hotness
xmodel,zombie_bomb
xmodel,zombie_skull
xmodel,zombie_x2_icon
xmodel,zombie_ammocan

// radio fx
fx,env/electrical/fx_elec_short_oneshot
xmodel,static_berlin_ger_radio

[edit] Defining the Playable Area

This is to determine whether or not a zombie is within the playable area so said zombie can(t) drop a pickup.

Radiant

Make as many brushes as you need covering the playable areas of your map, texture them with tools>trigger (we use this as a reference to what the brush does). SELECT ALL the triggers at once. Make them trigger_multiples.

targetname playable_area

[edit] Common Errors

-fill this with known errors and their answers/fixes if possible-

Personal tools