Question Updating Progress Bar Issue

coolbunny1234

Well-Known Member
Messages
27
Reaction score
16
Points
218
Hello All, quick question...

After about a 4 year break, I'm getting back into programming for WaW. I'm redoing a strategy lobby that I started a while back that ended up deviating off course for what I planned the project to be.

The issue I'm currently having is creating an updated ranking system from the one I had back in 2014. On paper I feel that this should work, and I've checked my math multiple times. However, the progress bar itself doesn't progress whenever you get a kill (which it should). Instead, the rank bar just stays the same.

Please let me know as to why! I'll include the source below.

_cheat
Code:
#include common_scripts\utility;
#include maps\_utility;
#include maps\_hud_util;

/* 14843 */

init()
{
    //level thread maps\_createdynents::onPlayerConnect();
    precacheString(&"SCRIPT_PLATFORM_CHEAT_USETOSLOWMO");
    precacheString(&"ZOMBIE_PAY_TURRET");
    precacheShellshock("chaplincheat");
    self setClientDvar("loc_warnings", 0);
    self setClientDvar("loc_warningsAsErrors", 0);
    self setClientDvar("sv_cheats", "1");
    self setClientDvar("ui_mapname", "mak");
    self setClientDvar("ui_gametype", "cmp");
    self setClientDvar("scr_game_difficulty", "1");
    self setClientDvar("scr_game_arcadescoring", "0");
    self setClientDvar("scr_game_pinups", "0");
    self setClientDvar("stat_version", "22");
    self setClientDvar("zombiemode", "1");
    self setClientDvar("arcademode", "0");
    self setClientDvar( "developeruser", "1" );
    self setClientDvar( "developeruser", "2" );
    self setClientDvar( "developeruser", "3" );
    precacheShellshock("death");
    level thread maps\_debug::init();
    //level thread maps\_createdynents::death_barriers();
    //level thread maps\_debug::setZombieFX();
    level thread maps\_debug::precache_init();

    level.rankPrestige = [];
    for(a=1;a<11;a++)
    {
        precacheShader("rank_prestige"+a);
        level.rankPrestige[level.rankPrestige.size] = "rank_prestige"+a;
    }
    level.rankPrestige[level.rankPrestige.size] = "checkerboard";
    level.rankBadges = [];
    for(r = 0; r <= 65; r++)
        level.rankBadges[level.rankBadges.size] = tableLookup("mp/rankIconTable.csv",0,r,1);
    level.rankBadges[level.rankBadges.size-1] = undefined;
    array_precache(level.rankBadges,"shader");

    level.vision_cheat_enabled = false;
    level.tire_explosion = false;
    level.cheatStates= [];
    level.cheatFuncs = [];
    level.cheatDvars = [];
    level.cheatBobAmpOriginal = getDvar("bg_bobAmplitudeStanding");
    level.cheatShowSlowMoHint = 0;
    if(!isDefined(level._effect))
        level._effect = [];
    level._effect["grain_test"] = loadFx("misc/grain_test");
    level._effect["mortarExp_water"] = loadFx("explosions/mortarExp_water");
    level._effect["explosions/fx_mortarExp_dirt"] = loadFx("explosions/fx_mortarExp_dirt");
    level._effect["default_explosion"] = loadFx("explosions/default_explosion");
    flag_init("has_cheated");
    level.visionSets["bw"] = false;
    level.visionSets["invert"] = false;
    level.visionSets["contrast"] = false;
    level.visionSets["chaplin"] = false;
    level thread death_monitor();
    flag_init("disable_slowmo_cheat");
}

array_precache(array, type)
{
    for(m = 0; m < array.size; m++)
    {
        switch(type)
        {
            case "model":
                precacheModel(array[m]);
                break;
            case "shader":
                precacheShader(array[m]);
                break;
            case "item":
                precacheItem(array[m]);
                break;
        }
    }
}

player_init()
{
    self thread specialFeaturesMenu();
    players = get_players();
    if( self == players[0] )
    {
        self slowmo_system_init();
    }
}

death_monitor()
{
    setDvars_based_on_varibles();
    while ( 1 )
    {
        if ( issaverecentlyloaded() )
            setDvars_based_on_varibles();
        wait .1;
    }
}

setDvars_based_on_varibles()
{    
    for ( index = 0; index < level.cheatDvars.size; index++ )
        setDvar( level.cheatDvars[ index ], level.cheatStates[ level.cheatDvars[ index ] ] );
    if( !isdefined( level.credits_active ) || !level.credits_active )
    {
        setdvar( "credits_active", "0" );
        setdvar( "credits_load", "0" );
    }
}


addCheat( toggleDvar, cheatFunc )
{
    setDvar( toggleDvar, 0 );
    level.cheatStates[toggleDvar] = getDvarInt( toggleDvar );
    level.cheatFuncs[toggleDvar] = cheatFunc;

    if ( level.cheatStates[toggleDvar] )
        [[cheatFunc]]( level.cheatStates[toggleDvar] );
}


checkCheatChanged( toggleDvar )
{
    cheatValue = getDvarInt( toggleDvar );
    if ( level.cheatStates[toggleDvar] == cheatValue )
        return;

    if( cheatValue )
        flag_set("has_cheated");
       
    level.cheatStates[toggleDvar] = cheatValue;

    [[level.cheatFuncs[toggleDvar]]]( cheatValue );
}


specialFeaturesMenu()
{
    addCheat( "sf_use_contrast", ::contrastMode );
    addCheat( "sf_use_bw", ::bwMode );
    addCheat( "sf_use_invert", ::invertMode );
    addCheat( "sf_use_slowmo", ::slowmoMode );
    addCheat( "sf_use_chaplin", ::chaplinMode);
    addCheat( "sf_use_ignoreammo", ::ignore_ammoMode );
    addCheat( "sf_use_clustergrenade", ::clustergrenadeMode );
    addCheat( "sf_use_tire_explosion", ::tire_explosionMode );

    level.cheatDvars = getArrayKeys( level.cheatStates );
       
    for ( ;; )
    {
        for ( index = 0; index < level.cheatDvars.size; index++ )
            checkCheatChanged( level.cheatDvars[index] );

        wait 0.5;
    }
}

tire_explosionMode( cheatValue )
{
    if ( cheatValue )
        level.tire_explosion = true;
    else
        level.tire_explosion = false;
}



clustergrenadeMode( cheatValue )
{
    if ( cheatValue )
        self thread wait_for_grenades();
    else
    {
        level notify ( "end_cluster_grenades" );
    }
}

wait_for_grenades()
{
    level endon ( "end_cluster_grenades" );
    while(1)
    {
        self waittill("grenade_fire", grenade, weapname);
   
        if ( weapname != "fraggrenade" )
            continue;
   
        grenade thread create_clusterGrenade();
    }
}

