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 Đồ."