using System;
|
using Snxxz.UI;
|
using TableConfig;
|
using UnityEngine;
|
using System.Collections.Generic;
|
using System.Collections;
|
using System.Text;
|
|
[XLua.LuaCallCSharp]
|
public class PlayerDeadModel : Model, IBeforePlayerDataInitialize,IPlayerLoginOk
|
{
|
public int[]dungeonKillArray { get; private set; }
|
public override void Init()
|
{
|
isKillByPlayer = false;
|
FuncConfigConfig funcConfig = Config.Instance.Get<FuncConfigConfig>("RebornArguments");
|
dungeonKillArray = ConfigParse.GetMultipleStr<int>(funcConfig.Numerical2);
|
RebornConditions = ConfigParse.GetMultipleStr<int>(funcConfig.Numerical1);
|
FuncConfigConfig RebornTime = Config.Instance.Get<FuncConfigConfig>("DuplicatesRebornTime");
|
duplicatesRebornDict = ConfigParse.GetDic<int, int>(RebornTime.Numerical1);
|
SysNotifyMgr.Instance.sysNotifyEvent += RefreshPlayerDieInfo;
|
}
|
|
public void OnBeforePlayerDataInitialize()
|
{
|
npcRealmLv = 0;
|
IsCanReborn = false;
|
isOpenPrompting = true;
|
this.deadCD = 0;
|
localBossState = false;
|
playerIsDie = false;
|
}
|
|
public void OnPlayerLoginOk()
|
{
|
PlayerDatas.Instance.PlayerDataRefreshEvent -= AddlistenPlayerHP;
|
PlayerDatas.Instance.PlayerDataRefreshEvent += AddlistenPlayerHP;
|
}
|
|
public override void UnInit()
|
{
|
SysNotifyMgr.Instance.sysNotifyEvent -= RefreshPlayerDieInfo;
|
}
|
|
public Action<int> RefreshDeadCDEvent;
|
public Action<int> RefreshDuplicatesRebornCDEvent; //副本死亡倒计时事件
|
public event Action playerDieEvent;
|
public event Action<uint> AllPlayerDieEvent;
|
public event Action<H0419_tagPlayerReborn> AllPlayerRebornEvent;
|
|
public event Action CloseRebornWinEvent;
|
|
public float autoRebornTime = 0;
|
public float deadCD = 0; //距离复活的时间
|
public float deadTiredCD = 300; //距离清除复活疲劳的时间
|
public int rebornPrice = 20;
|
public int rebornTiredNum = 0;
|
private int playerCoins = 0;
|
private FuncConfigConfig _tagfuncModel;
|
private int[] RebornConditions;
|
private MapConfig _tagMapModel;
|
public bool isBossKill = false;
|
public float duplicatesRebornTime = 0;
|
private Dictionary<int, int> duplicatesRebornDict;
|
public bool playerIsDie { get; private set; }
|
|
DungeonModel _dungeonModel;
|
DungeonModel dungeonModel {
|
get { return _dungeonModel ?? (_dungeonModel = ModelCenter.Instance.GetModel<DungeonModel>()); }
|
}
|
|
StoreModel _storeModel;
|
StoreModel m_storeModel {
|
get { return _storeModel ?? (_storeModel = ModelCenter.Instance.GetModel<StoreModel>()); }
|
}
|
|
PlayerPackModel _playerPack;
|
PlayerPackModel playerPack {
|
get { return _playerPack ?? (_playerPack = ModelCenter.Instance.GetModel<PlayerPackModel>()); }
|
}
|
|
private DungeonOpenTimeConfig _dungeonOpenTimeModel;
|
|
public bool IsCanReborn { get; private set; }
|
public bool localBossState { get; private set;}
|
public string killerName { get; private set; }
|
public bool isKillByPlayer { get; private set; }
|
public int npcRealmLv { get; private set; }
|
private void RefreshPlayerDieInfo(string key, ArrayList infolist)
|
{
|
npcRealmLv = 0;
|
localBossState = false;
|
switch (key)
|
{
|
case "PK_lhs_318691":
|
if (infolist.Count > 0)
|
{
|
killerName = infolist[0].ToString();
|
isKillByPlayer = true;
|
}
|
break;
|
case "GeRen_chenxin_279029":
|
if(infolist.Count > 0)
|
{
|
WorldBossConfig bossConfig = Config.Instance.Get<WorldBossConfig>(int.Parse(infolist[0].ToString()));
|
NPCConfig nPCConfig = Config.Instance.Get<NPCConfig>(int.Parse(infolist[0].ToString()));
|
if(nPCConfig != null)
|
{
|
killerName = nPCConfig.charName;
|
npcRealmLv = nPCConfig.Realm;
|
}
|
if(bossConfig != null)
|
{
|
localBossState = true;
|
}
|
isKillByPlayer = false;
|
}
|
break;
|
}
|
}
|
|
public bool CheckIsRealmSuppress(out StringBuilder builder)
|
{
|
builder = new StringBuilder();
|
if(npcRealmLv > PlayerDatas.Instance.baseData.realmLevel)
|
{
|
var curRealmConfig = Config.Instance.Get<RealmConfig>(npcRealmLv);
|
builder.AppendFormat("<Img img={0}/>", curRealmConfig.Img);
|
return true;
|
}
|
|
return false;
|
}
|
|
private void AddlistenPlayerHP(PlayerDataRefresh type, int value)
|
{
|
if (type != PlayerDataRefresh.HP || value > 0 || playerIsDie) return;
|
|
PlayerDie(PlayerDatas.Instance.baseData.PlayerID);
|
}
|
|
public void PlayerDie(uint playerId)
|
{
|
IsCanReborn = false;
|
if (AllPlayerDieEvent != null) AllPlayerDieEvent(playerId);
|
|
if (playerId != PlayerDatas.Instance.baseData.PlayerID)
|
{
|
return;
|
}
|
playerIsDie = true;
|
_tagMapModel = Config.Instance.Get<MapConfig>(PlayerDatas.Instance.baseData.MapID);
|
if (_tagMapModel.MapFBType == 0)
|
{
|
IsCanReborn = true;
|
rebornTiredNum = RebornConditions[0];
|
rebornPrice = RebornConditions[2];
|
//isBossKill = StatusManager.Instance.IsExist((int)playerId,20022);
|
if (!isKillByPlayer && localBossState)
|
{
|
autoRebornTime = RebornConditions[3];
|
}
|
|
if(!WindowCenter.Instance.IsOpen<RebornWin>())
|
{
|
WindowCenter.Instance.Open<RebornWin>();
|
}
|
|
}
|
else
|
{
|
_dungeonOpenTimeModel = Config.Instance.Get<DungeonOpenTimeConfig>(dungeonModel.GetDataMapIdByMapId(PlayerDatas.Instance.baseData.MapID));
|
if (_dungeonOpenTimeModel == null)
|
return;
|
|
if (_dungeonOpenTimeModel.DeathTime == 1)
|
{
|
IsCanReborn = true;
|
if (!duplicatesRebornDict.ContainsKey(PlayerDatas.Instance.baseData.MapID))
|
{
|
this.duplicatesRebornTime = duplicatesRebornDict[0];
|
}
|
else
|
{
|
this.duplicatesRebornTime = duplicatesRebornDict[PlayerDatas.Instance.baseData.MapID];
|
}
|
|
TimeDownMgr.Instance.Begin(TimeDownMgr.CoolTimeType.DuplicatesReborn, this.duplicatesRebornTime, RefreshDuplicatesRebornCD);
|
|
switch(PlayerDatas.Instance.baseData.MapID)
|
{
|
case 31150:
|
if (dungeonModel.mission.score >= 100)
|
{
|
if(!WindowCenter.Instance.IsOpen<ElderGodAreaExitWin>())
|
{
|
WindowCenter.Instance.Open<ElderGodAreaExitWin>();
|
}
|
}
|
else
|
{
|
if (!WindowCenter.Instance.IsOpen<ElderGodAreaRebornWin>())
|
{
|
WindowCenter.Instance.Open<ElderGodAreaRebornWin>();
|
}
|
}
|
break;
|
case 31110:
|
if(dungeonModel.mission.leaderID != playerId)
|
{
|
if (!WindowCenter.Instance.IsOpen<ReliveWin>())
|
{
|
WindowCenter.Instance.Open<ReliveWin>();
|
}
|
}
|
break;
|
default:
|
if (!WindowCenter.Instance.IsOpen<ReliveWin>())
|
{
|
WindowCenter.Instance.Open<ReliveWin>();
|
}
|
break;
|
|
}
|
}
|
else
|
{
|
IsCanReborn = false;
|
}
|
|
}
|
|
if (playerDieEvent != null)
|
playerDieEvent();
|
|
}
|
|
public void RefreshDeadModel(HB103_tagMCPlayerDeadTime data)
|
{
|
if (data.DeadTime == 0)
|
return;
|
|
double timeOffest = GetTimeOffest(TimeUtility.GetTime(data.DeadTime));
|
if (timeOffest <= RebornConditions[1])
|
{
|
if (timeOffest < 0)
|
timeOffest = 0;
|
|
this.deadCD = RebornConditions[1] - (float)timeOffest;
|
TimeDownMgr.Instance.Begin(TimeDownMgr.CoolTimeType.DeadCD, this.deadCD, RefreshDeadCD);
|
}
|
|
}
|
|
public void RebornSuccess(H0419_tagPlayerReborn data)
|
{
|
if (AllPlayerRebornEvent != null) AllPlayerRebornEvent(data);
|
if (PlayerDatas.Instance.baseData.PlayerID != data.PlayerID)
|
return;
|
|
localBossState = false;
|
this.deadCD = 0;
|
isKillByPlayer = false;
|
playerIsDie = false;
|
TimeDownMgr.Instance.Stop(TimeDownMgr.CoolTimeType.DeadCD);
|
TimeDownMgr.Instance.Stop(TimeDownMgr.CoolTimeType.BossAutoReborn);
|
TimeDownMgr.Instance.Stop(TimeDownMgr.CoolTimeType.DuplicatesReborn);
|
WindowCenter.Instance.CloseImmediately<RebornWin>();
|
WindowCenter.Instance.CloseImmediately<ReliveWin>();
|
WindowCenter.Instance.CloseImmediately<RebornTiredWin>();
|
WindowCenter.Instance.CloseImmediately<ElderGodAreaRebornWin>();
|
|
if (CloseRebornWinEvent != null)
|
{
|
CloseRebornWinEvent();
|
}
|
}
|
|
private void RefreshDeadCD(float obj)
|
{
|
this.deadCD = obj;
|
|
if (RefreshDeadCDEvent != null)
|
RefreshDeadCDEvent(Mathf.RoundToInt(obj));
|
}
|
|
private void RefreshDuplicatesRebornCD(float obj)
|
{
|
if (RefreshDuplicatesRebornCDEvent != null)
|
RefreshDuplicatesRebornCDEvent(Mathf.RoundToInt(obj));
|
}
|
|
|
public bool IsCanInplaceReborn(int rebornPrice)
|
{
|
playerCoins = (int)PlayerDatas.Instance.baseData.Gold + (int)PlayerDatas.Instance.baseData.GoldPaper;
|
if (playerCoins >= rebornPrice)
|
return true;
|
else
|
return false;
|
|
}
|
|
public bool IsRebornCoinsEnough()
|
{
|
int rebornCoins = playerPack.GetItemCountByID(PackType.rptItem, 2107);
|
if (rebornCoins >= 1)
|
{
|
return true;
|
}
|
return false;
|
}
|
|
private bool isOpenPrompting = true;
|
public void InpacleReborn()
|
{
|
ItemConfig itemConfig = Config.Instance.Get<ItemConfig>(2107);
|
if (isOpenPrompting)
|
{
|
ConfirmCancel.IconConfirmCancel(Language.Get("Mail101"), Language.Get("PlayerReborn102", itemConfig.ItemName), itemConfig.ID,
|
playerPack.GetItemCountByID(PackType.rptItem, itemConfig.ID), 1, Language.Get("PlayerReborn105", rebornPrice), Language.Get("ConfirmCancel102"), (bool isOk, bool isToggle) =>
|
{
|
if (isOk)
|
{
|
CheckInpacleReborn();
|
}
|
isOpenPrompting = !isToggle;
|
});
|
}
|
else
|
{
|
CheckInpacleReborn();
|
}
|
|
}
|
|
public void CheckInpacleReborn()
|
{
|
if (IsRebornCoinsEnough())
|
{
|
SendRebornQuest(3);
|
}
|
else
|
{
|
if (!IsCanInplaceReborn(rebornPrice))
|
{
|
if (VersionConfig.Get().isBanShu)
|
{
|
SysNotifyMgr.Instance.ShowTip("GoldErr");
|
return;
|
}
|
WindowCenter.Instance.Open<RechargeTipWin>();
|
}
|
else
|
{
|
SendRebornQuest(2);
|
|
}
|
}
|
}
|
|
public double GetTimeOffest(DateTime dieTime)
|
{
|
DebugEx.Log("现在时间" + TimeUtility.ServerNow);
|
TimeSpan t = TimeUtility.ServerNow - dieTime;
|
return t.TotalSeconds;
|
}
|
|
/// <summary>
|
/// 发送复活请求 2 原地复活 0 安全区复活 3 复活币复活
|
/// </summary>
|
/// <param name="rebornType"></param>
|
public void SendRebornQuest(int rebornType)
|
{
|
C0305_tagCCliectReborn reborn = new C0305_tagCCliectReborn();
|
reborn.Type = (byte)rebornType;
|
GameNetSystem.Instance.SendInfo(reborn);
|
}
|
}
|