diff options
Diffstat (limited to 'Northstar.Custom/mod/scripts/vscripts/gamemodes/gg_earn_meter')
3 files changed, 154 insertions, 0 deletions
diff --git a/Northstar.Custom/mod/scripts/vscripts/gamemodes/gg_earn_meter/_gg_earn_meter.gnut b/Northstar.Custom/mod/scripts/vscripts/gamemodes/gg_earn_meter/_gg_earn_meter.gnut new file mode 100644 index 000000000..1d4e73b73 --- /dev/null +++ b/Northstar.Custom/mod/scripts/vscripts/gamemodes/gg_earn_meter/_gg_earn_meter.gnut @@ -0,0 +1,56 @@ +global function Sv_GGEarnMeter_SetWeaponIcon +global function Sv_GGEarnMeter_SetFinalIcon +global function Sv_GGEarnMeter_SetPercentage +global function Sv_GGEarnMeter_AddPercentage +global function AddCallback_GGEarnMeterFull + +struct +{ + array< bool functionref( entity ) > onGGEarnMeterFullCallbacks +} file + +void function Sv_GGEarnMeter_SetWeaponIcon( entity player, string weaponReference ) +{ + Remote_CallFunction_Replay( player, "ServerCallback_GGEarnMeter_SetWeaponIcon", eDamageSourceId[weaponReference] ) +} + +void function Sv_GGEarnMeter_SetFinalIcon( entity player ) +{ + Remote_CallFunction_Replay( player, "ServerCallback_GGEarnMeter_SetWeaponIcon", -1 ) +} + +void function Sv_GGEarnMeter_SetPercentage( entity player, float percentage ) +{ + player.SetPlayerNetFloat( "gunGameLevelPercentage", clamp(percentage, 0.0, 1.0) ) + + thread CheckPercentage( player ) +} + +void function Sv_GGEarnMeter_AddPercentage( entity player, float percentage ) +{ + Sv_GGEarnMeter_SetPercentage(player, player.GetPlayerNetFloat( "gunGameLevelPercentage") + percentage) +} + +void function AddCallback_GGEarnMeterFull( bool functionref( entity ) callbackFunc ) +{ + Assert( !file.onGGEarnMeterFullCallbacks.contains( callbackFunc ), "Already added " + FunctionToString( callbackFunc ) + " with AddCallback_GGEarnMeterFull" ) + + file.onGGEarnMeterFullCallbacks.append( callbackFunc ) +} + +void function CheckPercentage( entity player ) +{ + float percentage = player.GetPlayerNetFloat( "gunGameLevelPercentage") + + if ( percentage < 1.0 ) + return + + wait 0.2 + + bool lastWeapon = false + foreach ( callbackFunc in file.onGGEarnMeterFullCallbacks ) + lastWeapon = callbackFunc( player ) + + if ( !lastWeapon ) + Sv_GGEarnMeter_SetPercentage(player, 0.0) +}
\ No newline at end of file diff --git a/Northstar.Custom/mod/scripts/vscripts/gamemodes/gg_earn_meter/cl_gg_earn_meter.gnut b/Northstar.Custom/mod/scripts/vscripts/gamemodes/gg_earn_meter/cl_gg_earn_meter.gnut new file mode 100644 index 000000000..d6369b0cf --- /dev/null +++ b/Northstar.Custom/mod/scripts/vscripts/gamemodes/gg_earn_meter/cl_gg_earn_meter.gnut @@ -0,0 +1,82 @@ +global function Cl_GGEarnMeter_Init +global function Cl_GGEarnMeter_RegisterNetwork +global function ServerCallback_GGEarnMeter_SetWeaponIcon + +const float FILL_ANIM_DURATION = 0.2 + +struct EarnChangeData +{ + float startValue = 0.0 + float endValue = 0.0 + float updateTime = 0.0 +} + +struct { + EarnChangeData lastEarnedData + var earnMeterRui +} file + +void function Cl_GGEarnMeter_Init() +{ + AddCallback_OnClientScriptInit( CreateGGEarnMeterUI ) +} + +void function CreateGGEarnMeterUI( entity player ) +{ + file.earnMeterRui = CreateCockpitRui( $"ui/earn_meter.rpak" ) + + RuiSetFloat( file.earnMeterRui, "fillAnimDuration", FILL_ANIM_DURATION ) + RuiSetGameTime( file.earnMeterRui, "lastEarnChangeTime", RUI_BADGAMETIME ) + RuiSetFloat( file.earnMeterRui, "earnedStartFrac", 0.0 ) + RuiSetInt( file.earnMeterRui, "meterMode", 5 ) + + RuiTrackFloat( file.earnMeterRui, "earnedFrac", player, RUI_TRACK_SCRIPT_NETWORK_VAR, GetNetworkedVariableIndex( "gunGameLevelPercentage" ) ) +} + +void function Cl_GGEarnMeter_RegisterNetwork() +{ + RegisterNetworkedVariableChangeCallback_float( "gunGameLevelPercentage", GunGamePercentageUpdate ) +} + +void function GunGamePercentageUpdate( entity player, float oldValue, float newValue, bool actuallyChanged ) +{ + if ( !actuallyChanged ) + return + + float currentValue = Cl_GGEarnMeter_GetCurrentMeterValue( file.lastEarnedData ) + RuiSetGameTime( file.earnMeterRui, "lastEarnChangeTime", Time() ) + RuiSetFloat( file.earnMeterRui, "earnedStartFrac", currentValue ) + + file.lastEarnedData.startValue = oldValue + file.lastEarnedData.endValue = newValue + file.lastEarnedData.updateTime = Time() +} + +float function Cl_GGEarnMeter_GetCurrentMeterValue( EarnChangeData earnData ) +{ + float elapsedTime = Time() - earnData.updateTime + float delta = earnData.endValue - earnData.startValue + return earnData.endValue - (delta * EaseIn( GraphCapped( elapsedTime, 0.0, FILL_ANIM_DURATION, 1.0, 0.0 ) ) ) +} + +void function ServerCallback_GGEarnMeter_SetWeaponIcon( int damageSourceId ) +{ + asset weaponImage + + if ( damageSourceId > -1 ) + { + if ( !DamageSourceIDHasString(damageSourceId) ) + { + return + } + + weaponImage = GetItemImage( DamageSourceIDToString( damageSourceId ) ) + } + else + { + weaponImage = RandomFloat( 1 ) > 0.1 ? $"rui/menu/boosts/boost_icon_random" : $"rui/faction/faction_logo_mrvn" + } + + RuiSetImage( file.earnMeterRui, "goalBuildingIcon", weaponImage ) + RuiSetImage( file.earnMeterRui, "goalReadyIcon", weaponImage ) +}
\ No newline at end of file diff --git a/Northstar.Custom/mod/scripts/vscripts/gamemodes/gg_earn_meter/sh_gg_earn_meter.gnut b/Northstar.Custom/mod/scripts/vscripts/gamemodes/gg_earn_meter/sh_gg_earn_meter.gnut new file mode 100644 index 000000000..0428ecfa7 --- /dev/null +++ b/Northstar.Custom/mod/scripts/vscripts/gamemodes/gg_earn_meter/sh_gg_earn_meter.gnut @@ -0,0 +1,16 @@ +global function Sh_GGEarnMeter_Init + +void function Sh_GGEarnMeter_Init() +{ + AddCallback_OnRegisteringCustomNetworkVars( RegisterSharedNetwork ) +} + +void function RegisterSharedNetwork() +{ + RegisterNetworkedVariable( "gunGameLevelPercentage", SNDC_PLAYER_EXCLUSIVE, SNVT_FLOAT_RANGE, 0.0, 0.0, 1.0 ) + Remote_RegisterFunction( "ServerCallback_GGEarnMeter_SetWeaponIcon" ) + + #if CLIENT + Cl_GGEarnMeter_RegisterNetwork() + #endif +}
\ No newline at end of file |