234 lines
13 KiB
Plaintext
234 lines
13 KiB
Plaintext
#using scripts\codescripts\struct;
|
|
|
|
#using scripts\shared\callbacks_shared;
|
|
#using scripts\shared\clientfield_shared;
|
|
#using scripts\shared\duplicaterender_mgr;
|
|
#using scripts\shared\system_shared;
|
|
#using scripts\shared\util_shared;
|
|
|
|
#using scripts\shared\abilities\_ability_player;
|
|
#using scripts\shared\abilities\_ability_power;
|
|
#using scripts\shared\abilities\_ability_util;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function autoexec __init__sytem__() { system::register("gadget_armor",&__init__,undefined,undefined); }
|
|
|
|
function __init__()
|
|
{
|
|
callback::on_localplayer_spawned( &on_local_player_spawned );
|
|
clientfield::register( "allplayers", "armor_status", 1, 5, "int", &player_armor_changed, !true, !true );
|
|
clientfield::register( "toplayer", "player_damage_type", 1, 1, "int", &player_damage_type_changed, !true, !true );
|
|
|
|
duplicate_render::set_dr_filter_framebuffer_duplicate( "armor_pl", 40, "armor_on", undefined, 1, "mc/mtl_power_armor", 0 );
|
|
/#
|
|
level thread armor_overlay_think();
|
|
#/
|
|
}
|
|
|
|
function on_local_player_spawned( localClientNum )
|
|
{
|
|
if( self != GetLocalPlayer( localClientNum ) )
|
|
return;
|
|
|
|
newVal = self clientfield::get( "armor_status" );
|
|
|
|
self player_armor_changed_event( localClientNum, newVal );
|
|
}
|
|
|
|
function player_damage_type_changed( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
|
|
{
|
|
self armor_update_fx_event( localClientNum, newVal);
|
|
}
|
|
|
|
function player_armor_changed( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
|
|
{
|
|
self player_armor_changed_event( localClientNum, newVal);
|
|
}
|
|
|
|
function player_armor_changed_event( localClientNum, newVal )
|
|
{
|
|
self armor_update_fx_event( localClientNum, newVal);
|
|
|
|
self armor_update_shader_event( localClientNum, newVal );
|
|
}
|
|
|
|
function armor_update_shader_event( localClientNum, armorStatusNew )
|
|
{
|
|
if ( armorStatusNew )
|
|
{
|
|
self duplicate_render::update_dr_flag( localClientNum, "armor_on", true );
|
|
|
|
shieldExpansionNcolor = "scriptVector3";
|
|
shieldExpansionValueX = .3;
|
|
|
|
colorVector = armor_get_shader_color( armorStatusNew ); //( 0.2, 0.8, 1 );
|
|
|
|
if ( GetDvarInt( "scr_armor_dev" ) )
|
|
{
|
|
shieldExpansionValueX = GetDvarFloat( "scr_armor_expand", shieldExpansionValueX );
|
|
colorVector = ( GetDvarFloat( "scr_armor_colorR", colorVector[0] ), GetDvarFloat( "scr_armor_colorG", colorVector[1] ), GetDvarFloat( "scr_armor_colorB", colorVector[2] ) );
|
|
}
|
|
|
|
colorTintValueY = colorVector[0];
|
|
colorTintValueZ = colorVector[1];
|
|
colorTintValueW = colorVector[2];
|
|
|
|
damageState = "scriptVector4";
|
|
damageStateValue = armorStatusNew / 5;
|
|
|
|
self MapShaderConstant( localClientNum, 0, shieldExpansionNcolor, shieldExpansionValueX, colorTintValueY, colorTintValueZ, colorTintValueW );
|
|
self MapShaderConstant( localClientNum, 0, damageState, damageStateValue );
|
|
}
|
|
else
|
|
{
|
|
self duplicate_render::update_dr_flag( localClientNum, "armor_on", false );
|
|
}
|
|
}
|
|
|
|
function armor_get_shader_color( armorStatusNew )
|
|
{
|
|
// if ( armorStatusNew == ARMOR_STATUS_FULL )
|
|
// {
|
|
// color = ( 0.03, 0.11, 0.97 );
|
|
// }
|
|
// else if ( armorStatusNew == ARMOR_STATUS_GOOD )
|
|
// {
|
|
// color = ( 0.02, 0.65, 0.98 );
|
|
// }
|
|
// else if ( armorStatusNew == ARMOR_STATUS_OK )
|
|
// {
|
|
// color = ( 0.03, 0.82, 0.97 );
|
|
// }
|
|
// else if ( armorStatusNew == ARMOR_STATUS_DANGER )
|
|
// {
|
|
// color = ( 0.47, 0.97, 0.96 );
|
|
// }
|
|
// else if ( armorStatusNew == ARMOR_STATUS_CRITICAL )
|
|
// {
|
|
// color = ( 0.97, 0.04, 0.10 );
|
|
// }
|
|
// else
|
|
// {
|
|
// color = (0.03, 0.11, 0.97 );
|
|
// }
|
|
|
|
color = ( .3, .3, .2 );
|
|
|
|
return color;
|
|
}
|
|
|
|
function armor_update_fx_event( localClientNum, doArmorFx )
|
|
{
|
|
if ( !self armor_is_local_player( localClientNum ) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if ( doArmorFx )
|
|
{
|
|
self SetDamageDirectionIndicator(1);
|
|
setsoundcontext( "plr_impact", "pwr_armor" );
|
|
}
|
|
else
|
|
{
|
|
self SetDamageDirectionIndicator(0);
|
|
setsoundcontext( "plr_impact", "" );
|
|
}
|
|
}
|
|
|
|
function armor_overlay_transition_fx( localClientNum, armorStatusNew )
|
|
{
|
|
self endon( "disconnect" );
|
|
|
|
if ( !isdefined( self._gadget_armor_state ) )
|
|
{
|
|
self._gadget_armor_state = 0;
|
|
}
|
|
|
|
if ( armorStatusNew == self._gadget_armor_state )
|
|
{
|
|
return;
|
|
}
|
|
|
|
self._gadget_armor_state = armorStatusNew;
|
|
|
|
if ( armorStatusNew == 5 )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if ( ( isdefined( self._armor_doing_transition ) && self._armor_doing_transition ) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
self._armor_doing_transition = true;
|
|
|
|
transition = 0;
|
|
flicker_start_time = GetRealTime();
|
|
saved_vision = GetVisionSetNaked( localClientNum );
|
|
|
|
visionsetnaked( localClientNum, "taser_mine_shock", transition );
|
|
|
|
self playsound (0, "wpn_taser_mine_tacmask");
|
|
|
|
wait( 0.3 );
|
|
|
|
visionSetNaked( localClientNum, saved_vision, transition );
|
|
|
|
self._armor_doing_transition = false;
|
|
}
|
|
|
|
function armor_is_local_player( localClientNum )
|
|
{
|
|
player_view = getlocalplayer( localClientNum );
|
|
|
|
sameEntity = ( self == player_view );
|
|
|
|
return sameEntity;
|
|
}
|
|
|
|
/#
|
|
function armor_overlay_think()
|
|
{
|
|
armorStatus = 0;
|
|
|
|
SetDvar( "scr_armor_status", 0 );
|
|
|
|
while( 1 )
|
|
{
|
|
wait( 0.1 );
|
|
|
|
armorStatusNew = GetDvarInt( "scr_armor_status" );
|
|
|
|
if ( armorStatusNew != armorStatus )
|
|
{
|
|
players = getlocalplayers();
|
|
|
|
foreach ( i, localPlayer in players )
|
|
{
|
|
if ( !isdefined( localPlayer ) )
|
|
{
|
|
continue;
|
|
}
|
|
|
|
localPlayer player_armor_changed_event( i, armorStatusNew );
|
|
}
|
|
|
|
armorStatus = armorStatusNew;
|
|
}
|
|
}
|
|
}
|
|
#/
|
|
|