boiii-scripts/shared/_weapon_customization_icon.csc
2023-04-13 17:30:38 +02:00

264 lines
15 KiB
Plaintext

#using scripts\core\_multi_extracam;
#using scripts\shared\util_shared;
#using scripts\codescripts\struct;
#using scripts\shared\animation_shared;
#using scripts\shared\filter_shared;
#using scripts\shared\scene_shared;
#using scripts\shared\system_shared;
#namespace weapon_customization_icon;
function autoexec __init__sytem__() { system::register("weapon_customization_icon",&__init__,undefined,undefined); }
///////////////////////////////////////////////////////////////////////////
// SETUP
///////////////////////////////////////////////////////////////////////////
function __init__()
{
level.extra_cam_wc_paintjob_icon = [];
level.extra_cam_wc_variant_icon = [];
level.extra_cam_render_wc_paintjobicon_func_callback = &process_wc_paintjobicon_extracam_request;
level.extra_cam_render_wc_varianticon_func_callback = &process_wc_varianticon_extracam_request;
level.weaponCustomizationIconSetup = &wc_icon_setup;
}
function wc_icon_setup( localClientNum )
{
level.extra_cam_wc_paintjob_icon[ localClientNum ] = SpawnStruct();
level.extra_cam_wc_variant_icon[ localClientNum ] = SpawnStruct();
level thread update_wc_icon_extracam( localClientNum );
}
function update_wc_icon_extracam( localClientNum )
{
level endon( "disconnect" );
while ( true )
{
level waittill( "process_wc_icon_extracam_" + localClientNum, extracam_data_struct );
setup_wc_weapon_model( localClientNum, extracam_data_struct );
setup_wc_extracam_settings( localClientNum, extracam_data_struct );
}
}
function wait_for_extracam_close( localClientNum, camera_ent, extracam_data_struct )
{
level waittill( "render_complete_" + localClientNum + "_" + extracam_data_struct.extraCamIndex );
multi_extracam::extracam_reset_index( localClientNum, extracam_data_struct.extraCamIndex );
if( IsDefined( extracam_data_struct.weapon_script_model ) )
{
extracam_data_struct.weapon_script_model delete();
}
}
function GetXcam( weapon_name, camera )
{
xcam = GetWeaponXCam( weapon_name, camera );
if( !IsDefined( xcam ) )
{
xcam = GetWeaponXCam( GetWeapon( "ar_damage" ), camera );
}
return xcam;
}
function setup_wc_extracam_settings( localClientNum, extracam_data_struct )
{
assert( isdefined( extracam_data_struct.jobIndex ) );
if(!isdefined(level.camera_ents))level.camera_ents=[];
initializedExtracam = false;
camera_ent = (isDefined(level.camera_ents[localClientNum]) ? level.camera_ents[localClientNum][extracam_data_struct.extraCamIndex] : undefined);
if( !isdefined( camera_ent ) )
{
initializedExtracam = true;
if ( isdefined( struct::get( "weapon_icon_staging_camera" ) ) )
{
camera_ent = multi_extracam::extracam_init_index( localClientNum, "weapon_icon_staging_camera", extracam_data_struct.extraCamIndex);
}
else
{
camera_ent = multi_extracam::extracam_init_item( localClientNum, get_safehouse_position_struct(), extracam_data_struct.extraCamIndex);
}
}
assert( isdefined( camera_ent ) );
if ( extracam_data_struct.loadoutSlot == "default_camo_render" )
{
extracam_data_struct.xcam = "ui_cam_icon_camo_export";
//extracam_data_struct.xcam = GetXcam( extracam_data_struct.current_weapon, "cam_icon_weapon" );
extracam_data_struct.subXCam = "cam_icon";
}
else
{
extracam_data_struct.xcam = GetXcam( extracam_data_struct.current_weapon, "cam_icon_weapon" );
extracam_data_struct.subXCam = "cam_icon";
}
position = extracam_data_struct.weapon_position;
camera_ent PlayExtraCamXCam( extracam_data_struct.xcam, 0, extracam_data_struct.subXCam, extracam_data_struct.notetrack, position.origin, position.angles, extracam_data_struct.weapon_script_model, position.origin, position.angles );
while( !( extracam_data_struct.weapon_script_model isStreamed() ) )
{
{wait(.016);};
}
if ( extracam_data_struct.loadoutSlot == "default_camo_render" )
{
wait 0.5; // not paintshops on these renders so just wait an arbitrary amount of time to make sure we're all pretty
}
else
{
level util::waittill_notify_or_timeout( "paintshop_ready_" + extracam_data_struct.jobIndex, 5 );
}
setExtraCamRenderReady( extracam_data_struct.jobIndex );
extracam_data_struct.jobIndex = undefined;
if( initializedExtracam )
{
level thread wait_for_extracam_close( localClientNum, camera_ent, extracam_data_struct );
}
}
function set_wc_icon_weapon_options( weapon_options_param, extracam_data_struct )
{
weapon_options = strtok( weapon_options_param, "," );
if( IsDefined( weapon_options ) && IsDefined( extracam_data_struct.weapon_script_model ) )
{
extracam_data_struct.weapon_script_model SetWeaponRenderOptions( int( weapon_options[0] ), int( weapon_options[1] ), false, false, int( weapon_options[2] ), extracam_data_struct.paintjobSlot, extracam_data_struct.paintjobIndex, true, extracam_data_struct.isFilesharePreview );
}
}
function spawn_weapon_model( localClientNum, origin, angles )
{
weapon_model = Spawn( localClientNum, origin, "script_model" );
if( IsDefined( angles ) )
{
weapon_model.angles = angles;
}
weapon_model SetHighDetail();
return weapon_model;
}
function set_wc_icon_cosmetic_variants( acv_param, weapon_full_name, extracam_data_struct )
{
acv_indexes = strtok( acv_param, "," );
for( i = 0; i + 1 < acv_indexes.size; i += 2 )
{
extracam_data_struct.weapon_script_model SetAttachmentCosmeticVariantIndex( weapon_full_name, acv_indexes[i], int( acv_indexes[i+1] ) );
}
}
// A hack to work around the missing icon staging rooms in the safehouses
function get_safehouse_position_struct()
{
position = SpawnStruct();
position.angles = ( 0, 0, 0 );
switch ( ToLower( GetDvarString( "mapname" ) ) )
{
case "cp_sh_cairo":
position.origin = ( -527, 1569, -25 );
break;
case "cp_sh_singapore":
position.origin = ( -1215, 2464, 190 );
break;
// case "cp_sh_mobile":
default:
position.origin = ( 191, 113, -2550 );
break;
}
return position;
}
function setup_wc_weapon_model( localClientNum, extracam_data_struct )
{
base_weapon_slot = extracam_data_struct.loadoutSlot;
weapon_full_name = extracam_data_struct.weaponPlusAttachments;
weapon_options_param = extracam_data_struct.weaponOptions;
acv_param = extracam_data_struct.attachmentVariantString;
if( IsDefined( weapon_full_name ) )
{
position = struct::get( "weapon_icon_staging" );
if ( !IsDefined( position ) )
{
position = get_safehouse_position_struct();
}
if( !IsDefined( extracam_data_struct.weapon_script_model ) )
{
extracam_data_struct.weapon_script_model = spawn_weapon_model( localClientNum, position.origin, position.angles );
}
extracam_data_struct.current_weapon = GetWeaponWithAttachments( weapon_full_name );
if( isDefined( extracam_data_struct.current_weapon.frontendmodel ) )
{
extracam_data_struct.weapon_script_model UseWeaponModel( extracam_data_struct.current_weapon, extracam_data_struct.current_weapon.frontendmodel );
}
else
{
extracam_data_struct.weapon_script_model UseWeaponModel( extracam_data_struct.current_weapon );
}
extracam_data_struct.weapon_position = position;
if( IsDefined( acv_param ) && acv_param != "none" )
{
set_wc_icon_cosmetic_variants( acv_param, weapon_full_name, extracam_data_struct );
}
if( IsDefined( weapon_options_param ) && weapon_options_param != "none" )
{
set_wc_icon_weapon_options( weapon_options_param, extracam_data_struct );
}
}
}
function process_wc_paintjobicon_extracam_request( localClientNum, extraCamIndex, jobIndex, attachmentVariantString, weaponOptions, weaponPlusAttachments, loadoutSlot, paintjobIndex, paintjobSlot, isFilesharePreview )
{
level.extra_cam_wc_paintjob_icon[ localClientNum ].jobIndex = jobIndex;
level.extra_cam_wc_paintjob_icon[ localClientNum ].extraCamIndex = extraCamIndex;
level.extra_cam_wc_paintjob_icon[ localClientNum ].attachmentVariantString = attachmentVariantString;
level.extra_cam_wc_paintjob_icon[ localClientNum ].weaponOptions = weaponOptions;
level.extra_cam_wc_paintjob_icon[ localClientNum ].weaponPlusAttachments = weaponPlusAttachments;
level.extra_cam_wc_paintjob_icon[ localClientNum ].loadoutSlot = loadoutSlot;
level.extra_cam_wc_paintjob_icon[ localClientNum ].paintjobIndex = paintjobIndex;
level.extra_cam_wc_paintjob_icon[ localClientNum ].paintjobSlot = paintjobSlot;
level.extra_cam_wc_paintjob_icon[ localClientNum ].notetrack = "paintjobpreview";
level.extra_cam_wc_paintjob_icon[ localClientNum ].isFilesharePreview = isFilesharePreview;
level notify( "process_wc_icon_extracam_" + localClientNum, level.extra_cam_wc_paintjob_icon[ localClientNum ] );
}
function process_wc_varianticon_extracam_request( localClientNum, extraCamIndex, jobIndex, attachmentVariantString, weaponOptions, weaponPlusAttachments, loadoutSlot, paintjobIndex, paintjobSlot, isFilesharePreview )
{
level.extra_cam_wc_variant_icon[ localClientNum ].jobIndex = jobIndex;
level.extra_cam_wc_variant_icon[ localClientNum ].extraCamIndex = extraCamIndex;
level.extra_cam_wc_variant_icon[ localClientNum ].attachmentVariantString = attachmentVariantString;
level.extra_cam_wc_variant_icon[ localClientNum ].weaponOptions = weaponOptions;
level.extra_cam_wc_variant_icon[ localClientNum ].weaponPlusAttachments = weaponPlusAttachments;
level.extra_cam_wc_variant_icon[ localClientNum ].loadoutSlot = loadoutSlot;
level.extra_cam_wc_variant_icon[ localClientNum ].paintjobIndex = paintjobIndex;
level.extra_cam_wc_variant_icon[ localClientNum ].paintjobSlot = paintjobSlot;
level.extra_cam_wc_variant_icon[ localClientNum ].notetrack = "variantpreview";
level.extra_cam_wc_variant_icon[ localClientNum ].isFilesharePreview = isFilesharePreview;
level notify( "process_wc_icon_extracam_" + localClientNum, level.extra_cam_wc_variant_icon[ localClientNum ] );
}