Esempio n. 1
0
        public override void Handle(NecConnection connection, NecPacket packet)
        {
            string accountName = packet.data.ReadCString();
            string password    = packet.data.ReadCString();
            string macAddress  = packet.data.ReadCString();
            int    unknown     = packet.data.ReadInt16();

            _Logger.Info($"Account:{accountName} Password:{password} Unknown:{unknown}");

            Account account = database.SelectAccountByName(accountName);

            if (account == null)
            {
                if (settings.requireRegistration)
                {
                    _Logger.Error(connection, $"AccountName: {accountName} doesn't exist");
                    SendResponse(connection, null);
                    connection.socket.Close();
                    return;
                }

                string bCryptHash = BCrypt.Net.BCrypt.HashPassword(password, NecSetting.B_CRYPT_WORK_FACTOR);
                account = database.CreateAccount(accountName, accountName, bCryptHash);
            }

            if (!BCrypt.Net.BCrypt.Verify(password, account.hash))
            {
                _Logger.Error(connection, $"Invalid password for AccountName: {accountName}");
                SendResponse(connection, null);
                connection.socket.Close();
                return;
            }

            NecClient client = new NecClient();

            client.account        = account;
            client.authConnection = connection;
            connection.client     = client;
            client.UpdateIdentity();
            server.clients.Add(client);

            SendResponse(connection, account);

            //if client did not send a hardbeat within 75 seconds, something went wrong. remove the client. Thats enough time for 4 heartbeats.
            Task.Delay(TimeSpan.FromSeconds(75)).ContinueWith
                (t1 =>
            {
                if (client != null)
                {
                    if (client.heartBeat == 0)
                    {
                        server.clients.Remove(client);
                        _Logger.Error($"Initial heartbeat missed. disconnecting client. Server.clientCount is now {server.clients.GetCount()}");
                    }
                }
            }
                );
        }
Esempio n. 2
0
        public override void Handle(NecClient client, NecPacket packet)
        {
            int       characterId = packet.data.ReadInt32();
            Character character   = database.SelectCharacterById(characterId);

            if (character == null)
            {
                _Logger.Error(client, $"No character for CharacterId: {characterId}");
                client.Close();
                return;
            }

            server.instances.AssignInstance(character);

            client.character = character;
            client.character.criminalState = client.soul.criminalLevel;
            client.UpdateIdentity();
            client.character.CreateTask(server, client);

            _Logger.Debug(client, $"Selected Character: {character.name}");

            IBuffer res3 = BufferProvider.Provide();

            res3.WriteInt32(0); //ERR-CHARSELECT error check
            res3.WriteUInt32(client.character.instanceId);

            //sub_4E4210_2341
            res3.WriteInt32(client.character.mapId);
            res3.WriteInt32(client.character.mapId);
            res3.WriteInt32(client.character.mapId);
            res3.WriteByte(0);
            res3.WriteByte(0);                                       //Bool
            res3.WriteFixedString(settings.dataAreaIpAddress, 0x41); //IP
            res3.WriteUInt16(settings.areaPort);                     //Port

            res3.WriteFloat(client.character.x);
            res3.WriteFloat(client.character.y);
            res3.WriteFloat(client.character.z);
            res3.WriteByte(client.character.heading);
            router.Send(client, (ushort)MsgPacketId.recv_chara_select_r, res3, ServerType.Msg);

            /*
             * ERR_CHARSELECT	GENERIC	Failed to select a character (CODE:<errcode>)
             * ERR_CHARSELECT	-8	Maintenance
             * ERR_CHARSELECT	-13	You have selected an illegal character
             */


            //Logic to support your dead body //Make this static.  need a predictable deadbody instance ID to support disconnect/reconnet
            DeadBody deadBody = new DeadBody();

            deadBody.id = character.id;
            server.instances.AssignInstance(deadBody);
            character.deadBodyInstanceId = deadBody.instanceId;
            deadBody.characterInstanceId = character.instanceId;
            _Logger.Debug($"Dead Body Instance ID {deadBody.instanceId}   |  Character Instance ID {character.instanceId}");
        }
