using CommonAI.ZoneClient;
using CommonLang;
using CommonLang.Log;
using pomelo.area;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using XmdsBattleClient.Client;
using XmdsBattleClientBot.XmdsBot;
using XmdsCommonServer.Message;
namespace XmdsBattleClientBot.Bot
{
///
/// 全自动战斗机器人,基础类
///
public partial class BotClient : IDisposable
{
private readonly Logger log;
private readonly Random random;
private readonly BotConfig config;
private readonly XmdsNetClient client;
private readonly IBotListViewItem mListViewCallback;
private bool _IsInScene; //是否进入到游戏场景中
private string account;
private string password;
public int ServerId;
public string ServerName;
public string Host;
public int Port;
public string Sign;
private SyncMessageQueue tasks = new SyncMessageQueue();
public int LineIndex;
public bool IsFree = true;
public string Account { get { return account; } }
public string Password { get { return password; } }
public BotConfig Config { get { return config; } }
public XmdsNetClient Client { get { return client; } }
public Random Random { get { return random; } }
public Pomelo.DotNetClient.NetWorkState NetState { get; private set; }
public virtual bool IsRunning { get; }
public virtual string RoleName
{
get
{
if (client != null && client.BattleActor != null)
{
var prop = client.BattleActor.LoginData.GameServerProp as XmdsCommon.Plugin.XmdsUnitProperties;
return prop.ServerData.BaseInfo.name;
}
return "";
}
}
public virtual string SceneName
{
get
{
if (client != null && client.BattleActor != null && NetState == Pomelo.DotNetClient.NetWorkState.CONNECTED)
{
var prop = client.BattleClient.Layer.Data;
return LineIndex == 0 ? prop.ToString() : prop.Name + "(" + LineIndex + "线)";
}
return "";
}
}
public BotClient(string user, string pswd, BotConfig cfg, IBotListViewItem callBack)
{
this.log = LoggerFactory.GetLogger("bot[" + user + "]");
this.config = cfg;
this.account = user;
this.password = pswd;
this.random = new Random(account.GetHashCode() + DateTime.Now.Millisecond);
this.mListViewCallback = callBack;
this.client = new XmdsNetClient(true);
this._IsInScene = false;
connect();
this.client.GateSocket.NetWorkStateChangedEvent += callback_gt_NetWorkStateChangedEvent;
this.client.GameSocket.NetWorkStateChangedEvent += callback_gs_NetWorkStateChangedEvent;
this.client.OnBeginEnterScene += callback_client_OnCreateBattleClient;
this.client.OnBattlePlayerReady += callback_client_OnBattlePlayerReady;
this.client.GameSocket.listen(callback_gs_onTaskUpdatePush);
this.client.GameSocket.listen(callback_gs_BagItemUpdatePush);
this.client.GameSocket.listen(callback_gs_ChangeAreaPush);
}
public void connect(Action onConnectted = null)
{
string[] host = Config.LoginUrl.Split(':');
string ip = host[0];
int port = Convert.ToInt32(host[1]);
Host = ip;
Port = port;
Client.GateSocket.connect(ip, port, 15000, (result) =>
{
if (result != null && result.Count > 0)
{
//MessageBox.Show(Convert.ToString(result["s2c_msg"]));
MessageBox.Show(ip + ":" + port + "网络连接失败");
} else if(onConnectted != null)
{
onConnectted();
}
if(this.mListViewCallback != null)
{
this.mListViewCallback.Start();
}
});
}
public void SetAccount(string user, string pswd)
{
this.account = user;
this.password = pswd;
}
private void callback_gt_NetWorkStateChangedEvent(Pomelo.DotNetClient.NetWorkState obj)
{
this.NetState = obj;
}
private void callback_gs_NetWorkStateChangedEvent(Pomelo.DotNetClient.NetWorkState obj)
{
this.NetState = obj;
//网络异常状态,自动退出场景
if(!Pomelo.DotNetClient.NetWorkState.CONNECTING.Equals(obj) || !Pomelo.DotNetClient.NetWorkState.CONNECTED.Equals(obj)) {
this._IsInScene = false;
}
}
private void callback_client_OnBattlePlayerReady(ZoneLayer arg1, ZoneActor arg2)
{
//arg2.SendAction(new MarkForTestBotAction());
}
public virtual void Start()
{
lock (this)
{
if (event_OnStart != null) event_OnStart.Invoke(this);
}
}
public virtual void Stop()
{
lock (this)
{
client.Disconnect();
if (event_OnStop != null) event_OnStop.Invoke(this);
}
}
public virtual void Dispose()
{
event_OnStart = null;
event_OnStop = null;
event_OnBattleUpdate = null;
event_OnUpdate = null;
client.Dispose();
}
public virtual void Update(int intervalMS)
{
try
{
lock (this)
{
tasks.ProcessMessages(do_task);
if (event_OnUpdate != null)
event_OnUpdate.Invoke(this);
if (client != null)
{
client.UpdateSocket(intervalMS);
client.DoUpdateSend();
//成功进入到场景里面才进行场景刷新,BindPlayer是一个点
if (this._IsInScene)
client.UpdateBattleClient(intervalMS);
if (client.BattleClient != null && client.BattleClient.Actor != null && event_OnBattleUpdate != null)
{
event_OnBattleUpdate.Invoke(client.BattleClient.Actor);
}
if (CurrentRegionManager != null)
{
CurrentRegionManager.Update();
}
}
}
}
catch (Exception err)
{
log.Error(err.Message, err);
}
}
public void QueueTask(Action action)
{
tasks.Enqueue(action);
}
private void do_task(Action action)
{
action();
}
public event Action event_OnStart;
public event Action event_OnStop;
public event Action event_OnUpdate;
public event Action event_OnBattleUpdate;
}
}