lcy
12 小时以前 eb08b17ddd08424eb03e1d6e5606933f0034ac45
262 幻境阁 优化配表支持

1.UnlockWay为1和2时,称号表,形象表,头像表,头像框表,气泡表五个表还是共用相同逻辑
2.UnlockWay为其他值时,五个表的UnlockWay支持各自的逻辑不同
2个文件已修改
151 ■■■■■ 已修改文件
Main/System/PhantasmPavilion/PhantasmPavilionManager.cs 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/PhantasmPavilion/PhantasmPavilionUnlockButton.cs 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/PhantasmPavilion/PhantasmPavilionManager.cs
@@ -522,97 +522,49 @@
    // 除道具解锁外,其他方式暂默认永久
    // 1 - 默认解锁,即创角就可用的
    // 2 - 道具解锁,支持时效、升级, Value配物品ID
    // 3 - 关联武将解锁,Value配武将ID
    public bool IsUnlock(PhantasmPavilionType type, int id)
    {
        // 配置表中不存在,视为未解锁
        if (!Has(type, id))
            return false;
        if (!Has(type, id)) return false;
        int unlockWayValue = GetUnlockWay(type, id);
        int unlockValue = GetUnlockValue(type, id);
        // 解锁方式无效
        if (!Enum.IsDefined(typeof(PhantasmPavilionUnlockWay), unlockWayValue))
            return false;
        var unlockWay = (PhantasmPavilionUnlockWay)unlockWayValue;
        switch (unlockWay)
        if (unlockWayValue == 1) return true; // 1 - 默认解锁
        if (unlockWayValue == 2) // 2 - 道具解锁
        {
            case PhantasmPavilionUnlockWay.Activate:
                return true;
            case PhantasmPavilionUnlockWay.Hero:
                bool hasHero = HeroManager.Instance.HasHero(unlockValue);
                return hasHero;
            case PhantasmPavilionUnlockWay.Item:
                // 封包里没有
                if (!TryGetInfo(type, id, out var info))
                    return false;
                // 玩家数据中的状态是“未激活”
                if (!info.State)
                    return false;
                // 是否为“已过期的道具”
                if (IsExpired(info, unlockWay))
                    return false;
                return true;
            case PhantasmPavilionUnlockWay.Skin:
                bool hasSkin = HeroUIManager.Instance.IsHeroSkinActive(HeroConfig.GetHeroIDBySkinID(unlockValue), unlockValue);
                return hasSkin;
            case PhantasmPavilionUnlockWay.Model:
                // 如果对应的形象已解锁,则该头像也解锁
                return IsUnlock(PhantasmPavilionType.Model, unlockValue);
            default:
                return false;
            if (!TryGetInfo(type, id, out var info)) return false;
            if (!info.State) return false;
            if (IsExpired(info, PhantasmPavilionUnlockWay.Item)) return false;
            return true;
        }
        // 3、4、5及以上全部交给分发函数按表格类型独立处理
        return CheckTableSpecificUnlock(type, unlockWayValue, unlockValue);
    }
    /// <summary>
    /// 获得当前状态
    /// </summary>
    /// <returns>0 - 未激活, 1 - 可激活, 2 - 已激活</returns>
    public PhantasmPavilionState GetUnLockState(PhantasmPavilionType type, int id)
    {
        // 配置表中不存在,视为“未激活”
        if (!Has(type, id))
            return PhantasmPavilionState.Locked;
        if (!Has(type, id)) return PhantasmPavilionState.Locked;
        // 已经解锁
        if (IsUnlock(type, id))
            return PhantasmPavilionState.Activated;
        // 如果已经满足解锁条件,直接返回 Activated
        if (IsUnlock(type, id)) return PhantasmPavilionState.Activated;
        // 运行到这里,说明物品是“未激活”或“已过期”状态 (IsUnlock 返回 false)
        // 无效的解锁方式
        int unlockWayValue = GetUnlockWay(type, id);
        if (!Enum.IsDefined(typeof(PhantasmPavilionUnlockWay), unlockWayValue))
            return PhantasmPavilionState.Locked;
        var unlockWay = (PhantasmPavilionUnlockWay)unlockWayValue;
        int unlockValue = GetUnlockValue(type, id);
        switch (unlockWay)
        // 只有道具解锁(2)存在"未激活但材料足够"的特有中间状态
        if (unlockWayValue == 2)
        {
            // 检查道具激活条件
            case PhantasmPavilionUnlockWay.Item:
                return CheckCanActivateByItem(type, id, unlockValue)
                    ? PhantasmPavilionState.CanActivate
                    : PhantasmPavilionState.Locked;
            // 检查武将激活条件
            case PhantasmPavilionUnlockWay.Hero:
                int heroID = unlockValue;
                return HeroManager.Instance.HasHero(heroID)
                    ? PhantasmPavilionState.Activated
                    : PhantasmPavilionState.Locked;
            case PhantasmPavilionUnlockWay.Skin:
                return HeroUIManager.Instance.IsHeroSkinActive(HeroConfig.GetHeroIDBySkinID(unlockValue), unlockValue)
                    ? PhantasmPavilionState.Activated
                    : PhantasmPavilionState.Locked;
            case PhantasmPavilionUnlockWay.Model:
                return IsUnlock(PhantasmPavilionType.Model, unlockValue)
                    ? PhantasmPavilionState.Activated
                    : PhantasmPavilionState.Locked;
            default:
                return PhantasmPavilionState.Locked;
            return CheckCanActivateByItem(type, id, unlockValue)
                ? PhantasmPavilionState.CanActivate
                : PhantasmPavilionState.Locked;
        }
        // 其他关联解锁如果不满足 IsUnlock,则必定是 Locked 状态
        return PhantasmPavilionState.Locked;
    }
    // 检查是否满足“通过道具激活”的条件
    private bool CheckCanActivateByItem(PhantasmPavilionType type, int id, int itemId)
