コード例 #1
0
        /// <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);
        }
コード例 #2
0
        /// <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] ) );
        }
コード例 #3
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);
        }
コード例 #4
0
        /// <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));
        }
コード例 #5
0
        /// <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));
                }
            }
        }
コード例 #6
0
        /// <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());
        }
コード例 #7
0
        /// <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());
        }
コード例 #8
0
        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);
        }
コード例 #9
0
        /// <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));
        }
コード例 #10
0
        /// <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));
        }
コード例 #11
0
        /// <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("验证此测试方法的正确性。");
        }
コード例 #12
0
        /// <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;
            }
        }
コード例 #13
0
        /// <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));
        }
コード例 #14
0
        /// <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();
        }
コード例 #15
0
        /// <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));
        }
コード例 #16
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);
        }
コード例 #17
0
        /// <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));
        }
コード例 #18
0
        /// <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));
        }
コード例 #19
0
        /// <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));
        }
コード例 #20
0
        /// <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;
            }
        }
コード例 #21
0
        /// <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));
        }
コード例 #22
0
        /// <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);
            }
        }
コード例 #23
0
        /// <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());
        }