using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
///
/// 掉落管理者
///
public class DropManager : MonoBehaviour
{
///
/// 单键
///
private static DropManager m_Instance;
private int _mapId;
private float _refreshItemTime = 1.0f;
private float _nowRefreshTime = 0.0f;
///
/// 掉落道具
///
private List dropItems = new List();
///
/// 统计的掉落道具
///
public static Dictionary statisticsItems = new Dictionary();
public int MapId
{
get
{
return this._mapId;
}
set
{
this._mapId = value;
}
}
private string _dropStr = "";
public string DropStr
{
get
{
return this._dropStr;
}
set
{
this._dropStr = value;
}
}
///
/// 单键
///
public static DropManager Instance
{
get
{
if (m_Instance == null)
{
GameObject obj = new GameObject("DropManager");
DontDestroyOnLoad(obj);
if (obj)
{
m_Instance = obj.AddComponent();
m_Instance.Init();
}
else
{
Debug.LogError("DropManager 初始化失败!!!");
}
}
return m_Instance;
}
}
public void Update()
{
if (_nowRefreshTime < _refreshItemTime)
{
_nowRefreshTime += Time.deltaTime;
if (_nowRefreshTime >= _refreshItemTime)
{
RefreshItem();
}
}
}
public void RefreshItem()
{
_nowRefreshTime = 0;
ItemProxy.Instance.AddItem(0, 0);
}
///
/// 初始化
///
public void Init()
{
dropItems.Clear();
}
///
/// 新的掉落 世界中的所有掉落 指定道具 位置
///
///
///
///
public void DropWorldItem(int itemId, int num, Vector3 pos, DropEffectNode node = null)
{
ItemVo itemVO = new ItemVo();
itemVO.typeId = itemId.ToString();
itemVO.count = num;
SetDropItemData(itemVO, pos, node);
if (statisticsItems.ContainsKey(itemId))
{
statisticsItems[itemId].count += num;
}
else
{
// 血瓶蓝瓶不统计
if (itemVO.nMo.subType != 341 && itemVO.nMo.subType != 342)
{
statisticsItems.Add(itemId, itemVO);
}
}
}
///
/// 新的掉落 怪物死亡 爆宝掉落
///
///
///
public void DropItems(int dropId, Vector3 pos)
{
ResourceHelper.Instance.LoadAssetBundle("diaoluo", (ab) =>
{
sm_drop drop = sm_drop.GetMoById(dropId);
if (drop == null)
{
return;
}
string[] randItems = drop.randItems.Split(';');
string[] assignItems = drop.assignItems.Split(';');
for(int c = 0; c < randItems.Length / 8 + 1; ++c)
{
if (drop.randItems == "")
{
break;
}
GameObject obj = Instantiate(ab.LoadAsset("diaoluo"));
obj.SetActive(true);
obj.transform.position = pos;
obj.transform.Rotate(Vector3.up, UnityEngine.Random.Range(0, 180));
Animator anim = obj.GetComponent();
anim.Play("diaoluo");
DropEffectNode[] nodeList = obj.GetComponentsInChildren();
for (int i = c * 8; i < (c + 1) * 8 && i < randItems.Length; ++i)
{
int contrast = UnityEngine.Random.Range(0, 10000);
string[] randData = randItems[i].Split(',');
string[] itemIdList = randData[0].Split('_');
int itemId = int.Parse(itemIdList[UnityEngine.Random.Range(0, itemIdList.Length - 1)]);
int itemMixNum = int.Parse(randData[1]);
int itemMaxNum = int.Parse(randData[2]);
int itemProbability = (int)(float.Parse(randData[3]) * 100);
if (contrast < itemProbability)
{
int val = UnityEngine.Random.Range(itemMixNum, itemMaxNum);
DropWorldItem(itemId, val, pos, nodeList[i % 8]);
}
}
}
for (int c = 0; c < assignItems.Length / 8 + 1; ++c)
{
if (drop.assignItems == "")
{
break;
}
GameObject obj = Instantiate(ab.LoadAsset("diaoluo"));
obj.SetActive(true);
obj.transform.position = pos;
obj.transform.Rotate(Vector3.up, UnityEngine.Random.Range(0, 180));
Animator anim = obj.GetComponent();
anim.Play("diaoluo");
DropEffectNode[] nodeList = obj.GetComponentsInChildren();
for (int i = c * 8; i < (c + 1) * 8 && i < assignItems.Length; ++i)
{
string[] randData = assignItems[i].Split(',');
string[] itemIdList = randData[0].Split('_');
int itemId = int.Parse(itemIdList[UnityEngine.Random.Range(0,itemIdList.Length - 1)]);
int itemMixNum = int.Parse(randData[1]);
int itemMaxNum = int.Parse(randData[2]);
int val = UnityEngine.Random.Range(itemMixNum, itemMaxNum);
DropWorldItem(itemId, val, pos, nodeList[i % 8]);
}
}
});
}
///
/// 删除道具
///
///
public void RemoveDropItem(DropItemAuto auto)
{
dropItems.Remove(auto);
Destroy(auto.gameObject);
}
///
/// 一件回收所有未捡的掉落道具
///
public void OneKeyGetAllDropItem()
{
for (int i = 0; i < dropItems.Count; i++)
{
if (dropItems[i] != null)
{
ItemProxy.Instance.AddItem(int.Parse(dropItems[i].mItemVo.typeId), dropItems[i].mItemVo.count);
Destroy(dropItems[i].gameObject);
}
}
dropItems.Clear();
// 立马刷新
ItemProxy.Instance.AddItem(0, 0);
}
public void SetDropItemData(ItemVo item, Vector3 pos, DropEffectNode node = null)
{
string iconPrefixStr = null;
if (item.nMo == null)
{
LogHelper.LogError("未知的掉落道具:" + item.typeId);
return;
}
// 道具名称
string showName = item.nMo.name;
switch ((EItemSubType)item.nMo.subType)
{
case EItemSubType.Weapon:
AudioManager.Instance.PlayUISoundEffect("装备掉落");
iconPrefixStr = IconPrefixConst.YLIcon;
break;
case EItemSubType.Gold: // 金币
case EItemSubType.Gem: // 钻石
AudioManager.Instance.PlayUISoundEffect("金币掉落");
iconPrefixStr = IconPrefixConst.YLIcon;
showName = showName + "x" + item.count + "";
break;
case EItemSubType.Segment: // 碎片
case EItemSubType.BuffCard: // 消耗品 | 经验卡
case EItemSubType.Package: // 消耗品 | 礼包
case EItemSubType.Pill: // 药品(体力)
case EItemSubType.Gene: // 基础材料 | 基因(角色经验丹)
{
AudioManager.Instance.PlayUISoundEffect("材料掉落");
iconPrefixStr = IconPrefixConst.YLIcon;
}
break;
case EItemSubType.StrengthStone: // 基础材料 | 强化石(用于武器、言灵强化)
{
AudioManager.Instance.PlayUISoundEffect("装备掉落");
iconPrefixStr = IconPrefixConst.YLIcon;
}
break;
case EItemSubType.AdvancedStone: // 进阶材料 | 进阶石(用于武器、言灵升阶)
{
AudioManager.Instance.PlayUISoundEffect("装备掉落");
iconPrefixStr = IconPrefixConst.YLIcon;
}
break;
case EItemSubType.AdvancedFineStone: // 进阶材料 | 进阶 精华石(用于武器、言灵的升阶)
case EItemSubType.ForgingMaterial: // 锻造材料 | 用于武器言灵锻造
case EItemSubType.Box:
case EItemSubType.BattleItem_HP: // 战场道具 | 血瓶
case EItemSubType.BattleItem_MP: // 战场道具 | 蓝瓶
case EItemSubType.BattleItem_Box: // 战场道具 | 箱子
{
AudioManager.Instance.PlayUISoundEffect("材料掉落");
iconPrefixStr = IconPrefixConst.YLIcon;
}
break;
case EItemSubType.YanLing: // 言灵
{
AudioManager.Instance.PlayUISoundEffect("装备掉落");
iconPrefixStr = IconPrefixConst.YanLingIcon;
}
break;
}
if((EItemSubType)item.nMo.subType != EItemSubType.Gold && item.count > 1)
{
showName = showName + " " + item.count + "";
}
Material material = new Material(Shader.Find("Mobile/Particles/Alpha Blended"));
string dropName = item.nMo.pfbRes;
if(dropName == "")
{
dropName = "Drop_Card_White";
}
ResourceHelper.Instance.LoadAssetBundle(dropName, (AssetBundle bundle) =>
{
if (bundle != null)
{
GameObject itemObj = (GameObject)Instantiate(bundle.LoadAsset(dropName), transform, false);
DropItemAuto auto = itemObj.AddComponent();
itemObj.name = iconPrefixStr + "_" + item.nMo.typeId;
itemObj.transform.position = pos + Vector3.up * 0.5f;
itemObj.SetActive(true);
auto.Init(HeroPlayerController.Instance.m_Hero.transform, item);
// 散落机制
if (node)
{
node.SetDropItem(itemObj.transform);
}
HpbarManager.Instance.ShowItemName(itemObj.transform, showName, item.nMo.quality);
dropItems.Add(auto);
}
});
}
}