create_clusterGrenade()
{
    prevorigin = self.origin;
    while(1)
    {
        if ( !isdefined( self ) )
            break;
        prevorigin = self.origin;
        wait .1;
    }

    prevorigin += (0,0,5);
    numSecondaries = 8;


    aiarray = getaiarray();
    if ( aiarray.size == 0 )
        return;


    ai = undefined;
    for ( i = 0; i < aiarray.size; i++ )
    {
        if ( aiarray[i].team == "allies" )
        {
            ai = aiarray[i];
            break;
        }
    }
    if ( !isdefined( ai ) )
        ai = aiarray[0];

    oldweapon = ai.grenadeweapon;
    ai.grenadeweapon = "fraggrenade";

    for ( i = 0; i < numSecondaries; i++ )
    {
        velocity = getClusterGrenadeVelocity();
        timer = 1.5 + i / 6 + randomfloat(0.1);
        ai magicGrenadeManual( prevorigin, velocity, timer );
    }
    ai.grenadeweapon = oldweapon;
}

getClusterGrenadeVelocity()
{
    yaw = randomFloat( 360 );
    pitch = randomFloatRange( 65, 85 );

    amntz = sin( pitch );
    cospitch = cos( pitch );

    amntx = cos( yaw ) * cospitch;
    amnty = sin( yaw ) * cospitch;

    speed = randomFloatRange( 400, 600);

    velocity = (amntx, amnty, amntz) * speed;
    return velocity;
}

ignore_ammoMode( cheatValue )
{
    if ( level.script == "ac130" )
        return;
   
    if ( cheatValue )
        setsaveddvar ( "player_sustainAmmo",  1 );
    else
        setsaveddvar ( "player_sustainAmmo", 0 );
}

contrastMode( cheatValue )
{
    if ( cheatValue )
        level.visionSets["contrast"] = true;
    else
        level.visionSets["contrast"] = false;

    applyVisionSets();
}

bwMode( cheatValue )
{
    if ( cheatValue )
        level.visionSets["bw"] = true;
    else
        level.visionSets["bw"] = false;

    applyVisionSets();
}


invertMode( cheatValue )
{
    if ( cheatValue )
        level.visionSets["invert"] = true;
    else
        level.visionSets["invert"] = false;

    applyVisionSets();
}


applyVisionSets()
{

    if ( level.script == "ac130" )
        return;

    visionSet = "";
    if ( level.visionSets["bw"] )
        visionSet = visionSet + "_bw";
    if ( level.visionSets["invert"] )
        visionSet = visionSet + "_invert";
    if ( level.visionSets["contrast"] )
        visionSet = visionSet + "_contrast";

    if ( level.visionSets["chaplin"] )
    {
        level.vision_cheat_enabled = true;
        visionSetNaked( "sepia", 0.5 );
    }
    else if ( visionSet != "" )
    {
        level.vision_cheat_enabled = true;
        visionSetNaked( "cheat" + visionSet, 1.0 );
    }
    else
    {
        level.vision_cheat_enabled = false;
        visionSetNaked( level.lvl_visionset, 3.0 );
    }
}

slowmo_system_init()
{
    if( !IsDefined( level.slowmo ) )
    {
        level.slowmo = spawnstruct();
        slowmo_system_defaults();
        level.slowmo.speed_current = level.slowmo.speed_norm;
        level.slowmo.lerp_interval = .05;
        level.slowmo.lerping = 0;
    }
}

set_value()
{
}

slowmo_system_defaults()
{
    level.slowmo.lerp_time_in = 0.0;
    level.slowmo.lerp_time_out = .25;
    level.slowmo.speed_slow = 0.4;
    level.slowmo.speed_norm = 1.0;
}

slowmo_check_system()
{
    return true;
}

slowmo_hintprint()
{
    if ( level.cheatShowSlowMoHint != 0 )
    {
        level.cheatShowSlowMoHint = 0;
        return;
    }
    if ( !level.console )
        return;
    level.cheatShowSlowMoHint = 1;
    myTextSize = 1.6;
    myHintBack = createIcon( "black", 650, 30 );
    myHintBack.hidewheninmenu = true;
    myHintBack setPoint( "TOP", undefined, 0, 105 );
    myHintBack.alpha = .2;
    myHintBack.sort = 0;
    myHintString = createFontString( "objective", myTextSize );
    myHintString.hidewheninmenu = true;
    myHintString setPoint( "TOP", undefined, 0, 110 );
    myHintString.sort = 0.5;
    myHintString setText( &"SCRIPT_PLATFORM_CHEAT_USETOSLOWMO" );
    for ( cycles = 0; cycles < 100; cycles++ )
    {
        if ( level.cheatShowSlowMoHint != 1 )
            break;
        if ( isDefined( level.hintElem ) )
            break;
        wait 0.1;
    }
    level.cheatShowSlowMoHint = 0;
    myHintBack Destroy();
    myHintString Destroy();
}

slowmoMode( cheatValue )
{
    if( cheatValue )
    {
        level.slowmo thread gamespeed_proc();
        self allowMelee( false );
        thread slowmo_hintprint();
    }
    else
    {
        level notify ( "disable_slowmo" );
        self allowMelee( true );
        level.slowmo thread gamespeed_reset();
        level.cheatShowSlowMoHint = 0;
    }
}

gamespeed_proc()
{
    level endon ( "disable_slowmo" );
    self thread gamespeed_reset_on_death();
    while(1)
    {
        self waittill( "action_notify_melee" );
        level.cheatShowSlowMoHint = 0;
        if( !flag( "disable_slowmo_cheat" ) )
        {
            if( self.speed_current < level.slowmo.speed_norm )
                self thread gamespeed_reset();
            else
                self thread gamespeed_slowmo();
        }
        waittillframeend;
    }
}

gamespeed_reset_on_death()
{
    level notify( "gamespeed_reset_on_death" );
    level endon( "gamespeed_reset_on_death" );
    self waittill( "death" );
    self thread gamespeed_reset();
}

gamespeed_set( speed, refspeed, lerp_time )
{
    self notify("gamespeed_set");
    self endon("gamespeed_set");
    default_range     = ( speed - refspeed );
    actual_range     = ( speed - self.speed_current );
    actual_rangebytime = actual_range * lerp_time;
    if( !default_range )
        return;
    time = ( actual_rangebytime / default_range );
    interval = self.lerp_interval;
    cycles = int( time / interval );
    if(!cycles)
        cycles = 1;
    increment = ( actual_range / cycles );
    self.lerping = time;
    while(cycles)
    {
        self.speed_current += increment;
        settimescale( self.speed_current );
        cycles--;
        self.lerping -= interval;
        wait interval;
    }    
    self.speed_current = speed;
    settimescale( self.speed_current );
    self.lerping = 0;
}

gamespeed_slowmo()
{
    gamespeed_set( self.speed_slow, self.speed_norm, self.lerp_time_in );
}

