diff --git a/client/webapp/index.html b/client/webapp/index.html
--- a/client/webapp/index.html
+++ b/client/webapp/index.html
@@ -142,6 +142,9 @@
+
+
+
diff --git a/client/webapp/js/engine/entity_renderer.js b/client/webapp/js/engine/entity_renderer.js
--- a/client/webapp/js/engine/entity_renderer.js
+++ b/client/webapp/js/engine/entity_renderer.js
@@ -122,6 +122,11 @@
ctx.ellipse(mPos.x, mPos.y + 4, shadowRx, shadowRy, 0, 0, Math.PI * 2);
ctx.fill();
+ // Render Pack Leader Pulsating Ground Aura Decal (PoE2 Standards)
+ if (m.isPackLeader && typeof window.renderLeaderAuraDecal === 'function') {
+ window.renderLeaderAuraDecal(ctx, m, mPos.x, mPos.y, (window.gameTimeSec || Date.now() * 0.001));
+ }
+
let drawnAnimatedMob = false;
if (typeof AnimationEngine !== 'undefined' && m.anim) {
drawnAnimatedMob = AnimationEngine.drawEntityFrame(
diff --git a/server/world/hideout_engine.py b/server/world/hideout_engine.py
--- a/server/world/hideout_engine.py
+++ b/server/world/hideout_engine.py
@@ -269,7 +269,8 @@
def enter_map_portal(
self,
player_id: str,
- portal_index: Optional[int] = None
+ portal_index: Optional[int] = None,
+ zone_engine: Optional[Any] = None,
) -> Tuple[bool, str, Optional[Dict[str, Any]]]:
"""
Enters an active Map Device portal.
@@ -312,7 +313,11 @@
# If exhausted all 6 portals, close device
if dev.portals_remaining == 0:
+ if zone_engine is not None and hasattr(zone_engine, "active_instances"):
+ zone_engine.active_instances.pop(dev.active_instance_id, None)
+ dev.active_instance_id = None
dev.active_map = None
msg = f"Đã bước qua cổng #{target_idx + 1}. Đây là CỔNG CUỐI CÙNG (0/6)! Tinh Đồ Nghi đã khép lại."
else:
msg = f"Đã bước qua cổng #{target_idx + 1}. Còn lại {dev.portals_remaining}/6 Cổng Tinh Đồ."