Example #1
0
        public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size)
        {
            var reader = new PacketReader(data);
            var id     = reader.ReadInt32();

            Logger.Write("[CHR] {0} is deleting character with ID {1}", context.User.Username, id);

            // Delete Character
            using (var db = new PolarisEf())
            {
                foreach (var character in db.Characters)
                {
                    if (character.CharacterId == id)
                    {
                        db.Characters.Remove(character);
                        db.ChangeTracker.DetectChanges();
                        break;
                    }
                }

                // Detect the deletion and save the Database
                if (db.ChangeTracker.HasChanges())
                {
                    db.SaveChanges();
                }
            }

            // Disconnect for now
            // TODO: What do we do after a deletion?
            context.Socket.Close();
        }
Example #2
0
        private void ImportObjects(string[] args, int length, string full, Client client)
        {
            string zone   = args[1];
            string folder = args[2];

            var packetList = Directory.GetFiles(folder);

            Array.Sort(packetList);

            List <GameObject> newObjects = new List <GameObject>();

            foreach (var path in packetList)
            {
                var          data   = File.ReadAllBytes(path);
                PacketReader reader = new PacketReader(data);
                PacketHeader header = reader.ReadStruct <PacketHeader>();
                if (header.Type != 0x8 || header.Subtype != 0xB)
                {
                    Logger.WriteWarning("[WRN] File {0} not an Object spawn packet, skipping.", path);
                    continue;
                }

                GameObject newObj = new GameObject();
                newObj.ObjectID = (int)reader.ReadStruct <ObjectHeader>().ID;
                var pos = reader.ReadEntityPosition();
                newObj.RotX = pos.RotX;
                newObj.RotY = pos.RotY;
                newObj.RotZ = pos.RotZ;
                newObj.RotW = pos.RotW;

                newObj.PosX = pos.PosX;
                newObj.PosY = pos.PosY;
                newObj.PosZ = pos.PosZ;
                reader.ReadInt16();
                newObj.ObjectName = reader.ReadFixedLengthAscii(0x2C);
                var objHeader = reader.ReadStruct <ObjectHeader>(); // Seems to always be blank...
                if (objHeader.ID != 0)
                {
                    Logger.WriteWarning("[OBJ] It seems object {0} has a nonzero objHeader! ({1}) Investigate.", newObj.ObjectName, objHeader.ID);
                }
                newObj.ZoneName = zone;
                var thingCount = reader.ReadUInt32();
                newObj.ObjectFlags = new byte[thingCount * 4];
                for (int i = 0; i < thingCount; i++)
                {
                    Buffer.BlockCopy(BitConverter.GetBytes(reader.ReadUInt32()), 0, newObj.ObjectFlags, i * 4, 4); // This should work
                }
                newObjects.Add(newObj);
                Logger.WriteInternal("[OBJ] Adding new Object {0} to the database for zone {1}", newObj.ObjectName, zone);
            }

            using (var db = new PolarisEf())
            {
                db.GameObjects.AddRange(newObjects);
                db.SaveChanges();
            }
        }
Example #3
0
        public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size)
        {
            if (context.User == null)
            {
                return;
            }

            var reader = new PacketReader(data, position, size);

            reader.ReadBytes(12); // 12 unknown bytes
            reader.ReadByte();    // VoiceType
            reader.ReadBytes(5);  // 5 unknown bytes
            reader.ReadUInt16();  // VoiceData

            var name = reader.ReadFixedLengthUtf16(16);

            reader.BaseStream.Seek(0x4, SeekOrigin.Current); // Padding

            var looks = reader.ReadStruct <Character.LooksParam>();
            var jobs  = reader.ReadStruct <Character.JobParam>();

            Logger.WriteInternal("[CHR] {0} is creating a new character named {1}.", context.User.Username, name);

            var newCharacter = new Character
            {
                Name   = name,
                Jobs   = jobs,
                Looks  = looks,
                Player = context.User
            };

            // Add to database
            using (var db = new PolarisEf())
            {
                db.Characters.Add(newCharacter);
                db.Entry(newCharacter.Player).State = EntityState.Modified;
                db.SaveChanges();
            }

            // Assign character to player
            context.Character = newCharacter;

            // Set Player ID
            var writer = new PacketWriter();

            writer.Write(0);
            writer.Write((uint)context.User.PlayerID);
            context.SendPacket(0x11, 0x07, 0, writer.ToArray());

            // Spawn
            context.SendPacket(new NoPayloadPacket(0x11, 0x3E));
        }