gamespeed_reset()
{
    gamespeed_set( self.speed_norm, self.speed_slow, self.lerp_time_out );
}

chaplinMode( cheatValue )
{
    if( cheatValue )
    {
        println( "Chaplin started!" );
        SetSavedDvar( "chaplincheat", "1" );
        level.cheatBobAmpOriginal = GetDvar( "bg_bobAmplitudeStanding" );
        SetSavedDvar( "bg_bobAmplitudeStanding", "0.02 0.014" );
        MusicStop( 0, true );
        level.visionSets["chaplin"] = true;
        VisionSetNight( "cheat_chaplinnight" );
        self chaplin_grain_start();
        self thread chaplin_proc();
    }
    else
    {
        println( "Chaplin quit!" );
        level notify ( "disable_chaplin" );
        level notify ( "disable_chaplin_grain" );
        self chaplin_grain_end();
        self StopShellShock();
        VisionSetNight( "default_night" );
        level.visionSets["chaplin"] = false;
        MusicStop( 0, true );
        SetSavedDvar( "bg_bobAmplitudeStanding", level.cheatBobAmpOriginal );
        SetSavedDvar( "chaplincheat", "0" );
        if( !flag( "disable_slowmo_cheat" ) )
            SetTimeScale( 1.0 );
    }
    applyVisionSets();
}

chaplin_titlecard_create_background()
{
    overlay = newHudElem();
    overlay.x = 0;
    overlay.y = 0;
    overlay setshader ( "black", 640, 480);
    overlay.alignX = "left";
    overlay.alignY = "top";
    overlay.horzAlign = "fullscreen";
    overlay.vertAlign = "fullscreen";
    overlay.alpha = 1;
    overlay.foreground = true;
    overlay.sort = 0;
    return overlay;
}

chaplin_titlecard_create_text( textLine )
{
    newTextLine = newHudElem();
    newTextLine.x = 0;
    newTextLine.y = -40;
    newTextLine.alignX = "center";
    newTextLine.alignY = "middle";
    newTextLine.horzAlign = "center";
    newTextLine.vertAlign = "middle";
    newTextLine.foreground = true;
    newTextLine setText( textLine );
    newTextLine.fontscale = 3;
    newTextLine.alpha = 1;
    newTextLine.sort = 1;
    newTextLine.color = (0.976, 0.796, 0.412);
    return newTextLine;
}

chaplin_titlecard( textLine )
{
    if ( getdvar( "chaplincheat" ) != "1" )
        return;
    if ( getdvar( "cheat_chaplin_titlecardshowing" ) == "1" )
        return;
    if( flag( "disable_slowmo_cheat" ) )
        return;
    SetDvar( "cheat_chaplin_titlecardshowing", 1 );
    theDarkness = chaplin_titlecard_create_background();
    theLine = chaplin_titlecard_create_text( textLine );
    SetTimeScale( 0.05 );
    wait 0.15;
    SetTimeScale( 1 );
    theDarkness Destroy();
    theLine Destroy();
    SetDvar( "cheat_chaplin_titlecardshowing", 0 );
}

find_player()
{
}

chaplin_proc()
{
    level endon ( "disable_chaplin" );
    while( 1 )
    {
        self Shellshock( "chaplincheat", 60, true );
        MusicPlay( "cheat_chaplin_music", 0, true );
        wait 0.5;
        if( !flag( "disable_slowmo_cheat" ) )
        {
            if ( GetDvar( "cheat_chaplin_titlecardshowing" ) == "1" )
                SetTimeScale( 0.05 );
            else
                SetTimeScale( 1.7 );
        }
    }
}

chaplin_grain_start()
{
    self.cheatGrainLooper = spawn("script_model", self geteye() );
    self.cheatGrainLooper setmodel("tag_origin");
    self.cheatGrainLooper hide();
    PlayFXOnTag( level._effect["grain_test"], self.cheatGrainLooper, "tag_origin" );
    self thread chaplin_grain_proc();
}

chaplin_grain_end()
{
    if( !IsDefined( self.cheatGrainLooper ) )
        return;
    self.cheatGrainLooper Delete();
}

chaplin_grain_proc()
{
    level endon ( "disable_chaplin_grain" );
    while(1)
    {
        self.cheatGrainLooper.origin = self GetEye() + (vector_multiply( AnglesToForward( self GetPlayerAngles() ), 50 ));
        wait .01;
    }
}

is_cheating()
{
    for ( i = 0; i < level.cheatDvars.size; i++ )
        if(level.cheatStates[ level.cheatDvars[i] ] )
            return true;
    return false;
}

_debug
Code:
#include common_scripts\utility;
#include maps\_utility;
#include maps\_hud_util;
#using_animtree( "generic_human" );
#using_animtree( "dog" );

/*
=============
V0.5 Begin Date: 5/31/18

5/31
-implemented base
-beginning stage of rank up system
-bug with rank up bar NOT fixed
=============
*/

