Skip to content

Commit

Permalink
Merge branch 'main' into gamemode_fd
Browse files Browse the repository at this point in the history
  • Loading branch information
Zanieon authored Feb 27, 2025
2 parents 855a121 + ab93512 commit 0a93830
Show file tree
Hide file tree
Showing 10 changed files with 114 additions and 61 deletions.
2 changes: 1 addition & 1 deletion Northstar.Client/mod.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
"ConVars": [
{
"Name": "allow_mod_auto_download",
"DefaultValue": "0"
"DefaultValue": "1"
},
{
"Name": "filter_hide_empty",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -307,7 +307,7 @@ Drücke Ja, um zuzustimmen. Du kannst diese Entscheidung jederzeit im Modmenü
"UNAUTHORIZED_PWD" "Falsches Passwort"
"STRYDER_RESPONSE" "Stryder Antwort konnte nicht verarbeitet werden"
"PLAYER_NOT_FOUND" "Konnte das Spielerprofil nicht finden"
"INVALID_MASTERSERVER_TOKEN" "Ungültiger oder abgelaufener Token vom Masterserver"
"INVALID_MASTERSERVER_TOKEN" "Ungültiger oder abgelaufener Token vom Masterserver, versuch die EA App neuzustarten"
"JSON_PARSE_ERROR" "Fehler beim Verarbeiten der JSON-Antwort"
"UNSUPPORTED_VERSION" "Die Version die du benutzt ist nicht länger unterstützt"
"SNS_LEADER_BANKRUPT_SUB" "%s1 Wurde Von %s2 Zurückgesetzt"
Expand Down Expand Up @@ -340,7 +340,7 @@ Drücke Ja, um zuzustimmen. Du kannst diese Entscheidung jederzeit im Modmenü
"DOWNLOADING_MOD_TITLE_W_PROGRESS" "Lade Mod (%s1%)"
"DOWNLOADING_MOD_TEXT" "Lade %s1 v%s2..."
"DOWNLOADING_MOD_TEXT_W_PROGRESS" "Lade %s1 v%s2...\n(%s3/%s4 MB)"
"CHECKSUMING_TITLE" "Überprüfe Mod Prüfsumme"
"CHECKSUMING_TITLE" "Überprüfe Mod Integrität"
"MOD_NOT_VERIFIED" "(mod ist nicht verifiziert und kann nicht automatisch herunterladen werden)"
"MOD_REQUIRED_WARNING" " : Dieser Mod könnte Sie (un)ausgestattet hinterlassen, sobald Sie einem Server beitreten"
"MOD_SETTINGS" "Mod Einstellungen"
Expand All @@ -361,7 +361,7 @@ Drücke Ja, um zuzustimmen. Du kannst diese Entscheidung jederzeit im Modmenü
"PROGRESSION_TOGGLE_DISABLED_BODY" "Titans, Waffen, Fraktionen, Skins usw. müssen durch Levelaufstieg freigeschaltet oder mit Verdiensten gekauft werden.\n\nDies kann jederzeit in der Mehrspieler-Lobby geändert werden.\n\n^CC000000Warnung: Wenn Sie derzeit ausgerüstete Gegenstände besitzen, die Sie nicht freigeschaltet haben, werden diese zurückgesetzt!"
"PROGRESSION_ENABLED_BODY" "^CCCC0000Fortschritt wurde aktiviert.^\n\nTitans, Waffen, Fraktionen, Skins usw. müssen durch Levelaufstieg freigeschaltet oder mit Verdiensten gekauft werden.\n\nDies kann jederzeit in der Mehrspieler-Lobby geändert werden."
"PROGRESSION_DISABLED_BODY" "^CCCC0000Fortschritt wurde deaktiviert.^\n\nTitans, Waffen, Fraktionen, Skins usw. werden alle freigeschaltet und jederzeit nutzbar sein.\n\nDies kann jederzeit in der Mehrspieler-Lobby geändert werden."
"CHECKSUMING_TEXT" "Verifiziere Inhalte von %s1 v%s2..."
"CHECKSUMING_TEXT" "Validiere Inhalte von %s1 v%s2..."
"EXTRACTING_MOD_TITLE" "Extrahiere Mod (%s1%)"
"EXTRACTING_MOD_TEXT" "Extrahiere %s1 v%s2...\n(%s3/%s4 MB)"
"FAILED_DOWNLOADING" "Herunterladen der Mod fehlgeschlagen"
Expand All @@ -376,5 +376,21 @@ Drücke Ja, um zuzustimmen. Du kannst diese Entscheidung jederzeit im Modmenü
"SCOREBOARD_BANKRUPTS" "Bankrott Kills"
"sns_offhand_kill_value" "Freihand Killwert"
"PROGRESSION_ANNOUNCEMENT_BODY" "^CCCC0000Fortschritt kann jetzt aktiviert werden!^\n\nNorthstar unterstützt nun den standardmäßigen Fortschritt, was bedeutet, dass Sie Waffen, Skins, Titans usw. durch Levelaufstieg und das Abschließen von Herausforderungen freischalten können.\n\nSie können den Fortschritt mit dem Button am unteren Rand des Lobbybildschirms aktivieren.\n\nDies kann jederzeit geändert werden."
"MANIFESTO_FETCHING_TEXT" "Abrufen der Liste der verifizierten Mods..."
"MANIFESTO_FETCHING_TITLE" "Mod download wird aufgesetzt"
"MODE_MENU_FFA" "FFA"
"MODE_MENU_PVPVE" "PvPvE"
"MODE_MENU_OTHER" "Andere"
"MODE_MENU_ALL" "Alle"
"MODE_MENU_UNKNOWN" "Unbekannt"
"MODE_MENU_SWITCH" "Filter"
"MODE_MENU_CUSTOM" "Benutzerdefiniert"
"MODE_MENU_PVE" "PvE"
"MODE_MENU_PVP" "PvP"
"MODE_MENU_TITAN_ONLY" "Nur Titane"
"TEAMSWITCH_BUFFER" "Teamtausch klingt noch ab"
"TEAMSWITCH_GAMEMODE" "Spielmodus erlaubt keine Teamänderungen"
"TEAMSWITCH_GAMEPLAY" "Teamänderungen sind nicht außerhalb der Spielphase erlaubt"
"TEAMSWITCH_DISABLED" "Aktiver Spielmodus erlaubt keine Team Änderungen"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -386,5 +386,9 @@ Clique em Sim se você concorda. Esta escolha pode ser alterada a qualquer momen
"MODE_MENU_UNKNOWN" "Desconhecido"
"MODE_MENU_SWITCH" "Filtrar"
"MODE_MENU_TITAN_ONLY" "Somente Titãs"
"TEAMSWITCH_GAMEMODE" "Modo de jogo não suporta troca de time"
"TEAMSWITCH_BUFFER" "Trocar de time está em esfriamento"
"TEAMSWITCH_GAMEPLAY" "Troca de time não é permitido fora do estágio de jogando"
"TEAMSWITCH_DISABLED" "Esse modo de jogo não suporta troca de time"
}
}
14 changes: 10 additions & 4 deletions Northstar.Custom/mod/scripts/vscripts/gamemodes/_gamemode_fw.nut
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,10 @@ void function GamemodeFW_Init()
// _battery_port.gnut needs this
RegisterSignal( "BatteryActivate" )