@@ -636,6 +588,31 @@
        return true;
    }
    /// <summary>
    /// 根据所属表格(Type)解析 UnlockWay 的特定含义并判断是否满足条件 (排除 UnlockWay 1 和 2)
    /// </summary>
    public bool CheckTableSpecificUnlock(PhantasmPavilionType type, int unlockWay, int unlockValue)
    {
        switch (type)
        {
            case PhantasmPavilionType.Face:
                // 头像表独有的 UnlockWay 解析规则
                if (unlockWay == 3) return HeroManager.Instance.HasHero(unlockValue);
                if (unlockWay == 4) return HeroUIManager.Instance.IsHeroSkinActive(HeroConfig.GetHeroIDBySkinID(unlockValue), unlockValue);
                if (unlockWay == 5) return IsUnlock(PhantasmPavilionType.Model, unlockValue); // 关联形象
                break;
            case PhantasmPavilionType.FacePic:
            case PhantasmPavilionType.ChatBox:
            case PhantasmPavilionType.Title:
            case PhantasmPavilionType.Model:
                // 其他表目前的共有解析规则
                if (unlockWay == 3) return HeroManager.Instance.HasHero(unlockValue);
                if (unlockWay == 4) return HeroUIManager.Instance.IsHeroSkinActive(HeroConfig.GetHeroIDBySkinID(unlockValue), unlockValue);
                break;
        }
        return false;
    }
    public void CheckTimeOut()
    {
        bool isTimeOut = false;
Main/System/PhantasmPavilion/PhantasmPavilionUnlockButton.cs
@@ -24,40 +24,24 @@
                int useCnt = manager.GetUnlockNeedCnt(type, id);
                if (useCnt > hasCnt)
                {
                    if (!ItemConfig.HasKey(unlockValue))
                        return;
                    if (!ItemConfig.HasKey(unlockValue)) return;
                    string name = ItemConfig.Get(unlockValue).ItemName;
                    SysNotifyMgr.Instance.ShowTip("UnLockFail2", name);
                    return;
                }
            }
            else if (unlockWay == 3)
            else if (unlockWay != 1) // 统一处理 3, 4, 5 以及未来自定义的类型
            {
                bool hasHero = HeroManager.Instance.HasHero(unlockValue);
                if (!hasHero)
                // UI 层不再硬编码含义,直接调用基于 Type 的校验
                bool canUnlock = manager.CheckTableSpecificUnlock(type, unlockWay, unlockValue);
                if (!canUnlock)
                {
                    SysNotifyMgr.Instance.ShowTip("UnLockFail1");
                    // 这里统一复用 UnLockFail1,或未来在 CheckTableSpecificUnlock 中返回更具体的错误枚举
                    SysNotifyMgr.Instance.ShowTip("UnLockFail1");
                    return;
                }
            }
            else if (unlockWay == 4) // 新增:如果是皮肤解锁
            {
                bool hasSkin = HeroUIManager.Instance.IsHeroSkinActive(HeroConfig.GetHeroIDBySkinID(unlockValue), unlockValue);
                if (!hasSkin)
                {
                    SysNotifyMgr.Instance.ShowTip("UnLockFail1");
                    return;
                }
            }
            else if (unlockWay == 5) // 如果是形象解锁
            {
                bool hasModel = manager.IsUnlock(PhantasmPavilionType.Model, unlockValue);
                if (!hasModel)
                {
                    SysNotifyMgr.Instance.ShowTip("UnLockFail1"); // 可以根据需要换成对应的语言包 Key,如 "形象未解锁"
                    return;
                }
            }
            manager.SendOPPack(type, PhantasmPavilionOperation.Activate, (uint)id);
            SysNotifyMgr.Instance.ShowTip("UnLockSuccess");
        });