using System;
|
using System.Collections;
|
using System.Collections.Generic;
|
using TableConfig;
|
using UnityEngine;
|
namespace Snxxz.UI
|
{
|
public class FairyFeastModel : Model, IBeforePlayerDataInitialize
|
{
|
public uint selectPlayer { get; private set; }
|
public bool allowTransmit { get; private set; }
|
|
public bool nearNpc { get; private set; }
|
|
public event Action selectTransmit;
|
|
public event Action transmitStateUpdate;
|
DungeonModel dungeonModel { get { return ModelCenter.Instance.GetModel<DungeonModel>(); } }
|
FairyModel fairyModel { get { return ModelCenter.Instance.GetModel<FairyModel>(); } }
|
|
public override void Init()
|
{
|
ParseConfig();
|
GA_Player.s_OnSelected += OnSelected;
|
GlobalTimeEvent.Instance.secondEvent += SecondEvent;
|
StageManager.Instance.onStageLoadFinish += OnStageLoadFinish;
|
dungeonModel.updateMissionEvent += UpdateMissionEvent;
|
PrepareHandler.Instance.OnPrepareEndSuccess += OnPrepareEndSuccess;
|
GA_NpcCollect.OnArrive += OnArriveNpc;
|
GA_NpcCollect.OnLeave += OnLeaveNpc;
|
}
|
|
public override void UnInit()
|
{
|
GA_Player.s_OnSelected -= OnSelected;
|
GlobalTimeEvent.Instance.secondEvent -= SecondEvent;
|
StageManager.Instance.onStageLoadFinish -= OnStageLoadFinish;
|
dungeonModel.updateMissionEvent -= UpdateMissionEvent;
|
PrepareHandler.Instance.OnPrepareEndSuccess -= OnPrepareEndSuccess;
|
GA_NpcCollect.OnArrive -= OnArriveNpc;
|
GA_NpcCollect.OnLeave -= OnLeaveNpc;
|
}
|
|
public void OnBeforePlayerDataInitialize()
|
{
|
transmitCompleteTime = TimeUtility.ClientOriginalTime;
|
if (transmitClock != null)
|
{
|
transmitClock.Stop();
|
transmitClock = null;
|
}
|
}
|
|
private void OnStageLoadFinish()
|
{
|
selectPlayer = 0;
|
nearNpc = false;
|
if (transmitClock != null)
|
{
|
transmitClock.Stop();
|
transmitClock = null;
|
}
|
}
|
|
private void SecondEvent()
|
{
|
if (selectPlayer != 0)
|
{
|
var actor = GAMgr.Instance.GetBySID(selectPlayer);
|
bool update = false;
|
if (actor == null || !(actor is GA_Player))
|
{
|
selectPlayer = 0;
|
update = true;
|
}
|
else
|
{
|
var player = actor as GA_Player;
|
var hero = PlayerDatas.Instance.hero;
|
if (SatisfyTransmitState())
|
{
|
var distance = MathUtility.CalDistance(player.Pos, hero.Pos);
|
if (allowTransmit != (distance <= transmitDistance))
|
{
|
allowTransmit = distance <= transmitDistance;
|
update = true;
|
}
|
}
|
else
|
{
|
if (allowTransmit)
|
{
|
allowTransmit = false;
|
update = true;
|
}
|
}
|
}
|
if (update && selectTransmit != null)
|
{
|
selectTransmit();
|
}
|
}
|
}
|
|
private void OnArriveNpc(uint arg0, int _npcId)
|
{
|
if (_npcId == fairyModel.fairyFeastDeskNpc)
|
{
|
nearNpc = true;
|
SecondEvent();
|
}
|
}
|
|
private void OnLeaveNpc(uint arg0, int _npcId)
|
{
|
if (_npcId == fairyModel.fairyFeastDeskNpc)
|
{
|
nearNpc = false;
|
SecondEvent();
|
}
|
}
|
|
float transmitDistance = 2f;
|
public int transmitCostSeconds { get; private set; }
|
void ParseConfig()
|
{
|
var config = Config.Instance.Get<FuncConfigConfig>("FairyFeastTransmit");
|
transmitCostSeconds = 15;
|
if (config != null)
|
{
|
transmitDistance = float.Parse(config.Numerical1);
|
transmitCostSeconds = int.Parse(config.Numerical2);
|
}
|
}
|
|
bool SatisfyTransmitState()
|
{
|
var hero = PlayerDatas.Instance.hero;
|
if (hero == null || hero.IsCollecting()
|
|| hero.IsCollect() || hero.IsDaZuo() || nearNpc)
|
{
|
return false;
|
}
|
return true;
|
}
|
|
private void OnSelected(uint serverInstId, bool select)
|
{
|
var mapId = PlayerDatas.Instance.baseData.MapID;
|
if (mapId != 31230)
|
{
|
return;
|
}
|
if (transmiting)
|
{
|
return;
|
}
|
var mission = dungeonModel.mission;
|
if (mission.hasSit == 1)
|
{
|
return;
|
}
|
selectPlayer = 0;
|
allowTransmit = false;
|
if (select)
|
{
|
var actor = GAMgr.Instance.GetBySID(serverInstId);
|
if (actor != null && actor is GA_Player)
|
{
|
var player = actor as GA_Player;
|
var hero = PlayerDatas.Instance.hero;
|
var distance = MathUtility.CalDistance(player.Pos, hero.Pos);
|
if (SatisfyTransmitState())
|
{
|
allowTransmit = distance <= transmitDistance;
|
}
|
selectPlayer = serverInstId;
|
}
|
}
|
if (selectTransmit != null)
|
{
|
selectTransmit();
|
}
|
}
|
|
/// <summary>
|
/// 仙盟宴会采集结束
|
/// </summary>
|
private void OnPrepareEndSuccess()
|
{
|
var mapId = PlayerDatas.Instance.baseData.MapID;
|
if (mapId != 31230)
|
{
|
return;
|
}
|
var mission = dungeonModel.mission;
|
if (mission.hasSit == 1)
|
{
|
return;
|
}
|
if (!WindowCenter.Instance.IsOpen<MainInterfaceWin>()
|
|| WindowCenter.Instance.ExitAnyFullScreenOrMaskWin())
|
{
|
return;
|
}
|
var list = GAMgr.Instance.GetTypeList(E_ActorClassType.Player);
|
if (list != null)
|
{
|
var hero = PlayerDatas.Instance.hero;
|
for (int i = 0; i < list.Count; i++)
|
{
|
var player = list[i] as GA_Player;
|
if (player != null)
|
{
|
var distance = MathUtility.CalDistance(player.Pos, hero.Pos);
|
if (distance < transmitDistance)
|
{
|
player.OnClick();
|
return;
|
}
|
}
|
}
|
}
|
}
|
|
private void UpdateMissionEvent()
|
{
|
var mapId = PlayerDatas.Instance.baseData.MapID;
|
if (mapId != 31230)
|
{
|
return;
|
}
|
var mission = dungeonModel.mission;
|
if (mission.hasSit == 1 && selectPlayer != 0)
|
{
|
selectPlayer = 0;
|
if (selectTransmit != null)
|
{
|
selectTransmit();
|
}
|
}
|
}
|
|
#region 服务端数据
|
public DateTime transmitCompleteTime { get; private set; }
|
public bool transmiting
|
{
|
get
|
{
|
return DateTime.Now < transmitCompleteTime;
|
}
|
}
|
|
private Clock transmitClock = null;
|
|
public void Transmit()
|
{
|
if (selectPlayer != 0)
|
{
|
CA508_tagCMDoFBAction pak = new CA508_tagCMDoFBAction();
|
pak.ActionType = 0;
|
pak.ActionInfo = selectPlayer;
|
GameNetSystem.Instance.SendInfo(pak);
|
}
|
}
|
|
public void UpdateTransmitState(H0411_tagPlayerSit package)
|
{
|
var mapId = PlayerDatas.Instance.baseData.MapID;
|
if (mapId != 31230 || package.PlayerID != PlayerDatas.Instance.baseData.PlayerID)
|
{
|
return;
|
}
|
if (package.Type == 0)
|
{
|
transmitCompleteTime = DateTime.Now.AddTicks(transmitCostSeconds * TimeSpan.TicksPerSecond);
|
transmitClock = Clock.Create(transmitCostSeconds, TransmitComplete);
|
}
|
else
|
{
|
if (transmitClock != null)
|
{
|
transmitClock.Stop();
|
transmitClock = null;
|
}
|
transmitCompleteTime = TimeUtility.ClientOriginalTime;
|
}
|
if (transmitStateUpdate != null)
|
{
|
transmitStateUpdate();
|
}
|
}
|
|
void TransmitComplete()
|
{
|
transmitClock = null;
|
CA508_tagCMDoFBAction pak = new CA508_tagCMDoFBAction();
|
pak.ActionType = 1;
|
pak.ActionInfo = 0;
|
GameNetSystem.Instance.SendInfo(pak);
|
if (transmitStateUpdate != null)
|
{
|
transmitStateUpdate();
|
}
|
}
|
#endregion
|
}
|
}
|