// mp_thaw's intro spawnpoint have some problem, player can be stucked on the sky, so override it
if ( GetMapName() == "mp_thaw" )
SetSpawnpointGamemodeOverride( TEAM_DEATHMATCH )

AiGameModes_SetNPCWeapons( "npc_soldier", [ "mp_weapon_rspn101", "mp_weapon_dmr", "mp_weapon_r97", "mp_weapon_lmg" ] )
AiGameModes_SetNPCWeapons( "npc_spectre", [ "mp_weapon_hemlok_smg", "mp_weapon_doubletake", "mp_weapon_mastiff" ] )

Expand Down Expand Up @@ -459,7 +463,7 @@ bool function TryFWTerritoryDialogue( entity territory, entity player )

// the territory trigger will only save players and titans
array<entity> allEntsInside = GetAllEntitiesInTrigger( territory )
allEntsInside.removebyvalue( null ) // since we're using a fake trigger, need to check this
ArrayRemoveInvalid( allEntsInside ) // since we're using a fake trigger, need to check this
array<entity> friendliesInside // this means territory's friendly team
array<entity> enemiesInside // this means territory's enemy team
array<entity> enemyTitansInside
Expand Down Expand Up @@ -1342,8 +1346,8 @@ void function FWAreaThreatLevelThink_Threaded()
// check threats
array<entity> imcEntArray = GetAllEntitiesInTrigger( imcTerritory )
array<entity> mltEntArray = GetAllEntitiesInTrigger( mltTerritory )
imcEntArray.removebyvalue( null ) // since we're using a fake trigger, need to check this
mltEntArray.removebyvalue( null )
ArrayRemoveInvalid( imcEntArray ) // since we're using a fake trigger, need to check this
ArrayRemoveInvalid( mltEntArray )
foreach( entity ent in imcEntArray )
{
//print( ent )
Expand Down Expand Up @@ -1752,6 +1756,7 @@ void function FW_createHarvester()
fw_harvesterImc.harvester.Minimap_SetHeightTracking( true )
fw_harvesterImc.harvester.Minimap_SetZOrder( MINIMAP_Z_OBJECT )
fw_harvesterImc.harvester.Minimap_SetCustomState( eMinimapObject_prop_script.FD_HARVESTER )
SetObjectCanBeMeleed( fw_harvesterImc.harvester, true )
AddEntityCallback_OnFinalDamaged( fw_harvesterImc.harvester, OnHarvesterDamaged )
AddEntityCallback_OnPostDamaged( fw_harvesterImc.harvester, OnHarvesterPostDamaged )

Expand All @@ -1778,6 +1783,7 @@ void function FW_createHarvester()
fw_harvesterMlt.harvester.Minimap_SetHeightTracking( true )
fw_harvesterMlt.harvester.Minimap_SetZOrder( MINIMAP_Z_OBJECT )
fw_harvesterMlt.harvester.Minimap_SetCustomState( eMinimapObject_prop_script.FD_HARVESTER )
SetObjectCanBeMeleed( fw_harvesterMlt.harvester, true )
AddEntityCallback_OnFinalDamaged( fw_harvesterMlt.harvester, OnHarvesterDamaged )
AddEntityCallback_OnPostDamaged( fw_harvesterMlt.harvester, OnHarvesterPostDamaged )

Expand Down Expand Up @@ -2316,7 +2322,7 @@ function FW_UseBattery( batteryPortvar, playervar ) //actually void function( en
if( turretReplaced || teamChanged ) // replaced/hacked turret will spawn with 50% health
newHealth = int ( turret.GetMaxHealth() * GetCurrentPlaylistVarFloat( "fw_turret_hacked_health", TURRET_HACKED_HEALTH_PERCENTAGE ) )
// restore turret shield
int newShield = int ( min( turret.GetShieldHealthMax(), turret.GetShieldHealth() + ( turret.GetShieldHealth() * GetCurrentPlaylistVarFloat( "fw_turret_fixed_shield", TURRET_FIXED_SHIELD_PERCENTAGE ) ) ) )
int newShield = int( min( turret.GetShieldHealthMax(), turret.GetShieldHealth() + ( turret.GetShieldHealthMax() * GetCurrentPlaylistVarFloat( "fw_turret_fixed_shield", TURRET_FIXED_SHIELD_PERCENTAGE ) ) ) )
if( turretReplaced || teamChanged ) // replaced/hacked turret will spawn with 50% shield
newShield = int ( turret.GetShieldHealthMax() * GetCurrentPlaylistVarFloat( "fw_turret_hacked_shield", TURRET_HACKED_SHIELD_PERCENTAGE ) )
// only do team score event if turret's shields down, encourage players to hack more turrets
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ void function NorthstarCheatCommands_Init()
AddClientCommandCallback( "noclip", ClientCommandCallbackToggleNoclip )
AddClientCommandCallback( "notarget", ClientCommandCallbackToggleNotarget )
AddClientCommandCallback( "demigod", ClientCommandCallbackToggleDemigod )
AddClientCommandCallback( "god", ClientCommandCallbackToggleDemigod )
AddClientCommandCallback( "kill", ClientCommandCallbackKill )
AddClientCommandCallback( "explode", ClientCommandCallbackExplode )
}
Expand All @@ -14,19 +15,23 @@ bool function ClientCommandCallbackToggleNoclip( entity player, array<string> ar
{
if ( !GetConVarBool( "sv_cheats" ) )
return true
if( player.GetParent() ) // change movetype while setparented will crash the server
if ( player.GetParent() ) // change movetype while setparented will crash the server
{
print( player + " failed noclipping because the entity is parented" )
return true
}

print( player + " TOGGLED NOCLIP" )

if ( player.IsNoclipping() )
{
player.SetPhysics( MOVETYPE_WALK )
print( player + " TOGGLED NOCLIP OFF" )
}
else
{
player.SetPhysics( MOVETYPE_NOCLIP )

print( player + " TOGGLED NOCLIP ON" )
}

return true
}

Expand All @@ -35,10 +40,14 @@ bool function ClientCommandCallbackToggleNotarget( entity player, array<string>
if ( !GetConVarBool( "sv_cheats" ) )
return true

print( player + " TOGGLED NOTARGET" )
if ( player.GetNoTarget() )
print( player + " TOGGLED NOTARGET OFF" )
else
print( player + " TOGGLED NOTARGET ON" )

player.SetNoTarget( !player.GetNoTarget() )
player.SetNoTargetSmartAmmo( player.GetNoTarget() )

return true
}

Expand All @@ -47,28 +56,32 @@ bool function ClientCommandCallbackToggleDemigod( entity player, array<string> a
if ( !GetConVarBool( "sv_cheats" ) )
return true

print( player + " TOGGLED DEMIGOD" )

if ( IsDemigod( player ) )
{
DisableDemigod( player )
print( player + " TOGGLED DEMIGOD OFF" )
}
else
{
EnableDemigod( player )

print( player + " TOGGLED DEMIGOD ON" )
}

return true
}

bool function ClientCommandCallbackKill( entity player, array<string> args )
{
if ( IsAlive( player ) && ( GetConVarBool( "sv_cheats" ) || GetConVarBool( "ns_allow_kill_commands" ) ) )
player.Die()

return true
}

bool function ClientCommandCallbackExplode( entity player, array<string> args )
{
if ( IsAlive( player ) && ( GetConVarBool( "sv_cheats" ) || GetConVarBool( "ns_allow_kill_commands" ) ) )
player.Die( null, null, { scriptType = DF_GIB } )

return true
}
Original file line number Diff line number Diff line change
Expand Up @@ -490,6 +490,7 @@ void function AddPlayerToEvacDropship( entity dropship, entity player )

// need to cancel if the dropship dies
dropship.EndSignal( "OnDeath", "OnDestroy" )
player.EndSignal( "OnDestroy" )

player.SetInvulnerable()
player.UnforceCrouch()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -787,6 +787,29 @@ bool function PlayerOrNPCKilled( entity ent, var damageInfo )
ScoreEvent_TitanKilled( ent, attacker, damageInfo )
else
ScoreEvent_NPCKilled( ent, attacker, damageInfo )

entity victim = ent.IsTitan() ? ent.GetTitanSoul() : ent
if ( IsValid( victim ) )
{
table<int, bool> alreadyAssisted

foreach( DamageHistoryStruct attackerInfo in victim.e.recentDamageHistory )
{
if ( !IsValid( attackerInfo.attacker ) || !attackerInfo.attacker.IsPlayer() || attackerInfo.attacker == victim )
continue

bool exists = attackerInfo.attacker.GetEncodedEHandle() in alreadyAssisted ? true : false
if( attackerInfo.attacker != attacker && !exists )
{
alreadyAssisted[attackerInfo.attacker.GetEncodedEHandle()] <- true
foreach ( player in GetPlayerArray() )
Remote_CallFunction_Replay( player, "ServerCallback_SetAssistInformation", attackerInfo.damageSourceId, attacker.GetEncodedEHandle(), ent.GetEncodedEHandle(), attackerInfo.time )

foreach ( callback in svGlobal.onPlayerAssistCallbacks )
callback( attackerInfo.attacker, victim )
}
}
}
}
PostScoreEventUpdateStats( attacker, ent )

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ void function BaseGametype_Init_MPSP()

