From aa84cb62bebb9c8a4e586bcc1ec28eb7a16a8860 Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期一, 26 一月 2026 18:10:34 +0800
Subject: [PATCH] 422 子 【内政】命格系统 / 【内政】命格系统-客户端

---
 Main/System/Equip/EquipModel.cs |  527 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 496 insertions(+), 31 deletions(-)

diff --git a/Main/System/Equip/EquipModel.cs b/Main/System/Equip/EquipModel.cs
index bf04d84..f3c8966 100644
--- a/Main/System/Equip/EquipModel.cs
+++ b/Main/System/Equip/EquipModel.cs
@@ -3,35 +3,79 @@
 using UnityEngine;
 using System;
 using LitJson;
+using UnityEngine.UI;
 
 
 public class EquipModel : GameSystemManager<EquipModel>
 {
-    
+    public const int TotleEquip = 12;  //瑁呭鏍忓ぇ灏�
+    public bool waitEquipOPPack = false;    // 绌挎埓瑁呭鐨勬搷浣� 涓嶅惈鍒嗚В
+    public float waitEquipOPTime = 0;
+    public event Action<bool, int> OnEquipOPResultAction;    //鏄惁鎹笂浜嗘柊瑁呭涓斿垎瑙d簡 瑁呭绱㈠紩
+    public event Action<BattleDrops> 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<string> waitEquipOP = new Queue<string>();    //绛夊緟鎿嶄綔鐨勮澶囷紝闇�瑕佸拰UI浜や簰纭 涓嶅惈鍒嗚В
 
-    }
+    public List<int> lastDropIndexs = new List<int>(); //涓婁竴娆℃帀钀界墿鍝佺储寮�
+
+    int lastAttackHeroID = 0;
 
     public override void Init()
     {
-
+        DTCA814_tagMCMakeItemAnswer.MakeItemAnswerEvent += OnEquipResult;
+        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += BeforePlayerDataInitialize;
+        EventBroadcast.Instance.AddListener<string, BattleDrops, Action>(EventName.BATTLE_DROP_ITEMS, OnDropEvent);
+        EventBroadcast.Instance.AddListener<string, SkillConfig, TeamHero>(EventName.BATTLE_CAST_SKILL, OnSkillCast);
+        EventBroadcast.Instance.AddListener<string>(EventName.RECORDPLAYER_END, RecordPlayerEnd);
+        GlobalTimeEvent.Instance.secondEvent += OnSecondEvent;
+        ParseConfig();
     }
 
     public override void Release()
     {
+        DTCA814_tagMCMakeItemAnswer.MakeItemAnswerEvent -= OnEquipResult;
+        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= BeforePlayerDataInitialize;
+        EventBroadcast.Instance.RemoveListener<string, BattleDrops, Action>(EventName.BATTLE_DROP_ITEMS, OnDropEvent);
+        EventBroadcast.Instance.RemoveListener<string, SkillConfig, TeamHero>(EventName.BATTLE_CAST_SKILL, OnSkillCast);
+        EventBroadcast.Instance.RemoveListener<string>(EventName.RECORDPLAYER_END, RecordPlayerEnd);
+        GlobalTimeEvent.Instance.secondEvent -= OnSecondEvent;
     }
 
-    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 (UIManager.Instance.IsOpened<EquipExchangeWin>())
+        {
+            //鍏堝叧闂紝鍚庣画鍐嶅鐞嗘帀钀�
+            UIManager.Instance.CloseWindow<EquipExchangeWin>();
+        }
+        selectFloorEquip = null;
+        waitEquipOP.Clear();
+        lastShowEquipIndex = -1;
+        lastDropIndexs.Clear();
+        waitEquipOPPack = false;
+    }
 
 
     public static int GetItemServerEquipPlace(int itemId)
@@ -42,34 +86,455 @@
             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;
     }
 
