using System.Collections;
|
using System.Collections.Generic;
|
using Unity.Jobs;
|
using UnityEngine;
|
using UnityEngine.UI;
|
using vnxbqy.UI;
|
|
|
public class JiaDemonJarDungeonStage : DungeonStage
|
{
|
static Vector3 SCENE_CENTER = new Vector3(8.35f, 6.37f, 9.7f);
|
|
bool fighting = false;
|
float surplusTime = 0f;
|
float totalTime = 0f;
|
|
int bossNpcId = 0;
|
ulong myHurtSum = 0;
|
int myRank = -1;
|
|
bool isReconnected = false;
|
|
DemonJarConfig demonJarConfig;
|
float lastHurtTimeRecorder = 0f;
|
List<JiaPlayer> jiaPlayerDatas = new List<JiaPlayer>();
|
DungeonModel dungeonModel { get { return ModelCenter.Instance.GetModel<DungeonModel>(); } }
|
|
GA_NpcClientFightBoss boss;
|
List<GA_PlayerClient.PlayerInfo> playerInfos = new List<GA_PlayerClient.PlayerInfo>();
|
List<GA_Player> jiaPlayers = new List<GA_Player>();
|
|
public override void Initialize()
|
{
|
base.Initialize();
|
dungeonModel.onDungeonResultEvent += OnDungeonResultEvent;
|
BossShowModel.Instance.bossShowCompletedEvent += OnBossShowComplete;
|
DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforeInitailesPlayerInfo;
|
DTC0403_tagPlayerLoginLoadOK.mapInitOkEvent += OnMapInitOk;
|
AttackHandler.OnAttackTarget += OnPlayerAttack;
|
|
if (PlayerDatas.Instance.hero != null)
|
{
|
PlayerDatas.Instance.hero.Pos = new Vector3(13f, 0f, 10f);
|
CameraController.Instance.Apply();
|
}
|
}
|
|
public override void UnInitialize()
|
{
|
if (boss != null)
|
{
|
boss.ActorInfo.serverDie = true;
|
GAMgr.Instance.ServerDie(boss.ServerInstID);
|
GAMgr.Instance.Release(boss);
|
boss = null;
|
}
|
|
dungeonModel.onDungeonResultEvent -= OnDungeonResultEvent;
|
BossShowModel.Instance.bossShowCompletedEvent -= OnBossShowComplete;
|
DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= OnBeforeInitailesPlayerInfo;
|
DTC0403_tagPlayerLoginLoadOK.mapInitOkEvent -= OnMapInitOk;
|
AttackHandler.OnAttackTarget -= OnPlayerAttack;
|
|
StopAllCoroutines();
|
|
base.UnInitialize();
|
}
|
|
protected override void OnStageLoadFinish()
|
{
|
base.OnStageLoadFinish();
|
|
StartCoroutine(Co_FightBegin());
|
}
|
|
protected override void OnUpdate()
|
{
|
base.OnUpdate();
|
|
if (surplusTime > 0f && fighting)
|
{
|
if (GameNetSystem.Instance.netState == GameNetSystem.NetState.Connected)
|
{
|
surplusTime -= Time.deltaTime;
|
|
if (Time.time - lastHurtTimeRecorder > 2f)
|
{
|
AddJiaPlayerHurt();
|
}
|
|
if (boss == null || boss.ActorInfo.serverDie)
|
{
|
CreateBoss();
|
}
|
|
if (surplusTime <= 0f)
|
{
|
ProcessBossDead();
|
}
|
}
|
}
|
|
}
|
|
private void OnBossShowComplete()
|
{
|
InitializingFight();
|
}
|
|
private void OnBeforeInitailesPlayerInfo()
|
{
|
boss = null;
|
isReconnected = true;
|
}
|
|
private void OnMapInitOk()
|
{
|
if (isReconnected)
|
{
|
if (surplusTime <= 0f)
|
{
|
if (fighting)
|
{
|
ProcessBossDead();
|
}
|
else
|
{
|
dungeonModel.ExitCurrentDungeon();
|
}
|
}
|
else
|
{
|
CreateBoss();
|
UpdateDungeonHelpInfo();
|
|
for (int i = 0; i < playerInfos.Count; i++)
|
{
|
GAMgr.Instance.ReqClntPlayer<GA_PlayerClient>(playerInfos[i], E_ActorGroup.User);
|
}
|
}
|
}
|
}
|
|
private void InitializingFight()
|
{
|
var keys = DemonJarConfig.GetKeys();
|
foreach (var key in keys)
|
{
|
this.demonJarConfig = DemonJarConfig.Get(key);
|
if (demonJarConfig.LineID == ClientDungeonStageUtility.dungeonInfo.lineId)
|
{
|
bossNpcId = demonJarConfig.NPCID;
|
totalTime = demonJarConfig.Time;
|
surplusTime = demonJarConfig.Time;
|
break;
|
}
|
}
|
|
fighting = true;
|
|
CreateBoss();
|
UpdateDungeonHelpInfo();
|
StartCoroutine(Co_CreateJiaPlayers(Random.Range(4, 6)));
|
}
|
|
private void ProcessBossDead()
|
{
|
fighting = false;
|
|
var send = new CB101_tagCMClientEndFB();
|
send.MapID = DemonJarModel.DATA_MAPID;
|
send.LineID = (ushort)this.demonJarConfig.LineID;
|
send.Data1 = myRank == -1 ? (uint)(jiaPlayerDatas.Count + 1) : (uint)myRank;
|
send.Data2 = (uint)myHurtSum;
|
GameNetSystem.Instance.SendInfo(send);
|
|
if (boss != null)
|
{
|
boss.ActorInfo.serverDie = true;
|
GAMgr.Instance.ServerDie(boss.ServerInstID);
|
boss.Die();
|
boss = null;
|
}
|
}
|
|
/// <summary>
|
/// 添加虚假玩家
|
/// </summary>
|
/// <param name="_id"></param>
|
/// <param name="_name"></param>
|
private void AddJiaPlayer(int _id, string _name)
|
{
|
jiaPlayerDatas.Add(new JiaPlayer(_id, _name));
|
}
|
|
public void AddHeroHurt(ulong _hurt)
|
{
|
lastHurtTimeRecorder = Time.time;
|
myHurtSum += _hurt;
|
for (int i = 0; i < jiaPlayerDatas.Count; i++)
|
{
|
var jiaPlayer = jiaPlayerDatas[i];
|
jiaPlayer.hurt += (ulong)(Random.Range(0.7f, 0.95f) * _hurt);
|
}
|
|
UpdateDungeonHelpInfo();
|
}
|
|
private void AddJiaPlayerHurt()
|
{
|
lastHurtTimeRecorder = Time.time;
|
for (int i = 0; i < jiaPlayerDatas.Count; i++)
|
{
|
var jiaPlayer = jiaPlayerDatas[i];
|
jiaPlayer.hurt += (ulong)(jiaPlayer.hurt / (totalTime - surplusTime));
|
}
|
|
UpdateDungeonHelpInfo();
|
}
|
|
private void UpdateDungeonHelpInfo()
|
{
|
var mission = new DungeonMissionData();
|
var tempHurts = new List<DungeonHurt>();
|
for (int i = 0; i < jiaPlayerDatas.Count; i++)
|
{
|
var jiaPlayer = jiaPlayerDatas[i];
|
tempHurts.Add(
|
new DungeonHurt()
|
{
|
playerName = jiaPlayer.name,
|
hurt = (int)(jiaPlayer.hurt % Constants.ExpPointValue),
|
hurtEx = (int)(jiaPlayer.hurt / Constants.ExpPointValue),
|
}
|
);
|
}
|
|
tempHurts.Add(
|
new DungeonHurt()
|
{
|
playerName = PlayerDatas.Instance.baseData.PlayerName,
|
hurt = (int)(myHurtSum % Constants.ExpPointValue),
|
hurtEx = (int)(myHurtSum / Constants.ExpPointValue),
|
}
|
);
|
|
tempHurts.Sort(HurtCompare);
|
|
var hurts = new DungeonHurt[Mathf.Min(5, tempHurts.Count)];
|
for (int i = 0; i < hurts.Length; i++)
|
{
|
var dungeonHurt = tempHurts[i];
|
dungeonHurt.rank = i + 1;
|
hurts[i] = dungeonHurt;
|
if (dungeonHurt.playerName == PlayerDatas.Instance.baseData.PlayerName)
|
{
|
myRank = dungeonHurt.rank;
|
}
|
}
|
|
mission.lineID = ClientDungeonStageUtility.dungeonInfo.lineId;
|
mission.hurtInfo = hurts;
|
mission.remainHPPer = (int)(surplusTime / totalTime * 1000000f);
|
mission.hpReduceSpeed = (int)(10000 / totalTime);
|
|
dungeonModel.UpdateJiaDungeonMission(DemonJarModel.DATA_MAPID, mission);
|
}
|
|
private void CreateBoss()
|
{
|
boss = GAMgr.Instance.ReqClntFightNpc<GA_NpcClientFightBoss>((uint)bossNpcId, E_ActorGroup.Enemy);
|
boss.Pos = boss.BornPos = SCENE_CENTER;
|
|
boss.LockTargetSID = PlayerDatas.Instance.baseData.PlayerID;
|
}
|
|
IEnumerator Co_CreateJiaPlayers(int _count)
|
{
|
yield return WaitingForSecondConst.WaitMS2000;
|
|
while (_count > 0)
|
{
|
var index = (byte)(Random.Range(0, GeneralDefine.openJobs.Length));
|
var playerJob = (byte)GeneralDefine.openJobs[index];
|
var playerName = StringUtility.Contact(RandomNameConfig.GetFirstName(playerJob), RandomNameConfig.GetSecondName(playerJob));
|
|
int[] equips = null;
|
switch (playerJob)
|
{
|
case 1:
|
equips = demonJarConfig.Job1;
|
break;
|
case 2:
|
equips = demonJarConfig.Job2;
|
break;
|
case 3:
|
equips = demonJarConfig.Job3;
|
break;
|
}
|
|
var exitJiaPlayer = false;
|
for (int i = 0; i < jiaPlayerDatas.Count; i++)
|
{
|
var jiaPlayer = jiaPlayerDatas[i];
|
if (jiaPlayer.name == playerName)
|
{
|
exitJiaPlayer = true;
|
break;
|
}
|
}
|
|
if (!exitJiaPlayer)
|
{
|
var random = Random.Range(0, 2);
|
|
var equipInfos = new GA_PlayerClient.CEquipInfo[equips.Length > 3 && random == 0 ? 3 : equips.Length];
|
for (int i = 0; i < equipInfos.Length; i++)
|
{
|
var equipInfo = new GA_PlayerClient.CEquipInfo();
|
var itemConfig = ItemConfig.Get(equips[i]);
|
equipInfo.id = itemConfig.ID;
|
equipInfo.place = itemConfig.EquipPlace;
|
equipInfos[i] = equipInfo;
|
}
|
|
var playerInfo = new GA_PlayerClient.PlayerInfo()
|
{
|
hp = (ulong)(PlayerDatas.Instance.baseData.HP * Random.Range(0.5f, 0.9f)),
|
maxHp = (ulong)(PlayerDatas.Instance.baseData.HP * Random.Range(0.9f, 1f)),
|
level = PlayerDatas.Instance.baseData.LV,
|
job = playerJob,
|
face = AvatarHelper.GetAvatarDefaultID(playerJob),
|
facePic = AvatarHelper.GetAvatarFrameDefaultID(playerJob),
|
pos = SCENE_CENTER + new Vector3(Random.Range(-2f, 2f), 0, Random.Range(-2f, 2f)),
|
name = playerName,
|
itemDatas = equipInfos,
|
};
|
|
playerInfos.Add(playerInfo);
|
|
GAMgr.Instance.ReqClntPlayer<GA_PlayerClient>(playerInfo, E_ActorGroup.User);
|
|
AddJiaPlayer(_count, playerName);
|
_count--;
|
yield return new WaitForSeconds(Random.Range(2, 5));
|
}
|
|
}
|
|
yield return null;
|
}
|
|
private void OnPlayerAttack(uint _attackerId, uint _victimId, byte _type, ulong _damage)
|
{
|
if (boss == null)
|
{
|
return;
|
}
|
|
if (_victimId == boss.ServerInstID)
|
{
|
TargetBriefInfo.OnRefreshBossLifeBar(_victimId, boss.NpcConfig.NPCID, (ulong)Random.Range(0, 1000), 1000);
|
}
|
}
|
|
IEnumerator Co_FightBegin()
|
{
|
|
yield return WaitingForSecondConst.WaitMS500;
|
if (!BossShowModel.Instance.BossShowing)
|
{
|
OnBossShowComplete();
|
}
|
}
|
|
private void OnDungeonResultEvent()
|
{
|
dungeonModel.UpdateCoolDown(DungeonCoolDownType.LeaveMap, 10 * 1000);
|
}
|
|
private int HurtCompare(DungeonHurt a, DungeonHurt b)
|
{
|
return a.hurt > b.hurt ? -1 : 1;
|
}
|
|
class JiaPlayer
|
{
|
public int id;
|
public string name;
|
public ulong hurt;
|
|
public JiaPlayer(int _id, string _name)
|
{
|
id = _id;
|
name = _name;
|
}
|
|
public static int HurtCompare(JiaPlayer _lhs, JiaPlayer _rhs)
|
{
|
return _lhs.hurt > _rhs.hurt ? -1 : 1;
|
}
|
|
}
|
|
|
}
|