1 #using scripts\core\_multi_extracam;
3 #using scripts\codescripts\struct;
4 #using scripts\shared\abilities\gadgets\_gadget_camo_render;
5 #using scripts\shared\animation_shared;
6 #using scripts\shared\duplicaterender_mgr;
7 #using scripts\shared\end_game_taunts;
8 #using scripts\shared\filter_shared;
9 #using scripts\shared\scene_shared;
10 #using scripts\shared\system_shared;
11 #using scripts\shared\util_shared;
12 #using scripts\shared\array_shared;
14 #insert scripts\shared\shared.gsh;
15 #insert scripts\shared\duplicaterender.gsh;
16 #insert scripts\shared\weapons\weapon_group_anims.gsh;
18 #namespace character_customization;
20 #define HERO_HELMET_BONE ""
21 #define HERO_HEAD_BONE ""
22 #define HERO_WEAPON_BONE "tag_weapon_right"
23 #define HERO_CUSTOMIZE_IDLE_ANIM "pb_cac_main_lobby_idle"
24 #define HERO_LOBBY_CLIENT_IDLE_ANIM "pb_cac_vs_screen_idle_1"
25 #define RS_ROTATION_SPEED_MULTIPLIER 3.0
27 #define HERO_MESH_LODS STREAM_LOD_HIGHEST
28 #define HERO_TEXTURE_LODS STREAM_MIP_EXCLUDE_HIGHEST
30 #define HELMET_MESH_LODS STREAM_LOD_HIGHEST
31 #define HELMET_TEXTURE_LODS STREAM_MIP_EXCLUDE_HIGHEST
33 #define HEAD_MESH_LODS STREAM_LOD_HIGHEST
34 #define HEAD_TEXTURE_LODS STREAM_MIP_EXCLUDE_HIGHEST
36 #define LIVE_CHARACTER_SPAWN_TARGET "character_customization"
37 #define DEFAULT_LIVE_CHARACTER_EXPLODER "char_customization"
39 #define SHOWCASE_WEAPON_PAINTSHOP_CLASS 1
40 #define LOCAL_WEAPON_PAINTSHOP_CLASS 2
42 #using_animtree("all_player");
61 DEFAULT( level.custom_characters, [] );
62 DEFAULT( level.extra_cam_hero_data, [] );
63 DEFAULT( level.extra_cam_lobby_client_hero_data, [] );
64 DEFAULT( level.extra_cam_headshot_hero_data, [] );
65 DEFAULT( level.extra_cam_outfit_preview_data, [] );
74 if( IsDefined( level.liveCCData[localClientNum] ) )
84 if ( !isdefined( characterModel ) )
89 DEFAULT( level.custom_characters[localClientNum], [] );
91 if ( isdefined( level.custom_characters[localClientNum][characterModel.targetname] ) )
93 return level.custom_characters[localClientNum][characterModel.targetname];
96 data_struct = SpawnStruct();
97 level.custom_characters[localClientNum][characterModel.targetname] = data_struct;
100 data_struct.characterModel = characterModel;
101 data_struct.attached_model_anims =
array();
102 data_struct.attached_models =
array();
103 data_struct.attached_entities =
array();
104 data_struct.origin = characterModel.origin;
105 data_struct.angles = characterModel.angles;
108 data_struct.characterIndex = 0;
110 data_struct.splitScreenClient = undefined;
112 data_struct.bodyIndex = 0;
113 data_struct.bodyColors =
array( 0, 0, 0 );
115 data_struct.helmetIndex = 0;
116 data_struct.helmetColors =
array( 0, 0, 0 );
118 data_struct.headIndex = 0;
120 data_struct.align_target = undefined;
121 data_struct.currentAnimation = undefined;
122 data_struct.currentScene = undefined;
125 data_struct.body_render_options = GetCharacterBodyRenderOptions( 0, 0, 0, 0, 0 );
126 data_struct.helmet_render_options = GetCharacterHelmetRenderOptions( 0, 0, 0, 0, 0 );
127 data_struct.head_render_options = GetCharacterHeadRenderOptions( 0 );
128 data_struct.mode_render_options = GetCharacterModeRenderOptions( 0 );
129 data_struct.alt_render_mode = alt_render_mode;
132 data_struct.useFrozenMomentAnim =
false;
133 data_struct.frozenMomentStyle =
"weapon";
134 data_struct.show_helmets =
true;
135 data_struct.allow_showcase_weapons =
false;
137 data_struct.force_prologue_body =
false;
138 if ( SessionModeIsCampaignGame() )
140 highestMapReached = GetDStat( localClientNum,
"highestMapReached" );
141 data_struct.force_prologue_body = ( !isdefined(highestMapReached) || highestMapReached == 0 ) && GetDvarString(
"mapname" ) ==
"core_frontend";
144 characterModel SetHighDetail(
true, data_struct.alt_render_mode );
152 heroes = GetHeroes( game_mode );
153 foreach( hero
in heroes )
155 bodies = GetHeroBodyModelIndices( hero, game_mode );
156 helmets = GetHeroHelmetModelIndices( hero, game_mode );
157 foreach( helmet
in helmets )
161 foreach( body
in bodies )
167 heads = GetHeroHeadModelIndices( game_mode );
168 foreach( head
in heads )
181 assert( isdefined( data_struct ) );
183 data_lcn =
VAL( data_struct.splitScreenClient, localClientNum );
185 if( !isdefined( characterIndex ) )
187 characterIndex = GetEquippedHeroIndex( data_lcn, params.sessionMode );
190 defaultIndex = undefined;
192 if (
IS_TRUE( params.isDefaultHero ) )
199 characterMode = params.sessionMode;
203 body =
get_character_body( data_lcn, characterMode, characterIndex, params.extracam_data );
205 set_body( data_struct, characterMode, characterIndex, body, bodyColors );
208 set_head( data_struct, characterMode, head );
212 set_helmet( data_struct, characterMode, characterIndex, helmet, helmetColors );
215 if (
IS_TRUE( data_struct.allow_showcase_weapons ) )
218 set_showcase_weapon( data_struct, characterMode, data_lcn, undefined, characterIndex, showcaseWeapon.weaponName, showcaseWeapon.attachmentInfo, showcaseWeapon.weaponRenderOptions,
false,
true );
221 return update( localClientNum, data_struct, params );
224 #using_animtree("generic");
225 #define ANIM_NOTIFY "_anim_notify_"
229 assert( isdefined( data_struct.attached_models ) );
230 assert( isdefined( data_struct.attached_model_anims ) );
231 assert( isdefined( level.model_type_bones ) );
233 if ( force_update || attached_model !== data_struct.attached_models[slot] || model_anim !== data_struct.attached_model_anims[slot] )
236 if ( isdefined( level.model_type_bones[slot] ) )
238 bone = level.model_type_bones[slot];
241 assert( isdefined( bone ) );
243 if ( isdefined( data_struct.attached_models[slot] ) )
245 if ( isDefined(data_struct.attached_entities[slot]) )
247 data_struct.attached_entities[slot] Unlink();
248 data_struct.attached_entities[slot] Delete();
249 data_struct.attached_entities[slot] = undefined;
253 if( data_struct.characterModel IsAttached( data_struct.attached_models[slot], bone ) )
255 data_struct.characterModel Detach( data_struct.attached_models[slot], bone );
259 data_struct.attached_models[slot] = undefined;
262 data_struct.attached_models[slot] = attached_model;
263 if ( isdefined( data_struct.attached_models[slot] ) )
265 if ( isDefined(model_anim) )
267 ent =
Spawn( localClientNum, data_struct.characterModel.origin,
"script_model" );
268 ent SetHighDetail(
true, data_struct.alt_render_mode );
269 data_struct.attached_entities[slot] = ent;
270 ent SetModel( data_struct.attached_models[slot] );
271 if ( !ent HasAnimTree() )
273 ent UseAnimTree( #animtree );
276 ent.origin = data_struct.characterModel.origin;
277 ent.angles = data_struct.characterModel.angles;
278 ent.chosenOrigin = ent.origin;
279 ent.chosenAngles = ent.angles;
284 if ( !data_struct.characterModel IsAttached( data_struct.attached_models[slot], bone ) )
286 data_struct.characterModel Attach( data_struct.attached_models[slot], bone );
290 data_struct.attached_model_anims[slot] = model_anim;
295 if ( isDefined( data_struct.attached_entities[slot] ) )
296 data_struct.attached_entities[slot] SetBodyRenderOptions( data_struct.mode_render_options, data_struct.body_render_options, data_struct.helmet_render_options, data_struct.head_render_options );
301 data_struct.characterIndex = characterIndex;
306 assert( isdefined( characterMode ) );
307 data_struct.characterMode = characterMode;
308 data_struct.mode_render_options = GetCharacterModeRenderOptions( characterMode );
311 function set_body( data_struct, mode, characterIndex, bodyIndex, bodyColors )
313 assert( isdefined( mode ) );
321 data_struct.bodyIndex = bodyIndex;
322 data_struct.bodyModel = GetCharacterBodyModel( characterIndex, bodyIndex, mode );
324 if( isdefined( data_struct.bodyModel ) )
326 data_struct.characterModel SetModel( data_struct.bodyModel );
329 if( isdefined( bodyColors ) )
334 render_options = GetCharacterBodyRenderOptions( data_struct.characterIndex, data_struct.bodyIndex, data_struct.bodyColors[0], data_struct.bodyColors[1], data_struct.bodyColors[2] );
335 data_struct.body_render_options = render_options;
340 for( i = 0; i < bodyColors.size && i < bodyColors.size; i++ )
348 data_struct.bodyColors[ colorSlot ] = colorIndex;
350 render_options = GetCharacterBodyRenderOptions( data_struct.characterIndex, data_struct.bodyIndex, data_struct.bodyColors[0], data_struct.bodyColors[1], data_struct.bodyColors[2] );
351 data_struct.body_render_options = render_options;
356 data_struct.headIndex = headIndex;
357 data_struct.headModel = GetCharacterHeadModel( headIndex, mode );
359 render_options = GetCharacterHeadRenderOptions( headIndex );
360 data_struct.head_render_options = render_options;
363 function set_helmet( data_struct, mode, characterIndex, helmetIndex, helmetColors )
365 data_struct.helmetIndex = helmetIndex;
366 data_struct.helmetModel = GetCharacterHelmetModel( characterIndex, helmetIndex, mode );
371 function set_showcase_weapon( data_struct, mode, localClientNum, xuid, characterIndex, showcaseWeaponName, showcaseWeaponAttachmentInfo, weaponRenderOptions, useShowcasePaintjob, useLocalPaintshop )
373 if ( isdefined( xuid ) )
375 SetShowcaseWeaponPaintshopXUID( localClientNum, xuid );
379 SetShowcaseWeaponPaintshopXUID( localClientNum );
382 data_struct.showcaseWeaponName = showcaseWeaponName;
383 data_struct.showcaseWeaponModel = GetWeaponWithAttachments( showcaseWeaponName );
385 if ( data_struct.showcaseWeaponModel == GetWeapon(
"none" ) )
388 data_struct.showcaseWeaponModel = GetWeapon(
"ar_standard" );
389 data_struct.showcaseWeaponName = data_struct.showcaseWeaponModel.name;
392 attachmentNames = [];
393 attachmentIndices = [];
394 tokenizedAttachmentInfo = strtok( showcaseWeaponAttachmentInfo,
"," );
395 for ( index = 0; index + 1 < tokenizedAttachmentInfo.size; index += 2 )
397 attachmentNames[ attachmentNames.size ] = tokenizedAttachmentInfo[ index ];
398 attachmentIndices[ attachmentIndices.size ] = int( tokenizedAttachmentInfo[ index + 1 ] );
400 for ( index = tokenizedAttachmentInfo.size; index + 1 < 16; index += 2 )
402 attachmentNames[ attachmentNames.size ] =
"none";
403 attachmentIndices[ attachmentIndices.size ] = 0;
405 data_struct.acvi = GetAttachmentCosmeticVariantIndexes( data_struct.showcaseWeaponModel,
406 attachmentNames[ 0 ], attachmentIndices[ 0 ],
407 attachmentNames[ 1 ], attachmentIndices[ 1 ],
408 attachmentNames[ 2 ], attachmentIndices[ 2 ],
409 attachmentNames[ 3 ], attachmentIndices[ 3 ],
410 attachmentNames[ 4 ], attachmentIndices[ 4 ],
411 attachmentNames[ 5 ], attachmentIndices[ 5 ],
412 attachmentNames[ 6 ], attachmentIndices[ 6 ],
413 attachmentNames[ 7 ], attachmentIndices[ 7 ] );
418 showPaintshop =
false;
419 tokenizedWeaponRenderOptions = strtok( weaponRenderOptions,
"," );
420 if ( tokenizedWeaponRenderOptions.size > 2 )
422 camoIndex = int( tokenizedWeaponRenderOptions[ 0 ] );
423 paintjobSlot = int( tokenizedWeaponRenderOptions[ 1 ] );
424 paintjobIndex = int( tokenizedWeaponRenderOptions[ 2 ] );
428 paintshopClassType = 0;
429 if ( useShowcasePaintjob )
433 else if ( useLocalPaintshop )
437 data_struct.weaponRenderOptions = CalcWeaponOptions( localClientNum, camoIndex, 0, 0,
false,
false, showPaintshop, paintshopClassType );
439 weapon_root_name = data_struct.showcaseWeaponModel.rootWeapon.name;
440 weapon_is_dual_wield = data_struct.showcaseWeaponModel.isdualwield;
441 weapon_group = GetItemGroupForWeaponName( weapon_root_name );
443 if ( weapon_group ==
"weapon_launcher" )
445 if ( weapon_root_name ==
"launcher_lockonly" ||
446 weapon_root_name ==
"launcher_multi" )
448 weapon_group =
"weapon_launcher_alt";
450 else if ( weapon_root_name ==
"launcher_ex41" )
452 weapon_group =
"weapon_smg_ppsh";
455 else if ( weapon_group ==
"weapon_pistol" && weapon_is_dual_wield )
457 weapon_group =
"weapon_pistol_dw";
459 else if ( weapon_group ==
"weapon_smg")
461 if ( weapon_root_name ==
"smg_ppsh" )
463 weapon_group =
"weapon_smg_ppsh";
466 else if ( weapon_group ==
"weapon_cqb")
468 if ( weapon_root_name ==
"shotgun_olympia" )
470 weapon_group =
"weapon_shotgun_olympia";
473 else if ( weapon_group ==
"weapon_special" )
475 if ( weapon_root_name ==
"special_crossbow" ||
476 weapon_root_name ==
"special_discgun" )
478 weapon_group =
"weapon_smg";
480 else if( weapon_root_name ==
"special_crossbow_dw" )
482 weapon_group =
"weapon_pistol_dw";
484 else if( weapon_root_name ==
"knife_ballistic" )
486 weapon_group =
"weapon_knife_ballistic";
489 else if ( weapon_group ==
"weapon_knife" )
491 if ( weapon_root_name ==
"melee_knuckles" ||
492 weapon_root_name ==
"melee_boxing" )
494 weapon_group =
"weapon_knuckles";
496 else if ( weapon_root_name ==
"melee_chainsaw" ||
497 weapon_root_name ==
"melee_boneglass" ||
498 weapon_root_name ==
"melee_crescent" )
500 weapon_group =
"weapon_chainsaw";
502 else if ( weapon_root_name ==
"melee_improvise" ||
503 weapon_root_name ==
"melee_shovel" )
505 weapon_group =
"weapon_improvise";
507 else if ( weapon_root_name ==
"melee_wrench" ||
508 weapon_root_name ==
"melee_crowbar" ||
509 weapon_root_name ==
"melee_shockbaton" )
511 weapon_group =
"weapon_wrench";
513 else if ( weapon_root_name ==
"melee_nunchuks" )
515 weapon_group =
"weapon_nunchucks";
517 else if ( weapon_root_name ==
"melee_sword" ||
518 weapon_root_name ==
"melee_bat" ||
519 weapon_root_name ==
"melee_fireaxe" ||
520 weapon_root_name ==
"melee_mace" ||
521 weapon_root_name ==
"melee_katana" )
523 weapon_group =
"weapon_sword";
525 else if ( weapon_root_name ==
"melee_prosthetic" )
527 weapon_group =
"weapon_prosthetic";
530 else if ( weapon_group ==
"miscweapon" )
532 if ( weapon_root_name ==
"blackjack_coin" )
534 weapon_group =
"brawler";
536 else if ( weapon_root_name ==
"blackjack_cards" )
538 weapon_group =
"brawler";
555 for ( i = 0; i < colors.size && i < data_struct.helmetColors.size; i++ )
560 render_options = GetCharacterHelmetRenderOptions( data_struct.characterIndex, data_struct.helmetIndex, data_struct.helmetColors[0], data_struct.helmetColors[1], data_struct.helmetColors[2] );
561 data_struct.helmet_render_options = render_options;
566 data_struct.helmetColors[ colorSlot ] = colorIndex;
568 render_options = GetCharacterHelmetRenderOptions( data_struct.characterIndex, data_struct.helmetIndex, data_struct.helmetColors[0], data_struct.helmetColors[1], data_struct.helmetColors[2] );
569 data_struct.helmet_render_options = render_options;
572 function update( localClientNum, data_struct, params )
574 data_struct.characterModel SetBodyRenderOptions( data_struct.mode_render_options, data_struct.body_render_options, data_struct.helmet_render_options, data_struct.head_render_options );
576 helmet_model =
"tag_origin";
578 show_helmet = data_struct.show_helmets && ( !isdefined( params ) || !
IS_TRUE( params.hide_helmet ) );
581 helmet_model = data_struct.helmetModel;
586 head_model = data_struct.headModel;
587 if ( show_helmet && isdefined( params ) && GetCharacterHelmetHidesHead( data_struct.characterIndex, data_struct.helmetIndex,
VAL( params.sessionMode, data_struct.characterMode ) ) )
589 assert( helmet_model !=
"tag_origin" );
590 head_model =
"tag_origin";
597 data_struct.characterModel.bodyModel = data_struct.bodyModel;
598 data_struct.characterModel.helmetModel = data_struct.helmetModel;
599 data_struct.characterModel.modeRenderOptions = data_struct.mode_render_options;
600 data_struct.characterModel.bodyRenderOptions = data_struct.body_render_options;
601 data_struct.characterModel.helmetRenderOptions = data_struct.helmet_render_options;
602 data_struct.characterModel.headRenderOptions = data_struct.head_render_options;
609 if( isDefined( data_struct.characterModel ) )
611 if( !( data_struct.characterModel isStreamed() ) )
617 foreach( ent
in data_struct.attached_entities )
619 if( isDefined( ent ) )
621 if( !( ent isStreamed() ) )
634 if( isDefined( data_struct.characterModel ) )
636 data_struct.characterModel SetHighDetail(
true, data_struct.alt_render_mode );
639 foreach( ent
in data_struct.attached_entities )
641 if( isDefined( ent ) )
643 ent SetHighDetail(
true, data_struct.alt_render_mode );
650 return GetEquippedHeroMode( localClientNum );
655 assert( isdefined( characterIndex ) );
657 if ( characterMode ===
SESSIONMODE_CAMPAIGN && SessionModeIsCampaignGame() && GetDvarString(
"mapname" ) ==
"core_frontend" )
659 mapIndex = GetDStat( localClientNum,
"highestMapReached" );
660 if ( isDefined( mapindex ) && mapIndex < 1)
663 n_body_id = GetCharacterBodyStyleIndex( str_gender==
"female",
"CPUI_OUTFIT_PROLOGUE" );
668 if( isdefined( extracamData ) &&
IS_TRUE(extracamData.isDefaultHero) )
672 else if( isdefined( extracamData ) && extracamData.useLobbyPlayers )
674 return GetEquippedBodyIndexForHero( localClientNum, characterMode, extracamData.jobIndex,
true );
676 else if ( isdefined( extracamData ) && isdefined( extracamData.useBodyIndex ) )
678 return extracamData.useBodyIndex;
680 else if ( isdefined( extracamData ) &&
IS_TRUE( extracamData.defaultImageRender ) )
686 return GetEquippedBodyIndexForHero( localClientNum, characterMode, characterIndex );
692 if( isdefined( extracamData ) &&
IS_TRUE(extracamData.isDefaultHero) )
696 else if( isdefined( extracamData ) && extracamData.useLobbyPlayers )
698 return GetEquippedBodyAccentColorForHero( localClientNum, characterMode, extracamData.jobIndex, bodyIndex, colorSlot,
true );
700 else if ( isdefined( extracamData ) &&
IS_TRUE( extracamData.defaultImageRender ) )
706 return GetEquippedBodyAccentColorForHero( localClientNum, characterMode, characterIndex, bodyIndex, colorSlot );
712 bodyAccentColorCount = GetBodyAccentColorCountForHero( localClientNum, characterMode, characterIndex, bodyIndex );
715 for( i = 0; i < 3; i++ )
720 for( i = 0; i < bodyAccentColorCount; i++ )
730 if( isdefined( extracamData ) &&
IS_TRUE(extracamData.isDefaultHero) )
734 else if ( isdefined( extracamData ) && extracamData.useLobbyPlayers )
736 return GetEquippedHeadIndexForHero( localClientNum, characterMode, extracamData.jobIndex );
738 else if ( isdefined( extracamData ) && isdefined( extracamData.useHeadIndex ) )
740 return extracamData.useHeadIndex;
742 else if ( isdefined( extracamData ) &&
IS_TRUE( extracamData.defaultImageRender ) )
748 return GetEquippedHeadIndexForHero( localClientNum, characterMode );
754 if( isdefined( extracamData ) &&
IS_TRUE(extracamData.isDefaultHero) )
758 else if ( isdefined( extracamData ) && extracamData.useLobbyPlayers )
760 return GetEquippedHelmetIndexForHero( localClientNum, characterMode, extracamData.jobIndex,
true );
762 else if ( isdefined( extracamData ) && isdefined( extracamData.useHelmetIndex ) )
764 return extracamData.useHelmetIndex;
766 else if ( isdefined( extracamData ) &&
IS_TRUE( extracamData.defaultImageRender ) )
772 return GetEquippedHelmetIndexForHero( localClientNum, characterMode, characterIndex );
778 if( isdefined( extracamData ) &&
IS_TRUE(extracamData.isDefaultHero) )
782 else if ( isdefined( extracamData ) && extracamData.useLobbyPlayers )
784 return GetEquippedShowcaseWeaponForHero( localClientNum, characterMode, extracamData.jobIndex,
true );
786 else if ( isdefined( extracamData ) && isdefined( extracamData.useShowcaseWeapon ) )
788 return extracamData.useShowcaseWeapon;
792 return GetEquippedShowcaseWeaponForHero( localClientNum, characterMode, characterIndex );
798 if( isdefined( extracamData ) &&
IS_TRUE(extracamData.isDefaultHero) )
802 else if ( isdefined( extracamData ) && extracamData.useLobbyPlayers )
804 return GetEquippedHelmetAccentColorForHero( localClientNum, characterMode, extracamData.jobIndex, helmetIndex, colorSlot,
true );
806 else if ( isdefined( extracamData ) &&
IS_TRUE( extracamData.defaultImageRender ) )
812 return GetEquippedHelmetAccentColorForHero( localClientNum, characterMode, characterIndex, helmetIndex, colorSlot );
818 helmetColorCount = GetHelmetAccentColorCountForHero( localClientNum, characterMode, characterIndex, helmetIndex );
821 for( i = 0; i < 3; i++ )
826 for( i = 0; i < helmetColorCount; i++ )
834 #using_animtree("all_player");
837 if ( !characterModel HasAnimTree() )
839 characterModel UseAnimTree( #animtree );
845 if ( IsDefined(params.weapon_right) && params.weapon_right ==
"wpn_t7_hero_reaper_minigun_prop" && isDefined( level.mp_lobby_data_struct.characterModel ) && IsSubStr(level.mp_lobby_data_struct.characterModel.model,
"body3") )
847 params.weapon_right =
"wpn_t7_loot_hero_reaper3_minigun_prop";
848 params.weapon = GetWeapon(
"hero_minigun_body3");
856 fields = GetCharacterFields( data_struct.characterIndex, data_struct.characterMode );
858 if ( data_struct.frozenMomentStyle ==
"weapon" )
860 SET_IF_DEFINED( params.anim_name, fields.weaponFrontendFrozenMomentXAnim );
861 params.scene = undefined;
862 SET_IF_DEFINED( params.weapon_left, fields.weaponFrontendFrozenMomentWeaponLeftModel );
863 SET_IF_DEFINED( params.weapon_left_anim, fields.weaponFrontendFrozenMomentWeaponLeftAnim );
864 SET_IF_DEFINED( params.weapon_right, fields.weaponFrontendFrozenMomentWeaponRightModel );
865 SET_IF_DEFINED( params.weapon_right_anim, fields.weaponFrontendFrozenMomentWeaponRightAnim );
866 SET_IF_DEFINED( params.exploder_id, fields.weaponFrontendFrozenMomentExploder );
869 SET_IF_DEFINED( params.subXCam, fields.weaponFrontendFrozenMomentXCamSubXCam );
870 SET_IF_DEFINED( params.xcamFrame, fields.weaponFrontendFrozenMomentXCamFrame );
872 else if ( data_struct.frozenMomentStyle ==
"ability" )
874 SET_IF_DEFINED( params.anim_name, fields.abilityFrontendFrozenMomentXAnim );
875 params.scene = undefined;
876 SET_IF_DEFINED( params.weapon_left, fields.abilityFrontendFrozenMomentWeaponLeftModel );
877 SET_IF_DEFINED( params.weapon_left_anim, fields.abilityFrontendFrozenMomentWeaponLeftAnim );
878 SET_IF_DEFINED( params.weapon_right, fields.abilityFrontendFrozenMomentWeaponRightModel );
879 SET_IF_DEFINED( params.weapon_right_anim, fields.abilityFrontendFrozenMomentWeaponRightAnim );
880 SET_IF_DEFINED( params.exploder_id, fields.abilityFrontendFrozenMomentExploder );
882 SET_IF_DEFINED( params.xcam, fields.abilityFrontendFrozenMomentXCam );
883 SET_IF_DEFINED( params.subXCam, fields.abilityFrontendFrozenMomentXCamSubXCam );
884 SET_IF_DEFINED( params.xcamFrame, fields.abilityFrontendFrozenMomentXCamFrame );
889 if ( !isdefined( params.align_struct ) )
891 params.align_struct = data_struct;
897 self notify(
"stop_vignette_animation" );
898 self endon(
"stop_vignette_animation" );
900 if ( isdefined(intro_anim_name) )
902 self animation::play( intro_anim_name,
self.chosenOrigin,
self.chosenAngles, 1, 0, 0, 0, b_keep_link );
904 self animation::play( anim_name,
self.chosenOrigin,
self.chosenAngles, 1, 0, 0, 0, b_keep_link );
909 if ( !isdefined( params.weapon_right ) && !isdefined( params.weapon_left ) )
911 if ( isdefined( data_struct.anim_name ) )
913 params.anim_name = data_struct.anim_name;
922 if ( !isdefined( params ) )
924 params = SpawnStruct();
927 if ( data_struct.useFrozenMomentAnim && isdefined( data_struct.frozenMomentStyle ) )
932 if ( !isdefined( params.exploder_id ) )
934 params.exploder_id = data_struct.default_exploder;
937 align_changed =
false;
939 DEFAULT( params.align_struct, data_struct );
940 if ( isdefined( params.align_struct ) && ( params.align_struct.origin !== data_struct.characterModel.chosenOrigin || params.align_struct.angles !== data_struct.characterModel.chosenAngles ) )
942 data_struct.characterModel.chosenOrigin = params.align_struct.origin;
943 data_struct.characterModel.chosenAngles = params.align_struct.angles;
944 params.anim_name = ( isdefined( params.anim_name ) ? params.anim_name : data_struct.currentAnimation );
945 align_changed =
true;
948 if (
IS_TRUE( data_struct.allow_showcase_weapons ) )
955 align_changed =
true;
959 if ( IsDefined( params.weapon_right ) && params.weapon_right !== data_struct.weapon_right )
961 align_changed =
true;
964 if ( isdefined( params.anim_name ) && ( params.anim_name !== data_struct.currentAnimation || align_changed ) )
971 data_struct.currentAnimation = params.anim_name;
972 data_struct.weapon_right = params.weapon_right;
973 if ( !data_struct.characterModel HasAnimTree() )
975 data_struct.characterModel UseAnimTree( #animtree );
980 else if ( isdefined( params.scene ) && params.scene !== data_struct.currentScene )
982 if ( isdefined( data_struct.currentScene ) )
989 data_struct.currentScene = params.scene;
993 if ( data_struct.exploder_id !== params.exploder_id )
995 if ( isdefined( data_struct.exploder_id ) )
997 KillRadiantExploder( localClientNum, data_struct.exploder_id );
1000 if ( isdefined( params.exploder_id ) )
1002 PlayRadiantExploder( localClientNum, params.exploder_id );
1005 data_struct.exploder_id = params.exploder_id;
1008 if ( isdefined( params.weapon_right ) || isdefined( params.weapon_left ) )
1010 update_model_attachment( localClientNum, data_struct, params.weapon_right,
"tag_weapon_right", params.weapon_right_anim, params.weapon_right_anim_intro, align_changed );
1011 update_model_attachment( localClientNum, data_struct, params.weapon_left,
"tag_weapon_left", params.weapon_left_anim, params.weapon_left_anim_intro, align_changed );
1013 else if ( isdefined( data_struct.showcaseWeaponModel ) )
1015 if( isdefined( data_struct.attached_models[
"tag_weapon_right"] ) && data_struct.characterModel IsAttached( data_struct.attached_models[
"tag_weapon_right"],
"tag_weapon_right" ) )
1017 data_struct.characterModel Detach( data_struct.attached_models[
"tag_weapon_right"],
"tag_weapon_right" );
1020 if( isdefined( data_struct.attached_models[
"tag_weapon_left"] ) && data_struct.characterModel IsAttached( data_struct.attached_models[
"tag_weapon_left"],
"tag_weapon_left" ) )
1022 data_struct.characterModel Detach( data_struct.attached_models[
"tag_weapon_left"],
"tag_weapon_left" );
1025 data_struct.characterModel AttachWeapon( data_struct.showcaseWeaponModel, data_struct.weaponRenderOptions, data_struct.acvi );
1026 data_struct.characterModel UseWeaponHideTags( data_struct.showcaseWeaponModel );
1028 data_struct.characterModel.showcaseWeapon = data_struct.showcaseWeaponModel;
1029 data_struct.characterModel.showcaseWeaponRenderOptions = data_struct.weaponRenderOptions;
1030 data_struct.characterModel.showcaseWeaponACVI = data_struct.acvi;
1038 if ( data_struct.useFrozenMomentAnim != useFrozenMoments )
1040 data_struct.useFrozenMomentAnim = useFrozenMoments;
1041 params = SpawnStruct();
1042 if ( !data_struct.useFrozenMomentAnim )
1048 MarkAsDirty( data_struct.characterModel );
1051 if ( data_struct.useFrozenMomentAnim )
1053 level notify(
"frozenMomentChanged" + localClientNum );
1060 if ( data_struct.show_helmets != show_helmets )
1062 data_struct.show_helmets = show_helmets;
1064 params = SpawnStruct();
1065 params.weapon_right = data_struct.attached_models[
"tag_weapon_right"];
1066 params.weapon_left = data_struct.attached_models[
"tag_weapon_left"];
1067 update( localClientNum, data_struct, params );
1073 if ( data_struct.align_target !== align_target )
1075 data_struct.align_target = align_target;
1077 params = SpawnStruct();
1078 params.weapon_right = data_struct.attached_models[
"tag_weapon_right"];
1079 params.weapon_left = data_struct.attached_models[
"tag_weapon_left"];
1080 update( localClientNum, data_struct, params );
1092 if ( isdefined( characterEnt ) )
1096 customization_data_struct.allow_showcase_weapons =
true;
1099 return customization_data_struct;
1107 if( IsDefined( params.isItemUnlocked ) && params.isItemUnlocked != 1 )
1109 EnableFrontendLockedWeaponOverlay( localClientNum,
true );
1113 EnableFrontendLockedWeaponOverlay( localClientNum,
false );
1121 level waittill(
"updateHero" + localClientNum, eventType, param1, param2, param3, param4 );
1126 data_struct.splitScreenClient = param1;
1130 data_struct.splitScreenClient = param1;
1132 params = spawnstruct();
1134 params.sessionMode = param2;
1136 if (isdefined(param3) && param3 !=
"")
1138 level.mp_lobby_data_struct.playSound = param3;
1146 params = spawnstruct();
1148 params.sessionMode = param2;
1156 params = spawnstruct();
1157 params.sessionMode = param2;
1158 params.isItemUnlocked = param3;
1165 case "changeHelmet":
1169 params = spawnstruct();
1170 params.sessionMode = param2;
1171 params.isItemUnlocked = param3;
1178 case "changeShowcaseWeapon":
1183 params = spawnstruct();
1184 params.sessionMode = param4;
1191 params = spawnstruct();
1192 params.sessionMode = param2;
1197 case "changeBodyAccentColor":
1200 params = spawnstruct();
1201 params.sessionMode = param3;
1206 case "changeHelmetAccentColor":
1210 params = spawnstruct();
1211 params.sessionMode = param3;
1216 case "changeFrozenMoment":
1218 data_struct.frozenMomentStyle = param1;
1219 if ( data_struct.useFrozenMomentAnim )
1221 MarkAsDirty( data_struct.characterModel );
1224 level notify(
"frozenMomentChanged" + localClientNum );
1227 case "previewGesture":
1229 data_struct.currentAnimation = param1;
1233 case "previewTaunt":
1237 data_struct.currentAnimation = param1;
1247 if ( !isdefined( endOnEvent ) )
1252 assert( isdefined( data_struct.characterModel ) );
1253 model = data_struct.characterModel;
1254 baseAngles = model.angles;
1257 level waittill( endOnEvent );
1259 if ( !
IS_TRUE( data_struct.characterModel.anglesOverride ) )
1261 model.angles = baseAngles;
1267 level endon( endOnEvent );
1268 assert( isdefined( data_struct.characterModel ) );
1269 model = data_struct.characterModel;
1273 data_lcn =
VAL( data_struct.splitScreenClient, localClientNum );
1275 if ( LocalClientActive( data_lcn ) && !
IS_TRUE( data_struct.characterModel.anglesOverride ) )
1277 pos = GetControllerPosition( data_lcn );
1279 if ( isdefined( pos[
"rightStick"] ) )
1281 model.angles = ( model.angles[0], AbsAngleClamp360( model.angles[1] + pos[
"rightStick"][0] *
RS_ROTATION_SPEED_MULTIPLIER ), model.angles[2] );
1290 pos = GetXCamMouseControl( data_lcn );
1304 characterEnt = GetEnt( localClientNum,
"character_customization_staging",
"targetname" );
1310 if ( isdefined( characterEnt ) )
1315 return customization_data_struct;
1323 newStruct = SpawnStruct();
1324 newStruct.xcam = xcam;
1325 newStruct.subXCam = subXCam;
1326 newStruct.anim_name = model_animation;
1327 newStruct.useLobbyPlayers = useLobbyPlayers;
1333 level waittill(
"render_complete_" + localClientNum +
"_" + extraCamIndex );
1339 assert( isdefined( extracam_data_struct.jobIndex ) );
1343 initializedExtracam =
false;
1344 camera_ent = (isDefined(level.camera_ents[localClientNum]) ? level.camera_ents[localClientNum][extracam_data_struct.extraCamIndex] : undefined);
1345 if( !isdefined( camera_ent ) )
1347 initializedExtracam =
true;
1349 camera_ent = level.camera_ents[localClientNum][extracam_data_struct.extraCamIndex];
1352 assert( isdefined( camera_ent ) );
1354 camera_ent PlayExtraCamXCam( extracam_data_struct.xcam, 0, extracam_data_struct.subXCam );
1356 params = spawnstruct();
1357 params.anim_name = extracam_data_struct.anim_name;
1358 params.extracam_data = extracam_data_struct;
1359 params.isDefaultHero = extracam_data_struct.isDefaultHero;
1360 params.sessionMode = extracam_data_struct.sessionMode;
1361 params.hide_helmet =
IS_TRUE( extracam_data_struct.hideHelmet );
1363 data_struct.alt_render_mode =
false;
1372 if (
IS_TRUE( extracam_data_struct.defaultImageRender ) )
1381 setExtraCamRenderReady( extracam_data_struct.jobIndex );
1383 extracam_data_struct.jobIndex = undefined;
1385 if( initializedExtracam )
1393 level endon(
"disconnect" );
1397 level waittill(
"process_character_extracam" + localClientNum, extracam_data_struct );
1404 level.extra_cam_hero_data[localClientNum].jobIndex = jobIndex;
1405 level.extra_cam_hero_data[localClientNum].extraCamIndex = extraCamIndex;
1406 level.extra_cam_hero_data[localClientNum].characterIndex = characterIndex;
1407 level.extra_cam_hero_data[localClientNum].sessionMode = sessionMode;
1409 level notify(
"process_character_extracam" + localClientNum, level.extra_cam_hero_data[localClientNum] );
1414 level.extra_cam_lobby_client_hero_data[localClientNum].jobIndex = jobIndex;
1415 level.extra_cam_lobby_client_hero_data[localClientNum].extraCamIndex = extraCamIndex;
1416 level.extra_cam_lobby_client_hero_data[localClientNum].characterIndex = GetEquippedCharacterIndexForLobbyClientHero( localClientNum, jobIndex );
1417 level.extra_cam_lobby_client_hero_data[localClientNum].sessionMode = sessionMode;
1419 level notify(
"process_character_extracam" + localClientNum, level.extra_cam_lobby_client_hero_data[localClientNum] );
1424 level.extra_cam_headshot_hero_data[localClientNum].jobIndex = jobIndex;
1425 level.extra_cam_headshot_hero_data[localClientNum].extraCamIndex = extraCamIndex;
1426 level.extra_cam_headshot_hero_data[localClientNum].characterIndex = characterIndex;
1427 level.extra_cam_headshot_hero_data[localClientNum].isDefaultHero = isDefaultHero;
1428 level.extra_cam_headshot_hero_data[localClientNum].sessionMode = sessionMode;
1430 level notify(
"process_character_extracam" + localClientNum, level.extra_cam_headshot_hero_data[localClientNum] );
1435 level.extra_cam_outfit_preview_data[localClientNum].jobIndex = jobIndex;
1436 level.extra_cam_outfit_preview_data[localClientNum].extraCamIndex = extraCamIndex;
1437 level.extra_cam_outfit_preview_data[localClientNum].characterIndex = outfitIndex;
1438 level.extra_cam_outfit_preview_data[localClientNum].sessionMode = sessionMode;
1440 level notify(
"process_character_extracam" + localClientNum, level.extra_cam_outfit_preview_data[localClientNum] );
1445 extracam_data = undefined;
1446 if ( defaultImageRender )
1449 extracam_data.useHeadIndex = GetFirstHeadOfGender( GetHeroGender( characterIndex, sessionMode ), sessionMode );
1455 extracam_data.jobIndex = jobIndex;
1456 extracam_data.extraCamIndex = extraCamIndex;
1457 extracam_data.sessionMode = sessionMode;
1458 extracam_data.characterIndex = characterIndex;
1459 extracam_data.useBodyIndex = itemIndex;
1460 extracam_data.defaultImageRender = defaultImageRender;
1462 level notify(
"process_character_extracam" + localClientNum, extracam_data );
1467 extracam_data = undefined;
1468 if ( defaultImageRender )
1471 #if XFILE_VERSION >= 553
1472 extracam_data.useHeadIndex = GetFirstHeadOfGender( GetHeroGender( characterIndex, sessionMode ), sessionMode );
1473 #endif // #if XFILE_VERSION >= 553
1479 extracam_data.jobIndex = jobIndex;
1480 extracam_data.extraCamIndex = extraCamIndex;
1481 extracam_data.sessionMode = sessionMode;
1482 extracam_data.characterIndex = characterIndex;
1483 extracam_data.useHelmetIndex = itemIndex;
1484 extracam_data.defaultImageRender = defaultImageRender;
1486 level notify(
"process_character_extracam" + localClientNum, extracam_data );
1491 extracam_data = undefined;
1492 if ( defaultImageRender )
1495 #if XFILE_VERSION >= 553
1496 extracam_data.characterIndex = GetFirstHeroOfGender( GetHeadGender( headIndex, sessionMode ), sessionMode );
1497 #endif // #if XFILE_VERSION >= 553
1503 extracam_data.jobIndex = jobIndex;
1504 extracam_data.extraCamIndex = extraCamIndex;
1505 extracam_data.sessionMode = sessionMode;
1506 extracam_data.useHeadIndex = headIndex;
1507 extracam_data.hideHelmet =
true;
1508 extracam_data.defaultImageRender = defaultImageRender;
1510 level notify(
"process_character_extracam" + localClientNum, extracam_data );