UGX-Mods Login

or login with an authentication provider below
Sign In with Google
Sign In with Twitter
Sign In with Discord
Sign In with Steam
Sign In with Facebook
Sign In with Twitch

[Powerup] Zombie Blood [Update #5 2/20]

broken avatar :(
Created 9 years ago
by DidUknowiPwn
0 Members and 1 Guest are viewing this topic.
8,496 views
broken avatar :(
×
broken avatar :(
[UGX] Documentation Writer & Programmer
Location: usLos Angeles, CA
Date Registered: 23 August 2013
Last active: 7 months ago
Posts
1,322
Respect
Forum Rank
Zombie Colossus
Primary Group
UGX Team Member
My Groups
More
My Contact & Social Links
More
Personal Quote
(ง º ω º )ง u wont sum m8y?
Signature
Do not take life too seriously. You will never get out of it alive.
×
DidUknowiPwn's Groups
UGX Team Member
Donator ♥ Benevolent Soul who has our eternal gratitude and exclusive access to betas and the donator section of the forum.
Community Scripter Elite Has shown excellence and experience in the area of custom scripting in the UGX-Mods community.
BO3 Modtools Alpha
BO3 Modtools Alpha
This user has access to the Black Ops 3 Modtools Alpha
Video: Call of Duty: World at War - Zombie Blood Script - [Instance: 1]

Tutorial:

_zombiemode_powerups.gsc
Code Snippet
Plaintext
#include maps\_utility;
#include common_scripts\utility;
#include maps\_zombiemode_utility;

init()
{

PrecacheShader( "specialty_doublepoints_zombies" );
PrecacheShader( "specialty_instakill_zombies" );
//DUKIP - Add zombie blood.
//PreCacheShader( "specialty_blood_zombies" );


PrecacheShader( "black" );
// powerup Vars
set_zombie_var( "zombie_insta_kill", 0 );
set_zombie_var( "zombie_point_scalar", 1 );
set_zombie_var( "zombie_drop_item", 0 );
set_zombie_var( "zombie_timer_offset", 350 ); // hud offsets
set_zombie_var( "zombie_timer_offset_interval", 30 );
set_zombie_var( "zombie_powerup_insta_kill_on", false );
set_zombie_var( "zombie_powerup_point_doubler_on", false );
set_zombie_var( "zombie_powerup_point_doubler_time", 30 ); // length of point doubler
set_zombie_var( "zombie_powerup_insta_kill_time", 30 ); // length of insta kill
set_zombie_var( "zombie_powerup_drop_increment", 2000 ); // lower this to make drop happen more often
set_zombie_var( "zombie_powerup_drop_max_per_round", 4 ); // lower this to make drop happen more often
//DUKIP - Why make it level-wide it's not right?
//This is not even used really.
set_zombie_var( "zombie_powerup_zombie_blood_on", 0 );
set_zombie_var( "zombie_powerup_zombie_blood_time", 30 );
//DUKIP - Set vars through player like in T6.
level thread onPlayerConnect();
// powerups
level._effect["powerup_on"] = loadfx( "misc/fx_zombie_powerup_on" );
level._effect["powerup_grabbed"] = loadfx( "misc/fx_zombie_powerup_grab" );
level._effect["powerup_grabbed_wave"] = loadfx( "misc/fx_zombie_powerup_wave" );

init_powerups();

thread watch_for_drop();
}

//DUKIP - Connecting functions
onPlayerConnect()
{
for( ;; )
{
level waittill( "connecting", player );
player thread init_player_zombie_blood_vars();
}
}

//DUKIP - Follow how T6 does it.
init_player_zombie_blood_vars()
{
self.zombie_vars[ "zombie_powerup_zombie_blood_on" ] = 0;
self.zombie_vars[ "zombie_powerup_zombie_blood_time" ] = 30;
}
//

init_powerups()
{
if( !IsDefined( level.zombie_powerup_array ) )
{
level.zombie_powerup_array = [];
}
if ( !IsDefined( level.zombie_special_drop_array ) )
{
level.zombie_special_drop_array = [];
}

// Random Drops
add_zombie_powerup( "nuke", "zombie_bomb", &"ZOMBIE_POWERUP_NUKE", "misc/fx_zombie_mini_nuke" );
// add_zombie_powerup( "nuke", "zombie_bomb", &"ZOMBIE_POWERUP_NUKE", "misc/fx_zombie_mini_nuke_hotness" );
add_zombie_powerup( "insta_kill", "zombie_skull", &"ZOMBIE_POWERUP_INSTA_KILL" );
add_zombie_powerup( "double_points","zombie_x2_icon", &"ZOMBIE_POWERUP_DOUBLE_POINTS" );
add_zombie_powerup( "full_ammo",  "zombie_ammocan", &"ZOMBIE_POWERUP_MAX_AMMO");
add_zombie_powerup( "carpenter",  "zombie_carpenter", &"ZOMBIE_POWERUP_MAX_AMMO");
//DUKIP - Add zombie blood.
add_zombie_powerup( "blood",  "zombie_blood", &"ZOMBIE_POWERUP_MAX_AMMO");

// add_zombie_special_powerup( "monkey" );

// additional special "drops"
// add_zombie_special_drop( "nothing" );
add_zombie_special_drop( "dog" );

// Randomize the order
randomize_powerups();

level.zombie_powerup_index = 0;
randomize_powerups();

level thread powerup_hud_overlay();
}

powerup_hud_overlay()
{
level.powerup_hud_array = [];
level.powerup_hud_array[0] = true;
level.powerup_hud_array[1] = true;
//DUKIP - Same as below
//deprecated as t4 uses level vars instead of self for powerup huds
//requires rewriting, will keep it simple for now.
//level.powerup_hud_array[2] = true;

level.powerup_hud = [];
level.powerup_hud_cover = [];
level endon ("disconnect");

//DUKIP - Change array creation to 0-2 rather than 0-1
//deprecated back to 0-1
//for(i = 0; i < 3; i++)
for(i = 0; i < 2; i++)
{
level.powerup_hud[i] = create_simple_hud();
level.powerup_hud[i].foreground = true;
level.powerup_hud[i].sort = 2;
level.powerup_hud[i].hidewheninmenu = false;
level.powerup_hud[i].alignX = "center";
level.powerup_hud[i].alignY = "bottom";
level.powerup_hud[i].horzAlign = "center";
level.powerup_hud[i].vertAlign = "bottom";
level.powerup_hud[i].x = -32 + (i * 15);
level.powerup_hud[i].y = level.powerup_hud[i].y - 35;
level.powerup_hud[i].alpha = 0.8;
}

shader_2x = "specialty_doublepoints_zombies";
shader_insta = "specialty_instakill_zombies";
//DUKIP - Add ZM Blood shader
//shader_blood = "specialty_blood_zombies";

while(true)
{
if(level.zombie_vars["zombie_powerup_insta_kill_time"] < 5)
{
wait(0.1);
level.powerup_hud[1].alpha = 0;
wait(0.1);


}
else if(level.zombie_vars["zombie_powerup_insta_kill_time"] < 10)
{
wait(0.2);
level.powerup_hud[1].alpha = 0;
wait(0.18);

}

if(level.zombie_vars["zombie_powerup_point_doubler_time"] < 5)
{
wait(0.1);
level.powerup_hud[0].alpha = 0;
wait(0.1);


}
else if(level.zombie_vars["zombie_powerup_point_doubler_time"] < 10)
{
wait(0.2);
level.powerup_hud[0].alpha = 0;
wait(0.18);
}

if(level.zombie_vars["zombie_powerup_point_doubler_on"] == true && level.zombie_vars["zombie_powerup_insta_kill_on"] == true)
{

level.powerup_hud[0].x = -24;
level.powerup_hud[1].x = 24;
level.powerup_hud[0].alpha = 1;
level.powerup_hud[1].alpha = 1;
level.powerup_hud[0] setshader(shader_2x, 32, 32);
level.powerup_hud[1] setshader(shader_insta, 32, 32);
/*level.powerup_hud_cover[0].x = -36;
level.powerup_hud_cover[1].x = 36;
level.powerup_hud_cover[0] setshader(shader_white, 32, i);
level.powerup_hud_cover[1] setshader(shader_white, 32, j);
level.powerup_hud_cover[0].alpha = 1;
level.powerup_hud_cover[1].alpha = 1;*/

}
else if(level.zombie_vars["zombie_powerup_point_doubler_on"] == true && level.zombie_vars["zombie_powerup_insta_kill_on"] == false)
{
level.powerup_hud[0].x = 0;
//level.powerup_hud[0].y = level.powerup_hud[0].y - 70;
level.powerup_hud[0] setshader(shader_2x, 32, 32);
level.powerup_hud[1].alpha = 0;
level.powerup_hud[0].alpha = 1;

}
else if(level.zombie_vars["zombie_powerup_insta_kill_on"] == true && level.zombie_vars["zombie_powerup_point_doubler_on"] == false)
{

level.powerup_hud[1].x = 0;
//level.powerup_hud[1].y = level.powerup_hud[1].y - 70;
level.powerup_hud[1] setshader(shader_insta, 32, 32);
level.powerup_hud[0].alpha = 0;
level.powerup_hud[1].alpha = 1;
}
else
{

level.powerup_hud[1].alpha = 0;
level.powerup_hud[0].alpha = 0;

}

wait(0.01);
}
}

randomize_powerups()
{
level.zombie_powerup_array = array_randomize( level.zombie_powerup_array );
}

get_next_powerup()
{
if( level.zombie_powerup_index >= level.zombie_powerup_array.size )
{
level.zombie_powerup_index = 0;
randomize_powerups();
}

powerup = level.zombie_powerup_array[level.zombie_powerup_index];

/#
if( isdefined( level.zombie_devgui_power ) && level.zombie_devgui_power == 1 )
return powerup;

#/

//level.windows_destroyed = get_num_window_destroyed();

while( powerup == "carpenter" && get_num_window_destroyed() < 5)
{


if( level.zombie_powerup_index >= level.zombie_powerup_array.size )
{
level.zombie_powerup_index = 0;
randomize_powerups();
}


powerup = level.zombie_powerup_array[level.zombie_powerup_index];
level.zombie_powerup_index++;

if( powerup != "carpenter" )
return powerup;


wait(0.05);
}

level.zombie_powerup_index++;

return powerup;
}

get_num_window_destroyed()
{
num = 0;
for( i = 0; i < level.exterior_goals.size; i++ )
{
/*targets = getentarray(level.exterior_goals[i].target, "targetname");

barrier_chunks = [];
for( j = 0; j < targets.size; j++ )
{
if( IsDefined( targets[j].script_noteworthy ) )
{
if( targets[j].script_noteworthy == "clip" )
{
continue;
}
}

barrier_chunks[barrier_chunks.size] = targets[j];
}*/


if( all_chunks_destroyed( level.exterior_goals[i].barrier_chunks ) )
{
num += 1;
}

}

return num;
}

watch_for_drop()
{
players = get_players();
score_to_drop = ( players.size * level.zombie_vars["zombie_score_start"] ) + level.zombie_vars["zombie_powerup_drop_increment"];

while (1)
{
players = get_players();

curr_total_score = 0;

for (i = 0; i < players.size; i++)
{
curr_total_score += players[i].score_total;
}

if (curr_total_score > score_to_drop )
{
level.zombie_vars["zombie_powerup_drop_increment"] *= 1.14;
score_to_drop = curr_total_score + level.zombie_vars["zombie_powerup_drop_increment"];
level.zombie_vars["zombie_drop_item"] = 1;
}

wait( 0.5 );
}
}

add_zombie_powerup( powerup_name, model_name, hint, fx )
{
if( IsDefined( level.zombie_include_powerups ) && !IsDefined( level.zombie_include_powerups[powerup_name] ) )
{
return;
}

PrecacheModel( model_name );
PrecacheString( hint );

struct = SpawnStruct();

if( !IsDefined( level.zombie_powerups ) )
{
level.zombie_powerups = [];
}

struct.powerup_name = powerup_name;
struct.model_name = model_name;
struct.weapon_classname = "script_model";
struct.hint = hint;

if( IsDefined( fx ) )
{
struct.fx = LoadFx( fx );
}

level.zombie_powerups[powerup_name] = struct;
level.zombie_powerup_array[level.zombie_powerup_array.size] = powerup_name;
add_zombie_special_drop( powerup_name );
}


// special powerup list for the teleporter drop
add_zombie_special_drop( powerup_name )
{
level.zombie_special_drop_array[ level.zombie_special_drop_array.size ] = powerup_name;
}

include_zombie_powerup( powerup_name )
{
if( !IsDefined( level.zombie_include_powerups ) )
{
level.zombie_include_powerups = [];
}

level.zombie_include_powerups[powerup_name] = true;
}

powerup_round_start()
{
level.powerup_drop_count = 0;
}

powerup_drop(drop_point)
{
rand_drop = randomint(100);

if( level.powerup_drop_count >= level.zombie_vars["zombie_powerup_drop_max_per_round"] )
{
println( "^3POWERUP DROP EXCEEDED THE MAX PER ROUND!" );
return;
}

if( !isDefined(level.zombie_include_powerups) || level.zombie_include_powerups.size == 0 )
{
return;
}

// some guys randomly drop, but most of the time they check for the drop flag
if (rand_drop > 2)
{
if (!level.zombie_vars["zombie_drop_item"])
{
return;
}

debug = "score";
}
else
{
debug = "random";
}

// never drop unless in the playable area
playable_area = getentarray("playable_area","targetname");

powerup = maps\_zombiemode_net::network_safe_spawn( "powerup", 1, "script_model", drop_point + (0,0,40));

//chris_p - fixed bug where you could not have more than 1 playable area trigger for the whole map
valid_drop = false;
for (i = 0; i < playable_area.size; i++)
{
if (powerup istouching(playable_area[i]))
{
valid_drop = true;
}
}

if(!valid_drop)
{
powerup delete();
return;
}

powerup powerup_setup();
level.powerup_drop_count++;

//print_powerup_drop( powerup.powerup_name, debug );

powerup thread powerup_timeout();
powerup thread powerup_wobble();
powerup thread powerup_grab();

level.zombie_vars["zombie_drop_item"] = 0;


//powerup = powerup_setup();


// if is !is touching trig
// return

// spawn the model, do a ground trace and place above
// start the movement logic, spawn the fx
// start the time out logic
// start the grab logic
}


//
// Special power up drop - done outside of the powerup system.
special_powerup_drop(drop_point)
{
// if( level.powerup_drop_count == level.zombie_vars["zombie_powerup_drop_max_per_round"] )
// {
// println( "^3POWERUP DROP EXCEEDED THE MAX PER ROUND!" );
// return;
// }

if( !isDefined(level.zombie_include_powerups) || level.zombie_include_powerups.size == 0 )
{
return;
}

powerup = spawn ("script_model", drop_point + (0,0,40));

// never drop unless in the playable area
playable_area = getentarray("playable_area","targetname");
//chris_p - fixed bug where you could not have more than 1 playable area trigger for the whole map
valid_drop = false;
for (i = 0; i < playable_area.size; i++)
{
if (powerup istouching(playable_area[i]))
{
valid_drop = true;
break;
}
}

if(!valid_drop)
{
powerup Delete();
return;
}

powerup special_drop_setup();
}


//
// Pick the next powerup in the list
powerup_setup()
{
powerup = get_next_powerup();

struct = level.zombie_powerups[powerup];
self SetModel( struct.model_name );

//TUEY Spawn Powerup
playsoundatposition("spawn_powerup", self.origin);

self.powerup_name = struct.powerup_name;
self.hint = struct.hint;

if( IsDefined( struct.fx ) )
{
self.fx = struct.fx;
}

self PlayLoopSound("spawn_powerup_loop");
}


//
// Get the special teleporter drop
special_drop_setup()
{
powerup = undefined;
is_powerup = true;
// Always give something at lower rounds or if a player is in last stand mode.
if ( level.round_number <= 10 || maps\_laststand::player_num_in_laststand() )
{
powerup = get_next_powerup();
}
// Gets harder now
else
{
powerup = level.zombie_special_drop_array[ RandomInt(level.zombie_special_drop_array.size) ];
if ( level.round_number > 15 &&
( RandomInt(100) < (level.round_number - 15)*5 ) )
{
powerup = "nothing";
}
}
//MM test  Change this if you want the same thing to keep spawning
// powerup = "dog";
switch ( powerup )
{
// Don't need to do anything special
case "nuke":
case "insta_kill":
case "double_points":
case "carpenter":
//DUKIP - Added zombie blood.
case "blood":
break;

// Limit max ammo drops because it's too powerful
case "full_ammo":
if ( level.round_number > 10 &&
( RandomInt(100) < (level.round_number - 10)*5 ) )
{
// Randomly pick another one
powerup = level.zombie_powerup_array[ RandomInt(level.zombie_powerup_array.size) ];
}
break;

case "dog":
if ( level.round_number >= 15 )
{
is_powerup = false;
dog_spawners = GetEntArray( "special_dog_spawner", "targetname" );
maps\_zombiemode_dogs::special_dog_spawn( dog_spawners, 1 );
//iprintlnbold( "Samantha Sez: No Powerup For You!" );
thread play_sound_2d( "sam_nospawn" );
}
else
{
powerup = get_next_powerup();
}
break;

// Nothing drops!!
default: // "nothing"
is_powerup = false;
Playfx( level._effect["lightning_dog_spawn"], self.origin );
playsoundatposition( "pre_spawn", self.origin );
wait( 1.5 );
playsoundatposition( "bolt", self.origin );

Earthquake( 0.5, 0.75, self.origin, 1000);
PlayRumbleOnPosition("explosion_generic", self.origin);
playsoundatposition( "spawn", self.origin );

wait( 1.0 );
//iprintlnbold( "Samantha Sez: No Powerup For You!" );
thread play_sound_2d( "sam_nospawn" );
self Delete();
}

if ( is_powerup )
{
Playfx( level._effect["lightning_dog_spawn"], self.origin );
playsoundatposition( "pre_spawn", self.origin );
wait( 1.5 );
playsoundatposition( "bolt", self.origin );

Earthquake( 0.5, 0.75, self.origin, 1000);
PlayRumbleOnPosition("explosion_generic", self.origin);
playsoundatposition( "spawn", self.origin );

// wait( 0.5 );

struct = level.zombie_powerups[powerup];
self SetModel( struct.model_name );

//TUEY Spawn Powerup
playsoundatposition("spawn_powerup", self.origin);

self.powerup_name = struct.powerup_name;
self.hint = struct.hint;

if( IsDefined( struct.fx ) )
{
self.fx = struct.fx;
}

self PlayLoopSound("spawn_powerup_loop");

self thread powerup_timeout();
self thread powerup_wobble();
self thread powerup_grab();
}
}

powerup_grab()
{
self endon ("powerup_timedout");
self endon ("powerup_grabbed");

while (isdefined(self))
{
players = get_players();

for (i = 0; i < players.size; i++)
{
if (distance (players[i].origin, self.origin) < 64)
{
playfx (level._effect["powerup_grabbed"], self.origin);
playfx (level._effect["powerup_grabbed_wave"], self.origin);

if( IsDefined( level.zombie_powerup_grab_func ) )
{
level thread [[level.zombie_powerup_grab_func]]();
}
else
{
switch (self.powerup_name)
{
case "nuke":
level thread nuke_powerup( self );

//chrisp - adding powerup VO sounds
players[i] thread powerup_vo("nuke");
zombies = getaiarray("axis");
players[i].zombie_nuked = get_array_of_closest( self.origin, zombies );
players[i] notify("nuke_triggered");

break;
case "full_ammo":
level thread full_ammo_powerup( self );
players[i] thread powerup_vo("full_ammo");
break;
case "double_points":
level thread double_points_powerup( self );
players[i] thread powerup_vo("double_points");
break;
case "insta_kill":
level thread insta_kill_powerup( self );
players[i] thread powerup_vo("insta_kill");
break;
case "carpenter":
level thread start_carpenter( self.origin );
players[i] thread powerup_vo("carpenter");
break;
//DUKIP - Add zombie blood
case "blood":
players[i] thread zombie_blood_powerup();
break;

default:
println ("Unrecognized poweup.");
break;
}
}

wait( 0.1 );

playsoundatposition("powerup_grabbed", self.origin);
self stoploopsound();

self delete();
self notify ("powerup_grabbed");
}
}
wait 0.1;
}
}

start_carpenter( origin )
{

level thread play_devil_dialog("carp_vox");
window_boards = getstructarray( "exterior_goal", "targetname" );
total = level.exterior_goals.size;

//COLLIN
carp_ent = spawn("script_origin", (0,0,0));
carp_ent playloopsound( "carp_loop" );

while(true)
{
windows = get_closest_window_repair(window_boards, origin);
if( !IsDefined( windows ) )
{
carp_ent stoploopsound( 1 );
carp_ent playsound( "carp_end", "sound_done" );
carp_ent waittill( "sound_done" );
break;
}

else
window_boards = array_remove(window_boards, windows);


while(1)
{
if( all_chunks_intact( windows.barrier_chunks ) )
{
break;
}

chunk = get_random_destroyed_chunk( windows.barrier_chunks );

if( !IsDefined( chunk ) )
break;

windows thread maps\_zombiemode_blockers_new::replace_chunk( chunk, false, true );
windows.clip enable_trigger();
windows.clip DisconnectPaths();
wait_network_frame();
wait(0.05);
}


wait_network_frame();

}


players = get_players();
for(i = 0; i < players.size; i++)
{
players[i].score += 200;
players[i].score_total += 200;
players[i] maps\_zombiemode_score::set_player_score_hud();
}


carp_ent delete();


}
get_closest_window_repair( windows, origin )
{
current_window = undefined;
shortest_distance = undefined;
for( i = 0; i < windows.size; i++ )
{
if( all_chunks_intact(windows[i].barrier_chunks ) )
continue;

if( !IsDefined( current_window ) )
{
current_window = windows[i];
shortest_distance = DistanceSquared( current_window.origin, origin );

}
else
{
if( DistanceSquared(windows[i].origin, origin) < shortest_distance )
{

current_window = windows[i];
shortest_distance =  DistanceSquared( windows[i].origin, origin );
}

}

}

return current_window;


}

powerup_vo(type)
{
self endon("death");
self endon("disconnect");

index = maps\_zombiemode_weapons::get_player_index(self);
sound = undefined;
rand = randomintrange(0,3);
vox_rand = randomintrange(1,100);  //RARE: This is to setup the Rare devil response lines
percentage = 1;  //What percent chance the rare devil response line has to play

if(!isdefined (level.player_is_speaking))
{
level.player_is_speaking = 0;
}

wait(randomfloatrange(1,2));

switch(type)
{
case "nuke":
if( vox_rand <= percentage )
{
//sound = "plr_" + index + "_vox_resp_dev_rare_" + rand;
//iprintlnbold( "Whoopdedoo, rare Devil Response line" );
}
else
{
sound = "plr_" + index + "_vox_powerup_nuke_" + rand;
}
break;
case "insta_kill":
if( vox_rand <= percentage )
{
//sound = "plr_" + index + "_vox_resp_dev_rare_" + rand;
//iprintlnbold( "Whoopdedoo, rare Devil Response line" );
}
else
{
sound = "plr_" + index + "_vox_powerup_insta_" + rand;
}
break;
case "full_ammo":
if( vox_rand <= percentage )
{
//sound = "plr_" + index + "_vox_resp_dev_rare_" + rand;
//iprintlnbold( "Whoopdedoo, rare Devil Response line" );
}
else
{
sound = "plr_" + index + "_vox_powerup_ammo_" + rand;
}
break;
case "double_points":
if( vox_rand <= percentage )
{
//sound = "plr_" + index + "_vox_resp_dev_rare_" + rand;
//iprintlnbold( "Whoopdedoo, rare Devil Response line" );
}
else
{
sound = "plr_" + index + "_vox_powerup_double_" + rand;
}
break;
case "carpenter":
if( vox_rand <= percentage )
{
//sound = "plr_" + index + "_vox_resp_dev_rare_" + rand;
//iprintlnbold( "Whoopdedoo, rare Devil Response line" );
}
else
{
sound = "plr_" + index + "_vox_powerup_carp_" + rand;
}
break;
//DUKIP - Add zombie blood, don't do any plr vox sounds though.
case "blood":
break;
}

//This keeps multiple voice overs from playing on the same player (both killstreaks and headshots).
if (level.player_is_speaking != 1 && isDefined(sound))
{
level.player_is_speaking = 1;
self playsound(sound, "sound_done");
self waittill("sound_done");
level.player_is_speaking = 0;
}


}

powerup_wobble()
{
self endon ("powerup_grabbed");
self endon ("powerup_timedout");

if (isdefined(self))
{
playfxontag (level._effect["powerup_on"], self, "tag_origin");
}

while (isdefined(self))
{
waittime = randomfloatrange(2.5, 5);
yaw = RandomInt( 360 );
if( yaw > 300 )
{
yaw = 300;
}
else if( yaw < 60 )
{
yaw = 60;
}
yaw = self.angles[1] + yaw;
self rotateto ((-60 + randomint(120), yaw, -45 + randomint(90)), waittime, waittime * 0.5, waittime * 0.5);
wait randomfloat (waittime - 0.1);
}
}

powerup_timeout()
{
self endon ("powerup_grabbed");

wait 15;

for (i = 0; i < 40; i++)
{
// hide and show
if (i % 2)
{
self hide();
}
else
{
self show();
}

if (i < 15)
{
wait 0.5;
}
else if (i < 25)
{
wait 0.25;
}
else
{
wait 0.1;
}
}

self notify ("powerup_timedout");
self delete();
}

// kill them all!
nuke_powerup( drop_item )
{
zombies = getaispeciesarray("axis");

PlayFx( drop_item.fx, drop_item.origin );
// players = get_players();
// array_thread (players, ::nuke_flash);
level thread nuke_flash();



zombies = get_array_of_closest( drop_item.origin, zombies );

for (i = 0; i < zombies.size; i++)
{
wait (randomfloatrange(0.1, 0.7));
if( !IsDefined( zombies[i] ) )
{
continue;
}

if( zombies[i].animname == "boss_zombie" )
{
continue;
}

if( is_magic_bullet_shield_enabled( zombies[i] ) )
{
continue;
}

if( i < 5 && !( zombies[i] enemy_is_dog() ) )
{
zombies[i] thread animscripts\death::flame_death_fx();

}

if( !( zombies[i] enemy_is_dog() ) )
{
zombies[i] maps\_zombiemode_spawner::zombie_head_gib();
}

zombies[i] dodamage( zombies[i].health + 666, zombies[i].origin );
playsoundatposition( "nuked", zombies[i].origin );
}

players = get_players();
for(i = 0; i < players.size; i++)
{
players[i].score += 400;
players[i].score_total += 400;
players[i] maps\_zombiemode_score::set_player_score_hud();
}

}

nuke_flash()
{
players = getplayers();
for(i=0; i<players.size; i ++)
{
players[i] play_sound_2d("nuke_flash");
}
level thread devil_dialog_delay();


fadetowhite = newhudelem();

fadetowhite.x = 0;
fadetowhite.y = 0;
fadetowhite.alpha = 0;

fadetowhite.horzAlign = "fullscreen";
fadetowhite.vertAlign = "fullscreen";
fadetowhite.foreground = true;
fadetowhite SetShader( "white", 640, 480 );

// Fade into white
fadetowhite FadeOverTime( 0.2 );
fadetowhite.alpha = 0.8;

wait 0.5;
fadetowhite FadeOverTime( 1.0 );
fadetowhite.alpha = 0;

wait 1.1;
fadetowhite destroy();
}

// double the points
double_points_powerup( drop_item )
{
level notify ("powerup points scaled");
level endon ("powerup points scaled");

// players = get_players();
// array_thread(level,::point_doubler_on_hud, drop_item);
level thread point_doubler_on_hud( drop_item );

level.zombie_vars["zombie_point_scalar"] = 2;
wait 30;

level.zombie_vars["zombie_point_scalar"] = 1;
}

full_ammo_powerup( drop_item )
{
players = get_players();

for (i = 0; i < players.size; i++)
{
primaryWeapons = players[i] GetWeaponsList();

for( x = 0; x < primaryWeapons.size; x++ )
{
players[i] GiveMaxAmmo( primaryWeapons[x] );
}
}
// array_thread (players, ::full_ammo_on_hud, drop_item);
level thread full_ammo_on_hud( drop_item );
}

insta_kill_powerup( drop_item )
{
level notify( "powerup instakill" );
level endon( "powerup instakill" );


// array_thread (players, ::insta_kill_on_hud, drop_item);
level thread insta_kill_on_hud( drop_item );

level.zombie_vars["zombie_insta_kill"] = 1;
wait( 30 );
level.zombie_vars["zombie_insta_kill"] = 0;
players = get_players();
for(i = 0; i < players.size; i++)
{
players[i] notify("insta_kill_over");

}

}

check_for_instakill( player )
{
if( IsDefined( player ) && IsAlive( player ) && level.zombie_vars["zombie_insta_kill"])
{
if( is_magic_bullet_shield_enabled( self ) )
{
return;
}

if( self.animname == "boss_zombie" )
{
return;
}

if(player.use_weapon_type == "MOD_MELEE")
{
player.last_kill_method = "MOD_MELEE";
}
else
{
player.last_kill_method = "MOD_UNKNOWN";

}

if( flag( "dog_round" ) )
{
self DoDamage( self.health + 666, self.origin, player );
player notify("zombie_killed");
}
else
{
self maps\_zombiemode_spawner::zombie_head_gib();
self DoDamage( self.health + 666, self.origin, player );
player notify("zombie_killed");

}
}
}

insta_kill_on_hud( drop_item )
{
self endon ("disconnect");

// check to see if this is on or not
if ( level.zombie_vars["zombie_powerup_insta_kill_on"] )
{
// reset the time and keep going
level.zombie_vars["zombie_powerup_insta_kill_time"] = 30;
return;
}

level.zombie_vars["zombie_powerup_insta_kill_on"] = true;

// set up the hudelem
//hudelem = maps\_hud_util::createFontString( "objective", 2 );
//hudelem maps\_hud_util::setPoint( "TOP", undefined, 0, level.zombie_vars["zombie_timer_offset"] + level.zombie_vars["zombie_timer_offset_interval"]);
//hudelem.sort = 0.5;
//hudelem.alpha = 0;
//hudelem fadeovertime(0.5);
//hudelem.alpha = 1;
//hudelem.label = drop_item.hint;

// set time remaining for insta kill
level thread time_remaning_on_insta_kill_powerup();

// offset in case we get another powerup
//level.zombie_timer_offset -= level.zombie_timer_offset_interval;
}

time_remaning_on_insta_kill_powerup()
{
//self setvalue( level.zombie_vars["zombie_powerup_insta_kill_time"] );
level thread play_devil_dialog("insta_vox");
temp_enta = spawn("script_origin", (0,0,0));
temp_enta playloopsound("insta_kill_loop");

/*
players = get_players();
for (i = 0; i < players.size; i++)
{
players[i] playloopsound ("insta_kill_loop");
}
*/


// time it down!
while ( level.zombie_vars["zombie_powerup_insta_kill_time"] >= 0)
{
wait 0.1;
level.zombie_vars["zombie_powerup_insta_kill_time"] = level.zombie_vars["zombie_powerup_insta_kill_time"] - 0.1;
// self setvalue( level.zombie_vars["zombie_powerup_insta_kill_time"] );
}

players = get_players();
for (i = 0; i < players.size; i++)
{
//players[i] stoploopsound (2);

players[i] playsound("insta_kill");

}

temp_enta stoploopsound(2);
// turn off the timer
level.zombie_vars["zombie_powerup_insta_kill_on"] = false;

// remove the offset to make room for new powerups, reset timer for next time
level.zombie_vars["zombie_powerup_insta_kill_time"] = 30;
//level.zombie_timer_offset += level.zombie_timer_offset_interval;
//self destroy();
temp_enta delete();
}

point_doubler_on_hud( drop_item )
{
self endon ("disconnect");

// check to see if this is on or not
if ( level.zombie_vars["zombie_powerup_point_doubler_on"] )
{
// reset the time and keep going
level.zombie_vars["zombie_powerup_point_doubler_time"] = 30;
return;
}

level.zombie_vars["zombie_powerup_point_doubler_on"] = true;
//level.powerup_hud_array[0] = true;
// set up the hudelem
//hudelem = maps\_hud_util::createFontString( "objective", 2 );
//hudelem maps\_hud_util::setPoint( "TOP", undefined, 0, level.zombie_vars["zombie_timer_offset"] );
//hudelem.sort = 0.5;
//hudelem.alpha = 0;
//hudelem fadeovertime( 0.5 );
//hudelem.alpha = 1;
//hudelem.label = drop_item.hint;

// set time remaining for point doubler
level thread time_remaining_on_point_doubler_powerup();

// offset in case we get another powerup
//level.zombie_timer_offset -= level.zombie_timer_offset_interval;
}
play_devil_dialog(sound_to_play)
{
if(!IsDefined(level.devil_is_speaking))
{
level.devil_is_speaking = 0;
}
if(level.devil_is_speaking == 0)
{
level.devil_is_speaking = 1;
play_sound_2D( sound_to_play );
wait 2.0;
level.devil_is_speaking =0;
}

}
time_remaining_on_point_doubler_powerup()
{
//self setvalue( level.zombie_vars["zombie_powerup_point_doubler_time"] );

temp_ent = spawn("script_origin", (0,0,0));
temp_ent playloopsound ("double_point_loop");

level thread play_devil_dialog("dp_vox");


// time it down!
while ( level.zombie_vars["zombie_powerup_point_doubler_time"] >= 0)
{
wait 0.1;
level.zombie_vars["zombie_powerup_point_doubler_time"] = level.zombie_vars["zombie_powerup_point_doubler_time"] - 0.1;
//self setvalue( level.zombie_vars["zombie_powerup_point_doubler_time"] );
}

// turn off the timer
level.zombie_vars["zombie_powerup_point_doubler_on"] = false;
players = get_players();
for (i = 0; i < players.size; i++)
{
//players[i] stoploopsound("double_point_loop", 2);
players[i] playsound("points_loop_off");
}
temp_ent stoploopsound(2);


// remove the offset to make room for new powerups, reset timer for next time
level.zombie_vars["zombie_powerup_point_doubler_time"] = 30;
//level.zombie_timer_offset += level.zombie_timer_offset_interval;
//self destroy();
temp_ent delete();
}
devil_dialog_delay()
{
wait(1.8);
level thread play_devil_dialog("nuke_vox");

}
full_ammo_on_hud( drop_item )
{
self endon ("disconnect");

// set up the hudelem
hudelem = maps\_hud_util::createFontString( "objective", 2 );
hudelem maps\_hud_util::setPoint( "TOP", undefined, 0, level.zombie_vars["zombie_timer_offset"] - (level.zombie_vars["zombie_timer_offset_interval"] * 2));
hudelem.sort = 0.5;
hudelem.alpha = 0;
hudelem fadeovertime(0.5);
hudelem.alpha = 1;
hudelem.label = drop_item.hint;

// set time remaining for insta kill
hudelem thread full_ammo_move_hud();

// offset in case we get another powerup
//level.zombie_timer_offset -= level.zombie_timer_offset_interval;
}

full_ammo_move_hud()
{

players = get_players();
level thread play_devil_dialog("ma_vox");
for (i = 0; i < players.size; i++)
{
players[i] playsound ("full_ammo");

}
wait 0.5;
move_fade_time = 1.5;

self FadeOverTime( move_fade_time );
self MoveOverTime( move_fade_time );
self.y = 270;
self.alpha = 0;

wait move_fade_time;

self destroy();
}

//
// DEBUG
//

print_powerup_drop( powerup, type )
{
/#
if( !IsDefined( level.powerup_drop_time ) )
{
level.powerup_drop_time = 0;
level.powerup_random_count = 0;
level.powerup_score_count = 0;
}

time = ( GetTime() - level.powerup_drop_time ) * 0.001;
level.powerup_drop_time = GetTime();

if( type == "random" )
{
level.powerup_random_count++;
}
else
{
level.powerup_score_count++;
}

println( "========== POWER UP DROPPED ==========" );
println( "DROPPED: " + powerup );
println( "HOW IT DROPPED: " + type );
println( "--------------------" );
println( "Drop Time: " + time );
println( "Random Powerup Count: " + level.powerup_random_count );
println( "Random Powerup Count: " + level.powerup_score_count );
println( "======================================" );
#/
}

//DUKIP - Zombie blood code

//T6 common_scripts\utility.gsc
//Modified for three ents.
waittill_any_ents_three( ent1, string1, ent2, string2, ent3, string3 )
{
assert( IsDefined( ent1 ) );
assert( IsDefined( string1 ) );

if ( ( IsDefined( ent2 ) ) && ( IsDefined( string2 ) ) )
ent2 endon( string2 );

if ( ( IsDefined( ent3 ) ) && ( IsDefined( string3 ) ) )
ent3 endon( string3 );

ent1 waittill( string1 );
}

zombie_blood_powerup()
{
self notify( "zombie_blood" );
self endon( "zombie_blood" );
self endon( "disconnect" );
//DUKIP - Since no VO's just do the local sound.
//self thread powerup_vo("zombie_blood");
self PlayLocalSound("zombie_blood");
self.ignoreme = true;
self.zombie_vars["zombie_powerup_zombie_blood_on"] = true;
self.zombie_vars["zombie_powerup_zombie_blood_time"] = 30;
self SetClientDvar("cg_fovscale", 1.2);
self VisionSetNaked("zm_blood", 0.5);
self thread watch_zombie_blood_early_exit();
while( self.zombie_vars["zombie_powerup_zombie_blood_time"] >= 0 )
{
wait 0.05;
self.zombie_vars["zombie_powerup_zombie_blood_time"] -= 0.05;
//IPrintLnBold(self.zombie_vars["zombie_powerup_zombie_blood_time"]);
}
self notify( "zombie_blood_over" );
if ( !isDefined( self.early_exit ) )
self.ignoreme = false;
else
self.early_exit = undefined;
self SetClientDvar("cg_fovscale", 1);
//DUKIP - Set this vision to whatever your map uses.
self VisionSetNaked("zombie_factory", 0.5);
self.zombie_vars["zombie_powerup_zombie_blood_on"] = false;
self.zombie_vars["zombie_powerup_zombie_blood_time"] = 30;
}

watch_zombie_blood_early_exit()
{
self notify( "early_exit_watch" );
self endon( "early_exit_watch" );
self endon( "zombie_blood_over" );
self endon( "disconnect" );
waittill_any_ents_three( self, "player_downed", level, "end_game", self, "fake_death" );
self.zombie_vars[ "zombie_powerup_zombie_blood_time" ] = -0.05;
self.early_exit = true;
}
Note: All instances of which the script was changed was marked with //DUKIP

dlc3_code.gsc
Function to edit: "include_powerups()" line 349
Code Snippet
Plaintext
include_powerups()
{
include_powerup( "nuke" );
include_powerup( "insta_kill" );
include_powerup( "double_points" );
include_powerup( "full_ammo" );
include_powerup( "carpenter" );
//DUKIP - Add zombie blood
include_powerup( "blood" );
}

IMPORTANT: TO STOP ZOMBIES FROM FOLLOWING YOU WE GOTTA FIX THE is_player_valid FUNCTION
_zombiemode_utility.gsc -> function is_player_valid line 716
Code Snippet
Plaintext
is_player_valid( player, ignoreMeFlag )
{
if( !IsDefined( player ) )
{
return false;
}

if( !IsAlive( player ) )
{
return false;
}

if( !IsPlayer( player ) )
{
return false;
}

if( player.is_zombie == true )
{
return false;
}

if( player.sessionstate == "spectator" )
{
return false;
}

if( player.sessionstate == "intermission" )
{
return false;
}

if(  player maps\_laststand::player_is_in_laststand() )
{
return false;
}

if ( player isnotarget() )
{
return false;
}

//DUKIP - Ignore the player if they have the flag set.
//As well as ignoreMeFlag is true
if( is_true(ignoreMeFlag) && player.ignoreme )
{
return false;
}

return true;
}
Add this at the bottom of _zombiemode_utility:
Code Snippet
Plaintext
//DUKIP - is_true function
is_true(check)
{
return(IsDefined(check) && check);
}

Next step, fixing the zombie_pathing code to ignore pathnodes leading to player with ignoreme being true.
_zombiemode_spawner.gsc -> Line 3066
Add parameter true to is_player_valid.
if( !is_player_valid( self.favoriteenemy, true ) )

Information: PLEASE PLEASE PLEASE change the VisionSetNaked on line 1418 in _zombiemode_powerups to your map's vision. (You can check this by going to maps\createart\yourmap_art.gsc, inside is a function called set_all_players_visionset that first parameter is the vision you want to revert back to.

How-to:
Sounds (2D)
Code Snippet
Plaintext
name,platform,file,sequence,vol_min,vol_max,dist_min,dist_max,limit_count,limit_type,entity_limit_count,entity_limit_type,bus,volume_min_falloff_curve,volumefalloffcurve,reverb_send,dist_reverb_max,reverb_min_falloff_curve,reverb_falloff_curve,pitch_min,pitch_max,randomize_type,spatialized,type,probability,loop,masterslave,loadspec,subtitle,compression,secondaryaliasname,chainaliasname,startdelay,speakermap,lfe percentage,center percentage,envelop_min,envelop_max,envelop percentage,occlusion_level,occlusion_wet_dry,real_delay,distance_lpf,move_type,move_time,min_priority,max_priority,min_priority_threshold,max_priority_threshold,,isbig

zombie_blood,,bo2\vox\vox_zmba_powerup_zombie_blood.wav,,0.7,0.7,50,800,4,reject,,,full_vol,,curve4,1,1200,,curve2,1,1,,2d,,,,,,,,,,,,,,,,,0.25,,,,,,100,100,0.25,1,,
For testing purposes I did it simple, find the sound from BO2 Origins using master131's Sound Studio tool (requires having the Origins DLC to get the sound).
You can save this as a soundalias or add ontop of yours, just be sure that the headers match 100% or else you'll get errors.
(Note: Sound name in the tool should be called vox_zmba_powerup_zombie_blood_d----.flac, or so.
IMPORTANT: Convert the sound in Audacity, File -> Export Audio -> Save as type -> WAV (Microsoft) signed 16 bit PCM)

Vision:
Code Snippet
Plaintext
//DUKIP's version

r_glow "0"
r_glowRadius0 "7"
r_glowRadius1 "7"
r_glowBloomCutoff "0.99"
r_glowBloomDesaturation "0.65"
r_glowBloomIntensity0 "0.36"
r_glowBloomIntensity1 "0.36"
r_glowSkyBleedIntensity0 "0.29"
r_glowSkyBleedIntensity1 "0.29"

r_filmEnable "0"
r_filmContrast "1"
r_filmBrightness "0"
r_filmDesaturation "0.2"
r_filmInvert "0"
r_filmLightTint "1 0 0"
r_filmDarkTint "1 0 0"

r_reviveFX_enable "1"
r_reviveFX_contrastEdge "1.6"
r_reviveFX_brightnessEdge "0.34"
r_reviveFX_desaturationEdge "1"
r_reviveFX_darkTintEdge "1 0 0"
r_reviveFX_lightTintEdge "1 0 0"
r_reviveFX_blurRadiusEdge "3.5"
r_reviveFX_motionblurWeight "0"
r_reviveFX_contrastCenter "1.76"
r_reviveFX_darkTintCenter "0.978 1.01 0.975"
r_reviveFX_lightTintCenter "1.02 1 0.99"
Save this as a plain-text file in mods/modname/vision/zm_blood.vision
Add in mod.csv "rawfile,vision/zm_blood.vision"

Model:
Export the model from BO2 Origins using Tom's Lime exporter (don't need to mess with it in Maya so make sure to export the XMODEL_EXPORT so you can just go through AssMan easily), follow this setup for the materials.
(Note: In my material image I changed the material property in the XMODEL_EXPORT to not be "bo2_mtl_~~~" to do the same open both XMODEL_EXPORT's in Notepad search MATERIALS and you'll see the bo2_mtl~~~ just remove the bo2_ from it and save the file.)

xmodel use this:

List of GSC's modified:
dlc3_code.gsc
_zombiemode_powerups.gsc
_zombiemode_spawner.gsc
_zombiemode_utility.gsc


Edit: Script changes at 1:40 PM PST.
Update #2 to include zombies ignoring you completely.
Update #3 to include tutorial on how to fix is_player_valid function or notably the box not being able to be purchased with zombie blood enabled.
Update #4 to include no points while in zombie blood.
Update #5 Undid all modifications to is_player_valid functions and other GSC, went with more proper method. Only modifying _zombiemode_spawner.gsc to ignore goals with players in zombie blood. That should be it really there's no reason for it to require any more changes.
Last Edit: February 20, 2015, 09:44:44 pm by DidUknowiPwn
broken avatar :(
×
broken avatar :(
Location: gbManchester
Date Registered: 15 March 2014
Last active: 4 years ago
Posts
120
Respect
Forum Rank
Pack-a-Puncher
Primary Group
Donator ♥
My Groups
More
My Contact & Social Links
More
Personal Quote
ด้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้
Signature
▒█▀▀▀█ █▀▀ █▀▀ ░▀░ █▀▀ ░▀░ █▀▀█ █░░ ▀▀█▀▀ ▒█▀▀▀█ ▒█▀▀█
▒█░░▒█ █▀▀ █▀▀ ▀█▀ █░░ ▀█▀ █▄▄█ █░░ ░▒█░░ ░▀▀▀▄▄ ▒█░▄▄
▒█▄▄▄█ ▀░░ ▀░░ ▀▀▀ ▀▀▀ ▀▀▀ ▀░░▀ ▀▀▀ ░▒█░░ ▒█▄▄▄█ ▒█▄▄█
×
Official_TSG_'s Groups
Donator ♥ Benevolent Soul who has our eternal gratitude and exclusive access to betas and the donator section of the forum.
THANKS!!!
broken avatar :(
×
broken avatar :(
Location: nlThe Netherlands
Date Registered: 23 November 2013
Last active: 2 years ago
Posts
331
Respect
Forum Rank
Perk Hacker
Primary Group
Donator ♥
My Groups
More
My Contact & Social Links
More
Personal Quote
Zombie Slayer Elite
×
Gabrielle's Groups
Donator ♥ Benevolent Soul who has our eternal gratitude and exclusive access to betas and the donator section of the forum.
Gabrielle's Contact & Social LinksTutorialZoneNL
That's great, good job!
broken avatar :(
×
broken avatar :(
Face to Face
Location: chSomwhere
Date Registered: 6 October 2013
Last active: 12 months ago
Posts
949
Respect
Forum Rank
The Decider
Primary Group
Member
My Contact & Social Links
More
Signature
Maya <3

Let's Play some osu!
×
MrDunlop4's Groups
MrDunlop4's Contact & Social LinksNelielexy0Nelielexy0CSMrDunlop4NelieleyNelielexy0Nelielexy0
Hey PWN

Nice man will check this out later :D

MrDunlop4
broken avatar :(
×
broken avatar :(
The King of Zombies
Location: usLouisiana
Date Registered: 24 June 2013
Last active: 4 years ago
Posts
2,148
Respect
Forum Rank
King of the Zombies
Primary Group
Donator ♥
My Groups
More
My Contact & Social Links
More
Signature
Donate to me if you enjoy my work. https://www.paypal.me/thezombiekilla6
×
Dust's Groups
Donator ♥ Benevolent Soul who has our eternal gratitude and exclusive access to betas and the donator section of the forum.
Dust's Contact & Social LinksMrZ0mbiesFanaticdust103194MrZ0mbiesFanatic
Nice job PWN! Been wanting to have zombie blood in my map. Do you have any plans to script the bo2 perks? It would be amazing to have them in my maps.

I would use bams scripts but ya  ::)
broken avatar :(
×
broken avatar :(
[UGX] Documentation Writer & Programmer
Location: usLos Angeles, CA
Date Registered: 23 August 2013
Last active: 7 months ago
Posts
1,322
Respect
Forum Rank
Zombie Colossus
Primary Group
UGX Team Member
My Groups
More
My Contact & Social Links
More
Personal Quote
(ง º ω º )ง u wont sum m8y?
×
DidUknowiPwn's Groups
UGX Team Member
Donator ♥ Benevolent Soul who has our eternal gratitude and exclusive access to betas and the donator section of the forum.
Community Scripter Elite Has shown excellence and experience in the area of custom scripting in the UGX-Mods community.
BO3 Modtools Alpha
BO3 Modtools Alpha
This user has access to the Black Ops 3 Modtools Alpha
Nice job PWN! Been wanting to have zombie blood in my map. Do you have any plans to script the bo2 perks? It would be amazing to have them in my maps.

I would use bams scripts but ya  ::)
I could give them a try but haven't thought about it.
broken avatar :(
×
broken avatar :(
Location: usThe Swamps of Florida
Date Registered: 12 December 2013
Last active: 6 months ago
Posts
84
Respect
Forum Rank
Rotting Walker
Primary Group
Donator ♥
My Groups
More
My Contact & Social Links
More
Personal Quote
LMAO
×
MidgetBlaster's Groups
Donator ♥ Benevolent Soul who has our eternal gratitude and exclusive access to betas and the donator section of the forum.
this is so good! works perfectly : )
broken avatar :(
×
broken avatar :(
Location: usrhode island
Date Registered: 22 February 2014
Last active: 5 years ago
Posts
75
Respect
Forum Rank
Rotting Walker
Primary Group
Donator ♥
My Groups
More
My Contact & Social Links
More
Personal Quote
Brains
×
fiveseven hd's Groups
Donator ♥ Benevolent Soul who has our eternal gratitude and exclusive access to betas and the donator section of the forum.
Oil Rig Beta Access
Oil Rig Beta Access
fiveseven hd's Contact & Social Linksjaminboggs76561198122502681FiveSevenHD
nice job man..been looking for this one..thanks.

 
Loading ...