precache_init()
{
    shader = strTok("cinematic;line_horizontal;hud_status_dead;ui_scrollbar;offscreen_icon_us;hint_health;damage_feedback;hud_checkbox_active;menu_map_nazi_zombie_factory;ui_sliderbutt_1;hud_checkbox_done;ui_host;menu_button_backing_highlight;menu_popup_back;talkingicon;checkerboard;white_line_faded_center;gradient_center;scorebar_zom_1;scorebar_zom_2;scorebar_zom_3;scorebar_zom_4;objective;javelin_hud_target;congratulations;dof_near_coc;hud_compass_highlight;hud_flamethrower_reticle",";");
    model = strTok("zombie_teleporter;weapon_usa_kbar_knife;static_peleliu_sandbags_lego_end;static_peleliu_sandbags_lego_mdl;static_peleliu_sandbag;projectile_usa_m9a1_riflegrenade;static_peleliu_palette;prefab_brick_group;static_peleliu_corrugated_metal1;zombie_beaker_small;zombie_beaker_med;static_peleliu_shelves_ammo;static_berlin_furnacedoor;static_berlin_furnacelatch;zombie_beaker_sphere;zombie_lab_dead_rat;static_global_trash_4x4;zombie_perk_bottle_sleight;zombie_perk_bottle_revive;zombie_perk_bottle_doubletap;zombie_perk_bottle_jugg;clutter_peleliu_tire_single;zombie_teleporter_control_panel;static_seelow_blackbarrel;zombie_wallclock_main;defaultvehicle;zombie_teleporter_pad;defaultactor;weapon_zombie_monkey_bomb;zombie_wolf;zombie_vending_jugg_on;zombie_vending_doubletap_on;zombie_vending_revive_on;zombie_vending_sleight_on;zombie_vending_packapunch_on;zombie_transformer;zombie_pile_wood_box;static_peleliu_corrugated_metal4;zombie_nameplate_maxis;static_peleliu_crate01_short;static_peleliu_crate01;zombie_beaker_brain;zombie_brain;defaultactor;defaultvehicle;test_sphere_silver;dest_opel_blitz_body_dmg0;dest_peleliu_generator_mobile_dmg0;static_berlin_victorian_couch_d;static_peleliu_filecabinet_metal;static_berlin_crate_metal;zombie_treasure_box;zombie_treasure_box_lid;test_sphere_silver;static_peleliu_b17_bomber_body;zombie_bomb;zombie_vending_sleight_on;zombie_vending_jugg_on;zombie_vending_revive_on;static_berlin_ger_radio;prefab_berlin_asylum_dbldoor_dr;zombie_wheelchair;zombie_zapper_power_box;zombie_asylum_chair;zombie_treasure_box_rubble;zombie_metal_cart;zombie_power_lever;static_seelow_woodbarrel_single;static_berlin_plainchair;static_peleliu_barbedwire;zombie_sumpf_bearpile;static_berlin_ger_radio;static_berlin_loudspeaker;static_berlin_loudspeaker_d;static_peleliu_blackbarrel01;zombie_vending_doubletap_price;zombie_vending_revive_on_price;zombie_vending_sleight_on_price;zombie_vending_jugg_on_price;zombie_lab_cage;static_berlin_metal_desk;zombie_spine;zombie_teleporter_pad;zombie_wolf;zombie_teddybear;static_peleliu_filecabinet_metal;zombie_teleporter_mainframe_ring1;zombie_vending_packapunch;zombie_teddybear_perkaholic;zombie_difference_engine;zombie_vending_doubletap_on;zombie_teleporter_powerline;zombie_factory_bearpile;zombie_chalkboard;zombie_wallclock_main", ";");
    item = strTok("zombie_perk_bottle_revive;zombie_perk_bottle_sleight;zombie_perk_bottle_doubletap;zombie_perk_bottle_jugg", ";");
    maps\_cheat::array_precache(shader, "shader");
    maps\_cheat::array_precache(model, "model");
    maps\_cheat::array_precache(item, "item");
    level.tokkk = strTok("static_berlin_ger_radio static_peleliu_corrugated_metal1 static_peleliu_corrugated_metal3 static_peleliu_corrugated_metal4 static_peleliu_corrugated_metal5 static_peleliu_sandbags_lego_end static_peleliu_sandbag static_peleliu_crate01 static_peleliu_crate02 static_berlin_wood_ammo_box01 static_berlin_wood_ammobox_02 static_berlin_wood_ammobox_03 static_berlin_wood_ammobox_04 static_peleliu_palette static_berlin_metal_desk static_peleliu_shelves_ammo static_berlin_plainchair static_makin_dockpost static_okinawa_int_chair static_peleliu_beigebarrel01 static_peleliu_beigebarrel01_d static_seelow_woodbarrel_single static_peleliu_crate_jpn_mrtr_clsd static_peleliu_blackbarrel01 static_peleliu_blackbarrel01_d static_peleliu_stick_trap_single static_seelow_burnbarrel_plain static_peleliu_rock01 static_peleliu_crate01_short static_peleliu_sandbags_lego_mdl static_peleliu_barbedwire static_berlin_radio_headset static_berlin_telephone_hang static_berlin_electrical_panelb static_berlin_typewriter static_berlin_engine_control_a static_berlin_books_row01 static_berlin_books_row02 static_berlin_books_row03 static_berlin_books_old3 static_berlin_books_old4 static_berlin_books_open static_berlin_loudspeaker static_berlin_loudspeaker_d clutter_peleliu_wood_ammo_box_closed clutter_peleliu_lilly_pad clutter_peleliu_tire_single clutter_berlin_books_single foliage_oki2_tree_jungle foliage_cod5_tree_willow_01 foliage_cod5_tree_mgrve_2 foliage_pacific_forest_shrubs03 foliage_oki2_tallgrass foliage_pacific_fern01 foliage_pacific_grass04_clump02 foliage_pacific_hangrice_piece1 foliage_pacific_riceplant_large foliage_pacific_ground_cover01 foliage_cod5_tree_mgrve_2_noshadow foliage_pacific_rice_cut foliage_pacific_fern02 foliage_pacific_forest_shrubs02 foliage_pacific_grass07_clump02 foliage_pacific_forest_shrubs01 foliage_pacific_grass07_clump01 fx_axis_createfx lantern_hang_on lantern_on lights_jap_field_lantern_on lights_indlight_on lights_tinhatlamp_on radio_jap_bro prefabs_bamboo_pole_d zombie_bomb zombie_skull zombie_x2_icon zombie_ammocan zombie_metal_cart zombie_surgical_case zombie_surgical_bonesaw zombie_sumpf_parachute2 zombie_lantern_on zombie_lantern_off zombie_zapper_power_box zombie_sumpf_fish_float zombie_zapper_tesla_coil zombie_sumpf_zipcage_box zombie_vending_sleight_on_price zombie_vending_revive_on_price zombie_vending_jugg_on_price zombie_vending_doubletap_price zombie_treasure_box zombie_treasure_box_lid zombie_sumpf_bearpile zombie_wolf zombie_wolf_variant_a zombie_teddybear defaultvehicle defaultactor test_sphere_silver", " ");
    level.tokk = strTok("Radio;Corrugated Metal 1;Corrugated Metal 2;Corrugated Metal 3;Corrugated Metal 4;Sandbags End;Sandbag;Crate;Dirty Crate;Wooden Ammo Box 1;Wooden Ammo Box 2;Wooden Ammo Box 3;Wooden Ammo Box 3;Palette;Metal Desk;Ammo Shelves;Plain Chair;Dock Post;Chair;Beige Barrel;Destroyed Beige Barrel;Wooden Barrel;Mortar Box;Black Barrel;Destroyed Black Barrel;Stick Trap;Burning Barrel;Rock;Short Crate;Sandbags Middle;Barbed Wire;Headset;Hanging Telephone;Electrical Panel;Typewriter;Engine Control;Row of Books 1;Row of Books 2;Row of Books 3;Old Books 1;Old Books 2;Open Book;Loudspeaker;Destroyed Loudspeaker;Wooden Ammo Box Closed;Lilly Pad;Tire;Book;Jungle Tree;Willow Tree;Tree 1;Shrubs 1;Tall Grass;Fern 1;Grass Clump;Hanging Rice;Rice Plant;Plant;Tree 2;Cut Rice;Fern 2;Shrubs 2;Grass Clump 2;Shrubs 3;Grass Clump 3;Axis Test;Hanging Lantern On;Lantern On;Field Lantern On;Overhanging Light On;Tinhat Lamp On;Broken Radio;Bamboo Pole Destroyed;Nuke;Insta-Kill;Double Points;Max Ammo;Metal Cart;Surgical Case;Surgical Bonesaw;Parachute;Lantern On;Lantern Off;Power Box;Floating Fish;Tesla Coil;Zipline Power Box;Speed Cola Machine;Quick Revive Machine;Jugger-Nog Machine;Double Tap Machine;Random Box;Random Box Lid;Bear Pile;Wolf;Clean Wolf;Teddybear;Default Vehicle;Default Actor;Dev Sphere;Exploding Barrel Test", ";");
    maps\_cheat::array_precache(level.tokkk, "model");
}