+    //琛ㄧ幇鎺夎惤鍜屾嬀鍙栧垎绂诲紑锛屽厛鎺夎惤绛夋湰姝﹀皢鍥炲悎瀹屽叏缁撴潫鍐嶆嬀鍙�
+    void OnDropEvent(string guid, BattleDrops drops, Action action)
+    {
+        if (!string.IsNullOrEmpty(guid))
+            return;
+
+        // lastDropIndexs = drops.dropItemPackIndex;
+        // Debug.Log("-鎺夎惤瑁呭 " + lastDropIndexs.Count + " 涓�" + JsonMapper.ToJson(lastDropIndexs));
+        NotifyItemDrop(drops);
+        action?.Invoke();
+    }
+
+    //鎷惧彇鏃舵満涓轰笅涓�姝﹀皢锛堝惈鏁屾垜锛夋敾鍑� 鎴栬�� 鏈疆缁撶畻锛圡ainFightRequest 鍓嶏級
+    void OnSkillCast(string guid, SkillConfig skillConfig, TeamHero teamHero)
+    {
+        bool checkDrop = false;
+        if (!string.IsNullOrEmpty(guid))
+            return;
+
+        //闃茶寖鍥炴敹鎶ラ敊
+        if (teamHero == null)
+            checkDrop = true;
+        //鍙�氱煡鐜╁姝﹀皢鐨勬垬鏂�
+        else if (teamHero.NPCID != 0)
+            checkDrop = true;
+        else if (teamHero.heroId != lastAttackHeroID)
+        {
+            lastAttackHeroID = teamHero.heroId;
+            checkDrop = true;
+        }
+
+        if (checkDrop)
+        {
+            // CalcAllFloorItems();
+        }
+    }
+
+
+    void RecordPlayerEnd(string guid)
+    {
+        if (!string.IsNullOrEmpty(guid))
+            return;
+
+        CalcAllFloorItems();
+    }
+
+
+    //鎺夎惤閫氱煡
+    public void NotifyItemDrop(BattleDrops drops)//(List<int> indexs, RectTransform rect)
+    {
+        // 鐣岄潰涓嶆樉绀哄垯绔嬪嵆澶勭悊
+        // if (!UIManager.Instance.IsOpened<HomeWin>())
+        // {
+        //     for (int i = 0; i < indexs.Count; i++)
+        //     {
+        //         CalcFloorEquip(indexs[i]);
+        //     }
+        // }
+        // else
+        // {
+        //     OnItemDropEvent?.Invoke(indexs, rect);
+        // }
+        OnItemDropEvent?.Invoke(drops);
+    }
+
+    public void CalcFloorEquip(int itemIndex)
+    {
+        if (itemIndex == -1)
+        {
+            Debug.Log("CalcFloorEquip 鏃犳晥鐨勭墿鍝佺储寮�");
+            return;
+        }
+
+        var item = PackManager.Instance.GetItemByIndex(PackType.DropItem, itemIndex);
+        if (item == null)
+        {
+            Debug.Log("CalcFloorEquip 鏃犳晥鐨勭墿鍝佺储寮�");
+            return;
+        }
+
+        //闈炶嚜鍔ㄦā寮忎笅锛岀瓫閫夎澶囨墦寮�瑁呭鎿嶄綔鐣岄潰
+        if (IsEquip(item))
+        {
+            OpenEquipExchangeWin(item);
+        }
+        else
+        {
+            SendEquipOP(new ushort[] { (ushort)itemIndex }, 0);
+        }
+    }
+
+    bool needMoreDrop = false; //鐢变簬鎺夎惤鎸ゅ帇瀵艰嚧锛屾弧鎺夎惤鎺夎惤鑳屽寘鐨勬椂鍊欏鐞嗗悗鍐嶄富鍔ㄨ姹傛帀钀�
+    //澶勭悊鎵�鏈夋帀钀界殑鐗╁搧
+    public void CalcAllFloorItems()
+    {
+
+        var items = PackManager.Instance.GetItems(PackType.DropItem);
+        if (items.IsNullOrEmpty())
+            return;
+
+        int cnt = items.Count;
+        needMoreDrop = cnt == 20;
+
+        //鏋勫缓鎵�鏈夌墿鍝�
+        foreach (var item in items)
+        {
+            CalcFloorEquip(item.gridIndex);
+        }
+        if (needMoreDrop)
+        {
+            SendEquipOP(null, 3);
+            needMoreDrop = false;
+        }
+    }
+
+
+    void OnSecondEvent()
+    {
+        if (waitEquipOPPack && Time.time - waitEquipOPTime > 2)
+        {
+            //閬垮厤瑁呭鍗℃鏃犳硶缁х画涓荤嚎
+            waitEquipOPPack = false;
+        }
+    }
+
+    private void OnEquipResult(HA814_tagMCMakeItemAnswer info)
+    {
+        if (info.MakeType != (int)MakeType.EquipOP)
+            return;
+        if (info.MakeValue == 0)
+            return;
+
+        if (info.MakeValue == 2)
+        {
+            waitEquipOPPack = false;
+            Debug.LogWarning("绌挎埓瑁呭锛屾湇鍔″櫒鍝嶅簲瑙i櫎绛夊緟鐘舵��");
+        }
+        bool isDone = false;    // 鎹笂鏂拌澶囦笖鍒嗚В浜嗘棫瑁呭
+        //閫変腑鐨勫湴鏉胯澶囪繘琛屽鐞嗭紝鏇挎崲杩樻槸鎵句笅涓�浠讹紝妫�鏌nEquipOPResultAction
+        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>();
+        //     // }
+
+        //     //缁х画澶勭悊涓嬩竴浠惰澶� 閲嶆柊鍒ゆ柇
+        //     CalcFloorEquip(selectFloorEquip.gridIndex);
+        // }
+
+        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 (!DTC0403_tagPlayerLoginLoadOK.finishedLogin)
+        {
+            return;
+        }
+        if (opType == 2 && waitEquipOPPack) return;
+
+        // NoteFloorEquip(itemIndexList, opType);
+        var pack = new CB415_tagCSMainDropItemOP();
+        if (itemIndexList != null)
+        {
+            pack.Count = (byte)itemIndexList.Length;
+            pack.IndexList = itemIndexList;
+        }
+        pack.OPType = opType;
+        pack.OPValue = (byte)(autoDecompose ? 1 : 0); // 鏇挎崲鍚庢槸鍚﹁嚜鍔ㄥ垎瑙e師瑁呭锛�0鍚�1鏄�
+
+        if (opType == 2)
+        {
+            waitEquipOPPack = true;
+            waitEquipOPTime = Time.time;
+            Debug.LogWarning("绌挎埓瑁呭锛屽悜鏈嶅姟鍣ㄨ姹�");
+        }
+
+        //璁板綍閿�姣佹垨鏇挎崲鍓嶇殑瑁呭
+        if ((opType == 1 || opType == 2) && !itemIndexList.IsNullOrEmpty())
+        {
+            foreach (var index in itemIndexList)
+            {
+                ItemModel newEquip = PackManager.Instance.GetItemByIndex(PackType.DropItem, index);
+                if (newEquip == null)
+                    continue;
+                int equipPlace = newEquip.config.EquipPlace - 1;
+                ItemModel oldEquip = PackManager.Instance.GetItemByIndex(PackType.Equip, equipPlace);
+                EquipRecordManager.Instance.AddRecord(opType, newEquip, oldEquip);
+            }
+        }
+        GameNetSystem.Instance.SendInfo(pack);
+    }
+
+    /// <summary>
+    /// equipFloorInfo璁板綍鍦版澘閬撳叿鐨勬渶鏂颁竴娆′俊鎭�,鐢ㄤ簬鏇挎崲鍜屽垎瑙h澶囩殑琛ㄧ幇
+    /// </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;  //鍏ㄥ眬鍧愭爣 琛ㄧ幇鍐嶈浆鎴恖ocal
+        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 (!DTC0403_tagPlayerLoginLoadOK.finishedLogin)
+        {
+            return false;
+        }
+
+        // if (!IsEquip(equip))
+        //     return false;
+
+        if (AutoFightModel.Instance.TryAutoFightDoEquip(equip))
+        {
+            //鑷姩鎴樺姏瀵规瘮, 鏉′欢涓嶆弧瓒崇殑鍒嗚В
+            return false;
+        }
+
+        // 濂藉嚑浠惰澶囬渶瑕佸鐞嗙殑鎯呭喌瀛樿捣鏉�
+        if (!waitEquipOP.Contains(equip.guid))
+        {
+            //妫�娴嬫椂鏈洪绻侊紝瀵艰嚧閲嶅鎺ㄩ�侊紝闇�瑕佹娴嬭繃婊わ紝瀵瑰簲Dequeue 涔熷仛涓�娆℃娴�
+            waitEquipOP.Enqueue(equip.guid);
+        }
+        //鏈洖澶嶈澶囨搷浣滅粨鏋滐紝鍚﹀垯浼氭樉绀烘棫瑁呭
+        if (waitEquipOPPack)
+        {
+            return false;
+        }
+
+
+        if (UIManager.Instance.IsOpened<EquipExchangeWin>())
+        {
+            return false;
+        }
+
+
+        selectFloorEquip = GetSelectFloorEquip();
+        if (selectFloorEquip == null)
+        {
+            return false;
+        }
+        UIManager.Instance.OpenWindow<EquipExchangeWin>();
+        return true;
+
+    }
+
+
+    ItemModel GetSelectFloorEquip()
+    {
+        if (waitEquipOP.Count == 0)
+            return null;
+
+        // 鏂版墜寮曞涓紝涓嶅厑璁稿垏鎹㈣澶囩晫闈�
+        if (NewBieCenter.Instance.inGuiding)
+        {
+            Debug.LogWarning("GetSelectFloorEquip: 鏂版墜寮曞涓紝涓嶅厑璁稿垏鎹㈣澶囩晫闈�");
+            return null;
+        }
+
+        string activeBattleName = BattleManager.Instance.GetActiveBattleName();
+        if (activeBattleName != "" && activeBattleName != "StoryBattleField")
+        {
+            Debug.LogWarning("闈炰富绾挎垬鏂椾笉寮圭獥");
+            return null;
+        }
+
+        var item = PackManager.Instance.GetItemByGuid(waitEquipOP.Dequeue());
+        if (item != null && item.packType == PackType.DropItem)
+        {
+            return item;
+        }
+        // Debug.LogError("GetSelectFloorEquip: 娌℃湁鎵惧埌鍙�夎澶�, 璇ヨ澶囧凡缁忚浆绉�");
+        return null;
+    }
+
+
+
+    //绛夌骇
+    public int GetEquipLV(ItemModel equip)
+    {
+        if (equip == null)
+        {
+            return 0;
+        }
+
+        return equip.GetUseDataFirstValue(22);
+    }
+
+    //鍩虹灞炴�D鍒楄〃
+    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);
+    }
+
+    //瑁呭鎴樻枟灞炴�D鍒楄〃, 濡傛灉鏄崷鐜夌殑璇濆熀纭�鍜屾垬鏂楅兘鏀句竴璧�
+    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);
+    }
+
+    //鎶�鑳絀D鍒楄〃
+    public List<int> GetEquipSkillIDs(ItemModel equip)
+    {
+        if (equip == null)
+        {
+            return new List<int>();
+        }
+        return equip.GetUseData(37);
+    }
+
+    public int GetEquipSkillID(ItemModel equip)
+    {
+        if (equip == null)
+        {
+            return 0;
+        }
+        var _list = equip.GetUseData(37);
+        return _list.IsNullOrEmpty() ? 0 : _list[0];
+    }
+
+
+    //寰楀埌瑁呭浣嶅搴旂殑閮ㄤ綅鍚嶇О
+    public string GetEquipPlaceName(int place)
+    {
+        return Language.Get(string.Concat("equipPlace", place));
+    }
+
+    //鏄惁瑁呭
+    public bool IsEquip(ItemModel item)
+    {
+        return item.config.EquipPlace != 0;
+    }
+
+    public bool IsEquip(int itemID)
+    {
+        return ItemConfig.Get(itemID).EquipPlace != 0;
+    }
+
+    public ItemModel GetEquip(int index)
+    {
+        return PackManager.Instance.GetItemByIndex(PackType.Equip, index);
+    }
 }
 
 

--
Gitblit v1.8.0