2023-04-13 17:30:38 +02:00

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;
}
}
}
#/