2 #using scripts\shared\array_shared;
3 #using scripts\shared\callbacks_shared;
4 #using scripts\shared\clientfield_shared;
5 #using scripts\shared\duplicaterender_mgr;
6 #using scripts\shared\exploder_shared;
7 #using scripts\shared\filter_shared;
8 #using scripts\shared\util_shared;
9 #using scripts\shared\postfx_shared;
11 #using scripts\core\_multi_extracam;
12 #using scripts\codescripts\struct;
15 #using scripts\shared\ai\zombie;
16 #using scripts\shared\ai\systems\destructible_character;
17 #using scripts\shared\ai\archetype_damage_effects;
19 #using scripts\shared\_character_customization;
20 #using scripts\shared\lui_shared;
21 #insert scripts\shared\shared.gsh;
22 #insert scripts\shared\version.gsh;
23 #insert scripts\shared\duplicaterender.gsh;
24 #insert scripts\shared\statstable_shared.gsh;
26 #define PAINTSHOP_WEAPON_KICK_EXPLODER_NAME "weapon_kick"
27 #define PAINTSHOP_LIGHT_EXPLODER_NAME "lights_paintshop"
28 #define PAINTSHOP_LIGHT_ZOOM_EXPLODER_NAME "lights_paintshop_zoom"
29 #define CAC_LOCKED_WEAPON "mc/sonar_frontend_locked_gun"
31 #namespace customclass;
40 level.weapon_script_model = [];
41 level.preload_weapon_model = [];
42 level.last_weapon_name = [];
43 level.current_weapon = [];
44 level.attachment_names = [];
45 level.attachment_indices = [];
46 level.paintshopHiddenPosition = [];
47 level.camo_index = [];
48 level.reticle_index = [];
49 level.show_player_tag = [];
50 level.show_emblem = [];
51 level.preload_weapon_complete = [];
52 level.preload_weapon_complete = [];
53 level.weapon_clientscript_cac_model = [];
55 level.weaponNone = GetWeapon(
"none" );
56 level.weapon_position =
struct::get(
"paintshop_weapon_position");
62 level.last_weapon_name[ localClientNum ] =
"";
63 level.current_weapon[ localClientNum ] = undefined;
71 level endon(
"disconnect" );
80 level
util::waittill_any(
"CustomClass_update" + localClientNum,
"CustomClass_focus" + localClientNum,
"CustomClass_remove" + localClientNum,
"CustomClass_closed" + localClientNum);
86 level endon(
"disconnect" );
89 self.lastSubxcam = [];
90 self.lastNotetrack = [];
99 level waittill(
"cam_customization_closed" + localClientNum);
105 level endon(
"disconnect" );
106 level endon(
"CustomClass_focus" + localClientNum );
107 level endon(
"CustomClass_remove" + localClientNum);
108 level endon(
"CustomClass_closed" + localClientNum);
110 level waittill(
"CustomClass_update" + localClientNum, param1, param2, param3, param4, param5, param6, param7 );
112 base_weapon_slot = param1;
113 weapon_full_name = param2;
115 weapon_options_param = param4;
117 is_item_unlocked = param6;
118 is_item_tokenlocked = param7;
120 DEFAULT( is_item_tokenlocked,
false );
122 if( IsDefined( weapon_full_name ) )
124 if( IsDefined( acv_param ) && acv_param !=
"none" )
129 if( IsDefined( weapon_options_param ) && weapon_options_param !=
"none" )
136 position = level.weapon_position;
138 if( !IsDefined( level.weapon_script_model[ localClientNum ] ) )
140 level.weapon_script_model[ localClientNum ] =
spawn_weapon_model( localClientNum, position.origin, position.angles );
141 level.preload_weapon_model[ localClientNum ] =
spawn_weapon_model( localClientNum, position.origin, position.angles );
142 level.preload_weapon_model[ localClientNum ] Hide();
150 level notify(
"xcamMoved" );
156 else if( IsDefined(param1) && param1 ==
"purchased" )
164 if( !IsDefined( level.weapon_script_model[ localClientNum ] ) )
169 if( is_item_unlocked != 1 )
171 EnableFrontendLockedWeaponOverlay( localClientNum,
true );
175 EnableFrontendLockedWeaponOverlay( localClientNum,
false );
181 if( !IsDefined( level.weapon_script_model[ localClientNum ] ) )
186 if( is_item_tokenlocked )
188 EnableFrontendTokenLockedWeaponOverlay( localClientNum,
true );
192 EnableFrontendTokenLockedWeaponOverlay( localClientNum,
false );
198 csv_filename =
"gamedata/weapons/common/attachmentTable.csv";
205 return ( group ==
"optic" );
213 level endon(
"disconnect" );
214 level endon(
"CustomClass_update" + localClientNum );
215 level endon(
"CustomClass_remove" + localClientNum );
216 level endon(
"CustomClass_closed" + localClientNum );
218 level waittill(
"CustomClass_focus" + localClientNum, param1, param2, param3, param4, param5, param6 );
219 level endon(
"CustomClass_focus" + localClientNum );
221 base_weapon_slot = param1;
222 weapon_full_name = param2;
224 weapon_options_param = param4;
226 doNotMoveCamera = param6;
228 update_weapon_options =
false;
231 if( IsDefined( acv_param ) && acv_param !=
"none" )
251 if( weapon_full_name == weaponAttachmentIntersection )
253 weapon_full_name = undefined;
258 if( IsDefined( weapon_full_name ) )
271 level thread
transition_camera( localClientNum, base_weapon_slot,
"cam_cac_attachments",
"cam_cac", initialDelay, lerpDuration, attachment, weapon_full_name );
274 if( IsDefined( weapon_options_param ) && weapon_options_param !=
"none" )
282 level endon(
"disconnect" );
283 level endon(
"CustomClass_update" + localClientNum );
284 level endon(
"CustomClass_focus" + localClientNum );
285 level endon(
"CustomClass_closed" + localClientNum );
287 level waittill(
"CustomClass_remove" + localClientNum, param1, param2, param3, param4, param5, param6 );
290 EnableFrontendLockedWeaponOverlay( localClientNum,
false );
291 EnableFrontendTokenLockedWeaponOverlay( localClientNum,
false );
294 position = level.weapon_position;
296 xcamName =
"ui_cam_cac_ar_standard";
297 PlayMainCamXCam( localClientNum, xcamName, 0,
"cam_cac", camera, position.origin, position.angles );
300 if( IsDefined( level.weapon_script_model[ localClientNum ] ) )
302 level.weapon_script_model[ localClientNum ] forcedelete();
304 level.last_weapon_name[ localClientNum ] =
"";
309 level endon(
"disconnect" );
310 level endon(
"CustomClass_update" + localClientNum );
311 level endon(
"CustomClass_focus" + localClientNum );
312 level endon(
"CustomClass_remove" + localClientNum );
314 level waittill(
"CustomClass_closed" + localClientNum, param1, param2, param3, param4, param5, param6 );
316 if( IsDefined( level.weapon_script_model[ localClientNum ] ) )
318 level.weapon_script_model[ localClientNum ] forcedelete();
322 EnableFrontendLockedWeaponOverlay( localClientNum,
false );
323 EnableFrontendTokenLockedWeaponOverlay( localClientNum,
false );
325 level.last_weapon_name[ localClientNum ] =
"";
330 weapon_model =
Spawn( localClientNum, origin,
"script_model" );
331 weapon_model SetHighDetail(
true,
true );
333 if( IsDefined( angles ) )
335 weapon_model.angles = angles;
343 acv_indexes = strtok( acv_param,
"," );
345 level.attachment_names[ localClientNum ] = [];
346 level.attachment_indices[ localClientNum ] = [];
348 for( i = 0; i + 1 < acv_indexes.size; i += 2 )
350 level.attachment_names[ localClientNum ][ level.attachment_names[ localClientNum ].size ] = acv_indexes[i];
351 level.attachment_indices[ localClientNum ][ level.attachment_indices[ localClientNum ].size ] = int( acv_indexes[i+1] );
357 paintshop_bg = GetEnt( localClientNum,
"paintshop_black",
"targetname" );
358 if( IsDefined( paintshop_bg ) )
360 if( !IsDefined( level.paintshopHiddenPosition[ localClientNum ] ) )
362 level.paintshopHiddenPosition[ localClientNum ] = paintshop_bg.origin;
365 paintshop_bg moveto( level.paintshopHiddenPosition[ localClientNum ], 0.01 );
371 paintshop_bg = GetEnt( localClientNum,
"paintshop_black",
"targetname" );
372 if( IsDefined( paintshop_bg ) )
375 paintshop_bg moveto( level.paintshopHiddenPosition[ localClientNum ] + (0,0,227), 0.01 );
381 if( !IsDefined( level.camo_index[ localClientNum ] ) )
383 level.camo_index[ localClientNum ] = 0;
386 return level.camo_index[ localClientNum ];
391 if( !IsDefined( level.reticle_index[ localClientNum ] ) )
393 level.reticle_index[ localClientNum ] = 0;
396 return level.reticle_index[ localClientNum ];
401 if( !IsDefined( level.show_player_tag[ localClientNum ] ) )
403 level.show_player_tag[ localClientNum ] =
false;
406 return level.show_player_tag[ localClientNum ];
411 if( !IsDefined( level.show_emblem[ localClientNum ] ) )
413 level.show_emblem[ localClientNum ] =
false;
416 return level.show_emblem[ localClientNum ];
421 if( !IsDefined( level.show_paintshop[ localClientNum ] ) )
423 level.show_paintshop[ localClientNum ] =
false;
426 return level.show_paintshop[ localClientNum ];
431 weapon_options = strtok( weapon_options_param,
"," );
433 level.camo_index[ localClientNum ] = int( weapon_options[0] );
434 level.show_player_tag[ localClientNum ] =
false;
435 level.show_emblem[ localClientNum ] =
false;
436 level.reticle_index[ localClientNum ] = int( weapon_options[1] );
437 level.show_paintshop[ localClientNum ] = int( weapon_options[2] );
439 if( IsDefined( weapon_options ) && IsDefined( level.weapon_script_model[ localClientNum ] ) )
448 if( IsDefined( camera ) )
450 paintshopCameraCloseUp = ( camera ==
"left" || camera ==
"right" || camera ==
"top" || camera ==
"paintshop_preview_left" || camera ==
"paintshop_preview_right" || camera ==
"paintshop_preview_top");
451 if( paintshopCameraCloseUp )
462 if( IsDefined( camera ) )
464 paintshopCameraCloseUp = ( camera ==
"left" || camera ==
"right" || camera ==
"top" || camera ==
"paintshop_preview_left" || camera ==
"paintshop_preview_right" || camera ==
"paintshop_preview_top" );
466 if( paintshopCameraCloseUp )
485 xcam = GetWeaponXCam( level.current_weapon[ localClientNum ], camera );
487 if( !IsDefined( xcam ) )
489 if( StrStartsWith( weaponType,
"specialty" ) )
491 xcam =
"ui_cam_cac_perk";
493 else if( StrStartsWith( weaponType,
"bonuscard" ) )
495 xcam =
"ui_cam_cac_wildcard";
497 else if( StrStartsWith( weaponType,
"cybercore" ) || StrStartsWith( weaponType,
"cybercom" ) )
499 xcam =
"ui_cam_cac_perk";
501 else if ( StrStartsWith( weaponType,
"bubblegum" ) )
503 xcam =
"ui_cam_cac_bgb";
507 xcam = GetWeaponXCam( GetWeapon(
"ar_standard" ), camera );
511 self.lastXcam[weaponType] = xcam;
512 self.lastSubxcam[weaponType] = subxcam;
513 self.lastNotetrack[weaponType] = notetrack;
515 position = level.weapon_position;
516 model = level.weapon_script_model[ localClientNum ];
518 PlayMainCamXCam( localClientNum, xcam, lerpDuration, subxcam, notetrack, position.origin, position.angles, model, position.origin, position.angles );
519 if( notetrack ==
"top" || notetrack ==
"right" || notetrack ==
"left" )
521 SetAllowXCamRightStickRotation( localClientNum,
false );
527 if( level.preload_weapon_complete[ localClientNum ] )
532 level waittill(
"preload_weapon_complete_" + localClientNum );
537 level endon(
"preload_weapon_changing_" + localClientNum );
538 level endon(
"preload_weapon_complete_" + localClientNum );
542 if( level.preload_weapon_model[ localClientNum ] isStreamed() )
544 level.preload_weapon_complete[ localClientNum ] =
true;
545 level notify(
"preload_weapon_complete_" + localClientNum );
555 level notify(
"preload_weapon_changing_" + localClientNum );
557 level.preload_weapon_complete[ localClientNum ] =
false;
558 current_weapon = GetWeaponWithAttachments( newWeaponString );
559 if ( current_weapon == level.weaponNone )
561 level.preload_weapon_complete[ localClientNum ] =
true;
562 level notify(
"preload_weapon_complete_" + localClientNum );
566 if( isDefined(current_weapon.frontendmodel) )
568 level.preload_weapon_model[ localClientNum ] UseWeaponModel( current_weapon, current_weapon.frontendmodel );
572 level.preload_weapon_model[ localClientNum ] UseWeaponModel( current_weapon );
575 if( IsDefined( level.preload_weapon_model[ localClientNum ] ) )
577 if( IsDefined( level.attachment_names[ localClientNum ] ) && IsDefined( level.attachment_indices[ localClientNum ] ) )
579 for( i = 0; i < level.attachment_names[ localClientNum ].size; i++ )
581 level.preload_weapon_model[ localClientNum ] SetAttachmentCosmeticVariantIndex( newWeaponString, level.attachment_names[ localClientNum ][i], level.attachment_indices[ localClientNum ][i] );
585 if( should_update_weapon_options )
595 function update_weapon_script_model( localClientNum, newWeaponString, should_update_weapon_options =
true, is_item_unlocked =
true, is_item_tokenlocked =
false )
597 level.last_weapon_name[ localClientNum ] = newWeaponString;
598 level.current_weapon[ localClientNum ] = GetWeaponWithAttachments( level.last_weapon_name[ localClientNum ] );
599 if ( level.current_weapon[ localClientNum ] == level.weaponNone )
602 level.weapon_script_model[ localClientNum ]
delete();
603 position = level.weapon_position;
604 level.weapon_script_model[ localClientNum ] =
spawn_weapon_model( localClientNum, position.origin, position.angles );
608 level.weapon_script_model[ localClientNum ] SetModel( level.last_weapon_name[ localClientNum ] );
609 level.weapon_script_model[ localClientNum ] SetDedicatedShadow(
true );
614 if( isDefined(level.current_weapon[ localClientNum ].frontendmodel) )
616 level.weapon_script_model[ localClientNum ] UseWeaponModel( level.current_weapon[ localClientNum ], level.current_weapon[ localClientNum ].frontendmodel );
620 level.weapon_script_model[ localClientNum ] UseWeaponModel( level.current_weapon[ localClientNum ] );
623 if( IsDefined( level.weapon_script_model[ localClientNum ] ) )
625 if( IsDefined( level.attachment_names[ localClientNum ] ) && IsDefined( level.attachment_indices[ localClientNum ] ) )
627 for( i = 0; i < level.attachment_names[ localClientNum ].size; i++ )
629 level.weapon_script_model[ localClientNum ] SetAttachmentCosmeticVariantIndex( newWeaponString, level.attachment_names[ localClientNum ][i], level.attachment_indices[ localClientNum ][i] );
633 if( should_update_weapon_options )
639 level.weapon_script_model[ localClientNum ] SetDedicatedShadow(
true );
642 function transition_camera( localClientNum, weaponType, camera, subxcam, initialDelay, lerpDuration, notetrack, newWeaponString, should_update_weapon_options =
false )
644 self endon(
"entityshutdown" );
645 self notify(
"xcamMoved" );
646 self endon(
"xcamMoved" );
647 level endon(
"cam_customization_closed" );
649 if( IsDefined( newWeaponString ) )
658 if( IsDefined( newWeaponString ) )
660 wait lerpDuration / 1000;
670 if( !isDefined(oldWeapon) )
675 oldWeaponParams = strtok(oldWeapon,
"+");
676 newWeaponParams = strtok(newWeapon,
"+");
678 if( oldWeaponParams[0] != newWeaponParams[0] )
683 newWeaponString = newWeaponParams[0];
685 for ( i = 1; i < newWeaponParams.size; i++ )
687 if( isinarray( oldWeaponParams, newWeaponParams[i] ) )
689 newWeaponString +=
"+" + newWeaponParams[i];
693 return newWeaponString;
698 level endon(
"disconnect" );
699 level endon(
"cam_customization_closed" + localClientNum );
703 level waittill(
"cam_customization_focus" + localClientNum, param1, param2 );
705 base_weapon_slot = param1;
707 if( IsDefined( level.weapon_script_model[ localClientNum ] ) )
709 should_update_weapon_options =
true;
710 level thread
customclass::transition_camera( localClientNum, base_weapon_slot,
"cam_cac_weapon",
"cam_cac", .30, 400, notetrack, level.last_weapon_name[ localClientNum ], should_update_weapon_options );
717 level endon(
"disconnect");
718 level endon(
"cam_customization_closed" + localClientNum );
722 level waittill(
"cam_customization_wo" + localClientNum, weapon_option, weapon_option_new_index, is_item_locked );
724 if( IsDefined( level.weapon_script_model[ localClientNum ] ) )
728 weapon_option_new_index = 0;
731 switch( weapon_option )
734 level.camo_index[ localClientNum ] = int( weapon_option_new_index );
737 level.reticle_index[ localClientNum ] = int( weapon_option_new_index );
740 level.show_paintshop[ localClientNum ] = int( weapon_option_new_index );
753 level endon(
"disconnect" );
754 level endon(
"cam_customization_closed" + localClientNum );
758 level waittill(
"cam_customization_acv" + localClientNum, weapon_attachment_name, acv_index );
760 for ( i = 0; i < level.attachment_names[ localClientNum ].size; i++ )
762 if( level.attachment_names[ localClientNum ][i] == weapon_attachment_name )
764 level.attachment_indices[ localClientNum ][i] = int( acv_index );
769 if( IsDefined( level.weapon_script_model[ localClientNum ] ) )
771 level.weapon_script_model[ localClientNum ] SetAttachmentCosmeticVariantIndex( level.last_weapon_name[ localClientNum ], weapon_attachment_name,
int( acv_index ) );
778 level endon(
"disconnect");
780 level waittill(
"cam_customization_closed" + localClientNum, param1, param2, param3, param4 );
782 if( IsDefined( level.weapon_clientscript_cac_model[ localClientNum ] ) && IsDefined( level.weapon_clientscript_cac_model[ localClientNum ][ level.loadout_slot_name ] ) )
785 for( i = 0; i < level.attachment_names[ localClientNum ].size; i++ )
787 level.weapon_clientscript_cac_model[ localClientNum ][ level.loadout_slot_name ] SetAttachmentCosmeticVariantIndex( level.last_weapon_name[ localClientNum ], level.attachment_names[ localClientNum ][i], level.attachment_indices[ localClientNum ][i] );