UGX-Mods

Call of Duty: Black Ops 3 => Downloadable Items for Mappers => Custom Maps, Mods & Tools => Scripts => Topic started by: marinescdude on July 15, 2023, 04:47:29 pm

Title: QED Random Weapon Power-Up
Post by: marinescdude on July 15, 2023, 04:47:29 pm
 

QED Random Weapon Power-Up

(https://steamuserimages-a.akamaihd.net/ugc/2035114337776076708/5BFF3AA6B2C2D6F9ED6C89546B8DD9C9EA3179FD/?imw=5000&imh=5000&ima=fit&impolicy=Letterbox&imcolor=%23000000&letterbox=false)

China Lake from Skye's Weapon Ports  (https://www.ugx-mods.com/forum/full-weapons/84/skyes-bo1-weapon-ports/23143/)for example only
www.mediafire.com

To-Do:
Credits
Serious for decompiled scripts: https://github.com/shiversoftdev/t7-source (https://github.com/shiversoftdev/t7-source)
TescoFresco for reference on how to init power-up scripts:
https://github.com/tescfresc/TFs-Zombie-Options (https://github.com/tescfresc/TFs-Zombie-Options)
 
Quick Reference
Code Snippet
cpp
//_zm_weap_quantum_bomb.gsc

function init()
{
    ...
    quantum_bomb_register_result("random_weapon_powerup", &quantum_bomb_random_weapon_powerup_result, 60);
    ...
}

function quantum_bomb_random_weapon_powerup_result(position, player)
{
    keys = array::randomize( GetArrayKeys( level.zombie_weapons ) );
    if (IsDefined(level.CustomRandomWeaponWeights))
    {
        keys = player [[level.CustomRandomWeaponWeights]](keys);
    }
    w_weapon = keys[0];
    for ( i = 0; i < keys.size; i++ )
    {
        if ( zm_weapons::get_is_in_box( keys[i] ) )
        {
            w_weapon = keys[i];
            break;
        }
    }

    if(zm_weapons::can_upgrade_weapon(w_weapon) && !RandomInt(4))
        w_weapon = zm_weapons::get_upgrade_weapon(w_weapon);
   
    level.zombie_powerups["random_weapon"].weapon = w_weapon;
   
    dw_weapon = w_weapon.dualWieldWeapon;
    if ( dw_weapon != level.weaponNone )
        level.zombie_powerups["random_weapon"].model_name = dw_weapon.worldmodel;
    else
        level.zombie_powerups["random_weapon"].model_name = w_weapon.worldmodel;

    level thread zm_powerups::specific_powerup_drop("random_weapon", position);
}
Code Snippet
cpp
//_zm_powerup_random_weapon.gsc

#using scripts\codescripts\struct;
#using scripts\shared\ai\zombie_death;
#using scripts\shared\array_shared;
#using scripts\shared\clientfield_shared;
#using scripts\shared\flag_shared;
#using scripts\shared\flagsys_shared;
#using scripts\shared\laststand_shared;
#using scripts\shared\system_shared;
#using scripts\shared\util_shared;
#using scripts\zm\_zm_blockers;
#using scripts\zm\_zm_devgui;
#using scripts\zm\_zm_magicbox;
#using scripts\zm\_zm_melee_weapon;
#using scripts\zm\_zm_pers_upgrades;
#using scripts\zm\_zm_pers_upgrades_functions;
#using scripts\zm\_zm_powerups;
#using scripts\zm\_zm_score;
#using scripts\zm\_zm_spawner;
#using scripts\zm\_zm_utility;
#using scripts\zm\_zm_weapons;

#namespace zm_powerup_random_weapon;

//REGISTER_SYSTEM( "zm_powerup_random_weapon", &__init__, undefined )

/*function autoexec __init__sytem__()
{
    system::register("zm_powerup_random_weapon", &__init__, undefined, undefined);
}*/

function init()
{
    zm_powerups::register_powerup("random_weapon", &give_random_weapon, &setup_random_weapon);
    if(tolower(getdvarstring("g_gametype")) != "zcleansed")
    {
        zm_powerups::add_zombie_powerup("random_weapon", "zombie_pickup_minigun", &"", &zm_powerups::func_should_never_drop, 1, 0, 0);
        zm_powerups::powerup_set_statless_powerup("random_weapon");
        zm_powerups::powerup_set_player_specific("random_weapon", 1);
    }
}

function give_random_weapon(e_player)
{
    w_weapon = level.zombie_powerups["random_weapon"].weapon;
    e_player notify(#"hash_31471387");
    e_player zm_weapons::weapon_give(w_weapon, 0, 0, 1);
    wait(0.1);
}

//make sure no missing tags on weapon models
function setup_random_weapon()
{
    self useweaponmodel( level.zombie_powerups["random_weapon"].weapon, level.zombie_powerups["random_weapon"].model_name );
}

Code Snippet
cpp
//_zm_powerup_random_weapon.csc

#using scripts\codescripts\struct;
#using scripts\shared\clientfield_shared;
#using scripts\shared\system_shared;
#using scripts\zm\_zm_powerups;

#insert scripts\shared\shared.gsh;

#namespace zm_powerup_random_weapon;

REGISTER_SYSTEM( "zm_powerup_random_weapon", &__init__, undefined )

/*function autoexec __init__sytem__()
{
    system::register("zm_powerup_random_weapon", &__init__, undefined, undefined);
}*/

function __init__()
{
    zm_powerups::include_zombie_powerup("random_weapon");
    zm_powerups::add_zombie_powerup("random_weapon");
}

Title: Re: QED Random Weapon Power-Up
Post by: marinescdude on August 06, 2023, 02:07:56 pm
Okay good to see there have indeed been random weapon power-ups publicly available for use, still some changes from natesmithzombies' version (https://forum.modme.co/wiki/threads/706.html) (download from KillJoy's megathread (https://forum.modme.co/wiki/threads/2831.html)) that are required:
 
Code Snippet
cpp
//nsz_powerup_weapon.csc/zm_powerup_random_weapon.csc

//change "weapon" with "random_weapon" so hacker scripts know it's not hackable

function __init__()
{
    zm_powerups::include_zombie_powerup( "random_weapon" );
    zm_powerups::add_zombie_powerup( "random_weapon" );
}
Code Snippet
cpp
//nsz_powerup_weapon.gsc/zm_powerup_random_weapon.gsc

zm_powerups::register_powerup( "random_weapon", &grab_weapon, &setup_weapon );
if( ToLower( GetDvarString( "g_gametype" ) ) != "zcleansed" )
{
    zm_powerups::add_zombie_powerup( "random_weapon", "tag_origin", "", &zm_powerups::func_should_never_drop, POWERUP_ONLY_AFFECTS_GRABBER, !POWERUP_ANY_TEAM, !POWERUP_ZOMBIE_GRABBABLE );
    zm_powerups::powerup_set_statless_powerup("random_weapon");
    zm_powerups::powerup_set_player_specific("random_weapon", 1);
}
Code Snippet
cpp
//nsz_powerup_weapon.gsc/zm_powerup_random_weapon.gsc

//remove weapon_lookup_table function above this, func_should_drop_weapon below this

function setup_weapon( player )
{
    //level.weapon_lookup_table = array::randomize( level.weapon_lookup_table );
    keys = array::randomize( GetArrayKeys( level.zombie_weapons ) );
    if (IsDefined(level.CustomRandomWeaponWeights))
    {
        keys = player [[level.CustomRandomWeaponWeights]](keys);
    }
    weapon_to_give = keys[0];
    //pap_triggers = zm_pap_util::get_triggers();
    for ( i = 0; i < keys.size; i++ )
    {
        if ( zm_weapons::get_is_in_box( keys[i] ) )
        //if ( zm_magicbox::treasure_chest_CanPlayerReceiveWeapon( player, keys[i], pap_triggers ) )
        {
            weapon_to_give = keys[i];
            break;
        }
    }

    //w_weapon = zm_magicbox::treasure_chest_ChooseWeightedRandomWeapon();
    if(zm_weapons::can_upgrade_weapon(weapon_to_give) && !RandomInt(4))
        weapon_to_give = zm_weapons::get_upgrade_weapon(weapon_to_give);
   
    //weapon_to_give = level.weapon_lookup_table[0];
    world_gun = GetWeaponWorldModel(weapon_to_give);
    //self SetModel( world_gun );
    self useweaponmodel( weapon_to_give, world_gun );
    self.weapon_to_give = weapon_to_give;
)
Code Snippet
cpp
//nsz_powerup_weapon.gsc/zm_powerup_random_weapon.gsc

//replace GiveWeapon call with zm_weapons::weapon_give, other no. of weapons/Mule Kick checks are unnecessary

function grab_weapon( player )
{
    weaps = player getweaponslistprimaries();
    gun = self.weapon_to_give;
   
    if( player does_player_have(gun) )
        return;
   
    player zm_weapons::weapon_give( gun, zm_weapons::is_weapon_upgraded(gun) );
}