diff --git a/src/GameLogic/MiniGames/HeykelSavasiContext.cs b/src/GameLogic/MiniGames/HeykelSavasiContext.cs index 88c1b4a..96b3ef8 100644 --- a/src/GameLogic/MiniGames/HeykelSavasiContext.cs +++ b/src/GameLogic/MiniGames/HeykelSavasiContext.cs @@ -331,6 +331,22 @@ public class HeykelSavasiContext : MiniGameContext /// The player. private void RemoveTeam(Player player) => this._teams.TryRemove(player, out _); + /// + /// Removes a player from their team when they leave the event map for good (disconnect, or warp + /// to another map such as Lorencia). A same-map death-respawn does NOT trigger this (RespawnAtAsync + /// skips the map-removal when respawning on the same map), so dying at your own base keeps your team + /// assignment and earned progress intact. This keeps team counts accurate so re-joining works. + /// + protected override async ValueTask OnObjectRemovedFromMapAsync((GameMap Map, ILocateable Object) args) + { + if (args.Object is Player player) + { + this.RemoveTeam(player); + } + + await base.OnObjectRemovedFromMapAsync(args).ConfigureAwait(false); + } + /// /// /// Cancels the event if either team is empty at start (no opponent to fight); otherwise diff --git a/src/GameLogic/Player.cs b/src/GameLogic/Player.cs index 24f9cc0..e9b731f 100644 --- a/src/GameLogic/Player.cs +++ b/src/GameLogic/Player.cs @@ -736,13 +736,23 @@ public class Player : AsyncDisposable, IBucketMapObserver, IAttackable, IAttacke return null; } - // ADAMU-CUSTOM: Heykel Savasi -> same-team players cannot damage each other. + // ADAMU-CUSTOM: Heykel Savasi PvP rules. if (this.CurrentMiniGame is HeykelSavasiContext heykelSavasi - && attacker is Player heykelAttacker - && heykelSavasi.GetTeam(this) != HeykelSavasiTeam.None - && heykelSavasi.GetTeam(this) == heykelSavasi.GetTeam(heykelAttacker)) + && attacker is Player heykelAttacker) { - return null; + // No player-vs-player damage before the battle actually starts (registration / 30s preparation). + if (heykelSavasi.State != MiniGameState.Playing) + { + return null; + } + + // Never friendly-fire within the same team. + var heykelVictimTeam = heykelSavasi.GetTeam(this); + if (heykelVictimTeam != HeykelSavasiTeam.None + && heykelVictimTeam == heykelSavasi.GetTeam(heykelAttacker)) + { + return null; + } } var hitInfo = await attacker.CalculateDamageAsync(this, skill, isCombo, damageFactor).ConfigureAwait(false);