Esempio n. 3
0
        public override void Handle(NecConnection connection, NecPacket packet)
        {
            string accountName = packet.Data.ReadCString();
            string password    = packet.Data.ReadCString();
            string macAddress  = packet.Data.ReadCString();
            int    unknown     = packet.Data.ReadInt16();

            Logger.Info($"Account:{accountName} Password:{password} Unknown:{unknown}");

            Account account = Database.SelectAccountByName(accountName);

            if (account == null)
            {
                if (Settings.RequireRegistration)
                {
                    Logger.Error(connection, $"AccountName: {accountName} doesn't exist");
                    SendResponse(connection, null);
                    connection.Socket.Close();
                    return;
                }

                string bCryptHash = BCrypt.Net.BCrypt.HashPassword(password, NecSetting.BCryptWorkFactor);
                account = Database.CreateAccount(accountName, accountName, bCryptHash);
            }

            if (!BCrypt.Net.BCrypt.Verify(password, account.Hash))
            {
                Logger.Error(connection, $"Invalid password for AccountName: {accountName}");
                SendResponse(connection, null);
                connection.Socket.Close();
                return;
            }

            NecClient client = new NecClient();

            client.Account        = account;
            client.AuthConnection = connection;
            connection.Client     = client;
            client.UpdateIdentity();
            Server.Clients.Add(client);

            SendResponse(connection, account);
        }
Esempio n. 4
0
        public override void Handle(NecClient client, NecPacket packet)
        {
            int characterId = packet.Data.ReadInt32();
            //Character character = Database.SelectCharacterById(characterId);
            Character character = Server.Characters.GetByCharacterId(characterId);

            if (character == null)
            {
                Logger.Error(client, $"No character for CharacterId: {characterId}");
                client.Close();
                return;
            }

            //Server.Instances.AssignInstance(character); //moved to database load.

            client.Character = character;
            client.UpdateIdentity();
            client.Character.CreateTask(Server, client);

            Logger.Debug(client, $"Selected Character: {character.Name}");

            IBuffer res3 = BufferProvider.Provide();

            res3.WriteInt32(0); //ERR-CHARSELECT error check
            res3.WriteUInt32(client.Character.InstanceId);

            //sub_4E4210_2341  //
            res3.WriteInt32(client.Character.MapId);                 //MapSerialID //passeed to Send_Map_Entry
            res3.WriteInt32(client.Character.MapId);                 //MapID
            res3.WriteFixedString(Settings.DataAreaIpAddress, 0x41); //IP
            res3.WriteUInt16(Settings.AreaPort);                     //Port

            res3.WriteFloat(client.Character.X);
            res3.WriteFloat(client.Character.Y);
            res3.WriteFloat(client.Character.Z);
            res3.WriteByte(client.Character.Heading);
            Router.Send(client, (ushort)MsgPacketId.recv_chara_select_r, res3, ServerType.Msg);

            /*
             * ERR_CHARSELECT	GENERIC	Failed to select a character (CODE:<errcode>)
             * ERR_CHARSELECT	-8	Maintenance
             * ERR_CHARSELECT	-13	You have selected an illegal character
             */


            //Logic to support your dead body //Do Dead Body IDs need to be persistant, or can they change at each login?  TODO...
            DeadBody deadBody = new DeadBody();

            Server.Instances.AssignInstance(deadBody);
            character.DeadBodyInstanceId = deadBody.InstanceId;
            deadBody.CharacterInstanceId = character.InstanceId;
            character.movementId         = character.InstanceId;
            Logger.Debug(
                $"Dead Body Instance ID {deadBody.InstanceId}   |  Character Instance ID {character.InstanceId}");
            deadBody.CharaName = character.Name;
            deadBody.MapId     = character.MapId;
            deadBody.X         = character.X;
            deadBody.Y         = character.Y;
            deadBody.Z         = character.Z;
            deadBody.Heading   = character.Heading;
            deadBody.RaceId    = character.Raceid;
            deadBody.SexId     = character.Sexid;
            deadBody.HairStyle = character.HairId;
            deadBody.HairColor = character.HairColorId;
            deadBody.FaceId    = character.FaceId;
        }