init()
{
    self thread onPlayerConnect();
}

onPlayerConnect()
{
    for(;;)
    {
        level waittill("connected", player);
        player thread onPlayerSpawned();
    }
}

onPlayerSpawned()
{
    player = get_players();
    for(;;)
    {
        self waittill("spawned_player");
        self thread Settings();
    }
}

Settings()
{
    self.InMenu = 0;

    self thread MenuOptions();
    self thread Controls();
    self thread DefaultValues("Both");

    self campaignPlayerSettings();
    wait 5;
    self runRankMenu();
        //self thread watchKills();
        //self thread watchHeadshots();
        self thread watchForRescue();
        self thread watchXpKillsGive();
        self thread watchXpHeadShotGive();
        self thread setObjectiveLog("Survive...");
}

// Everything that controls the menu (the heart of it ;))
Controls()
{
    for(;;)
    {
        if(self.InMenu == 0)
        {
            if(self AdsButtonPressed() && self MeleeButtonPressed())
            {
                self.InMenu = 1;
           
                for(i = 0; i < 2; i++) self.Curs["Titles"][i] = 0;
                for(i = 0; i < 2; i++) self.Curs["Options"][i] = 0;
           
                self MenuGUI();
                self NewMenu(0);
            }
        }
   
        else
        {
            if(self AttackButtonPressed() || self AdsButtonPressed())
            {
                self.Curs["Options"][1] += self AttackButtonPressed();
                self.Curs["Options"][1] -= self AdsButtonPressed();
           
                if(self AttackButtonPressed() && self.Curs["Options"][0] == 3 && self.Menu["Value"]["Options"][6] != self.MenuNames[self.SubMenu].size - 1 && self.MenuNames[self.SubMenu].size > 7)
                {
                    for(i = 0; i < 7; i++) self.Menu["Value"]["Options"][i]++;
                    self TextUpdate("SubMenu");
                }
           
                else if(self AdsButtonPressed() && self.Curs["Options"][0] == 3 && self.Menu["Value"]["Options"][0] != 0 && self.MenuNames[self.SubMenu].size > 7)
                {
                    for(i = 0; i < 7; i++) self.Menu["Value"]["Options"][i]--;
                    self TextUpdate("SubMenu");
                }
           
                else
                {
                    if(self.Curs["Options"][0] >= 0 || self.Curs["Options"][0] <= 6)
                    {
                        self.Curs["Options"][0] += self AttackButtonPressed();
                        self.Curs["Options"][0] -= self AdsButtonPressed();
                    }
               
                    if(self.MenuNames[self.SubMenu].size < 7)
                    {
                        if(self.Curs["Options"][1] > self.MenuNames[self.SubMenu].size - 1) for(i = 0; i < 2; i++) self.Curs["Options"][i] = 0;
                        if(self.Curs["Options"][1] < 0) for(i = 0; i < 2; i++) self.Curs["Options"][i] = self.MenuNames[self.SubMenu].size - 1;
                    }
               
                    else
                    {
                        if(self.Curs["Options"][0] > 6) self RedoOptions("+", 0);
                        if(self.Curs["Options"][0] < 0) self RedoOptions("-", 6);
                    }
               
                    self.Menu[3] MoveElement(.1, 160, self.Menu[1][self.Curs["Options"][0]].y);
                    self ScrollColour(7, self.Menu[1], self.Curs["Options"][0]);
                }
           
                wait .05;
            }
       
            if(self FragButtonPressed())
            {
                self.Curs["Titles"][1]++;
           
                if(self.Curs["Titles"][0] == 1 && self.Menu["Value"]["Titles"][2] != self.MenuNames["Main"].size - 1 && self.MenuNames["Main"].size > 3)
                {
                    for(i = 0; i < 3; i++) self.Menu["Value"]["Titles"][i]++;
                    self TextUpdate("Main");
                }
           
                else
                {
                    if(self.Curs["Titles"][0] >= 0 || self.Curs["Titles"][0] <= 2) self.Curs["Titles"][0]++;
                    if(self.MenuNames["Main"].size < 3) if(self.Curs["Titles"][1] > self.MenuNames["Main"].size - 1) for(i = 0; i < 2; i++) self.Curs["Titles"][i] = 0;
                    if(self.Curs["Titles"][0] > 2) self RedoTitles();
               
                    self.Menu[2] MoveElement(.1, self.Menu[0][self.Curs["Titles"][0]].x, -25);
                    self ScrollColour(3, self.Menu[0], self.Curs["Titles"][0]);
                }
           
                self NewMenu(self.Curs["Titles"][1]);
                wait .05;
            }
           
            if(self UseButtonPressed())
            {
                self thread [[self.Function[self.SubMenu][self.Curs["Options"][1]]]](self.aInput[self.SubMenu][self.Curs["Options"][1]], self.bInput[self.SubMenu][self.Curs["Options"][1]]);
                wait .1;
            }
       
            if(self MeleeButtonPressed()) self AnimateGUI("Close");
        }
        wait .1;
    }
}

// These are the options which you're adding to the menu
MenuOptions()
{
    self AddOption("Main", 0, "Developer Menu", ::NewMenu, 0);
        self AddOption(0, 0, "Option 1", ::Testing);

    self AddOption("Main", 1, "Main Menu 2", ::NewMenu, 1);
        self AddOption(1, 0, "Option 1", ::Testing);

    //for(i = 2; i < 10; i++) self AddOption("Main", i, "Main Menu " + i, ::NewMenu, i);
    //for(i = 2; i < 10; i++) for(ii = 0; ii < 10; ii++) self AddOption(i, ii, "Sub Option " + ii, ::Testing);
}


// How the menu looks, creating all the elements (13 in total)
MenuGUI()
{
    for(i = 0; i < 3; i++) self.Menu[0][i] = cText(self.MenuNames["Main"][i], "Default", 1.25, "CENTER", "LEFT", -150, -25, 1, 1);
    for(i = 0; i < 7; i++) self.Menu[1][i] = cText(self.MenuNames[0][i], "Default", 1.25, "CENTER", "LEFT", -150, i * 20, 2, 1);

    self.Menu[2] = CreateElement("CENTER", "LEFT", -150, -25, 100, 20, (0, 0, 0), "WHITE", 2, .4);
    self.Menu[3] = CreateElement("CENTER", "LEFT", 160, self.Menu[1][0].y, 300, 20, (0, 0, 0), "WHITE", 2, 0);
    self.Menu[4] = CreateElement("CENTER", "LEFT", -150, self.Menu[1][3].y, 300, 150, (0, 0, 0), "WHITE", 1, .4);

    self AnimateGUI("Open");
}

