public static void MessageEvent(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events) { Character character = client.Metadata["fullchar"] as Character; var name = character.name; var x = (ushort)character.x; var y = (ushort)character.y; var id = character.id; var map = client.Metadata["map"] as IMap; var clients = map.GetSurroundingClients(client, 1); int unk = packet.ReadInt(); packet.Skip(4); int size = packet.ReadShort() - 3; packet.Skip(2); var type = packet.ReadByte(); var msg = packet.ReadString(size); var smsg = msg.Split(' '); if (msg == "/quit") { client.Disconnect(); return; } #region DebugCommands #if DEBUG if (smsg.Length > 1 && string.IsNullOrEmpty(smsg[0]) == false) { switch (smsg[0]) { case "_drop": int itemid = 0; if (int.TryParse(smsg[1], out itemid)) { map.DropItem(x, y, itemid, (uint)id, (uint)id); } break; case "_warp": ushort mapid = 0; ushort curx = 0; ushort cury = 0; if (!ushort.TryParse(smsg[1], out mapid)) { return; } if (!ushort.TryParse(smsg[2], out curx)) { return; } if (!ushort.TryParse(smsg[3], out cury)) { return; } var p = client.CreatePacket("PC_WarpCommand", mapid, curx, cury, client); events.Warped("world.Initialized", client, mapid, curx, cury); client.Send(p, "PC_WarpCommand"); break; case "_levelup": ushort level = 0; if (!ushort.TryParse(smsg[1], out level)) { return; } builder.New(0x03F0); { builder += (byte)2; builder += (uint)1371; builder += (uint)1367; } client.Send(builder, "LevelUp"); break; case "_spawn": ushort mobid = 0; ushort specid = 0; if (!ushort.TryParse(smsg[1], out mobid)) { return; } if (!ushort.TryParse(smsg[2], out specid)) { return; } var p1 = client.CreatePacket("MobSpawned", mobid, specid); client.Send(p1, "MobSpawned"); break; case "/Partytime": uint pid = 1337; foreach (var c in clients) { builder.New(0xC9); { builder += (int)pid; builder += (byte)12; //b = builder.Data; } var timestamp = (uint)c.Metadata["timestamp"]; var style = (uint)c.Metadata["style"]; c.Send(builder, "NFY_DelUserList"); builder.New(0xC8); { builder += (short)0x3101; builder += (int)pid++; builder += (short)0x000D; builder += (short)0x0100; builder += 1; builder += Environment.TickCount - (int)timestamp; builder += (short)(x + 1); builder += (short)y; builder += (short)(x + 1); builder += (short)y; builder += (byte)0; builder += 0; builder += (short)0; builder += (int)style; builder += (byte)1; builder += (byte)0; builder += 0; builder += 0; builder += (byte)0; var equipment = (List <CItem>)c.Metadata["equipment"]; builder += (byte)(equipment.Count); builder += (short)0; builder += (byte)0; builder += 0; name = "PARTY TIME!!"; builder += (byte)(name.Length + 1); builder += name; builder += (byte)0; foreach (var e in equipment) { builder += (short)e.ID; builder += e.Slot; } } c.Send(builder, "NFY_NewUserList"); } return; } } #endif #endregion builder.New(0xD9); { builder += id; builder += (byte)0; builder += (byte)unk; builder += (byte)0; builder += (byte)(msg.Length + 3); builder += (byte)0; builder += (byte)254; builder += (byte)254; builder += type; builder += msg; builder += new byte[3]; } foreach (var c in clients) { c.Send(builder, "NFY_MessageEvnt"); } events.SaidLocal("world.MessageEvnt", id, name, msg); }
public static void EnterWorld(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events) { byte[] b; b = new byte[0x0C] { 0xE2, 0xB7, 0x0C, 0x00, 0x45, 0x01, 0x08, 0x3B, 0x21, 0xAF, 0x07, 0x01 }; // Looks like it sends an updated premium time to the client. client.Send(ref b, "UnknownPacket_0x145"); var id = packet.ReadInt(); client.Metadata["cid"] = id; client.Metadata["slot"] = (int)id % 8; var unk0 = packet.ReadShort(); var database = client.Metadata["database"] as IDatabaseContracts; var server = (int)client.Metadata["server"]; var fullcharacter = database.GetFullCharacter(server, client.AccountID, (int)client.Metadata["slot"]); var character = fullcharacter.Item1; var equipment = fullcharacter.Item2; var stats = fullcharacter.Item3; var items = fullcharacter.Item4; var skills = fullcharacter.Item5; var quickslots = fullcharacter.Item6; client.Metadata["id"] = character.Item1; var level = character.Item4; var map = character.Rest.Item3; var x = (ushort)character.Rest.Item4; var y = (ushort)character.Rest.Item5; client.Metadata["x"] = x; client.Metadata["y"] = y; client.Metadata["dest_x"] = x; client.Metadata["dest_y"] = y; client.Metadata["level"] = level; client.Metadata["hp"] = stats.Item1; client.Metadata["max_hp"] = stats.Item2; client.Metadata["mp"] = stats.Item3; client.Metadata["max_mp"] = stats.Item4; var name = character.Item3; client.Metadata["name"] = name; var style = (uint)character.Item5; style += stats.Rest.Item5 << 3; style += (uint)(character.Item6 << 8); style += (uint)(character.Rest.Item1 << 13); style += (uint)(character.Item7 << 17); style += (!character.Rest.Item2) ? 0 : (uint)(1 << 26); client.Metadata["style"] = style; var cequipment = new List <CEquipment>(); for (int i = 0; i < equipment.Count; i++) { if (equipment[i] != null) { var de = (DItem)(equipment[i].ToStructure <DItem>()); var slot = (EquipmentSlots)i; cequipment.Add(de.ToClient(slot)); } } client.Metadata["equipment"] = cequipment; var ditems = new List <byte[]>(); var citems = new List <byte[]>(); foreach (var i in items) { var di = (DItem)(i.Item1.ToStructure <DItem>()); var slot = i.Item3; var ci = (CItem)(di.ToClient(slot)); var item = ci.ToByteArray(); if (i.Item2 != 0) { BitConverter.GetBytes(i.Item2).CopyTo(item, 2); } ditems.Add(di.ToByteArray()); citems.Add(item); } client.Metadata["inventory"] = ditems; builder.New(0x8E); { builder += new byte[50]; builder += (short)unk0; builder += (byte)0; builder += map; builder += (short)x; builder += (short)y; builder += (long)stats.Item7; // XP builder += (long)stats.Rest.Rest.Item5; // Alz builder += (int)level; builder += 0; // ? builder += stats.Rest.Item1; // STR builder += stats.Rest.Item3; // DEX builder += stats.Rest.Item2; // INT builder += 0; // ? builder += stats.Rest.Item6; // Sword Rank builder += stats.Rest.Rest.Item2; // Magic Rank builder += new byte[6]; builder += stats.Item1; // Current HP builder += stats.Item2; // Max HP builder += stats.Item3; // Current MP builder += stats.Item4; // Max MP builder += stats.Item5; // Current SP builder += stats.Item6; // Max SP builder += stats.Rest.Item7; // Sword Skill XP builder += stats.Rest.Rest.Item1; // Sword Skill Points builder += stats.Rest.Rest.Item3; // Magic Skill XP builder += stats.Rest.Rest.Item4; // Magic Skill Points builder += (ushort)0; // Sword Rank Progress builder += (ushort)0; // Magic Rank Progress builder += 0; // ? builder += 0; // ? builder += stats.Rest.Item4; // Honour builder += 0; // Penalty XP builder += 0; // ? builder += (ushort)0; // ? builder += (byte)127; // Chat IP builder += (byte)0; builder += (byte)0; builder += (byte)1; builder += (ushort)38121; // Chat Port builder += (byte)0; // Nation builder += 0; // ? builder += 0; // Warp Codes builder += (uint)(1 << (map - 1)); // Map Codes builder += style; builder += new byte[3]; builder += (byte)cequipment.Count; builder += (ushort)citems.Count; builder += (byte)skills.Count; builder += quickslots.Count; builder += new byte[128]; // Quest Data builder += new byte[128]; // Quest Flags builder += new byte[128]; // Quest Dungeon Data builder += new byte[128]; // Quest Dungeon Flags builder += (byte)1; // Craft Level 0 builder += (byte)1; // Craft Level 1 builder += (byte)1; // Craft Level 2 builder += (byte)1; // Craft Level 3 builder += (byte)1; // Craft Level 4 builder += (byte)0; // Craft XP 0 builder += (byte)0; // Craft XP 1 builder += (byte)0; // Craft XP 2 builder += (byte)0; // Craft XP 3 builder += (byte)0; // Craft XP 4 builder += new byte[16]; // Craft Flags builder += 0; // Craft Type builder += (byte)0; // ? builder += (byte)(name.Length + 1); builder += name; foreach (var e in cequipment) { builder += e.ToByteArray(); } foreach (var i in citems) { builder += i; } foreach (var s in skills) { builder += (ushort)s[0]; // Skill ID builder += (byte)s[1]; // Skill Level builder += (byte)s[2]; // Skill Slot } foreach (var q in quickslots) { builder += (byte)q[0]; // Skill ID (referenced by Skill Slot) builder += (byte)q[1]; // Slot (in quickslot bars) } //b = builder.Data; } client.Send(builder, "Initialised"); events.Warped("world.700.Initialized", client, map, x, y); #region PSEUDOCODE /* * ushort header * ushort size * ushort opcode * ushort players? * * foreach player * * uint characterID (acc * 8 + slot) * ushort unk0 * byte unk1 * byte unk2 * uint unk3 * uint timestamp? (probably that milliseconds since server start crap) * ushort x_current * ushort y_current * ushort x_destination * ushort y_destination * byte pk_level * byte[6] unk4 * uint style * byte animation * byte[9] unk5 (one of these is most likely an animation keystamp of some sort) * byte isDead * byte equipment_count * ushort unk6 * byte isSelling * uint unk7 * byte name_length (+1) * byte[name_length - 1] name * byte guild_length * byte[guild_length] guild * byte unk8 * byte isHelmVisible * byte unk9 * * a series of ushort-byte pairs follow, and contains the current equipment * foreach equipment * * ushort item_id (merged with bonus and isBound, obviously) * byte slot * */ #endregion var clients = (client.Metadata["map"] as IMap).GetSurroundingClients(client, 2); if (clients.Count > 1) { builder.New(0xC8); { builder += (short)(clients.Count - 1); foreach (var c in clients) { if (c == client) { continue; } if (!c.Metadata.ContainsKey("id") || (uint)c.Metadata["cid"] == 0) { continue; } var cid = (uint)c.Metadata["cid"]; level = (uint)c.Metadata["level"]; var timestamp = (uint)c.Metadata["timestamp"]; x = (ushort)c.Metadata["x"]; y = (ushort)c.Metadata["y"]; var dx = (ushort)c.Metadata["dest_x"]; var dy = (ushort)c.Metadata["dest_y"]; style = (uint)c.Metadata["style"]; builder += (int)cid; builder += (short)0x000D; builder += (short)0x0100; builder += (int)level; builder += Environment.TickCount - (int)timestamp; builder += (short)x; builder += (short)y; builder += (short)dx; builder += (short)dy; builder += (byte)0; // PK penalty builder += 0; builder += (short)0; builder += (int)style; builder += (byte)0; // Animation ID builder += 0; builder += 0; builder += (byte)0; builder += (byte)0; // 1 = dead cequipment = (List <CEquipment>)c.Metadata["equipment"]; builder += (byte)cequipment.Count; builder += (short)0; builder += (byte)0; // 1 = has private shop open builder += 0; name = c.Metadata["name"] as string; builder += (byte)(name.Length + 1); builder += name; builder += (byte)0; foreach (var e in cequipment) { builder += (short)e.ID; builder += (byte)e.Slot; } } //b = builder.Data; } client.Send(builder, "UnknownPacket_0xC8"); foreach (var c in clients) { if (c == client) { continue; } builder.New(0xC8); { builder += (short)0x3101; var cid = (uint)client.Metadata["cid"]; level = (uint)client.Metadata["level"]; var timestamp = (uint)client.Metadata["timestamp"]; x = (ushort)client.Metadata["x"]; y = (ushort)client.Metadata["y"]; var dx = (ushort)client.Metadata["dest_x"]; var dy = (ushort)client.Metadata["dest_y"]; style = (uint)client.Metadata["style"]; builder += (int)cid; builder += (short)0x000D; builder += (short)0x0100; builder += (int)level; builder += Environment.TickCount - (int)timestamp; builder += (short)x; builder += (short)y; builder += (short)dx; builder += (short)dy; builder += (byte)0; // PK penalty builder += 0; builder += (short)0; builder += (int)style; builder += (byte)0; // Animation ID builder += 0; builder += 0; builder += (byte)0; builder += (byte)0; // 1 = dead cequipment = (List <CEquipment>)client.Metadata["equipment"]; builder += (byte)cequipment.Count; builder += (short)0; builder += (byte)0; // 1 = has private shop open builder += 0; name = c.Metadata["name"] as string; builder += (byte)(name.Length + 1); builder += name; builder += (byte)0; foreach (var e in cequipment) { builder += (short)e.ID; builder += (byte)e.Slot; } //b = builder.Data; } c.Send(builder, "UnknownPacket_0xC8"); } } b = new byte[0x48] { 0xE2, 0xB7, 0x48, 0x00, 0x6D, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x97, 0xB6, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; client.Send(ref b, "UnknownPacket_0x026D"); }
public static void Warp(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events) { //byte[] b; var npc = packet.ReadByte(); var unk0 = packet.ReadShort(); var order = packet.ReadShort(); var map = client.Metadata["map"] as IMap; int[] dest = map.GetWarpDestination(npc, (int)order); var clients = (client.Metadata["map"] as IMap).GetSurroundingClients(client, 2); if (clients.Count > 1) { var id = (uint)client.Metadata["cid"]; builder.New(0xC9); { builder += (int)id; builder += (byte)dest[0]; //b = builder.Data; } foreach (var c in clients) { if (c == client) { continue; } //var b2 = b; c.Send(builder, "UnknownPacket_0xC9"); } builder.New(0xC9); { foreach (var c in clients) { if (c == client) { continue; } id = (uint)c.Metadata["cid"]; builder += (int)id; } builder += (byte)dest[0]; //b = builder.Data; } client.Send(builder, "UnknownPacket_0xC9"); } builder.New(0xF4); { builder += (short)dest[1]; // x builder += (short)dest[2]; // y builder += 0; builder += 0; builder += 0; builder += 0; builder += (byte)0; builder += 0; //b = builder.Data; } client.Send(builder, "WarpCommand"); client.Metadata["x"] = (ushort)dest[1]; client.Metadata["y"] = (ushort)dest[2]; map.RemoveClient(client); events.Warped("world.700.WarpCommand", client, dest[0], dest[1], dest[2]); clients = (client.Metadata["map"] as IMap).GetSurroundingClients(client, 2); if (clients.Count > 1) { builder.New(0xC8); { builder += (byte)(clients.Count - 1); builder += (byte)0x31; foreach (var c in clients) { if (c == client) { continue; } //if (!c.Metadata.ContainsKey("id") || (uint)c.Metadata["cid"] == 0) continue; var id = (uint)c.Metadata["cid"]; var level = (uint)c.Metadata["level"]; var timestamp = (uint)c.Metadata["timestamp"]; var x = (ushort)c.Metadata["x"]; var y = (ushort)c.Metadata["y"]; var dx = (ushort)c.Metadata["dest_x"]; var dy = (ushort)c.Metadata["dest_y"]; var style = (uint)c.Metadata["style"]; builder += (int)id; builder += (short)0x000D; builder += (short)0x0100; builder += (int)level; builder += Environment.TickCount - (int)timestamp; builder += (short)x; builder += (short)y; builder += (short)dx; builder += (short)dy; builder += (byte)0; // PK penalty builder += 0; builder += (short)0; builder += (int)style; builder += (byte)0; // Animation ID builder += 0; builder += 0; builder += (byte)0; builder += (byte)0; // 1 = dead var equipment = (List <CEquipment>)c.Metadata["equipment"]; builder += (byte)equipment.Count; builder += (short)0; builder += (byte)0; // 1 = has private shop open builder += 0; var name = c.Metadata["name"] as string; builder += (byte)(name.Length + 1); builder += name; builder += (byte)0; foreach (var e in equipment) { builder += (short)e.ID; builder += (byte)e.Slot; } } //b = builder.Data; } client.Send(builder, "UnknownPacket_0xC8"); foreach (var c in clients) { if (c == client) { continue; } builder.New(0xC8); { builder += (short)0x3101; var id = (uint)client.Metadata["cid"]; var level = (uint)client.Metadata["level"]; var timestamp = (uint)client.Metadata["timestamp"]; var x = (ushort)client.Metadata["x"]; var y = (ushort)client.Metadata["y"]; var dx = (ushort)client.Metadata["dest_x"]; var dy = (ushort)client.Metadata["dest_y"]; var style = (uint)client.Metadata["style"]; builder += (int)id; builder += (short)0x000D; builder += (short)0x0100; builder += (int)level; builder += Environment.TickCount - (int)timestamp; builder += (short)x; builder += (short)y; builder += (short)dx; builder += (short)dy; builder += (byte)0; // PK penalty builder += 0; builder += (short)0; builder += (int)style; builder += (byte)0; // Animation ID builder += 0; builder += 0; builder += (byte)0; builder += (byte)0; // 1 = dead var equipment = (List <CEquipment>)client.Metadata["equipment"]; builder += (byte)equipment.Count; builder += (short)0; builder += (byte)0; // 1 = has private shop open builder += 0; var name = c.Metadata["name"] as string; builder += (byte)(name.Length + 1); builder += name; builder += (byte)0; foreach (var e in equipment) { builder += (short)e.ID; builder += (byte)e.Slot; } //b = builder.Data; } c.Send(builder, "UnknownPacket_0xC8"); } } var database = client.Metadata["database"] as IDatabaseContracts; var server = (int)client.Metadata["server"]; var slot = (int)((uint)client.Metadata["cid"] % 8); database.UpdateCharacterPosition(server, client.AccountID, slot, (byte)dest[0], (byte)dest[1], (byte)dest[2]); }
public static void EnterWorld2(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events) { if (packet.Size < 14) { return; } var id = packet.ReadInt(); var server = (int)client.Metadata["server"]; var syncServer = client.Metadata["syncServer"] as SyncReceiver; ServerData[] servers = GetChannels(syncServer); ChannelData channelData = null; foreach (var svr in servers) { if (svr.id == server) { foreach (var chn in svr.channels) { if (chn.id == (int)client.Metadata["channel"]) { channelData = chn; } } } } if (channelData == null) { return; } var charslot = id % 8; var ip = BitConverter.ToUInt32(Configuration.channelIp.GetAddressBytes(), 0); var chport = Configuration.channelPort; if (client.AccountID <= 0) { client.AccountID = Authentication.GetUser(syncServer, (ulong)client.Metadata["magic"]); } Character character = CharacterManagement.GetFullCharacter(syncServer, server, client.AccountID, charslot); client.Metadata["fullchar"] = character; client.Metadata["id"] = (int)id; client.Metadata["map"] = null; var equipment = character.equipment.GetEquipment(); var level = character.level; var map = character.map; var x = (ushort)character.x; var y = (ushort)character.y; client.Metadata["dest_x"] = x; client.Metadata["dest_y"] = y; var style = (int)character._class; style += (int)character.stats.rank << 3; style += (character.face << 8); style += (character.colour << 13); style += (character.hair << 17); style += (!character.gender) ? 0 : (1 << 26); style += 152; client.Metadata["style"] = style; client.Metadata["equipment"] = equipment; var ditems = new List <byte[]>(); var citems = new List <byte[]>(); foreach (var i in character.inv) { var di = (DItem)(i.item.ToStructure <DItem>()); var slot = i.slot; var ci = (CItem)(di.ToClient(slot)); var item = ci.ToByteArray(); if (i.amount != 0) { BitConverter.GetBytes(i.amount).CopyTo(item, 8); } ditems.Add(di.ToByteArray()); citems.Add(item); } client.Metadata["inventory"] = ditems; builder.New(0x8E, true); { builder += new byte[58]; builder += (byte)0x14; builder += (byte)server; builder += (short)channelData.id; builder += new byte[22]; builder += (byte)255; builder += (short)channelData.maxPlayers; builder += ip; // channel ip builder += (ushort)chport; // channel port builder += (long)0; builder += 0x01000BF1; builder += (int)map; // map builder += 0; builder += x; // x builder += y; // y builder += character.stats.exp; // exp builder += character.stats.alz; // alz builder += (ulong)0; // wexp builder += level; // level builder += 0; builder += character.stats.str_stat; // str builder += character.stats.dex_stat; // dex builder += character.stats.int_stat; // int builder += character.stats.pnt_stat; // points builder += character.stats.swordrank; // sword rank builder += (byte)0; // magic rank **UNUSED** builder += new byte[6]; builder += (uint)character.stats.maxhp; // max hp builder += (uint)character.stats.curhp; // curr hp builder += (uint)character.stats.maxmp; // max mp builder += (uint)character.stats.curmp; // curr mp builder += character.stats.maxsp; // max sp builder += character.stats.cursp; // curr sp builder += 8; // max rage builder += (uint)0; // DP builder += (ushort)0x2A30; builder += (ushort)0; builder += (uint)0; builder += (uint)0; //SkillExpBars builder += (uint)0; //SkillExp builder += (uint)0; //SkillPoints builder += 0x0857; //Unk 0x33 builder += (uint)0; //Unknw builder += (uint)999; //Honor Points builder += (uint)0; builder += (uint)0; builder += (uint)0; builder += (uint)0; builder += (uint)0; builder += (ushort)0; builder += ip; // unk server ip builder += (ushort)chport; // unk server port builder += ip; // unk server ip Possible AuctionServer builder += (ushort)chport; // unk server port Possible AuctionServer builder += ip; // unk server ip builder += (ushort)chport; // unk server port builder += (ushort)0xBBEE; builder += new byte[5]; builder += 0x3FFFFF; // warp codes? builder += 0x3FFFFF; // map codes? builder += style; // style builder += new byte[164]; builder += (ushort)equipment.Count; // equip count builder += (ushort)citems.Count; // items count builder += (ushort)0; builder += (ushort)character.skills.Length; // skills count builder += (ushort)character.qslots.Length; // quickslots count builder += new byte[1540]; builder += 0x03E8; // help window..? builder += 59; /* * builder += new byte[1975]; * builder += (int)1; * builder += (int)0; * builder += (int)0; * builder += (int)0; * builder += (int)0; * builder += (int)0; * builder += (int)0; * builder += (int)0; * builder += (int)0; * builder += (int)0; * builder += (int)0; * builder += (int)0; * builder += (int)0; // 2 -> Unlimited Warp Active until 2000-00:00:00? * builder += (int)0; * builder += (int)0; * builder += (int)0; * builder += (int)0; * builder += (int)0; // 1 or 0 * builder += (int)0; * builder += (int)0; // 0 or 1 * builder += (int)0; * builder += (int)0; * builder += (int)0; * builder += (int)0; * builder += (int)0; * builder += (int)0; * builder += (int)0; * builder += (int)0; * builder += (int)0; * builder += (int)0; * builder += (int)0; * builder += (byte)0; * builder += (byte)0; * builder += (int)0; // My Merit Points (See UI for more accurate perception) * builder += (int)0; // Merit Point (See UI for more accurate perception) * builder += (int)0; // if 15 and the value bellow Force Gems is >2000 then Unlimited Warp Active until 2000-00:00:00? * builder += (int)0; // Force Gems * builder += (int)0; // Unknown Value Max (9999)? */ /*builder += new byte[2103]; * /*builder += (uint)0xFFFFFFFE; * builder += new byte[2059]; * builder += (uint)0; // Raise Spirit (millisecs) * builder += new byte[16]; * builder += (int)0; // My Merit Points (See UI for more accurate perception) * builder += (int)0; // Merit Point (See UI for more accurate perception) * builder += (int)0; // Unknown * builder += (int)0; // Force Gems * builder += (int)0; // Unknown*/ builder += new byte[2115]; builder += (byte)(character.name.Length + 1); // name length + 1 builder += character.name; // name foreach (var e in equipment) { builder += e.ToByteArray(); } foreach (var i in citems) { builder += i; } foreach (var s in character.skills) { builder += (short)s.skill; // Skill ID builder += s.level; // Skill Level builder += s.slot; // Skill Slot builder += (byte)0; } foreach (var q in character.qslots) { builder += (short)q.skill; // Skill ID (referenced by Skill Slot) builder += (short)q.slot; // Slot (in quickslot bars) } builder += 0x20; builder += (ushort)0x21; builder += (ushort)0x01; builder += 0x0BC9; builder += (byte)0x01; builder += (byte)0x01; builder += (byte)0x00; builder += 0x0435; builder += 0; } client.Send(builder, "Initialised"); events.Warped("world.Initialized", client, map, x, y); Authentication.UpdateOnline(syncServer, client.AccountID, true); NewUserList(packet, builder, client, events); //NewMobsList(packet, builder, client, events); }
public static void WarpCommand(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events) { Character character = client.Metadata["fullchar"] as Character; var npc = packet.ReadUShort(); var unk1 = packet.ReadUShort(); var unk2 = packet.ReadByte(); var unk3 = packet.ReadByte(); var unk4 = packet.ReadByte(); var y = packet.ReadByte(); var x = packet.ReadByte(); var unk5 = packet.ReadByte(); var unk6 = packet.ReadByte(); var warpID = packet.ReadUInt(); var unk7 = packet.ReadByte(); var unk8 = packet.ReadByte(); var unk9 = packet.ReadByte(); var unk10 = packet.ReadByte(); var unk11 = packet.ReadByte(); var unk12 = packet.ReadByte(); var unk13 = packet.ReadByte(); var unk14 = packet.ReadByte(); var map = (client.Metadata["map"] as IMap); var fee = character.stats.alz; var alive = (warpID == 0 && npc != 54 && npc != 63); int[] dest = null; if (alive) dest = map.GetWarpDestination(npc, 0); else if (npc == 201) warpID = (uint)map.ID; else dest = map.GetDeathDestination(); if (dest!=null) { warpID = (byte)dest[0]; x = (byte)dest[1]; y = (byte)dest[2]; } map.GetSurroundingClients(client, 1); map.RemoveClient(client); events.Warped("world.WarpCommand", client, (int)warpID, x, y); builder.New(0x00F4); // TODO: Load x,y values from WarpList { builder += (ushort)x; builder += (ushort)y; builder += (uint)character.stats.exp; builder += 0; //axp builder += fee; //Alz (for death penalty and fee?) builder += (byte)1; builder += (byte)1; builder += (byte)1; builder += (byte)1; builder += (byte)1; builder += (ulong)0; builder += warpID; builder += (byte)1; builder += (byte)1; builder += (byte)1; builder += (byte)1; builder += (byte)1; builder += (byte)1; builder += (byte)1; builder += (byte)1; builder += (byte)1; builder += (byte)1; } #region PacketAnalisys #if DEBUG string notice = ""; /*for (int i = 0; i< packet.Size-10; i++) { notice += packet.ReadByte()+" "; } */ notice += npc + " " + unk1 + " " + unk2 + " " + unk3 + " " + unk4 + " " + x + " " + y + " " + unk5 + " " + unk6 + " " + warpID + " " + unk7 + " " + unk8 + " " + unk9 + " " + unk10 + " " + unk11 + " " + unk12 + " " + unk13 + " " + unk14; Log.Notice(notice); #endif #endregion client.Send(builder, "WarpCommand"); character.map = (byte)warpID; character.x = x; character.y = y; CharacterManagement.UpdatePosition(client.Metadata["syncServer"] as SyncReceiver, (int)client.Metadata["server"], client.AccountID, character.slot, (byte)warpID, character.x, character.y); }