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