#using scripts\codescripts\struct; #using scripts\shared\callbacks_shared; #using scripts\shared\clientfield_shared; #using scripts\shared\filter_shared; #using scripts\shared\flag_shared; #using scripts\shared\flagsys_shared; #using scripts\shared\visionset_mgr_shared; #using scripts\shared\util_shared; #using scripts\shared\system_shared; #namespace duplicate_render; function autoexec __init__sytem__() { system::register("duplicate_render",&__init__,undefined,undefined); } function __init__() { if(!isdefined(level.drfilters))level.drfilters=[]; callback::on_spawned( &on_player_spawned ); callback::on_localclient_connect( &on_player_connect ); set_dr_filter_framebuffer( "none_fb", 0, undefined, undefined, 0, 1, 0 ); set_dr_filter_framebuffer_duplicate( "none_fbd", 0, undefined, undefined, 1, 0, 0 ); set_dr_filter_offscreen( "none_os", 0, undefined, undefined, 2, 0, 0 ); set_dr_filter_framebuffer( "enveh_fb", 8, "enemyvehicle_fb", undefined, 0, 4, 1 ); set_dr_filter_framebuffer( "frveh_fb", 8, "friendlyvehicle_fb", undefined, 0, 1, 1 ); set_dr_filter_offscreen( "retrv", 5, "retrievable", undefined, 2, "mc/hud_keyline_retrievable", 1 ); set_dr_filter_offscreen( "unplc", 7, "unplaceable", undefined, 2, "mc/hud_keyline_unplaceable", 1 ); set_dr_filter_offscreen( "eneqp", 8, "enemyequip", undefined, 2, "mc/hud_outline_rim", 1 ); set_dr_filter_offscreen( "enexp", 8, "enemyexplo", undefined, 2, "mc/hud_outline_rim", 1 ); set_dr_filter_offscreen( "enveh", 8, "enemyvehicle", undefined, 2, "mc/hud_outline_rim", 1 ); set_dr_filter_offscreen( "freqp", 8, "friendlyequip", undefined, 2, "mc/hud_keyline_friendlyequip", 1 ); set_dr_filter_offscreen( "frexp", 8, "friendlyexplo", undefined, 2, "mc/hud_keyline_friendlyequip", 1 ); set_dr_filter_offscreen( "frveh", 8, "friendlyvehicle", undefined, 2, "mc/hud_keyline_friendlyequip", 1 ); set_dr_filter_offscreen( "infrared", 9, "infrared_entity", undefined, 2, 2, 1 ); set_dr_filter_offscreen( "threat_detector_enemy", 10, "threat_detector_enemy", undefined, 2, "mc/hud_keyline_enemyequip", 1 ); set_dr_filter_offscreen( "hthacked", 5, "hacker_tool_hacked", undefined, 2, "mc/mtl_hacker_tool_hacked", 1 ); set_dr_filter_offscreen( "hthacking", 5, "hacker_tool_hacking", undefined, 2, "mc/mtl_hacker_tool_hacking", 1 ); set_dr_filter_offscreen( "htbreaching", 5, "hacker_tool_breaching", undefined, 2, "mc/mtl_hacker_tool_breaching", 1 ); set_dr_filter_offscreen( "bcarrier", 9, "ballcarrier", undefined, 2, "mc/hud_keyline_friendlyequip", 1 ); set_dr_filter_offscreen( "poption", 9, "passoption", undefined, 2, "mc/hud_keyline_friendlyequip", 1 ); set_dr_filter_offscreen( "prop_look_through", 9, "prop_look_through", undefined, 2, "mc/hud_keyline_friendlyequip", 1 ); set_dr_filter_offscreen( "prop_ally", 8, "prop_ally", undefined, 2, "mc/hud_keyline_friendlyequip", 1 ); set_dr_filter_offscreen( "prop_clone", 7, "prop_clone", undefined, 2, "mc/hud_keyline_ph_yellow", 1 ); level.friendlyContentOutlines = GetDvarInt( "friendlyContentOutlines", false ); } function on_player_spawned( local_client_num ) { self.currentdrfilter=[]; self change_dr_flags(local_client_num); if( !level flagsys::get( "duplicaterender_registry_ready" ) ) { {wait(.016);};//We need a frame once player is valid to set up the materials level flagsys::set( "duplicaterender_registry_ready" ); } } function on_player_connect( localClientNum ) { level wait_team_changed( localClientNum ); } function wait_team_changed( localClientNum ) { while( 1 ) { level waittill( "team_changed" ); // the local player might not be valid yet and will cause the team detection functionality not to work while ( !isdefined( GetLocalPlayer( localClientNum ) ) ) { wait( .05 ); } player = GetLocalPlayer( localClientNum ); player Codcaster_Keyline_Enable( false ); } } function set_dr_filter( filterset, name, priority, require_flags, refuse_flags, drtype1, drval1, drcull1, drtype2, drval2, drcull2, drtype3, drval3, drcull3 ) { if(!isdefined(level.drfilters))level.drfilters=[]; if ( !IsDefined( level.drfilters[ filterset ] ) ) { level.drfilters[filterset]=[]; } if (!IsDefined(level.drfilters[filterset][name])) { level.drfilters[filterset][name] = spawnstruct(); } filter = level.drfilters[filterset][name]; filter.name = name; // set priority negative until the materials are registered. This will keep it from being used filter.priority = -priority; if (!IsDefined(require_flags)) filter.require = []; else if ( IsArray(require_flags) ) filter.require = require_flags; else filter.require = StrTok( require_flags, "," ); if (!IsDefined(refuse_flags)) filter.refuse = []; else if ( IsArray(refuse_flags) ) filter.refuse = refuse_flags; else filter.refuse = StrTok( refuse_flags, "," ); filter.types = []; filter.values = []; filter.culling = []; if (IsDefined(drtype1)) { idx = filter.types.size; filter.types[idx]=drtype1; filter.values[idx]=drval1; filter.culling[idx]=drcull1; } if (IsDefined(drtype2)) { idx = filter.types.size; filter.types[idx]=drtype2; filter.values[idx]=drval2; filter.culling[idx]=drcull2; } if (IsDefined(drtype3)) { idx = filter.types.size; filter.types[idx]=drtype3; filter.values[idx]=drval3; filter.culling[idx]=drcull3; } thread register_filter_materials( filter ); } function set_dr_filter_framebuffer( name, priority, require_flags, refuse_flags, drtype1, drval1, drcull1, drtype2, drval2, drcull2, drtype3, drval3, drcull3 ) { set_dr_filter( "framebuffer", name, priority, require_flags, refuse_flags, drtype1, drval1, drcull1, drtype2, drval2, drcull2, drtype3, drval3, drcull3 ); } function set_dr_filter_framebuffer_duplicate( name, priority, require_flags, refuse_flags, drtype1, drval1, drcull1, drtype2, drval2, drcull2, drtype3, drval3, drcull3 ) { set_dr_filter( "framebuffer_duplicate", name, priority, require_flags, refuse_flags, drtype1, drval1, drcull1, drtype2, drval2, drcull2, drtype3, drval3, drcull3 ); } function set_dr_filter_offscreen( name, priority, require_flags, refuse_flags, drtype1, drval1, drcull1, drtype2, drval2, drcull2, drtype3, drval3, drcull3 ) { set_dr_filter( "offscreen", name, priority, require_flags, refuse_flags, drtype1, drval1, drcull1, drtype2, drval2, drcull2, drtype3, drval3, drcull3 ); } function register_filter_materials( filter ) { playerCount = undefined; opts = filter.types.size; for ( i=0; i best.priority) { best = filter; } } } return best; } function can_use_filter( filter ) { for ( i = 0; i < filter.require.size; i++ ) { if ( !self flagsys::get( filter.require[i] )) return false; } for ( i = 0; i < filter.refuse.size; i++ ) { if ( self flagsys::get( filter.refuse[i] )) return false; } return true; } function apply_filter( localClientNum, filter, filterset = "framebuffer" ) { if ( IsDefined( level.postGame ) && level.postGame && !( isdefined( level.showedTopThreePlayers ) && level.showedTopThreePlayers ) ) { player = GetLocalPlayer( localClientNum ); if ( !(player GetInKillcam( localClientNum )) ) return; } /# if ( GetDvarInt( "scr_debug_duplicaterender" ) ) { name = "[entity]"; if ( self IsPlayer() ) { if (IsDefined(self.name)) name = "player "+self.name; } else if (IsDefined(self.model)) { name += "." + self.model; } msg = "DUPLICATERENDER: Applying filter "+filter.name+" to "+name+" for set "+filterset; Println(msg); //IPrintlnBold(msg); } #/ if (!IsDefined(self.currentdrfilter)) self.currentdrfilter=[]; self.currentdrfilter[filterset]=filter.name; opts = filter.types.size; for ( i=0; i