using CommonAI.Zone;
using CommonAI.ZoneClient;
using CommonAIClient.Client;
using CommonLang;
using CommonLang.Protocol;
using RoomService.Net.BsServer;
using System;
using CommonLang.Log;
namespace Pomelo.DotNetClient.NetClient
{
///
/// 战斗服和客户端中间代理层,通信接口
///
public class BaseBattleClient : AbstractBattle, IDisposable
{
protected bool BattleOk = false;
protected readonly Logger log;
protected readonly INetClient mClient;
private Ping send_ping = new Ping();
private TimeInterval ping_task = new TimeInterval(2000);
//private int mPing = 0;
private long mRecvPak = 0;
private long mSentPak = 0;
//-----------------------------------------------------------------------------------
public override bool IsNet { get { return true; } }
public override KickedByServerNotifyB2C KickMessage { get { return null; } }
public override int CurrentPing { get { return Layer.CurrentPing; } }
public override long RecvPackages { get { return mRecvPak; } }
public override long SendPackages { get { return mSentPak; } }
public int PingIntervalMS
{
get
{
return ping_task.IntervalTimeMS;
}
set
{
ping_task = new TimeInterval(Math.Max(1000, value));
}
}
//-----------------------------------------------------------------------------------
public BaseBattleClient(INetClient client)
: base(client.DataRoot)
{
this.log = LoggerFactory.GetLogger(GetType().Name);
this.mClient = client;
this.Layer.ActorSyncMode = SyncMode.MoveByClient_PreSkillByClient;
}
protected override void Disposing()
{
mHandleMessage = null;
base.Disposing();
}
//-----------------------------------------------------------------------------------
#region _PomeloNetwork_
///
/// 发送战斗协议到服务器
///
///
public override void SendAction(CommonAI.Zone.Action action)
{
if(BattleOk)
{
this.mClient.SendBattleMessage(action);
this.mSentPak++;
}
}
public override void BattleReady(bool bok)
{
BattleOk = bok;
base.BattleReady(bok);
}
public virtual void OnReceivedBattleMessage(IMessage data)
{
this.Layer.ProcessMessage(data);
this.mRecvPak++;
//this.QueueTask((bc) =>
//{
// if (this.mHandleMessage != null)
// {
// this.mHandleMessage.Invoke(this, data);
// }
//});
if (this.mHandleMessage != null)
{
this.mHandleMessage.Invoke(this, data);
}
}
#endregion
//-----------------------------------------------------------------------------------
#region _MainThread_
public override void BeginUpdate(int intervalMS)
{
base.BeginUpdate(intervalMS);
if (ping_task.Update(Layer.CurrentIntervalMS))
{
send_ping.Begin();
Layer.SendAction(send_ping);
}
}
public override void Update()
{
base.Update();
}
#endregion
//-----------------------------------------------------------------------------------
#region _Delegate_
public delegate void OnHandleMessage(BaseBattleClient bc, IMessage msg);
private OnHandleMessage mHandleMessage;
public event OnHandleMessage HandleMessage { add { mHandleMessage += value; } remove { mHandleMessage -= value; } }
#endregion
//-----------------------------------------------------------------------------------
}
}