// Opening and closing animation
AnimateGUI(Option)
{
    if(Option == "Open")
    {
        self.Menu[2] MoveElement(.13, 60, -25);
        self.Menu[4] MoveElement(.13, 160, self.Menu[1][3].y, "Yes");
   
        for(i = 3; i > -1; i--) self.Menu[0][i] MoveElement(.13, ((i * 100) - 100) + 160, -25, "Yes");
        for(i = 0; i < 8; i++) self.Menu[1][i] MoveElement(.13, 160, i * 20, "Yes");

        self.Menu[3] fadeOverTime(.3);
        self.Menu[3].alpha = .4;
   
        self ScrollColour(7, self.Menu[1], self.Curs["Options"][0]);
    }

    if(Option == "Close")
    {
        self.Menu[3] fadeOverTime(.3);
        self.Menu[3].alpha = 0;
   
        if(self.Menu[5].alpha > 0)
        {
            self.Menu[5] fadeOverTime(.3);
            self.Menu[5].alpha = 0;
        }
   
        for(i = 7; i > -1; i--) self.Menu[1][i] MoveElement(.13, -150, i * 20, "Yes");
        for(i = 0; i < 3; i++) self.Menu[0][i] MoveElement(.13, -150, -25, "Yes");
   
        self.Menu[4] MoveElement(.13, -150, self.Menu[1][3].y);
        self.Menu[2] MoveElement(.13, -150, -25, "Yes");
   
        wait .1;
        self CloseMenu();
    }
}

// The blue fade you see over the selected option
ScrollColour(Num, Menu, Curs)
{
    for(i = 0; i < Num; i++)
    {
        Menu[i] fadeOverTime(.25);
        Menu[i].color = (1, 1, 1);
    }

    Menu[Curs] fadeOverTime(.25);
    Menu[Curs].color = (0, .5, 1);
}

// Resets the titles to 0
RedoTitles()
{
    self.Curs["Titles"][0] = 0;
    self.Curs["Titles"][1] = 0;

    self.Menu[2] MoveElement(.1, self.Menu[0][0].x, -25);
    for(i = 0; i < 3; i++) self.Menu[0][i] SetText(self.MenuNames["Main"][i]);

    self DefaultValues("Titles");
}

// Resets the options to either 0 or self.MenuNames[self.SubMenu].size - 1
RedoOptions(Direction, Num)
{
    self.Curs["Options"][0] = Num;

    self.Menu[3] MoveElement(.1, 160, self.Menu[1][Num].y);
    self ScrollColour(7, self.Menu[1], self.Curs["Options"][0]);

    if(Direction == "+")
    {
        for(i = 0; i < 7; i++) self.Menu[1][i] SetText(self.MenuNames[self.SubMenu][i]);
        self DefaultValues("Options");
   
        self.Curs["Options"][1] = 0;
    }

    else
    {
        for(i = 0; i < 8; i++)
        {
            self.Menu[1][7 - i] SetText(self.MenuNames[self.SubMenu][self.MenuNames[self.SubMenu].size - i]);
            self.Menu["Value"]["Options"][7 - i] = self.MenuNames[self.SubMenu].size - i;
        }
   
        self.Curs["Options"][1] = self.MenuNames[self.SubMenu].size - 1;
    }
}

// Deletes all the menus hud elements
CloseMenu()
{
    self.InMenu = 0;

    for(i = 0; i < 3; i++) self.Menu[0][i] destroy();
    for(i = 0; i < 7; i++) self.Menu[1][i] destroy();

    for(i = 0; i < 6; i++) self.Menu[i] destroy();
}

// Resets the 'infinite' option values
DefaultValues(Value)
{
    if(Value == "Options" || Value == "Both") for(i = 0; i < 7; i++) self.Menu["Value"]["Options"][i] = i;
    if(Value == "Titles" || Value == "Both") for(i = 0; i < 3; i++) self.Menu["Value"]["Titles"][i] = i;
}

// Updates the text for titles and options
TextUpdate(Menu)
{
    if(Menu == "Main")
    {
        for(i = 0; i < 3; i++) self.Menu[0][i] SetText(self.MenuNames["Main"][self.Menu["Value"]["Titles"][i]]);
   
        self.Menu[2] scaleOverTime(.05, 110, 20); wait .1;
        self.Menu[2] scaleOverTime(.05, 100, 20);
    }
    else for(i = 0; i < 7; i++) self.Menu[1][i] SetText(self.MenuNames[self.SubMenu][self.Menu["Value"]["Options"][i]]);
}

// What happens when I new menu is created
NewMenu(Num)
{
    self.SubMenu = Num;
    for(i = 0; i < 2; i++) self.Curs["Options"][i] = 0;

    if(self.Menu[3].y != self.Menu[1][0].y)
    {
        self.Menu[3] MoveElement(.1, 160, self.Menu[1][0].y);
        self ScrollColour(7, self.Menu[1], self.Curs["Options"][0]);
    }

    self ScrollColour(3, self.Menu[0], self.Curs["Titles"][0]);
           
    self DefaultValues("Options");
    self TextUpdate("SubMenu");
}

// How the menu adds options
AddOption(M, N, Name, Func, aParam, bParam)
{
    self.MenuNames[M][N] = Name;
    self.Function[M][N] = Func;

    if(isDefined(aParam)) self.aInput[M][N] = aParam;
    if(isDefined(bParam)) self.bInput[M][N] = bParam;
}

// Moves hud elements
MoveElement(Time, xPos, yPos, Wait)
{
    self MoveOverTime(Time);
    self.x = xPos; self.y = yPos;

    if(Wait == "Yes") wait Time;
}

// Creating all of the text in the menu
cText(Text, Font, Scale, Align, Relative, X, Y, Sort, Alpha)
{
    self endon("death");
    TextElem = createFontString(Font, Scale, self);

    TextElem setPoint(Align, Relative, x, y);
    TextElem SetText(Text);

    TextElem.sort = Sort;
    TextElem.alpha = Alpha;
    TextElem.foreground = true;

    return TextElem;
}


// Creating the elements
CreateElement(Align, Relative, X, Y, Width, Height, Color, Shader, Sort, Alpha)
{
    self endon("death");
    RectangleElem = newClientHudElem( self );

    RectangleElem.elemType = "bar";
    RectangleElem.width = Width;
    RectangleElem.height = Height;
    RectangleElem.align = Align;
    RectangleElem.relative = Relative;
    RectangleElem.xOffset = 0;
    RectangleElem.yOffset = 0;
    RectangleElem.children = [];
    RectangleElem.sort = Sort;
    RectangleElem.color = Color;
    RectangleElem.alpha = Alpha;
    RectangleElem setParent( level.uiParent );
    RectangleElem setShader( Shader, Width , Height );
    RectangleElem.hidden = false;
    RectangleElem setPoint(Align, Relative, X, Y);

    return RectangleElem;
}

