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);