yyl
2026-05-08 c6a7ac3739907e8bb7c751d408e227e19f246f49
Main/System/PhantasmPavilion/PhantasmPavilionManager.cs
@@ -215,7 +215,7 @@
        int unlockValue = GetUnlockValue(type, id);
        int resourceType = GetResourceType(type, id);
        string resourceValue = GetResourceValue(type, id);
        if ((UnlockWay == 3 || UnlockWay == 4) && resourceValue == "")
        if ((UnlockWay == 3 || UnlockWay == 4 || UnlockWay == 5) && resourceValue == "")
        {
            int skinID = 0;
            if (UnlockWay == 3)
@@ -227,6 +227,12 @@
            else if (UnlockWay == 4)
            {
                skinID = unlockValue; // UnlockValue 直接就是 skinID
            }
            else if (UnlockWay == 5)
            {
                int modelID = unlockValue; // UnlockValue 是 ModelID
                if (!ModelConfig.HasKey(modelID)) return;
                skinID = ModelConfig.Get(modelID).SkinID; // 拿到形象对应的皮肤ID
            }
            if (!HeroSkinConfig.HasKey(skinID)) return;
@@ -552,90 +558,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;
            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;
            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)
@@ -659,6 +624,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;
@@ -977,7 +967,9 @@
    Activate = 1,               // 默认(创角色就可以用的)
    Item,                       // 道具
    Hero,                       // 武将
    Skin,                   // 皮肤
    Skin,                       // 皮肤
    Model,                      // 形象
}
/// 幻境阁物品的状态