Files
JJBB/Assets/Project/Script/Player/Mission/CollectItem.cs
2024-08-23 15:49:34 +08:00

456 lines
19 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/********************************************************************************
* 文件名CollectItem.cs
* 全路径: \Script\Mission\CollectItem.cs
* 创建人: 贺文鹏
* 创建时间2014-02-17
*
* 功能说明: 客户端采集物品逻辑,刷新场景内物品 CollectItem.txt表配置。
*
* 修改记录:
*********************************************************************************/
using System.Collections.Generic;
using Games.Events;
using Games.GlobeDefine;
using Games.LogicObj;
using Games.Mission;
using GCGame.Table;
using UnityEngine;
using Module.Log;
public class CollectItem : Singleton<CollectItem>
{
private readonly List<CollectItemData> _itemList = new List<CollectItemData>();
private GameObject m_ItemObj;
private int m_MissionID;
public CollectItem()
{
CleanUp();
}
public void CleanUp()
{
m_MissionID = -1;
}
// 创建item
private int _curSeceneId = -1;
public void InitCollectItem(int nSceneId)
{
if (nSceneId < 0)
return;
ClearMissionCollectitemInfo();
_curSeceneId = nSceneId;
CleanUp();
// 注这个管理器实际是无法管理物体析构情况的物体析构由Unity场景切换处理因此每次重新生成都试图重新扫描物体
// 隐藏非当前场景的采集物体
for (var i = _itemList.Count - 1; i >= 0; i--)
{
var item = _itemList[i];
if (item.collectItem == null || item.collectItem.gameObject == null)
_itemList.RemoveAt(i);
else if (item.sceneId != nSceneId)
item.collectItem.gameObject.SetActive(false);
}
var collectItemList = TableManager.GetCollectItemByID(nSceneId);
// 开启全部需要的采集物
if (collectItemList != null)
{
foreach (var collectItem in collectItemList)
{
if (collectItem != null)
{
for (var i = 0; i < collectItem.Count; i++)
{
//判断是否需要任务才显示
if(!collectItem.ShowMissionParam.Equals("-1"))
{
continue;
}
var strName = "CollectItem" + collectItem.Index + "_" + i;
var item = _itemList.Find(a => a.sceneId == nSceneId && a.index == collectItem.Index);
if (item == null)
{
var initData = new Obj_Init_CollectItem
{
m_fX = collectItem.PosX,
m_fZ = collectItem.PosZ,
collectItem = collectItem,
index = i,
m_StrName = strName
};
var newObj = Singleton<ObjManager>.Instance.NewCharacterObj(
GameDefine_Globe.OBJ_TYPE.OBJ_COLLECTITEM,
initData);
item = new CollectItemData
{
collectItem = newObj,
index = collectItem.Index,
sceneId = nSceneId,
};
_itemList.Add(item);
}
else
item.collectItem.gameObject.SetActive(true);
}
}
}
}
//切换场景的时候要刷新一次当前任务需要创建的Item
InitMissionCollectItem();
}
private readonly List<ShowMissionCollectItem> missionCollectItemList = new List<ShowMissionCollectItem>();
private struct ShowMissionCollectItem
{
public int showMissionId;
public int deleteMissionId;
public int showMissionIndex;
public int deleMissionIndex;
public bool isShowCollectItemWhenMissionComplete;
public bool isDeleteCollectItemWhenMissionComplete;
public Tab_CollectItem collectItemTab;
public ShowMissionCollectItem(int showId, int showIndex, int deleteId, int deleteIndex, bool isShow, bool isDelete, Tab_CollectItem tab)
{
showMissionId = showId;
showMissionIndex = showIndex;
isShowCollectItemWhenMissionComplete = isShow;
deleteMissionId = deleteId;
deleMissionIndex = deleteIndex;
isDeleteCollectItemWhenMissionComplete = isDelete;
collectItemTab = tab;
}
}
//要在切换场景的时候调用
public void ClearMissionCollectitemInfo()
{
missionCollectItemList.Clear();
}
void GetAllMissionCollectItemInfo()
{
var collectItemList = TableManager.GetCollectItemByID(_curSeceneId);
if (collectItemList == null)
return;
for(int index = 0; index < collectItemList.Count; index++)
{
if (!collectItemList[index].ShowMissionParam.Equals("-1"))
{
var showMissionParam = collectItemList[index].ShowMissionParam;
var deleteMissionParam = collectItemList[index].DeleteMissionParam;
var showMissionId = int.Parse(showMissionParam.Split('|')[0]);
var deleteMisisonId = int.Parse(deleteMissionParam.Split('|')[0]);
var showMissionIndex = int.Parse(showMissionParam.Split('|')[1]);
var deleteMissionIndex = int.Parse(deleteMissionParam.Split('|')[1]);
var isShowWhenComplete = showMissionParam.Split('|')[1].Equals("-1");
var isDeleteWhenComplete = deleteMissionParam.Split('|')[1].Equals("-1");
ShowMissionCollectItem info = new ShowMissionCollectItem(showMissionId,
showMissionIndex, deleteMisisonId, deleteMissionIndex, isShowWhenComplete, isDeleteWhenComplete, collectItemList[index]);
missionCollectItemList.Add(info);
}
}
}
public void InitMissionCollectItem()
{
if (missionCollectItemList.Count == 0)
GetAllMissionCollectItemInfo();
foreach (var mission in GameManager.gameManager.MissionManager.MissionList.m_aMission)
{
//只用判断主线任务的ID
var missionBase = TableManager.GetMissionBaseByID(mission.Key, 0);
if(missionBase.MissionType == (int)MISSIONTYPE.MISSION_MAIN)
{
var missionId = missionBase.Id;
for(int index = 0; index < missionCollectItemList.Count; index++)
{
var _isRemoveItem = false;
var missionCollectItemInfo = missionCollectItemList[index];
if (missionId >= missionCollectItemInfo.showMissionId && missionId <= missionCollectItemInfo.deleteMissionId)
{
//是否已经达到删除的条件
if (missionId == missionCollectItemInfo.deleteMissionId)
{
if(missionCollectItemInfo.isDeleteCollectItemWhenMissionComplete )
{
if(GameManager.gameManager.MissionManager.GetMissionState(missionId) == (int)MissionState.Mission_Completed)
{
//达到删除条件
for (int itemListIndex = 0; itemListIndex < _itemList.Count; itemListIndex++)
{
if (_itemList[itemListIndex].index == missionCollectItemInfo.collectItemTab.Index)
{
RemoveItem(_itemList[itemListIndex].collectItem.gameObject, itemListIndex);
_isRemoveItem = true;
}
}
}
} else
{
if (GameManager.gameManager.MissionManager.getCurMissionIndex(missionId) >= missionCollectItemInfo.deleMissionIndex)
{
//达到删除条件
for (int itemListIndex = 0; itemListIndex < _itemList.Count; itemListIndex++)
{
if (_itemList[itemListIndex].index == missionCollectItemInfo.collectItemTab.Index)
{
RemoveItem(_itemList[itemListIndex].collectItem.gameObject, itemListIndex);
_isRemoveItem = true;
}
}
}
}
}
if (_isRemoveItem)
{
continue;
}
//没有达到删除的条件,判断是否满足创建条件
//分两种情况:1.MisisonId相等那就判断Index跟是否全部完成
//2.missionId大于创建Item需要的MisisonId就直接创建删除的在上面已经判断了。
if (missionId == missionCollectItemInfo.showMissionId)
{
if(missionCollectItemInfo.isShowCollectItemWhenMissionComplete)
{
if(GameManager.gameManager.MissionManager.GetMissionState(missionId) == (int)MissionState.Mission_Completed)
CreateMissionCollectItem(missionCollectItemInfo);
}else
{
if (GameManager.gameManager.MissionManager.getCurMissionIndex(missionId) >= missionCollectItemInfo.showMissionIndex)
{
CreateMissionCollectItem(missionCollectItemInfo);
}else
{
}
}
}else
{
CreateMissionCollectItem(missionCollectItemInfo); //处于创建跟删除之间
}
}
}
break;
}
}
}
private void CreateMissionCollectItem(ShowMissionCollectItem info)
{
if (_curSeceneId != info.collectItemTab.Id)
return; //不是当前场景
var strName = "CollectItem" + info.collectItemTab.Index + "_" + _itemList.Count;
var item = _itemList.Find(a => a.sceneId == _curSeceneId && a.index == info.collectItemTab.Index);
if (item == null || item.collectItem==null || item.collectItem.gameObject == null)
{
if(item!=null)
{
_itemList.Remove(item);
}
var initData = new Obj_Init_CollectItem
{
m_fX = info.collectItemTab.PosX,
m_fZ = info.collectItemTab.PosZ,
collectItem = info.collectItemTab,
index = _itemList.Count,
m_StrName = strName
};
var newObj = Singleton<ObjManager>.Instance.NewCharacterObj(
GameDefine_Globe.OBJ_TYPE.OBJ_COLLECTITEM,
initData);
item = new CollectItemData
{
collectItem = newObj,
index = info.collectItemTab.Index,
sceneId = info.collectItemTab.Id,
};
_itemList.Add(item);
}
else
item.collectItem.gameObject.SetActive(true);
}
// 开始从场景中移除物品
public bool RemoveItem(GameObject ItemObj, int deleteMissionItemIndex = -1)
{
if (ItemObj)
{
if(deleteMissionItemIndex != -1)
{
ItemObj.SetActive(false);
ItemObj.transform.SetParent(null);
return true;
}
// 玩家任务检测
var nMissionIDList = GameManager.gameManager.MissionManager.GetAllMissionID();
var nMissionCount = nMissionIDList.Count;
if (nMissionCount <= 0) return false;
//距离检测
if (Singleton<ObjManager>.GetInstance().MainPlayer == null) return false;
var userPos = Singleton<ObjManager>.GetInstance().MainPlayer.Position;
var TargetPos = ItemObj.transform.position;
TargetPos.y = userPos.y;
//var dis = Vector3.Distance(userPos, TargetPos);
//if (dis > 3f) return false;
Tab_MissionCollectItem CItem = null;
Obj_CollectItem otherGameObj = null;
// 遍历任务
foreach (var nMissionID in nMissionIDList)
{
var MissionTab = TableManager.GetMissionBaseByID(nMissionID, 0);
if (MissionTab == null) continue;
var missionLogic = TableManager.GetMissionLogicByID(MissionTab.LogicID, 0);
if (missionLogic == null) continue;
var m_MissionLogicType =
missionLogic.GetLogicTypebyIndex(
GameManager.gameManager.MissionManager.getCurMissionIndex(nMissionID));
if (m_MissionLogicType == -1) continue;
if (m_MissionLogicType != (int) TableType.Table_CollectItem) continue;
// 任务状态 已完成
if ((int) MissionState.Mission_Completed ==
GameManager.gameManager.MissionManager.GetMissionState(nMissionID)) continue;
CItem = TableManager.GetMissionCollectItemByID(
missionLogic.GetLogicIDbyIndex(
GameManager.gameManager.MissionManager.getCurMissionIndex(nMissionID)), 0);
if (CItem == null) continue;
var gItemObj = Singleton<ObjManager>.GetInstance().FindOtherGameObj(ItemObj.name);
if (gItemObj)
{
otherGameObj = gItemObj.GetComponent<Obj_CollectItem>();
if (otherGameObj && otherGameObj.GetIntParamByIndex(0) == CItem.CharModelID)
{
m_MissionID = nMissionID;
break;
}
}
}
// 无任务
if (m_MissionID < 0) return false;
m_ItemObj = ItemObj;
GameManager.gameManager.SoundManager.PlaySoundEffect(9); //collect
if (Singleton<ObjManager>.GetInstance().MainPlayer)
{
//切换到动作合集状态(各种动作)
Singleton<ObjManager>.GetInstance().MainPlayer.FaceTo(otherGameObj.Position);
Singleton<ObjManager>.GetInstance().MainPlayer
.OnSwithObjAnimState(GameDefine_Globe.OBJ_ANIMSTATE.STATE_FINSH);
if(Singleton<ObjManager>.GetInstance().MainPlayer.AnimLogic)
Singleton<ObjManager>.GetInstance().MainPlayer.AnimLogic.Play(165);
}
// 通知采集条
UIManager.ShowUI(UIInfo.CollectItemSlider,
delegate
{
CollectItemSliderLogic.Instance().setMissionTime(otherGameObj, CItem, CItem.Time, m_MissionID, -1,
CItem.ColliderDesc);
});
return true;
}
return false;
}
// 采集条出发 真正删除物品
public void SafeDeleteItem()
{
if (m_ItemObj)
if (m_MissionID >= 0)
{
var MissionTab = TableManager.GetMissionBaseByID(m_MissionID, 0);
var missionLogic = TableManager.GetMissionLogicByID(MissionTab.LogicID, 0);
var m_Count = missionLogic.getLogicTypeCount();
var m_LogicType = -1;
if (missionLogic == null) return;
if (MissionTab == null) return;
m_LogicType =
missionLogic.GetLogicTypebyIndex(
GameManager.gameManager.MissionManager.getCurMissionIndex(m_MissionID));
if (m_LogicType == -1) return;
if (m_LogicType != (int) TableType.Table_CollectItem) return;
var m_CollectItemId =
missionLogic.GetLogicIDbyIndex(
GameManager.gameManager.MissionManager.getCurMissionIndex(m_MissionID));
var CItem = TableManager.GetMissionCollectItemByID(m_CollectItemId, 0);
if (CItem == null) return;
var gItemObj = Singleton<ObjManager>.GetInstance().FindOtherGameObj(m_ItemObj.name);
if (gItemObj)
{
var otherGameObj = gItemObj.GetComponent<Obj_CollectItem>();
if (otherGameObj && otherGameObj.GetIntParamByIndex(0) == CItem.CharModelID)
{
var index = GameManager.gameManager.MissionManager.getCurMissionIndex(m_MissionID);
GameManager.gameManager.MissionManager.ReqSetMissionParam(m_MissionID, index, m_LogicType);
m_ItemObj = null;
m_MissionID = -1;
ReSeedItemEvent(GameManager.gameManager.RunningScene, otherGameObj.GetIntParamByIndex(1),
otherGameObj.GetIntParamByIndex(2));
}
}
}
}
private void ReSeedItemEvent(int nSceneID, int nSceneIndex, int nItemIndex)
{
var cItem = TableManager.GetCollectItemByID(nSceneID, nSceneIndex);
if (cItem == null) return;
var _event = new GameEvent(GameDefine_Globe.EVENT_DEFINE.EVENT_COLLECTITEM_RESEED);
_event.IsDelay = true;
_event.DelayTime = cItem.AutoLifeTime;
_event.AddIntParam(nSceneID);
_event.AddIntParam(nSceneIndex);
_event.AddIntParam(nItemIndex);
Singleton<EventSystem>.GetInstance().PushEvent(_event);
}
public void ReSeedItems(int nSceneID, int nSceneIndex, int nItemIndex)
{
if (nSceneID < 0 || nSceneID != GameManager.gameManager.RunningScene) return;
var cItem = TableManager.GetCollectItemByID(nSceneID, nItemIndex);
if (cItem == null) return;
var strName = "CollectItem" + cItem.Index + nItemIndex;
var gItemObj = Singleton<ObjManager>.GetInstance().FindOtherGameObj(strName);
if (gItemObj) gItemObj.gameObject.SetActive(true);
}
private class CollectItemData
{
public int sceneId;
public int index;
public ObjParent collectItem;
}
}