using UnityEngine;
|
using vnxbqy.UI;
|
using System.Collections.Generic;
|
|
using System.Collections;
|
using System;
|
|
public class DungeonStage : Stage
|
{
|
public static Dictionary<MapArea.E_Type, List<MapArea>> s_MapAreaDict;
|
public static MapType CurrentMapType;
|
private static Dictionary<int, MapTransfer> s_MapTransferDict = new Dictionary<int, MapTransfer>();
|
private static bool isLastDungeonClient = false;
|
private static bool reAdjustPetPos = false;
|
|
public override void Initialize()
|
{
|
base.Initialize();
|
|
s_MapAreaDict = new Dictionary<MapArea.E_Type, List<MapArea>>();
|
|
CameraController.Instance.CameraObject.enabled = true;
|
|
//屏蔽场景npc资源预加载逻辑,以获得更快的场景切换速度,资源压缩使用LZ4才行。
|
//AssetPreLoad.Instance.PreLoadNPC(PlayerDatas.Instance.baseData.MapID);
|
SelectionManager.Initiailze();
|
|
var dataMapId = MapUtility.GetDataMapId(PlayerDatas.Instance.baseData.MapID);
|
var mapResConfig = MapResourcesConfig.GetConfig(dataMapId, PlayerDatas.Instance.baseData.dungeonLineId);
|
|
SoundPlayer.Instance.UnLoadMusic(mapResConfig.Music);
|
SoundPlayer.Instance.PlayBackGroundMusic(mapResConfig.Music);
|
SceneResourcesReplace();
|
}
|
|
protected override void OnStageLoadFinish()
|
{
|
base.OnStageLoadFinish();
|
|
GA_Hero _hero = PlayerDatas.Instance.hero;
|
if (_hero != null)
|
{
|
_hero.CurMapArea = 0;
|
_hero.aiHandler.PriorityNpcID = 0;
|
_hero.ExitArea((int)MapArea.E_Type.Boss);
|
_hero.ExitArea((int)MapArea.E_Type.Safe);
|
_hero.ExitArea((int)MapArea.E_Type.RebornSafe);
|
_hero.ExitArea((int)MapArea.E_Type.Dazuo);
|
_hero.ExitArea((int)MapArea.E_Type.Alliance);
|
_hero.EnterArea((int)MapArea.E_Type.Normal);
|
CameraController.Instance.ResetOriginal();
|
_hero.needSyncGroundHeight = true;
|
_hero.SelectTarget = null;
|
_hero.LockTarget = null;
|
}
|
|
WindowCenter.Instance.Open<MainInterfaceWin>(true);
|
if (PlayerDatas.Instance.baseData.LV == 1 && !CreateRolePostProcessor.HasPlayMovie((int)PlayerDatas.Instance.baseData.PlayerID))
|
{
|
WindowCenter.Instance.Close<MainInterfaceWin>();
|
CreateRolePostProcessor.Begin(() =>
|
{
|
CreateRolePostProcessor.RecordPlayMovie((int)PlayerDatas.Instance.baseData.PlayerID);
|
WindowCenter.Instance.Open<MainInterfaceWin>(false);
|
|
var taskModel = ModelCenter.Instance.GetModel<TaskModel>();
|
taskModel.AutomaticTripToTask(taskModel.currentMission);
|
});
|
}
|
|
GA_Hero.forceAutoFight = false;
|
|
WindowCenter.Instance.Open<MapNameHintWin>();
|
WindowCenter.Instance.Open<ExperienceGetWin>();
|
WindowCenter.Instance.Open<NewItemGetWin>();
|
WindowCenter.Instance.Open<AttributePromoteShowWin>();
|
WindowCenter.Instance.Open<StatusTipWin>();
|
WindowCenter.Instance.Open<NearDeathWin>();
|
|
CheckDungeonResult();
|
|
CreateMapTransfer();
|
|
StartCoroutine("CreateMapArea");
|
|
var mapConfig = MapConfig.Get(PlayerDatas.Instance.baseData.MapID);
|
CurrentMapType = (MapType)mapConfig.MapFBType;
|
switch (CurrentMapType)
|
{
|
case MapType.OpenCountry:
|
OnEnterOpenCountry();
|
break;
|
default:
|
OnEnterNormalDungeon();
|
break;
|
}
|
|
PlayerDatas.Instance.RequestWorldTick();
|
|
if (DTCB105_tagMCPlayerWallow.forceOffLine)
|
{
|
WindowCenter.Instance.Open<AntiAddictionWin>();
|
}
|
|
if (CrossServerUtility.IsCrossServer())
|
{
|
_hero.SkillMgr.ResetAllCD();
|
}
|
|
ClientSceneManager.Instance.Init();
|
ClientCollectUtility.Init();
|
PrepareHandler.Instance.Init();
|
|
GA_Hero.s_Flying = false;
|
GA_Hero.s_MapSwitching = false;
|
|
if (CurrentMapType == MapType.OpenCountry
|
&& !ClientDungeonStageUtility.isClientDungeon)
|
{
|
JiaPlayerManager.Start = true;
|
}
|
else
|
{
|
|
JiaPlayerManager.Start = false;
|
}
|
}
|
|
public override void UnInitialize()
|
{
|
base.UnInitialize();
|
|
StopAllCoroutines();
|
s_MapTransferDict.Clear();
|
|
if (s_MapAreaDict != null)
|
{
|
foreach (var _list in s_MapAreaDict.Values)
|
{
|
for (int i = _list.Count - 1; i >= 0; --i)
|
{
|
GameObject.Destroy(_list[i].gameObject);
|
}
|
}
|
s_MapAreaDict.Clear();
|
s_MapAreaDict = null;
|
}
|
|
if (PlayerDatas.Instance.hero != null)
|
{
|
PlayerDatas.Instance.hero.atkBossID = 0;
|
PlayerDatas.Instance.hero.currentBossArea = null;
|
PlayerDatas.Instance.hero.SelectTarget = null;
|
PlayerDatas.Instance.hero.LockTarget = null;
|
}
|
|
if (CameraController.Instance != null)
|
{
|
CameraController.Instance.StopZoom();
|
CameraController.Instance.StopShake();
|
}
|
|
if (AdventureStage.Instance.IsInAdventureStage)
|
{
|
AdventureStage.Instance.Exit();
|
}
|
|
JiaPlayerManager.UnInit();
|
PersonalEnemy.ReleaseAll();
|
ClientSceneManager.Instance.UnInit();
|
ClientCollectUtility.UnInit();
|
GAMgr.Instance.UnInit();
|
DropItemManager.ReleaseAll();
|
ClientDropItemUtility.Instance.ReleaseAll();
|
SFXPlayUtility.Instance.Unitialize();
|
JiaDungeonUtility.Instance.Reset();
|
}
|
|
protected override void OnUpdate()
|
{
|
base.OnUpdate();
|
|
StatusMgr.Instance.DoUpdate();
|
|
ClientSceneManager.Instance.Update();
|
|
GAMgr.Instance.DoUpdate();
|
FlyObjectManager.Instance.Update();
|
|
DropItemManager.Update();
|
ClientDropItemUtility.Instance.Update();
|
|
ClientCollectUtility.Update();
|
|
JiaPlayerManager.Update();
|
// if (PreFightMission.Instance.IsFinished() == false)
|
// {
|
// PreFightMission.Instance.Update();
|
// }
|
}
|
|
protected override void OnFixedUpdate()
|
{
|
base.OnFixedUpdate();
|
GAMgr.Instance.DoFixedUpdate();
|
}
|
|
protected override void OnLateUpdate()
|
{
|
base.OnLateUpdate();
|
GAMgr.Instance.DoLateUpdate();
|
}
|
|
private void OnEnterOpenCountry()
|
{
|
var teamModel = ModelCenter.Instance.GetModel<TeamModel>();
|
var isPreparing = !teamModel.teamPrepare.IsAllOk() && !teamModel.teamPrepare.isError && !teamModel.teamPrepare.IsReject();
|
var prepareEndTime = teamModel.prepareBeginTime + new TimeSpan(GeneralDefine.teamReadyTime * TimeSpan.TicksPerSecond);
|
if (prepareEndTime > DateTime.Now)
|
{
|
WindowCenter.Instance.Open<TeamPrepareWin>();
|
}
|
}
|
|
private void OnEnterNormalDungeon()
|
{
|
if (ArenaManager.isArenaClient)
|
return;
|
|
if (!(CrossServerUtility.IsCrossServerOneVsOne() || ClientCrossServerOneVsOne.isClientCrossServerOneVsOne))
|
{
|
WindowCenter.Instance.Open<DungeonFightWin>();
|
}
|
|
WindowCenter.Instance.Open<DungeonBeginCoolDownWin>();
|
WindowCenter.Instance.Open<DungeonEndCoolDownWin>();
|
|
var mapId = PlayerDatas.Instance.baseData.MapID;
|
switch (mapId)
|
{
|
case PersonalBossModel.PERSONALBOSS_MAPID:
|
if (!WindowCenter.Instance.IsOpen<PersonalDropRateWin>())
|
{
|
WindowCenter.Instance.Open<PersonalDropRateWin>();
|
}
|
break;
|
case 31080:
|
{
|
if (!WindowCenter.Instance.IsOpen<DungeonFairyLandWin>())
|
{
|
WindowCenter.Instance.Open<DungeonFairyLandWin>();
|
}
|
}
|
break;
|
case 31150:
|
if (!WindowCenter.Instance.IsOpen<ElderGodAngerWin>())
|
{
|
WindowCenter.Instance.Open<ElderGodAngerWin>();
|
}
|
break;
|
case 4000:
|
WindowCenter.Instance.Close<DungeonBeginCoolDownWin>();
|
WindowCenter.Instance.Close<DungeonEndCoolDownWin>();
|
WindowCenter.Instance.Open<TreasureDungeonMissionHintWin>();
|
break;
|
case TreasureModel.TREASURE_MAPID:
|
WindowCenter.Instance.Open<TreasureDungeonMissionHintWin>();
|
break;
|
case DemonJarModel.DATA_MAPID:
|
case 31140:
|
case JadeDynastyBossModel.JADEDYNASTY_MAP:
|
case HazyDemonKingModel.CLIENTDATAMAP:
|
case HazyDemonKingModel.DATAMAP:
|
case HazyDemonKingModel.CROSSSERVERDATAMAP:
|
WindowCenter.Instance.Open<DungeonPickUpItemCoolDownWin>();
|
break;
|
case FairyLeagueModel.FAIRY_LEAGUE_DUNGEON:
|
SnxxzGame.Instance.StartCoroutine(Co_EnterDungeon(mapId));
|
break;
|
case 31170:
|
WindowCenter.Instance.Close<DungeonStageTimeWin>();
|
break;
|
case AllianceBossModel.DATAMAPID:
|
WindowCenter.Instance.Open<AllianceBossHintWin>();
|
break;
|
case RidingPetBossModel.RIDINGPETBOSS_MAP:
|
WindowCenter.Instance.Open<RidingPetBossHintWin>();
|
break;
|
case FairyBossModel.MapId:
|
WindowCenter.Instance.Open<FairyBossDungeonWin>();
|
break;
|
case HazyGrassModel.REIKI_CLIENTDATAMAP:
|
case HazyGrassModel.FAIRY_CLIENTDATAMAP:
|
case HazyGrassModel.FAIRY_DATAMAP:
|
case HazyGrassModel.REIKI_DATAMAP:
|
WindowCenter.Instance.Close<DungeonEndCoolDownWin>();
|
WindowCenter.Instance.Open<DungeonCollectItemSuccWin>();
|
break;
|
case RealmModel.Tower_MapId:
|
WindowCenter.Instance.Open<RealmTowerHintWin>();
|
ModelCenter.Instance.GetModel<RealmModel>().RequestRefreshMonster();
|
break;
|
default:
|
WindowCenter.Instance.Open<DungeonStageTimeWin>();
|
break;
|
}
|
|
if (ModelCenter.Instance.GetModel<HazyDemonKingModel>().IsInDungeon)
|
{
|
WindowCenter.Instance.Open<HazyDemonKingRewardWin>();
|
//WindowCenter.Instance.Open<HazyDemonKingDungeonWin>();
|
}
|
|
if (ModelCenter.Instance.GetModel<HazyGrassModel>().IsInDungeon)
|
{
|
WindowCenter.Instance.Open<HazyGrassDungeonWin>();
|
}
|
|
// 等待处理开启自动战斗
|
DungeonModel _dungeonModel = ModelCenter.Instance.GetModel<DungeonModel>();
|
if (PlayerDatas.Instance.baseData.MapID == 52020
|
|| PlayerDatas.Instance.baseData.MapID == 52010
|
|| PlayerDatas.Instance.baseData.MapID == JadeDynastyBossModel.JADEDYNASTY_MAP)
|
{
|
_dungeonModel.updateMissionEvent += HandleAutoFight;
|
}
|
else
|
{
|
_dungeonModel.dungeonBeginCoolDownEndEvent += HandleAutoFight;
|
}
|
}
|
|
private void HandleAutoFight()
|
{
|
DungeonModel _dungeonModel = ModelCenter.Instance.GetModel<DungeonModel>();
|
_dungeonModel.dungeonBeginCoolDownEndEvent -= HandleAutoFight;
|
_dungeonModel.updateMissionEvent -= HandleAutoFight;
|
|
int _dgDataID = _dungeonModel.GetDataMapIdByMapId(PlayerDatas.Instance.baseData.MapID);
|
var dungeonOpen = DungeonOpenTimeConfig.Get(_dgDataID);
|
|
if (dungeonOpen != null)
|
{
|
if (dungeonOpen.DoFight == 1)
|
{
|
GA_Hero.forceAutoFight = true;
|
PlayerDatas.Instance.hero.Behaviour.StartHandupAI();
|
}
|
}
|
}
|
|
private void CreateMapTransfer()
|
{
|
s_MapTransferDict.Clear();
|
// 创建传送点
|
var _dict = maptransportConfig.GetValues();
|
foreach (var _item in _dict)
|
{
|
if (_item.OriginalMapID != PlayerDatas.Instance.baseData.MapID)
|
{
|
continue;
|
}
|
|
float _radius = _item.TransportDiameter * .5f;
|
|
GameObject _transport = new GameObject();
|
if (_item.PerformID != 0)
|
{
|
SFXController _controller = SFXPlayUtility.Instance.Play(_item.PerformID, Vector3.zero, Vector3.forward);
|
if (_controller)
|
{
|
_transport = _controller.gameObject;
|
_controller.duration = 0;
|
}
|
}
|
|
#if UNITY_EDITOR
|
_transport.name = "MapTrigger_" + _item.TransportID;
|
#endif
|
|
|
_transport.gameObject.layer = LayerUtility.MapTrigger;
|
Vector3 _position = new Vector3(_item.OriginalPosX * .5f, 100, _item.OriginalPosY * .5f);
|
RaycastHit _hit;
|
if (Physics.Raycast(_position, Vector3.down, out _hit, 200, LayerUtility.WalkbleMask))
|
{
|
_position = _hit.point;
|
_transport.transform.position = _position;
|
}
|
CapsuleCollider _collider = _transport.AddMissingComponent<CapsuleCollider>();
|
_collider.radius = _radius;
|
_collider.height = 10;
|
_collider.isTrigger = true;
|
Renderer _renderer = _transport.GetComponent<Renderer>();
|
if (_renderer)
|
{
|
Destroy(_renderer);
|
}
|
MapTransfer _maptransfer = _transport.AddMissingComponent<MapTransfer>();
|
_maptransfer.transportModel = _item;
|
_maptransfer.TransportID = _item.TransportID;
|
s_MapTransferDict[_item.TransportID] = _maptransfer;
|
}
|
}
|
|
public bool TryGetTransportPosition(int id, out Vector3 pos)
|
{
|
if (s_MapTransferDict.ContainsKey(id))
|
{
|
pos = s_MapTransferDict[id].transform.position;
|
return true;
|
}
|
pos = Vector3.zero;
|
return false;
|
}
|
|
private IEnumerator CreateMapArea()
|
{
|
yield return WaitingForSecondConst.WaitMS200;
|
|
var _dict = mapAreaConfig.GetValues();
|
|
List<MapArea> _list = null;
|
MapArea _areaMono;
|
foreach (var _area in _dict)
|
{
|
if (mapId.Equals(_area.MapID) == false)
|
{
|
continue;
|
}
|
|
_areaMono = MapArea.CreateMapArea(_area);
|
|
if (s_MapAreaDict.TryGetValue((MapArea.E_Type)_area.AreaName, out _list) == false)
|
{
|
_list = new List<MapArea>();
|
s_MapAreaDict.Add((MapArea.E_Type)_area.AreaName, _list);
|
}
|
|
_list.Add(_areaMono);
|
}
|
}
|
|
private void CheckDungeonResult()
|
{
|
MapConfig _mapCfg = MapConfig.Get(PlayerDatas.Instance.baseData.MapID);
|
if (_mapCfg.MapFBType != 0)
|
{
|
return;
|
}
|
var dungeonResult = ModelCenter.Instance.GetModel<DungeonModel>().dungeonResult;
|
if (dungeonResult.dataMapID == 31160)
|
{
|
StartCoroutine(Co_OpenSettleWin(dungeonResult.dataMapID));
|
}
|
}
|
|
IEnumerator Co_OpenSettleWin(int _mapId)
|
{
|
yield return null;
|
yield return null;
|
switch (_mapId)
|
{
|
case 31160:
|
WindowCenter.Instance.Open<ActivitySettleWin>();
|
break;
|
}
|
}
|
|
IEnumerator Co_EnterDungeon(int _mapId)
|
{
|
yield return null;
|
yield return null;
|
switch (_mapId)
|
{
|
case FairyLeagueModel.FAIRY_LEAGUE_DUNGEON:
|
//var _fairyLeagueModel = ModelCenter.Instance.GetModel<FairyLeagueModel>();
|
//if (_fairyLeagueModel.IsAlreadyBattleGuide())
|
//{
|
// break;
|
//}
|
//ConfirmCancel.ShowFairyLeagueGuide((bool _guide) =>
|
//{
|
// if (_guide)
|
// {
|
// WindowCenter.Instance.Open<BattleGroundGuideWin>();
|
// }
|
//});
|
//_fairyLeagueModel.SetBattleGuide();
|
break;
|
}
|
}
|
|
void SceneResourcesReplace()
|
{
|
switch (PlayerDatas.Instance.baseData.MapID)
|
{
|
case 10010:
|
SceneResourceReplace10010();
|
break;
|
default:
|
break;
|
}
|
}
|
|
private void SceneResourceReplace10010()
|
{
|
for (var i = 100101; i <= 100109; i++)
|
{
|
if (SceneReplaceConfig.Has(i))
|
{
|
var config = SceneReplaceConfig.Get(i);
|
var groundTexture = SceneLoader.LoadTexture(config.folder, config.resourceName);
|
var @object = GameObject.Find(config.objectPath);
|
|
var renderer = @object.GetComponent<Renderer>();
|
renderer.material.SetTexture("_MainTex", groundTexture);
|
}
|
}
|
|
var _func = FuncConfigConfig.Get("MapObjectConfig");
|
if (_func != null)
|
{
|
var _json = LitJson.JsonMapper.ToObject(_func.Numerical1);
|
var _mapID = PlayerDatas.Instance.baseData.MapID.ToString();
|
if ((_json as IDictionary).Contains(_mapID))
|
{
|
_json = _json[_mapID];
|
bool _isShow = (bool)_json["show"];
|
if (_isShow)
|
{
|
string _effectName = _json["obj"].ToString();
|
string _parent = _json["parent"].ToString();
|
|
var _prefab = InstanceResourcesLoader.LoadModelPrefab(InstanceResourcesLoader.raceSuffix, _effectName, false);
|
if (_prefab)
|
{
|
var _go = GameObject.Instantiate(_prefab);
|
|
var _parentNode = GameObject.Find(_parent);
|
_go.transform.SetParent(_parentNode.transform);
|
_go.transform.localPosition = Vector3.zero;
|
_go.transform.localRotation = Quaternion.identity;
|
_go.transform.localScale = Vector3.one;
|
}
|
}
|
}
|
}
|
|
}
|
|
|
}
|