示例#1
0
        public void OnCharacterListRequest(CharacterListRequestEvent e)
        {
            Server.Instance.Scheduler.RunTaskAsync(

                () =>
            {
                ClientCharacterListResponsePacket response = new ClientCharacterListResponsePacket();

                MySqlHandle mySqlHandle = Server.Instance.DatabaseManager.GetMySqlHandle();

                try
                {
                    mySqlHandle.Open();

                    List <CharacterInfo> characterInfos = mySqlHandle.CharactersGetCharacterInfos(e.Session.ActiveAccountInfo.AccountId);

                    foreach (CharacterInfo characterInfo in characterInfos)
                    {
                        ClientCharacterListResponsePacket.CharacterData characterData = new ClientCharacterListResponsePacket.CharacterData();

                        characterData.CharacterInfo = characterInfo;

                        response.CharacterDataList.Add(characterData);
                    }

                    mySqlHandle.Close();
                }
                catch (Exception exc)
                {
                    Server.Instance.LogDatabaseError(exc);
                }

                mySqlHandle.Free();

                Server.Instance.SendGamePacket(response, ClientPacketId.MSG_CLIENT_CHARACTER_LIST_RESPONSE, e.Session.Address, e.Session.Port);
            }

                );
        }
        public void OnWorldCharacterDeleteRequestReceive(GamePacketReceiveEvent e)
        {
            if (e.Packet is WorldCharacterDeleteRequestPacket)
            {
                WorldCharacterDeleteRequestPacket request = (WorldCharacterDeleteRequestPacket)e.Packet;

                Session session = Server.Instance.SessionManager.GetSession(e.SourceAddress, e.SourcePort);

                if (session != null)
                {
                    Server.Instance.Scheduler.RunTaskAsync(

                        () =>
                    {
                        long characterId        = request.CharacterId;
                        string name             = String.Empty;
                        bool isOwnedByRequester = false;

                        MySqlHandle mySqlHandle = Server.Instance.DatabaseManager.GetMySqlHandle();

                        try
                        {
                            mySqlHandle.Open();

                            List <CharacterInfo> characterInfos = mySqlHandle.CharactersGetCharacterInfos(session.ActiveAccountInfo.AccountId);

                            for (int i = 0; i < characterInfos.Count && !isOwnedByRequester; i++)
                            {
                                if (characterInfos[i].CharacterId == characterId)
                                {
                                    isOwnedByRequester = true;
                                    name = characterInfos[i].Name;

                                    mySqlHandle.CharactersDeleteCharacter(characterId);
                                }
                            }

                            mySqlHandle.Close();
                        }
                        catch (Exception exc)
                        {
                            Server.Instance.LogDatabaseError(exc);
                        }

                        mySqlHandle.Free();

                        Server.Instance.Logger.Log("A client requested to delete a character. address=" + e.SourceAddress + " port=" + e.SourcePort + " name=" + name + " isOwnedByRequester=" + isOwnedByRequester);

                        if (!isOwnedByRequester)
                        {
                            GeneralDisconnectNotifyPacket dcPacket = new GeneralDisconnectNotifyPacket();

                            dcPacket.DisconnectReason = DisconnectReason.CharacterNotFound;

                            Server.Instance.SendGamePacket(dcPacket, GeneralPacketId.MSG_SERVER_DISCONNECT_NOTIFY, e.SourceAddress, e.SourcePort);
                        }
                    }

                        );
                }
            }
        }
        public void OnWorldCharacterRenameRequestPacketReceive(GamePacketReceiveEvent e)
        {
            if (e.Packet is WorldCharacterRenameRequestPacket)
            {
                WorldCharacterRenameRequestPacket request = (WorldCharacterRenameRequestPacket)e.Packet;

                Session session = Server.Instance.SessionManager.GetSession(e.SourceAddress, e.SourcePort);

                if (session != null)
                {
                    Server.Instance.Scheduler.RunTaskAsync(

                        () =>
                    {
                        ClientCharacterRenameResponsePacket response = new ClientCharacterRenameResponsePacket();

                        response.CharacterRenameResult = CharacterRenameResult.DenyInvalidCustomName;

                        string oldName              = String.Empty;
                        string newName              = request.NewName;
                        long characterId            = request.CharacterId;
                        CharacterInfo characterInfo = null;

                        MySqlHandle mySqlHandle = Server.Instance.DatabaseManager.GetMySqlHandle();

                        try
                        {
                            mySqlHandle.Open();

                            List <CharacterInfo> characterInfos = mySqlHandle.CharactersGetCharacterInfos(session.ActiveAccountInfo.AccountId);

                            for (int i = 0; i < characterInfos.Count && characterInfo == null; i++)
                            {
                                if (characterInfos[i].CharacterId == characterId)
                                {
                                    characterInfo = characterInfos[i];
                                }
                            }

                            if (characterInfo != null)
                            {
                                oldName = characterInfo.Name;

                                bool success = mySqlHandle.CharactersSetPendingName(characterId, newName);

                                if (success)
                                {
                                    response.CharacterRenameResult = CharacterRenameResult.Allow;
                                }
                                else
                                {
                                    response.CharacterRenameResult = CharacterRenameResult.DenyCustomNameTaken;

                                    mySqlHandle.CharactersUpdateLastLogout(characterId);
                                }
                            }

                            mySqlHandle.Close();
                        }
                        catch (Exception exc)
                        {
                            Server.Instance.LogDatabaseError(exc);
                        }

                        mySqlHandle.Free();

                        Server.Instance.SendGamePacket(response, ClientPacketId.MSG_CLIENT_CHARACTER_RENAME_RESPONSE, e.SourceAddress, e.SourcePort);

                        Server.Instance.Scheduler.RunTask(() => Server.Instance.EventManager.Publish(new CharacterListRequestEvent(session)));

                        Server.Instance.Logger.Log("A client requested to rename a character. address=" + e.SourceAddress + " port=" + e.SourcePort + " oldName=" + oldName + " newName=" + newName + " isOwnedByRequester=" + (characterInfo != null));

                        if (characterInfo != null)
                        {
                            GeneralDisconnectNotifyPacket dcPacket = new GeneralDisconnectNotifyPacket();

                            dcPacket.DisconnectReason = DisconnectReason.CharacterNotFound;

                            Server.Instance.SendGamePacket(dcPacket, GeneralPacketId.MSG_SERVER_DISCONNECT_NOTIFY, e.SourceAddress, e.SourcePort);
                        }
                    }

                        );
                }
            }
        }