AddCallback_OnNPCKilled( CheckForAutoTitanDeath )
AddCallback_OnPlayerKilled( CheckForAutoTitanDeath )
AddCallback_OnPlayerAssist( PlayerAssistedKill )
RegisterSignal( "PlayerRespawnStarted" )
RegisterSignal( "KillCamOver" )

Expand Down Expand Up @@ -250,6 +251,18 @@ void function CodeCallback_OnPlayerRespawned( entity player )
ClearLastAttacker( player ) // so dying to anything doesn't credit the same attacker after respawning
}

void function PlayerAssistedKill( entity attacker, entity victim )
{
if( victim.IsPlayer() )
{
AddPlayerScore( attacker, "PilotAssist" )
attacker.AddToPlayerGameStat( PGS_ASSISTS, 1 )

if ( attacker.IsPlayer() )
Highlight_SetDeathRecapHighlight( attacker, "killer_outline" )
}
}

void function CodeCallback_OnPlayerKilled( entity player, var damageInfo )
{
PlayerOrNPCKilled( player, damageInfo )
Expand Down Expand Up @@ -307,28 +320,6 @@ void function PostDeathThread_MP( entity player, var damageInfo ) // based on ga
eHandle = inflictor.GetEncodedEHandle()
int methodOfDeath = DamageInfo_GetDamageSourceIdentifier( damageInfo )

table<int, bool> alreadyAssisted
if ( IsValid( attacker ) )
{
foreach( DamageHistoryStruct attackerInfo in player.e.recentDamageHistory )
{
if ( !IsValid( attackerInfo.attacker ) || !attackerInfo.attacker.IsPlayer() || attackerInfo.attacker == player )
continue

bool exists = attackerInfo.attacker.GetEncodedEHandle() in alreadyAssisted ? true : false
if( attackerInfo.attacker != attacker && !exists )
{
alreadyAssisted[attackerInfo.attacker.GetEncodedEHandle()] <- true
Remote_CallFunction_NonReplay( attackerInfo.attacker, "ServerCallback_SetAssistInformation", attackerInfo.damageSourceId, attacker.GetEncodedEHandle(), player.GetEncodedEHandle(), attackerInfo.time )
AddPlayerScore( attackerInfo.attacker, "PilotAssist" )
attackerInfo.attacker.AddToPlayerGameStat( PGS_ASSISTS, 1 )
}
}

if( attacker.IsPlayer() )
Highlight_SetDeathRecapHighlight( attacker, "killer_outline" )
}

player.p.rematchOrigin = player.p.deathOrigin
if ( IsValid( attacker ) && methodOfDeath == eDamageSourceId.titan_execution )
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,12 @@ void function DropshipIntro_OnClientConnected( entity player )

void function OnPrematchStart()
{
thread OnPrematchStart_Threaded()
}

void function OnPrematchStart_Threaded()
{
FlagWait( "EntitiesDidLoad" )
ClassicMP_OnIntroStarted()

print( "starting dropship intro!" )
Expand Down Expand Up @@ -85,7 +91,7 @@ void function OnPrematchStart()
table< entity, array<entity> > teamDropships = createTeam == TEAM_MILITIA ? file.militiaDropships : file.imcDropships

if ( teamDropships.len() >= 2 )
break
continue

entity dropship = CreateDropship( createTeam, dropshipSpawn.GetOrigin(), dropshipSpawn.GetAngles() )
AddAnimEvent( dropship, "dropship_warpout", WarpoutEffect )
Expand All @@ -103,6 +109,9 @@ void function OnPrematchStart()
teamDropships[ dropship ] <- [ null, null, null, null ]

thread PlayAnim( dropship, "dropship_classic_mp_flyin" )

if ( file.imcDropships.len() >= 2 && file.militiaDropships.len() >= 2 )
break
}

// Populate Dropships
Expand Down
30 changes: 10 additions & 20 deletions Northstar.CustomServers/mod/scripts/vscripts/mp/_score.nut
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ void function Score_Init()
{
SvXP_Init()
AddCallback_OnClientConnected( InitPlayerForScoreEvents )
AddCallback_OnPlayerAssist( TitanAssistedKill )
}

void function InitPlayerForScoreEvents( entity player )
Expand Down Expand Up @@ -216,30 +217,19 @@ void function ScoreEvent_TitanKilled( entity victim, entity attacker, var damage
AddPlayerScore( attacker, "KillTitan" )
}

entity soul = victim.GetTitanSoul()
if ( IsValid( soul ) )
{
table<int, bool> alreadyAssisted

foreach( DamageHistoryStruct attackerInfo in soul.e.recentDamageHistory )
{
if ( !IsValid( attackerInfo.attacker ) || !attackerInfo.attacker.IsPlayer() || attackerInfo.attacker == soul )
continue

bool exists = attackerInfo.attacker.GetEncodedEHandle() in alreadyAssisted ? true : false
if( attackerInfo.attacker != attacker && !exists )
{
alreadyAssisted[attackerInfo.attacker.GetEncodedEHandle()] <- true
AddPlayerScore(attackerInfo.attacker, "TitanAssist" )
Remote_CallFunction_NonReplay( attackerInfo.attacker, "ServerCallback_SetAssistInformation", attackerInfo.damageSourceId, attacker.GetEncodedEHandle(), soul.GetEncodedEHandle(), attackerInfo.time )
}
}
}

if( !victim.IsNPC() ) // don't let killing a npc titan plays dialogue
KilledPlayerTitanDialogue( attacker, victim )
}

void function TitanAssistedKill( entity attacker, entity victim )
{
if ( IsSoul( victim ) )
{
AddPlayerScore( attacker, "TitanAssist" )
attacker.AddToPlayerGameStat( PGS_ASSISTS, 1 )
}
}

void function ScoreEvent_NPCKilled( entity victim, entity attacker, var damageInfo )
{
try
Expand Down

0 comments on commit 0a93830

Please sign in to comment.