Skip to content

Commit

Permalink
Merge pull request #2 from NL0bP/master
Browse files Browse the repository at this point in the history
Fix reconnect bug.
  • Loading branch information
Rain0Ash authored Aug 17, 2018
2 parents 3493245 + ab719ff commit 13baffb
Show file tree
Hide file tree
Showing 13 changed files with 213 additions and 167 deletions.
2 changes: 1 addition & 1 deletion ArcheAge/ArcheAge Game Server.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
<OutputType>Exe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>ArcheAge</RootNamespace>
<AssemblyName>ArcheAgeGameServer</AssemblyName>
<AssemblyName>AAGameServer</AssemblyName>
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<PublishUrl>опубликовать\</PublishUrl>
Expand Down
18 changes: 15 additions & 3 deletions ArcheAge/ArcheAge/Network/Connections/ClientConnection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,19 @@ public class ClientConnection : IConnection
{
//----- Static
private static Dictionary<int, Account> m_CurrentAccounts = new Dictionary<int, Account>();
private byte m_Random;
private readonly byte m_Random;
//Fix by Yanlong-LI
//Исправление входа второго пользователя, вторичный логин, счетчик повторного соединения с возвратом в лобби, вызванный ошибкой
public byte m_NumPck = 0; //修复第二用户、二次登陆、大厅返回重连DD05计数器造成错误问题 BUG глобальный подсчет пакетов DD05
public static Dictionary<int, Account> CurrentAccounts
{
get { return m_CurrentAccounts; }
}

public Account CurrentAccount { get; set; }

public ClientConnection(Socket socket) : base(socket) {
public ClientConnection(Socket socket) : base(socket)
{
Logger.Trace("Client IP: {0} connected", this);
DisconnectedEvent += ClientConnection_DisconnectedEvent;
m_LittleEndian = true;
Expand All @@ -32,7 +36,12 @@ public ClientConnection(Socket socket) : base(socket) {
public override void SendAsync(NetPacket packet)
{
packet.IsArcheAgePacket = true;
//Fix by Yanlong-LI
//Переопределяем счетчик для текущего соединения
NetPacket.m_NumPck = m_NumPck;//重写为当前连接的计数
base.SendAsync(packet);
//Записываем счетчик обратно
m_NumPck = NetPacket.m_NumPck;//将计数回写
}
public void SendAsyncd(NetPacket packet)
{
Expand Down Expand Up @@ -64,8 +73,11 @@ public override void HandleReceived(byte[] data)
opcode = 0x008E; //вход в игру5
break;
case 0x34:
//opcode = 0x0088; //пакет на релогин
opcode = 0x0088; //пакет на релогин из лобби
break;
//case 0x35:
// opcode = 0x0088; //пакет на релогин из игры
// break;
case 0x36:
opcode = 0x008F; //вход в игру6
break;
Expand Down
79 changes: 33 additions & 46 deletions ArcheAge/ArcheAge/Network/DelegateList.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
using LocalCommons.Network;
using System.Collections.Generic;
using System.Linq;
using System.Threading;

namespace ArcheAge.ArcheAge.Network
{
Expand Down Expand Up @@ -34,8 +33,6 @@ public class DelegateList
private static bool once5;
private static bool once6;



public static LoginConnection CurrentLoginServer
{
get { return m_CurrentLoginServer; }
Expand All @@ -56,6 +53,7 @@ public static void Initialize()
m_LHandlers = new PacketHandler<LoginConnection>[0x20];
//m_LHandlers = new PacketHandler<ClientConnection>[0x30];
levels = new Dictionary<int, PacketHandler<ClientConnection>[]>();

once2 = true; // если false, то больше не повторять
once3 = true; // если false, то больше не повторять
once4 = true; // если false, то больше не повторять
Expand Down Expand Up @@ -115,16 +113,17 @@ private static void RegisterDelegates()
//}

#region Client Callbacks Implementation

public static void OnPacketReceive_EnterWorld_0x008A(ClientConnection net, PacketReader reader)
{
if (!enter1) //регулируем последовательность входа
{
///клиентский пакет Recv: 130000053829157BA816DB909183220859E934EFF6
net.SendAsyncHex(new NP_EnterGame_008A_2());//вход в игру1, пакет C>s 0x038
net.SendAsyncHex(new NP_EnterGame_008A());//вход в игру1, пакет C>s 0x038
//net.SendAsyncHex(new NP_EnterGame_008A_2());//вход в игру1, пакет C>s 0x038
enter1 = true;
}
}

public static void OnPacketReceive_EnterWorld_0x008B(ClientConnection net, PacketReader reader)
{
if (enter1) //регулируем последовательность входа
Expand All @@ -133,12 +132,14 @@ public static void OnPacketReceive_EnterWorld_0x008B(ClientConnection net, Packe
{
//вход в игру2
//13000005371947B88E92319E86B077729237FC244E
net.SendAsyncHex(new NP_EnterGame_008B_2());//вход в игру2, пакет C>s 0x037
net.SendAsyncHex(new NP_EnterGame_008B());//вход в игру2, пакет C>s 0x037
//net.SendAsyncHex(new NP_EnterGame_008B_2());//вход в игру2, пакет C>s 0x037
enter2 = true;
once2 = false;
}
}
}

public static void OnPacketReceive_EnterWorld_0x008C(ClientConnection net, PacketReader reader)
{
if (enter2) //регулируем последовательность входа
Expand All @@ -148,39 +149,45 @@ public static void OnPacketReceive_EnterWorld_0x008C(ClientConnection net, Packe
//вход в игру3
//13000005390AEDA4C3949E6A5B4AC06820F2BC202A
//13000005370B469961E9F541A6AF4E8DB8BBB3EAFE
net.SendAsyncHex(new NP_EnterGame_008C_2());//вход в игру3, пакет C>s 0x039
net.SendAsyncHex(new NP_EnterGame_008C());//вход в игру3, пакет C>s 0x039
//net.SendAsyncHex(new NP_EnterGame_008C_2());//вход в игру3, пакет C>s 0x039
enter3 = true;
enter2 = false;
once3 = false;
}
}
}

public static void OnPacketReceive_EnterWorld_0x008D(ClientConnection net, PacketReader reader)
{
if (enter3)
{
if (once4)
{
net.SendAsyncHex(new NP_EnterGame_008D_2());//вход в игру4, пакет C>s 0x03F
net.SendAsyncHex(new NP_EnterGame_008D());//вход в игру4, пакет C>s 0x03F
//net.SendAsyncHex(new NP_EnterGame_008D_2());//вход в игру4, пакет C>s 0x03F
enter4 = true;
enter3 = false;
once4 = false;
}
}
}
}

public static void OnPacketReceive_EnterWorld_0x008E(ClientConnection net, PacketReader reader)
{
if (enter4)
{
if (once5)
{
net.SendAsyncHex(new NP_EnterGame_008E_2());//вход в игру5, пакет C>s 0x033
net.SendAsyncHex(new NP_EnterGame_008E());//вход в игру5, пакет C>s 0x033
//net.SendAsyncHex(new NP_EnterGame_008E_2());//вход в игру5, пакет C>s 0x033
once5 = false;
enter5 = true;
enter4 = false;
}
}
}

public static void OnPacketReceive_EnterWorld_0x008F(ClientConnection net, PacketReader reader)
{
if (enter5)
Expand Down Expand Up @@ -236,19 +243,15 @@ 0026 4 integer index 0 | $00000000
int pTo = reader.ReadLEInt32(); //p_to
long accountId = reader.ReadLEInt64(); //Account Id
int cookie = reader.ReadLEInt32(); //cookie
int zoneId = reader.ReadLEInt32(); //User Session Id? zoneId?
//reader.Offset += 1; //Undefined Random Byte
int zoneId = reader.ReadLEInt32(); //zoneId
short tb = reader.ReadLEInt16(); //tb
int revision = reader.ReadLEInt32(); //revision, The resource version is the same as the brackets in the client header. (r.321543)
int index = reader.ReadLEInt32(); //index

//пропускаем недо X2EnterWorld
//if (type == 0)
{
//Thread.Sleep(100);
Account m_Authorized = ClientConnection.CurrentAccounts.FirstOrDefault(kv => kv.Value.Session == cookie).Value;
//Account m_Authorized = ClientConnection.CurrentAccounts.First(kv => kv.Value.AccountId == accountId).Value;
//Account m_Authorized = ClientConnection.CurrentAccounts.FirstOrDefault(kv => kv.Value.Session == cookie && kv.Value.AccountId == accountId).Value;
Account m_Authorized = ClientConnection.CurrentAccounts.FirstOrDefault(kv => kv.Value.Session == cookie && kv.Value.AccountId == accountId).Value;
if (m_Authorized == null)
{
net.Dispose();
Expand All @@ -265,7 +268,7 @@ 0026 4 integer index 0 | $00000000
net.SendAsync(new NP_ChangeState(-1)); //начальный пакет NP_ChangeState с параметром 0
}
}
}
}
public static void OnPacketReceive_FinishState0201(ClientConnection net, PacketReader reader)
{
int state = reader.ReadLEInt32(); //считываем state
Expand Down Expand Up @@ -341,7 +344,7 @@ public static void OnPacketReceive_ClientE17B(ClientConnection net, PacketReader
//пакет №17 DD05 S>C
net.SendAsync(new NP_Packet_CharList_0x0079()); //0209DD051E05ACB68556F261C495603654B3CB183376E4B591B032F
//эти пакеты нужны когда есть чары в лобби
//пакет №18 DD05 S>C
//пакет №18 DD05 S>C
net.SendAsync(new NP_Packet_0x014F()); //2400DD0564F11F825223F4C495643405D55A754516E634B7D47DF7C797704010E0B081514272
//пакет №19 DD05 S>C
net.SendAsync(new NP_Packet_0x0145()); //1D00DD052777B6070231744517E6BD86214285B4FE1F2E30D1BD8B5DC4F423
Expand Down Expand Up @@ -407,8 +410,7 @@ public static void OnPacketReceive_ClientAuthorized(ClientConnection net, Packet
long accountId = reader.ReadLEInt64(); //Account Id
reader.Offset += 4;
int sessionId = reader.ReadLEInt32(); //User Session Id
Account m_Authorized = ClientConnection.CurrentAccounts.FirstOrDefault(kv => kv.Value.AccountId == accountId).Value;
//Account m_Authorized = ClientConnection.CurrentAccounts.FirstOrDefault(kv => kv.Value.Session == sessionId && kv.Value.AccountId == accountId).Value;
Account m_Authorized = ClientConnection.CurrentAccounts.FirstOrDefault(kv => kv.Value.Session == sessionId && kv.Value.AccountId == accountId).Value;
if (m_Authorized == null)
{
net.Dispose();
Expand Down Expand Up @@ -476,7 +478,6 @@ 1AC7000000000000 61617465737400 616174657374616100 33316533346632623732643933626
//Set Account Info
Account account = new Account
{
//reader.Offset += 2; //Undefined Random Byte
AccountId = reader.ReadLEInt64(),
Name = reader.ReadDynamicString(),
//Password = reader.ReadDynamicString(),
Expand All @@ -490,9 +491,7 @@ 1AC7000000000000 61617465737400 616174657374616100 33316533346632623732643933626
};
Logger.Trace("Prepare login account ID: {0}, Session(cookie): {1}", account.AccountId, account.Session);
//Check if the account is online and force it to disconnect online
//Account m_Authorized = ClientConnection.CurrentAccounts.FirstOrDefault(kv => kv.Value.AccountId == account.AccountId).Value;
//Account m_Authorized = ClientConnection.CurrentAccounts.FirstOrDefault(kv => kv.Value.Session == account.Session && kv.Value.AccountId == account.AccountId).Value;
Account m_Authorized = ClientConnection.CurrentAccounts.FirstOrDefault(kv => kv.Value.Session == account.Session).Value;
Account m_Authorized = ClientConnection.CurrentAccounts.FirstOrDefault(kv => kv.Value.Session == account.Session && kv.Value.AccountId == account.AccountId).Value;
if (m_Authorized != null)
{
//Already
Expand All @@ -504,47 +503,36 @@ 1AC7000000000000 61617465737400 616174657374616100 33316533346632623732643933626
}
else
{
//Исправление входа второго пользователя, вторичный логин
ClientConnection.CurrentAccounts.Remove(m_Authorized.Session);
Logger.Trace("Account Name: {0} double connection is forcibly disconnected", acc.Name);
ClientConnection.CurrentAccounts.Add(account.Session, account);
Logger.Trace("Account Name: {0}, Session(cookie): {1} authorized", account.Name, account.Session);
}
}
else
{
ClientConnection.CurrentAccounts.Add(account.Session, account);
Logger.Trace("Account Name: {0}, Session(cookie): {1} authorized", account.Name, account.Session);
}
//if (ClientConnection.CurrentAccounts.ContainsKey(account.Session))
//{
// //Already
// Account acc = ClientConnection.CurrentAccounts[account.Session];
// if (acc.Connection != null)
// {
// acc.Connection.Dispose(); //Disconenct
// Logger.Trace("Account " + acc.Name + " Was Forcibly Disconnected");
// }
// else
// {
// Logger.Trace("Account " + account.Name + " was forcibly disconnected");
// ClientConnection.CurrentAccounts.Remove(account.Session);
// }
//}
//else
//{
// Logger.Trace("Account {0}: Authorized", account.Name);
// ClientConnection.CurrentAccounts.Add(account.Session, account);
//}

}

private static void Handle_GameRegisterResult(LoginConnection con, PacketReader reader)
{
bool result = reader.ReadBoolean();
if (result)
{
Logger.Trace("LoginServer successfully installed");
}
else
{
Logger.Trace("Some problems are appear while installing LoginServer");
}

if (result)
{
m_CurrentLoginServer = con;
}
}
#endregion

Expand All @@ -567,6 +555,5 @@ private static void Register(byte level, ushort opcode, OnPacketReceive<ClientCo
levels[level][opcode] = new PacketHandler<ClientConnection>(opcode, e);
}
}

}
}
12 changes: 6 additions & 6 deletions ArcheAge/ArcheAge/Network/Packets/Server/NP_Packet_0x0145.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ 000010 21 42 85 B4 FE 1F 2E 30 | D1 BD 8B 5D C4 F4 23 !B…´þ..0ѽ‹
ns.Write((short)0x01);
///size.uiData
///0B00 76657273696F6E20310D0A
const string uiData = "76657273696F6E20310D0A";
string uiData = "76657273696F6E20310D0A";
ns.WriteHex(uiData, uiData.Length);
///size 4
///0C00000000
Expand Down Expand Up @@ -79,7 +79,7 @@ 000010 21 42 85 B4 FE 1F 2E 30 | D2 BD 8B 5D C4 F4 23 !B…´þ..0Ò½‹
ns.Write((short)0x02);
///size.uiData
///0B00 76657273696F6E20320D0A
const string uiData = "76657273696F6E20320D0A";
string uiData = "76657273696F6E20320D0A";
ns.WriteHex(uiData, uiData.Length);
///size 4
///0C00000000
Expand Down Expand Up @@ -117,10 +117,10 @@ 000010 21 42 85 B4 FE 1F 2E 30 | D1 BD 8B 5D C4 F4 23 !B…´þ..0ѽ‹
ns.Write((int)0x01E796);
///uiDataType 2
///0100
ns.Write((short)0x02);
ns.Write((short)0x01);
///size.uiData
///0B00 76657273696F6E20310D0A
const string uiData = "76657273696F6E20320D0A";
string uiData = "76657273696F6E20310D0A";
ns.WriteHex(uiData, uiData.Length);
///size 4
///0C00000000
Expand Down Expand Up @@ -158,10 +158,10 @@ 000010 21 42 85 B4 FE 1F 2E 30 | D2 BD 8B 5D C4 F4 23 !B…´þ..0Ò½‹
ns.Write((int)0x01E796);
///uiDataType 2
///0200
ns.Write((short)0x01);
ns.Write((short)0x02);
///size.uiData
///0B00 76657273696F6E20320D0A
const string uiData = "76657273696F6E20320D0A";
string uiData = "76657273696F6E20320D0A";
ns.WriteHex(uiData, uiData.Length);
///size 4
///0C00000000
Expand Down
2 changes: 1 addition & 1 deletion ArcheAgeLogin/ArcheAge Login Server.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
<OutputType>Exe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>ArcheAgeLogin</RootNamespace>
<AssemblyName>ArcheAgeLogin</AssemblyName>
<AssemblyName>AALoginServer</AssemblyName>
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<TargetFrameworkProfile>
Expand Down
5 changes: 5 additions & 0 deletions ArcheAgeLogin/ArcheAge/Network/PacketList.cs
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,11 @@ private static void Handle_CAChallengeResponse2_0X06(ArcheAgeConnection net, Pac
if (n_Current.Token.ToLower() == m_RToken.ToLower())
{
net.CurrentAccount = n_Current;
if (GameServerController.AuthorizedAccounts.ContainsKey(net.CurrentAccount.AccountId))
{
//Удалим результаты предыдущего коннекта для нормального реконнекта
GameServerController.AuthorizedAccounts.Remove(net.CurrentAccount.AccountId);
}
//Write account number information Write Online account list
GameServerController.AuthorizedAccounts.Add(net.CurrentAccount.AccountId, net.CurrentAccount);
Logger.Trace("Account ID: " + n_Current.AccountId + " & Account Name: " + n_Current.Name + " landing success");
Expand Down
Loading

0 comments on commit 13baffb

Please sign in to comment.