hch
2025-08-15 7bd85eb8d0b9664f4645534b42c82ab0f32754d3
Main/System/Equip/EquipModel.cs
@@ -3,36 +3,63 @@
using UnityEngine;
using System;
using LitJson;
using UnityEngine.UI;
public class EquipModel : GameSystemManager<EquipModel>
{
    EquipSet equipSet = new EquipSet(0);
    public bool waitEquipOPPack = false;
    public event Action<bool, int > OnEquipOPResultAction;    //是否换上了新装备且分解了 装备索引
    public event Action<List<int>, RectTransform> OnItemDropEvent;
    //用于飘动逻辑
    // public Dictionary<int, EquipOnFloorInfo> equipFloorInfo = new Dictionary<int, EquipOnFloorInfo>(); //真实背包的索引,对应地板装备的信息
    public void OnPlayerLoginOk()
    {
    }
    public int[] equipUIEffectLights;  //装备掉落特效
    public float[] dropEffectScales;    //掉装备的动画缩放
    public Dictionary<int, int> newEquipIDToGuideID = new Dictionary<int, int>();  //装备掉落id,引导的id
    public int[] equipUIEffects;  //装备TIP面板特效
    public int[] equipUIGirdEffects;  //装备格子特效
    public ItemModel selectFloorEquip; //选中的地板装备
    public int lastShowEquipIndex = -1;  //上一次界面显示装备的索引,拾取后物品消失需记录下做表现
    public Queue<int> waitEquipOP = new Queue<int>();    //等待操作的装备,需要和UI交互确认
    public override void Init()
    {
        DTCA814_tagMCMakeItemAnswer.MakeItemAnswerEvent += OnEquipResult;
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += BeforePlayerDataInitialize;
        EventBroadcast.Instance.AddListener<string, BattleDrops, Action>(EventName.BATTLE_DROP_ITEMS, OnDropEvent);
        ParseConfig();
    }
    public override void Release()
    {
        DTCA814_tagMCMakeItemAnswer.MakeItemAnswerEvent -= OnEquipResult;
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= BeforePlayerDataInitialize;
        EventBroadcast.Instance.RemoveListener<string, BattleDrops, Action>(EventName.BATTLE_DROP_ITEMS, OnDropEvent);
    }
    public Dictionary<int, int> EquipLevelFuncID = new Dictionary<int, int>();
    public void OnAfterPlayerDataInitialize()
    void ParseConfig()
    {
        var config = FuncConfigConfig.Get("DropItem");
        equipUIEffectLights = JsonMapper.ToObject<int[]>(config.Numerical1);
        dropEffectScales = JsonMapper.ToObject<float[]>(config.Numerical2);
        newEquipIDToGuideID = ConfigParse.ParseIntDict(config.Numerical3);
        config = FuncConfigConfig.Get("EquipTip");
        equipUIEffects = JsonMapper.ToObject<int[]>(config.Numerical1);
    }
    void BeforePlayerDataInitialize()
    {
        //断线重连不处理
        if (DTC0102_tagCDBPlayer.isAfterPlayerDataInitialize)
            return;
        selectFloorEquip = null;
        waitEquipOP.Clear();
        lastShowEquipIndex = -1;
    }
    public static int GetItemServerEquipPlace(int itemId)
    {
@@ -42,44 +69,283 @@
            return -1;
        }
        var serverEquipPlace = -1;
        switch ((RoleEquipType)config.EquipPlace)
        if (config.EquipPlace > 0 && config.EquipPlace < 13)
        {
            case RoleEquipType.Weapon:
            case RoleEquipType.Weapon2:
            case RoleEquipType.Hat:
            case RoleEquipType.Clothes:
            case RoleEquipType.Belt:
            case RoleEquipType.Trousers:
            case RoleEquipType.Shoes:
            case RoleEquipType.Neck:
            case RoleEquipType.FairyCan1:
            case RoleEquipType.FairyCan2:
            case RoleEquipType.Glove:
            case RoleEquipType.Jade:
                serverEquipPlace = EquipSet.ClientPlaceToServerPlace(new Int2(config.LV, config.EquipPlace));
                break;
            case RoleEquipType.Wing:
            case RoleEquipType.Guard:
            case RoleEquipType.PeerlessWeapon1:
            case RoleEquipType.PeerlessWeapon2:
                serverEquipPlace = EquipSet.ClientPlaceToServerPlace(new Int2(0, config.EquipPlace));
                break;
            return config.EquipPlace - 1;
        }
        return serverEquipPlace;
        return -1;
    }
    public int CompareToCurrent(string equipGuid)
    void OnDropEvent(string guid, BattleDrops drops, Action action)
    {
        NotifyItemDrop(drops.dropItemPackIndex, drops.rectTransform);
        action?.Invoke();
    }
    //掉落通知
    public void NotifyItemDrop(List<int> indexs, RectTransform rect)
    {
        var item = PackManager.Instance.GetItemByGuid(equipGuid);
        // 界面不显示则立即处理
        if (!UIManager.Instance.IsOpened<HomeWin>())
        {
            for (int i = 0; i < indexs.Count; i++)
            {
                CalcFloorEquip(indexs[i]);
            }
        }
        else
        {
            OnItemDropEvent?.Invoke(indexs, rect);
        }
    }
    public void CalcFloorEquip(int itemIndex)
    {
        if (itemIndex == -1)
            return;
        var item = PackManager.Instance.GetItemByIndex(PackType.DropItem, itemIndex);
        if (item == null)
            return;
        //非自动模式下,筛选装备打开装备操作界面
        if (IsEquip(item))
        {
            OpenEquipExchangeWin(item);
        }
        else
        {
            SendEquipOP(new ushort[] { (ushort)itemIndex }, 0);
        }
    }
    private void OnEquipResult(HA814_tagMCMakeItemAnswer info)
    {
        if (info.MakeType != (int)MakeType.EquipOP)
            return;
        if (info.MakeValue == 0)
            return;
        waitEquipOPPack = false;
        bool isDone = false;    // 换上新装备且分解了旧装备
        //选中的地板装备进行处理,替换还是找下一件,检查OnEquipOPResultAction
        if (selectFloorEquip != null)
        {
            Debug.Log("OnEquipResult selectFloorEquip ID:" + selectFloorEquip.itemId);
            if (PackManager.Instance.GetItemByIndex(PackType.DropItem, selectFloorEquip.gridIndex) == null)
            {
                selectFloorEquip = GetSelectFloorEquip();    //删除已选择的装备
                if (info.MakeValue == 2)
                    isDone = true;
            }
        }
        else
        {
            selectFloorEquip = GetSelectFloorEquip();
            if (info.MakeValue == 2)
                isDone = true;
        }
        if (selectFloorEquip == null)
        {
            if (UIManager.Instance.IsOpened<EquipExchangeWin>())
            {
                UIManager.Instance.CloseWindow<EquipExchangeWin>();
            }
        }
        else
        {
            if (!UIManager.Instance.IsOpened<EquipExchangeWin>())
            {
                UIManager.Instance.OpenWindow<EquipExchangeWin>();
            }
        }
        OnEquipOPResultAction?.Invoke(isDone, lastShowEquipIndex);
    }
    /// <summary>
    /// 装备操作, // 0 - 拾取非装备物品;1 - 分解;2 - 穿戴/替换
    /// </summary>
    /// <param name="itemIndexList"></param>
    /// <param name="opType"></param>
    /// <param name="autoDecompose"></param>
    public void SendEquipOP(ushort[] itemIndexList, byte opType, bool autoDecompose = false)
    {
        if (waitEquipOPPack) return;
        // NoteFloorEquip(itemIndexList, opType);
        var pack = new CB415_tagCSMainDropItemOP();
        pack.Count = (byte)itemIndexList.Length;
        pack.IndexList = itemIndexList;
        pack.OPType = opType;
        pack.OPValue = (byte)(autoDecompose ? 1 : 0); // 替换后是否自动分解原装备:0否1是
        if (opType > 0)
            waitEquipOPPack = true;
        GameNetSystem.Instance.SendInfo(pack);
    }
    /// <summary>
    /// equipFloorInfo记录地板道具的最新一次信息,用于替换和分解装备的表现
    /// </summary>
    /// <param name="itemIndexList">地板道具索引</param>
    /// <param name="opType"></param>
    // public void NoteFloorEquip(ushort[] itemIndexList, int opType)
    // {
    //     equipFloorInfo.Clear();
    //     foreach (var girdIndex in itemIndexList)
    //     {
    //         var equip = PackManager.Instance.GetItemByIndex(PackType.DropItem, girdIndex);
    //         if (equip == null) continue;
    //         equipFloorInfo[girdIndex] = new EquipOnFloorInfo()
    //         {
    //             equipID = equip.itemId,
    //             posX = floorItemCellArr[girdIndex].transform.position.x,
    //             posY = floorItemCellArr[girdIndex].transform.position.y,
    //             opType = opType
    //         };
    //     }
    // }
    public class EquipOnFloorInfo
    {
        public int equipID; //道具或者装备,道具分解对应不同货币,装备固定货币
        public float posX;  //全局坐标 表现再转成local
        public float posY;
        public int opType;  // 0 - 拾取非装备物品;1 - 分解;2 - 穿戴/替换;
    }
    // public EquipOnFloorInfo FindExchangeEquipInfo()
    // {
    //     foreach (var info in equipFloorInfo)
    //     {
    //         if (info.Value.opType == 2)
    //             return info.Value;
    //     }
    //     return new EquipOnFloorInfo();
    // }
    public bool OpenEquipExchangeWin(ItemModel equip)
    {
        if (equip == null)
            return false;
        // if (!IsEquip(equip))
        //     return false;
        waitEquipOP.Enqueue(equip.gridIndex);
        //未回复装备操作结果,否则会显示旧装备
        if (waitEquipOPPack)
            return false;
        // 后续补充引导或者其他情况下,不允许切换装备界面
        // if (NewBieCenter.Instance.inGuiding)
        //     return;
        if (UIManager.Instance.IsOpened<EquipExchangeWin>())
        {
            return false;
        }
        selectFloorEquip = GetSelectFloorEquip();
        UIManager.Instance.OpenWindow<EquipExchangeWin>();
        return true;
    }
    ItemModel GetSelectFloorEquip()
    {
        if (waitEquipOP.Count == 0)
            return null;
        ItemModel item = PackManager.Instance.GetItemByIndex(PackType.DropItem, waitEquipOP.Dequeue());
        if (AutoFightModel.Instance.isAutoAttack)
        {
            //自动战力对比, 条件不满足的分解
            return null;
        }
        return item;
    }
    //等级
    public int GetEquipLV(ItemModel equip)
    {
        if (equip == null)
        {
            return 0;
        }
        return equip.GetUseDataFirstValue(22);
    }
        return equipSet.CompareToCurrent(equipGuid);
    //基础属性ID列表
    public List<int> GetEquipBaseAttrs(ItemModel equip)
    {
        if (equip == null)
        {
            return new List<int>();
        }
        return equip.GetUseData(21);
    }
    //基础属性值列表
    public List<int> GetEquipBaseValues(ItemModel equip)
    {
        if (equip == null)
        {
            return new List<int>();
        }
        return equip.GetUseData(23);
    }
    //战斗属性ID列表
    public List<int> GetEquipFightAttrs(ItemModel equip)
    {
        if (equip == null)
        {
            return new List<int>();
        }
        return equip.GetUseData(17);
    }
    //战斗属性值列表
    public List<int> GetEquipFightValues(ItemModel equip)
    {
        if (equip == null)
        {
            return new List<int>();
        }
        return equip.GetUseData(19);
    }
    //得到装备位对应的部位名称
    public string GetEquipPlaceName(int place)
    {
        return Language.Get("equipPlace" + place);
    }
    //是否装备
    public bool IsEquip(ItemModel item)
    {
        return item.config.EquipPlace != 0;
    }
    public bool IsEquip(int itemID)
    {
        return ItemConfig.Get(itemID).EquipPlace != 0;
    }
}