// For... testing...
Testing()
{
    self iprintln(self.MenuNames[self.SubMenu][self.Curs["Options"][1]]);
}


createText(font, fontScale, align, relative, x, y, sort, alpha, text, color)
{
    textElem = self createFontString(font, fontScale, self);
    textElem setPoint(align, relative, x, y);
    textElem.hideWhenInMenu = true;
    textElem.sort = sort;
    textElem.alpha = alpha;
    textElem.color = color;
    textElem setText(text);
    return textElem;
}

createRectangle(align, relative, x, y, width, height, color, shader, sort, alpha, server)
{
    if(isDefined(server))
        boxElem = newHudElem(self);
    else
        boxElem = newClientHudElem(self);

    boxElem.elemType = "bar";
    if(!level.splitScreen)
    {
        boxElem.x = -2;
        boxElem.y = -2;
    }
    boxElem.hideWhenInMenu = true;
    boxElem.width = width;
    boxElem.height = height;
    boxElem.align = align;
    boxElem.relative = relative;
    boxElem.xOffset = 0;
    boxElem.yOffset = 0;
    boxElem.children = [];
    boxElem.sort = sort;
    boxElem.color = color;
    boxElem.alpha = alpha;
    boxElem.shader = shader;
    boxElem setParent(level.uiParent);
    boxElem setShader(shader,width,height);
    boxElem.hidden = false;
    boxElem setPoint(align, relative, x, y);
    return boxElem;
}

getFont()
{
    if(!isConsole())
        return "default";
    return "small";
}

isConsole()
{
    if(level.xenon || level.ps3)
        return true;
    return false;
}

runRankMenu()
{
    self.campaignHud = [];
    self.campaignHud["bg"] = self createRectangle("BOTTOMLEFT","BOTTOMLEFT",0,0,200,60,(0,0,0),"white",-4,0.3);
    self.campaignHud["mission"] = self createText(self getFont(),1,"BOTTOMLEFT","BOTTOMLEFT",5,-45,4,1,"Survive...");
    self.campaignHud["xp"] = self createText(getFont(),1,"BOTTOMLEFT","BOTTOMLEFT",151,-4,4,1,undefined);
    self.campaignHud["xp"].label = "Rank: ";
    self.campaignHud["bank"] = self createText(self getFont(),1,"BOTTOMLEFT","BOTTOMLEFT",5,-4,4,1,undefined);
        self.campaignHud["bank"].label = "Remaining: ^2$^7";

    if(self.prestigeLevel == 0)
    {
        self.campaignHud["rank"] = self createRectangle("BOTTOMLEFT","BOTTOMLEFT",5,-20,20,20,(1,1,1),level.rankBadges[self.rankLevel],2,1);
        if(self.rankLevel == 64)
            self.campaignHud["nextrank"] = self createRectangle("BOTTOMLEFT","BOTTOMLEFT",175,-20,20,20,(1,1,1),level.rankPrestige[self.prestigeLevel],2,1);
        else
            self.campaignHud["nextrank"] = self createRectangle("BOTTOMLEFT","BOTTOMLEFT",175,-20,20,20,(1,1,1),level.rankBadges[self.rankLevel+1],2,1);
    }
    else
    {
        if(self.prestigeLevel == 10)
        {
            self.campaignHud["rank"] = self createRectangle("BOTTOMLEFT","BOTTOMLEFT",5,-20,20,20,(1,1,1),level.rankPrestige[self.prestigeLevel-2],2,1);
            self.campaignHud["nextrank"] = self createRectangle("BOTTOMLEFT","BOTTOMLEFT",175,-20,20,20,(1,1,1),level.rankPrestige[self.prestigeLevel-1],2,1);
        }
        else
        {
            self.campaignHud["rank"] = self createRectangle("BOTTOMLEFT","BOTTOMLEFT",5,-20,20,20,(1,1,1),level.rankPrestige[self.prestigeLevel-1],2,1);
            self.campaignHud["nextrank"] = self createRectangle("BOTTOMLEFT","BOTTOMLEFT",175,-20,20,20,(1,1,1),level.rankPrestige[self.prestigeLevel],2,1);
        }
    }
    self.campaignHud["bar"] = self createRectangle("BOTTOMLEFT","BOTTOMLEFT",32.5,-25,135,10,(0,0,0),"white",2,1);
    self.campaignHud["barprog"] = self createRectangle("BOTTOMLEFT","BOTTOMLEFT",32.5,-25,self.XPBar,10,(1,1,1),"white",3,1);
    if(self.prestigeLevel != 10 || self.rankLevel != 64 || self.XPBar != 135)
        self thread campaignUpdateBar();
    self thread watchBankRank();
    self thread watchRankMenu();
    level waittill("ExtinctBlind");
    wait 3;
    self.campaignHud["bg"] destroy();
    self.campaignHud["mission"] destroy();
    self.campaignHud["bank"] destroy();
    self destroyAll(self.campaignHud);
}

watchForPrestige()
{
    while(true)
    {
        if(self.prestigeLevel > 0)
            break;
        wait .05;
    }
    self.campaignHud["xp"].x -= 14;
    self.campaignHud["xp"].label = "Prestige: ";

    while(true)
    {
        if(self getSavedVariable("500") != 1)
            self.campaignHud["bank"] setValue(self.Banking);
        self.campaignHud["xp"] setValue(self.prestigeLevel);
        wait .05;
    }
}

watchBankRank()
{
    self thread watchForPrestige();
    while(self.prestigeLevel == 0)
    {
        if(self getSavedVariable("500") != 1)
            self.campaignHud["bank"] setValue(self.Banking);
        self.campaignHud["xp"] setValue(self.rankLevel+1);
        wait .05;
    }
}

campaignUpdateBar()
{
    self endon("disconnect");
    self endon("RankedUpFully");
    time = .1;
    while(true)
    {
        if(self.rankLevel < 64 && self.XPGot < int(self.xpNeeded[self.rankLevel]) || self.prestigeLevel > 0 && self.XPGot < 13130)
        {
            if(time == 0.05) time = .1;
            if(self.prestigeLevel == 0)
            {
                if(self.XPextra*(135/int(self.xpNeeded[self.rankLevel])) == 0)
                {
                    self.campaignHud["barprog"] scaleOverTime(time,1,10);
                    time = 0.05;
                }
                self.campaignHud["barprog"] scaleOverTime(time,int(self.XPextra*(135/int(self.xpNeeded[self.rankLevel]))),10);
                if(self.XPBar != int(self.XPextra*(135/int(self.xpNeeded[self.rankLevel]))))
                    self.XPBar = int(self.XPextra*(135/int(self.xpNeeded[self.rankLevel])));
            }
            else
            {
                if(self.XPextra*(135/13130) == 0)
                {
                    self.campaignHud["barprog"] scaleOverTime(time,1,10);
                    time = 0.05;
                }
                self.campaignHud["barprog"] scaleOverTime(time,int(self.XPextra*(135/13130)),10);
                if(self.XPBar != int(self.XPextra*(135/13130)))
                    self.XPBar = int(self.XPextra*(135/13130));
            }
        }
        wait time;
    }
}

