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);
                        }
                    }

                        );
                }
            }
        }
Ejemplo n.º 2
0
        public void OnWorldCharacterCreateRequestPacketReceive(GamePacketReceiveEvent e)
        {
            if (e.Packet is WorldCharacterCreateRequestPacket)
            {
                WorldCharacterCreateRequestPacket request = (WorldCharacterCreateRequestPacket)e.Packet;

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

                if (session != null)
                {
                    long characterId = Server.Instance.ObjectIdGenerator.GenerateGlobalId();

                    CharacterInfo characterInfo = new CharacterInfo(characterId, session.ActiveAccountInfo.AccountId);

                    string name;

                    if (Server.Instance.PredefinedNameCache != null)
                    {
                        name  = Server.Instance.PredefinedNameCache.GetFirstName(request.PredefinedNameFirst);
                        name += Server.Instance.PredefinedNameCache.GetMiddleName(request.PredefinedNameMiddle);
                        name += Server.Instance.PredefinedNameCache.GetLastName(request.PredefinedNameLast);
                    }
                    else
                    {
                        name = characterId.ToString();
                    }

                    characterInfo.Name         = name;
                    characterInfo.HeadColor    = request.HeadColor;
                    characterInfo.Head         = request.Head;
                    characterInfo.ChestColor   = request.ChestColor;
                    characterInfo.Chest        = request.Chest;
                    characterInfo.Legs         = request.Legs;
                    characterInfo.HairStyle    = request.HairStyle;
                    characterInfo.HairColor    = request.HairColor;
                    characterInfo.LeftHand     = request.LeftHand;
                    characterInfo.RightHand    = request.RightHand;
                    characterInfo.EyebrowStyle = request.EyebrowStyle;
                    characterInfo.EyesStyle    = request.EyesStyle;
                    characterInfo.MouthStyle   = request.MouthStyle;
                    characterInfo.ZoneId       = 0;
                    characterInfo.CloneId      = 0;
                    characterInfo.LastLogout   = (ulong)DateTime.Now.Subtract(Time.UnixEpoch).TotalSeconds;

                    if (Server.Instance.GetZone(1000) != null)
                    {
                        characterInfo.Position = Server.Instance.GetZone(1000).SpawnPosition;
                        characterInfo.Rotation = Server.Instance.GetZone(1000).SpawnRotation;
                    }
                    else
                    {
                        characterInfo.Position = JVector.Zero;
                        characterInfo.Rotation = new JQuaternion(0.0f, 0.0f, 0.0f, 0.0f);
                    }

                    Server.Instance.Scheduler.RunTaskAsync(

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

                        response.CharacterCreationResult = CharacterCreateResult.DenyInvalidCustomName;

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

                        try
                        {
                            mySqlHandle.Open();

                            bool success = mySqlHandle.CharactersCreateCharacter(characterInfo);

                            if (success)
                            {
                                if (!String.IsNullOrEmpty(request.CustomName))
                                {
                                    success = mySqlHandle.CharactersSetPendingName(characterId, request.CustomName);
                                }

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

                                    mySqlHandle.CharactersDeleteCharacter(characterId);
                                }
                            }
                            else
                            {
                                response.CharacterCreationResult = CharacterCreateResult.DenyPredefinedNameTaken;
                            }

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

                        mySqlHandle.Free();

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

                        Server.Instance.Logger.Log("A client requested to create a character. address=" + e.SourceAddress + " port=" + e.SourcePort + " predefinedName=" + name + " customName=" + request.CustomName + " result=" + response.CharacterCreationResult);

                        if (response.CharacterCreationResult == CharacterCreateResult.Allow)
                        {
                            Server.Instance.Scheduler.RunTask(() => Server.Instance.EventManager.Publish(new CharacterListRequestEvent(session)));
                        }
                        else
                        {
                            Server.Instance.ObjectIdGenerator.FreeObjectId(characterId);
                        }
                    }

                        );
                }
            }
        }