| | |
| | | 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) |
| | | { |
| | |
| | | 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; |
| | | } |
| | | } |
| | | |