diff options
Diffstat (limited to 'Northstar.CustomServers')
10 files changed, 325 insertions, 21 deletions
diff --git a/Northstar.CustomServers/scripts/vscripts/_loadouts_mp.gnut b/Northstar.CustomServers/scripts/vscripts/_loadouts_mp.gnut index 74f5e047..2a6eb5a8 100644 --- a/Northstar.CustomServers/scripts/vscripts/_loadouts_mp.gnut +++ b/Northstar.CustomServers/scripts/vscripts/_loadouts_mp.gnut @@ -34,7 +34,10 @@ void function SvLoadoutsMP_Init() AddClientCommandCallback( "SetFactionChoicePersistenceSlot", ClientCommandCallback_SetFactionChoicePersistenceSlot ) } else + { AddClientCommandCallback( "InGameMPMenuClosed", ClientCommandCallback_InGameMPMenuClosed ) + AddClientCommandCallback( "LoadoutMenuClosed", ClientCommandCallback_LoadoutMenuClosed ) + } AddCallback_OnPlayerKilled( DestroyDroppedWeapon ) } @@ -216,13 +219,20 @@ bool function ClientCommandCallback_SetFactionChoicePersistenceSlot( entity play return true } -bool function ClientCommandCallback_InGameMPMenuClosed( entity player, array<string> args ) +bool function ClientCommandCallback_LoadoutMenuClosed( entity player, array<string> args ) { SavePdataForEntityIndex( player.GetPlayerIndex() ) TryGivePilotLoadoutForGracePeriod( player ) return true } +bool function ClientCommandCallback_InGameMPMenuClosed( entity player, array<string> args ) +{ + SavePdataForEntityIndex( player.GetPlayerIndex() ) + //TryGivePilotLoadoutForGracePeriod( player ) + return true +} + bool function IsRefValidAndOfType( string ref, int itemType ) { return IsRefValid( ref ) && GetItemType( ref ) == itemType @@ -230,7 +240,7 @@ bool function IsRefValidAndOfType( string ref, int itemType ) void function SetPlayerLoadoutDirty( entity player ) { - if ( file.loadoutGracePeriodEnabled ) + if ( file.loadoutGracePeriodEnabled || player.p.usingLoadoutCrate ) file.dirtyLoadouts.append( player ) } @@ -240,8 +250,11 @@ void function TryGivePilotLoadoutForGracePeriod( entity player ) { file.dirtyLoadouts.remove( file.dirtyLoadouts.find( player ) ) - if ( Time() - player.s.respawnTime <= CLASS_CHANGE_GRACE_PERIOD ) + if ( Time() - player.s.respawnTime <= CLASS_CHANGE_GRACE_PERIOD || player.p.usingLoadoutCrate ) + { Loadouts_TryGivePilotLoadout( player ) + player.p.usingLoadoutCrate = false + } else SendHudMessage( player, "#LOADOUT_CHANGE_NEXT_BOTH", -1, 0.4, 255, 255, 255, 255, 0.15, 3.0, 0.5 ) // like 90% sure this is innacurate lol } diff --git a/Northstar.CustomServers/scripts/vscripts/class/CHardPointEntity.nut b/Northstar.CustomServers/scripts/vscripts/class/CHardPointEntity.nut index 4eb97955..a340bc32 100644 --- a/Northstar.CustomServers/scripts/vscripts/class/CHardPointEntity.nut +++ b/Northstar.CustomServers/scripts/vscripts/class/CHardPointEntity.nut @@ -1,15 +1,16 @@ untyped -global function CodeCallback_RegisterClass_C_HardPointEntity +// note: had to rename all instances of C_HardPointEntity to CHardPointEntity here, unsure why this was even a thing? +global function CodeCallback_RegisterClass_CHardPointEntity -function CodeCallback_RegisterClass_C_HardPointEntity() +function CodeCallback_RegisterClass_CHardPointEntity() { - /*C_HardPointEntity.ClassName <- "C_HardPointEntity" + CHardPointEntity.ClassName <- "CHardPointEntity" - function C_HardPointEntity::Enabled() + function CHardPointEntity::Enabled() { return this.GetHardpointID() >= 0 } - #document( "C_HardPointEntity::Enabled", "Returns true if this hardpoint is enabled" )*/ + #document( "CHardPointEntity::Enabled", "Returns true if this hardpoint is enabled" ) } diff --git a/Northstar.CustomServers/scripts/vscripts/earn_meter/sv_earn_meter_mp.gnut b/Northstar.CustomServers/scripts/vscripts/earn_meter/sv_earn_meter_mp.gnut index a465164d..b41640ad 100644 --- a/Northstar.CustomServers/scripts/vscripts/earn_meter/sv_earn_meter_mp.gnut +++ b/Northstar.CustomServers/scripts/vscripts/earn_meter/sv_earn_meter_mp.gnut @@ -1,8 +1,10 @@ global function Sv_EarnMeterMP_Init global function EarnMeterMP_SetTitanLoadout +global function EarnMeterMP_SetPassiveMeterGainEnabled struct { float playingStartTime + bool passiveMeterGainEnabled = true } file void function Sv_EarnMeterMP_Init() @@ -21,6 +23,11 @@ void function EarnMeterMP_SetTitanLoadout( entity player ) PlayerEarnMeter_SetGoal( player, EarnObject_GetByRef( GetTitanLoadoutForPlayer( player ).titanClass ) ) } +void function EarnMeterMP_SetPassiveMeterGainEnabled( bool enabled ) +{ + file.passiveMeterGainEnabled = enabled +} + void function SetupPlayerEarnMeter( entity player ) { PlayerEarnMeter_Reset( player ) @@ -117,7 +124,7 @@ void function EarnMeterMP_PlayerLifeThink( entity player ) PlayerEarnMeter_RefreshGoal( player ) } - if ( Time() - lastPassiveGainTime > 4.0 ) // this might be 5.0 + if ( Time() - lastPassiveGainTime > 4.0 && file.passiveMeterGainEnabled ) // this might be 5.0 { lastPassiveGainTime = Time() PlayerEarnMeter_AddOwnedFrac( player, 0.01 ) diff --git a/Northstar.CustomServers/scripts/vscripts/gamemodes/_capture_point.gnut b/Northstar.CustomServers/scripts/vscripts/gamemodes/_capture_point.gnut index 37b89169..e02157d1 100644 --- a/Northstar.CustomServers/scripts/vscripts/gamemodes/_capture_point.gnut +++ b/Northstar.CustomServers/scripts/vscripts/gamemodes/_capture_point.gnut @@ -1 +1 @@ -//fuck
\ No newline at end of file +// not using this, everything is just in _hardpoints instead lol
\ No newline at end of file diff --git a/Northstar.CustomServers/scripts/vscripts/gamemodes/_gamemode_cp.nut b/Northstar.CustomServers/scripts/vscripts/gamemodes/_gamemode_cp.nut index 2fa7e4eb..ddfe6ee6 100644 --- a/Northstar.CustomServers/scripts/vscripts/gamemodes/_gamemode_cp.nut +++ b/Northstar.CustomServers/scripts/vscripts/gamemodes/_gamemode_cp.nut @@ -1,12 +1,282 @@ +untyped + global function GamemodeCP_Init global function RateSpawnpoints_CP +// needed for sh_gamemode_cp_dialogue +global array<entity> HARDPOINTS + +struct HardpointStruct +{ + entity hardpoint + entity trigger + entity prop + + array<entity> imcCappers + array<entity> militiaCappers +} + +struct { + bool ampingEnabled = true + + array<HardpointStruct> hardpoints +} file + void function GamemodeCP_Init() { + file.ampingEnabled = GetCurrentPlaylistVar( "amped_capture_points" ) == "1" + + RegisterSignal( "HardpointCaptureStart" ) + + AddCallback_EntitiesDidLoad( SpawnHardpoints ) + AddCallback_GameStateEnter( eGameState.Playing, StartHardpointThink ) +} + +void function RateSpawnpoints_CP( int checkClass, array<entity> spawnpoints, int team, entity player ) +{ + +} + +void function SpawnHardpoints() +{ + foreach ( entity spawnpoint in GetEntArrayByClass_Expensive( "info_hardpoint" ) ) + { + if ( GameModeRemove( spawnpoint ) ) + continue + + // spawnpoints are CHardPoint entities + // init the hardpoint ent + int hardpointID = 0 + if ( spawnpoint.kv.hardpointGroup == "B" ) + hardpointID = 1 + else if ( spawnpoint.kv.hardpointGroup == "C" ) + hardpointID = 2 + + spawnpoint.SetHardpointID( hardpointID ) + + HardpointStruct hardpointStruct + hardpointStruct.hardpoint = spawnpoint + hardpointStruct.prop = CreatePropDynamic( spawnpoint.GetModelName(), spawnpoint.GetOrigin(), spawnpoint.GetAngles(), 6 ) + + entity trigger = GetEnt( expect string( spawnpoint.kv.triggerTarget ) ) + hardpointStruct.trigger = trigger + + file.hardpoints.append( hardpointStruct ) + HARDPOINTS.append( spawnpoint ) // for vo script + spawnpoint.s.trigger <- trigger // also for vo script + + SetGlobalNetEnt( "objective" + spawnpoint.kv.hardpointGroup + "Ent", spawnpoint ) + + // set up trigger functions + trigger.SetEnterCallback( OnHardpointEntered ) + trigger.SetLeaveCallback( OnHardpointLeft ) + } +} + +// functions for handling hardpoint netvars +void function SetHardpointState( HardpointStruct hardpoint, int state ) +{ + SetGlobalNetInt( "objective" + hardpoint.hardpoint.kv.hardpointGroup + "State", state ) + hardpoint.hardpoint.SetHardpointState( state ) +} + +int function GetHardpointState( HardpointStruct hardpoint ) +{ + return GetGlobalNetInt( "objective" + hardpoint.hardpoint.kv.hardpointGroup + "State" ) +} + +void function SetHardpointCappingTeam( HardpointStruct hardpoint, int team ) +{ + SetGlobalNetInt( "objective" + hardpoint.hardpoint.kv.hardpointGroup + "CappingTeam", team ) +} + +int function GetHardpointCappingTeam( HardpointStruct hardpoint ) +{ + return GetGlobalNetInt( "objective" + hardpoint.hardpoint.kv.hardpointGroup + "CappingTeam" ) +} + +void function SetHardpointCaptureProgress( HardpointStruct hardpoint, float progress ) +{ + SetGlobalNetFloat( "objective" + hardpoint.hardpoint.kv.hardpointGroup + "Progress", progress ) +} + +float function GetHardpointCaptureProgress( HardpointStruct hardpoint ) +{ + return GetGlobalNetFloat( "objective" + hardpoint.hardpoint.kv.hardpointGroup + "Progress" ) +} + + +void function StartHardpointThink() +{ + thread TrackChevronStates() + + foreach ( HardpointStruct hardpoint in file.hardpoints ) + thread HardpointThink( hardpoint ) +} + +void function HardpointThink( HardpointStruct hardpoint ) +{ + entity hardpointEnt = hardpoint.hardpoint + + float lastTime = Time() + float lastScoreTime = Time() + + WaitFrame() // wait a frame so deltaTime is never zero + while ( GamePlayingOrSuddenDeath() ) + { + int imcCappers = hardpoint.imcCappers.len() + int militiaCappers = hardpoint.militiaCappers.len() + + float deltaTime = Time() - lastTime + + int cappingTeam + if ( imcCappers > militiaCappers ) + cappingTeam = TEAM_IMC + else if ( militiaCappers > imcCappers ) + cappingTeam = TEAM_MILITIA + + if ( cappingTeam != TEAM_UNASSIGNED ) + { + // hardpoint is owned by controlling team + if ( hardpointEnt.GetTeam() == cappingTeam ) + { + // hardpoint is being neutralised, reverse the neutralisation + if ( GetHardpointCappingTeam( hardpoint ) != cappingTeam || GetHardpointCaptureProgress( hardpoint ) < 1.0 ) + { + SetHardpointCappingTeam( hardpoint, cappingTeam ) + SetHardpointCaptureProgress( hardpoint, min( 1.0, GetHardpointCaptureProgress( hardpoint ) + ( deltaTime / CAPTURE_DURATION_CAPTURE ) ) ) + } + // hardpoint is fully captured, start amping if amping is enabled + else if ( file.ampingEnabled && GetHardpointState( hardpoint ) < CAPTURE_POINT_STATE_AMPING ) + SetHardpointState( hardpoint, CAPTURE_POINT_STATE_AMPING ) + + // amp the hardpoint + if ( GetHardpointState( hardpoint ) == CAPTURE_POINT_STATE_AMPING ) + { + SetHardpointCaptureProgress( hardpoint, min( 2.0, GetHardpointCaptureProgress( hardpoint ) + ( deltaTime / HARDPOINT_AMPED_DELAY ) ) ) + if ( GetHardpointCaptureProgress( hardpoint ) == 2.0 ) + { + SetHardpointState( hardpoint, CAPTURE_POINT_STATE_AMPED ) + + // can't use the dialogue functions here because for some reason GamemodeCP_VO_Amped isn't global? + PlayFactionDialogueToTeam( "amphp_youAmped" + hardpointEnt.kv.hardpointGroup, cappingTeam ) + PlayFactionDialogueToTeam( "amphp_enemyAmped" + hardpointEnt.kv.hardpointGroup, GetOtherTeam( cappingTeam ) ) + } + } + } + else // we don't own this hardpoint, cap it + { + SetHardpointCappingTeam( hardpoint, cappingTeam ) + GamemodeCP_VO_StartCapping( hardpointEnt ) // this doesn't consistently trigger for some reason + + SetHardpointCaptureProgress( hardpoint, min( 1.0, GetHardpointCaptureProgress( hardpoint ) + ( deltaTime / CAPTURE_DURATION_CAPTURE ) ) ) + + if ( GetHardpointCaptureProgress( hardpoint ) >= 1.0 ) + { + SetTeam( hardpointEnt, cappingTeam ) + SetTeam( hardpoint.prop, cappingTeam ) + SetHardpointState( hardpoint, CAPTURE_POINT_STATE_CAPTURED ) + + EmitSoundOnEntityToTeamExceptPlayer( hardpointEnt, "hardpoint_console_captured", cappingTeam, null ) + GamemodeCP_VO_Captured( hardpointEnt ) + } + } + } + // capture halting + else if ( imcCappers > 0 && imcCappers == militiaCappers ) + SetHardpointState( hardpoint, CAPTURE_POINT_STATE_HALTED ) + // amped decay + else if ( imcCappers == 0 && militiaCappers == 0 && GetHardpointState( hardpoint ) >= CAPTURE_POINT_STATE_AMPING ) + { + // it seems like network vars won't change if they're too similar? often we get situations here where it's tryna change from 1.00098 to 1 which doesn't work + // so we need to check the "real" progress manually + // have only gotten this issue here so far, but in theory i think this could be an issue in a good few places, worth looking out for + // tho, idk might not be, we don't work with numbers at this small of a scale too often + float realProgress = max( 1.0, GetHardpointCaptureProgress( hardpoint ) - ( deltaTime / HARDPOINT_AMPED_DELAY ) ) + SetHardpointCaptureProgress( hardpoint, realProgress ) + + if ( realProgress == 1 ) + SetHardpointState( hardpoint, CAPTURE_POINT_STATE_CAPTURED ) + // dont use unamping atm + //else + // SetHardpointState( hardpoint, CAPTURE_POINT_STATE_SELF_UNAMPING ) + } + + // scoring + if ( hardpointEnt.GetTeam() != TEAM_UNASSIGNED && GetHardpointState( hardpoint ) >= CAPTURE_POINT_STATE_CAPTURED && Time() - lastScoreTime >= TEAM_OWNED_SCORE_FREQ ) + { + lastScoreTime = Time() + + // 2x score if amped + if ( GetHardpointState( hardpoint ) == CAPTURE_POINT_STATE_AMPED ) + AddTeamScore( hardpointEnt.GetTeam(), 2 ) + else + AddTeamScore( hardpointEnt.GetTeam(), 1 ) + } + + lastTime = Time() + WaitFrame() + } +} + +// doing this in HardpointThink is effort since it's for individual hardpoints +// so we do it here instead +void function TrackChevronStates() +{ + // you get 1 amped arrow for chevron / 4, 1 unamped arrow for every 1 the amped chevrons + + while ( true ) + { + int imcChevron + int militiaChevron + + foreach ( HardpointStruct hardpoint in file.hardpoints ) + { + if ( hardpoint.hardpoint.GetTeam() == TEAM_IMC ) + { + if ( hardpoint.hardpoint.GetHardpointState() == CAPTURE_POINT_STATE_AMPED ) + imcChevron += 4 + else if ( hardpoint.hardpoint.GetHardpointState() >= CAPTURE_POINT_STATE_CAPTURED ) + imcChevron++ + } + else if ( hardpoint.hardpoint.GetTeam() == TEAM_MILITIA ) + { + if ( hardpoint.hardpoint.GetHardpointState() == CAPTURE_POINT_STATE_AMPED ) + militiaChevron += 4 + else if ( hardpoint.hardpoint.GetHardpointState() >= CAPTURE_POINT_STATE_CAPTURED ) + militiaChevron++ + } + } + + SetGlobalNetInt( "imcChevronState", imcChevron ) + SetGlobalNetInt( "milChevronState", militiaChevron ) + + WaitFrame() + } +} + +void function OnHardpointEntered( entity trigger, entity player ) +{ + HardpointStruct hardpoint + foreach ( HardpointStruct hardpointStruct in file.hardpoints ) + if ( hardpointStruct.trigger == trigger ) + hardpoint = hardpointStruct + if ( player.GetTeam() == TEAM_IMC ) + hardpoint.imcCappers.append( player ) + else + hardpoint.militiaCappers.append( player ) } -void function RateSpawnpoints_CP(int _0, array<entity> _1, int _2, entity _3) +void function OnHardpointLeft( entity trigger, entity player ) { + HardpointStruct hardpoint + foreach ( HardpointStruct hardpointStruct in file.hardpoints ) + if ( hardpointStruct.trigger == trigger ) + hardpoint = hardpointStruct + if ( player.GetTeam() == TEAM_IMC ) + hardpoint.imcCappers.remove( hardpoint.imcCappers.find( player ) ) + else + hardpoint.militiaCappers.remove( hardpoint.militiaCappers.find( player ) ) }
\ No newline at end of file diff --git a/Northstar.CustomServers/scripts/vscripts/gamemodes/_gamemode_fra.nut b/Northstar.CustomServers/scripts/vscripts/gamemodes/_gamemode_fra.nut index 15f749ac..9d8f84b5 100644 --- a/Northstar.CustomServers/scripts/vscripts/gamemodes/_gamemode_fra.nut +++ b/Northstar.CustomServers/scripts/vscripts/gamemodes/_gamemode_fra.nut @@ -15,6 +15,8 @@ void function GamemodeFRA_Init() { // need a way to disable passive earnmeter gain ScoreEvent_SetEarnMeterValues( "PilotBatteryPickup", 0.0, 0.34 ) + EarnMeterMP_SetPassiveMeterGainEnabled( false ) + PilotBattery_SetMaxCount( 3 ) AddCallback_OnPlayerKilled( FRARemoveEarnMeter ) } diff --git a/Northstar.CustomServers/scripts/vscripts/gamemodes/_hardpoints.gnut b/Northstar.CustomServers/scripts/vscripts/gamemodes/_hardpoints.gnut index dab433f1..0a32f133 100644 --- a/Northstar.CustomServers/scripts/vscripts/gamemodes/_hardpoints.gnut +++ b/Northstar.CustomServers/scripts/vscripts/gamemodes/_hardpoints.gnut @@ -1,33 +1,35 @@ +// atm this is just a stub script since hardpoints are only really used in hardpoint +// respawn probably tried to share this code across multiple modes but atm we just dont need to do that + global function Hardpoints_Init + global function CapturePoint_GetStartProgress global function CapturePoint_GetCappingTeam global function CapturePoint_GetOwningTeam global function CapturePoint_GetGoalProgress -global array<entity> HARDPOINTS void function Hardpoints_Init() { - - + } float function CapturePoint_GetStartProgress( entity hardpoint ) { - return 0.5 + return GetGlobalNetFloat( "objective" + hardpoint.kv.hardpointGroup + "Progress" ) } int function CapturePoint_GetCappingTeam( entity hardpoint ) { - return 0 + return GetGlobalNetInt( "objective" + hardpoint.kv.hardpointGroup + "CappingTeam" ) } int function CapturePoint_GetOwningTeam( entity hardpoint ) { - return 0 + return hardpoint.GetTeam() } float function CapturePoint_GetGoalProgress( entity hardpoint ) { - return 1.0 + return GetGlobalNetFloat( "objective" + hardpoint.kv.hardpointGroup + "Progress" ) }
\ No newline at end of file diff --git a/Northstar.CustomServers/scripts/vscripts/lobby/_private_lobby.gnut b/Northstar.CustomServers/scripts/vscripts/lobby/_private_lobby.gnut index 8d803da1..1b4e5dbd 100644 --- a/Northstar.CustomServers/scripts/vscripts/lobby/_private_lobby.gnut +++ b/Northstar.CustomServers/scripts/vscripts/lobby/_private_lobby.gnut @@ -17,6 +17,7 @@ void function PrivateLobby_Init() AddClientCommandCallback( "PrivateMatchSetMode", ClientCommandCallback_PrivateMatchSetMode ) AddClientCommandCallback( "SetCustomMap", ClientCommandCallback_SetCustomMap ) AddClientCommandCallback( "PrivateMatchSwitchTeams", ClientCommandCallback_PrivateMatchSwitchTeams ) + AddClientCommandCallback( "ResetMatchSettingsToDefault", ClientCommandCallback_ResetMatchSettingsToDefault ) } bool function ClientCommandCallback_PrivateMatchLaunch( entity player, array<string> args ) @@ -157,4 +158,10 @@ void function RefreshPlayerTeams() lastSetMilitia = !lastSetMilitia } } +} + +bool function ClientCommandCallback_ResetMatchSettingsToDefault( entity player, array<string> args ) +{ + ClearPlaylistVarOverrides() + return true }
\ No newline at end of file diff --git a/Northstar.CustomServers/scripts/vscripts/lobby/sh_lobby.gnut b/Northstar.CustomServers/scripts/vscripts/lobby/sh_lobby.gnut index 24436017..fda0e5ff 100644 --- a/Northstar.CustomServers/scripts/vscripts/lobby/sh_lobby.gnut +++ b/Northstar.CustomServers/scripts/vscripts/lobby/sh_lobby.gnut @@ -161,7 +161,7 @@ string function GetPrivateMatchMapForIndex( int index ) { array<string> mapsArray = GetPrivateMatchMaps() - if ( index >= mapsArray.len() ) + if ( index >= mapsArray.len() || index < 0 ) return "" return mapsArray[index] @@ -171,7 +171,7 @@ string function GetPrivateMatchModeForIndex( int index ) { array<string> modesArray = GetPrivateMatchModes() - if ( index >= modesArray.len() ) + if ( index >= modesArray.len() || index < 0 ) return "" return modesArray[index] diff --git a/Northstar.CustomServers/scripts/vscripts/mp/_changemap.nut b/Northstar.CustomServers/scripts/vscripts/mp/_changemap.nut index 4d6dc393..7aa6940c 100644 --- a/Northstar.CustomServers/scripts/vscripts/mp/_changemap.nut +++ b/Northstar.CustomServers/scripts/vscripts/mp/_changemap.nut @@ -14,7 +14,9 @@ void function CodeCallback_MatchIsOver() if ( GetCurrentPlaylistVarInt( "return_to_private_lobby", 0 ) == 1 ) // set in _private_lobby.gnut, temp lol { SetCurrentPlaylist( "private_match" ) // needed for private lobby to load - ServerCommand( "changelevel mp_lobby" ) + GameRules_ChangeMap( "mp_lobby", "tdm" ) // need to change back to tdm + // this is esp important for sp, since solo will break a bunch of shit in the private lobby + // idk if even necessary to deal with solo but eh whatever better to have it work than not } #if DEV |