示例#4
0
        public void OnWorldLoginRequestPacketReceive(GamePacketReceiveEvent e)
        {
            if (e.Packet is WorldLoginRequestPacket)
            {
                WorldLoginRequestPacket request = (WorldLoginRequestPacket)e.Packet;

                Session session = Server.Instance.SessionManager.GetSession(e.SourceAddress, e.SourcePort);

                if (session != null)
                {
                    Server.Instance.Scheduler.RunTaskAsync(

                        () =>
                    {
                        long characterId            = request.CharacterId;
                        CharacterInfo characterInfo = null;

                        MySqlHandle mySqlHandle = Server.Instance.DatabaseManager.GetMySqlHandle();

                        try
                        {
                            mySqlHandle.Open();

                            List <CharacterInfo> characterInfos = mySqlHandle.CharactersGetCharacterInfos(session.ActiveAccountInfo.AccountId);

                            for (int i = 0; i < characterInfos.Count && characterInfo == null; i++)
                            {
                                if (characterInfos[i].CharacterId == characterId)
                                {
                                    characterInfo = characterInfos[i];
                                }
                            }

                            mySqlHandle.Close();
                        }
                        catch (Exception exc)
                        {
                            Server.Instance.LogDatabaseError(exc);
                        }

                        mySqlHandle.Free();

                        if (characterInfo != null)
                        {
                            if (session.ActiveCharacterInfo == null || session.ActiveCharacterInfo.CharacterId == characterInfo.CharacterId)
                            {
                                if (characterInfo.ZoneId == 0)
                                {
                                    characterInfo.ZoneId = 1000;
                                }

                                session.ActiveCharacterInfo = characterInfo;
                            }

                            ClientLoadStaticZonePacket response = new ClientLoadStaticZonePacket();

                            response.ZoneId        = characterInfo.ZoneId;
                            response.CloneId       = characterInfo.CloneId;
                            response.ZoneChecksum  = Server.Instance.ZoneChecksumCache.GetZoneChecksum(characterInfo.ZoneId);
                            response.EditorEnabled = (characterInfo.EditorLevel) > 0 ? (byte)1 : (byte)0;
                            response.EditorLevel   = characterInfo.EditorLevel;
                            response.Position      = characterInfo.Position;

                            Server.Instance.SendGamePacket(response, ClientPacketId.MSG_CLIENT_LOAD_STATIC_ZONE, e.SourceAddress, e.SourcePort);
                        }
                        else
                        {
                            GeneralDisconnectNotifyPacket dcPacket = new GeneralDisconnectNotifyPacket();

                            dcPacket.DisconnectReason = DisconnectReason.CharacterNotFound;

                            Server.Instance.SendGamePacket(dcPacket, GeneralPacketId.MSG_SERVER_DISCONNECT_NOTIFY, e.SourceAddress, e.SourcePort);
                        }
                    }

                        );
                }
            }
        }