using UnityEngine;
using BaseGames.Core;
using BaseGames.Localization;
using BaseGames.World.Map;
namespace BaseGames.UI.Menus
{
///
/// 地图传送确认控制器(UI 侧桥接)。
///
/// 订阅 :玩家在全屏地图点击一个可传送站点时,
/// 弹出 二次确认,确认后调用
/// 发起传送,并按需关闭地图面板。
///
///
/// 放在 UI 程序集(已引用 BaseGames.World.Map)——MapPanel 自身不反向依赖 UI,避免循环引用。
/// 这是"补全传送"闭环的最后一环:地图选点 → 确认 → 传送。
///
///
public class MapTeleportConfirmController : MonoBehaviour
{
[Header("引用")]
[Tooltip("全屏地图面板(订阅其 OnTeleportStationSelected)。")]
[SerializeField] private MapPanel _mapPanel;
[Tooltip("通用确认框;留空则点击站点后直接传送(无二次确认)。")]
[SerializeField] private ConfirmDialogController _confirmDialog;
[Header("文案(本地化键)")]
[SerializeField] private string _confirmTitleKey = "TELEPORT_CONFIRM_TITLE";
[Tooltip("确认正文前缀本地化键;后面拼接目的地房间显示名。")]
[SerializeField] private string _confirmBodyPrefixKey = "TELEPORT_CONFIRM_BODY";
[SerializeField] private string _confirmYesKey = "CONFIRM_YES";
[SerializeField] private string _confirmNoKey = "CONFIRM_NO";
[Header("行为")]
[Tooltip("确认传送后是否关闭地图面板(CloseTopPanel)。")]
[SerializeField] private bool _closeMapOnConfirm = true;
private void OnEnable()
{
if (_mapPanel != null)
_mapPanel.OnTeleportStationSelected += OnStationSelected;
}
private void OnDisable()
{
if (_mapPanel != null)
_mapPanel.OnTeleportStationSelected -= OnStationSelected;
}
private void OnStationSelected(string roomId)
{
if (string.IsNullOrEmpty(roomId)) return;
// 无确认框:直接传送
if (_confirmDialog == null)
{
DoTeleport(roomId);
return;
}
string destName = ResolveDestName(roomId);
string prefix = LocalizationManager.Get(_confirmBodyPrefixKey, LocalizationTable.UI);
if (string.IsNullOrEmpty(prefix) || prefix == _confirmBodyPrefixKey)
prefix = "传送到:"; // 本地化键缺失时的兜底前缀
string body = prefix + destName;
// ConfirmDialog 对 body 走 Loc 查找,未命中则原样显示——拼接串可直接呈现;
// 确认/取消按钮文案也走本地化键,随语言切换。
_confirmDialog.Show(_confirmTitleKey, body, onConfirm: () => DoTeleport(roomId),
onCancel: null, confirmKey: _confirmYesKey, cancelKey: _confirmNoKey);
}
private void DoTeleport(string roomId)
{
var teleportSvc = ServiceLocator.GetOrDefault();
if (teleportSvc == null)
{
Debug.LogWarning("[MapTeleportConfirmController] ITeleportService 未注册,无法传送。");
return;
}
teleportSvc.RequestTeleport(roomId);
if (_closeMapOnConfirm)
ServiceLocator.GetOrDefault()?.CloseTopPanel();
}
/// 解析目的地房间的玩家可读名(DisplayName 走本地化;无则回退 RoomId)。
private static string ResolveDestName(string roomId)
{
var room = ServiceLocator.GetOrDefault()?.Database?.GetRoom(roomId);
if (room == null || string.IsNullOrEmpty(room.DisplayName)) return roomId;
// DisplayName 为本地化 Key 时解析为译文;为普通名称时原样返回(向后兼容)。
return LocalizationManager.Get(room.DisplayName, LocalizationTable.UI);
}
}
}