Example #4
0
        private void ImportNPCs(string[] args, int length, string full, Client client)
        {
            string zone   = args[1];
            string folder = args[2];

            var packetList = Directory.GetFiles(folder);

            Array.Sort(packetList);

            List <NPC> newNPCs = new List <NPC>();

            foreach (var path in packetList)
            {
                var          data   = File.ReadAllBytes(path);
                PacketReader reader = new PacketReader(data);
                PacketHeader header = reader.ReadStruct <PacketHeader>();
                if (header.Type != 0x8 || header.Subtype != 0xC)
                {
                    Logger.WriteWarning("[WRN] File {0} not an NPC spawn packet, skipping.", path);
                    continue;
                }

                NPC newNPC = new NPC();
                newNPC.EntityID = (int)reader.ReadStruct <ObjectHeader>().ID;
                var pos = reader.ReadEntityPosition();
                newNPC.RotX = pos.RotX;
                newNPC.RotY = pos.RotY;
                newNPC.RotZ = pos.RotZ;
                newNPC.RotW = pos.RotW;

                newNPC.PosX = pos.PosX;
                newNPC.PosY = pos.PosY;
                newNPC.PosZ = pos.PosZ;
                reader.ReadInt16();
                newNPC.NPCName  = reader.ReadFixedLengthAscii(0x20);
                newNPC.ZoneName = zone;
                newNPCs.Add(newNPC);
                Logger.WriteInternal("[NPC] Adding new NPC {0} to the database for zone {1}", newNPC.NPCName, zone);
            }

            using (var db = new PolarisEf())
            {
                db.NPCs.AddRange(newNPCs);
                db.SaveChanges();
            }
        }
Example #5
0
        public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size)
        {
            var reader = new PacketReader(data, position, size);

            reader.BaseStream.Seek(0x2C, SeekOrigin.Current);

            var macCount = reader.ReadMagic(0x5E6, 107);

            reader.BaseStream.Seek(0x1C * macCount, SeekOrigin.Current);
            reader.BaseStream.Seek(0x154, SeekOrigin.Current);

            var username = reader.ReadFixedLengthAscii(64);
            var password = reader.ReadFixedLengthAscii(64);

            // What am I doing here even
            using (var db = new PolarisEf())
            {
                var users = from u in db.Players
                            where u.Username.ToLower().Equals(username.ToLower())
                            select u;

                var    error = "";
                Player user;

                if (!users.Any())
                {
                    // Check if there is an empty field
                    if (string.IsNullOrWhiteSpace(username) || string.IsNullOrWhiteSpace(password))
                    {
                        error = "Username and password fields must not be empty.";
                        user  = null;
                    }
                    // Check for special characters
                    else if (!Regex.IsMatch(username, "^[a-zA-Z0-9 ]*$", RegexOptions.IgnoreCase))
                    {
                        error = "Username must not contain special characters.\nPlease use letters and numbers only.";
                        user  = null;
                    }
                    else // We're all good!
                    {
                        // Insert new player into database
                        user = new Player
                        {
                            Username = username.ToLower(),
                            Password = BCrypt.Net.BCrypt.HashPassword(password),
                            Nickname = username.ToLower(),
                            // Since we can't display the nickname prompt yet, just default it to the username
                            SettingsINI = File.ReadAllText("Resources/settings.txt")
                        };

                        db.Players.Add(user);
                        db.SaveChanges();

                        // context.SendPacket(0x11, 0x1e, 0x0, new byte[0x44]); // Request nickname
                    }
                }
                else
                {
                    user = users.First();

                    if (!BCrypt.Net.BCrypt.Verify(password, user.Password))
                    {
                        error = "Incorrect password.";
                        user  = null;
                    }
                }

                /* Mystery packet
                 * var mystery = new PacketWriter();
                 * mystery.Write((uint)100);
                 * SendPacket(0x11, 0x49, 0, mystery.ToArray());
                 */

                // Login response packet
                context.SendPacket(new LoginDataPacket("Polaris Block 1", error, (user == null) ? (uint)0 : (uint)user.PlayerID));

                if (user == null)
                {
                    return;
                }

                // Settings packet
                var settings = new PacketWriter();
                settings.WriteAscii(user.SettingsINI, 0x54AF, 0x100);
                context.SendPacket(0x2B, 2, 4, settings.ToArray());

                context.User = user;
            }

            if (PolarisApp.Config.MOTD != "")
            {
                context.SendPacket(new SystemMessagePacket(PolarisApp.Config.MOTD, SystemMessagePacket.MessageType.AdminMessageInstant));
            }
        }