1 #using scripts\codescripts\struct;
2 #using scripts\shared\callbacks_shared;
3 #using scripts\shared\clientfield_shared;
4 #using scripts\shared\filter_shared;
5 #using scripts\shared\flag_shared;
6 #using scripts\shared\flagsys_shared;
7 #using scripts\shared\visionset_mgr_shared;
8 #using scripts\shared\util_shared;
10 #insert scripts\shared\duplicaterender.gsh;
11 #insert scripts\shared\shared.gsh;
12 #insert scripts\shared\version.gsh;
13 #insert scripts\shared\abilities\_ability_util.gsh;
15 #using scripts\shared\system_shared;
17 #namespace duplicate_render;
19 #define FRAMEBUFFER_FILTER_SET "framebuffer"
20 #define FRAMEBUFFER_DUPLICATE_FILTER_SET "framebuffer_duplicate"
21 #define OFFSCREEN_FILTER_SET "offscreen"
25 #define EQUIPMENT_RETRIEVABLE_MATERIAL "mc/hud_keyline_retrievable"
26 #define EQUIPMENT_UNPLACEABLE_MATERIAL "mc/hud_keyline_unplaceable"
27 #define EQUIPMENT_ENEMYEQUIP_MATERIAL "mc/hud_outline_rim"
28 #define EQUIPMENT_ENEMYVEHICLE_MATERIAL "mc/hud_outline_rim"
29 #define EQUIPMENT_ENEMYEQUIP_DETECT_MATERIAL "mc/hud_outline_rim"
30 #define EQUIPMENT_FRIENDLYEQUIP_MATERIAL "mc/hud_keyline_friendlyequip"
31 #define EQUIPMENT_FRIENDLYVEHICLE_MATERIAL "mc/hud_keyline_friendlyequip"
33 #define PLAYER_THREAT_DETECTOR_MATERIAL "mc/hud_keyline_enemyequip"
35 #define PLAYER_HACKER_TOOL_HACKED "mc/mtl_hacker_tool_hacked"
36 #define PLAYER_HACKER_TOOL_HACKING "mc/mtl_hacker_tool_hacking"
37 #define PLAYER_HACKER_TOOL_BREACHING "mc/mtl_hacker_tool_breaching"
39 #define PLAYER_BALL_OUTLINE "mc/hud_keyline_friendlyequip"
75 level.friendlyContentOutlines = GetDvarInt(
"friendlyContentOutlines",
false );
80 self.currentdrfilter=[];
83 if( !level
flagsys::get(
"duplicaterender_registry_ready" ) )
99 level waittill(
"team_changed" );
102 while ( !isdefined( GetLocalPlayer( localClientNum ) ) )
107 player = GetLocalPlayer( localClientNum );
108 player Codcaster_Keyline_Enable(
false );
112 function set_dr_filter( filterset,
name, priority, require_flags, refuse_flags, drtype1, drval1, drcull1, drtype2, drval2, drcull2, drtype3, drval3, drcull3 )
115 if ( !IsDefined( level.drfilters[ filterset ] ) )
117 level.drfilters[filterset]=[];
119 if (!IsDefined(level.drfilters[filterset][
name]))
121 level.drfilters[filterset][
name] = spawnstruct();
123 filter = level.drfilters[filterset][
name];
126 filter.priority = -priority;
127 if (!IsDefined(require_flags))
129 else if ( IsArray(require_flags) )
130 filter.require = require_flags;
132 filter.require = StrTok( require_flags,
"," );
133 if (!IsDefined(refuse_flags))
135 else if ( IsArray(refuse_flags) )
136 filter.refuse = refuse_flags;
138 filter.refuse = StrTok( refuse_flags,
"," );
142 if (IsDefined(drtype1))
144 idx = filter.types.size;
145 filter.types[idx]=drtype1;
146 filter.values[idx]=drval1;
147 filter.culling[idx]=drcull1;
149 if (IsDefined(drtype2))
151 idx = filter.types.size;
152 filter.types[idx]=drtype2;
153 filter.values[idx]=drval2;
154 filter.culling[idx]=drcull2;
156 if (IsDefined(drtype3))
158 idx = filter.types.size;
159 filter.types[idx]=drtype3;
160 filter.values[idx]=drval3;
161 filter.culling[idx]=drcull3;
167 function set_dr_filter_framebuffer(
name, priority, require_flags, refuse_flags, drtype1, drval1, drcull1, drtype2, drval2, drcull2, drtype3, drval3, drcull3 )
169 set_dr_filter(
FRAMEBUFFER_FILTER_SET,
name, priority, require_flags, refuse_flags, drtype1, drval1, drcull1, drtype2, drval2, drcull2, drtype3, drval3, drcull3 );
172 function set_dr_filter_framebuffer_duplicate(
name, priority, require_flags, refuse_flags, drtype1, drval1, drcull1, drtype2, drval2, drcull2, drtype3, drval3, drcull3 )
174 set_dr_filter(
FRAMEBUFFER_DUPLICATE_FILTER_SET,
name, priority, require_flags, refuse_flags, drtype1, drval1, drcull1, drtype2, drval2, drcull2, drtype3, drval3, drcull3 );
177 function set_dr_filter_offscreen(
name, priority, require_flags, refuse_flags, drtype1, drval1, drcull1, drtype2, drval2, drcull2, drtype3, drval3, drcull3 )
179 set_dr_filter(
OFFSCREEN_FILTER_SET,
name, priority, require_flags, refuse_flags, drtype1, drval1, drcull1, drtype2, drval2, drcull2, drtype3, drval3, drcull3 );
184 playerCount = undefined;
185 opts = filter.types.size;
186 for ( i=0; i<opts; i++ )
188 value = filter.values[i];
189 if ( IsString( value ) )
191 if ( !IsDefined(playerCount) )
193 while( !isDefined(level.localPlayers) && !isDefined(level.frontendClientConnected) )
197 if( isDefined(level.frontendClientConnected) )
204 playerCount = level.localPlayers.size;
209 for ( localClientNum = 0; localClientNum < playerCount; localClientNum++ )
218 filter.priority = abs( filter.priority );
232 if ( !IsDefined(
self.flag ) || !IsDefined(
self.flag[toset] ) )
237 if ( setto ==
self.flag[toset] )
253 Assert( IsDefined(setto) );
257 foreach( ts
in toset )
264 if ( !IsDefined(
self.flag ) || !IsDefined(
self.flag[toset] ) )
269 if ( setto ==
self.flag[toset] )
291 if ( IsDefined(toset) )
293 if( IsString( toset ) )
295 toset = StrTok( toset,
"," );
299 if ( IsDefined(toclear) )
301 if( IsString( toclear ) )
303 toclear = StrTok( toclear,
"," );
313 self notify(
"update_dr_filters");
314 self endon(
"update_dr_filters");
315 self endon(
"entityshutdown");
319 foreach( key, filterset
in level.drfilters )
322 if ( isdefined(filter) && (!isdefined(
self.currentdrfilter) || !
IS_EQUAL(
self.currentdrfilter[key],filter.name) ) )
337 foreach( filter
in filterset )
341 if (!IsDefined(best) || filter.priority > best.priority)
352 for ( i = 0; i < filter.require.size; i++ )
357 for ( i = 0; i < filter.refuse.size; i++ )
367 if ( IsDefined( level.postGame ) && level.postGame && !
IS_TRUE( level.showedTopThreePlayers ) )
369 player = GetLocalPlayer( localClientNum );
370 if ( !(player GetInKillcam( localClientNum )) )
374 if (!IsDefined(
self.currentdrfilter))
375 self.currentdrfilter=[];
376 self.currentdrfilter[filterset]=filter.name;
377 opts = filter.types.size;
378 for ( i=0; i<opts; i++ )
380 type = filter.types[i];
381 value = filter.values[i];
382 culling = filter.culling[i];
383 material = undefined;
384 if ( IsString( value ) )
388 if (IsDefined(value) && IsDefined(material))
391 self addduplicaterenderoption( type, value, material, culling );
395 self.currentdrfilter[filterset]=undefined;
400 self addduplicaterenderoption( type, value, -1, culling );
404 if( SessionModeIsMultiplayerGame() )
412 self endon(
"entityshutdown");
413 self notify(
"disable_all_filters_on_game_ended");
414 self endon(
"disable_all_filters_on_game_ended");
416 level waittill(
"post_game" );
418 self disableduplicaterendering();
471 self update_dr_flag( localClientNum,
"threat_detector_enemy", on_off );
489 flags_changed =
self set_dr_flag(
"hacker_tool_breaching", on_off );
492 flags_changed =
self set_dr_flag(
"enemyvehicle",
false ) || flags_changed;
496 if (
IS_TRUE(
self.isEnemyVehicle ) )
498 flags_changed =
self set_dr_flag(
"enemyvehicle",
true ) || flags_changed;
510 if ( !
IS_TRUE( level.friendlyContentOutlines ) )
513 if ( IsShoutcaster( local_client_num ) )