/// <summary> /// /// </summary> /// <param name="netState"></param> /// <param name="packetReader"></param> internal static void Realm_HandleRequestSessionResult(NetState netState, PacketReader packetReader) { RealmExtendData extendData = netState.GetComponent <RealmExtendData>(RealmExtendData.COMPONENT_ID); if (extendData == null) { Debug.WriteLine("Realm_PacketHandlers.Realm_HandleRequestSessionResult(...) - extendData == null error!"); return; } if (extendData.IsLoggedIn == false) { Debug.WriteLine("Realm_PacketHandlers.Realm_HandleRequestSessionResult(...) - extendData.IsLoggedIn == false error!"); return; } uint iSerial = packetReader.ReadUInt32(); NetState worldNetState = PendingLogins.GetAuthenticate(iSerial); if (worldNetState == null) { Debug.WriteLine("Realm_PacketHandlers.Realm_HandleRequestSessionResult(...) - sendNetState == null error!"); return; } PendingLogins.RemoveAuthenticate(iSerial); WorldPacketHandlers.InternalCallbackAuthenticate(worldNetState, packetReader); }
/// <summary> /// /// </summary> /// <param name="netState"></param> /// <param name="packetReader"></param> internal static void World_HandleRealmSplitStateRequest(NetState netState, PacketReader packetReader) { LOGs.WriteLine(LogMessageType.MSG_HACK, "World_HandleRealmSplitStateRequest...... {0} ", packetReader.Size); WorldExtendData extendData = netState.GetComponent <WorldExtendData>(WorldExtendData.COMPONENT_ID); if (extendData == null) { Debug.WriteLine("World_PacketHandlers.World_HandleRealmSplitStateRequest(...) - extendData == null error!"); return; } if (extendData.IsLoggedIn == false) { Debug.WriteLine("World_PacketHandlers.World_HandleRealmSplitStateRequest(...) - extendData.IsLoggedIn == false error!"); return; } if (packetReader.Size < 10 /*ProcessNet.WORLD_HEAD_SIZE + 0*/) { Debug.WriteLine("World_PacketHandlers.World_HandleRealmSplitStateRequest(...) - extendData.Size < 10 error!"); return; } uint iUnknown = packetReader.ReadUInt32(); netState.Send(new Word_RealmSplitStateRequest(iUnknown)); //netState.Send( new Word_CharEnumResponse( new WowCharacterInfo[0] ) ); }
internal static void World_HandleCharDelete(NetState netState, PacketReader packetReader) { LOGs.WriteLine(LogMessageType.MSG_ERROR, "World_HandleCharDelete!"); WorldExtendData extendData = netState.GetComponent <WorldExtendData>(WorldExtendData.COMPONENT_ID); if (extendData == null) { Debug.WriteLine("World_PacketHandlers.World_HandleCharDelete(...) - extendData == null error!"); return; } if (extendData.IsLoggedIn == false) { Debug.WriteLine("World_PacketHandlers.World_HandleCharDelete(...) - extendData.IsLoggedIn == false error!"); return; } ulong iGuid = packetReader.ReadULong64(); CharDeleteSQL charEnumSQL = new CharDeleteSQL(extendData, netState, (long)iGuid); WaitExecuteInfo <CharDeleteSQL> waitExecuteInfo = new WaitExecuteInfo <CharDeleteSQL>(charEnumSQL, WorldPacketHandlers.SQL_HandleCharDelete); ProcessServer.WowZoneCluster.World.WaitExecute.JoinWaitExecuteQueue(waitExecuteInfo); }
/// <summary> /// /// </summary> /// <param name="netState"></param> /// <param name="packetReader"></param> public static void World_HandleAuthSession(NetState netState, PacketReader packetReader) { WorldExtendData extendData = netState.GetComponent <WorldExtendData>(WorldExtendData.COMPONENT_ID); if (extendData == null) { Debug.WriteLine("World_PacketHandlers.World_AuthSession(...) - extendData == null error!"); return; } if (extendData.IsLoggedIn == true) { Debug.WriteLine("World_PacketHandlers.World_AuthSession(...) - extendData.IsLoggedIn == true error!"); return; } extendData.AuthSession = AuthSession.ReadWorldAuthSession(packetReader); Serial serial = PendingLogins.ExclusiveSerial.GetExclusiveSerial(); PendingLogins.AddAuthenticate(serial, netState); // 等待登陆 // 通知 Realm Server 有新的客户端需要验证 ProcessServer.RealmNetState.Send(new Realm_RequestSession(serial, extendData.AuthSession.AccountName)); }
/// <summary> /// 开始发送服务端随机的种子给客户端 /// </summary> private static void WorldInitConnect(object sender, NetStateConnectEventArgs eventArgs) { LOGs.WriteLine(LogMessageType.MSG_HACK, "World_InitConnect...... 0"); NetState netState = eventArgs.NetStateConnect; if (netState == null) { Debug.WriteLine("ProcessNet.World_InitConnect(...) - netState == null error!"); } else { // 发送服务端随机的种子信息 if (netState.Running) { WorldExtendData extendData = netState.GetComponent <WorldExtendData>(WorldExtendData.COMPONENT_ID); if (extendData == null) { Debug.WriteLine("ProcessNet.World_InitConnect(...) - extendData == null error!"); return; } netState.Send(new Word_AuthChallenge(extendData.ServerSeed)); } } }
/// <summary> /// /// </summary> /// <param name="netState"></param> /// <param name="packetReader"></param> internal static void Realm_HandleRegisterRealmResult(NetState netState, PacketReader packetReader) { RealmExtendData extendData = netState.GetComponent <RealmExtendData>(RealmExtendData.COMPONENT_ID); if (extendData == null) { Debug.WriteLine("Realm_PacketHandlers.Realm_HandleRegisterRealmResult(...) - extendData == null error!"); return; } if (extendData.IsLoggedIn == true) { Debug.WriteLine("Realm_PacketHandlers.Realm_HandleRegisterRealmResult(...) - extendData.IsLoggedIn == true error!"); return; } uint iRealmSerial = packetReader.ReadUInt32(); extendData.RegisterRealmResult.Serial = new Serial(iRealmSerial); // 已经登陆 extendData.IsLoggedIn = true; // 3分钟 向服务端发一次心跳信号 TimeSlice.StartTimeSlice(TimerPriority.Lowest, TimeSpan.FromMinutes(3), TimeSpan.FromMinutes(3), new TimeSliceCallback(SendPing)); LOGs.WriteLine(LogMessageType.MSG_INFO, "RealmServer:登陆RealmServer服务器成功 返回的标示ID({0})", extendData.RegisterRealmResult.Serial.ToString()); }
/// <summary> /// Áбí·þÎñ /// </summary> /// <param name="netState"></param> /// <param name="packetReader"></param> public static void Auth_HandleRealmList(NetState netState, PacketReader packetReader) { AuthExtendData extendData = netState.GetComponent <AuthExtendData>(AuthExtendData.COMPONENT_ID); if (extendData == null) { Debug.WriteLine("Auth_PacketHandlers.Auth_HandleRealmList(...) - extendData == null error!"); return; } if (extendData.IsLoggedIn == false) { Debug.WriteLine("Auth_PacketHandlers.Auth_HandleRealmList(...) - extendData.IsLoggedIn == false error!"); return; } if (extendData.IsAuthenticated == false) { Debug.WriteLine("Auth_PacketHandlers.Auth_HandleRealmList(...) - extendData.IsAuthenticated == false error!"); return; } byte iCommandID = packetReader.ReadByte(); uint iUnk = packetReader.ReadUInt32(); netState.Send(new Auth_RealmListResult()); }
internal static void World_HandleCharRename(NetState netState, PacketReader packetReader) { WorldExtendData extendData = netState.GetComponent <WorldExtendData>(WorldExtendData.COMPONENT_ID); if (extendData == null) { Debug.WriteLine("World_PacketHandlers.World_HandleCharDelete(...) - extendData == null error!"); return; } if (extendData.IsLoggedIn == false) { Debug.WriteLine("World_PacketHandlers.World_HandleCharDelete(...) - extendData.IsLoggedIn == false error!"); return; } ulong iGuid = packetReader.ReadULong64(); string strName = packetReader.ReadUTF8String(); if (ProcessServer.WowZoneCluster.World.GlobalPlayerInfo.GetPlayerInfo(strName) != null) { netState.Send(new Word_CharCreateResponseError(ResponseCodes.CHAR_CREATE_NAME_IN_USE)); return; } CharRenameSQL charEnumSQL = new CharRenameSQL(extendData, netState, (long)iGuid, strName); WaitExecuteInfo <CharRenameSQL> waitExecuteInfo = new WaitExecuteInfo <CharRenameSQL>(charEnumSQL, WorldPacketHandlers.SQL_HandleCharRename); ProcessServer.WowZoneCluster.World.WaitExecute.JoinWaitExecuteQueue(waitExecuteInfo); }
/// <summary> /// 登陆握手 /// </summary> /// <param name="netState"></param> /// <param name="packetReader"></param> public static void Auth_HandleAuthChallenge(NetState netState, PacketReader packetReader) { AuthExtendData extendData = netState.GetComponent <AuthExtendData>(AuthExtendData.COMPONENT_ID); if (extendData == null) { Debug.WriteLine("Auth_PacketHandlers.Auth_HandleAuthChallenge(...) - extendData == null error!"); return; } if (extendData.IsLoggedIn == true) { Debug.WriteLine("Auth_PacketHandlers.Auth_HandleAuthChallenge(...) - extendData.IsLoggedIn == false error!"); return; } extendData.AuthChallenge.AuthLogonChallenge = AuthLogonChallenge.ReadAuthLogonChallenge(packetReader); // 版本验证 if (extendData.AuthChallenge.AuthLogonChallenge.Build > (ushort)CLIENT_VERSIONS.CLIENT_MAX || extendData.AuthChallenge.AuthLogonChallenge.Build < (ushort)CLIENT_VERSIONS.CLIENT_MIN) { netState.Send(new Auth_AuthChallengeResultError(LogineErrorInfo.LOGIN_WRONG_BUILD_NUMBER)); return; } // 帐号是否存在 WowAccount wowAccount = WowAccountHandler.GetAccount(extendData.AuthChallenge.AuthLogonChallenge.AccountName); if (wowAccount == null) { netState.Send(new Auth_AuthChallengeResultError(LogineErrorInfo.LOGIN_NO_ACCOUNT)); return; } extendData.WowAccount = wowAccount; // 帐号是否停用 if (wowAccount.Banned) { netState.Send(new Auth_AuthChallengeResultError(LogineErrorInfo.LOGIN_ACCOUNT_CLOSED)); return; } // 帐号是否在线 if (wowAccount.Locked) { netState.Send(new Auth_AuthChallengeResultError(LogineErrorInfo.LOGIN_ACCOUNT_FREEZED)); return; } // 成功 更新IP WowAccountHandler.UpdateAccountLastIP(wowAccount.AccountName, netState.NetAddress.Address.ToString()); // 登陆成功 extendData.IsLoggedIn = true; // 获取SRP的Key extendData.SRP = new SecureRemotePassword(true, wowAccount.AccountName, wowAccount.Password); netState.Send(new Auth_AuthChallengeResult(extendData.SRP)); }
/// <summary> /// /// </summary> /// <param name="netState"></param> /// <param name="packetReader"></param> public static void Realm_HandleRegisterRealm(NetState netState, PacketReader packetReader) { RealmExtendData extendData = netState.GetComponent <RealmExtendData>(RealmExtendData.COMPONENT_ID); if (extendData == null) { Debug.WriteLine("Realm_PacketHandlers.Realm_HandleRegisterRealm(...) - extendData == null error!"); return; } if (extendData.IsLoggedIn == true) { Debug.WriteLine("Realm_PacketHandlers.Realm_HandleRegisterRealm(...) - extendData.IsLoggedIn == true error!"); return; } Realm realm = new Realm(); realm.Name = packetReader.ReadUTF8String(); realm.Address = packetReader.ReadUTF8String(); string strIcon = packetReader.ReadUTF8String(); if (Insensitive.Equals(strIcon, "PVP")) { realm.Icon = (uint)RealmIconType.REALMTYPE_PVP; } else if (Insensitive.Equals(strIcon, "RP")) { realm.Icon = (uint)RealmIconType.REALMTYPE_RP; } else if (Insensitive.Equals(strIcon, "RPPVP")) { realm.Icon = (uint)RealmIconType.REALMTYPE_RPPVP; } else { realm.Icon = (uint)RealmIconType.REALMTYPE_NORMAL; } realm.Colour = packetReader.ReadUInt32(); realm.TimeZone = packetReader.ReadUInt32(); realm.Population = packetReader.ReadFloat(); extendData.RequestSession.Serial = RealmHandler.RealmsExclusiveSerial.GetExclusiveSerial(); // Add to the main realm list RealmHandler.AddRealm(extendData.RequestSession.Serial, realm); extendData.IsLoggedIn = true; // Send back response packet. netState.Send(new Realm_RegisterRealmResult(extendData.RequestSession.Serial)); }
/// <summary> ///GetComponent 的测试 ///</summary> public void GetComponentTestHelper <T>() where T : class, IComponent { ClientSocketManager clientSocket = null; // TODO: 初始化为适当的值 MessagePump messagePump = null; // TODO: 初始化为适当的值 NetState target = new NetState(clientSocket, messagePump); // TODO: 初始化为适当的值 ComponentId componentId = new ComponentId(); // TODO: 初始化为适当的值 T expected = null; // TODO: 初始化为适当的值 T actual; actual = target.GetComponent <T>(componentId); Assert.AreEqual(expected, actual); Assert.Inconclusive("验证此测试方法的正确性。"); }
/// <summary> /// /// </summary> /// <param name="netState"></param> /// <param name="packetReader"></param> internal static void Realm_HandlePong(NetState netState, PacketReader packetReader) { RealmExtendData extendData = netState.GetComponent <RealmExtendData>(RealmExtendData.COMPONENT_ID); if (extendData == null) { Debug.WriteLine("Realm_PacketHandlers.Realm_HandlePong(...) - extendData == null error!"); return; } if (extendData.IsLoggedIn == false) { Debug.WriteLine("Realm_PacketHandlers.Realm_HandlePong(...) - extendData.IsLoggedIn == false error!"); return; } }
/// <summary> /// /// </summary> /// <param name="netState"></param> /// <param name="packetReader"></param> internal static void World_HandleCancelTrade(NetState netState, PacketReader packetReader) { WorldExtendData extendData = netState.GetComponent <WorldExtendData>(WorldExtendData.COMPONENT_ID); if (extendData == null) { Debug.WriteLine("World_PacketHandlers.World_HandleCancelTrade(...) - extendData == null error!"); return; } if (extendData.IsLoggedIn == false) { Debug.WriteLine("World_PacketHandlers.World_HandleCancelTrade(...) - extendData.IsLoggedIn == false error!"); return; } netState.Send(new Word_TradeStatus(TRADE_STATUS.TRADE_STATUS_CANCELLED)); }
/// <summary> /// /// </summary> /// <param name="netState"></param> /// <param name="packetReader"></param> internal static void World_HandleEnableMicrophone(NetState netState, PacketReader packetReader) { WorldExtendData extendData = netState.GetComponent <WorldExtendData>(WorldExtendData.COMPONENT_ID); if (extendData == null) { Debug.WriteLine("World_PacketHandlers.World_HandleEnableMicrophone(...) - extendData == null error!"); return; } if (extendData.IsLoggedIn == false) { Debug.WriteLine("World_PacketHandlers.World_HandleEnableMicrophone(...) - extendData.IsLoggedIn == false error!"); return; } bool bVoiceEnabled = packetReader.ReadBoolean(); bool bMicEnabled = packetReader.ReadBoolean(); }
/// <summary> /// /// </summary> /// <param name="netState"></param> /// <param name="packetReader"></param> internal static void World_HandleChannelNumMembersQuery(NetState netState, PacketReader packetReader) { WorldExtendData extendData = netState.GetComponent <WorldExtendData>(WorldExtendData.COMPONENT_ID); if (extendData == null) { Debug.WriteLine("World_PacketHandlers.World_HandleChannelNumMembersQuery(...) - extendData == null error!"); return; } if (extendData.IsLoggedIn == false) { Debug.WriteLine("World_PacketHandlers.World_HandleChannelNumMembersQuery(...) - extendData.IsLoggedIn == false error!"); return; } string strChannelName = packetReader.ReadUTF8String(); netState.Send(new Word_ChannelNumMembersQueryResponse(strChannelName, 0, 0)); }
/// <summary> /// /// </summary> /// <param name="netState"></param> /// <param name="packetReader"></param> internal static void World_HandleCharEnum(NetState netState, PacketReader packetReader) { WorldExtendData extendData = netState.GetComponent <WorldExtendData>(WorldExtendData.COMPONENT_ID); if (extendData == null) { Debug.WriteLine("World_PacketHandlers.World_HandleCharEnum(...) - extendData == null error!"); return; } if (extendData.IsLoggedIn == false) { Debug.WriteLine("World_PacketHandlers.World_HandleCharEnum(...) - extendData.IsLoggedIn == false error!"); return; } CharEnumSQL charEnumSQL = new CharEnumSQL(extendData, netState); WaitExecuteInfo <CharEnumSQL> waitExecuteInfo = new WaitExecuteInfo <CharEnumSQL>(charEnumSQL, WorldPacketHandlers.SQL_HandleCharEnum); ProcessServer.WowZoneCluster.World.WaitExecute.JoinWaitExecuteQueue(waitExecuteInfo); }
/// <summary> /// /// </summary> /// <param name="netState"></param> /// <param name="packetReader"></param> public static void World_HandlePing(NetState netState, PacketReader packetReader) { WorldExtendData extendData = netState.GetComponent <WorldExtendData>(WorldExtendData.COMPONENT_ID); if (extendData == null) { Debug.WriteLine("World_PacketHandlers.World_HandlePing(...) - extendData == null error!"); return; } if (extendData.IsLoggedIn == false) { Debug.WriteLine("World_PacketHandlers.World_HandlePing(...) - extendData.IsLoggedIn == false error!"); return; } uint iPing = packetReader.ReadUInt32(); extendData.Ping.Latency = packetReader.ReadUInt32(); netState.Send(new Word_Pong(iPing)); }
/// <summary> /// /// </summary> /// <param name="netState"></param> /// <param name="packetReader"></param> public static void Realm_HandleRequestSession(NetState netState, PacketReader packetReader) { RealmExtendData extendData = netState.GetComponent <RealmExtendData>(RealmExtendData.COMPONENT_ID); if (extendData == null) { Debug.WriteLine("Realm_PacketHandlers.Realm_HandleRequestSession(...) - extendData == null error!"); return; } if (extendData.IsLoggedIn == false) { Debug.WriteLine("Realm_PacketHandlers.Realm_HandleRequestSession(...) - extendData.IsLoggedIn == false error!"); return; } uint iSerial = packetReader.ReadUInt32(); string strAccountName = packetReader.ReadUTF8StringSafe(); WowAccount wowAccount = WowAccountHandler.GetAccount(strAccountName); if (wowAccount == null) { netState.Send(new Realm_RequestSessionResultError(iSerial)); return; } SecureRemotePassword srp = SrpHandler.GetSRP(strAccountName); if (srp == null) { netState.Send(new Realm_RequestSessionResultError(iSerial)); return; } netState.Send(new Realm_RequestSessionResult(iSerial, wowAccount, srp)); }
/// <summary> /// /// </summary> /// <param name="netState"></param> /// <param name="packetReader"></param> internal static void ZoneCluster_HandlerLoginZoneCluster(NetState netState, PacketReader packetReader) { ZoneCluster_ListenerExtendData extendData = netState.GetComponent <ZoneCluster_ListenerExtendData>(ZoneCluster_ListenerExtendData.COMPONENT_ID); if (extendData == null) { throw new Exception("ZoneCluster_PacketHandlers.ZoneCluster_HandlerLoginZoneCluster(...) - extendData == null error!"); } if (extendData.IsLoggedIn == true) { LOGs.WriteLine(LogMessageType.MSG_ERROR, "ZoneCluster_PacketHandlers.ZoneCluster_HandlerLoginZoneCluster(...) - extendData.IsLoggedIn == true error!"); return; } string strZoneClusterPassword = packetReader.ReadUTF8String(); string strZoneOrDomainPassword = packetReader.ReadUTF8String(); if (extendData.ConfigZoneCluster.ZoneClusterPassword == strZoneClusterPassword) { extendData.IsLoggedIn = true; // 检查是 Domain 服务端登陆 还是 Zone客户端登陆 if (extendData.ConfigZoneCluster.DomainPassword == strZoneOrDomainPassword) { extendData.IsDomainServer = true; } else { extendData.IsZoneServer = true; } extendData.ServerPassword = strZoneOrDomainPassword; } netState.Send(new ZoneCluster_LoginZoneClusterResult(extendData.IsLoggedIn)); }
/// <summary> /// /// </summary> /// <param name="netState"></param> /// <param name="packetReader"></param> internal static void Zone_HandlerLoginZoneClusterResult(NetState netState, PacketReader packetReader) { Zone_ConnecterExtendData extendData = netState.GetComponent <Zone_ConnecterExtendData>(Zone_ConnecterExtendData.COMPONENT_ID); if (extendData == null) { throw new Exception("Zone_PacketHandlers.Zone_HandlerLoginZoneClusterResult(...) - extendData == null error!"); } if (extendData.IsLoggedIn == true) { LOGs.WriteLine(LogMessageType.MSG_ERROR, "Zone_PacketHandlers.Zone_HandlerLoginZoneClusterResult(...) - extendData.IsLoggedIn == true error!"); return; } LoginZoneClusterResult loginZoneClusterResult = LoginZoneClusterResult.GetLoginZoneClusterResult(packetReader); if (loginZoneClusterResult.IsCheckPass) { LOGs.WriteLine(LogMessageType.MSG_INFO, "ZoneWorld:登陆ZoneCluster服务器 成功!"); extendData.IsLoggedIn = true; } }
/// <summary> /// 登陆验证 /// </summary> /// <param name="netState"></param> /// <param name="packetReader"></param> public static void Auth_HandleAuthProof(NetState netState, PacketReader packetReader) { AuthExtendData extendData = netState.GetComponent <AuthExtendData>(AuthExtendData.COMPONENT_ID); if (extendData == null) { Debug.WriteLine("Auth_PacketHandlers.Auth_AuthProof(...) - extendData == null error!"); return; } if (extendData.IsLoggedIn == false) { Debug.WriteLine("Auth_PacketHandlers.Auth_AuthProof(...) - extendData.IsLoggedIn == false error!"); return; } extendData.AuthProof.AuthLogonProof = AuthLogonProof.ReadAuthLogonProof(packetReader); extendData.SRP.PublicEphemeralValueA = extendData.AuthProof.AuthLogonProof.PublicEphemeralValueA; if (extendData.SRP.IsClientProofValid(extendData.AuthProof.AuthLogonProof.ClientProof) == false) { // Authentication failed. //netState.Send( new RealmList_AuthProofResultError( RealmListErrorsInfo.LOGIN_NO_ACCOUNT ) ); netState.Send(new Auth_AuthChallengeResultError(LogineErrorInfo.LOGIN_NO_ACCOUNT)); return; } // 添加到全局的Key中 SrpHandler.AddSRP(extendData.WowAccount.AccountName, extendData.SRP); // we're authenticated now :) extendData.IsAuthenticated = true; netState.Send(new Auth_AuthProofResult(extendData.SRP)); }
/// <summary> /// /// </summary> internal static void InternalCallbackAuthenticate(NetState netState, PacketReader packetReader) { WorldExtendData worldExtendData = netState.GetComponent <WorldExtendData>(WorldExtendData.COMPONENT_ID); if (worldExtendData == null) { Debug.WriteLine("World_PacketHandlers.World_HandleAuthSession(...) - worldExtendData == null error!"); netState.Send(new Word_AuthResponseError(ResponseCodes.AUTH_FAILED)); return; } if (worldExtendData.IsLoggedIn == true) { Debug.WriteLine("World_PacketHandlers.World_HandleAuthSession(...) - worldExtendData.IsLoggedIn == true error!"); netState.Send(new Word_AuthResponseError(ResponseCodes.AUTH_FAILED)); return; } bool isNoError = packetReader.ReadBoolean(); if (isNoError == false) { netState.Send(new Word_AuthResponseError(ResponseCodes.AUTH_FAILED)); return; } // 读取数据 uint iAccountsGuid = packetReader.ReadUInt32(); AccessLevel iAccessLevel = (AccessLevel)packetReader.ReadInt32(); bool bIsTBC = packetReader.ReadBoolean(); byte[] byteSessionKey = new byte[40]; packetReader.ReadBuffer(ref byteSessionKey, 0, 40); // 开始鉴别 SHA1 sha1 = new SHA1CryptoServiceProvider(); byte[] byteAccountName = worldExtendData.AuthSession.AccountName.ToArrayInByte(Encoding.ASCII); byte[] byteT = ((uint)0).ToArrayInByte(); byte[] byteClientSeed = ((uint)worldExtendData.AuthSession.ClientSeed).ToArrayInByte(); byte[] byteSeed = ((uint)worldExtendData.ServerSeed).ToArrayInByte(); byte[] tempData0 = byteAccountName.Coalition(byteT); byte[] tempData1 = tempData0.Coalition(byteClientSeed); byte[] tempData2 = tempData1.Coalition(byteSeed); byte[] tempData3 = tempData2.Coalition(byteSessionKey); byte[] byteResult = sha1.ComputeHash(tempData3); // 是否成功 bool bIsOK = Algorithms.EqualCollections(byteResult, worldExtendData.AuthSession.Digest); if (bIsOK == false) { netState.Send(new Word_AuthResponseError((uint)ResponseCodes.AUTH_UNKNOWN_ACCOUNT)); return; } // 初始化 加解密的Key worldExtendData.WowCrypt.InitKey(byteSessionKey, 40); worldExtendData.CommonData.AccountsGuid = iAccountsGuid; worldExtendData.CommonData.AccountName = worldExtendData.AuthSession.AccountName; worldExtendData.CommonData.IsTBC = bIsTBC; //WowPlayerInfo wowPlayerInfo = new WowPlayerInfo(); //wowPlayerInfo.AccessLevel = iAccessLevel; //wowPlayerInfo.AccountName = worldExtendData.AuthSession.AccountName; //wowPlayerInfo.Serial = iAccountsGuid; //wowPlayerInfo.ClientBuild = worldExtendData.AuthSession.ClientBuild; //wowPlayerInfo.LastPing = DateTime.Now; //wowPlayerInfo.IsTBC = bIsTBC; //wowPlayerInfo.NetState = netState; //Program.BaseWorld.CharacterManager.AddCharacter( wowPlayerInfo.Serial, wowPlayerInfo ); if (ProcessServer.WowZoneCluster.World.CharacterManager.Count < 600 || iAccessLevel == AccessLevel.GameMaster) { worldExtendData.IsLoggedIn = true; netState.Send(new Word_AuthResponse(bIsTBC)); if (worldExtendData.AuthSession.AddonInfo != null) { netState.Send(worldExtendData.AuthSession.AddonInfo); } } else { // 等待玩家的减少 WaitQueueLogins.Enqueue(netState); } }
/// <summary> /// /// </summary> /// <param name="netState"></param> /// <param name="packetReader"></param> internal static void World_HandleCharCreate(NetState netState, PacketReader packetReader) { WorldExtendData extendData = netState.GetComponent <WorldExtendData>(WorldExtendData.COMPONENT_ID); if (extendData == null) { Debug.WriteLine("World_PacketHandlers.World_HandleCharEnum(...) - extendData == null error!"); return; } if (extendData.IsLoggedIn == false) { Debug.WriteLine("World_PacketHandlers.World_HandleCharEnum(...) - extendData.IsLoggedIn == false error!"); return; } string strName = packetReader.ReadUTF8StringSafe(); byte iRace = packetReader.ReadByte(); byte iClass = packetReader.ReadByte(); byte iGender = packetReader.ReadByte(); byte iSkin = packetReader.ReadByte(); byte iFace = packetReader.ReadByte(); byte iHairStyle = packetReader.ReadByte(); byte iHairColor = packetReader.ReadByte(); byte iFacialHair = packetReader.ReadByte(); byte iOutFitId = packetReader.ReadByte(); if (WorldPacketHandlers.VerifyName(strName) == false) { netState.Send(new Word_CharCreateResponseError(ResponseCodes.CHAR_CREATE_NAME_IN_USE)); return; } if (ProcessServer.WowZoneCluster.World.GlobalPlayerInfo.GetPlayerInfo(strName) != null) { netState.Send(new Word_CharCreateResponseError(ResponseCodes.CHAR_CREATE_NAME_IN_USE)); return; } WowCharacterCreateInfo wowCharacterCreateInfo = ProcessServer.WowZoneCluster.World.GlobalCreateInfo.GetCreateInfo(iRace, iClass); if (wowCharacterCreateInfo == null) { netState.Send(new Word_CharCreateResponseError(ResponseCodes.CHAR_CREATE_NAME_IN_USE)); return; } if ((iRace == WowRace.BloodElf || iRace == WowRace.Draenei) && extendData.CommonData.IsTBC == false) { netState.Send(new Word_CharCreateResponseError(ResponseCodes.CHAR_CREATE_NAME_IN_USE)); return; } WowCharacterLevelInfo[] wowCharacterLevelInfo = ProcessServer.WowZoneCluster.World.GlobalLevelInfo.GetLevelInfo(iRace, iClass); if (wowCharacterLevelInfo == null) { netState.Send(new Word_CharCreateResponseError(ResponseCodes.CHAR_CREATE_NAME_IN_USE)); return; } WowCharacter wowPlayerInfo = new WowCharacter(); wowPlayerInfo.Serial = 0; wowPlayerInfo.IsTBC = extendData.CommonData.IsTBC; wowPlayerInfo.AccountGuid = extendData.CommonData.AccountsGuid; wowPlayerInfo.Name = strName; wowPlayerInfo.Race = iRace; wowPlayerInfo.Class = iClass; wowPlayerInfo.Gender = iGender; wowPlayerInfo.Skin = iSkin; wowPlayerInfo.Face = iFace; wowPlayerInfo.HairStyle = iHairStyle; wowPlayerInfo.HairColor = iHairColor; wowPlayerInfo.FacialHair = iFacialHair; wowPlayerInfo.X = wowCharacterCreateInfo.PositionX; wowPlayerInfo.Y = wowCharacterCreateInfo.PositionY; wowPlayerInfo.Z = wowCharacterCreateInfo.PositionZ; wowPlayerInfo.MapId = wowCharacterCreateInfo.Map; wowPlayerInfo.ZoneId = wowCharacterCreateInfo.Zone; wowPlayerInfo.BindX = 0; wowPlayerInfo.BindY = 0; wowPlayerInfo.BindZ = 0; wowPlayerInfo.BindMapId = 0; wowPlayerInfo.BindZoneId = 0; ChrRacesEntry chrRacesEntry = DBCInstances.ChrRacesEntry.LookupIDEntry(iRace); if (chrRacesEntry == null) { netState.Send(new Word_CharCreateResponseError(ResponseCodes.CHAR_CREATE_NAME_IN_USE)); return; } if (chrRacesEntry.m_TeamId == 7) { wowPlayerInfo.TeamId = WowTeam.ALLIANCE; } else { wowPlayerInfo.TeamId = WowTeam.HORDE; } ChrClassesEntry chrClassesEntry = DBCInstances.ChrClassesEntry.LookupIDEntry(iClass); if (chrClassesEntry == null) { netState.Send(new Word_CharCreateResponseError(ResponseCodes.CHAR_CREATE_NAME_IN_USE)); return; } wowPlayerInfo.PowerType = chrClassesEntry.m_PowerType; switch (iRace) { case (byte)WowRace.Tauren: wowPlayerInfo.TaxiMask[0] = 1 << (22 - 1); break; case (byte)WowRace.Human: wowPlayerInfo.TaxiMask[0] = 1 << (2 - 1); break; case (byte)WowRace.Dwarf: wowPlayerInfo.TaxiMask[0] = 1 << (6 - 1); break; case (byte)WowRace.Gnome: wowPlayerInfo.TaxiMask[0] = 1 << (6 - 1); break; case (byte)WowRace.Orc: wowPlayerInfo.TaxiMask[0] = 1 << (23 - 1); break; case (byte)WowRace.Troll: wowPlayerInfo.TaxiMask[0] = 1 << (23 - 1); break; case (byte)WowRace.Undead: wowPlayerInfo.TaxiMask[0] = 1 << (11 - 1); break; case (byte)WowRace.Nightelf: wowPlayerInfo.TaxiMask[0] = 1 << (27 - 1); break; case (byte)WowRace.BloodElf: wowPlayerInfo.TaxiMask[2] = 1 << (18 - 1); break; case (byte)WowRace.Draenei: wowPlayerInfo.TaxiMask[2] = 1 << (30 - 1); break; } wowPlayerInfo.Size = (iRace == WowRace.Tauren) ? 1.3f : 1.0f; wowPlayerInfo.Health = wowCharacterLevelInfo[0].Health; wowPlayerInfo.Mana = wowCharacterLevelInfo[0].Mana; wowPlayerInfo.Rage = 0; wowPlayerInfo.Focus = 0; wowPlayerInfo.Energy = 0; wowPlayerInfo.MaxHealth = wowCharacterLevelInfo[0].Health; wowPlayerInfo.MaxMana = wowCharacterLevelInfo[0].Mana; wowPlayerInfo.MaxRage = 0; wowPlayerInfo.MaxFocus = 0; wowPlayerInfo.MaxEnergy = 0; wowPlayerInfo.BaseHealth = wowCharacterLevelInfo[0].Health; wowPlayerInfo.BaseMana = wowCharacterLevelInfo[0].Mana; wowPlayerInfo.FactionTemplate = 0; wowPlayerInfo.Level = 1; wowPlayerInfo.Strength = wowCharacterLevelInfo[0].Strength; wowPlayerInfo.Agility = wowCharacterLevelInfo[0].Agility; wowPlayerInfo.Stamina = wowCharacterLevelInfo[0].Stamina; wowPlayerInfo.Intellect = wowCharacterLevelInfo[0].Intellect; wowPlayerInfo.Spirit = wowCharacterLevelInfo[0].Spirit; wowPlayerInfo.BoundingRadius = 0.388999998569489f; wowPlayerInfo.CombatReach = 1.5f; if (iGender == 0) { wowPlayerInfo.DisplayId = wowCharacterCreateInfo.MaleDisplayId; wowPlayerInfo.NativeDisplayId = wowCharacterCreateInfo.MaleDisplayId; } else { wowPlayerInfo.DisplayId = wowCharacterCreateInfo.FemaleDisplayId; wowPlayerInfo.NativeDisplayId = wowCharacterCreateInfo.FemaleDisplayId; } wowPlayerInfo.AttackPower = 0; wowPlayerInfo.NextLevelXP = 400; wowPlayerInfo.MaxLevel = 10; for (uint iIndex = 0; iIndex < DBCInstances.FactionEntry.Count; iIndex++) { FactionEntry factionEntry = DBCInstances.FactionEntry.LookupRowEntry(iIndex); if (factionEntry == null) { continue; } if (factionEntry.m_RepListId < 0) { continue; } int iReputation = 0; if ((factionEntry.m_BaseRepMask1 & (1 << (iRace - 1))) != 0) { iReputation = (int)factionEntry.m_BaseRepValue1; } else if ((factionEntry.m_BaseRepMask2 & (1 << (iRace - 1))) != 0) { iReputation = (int)factionEntry.m_BaseRepValue2; } else if ((factionEntry.m_BaseRepMask3 & (1 << (iRace - 1))) != 0) { iReputation = (int)factionEntry.m_BaseRepValue3; } else if ((factionEntry.m_BaseRepMask4 & (1 << (iRace - 1))) != 0) { iReputation = (int)factionEntry.m_BaseRepValue4; } else { continue; } WowReputation wowReputation = new WowReputation() { FactionId = factionEntry.ID, Reputation = iReputation, }; if ((int)wowReputation.CalcRating() <= (int)WowFactionRating.Hostile) { wowReputation.Flag |= (byte)WowFactionFlag.FactionFlagAtWar; } if ((factionEntry.m_Team == 469 && wowPlayerInfo.TeamId == WowTeam.ALLIANCE) || (factionEntry.m_Team == 67 && wowPlayerInfo.TeamId == WowTeam.HORDE)) { wowReputation.Flag |= (byte)WowFactionFlag.FactionFlagVisible; } wowPlayerInfo.ReputationManager.AddReputation(wowReputation.FactionId, wowReputation); } foreach (WowPlayerInfoSkill wowPlayerInfoSkill in wowCharacterCreateInfo.WowPlayerSkills.Skills) { WowSkillTemplate wowSkillTemplate = ProcessServer.WowZoneCluster.World.GlobalSkillTemplates.GetSkillTemplate((long)wowPlayerInfoSkill.Skill) as WowSkillTemplate; if (wowSkillTemplate == null) { continue; } WowSkill wowSkill = new WowSkill() { Serial = wowSkillTemplate.SkillId, SkillTemplate = wowSkillTemplate }; wowPlayerInfo.SkillManager.AddSkill(wowSkill.Serial, wowSkill); } foreach (WowPlayerInfoSpell wowPlayerInfoSpell in wowCharacterCreateInfo.WowPlayerSpells.Spells) { WowSpellTemplate wowSpellTemplate = ProcessServer.WowZoneCluster.World.GlobalSpellTemplates.GetSpellTemplate((long)wowPlayerInfoSpell.Spell) as WowSpellTemplate; if (wowSpellTemplate == null) { continue; } WowSpell wowSpell = new WowSpell() { Serial = wowSpellTemplate.SpellId, SpellTemplate = wowSpellTemplate }; wowPlayerInfo.SpellManager.AddSpell(wowSpell.Serial, wowSpell); } foreach (WowPlayerInfoItem wowPlayerInfoItem in wowCharacterCreateInfo.WowPlayerItems.Items) { WowItemTemplate wowItemTemplate = ProcessServer.WowZoneCluster.World.ItemTemplateManager.GetItemTemplate((long)wowPlayerInfoItem.ItemId) as WowItemTemplate; if (wowItemTemplate == null) { continue; } WowItemContainer equipmentBag = wowPlayerInfo.BagManager.EquipmentBag; if (equipmentBag == null) { break; } WowItem wowItem = equipmentBag.FindSubItemAtSlot(wowItemTemplate.InventoryType) as WowItem; if (wowItem == null) { wowItem = new WowItem() { ItemTemplate = wowItemTemplate }; equipmentBag.AddSubItem(wowItemTemplate.InventoryType, wowItem); } else { WowItemContainer mainBag = wowPlayerInfo.BagManager.MainBag; if (mainBag == null) { break; } wowItem = new WowItem() { ItemTemplate = wowItemTemplate }; mainBag.AddToFreeSlot(wowItem); } } foreach (WowPlayerInfoAction wowPlayerInfoAction in wowCharacterCreateInfo.WowPlayerActions.Actions) { WowActionBar wowActionBar = new WowActionBar() { Serial = wowPlayerInfoAction.Button, Action = wowPlayerInfoAction.Action, Type = wowPlayerInfoAction.Type }; wowPlayerInfo.ActionBarManager.AddActionBar(wowActionBar.Serial, wowActionBar); } if (wowPlayerInfo.SaveNewCreature() == false) { netState.Send(new Word_CharCreateResponseError(ResponseCodes.CHAR_CREATE_NAME_IN_USE)); return; } ProcessServer.WowZoneCluster.World.GlobalPlayerInfo.AddPlayerInfo(wowPlayerInfo.Name, wowPlayerInfo.Serial, wowPlayerInfo); netState.Send(new Word_CharCreateResponse()); }