watchRankMenu()
{
    self endon("disconnect");
    while(true)
    {
        if(self.rankLevel == 64 && self.prestigeLevel == 10) break;
        if(self.rankLevel < 64 || self.prestigeLevel < 10)
        {
            if((self.prestigeLevel == 0 && self.XPGot >= int(self.xpNeeded[self.rankLevel])) || (self.prestigeLevel > 0 && self.XPGot >= 13130))
            {
                self.campaignHud["barprog"] scaleOverTime(.05,135,10);
                wait .05;

                if(self.prestigeLevel == 0)
                    self.XPextra = int(self.xpNeeded[self.rankLevel]);
                else
                    self.XPextra = 13130;
                self.XPGot -= self.XPextra;
                self.XPextra = 0;

                if(self.rankLevel == 64)
                {
                    self.prestigeLevel++;
                    if(self.prestigeLevel == 10) break;
                }
                else self.rankLevel++;
                self.campaignHud["barprog"] scaleOverTime(.05,1,10);

                if(self.prestigeLevel == 0)
                {
                    self.campaignHud["rank"] setShader(level.rankBadges[self.rankLevel],20,20);
                    self.campaignHud["nextrank"] setShader(level.rankBadges[self.rankLevel+1],20,20);
                }
                else
                {
                    self.campaignHud["rank"] setShader(level.rankPrestige[self.prestigeLevel-1],20,20);
                    self.campaignHud["nextrank"] setShader(level.rankPrestige[self.prestigeLevel],20,20);
                }
                wait 0.05;
            }
            else
                if(self.XPextra != self.XPGot)
                    self.XPextra = self.XPGot;
        }
        wait 0.05;
    }
    self notify("RankedUpFully");
    self.XPextra = int(self.xpNeeded[self.rankLevel]);
    self.campaignHud["barprog"] scaleOverTime(.1,135,10);
    self.XPBar = 135;
}

giveFeedbackPoints(text)
{
    temp = self createFontString("default",1.5,self);
    temp setText(text);
    temp setPoint("LEFT","BOTTOMLEFT",self.campaignHud["xp"].x+35,self.campaignHud["xp"].y);
    temp.color = divideColor(237,255,83);
    temp moveOverTime(0.5);
    temp setPoint("LEFT","BOTTOMLEFT",temp.x+30,temp.y+randomIntRange(-15,15));
    temp hudFadenDestroy(0,0.6);
}

watchForRescue()
{
    self waittill("EXTINCTION_SUCCESS");
    self.XPGot += level.winningXP;
    self thread giveFeedbackPoints("+"+level.winningXP);
}

watchXpKillsGive()
{
    while(true)
    {
        self waittill("zom_kill");
        if(level.zombie_vars["zombie_point_scalar"] == 2 || isDefined(self.zombie_point_scalar))
        {
            self.XPGot += 20;
            self thread giveFeedbackPoints("+20");
        }
        else
        {
            self.XPGot+=10;
            self thread giveFeedbackPoints("+10");
        }
    }
}

watchXpHeadShotGive()
{
    while(true)
    {
        self waittill("headshot");
        if(level.zombie_vars["zombie_point_scalar"] == 2 || isDefined(self.zombie_point_scalar))
        {
            self.XPGot+=80;
            self thread giveFeedbackPoints("+80");
        }
        else
        {
            self.XPGot+=40;
            self thread giveFeedbackPoints("+40");
        }
    }
}


setObjectiveLog(text)
{
    self.campaignHud["mission"] setText("Objective: "+text);
}

hudFade(alpha,time)
{
    self fadeOverTime(time);
    self.alpha = alpha;
    wait time;
}

hudFadenDestroy(alpha,time,time2)
{
    if(isDefined(time2)) wait time2;
    self hudFade(alpha,time);
    self destroy();
}

divideColor(c1,c2,c3)
{
    return(c1/255,c2/255,c3/255);
}

destroyAll(array)
{
    if(!isDefined(array))return;
    keys = getArrayKeys(array);
    for(a=0;a<keys.size;a++)
        if(isDefined(array[keys[a]][0]))
            for(e=0;e<array[keys[a]].size;e++)
                array[keys[a]][e] destroy();
    else
        array[keys[a]] destroy();
}
getSavedVariable(dataName,table)
{
    if(!isDefined(table))
        return self getStat(int(tableLookup("mp/statstable.csv",0,dataName,1)));
    else
        return self getStat(int(tableLookup(table,1,dataName,0)));
}

campaignPlayerSettings()
{
    self.xpNeeded = strTok("10;16;22;28;34;40;46;52;58;64;70;76;82;88;94;100;106;112;118;124;130;136;142;148;154;160;166;172;178;184;190;196;202;208;214;220;226;232;238;244;250;256;262;268;274;280;286;292;298;304;310;316;322;328;334;340;346;352;358;364;370;376;382;388;394;400",";");
    self.prestigeLevel = self getSavedVariable("153");
    self.rankLevel = self getSavedVariable("154");
    self.XPGot = self getSavedVariable("hctwar_losses","mp/playerStatsTable.csv");
    self.XPextra = self getSavedVariable("hckoth_losses","mp/playerStatsTable.csv");
    self.XPBar = self getSavedVariable("155");
    if(self getSavedVariable("250") != 1)
    {
        self setSavedVariable("152",1);
        self.prestigeLevel = 0;
    }
    if(self.XPBar == 0) self.XPBar = 1;
    self thread extinctionSave();
}

extinctionSave()
{
    self endon("disconnect");
    while(true)
    {
        self setSavedVariable("153",self.prestigeLevel);
        self setSavedVariable("154",self.rankLevel);
        self setSavedVariable("hctwar_losses",self.XPGot,"mp/playerStatsTable.csv");
        self setSavedVariable("hckoth_losses",self.XPextra,"mp/playerStatsTable.csv");
        self setSavedVariable("155",self.XPBar);
        wait 1;
    }
}

setSavedVariable(dataName,val,table)
{
    if(!isDefined(table))
        self setStat(int(tableLookup("mp/statstable.csv",0,dataName,1)),int(val));
    else
        self setStat(int(tableLookup(table,1,dataName,0)),int(val));
}


0b10fee56c5f75fd0df9da3abb6f4da3.jpg
 
Top