public static Packet CreateCharacterResult(Character pCharacter, bool pValid) { Packet p = new Packet(); p.WriteShort((short)SendOpcodes.Create_Character_Result); p.WriteByte((byte)(pValid ? 0 : 1)); HelpPacket.AddCharacterImage(p, pCharacter, false, false); return p; }
public static Packet StatChange(Character pCharacter, uint pFlag, short pValue, bool pSelf = false) { Packet p = new Packet(); p.WriteShort((short)SendOpcodes.Stats_Update); p.WriteBool(pSelf); p.WriteUInt(pFlag); p.WriteShort(pValue); return p; }
public Inventory(Character pOwner, InventoryType invtype, byte slotLimit = 96) { Items = new Dictionary<byte, Item>(slotLimit); Equips = new Dictionary<short, Equip>(); if ((int)invtype >= 2 || (int)invtype <= 5) ItemAmounts = new Dictionary<int, short>(); SlotLimit = slotLimit; InventoryType = invtype; Owner = pOwner; }
public static void UpdatePosition(List<LifeMovementFragment> pMovement, Character pCharacter, short pYOffset) { if (pMovement == null) { return; } foreach (LifeMovementFragment Move in pMovement) { Pos Position = ((LifeMovement)Move).GetPosition(); Position.Y += pYOffset; pCharacter.Position = Position; pCharacter.Stance = (byte)((LifeMovement)Move).GetNewState(); } }
public static void AddCharacterImage(Packet pPacket, Character pCharacter, bool pRanked, bool pViewAll) { AddCharacterStats(pPacket, pCharacter); AddCharacterLooks(pPacket, pCharacter, true); if (!pViewAll) pPacket.WriteByte(0); pPacket.WriteByte((byte)(pRanked ? 1 : 0)); if (pRanked) { //TODO: Ranking Stats. pPacket.WriteInt(100); pPacket.WriteInt(100); pPacket.WriteInt(200); pPacket.WriteInt(200); } }
public static void AddStolenSkills(Packet p, Character c, int jobNum, bool writeJob) { if (writeJob) { p.WriteInt(jobNum); } int count = 0; while (count < Constants.SkillConstants.getNumSteal(jobNum)) { p.WriteInt(0); count++; } }
public static void AddStealSkills(Packet p, Character c) { for (int i = 1; i <= 4; i++) { AddStolenSkills(p, c, i, false); } AddChosenSkills(p, c); }
public static void AddSkillInfo(Packet p, Character c) { //Dictionairy of skill, skillentry of character's skills. p.WriteByte(1); p.WriteShort(0); // Skills size. //For each skill - writeInt(SkillID), WriteInt(SkillLevel), addExpirationTime of skill, If skill is fourth job skill - WriteInt(MasterLevel). }
public static void AddAnnounceBox(Packet p, Character c) { //TODO. p.WriteByte(0); }
public static Packet EnterFieldNew(Character pCharacter) { Packet p = new Packet(); p.WriteShort((short)SendOpcodes.Field_Enter); p.WriteShort(2); p.WriteLong(1L); p.WriteLong(2L); p.WriteLong(pCharacter.Client.Channel); p.WriteByte(0); p.WriteByte(1); p.WriteInt(0); p.WriteByte(1); p.WriteShort(0); PlayerRandomStream PRS = new PlayerRandomStream(); PRS.ConnectData(p); HelpPacket.AddCharacterInformation(p, pCharacter); p.WriteInt(0); p.WriteLong(Tools.GetTime(Tools.CurrentTimeMillis())); p.WriteInt(100); p.WriteShort(0); p.WriteByte(1); return p; }
public static void AddChosenSkills(Packet p, Character c) { //TODO: Chosen skills. for (int i = 1; i <= 4; i++) { p.WriteInt(0); } }
public static void HandleCreateCharacter(Client pClient, Packet pPacket) { if (pClient.Account.LoggedIn != 1) { return; } List<Equip> equips = new List<Equip>(); string name = pPacket.ReadMapleString(); pPacket.ReadInt(); int startMap = 0; int jobType = pPacket.ReadInt(); short jobSubtype = pPacket.ReadShort(); byte gender = pPacket.ReadByte(); byte skin = pPacket.ReadByte(); pPacket.ReadByte(); int face = pPacket.ReadInt(); int hair = pPacket.ReadInt(); int hairColor = -1, faceMark = -1, topId, bottomId = -1, capeId = -1, shoesId, weaponId, shieldId = -1; if (Constants.CharacterCreation.hasHairColor(jobType)) hairColor = pPacket.ReadInt(); if (Constants.CharacterCreation.hasSkinColor(jobType)) pPacket.ReadInt(); if (Constants.CharacterCreation.hasFaceMark(jobType)) faceMark = pPacket.ReadInt(); if (Constants.CharacterCreation.hasHat(jobType)) { int capId = pPacket.ReadInt(); Equip cap = new Equip(); cap.ItemID = capId; cap.GiveStats(false); cap.InventorySlot = -1; equips.Add(cap); } topId = pPacket.ReadInt(); Equip top = new Equip(); top.ItemID = topId; top.GiveStats(false); top.InventorySlot = -5; equips.Add(top); if (Constants.CharacterCreation.hasBottom(jobType)) { bottomId = pPacket.ReadInt(); Equip bottom = new Equip(); bottom.ItemID = bottomId; bottom.GiveStats(false); bottom.InventorySlot = -6; equips.Add(bottom); } if (Constants.CharacterCreation.hasCape(jobType)) { capeId = pPacket.ReadInt(); Equip cape = new Equip(); cape.ItemID = capeId; cape.GiveStats(false); cape.InventorySlot = -9; equips.Add(cape); } shoesId = pPacket.ReadInt(); Equip shoes = new Equip(); shoes.ItemID = shoesId; shoes.GiveStats(false); shoes.InventorySlot = -7; equips.Add(shoes); weaponId = pPacket.ReadInt(); Equip weapon = new Equip(); weapon.ItemID = weaponId; weapon.GiveStats(false); weapon.InventorySlot = -11; equips.Add(weapon); if (jobType == (int)Constants.CharacterCreation.CreateTypes.Demon) { shieldId = pPacket.ReadInt(); Equip shield = new Equip(); shield.ItemID = shieldId; shield.GiveStats(false); shield.InventorySlot = -10; equips.Add(shield); } Character newChr = new Character(); newChr.Client = pClient; newChr.AccountId = pClient.Account.Id; newChr.WorldId = pClient.World; newChr.Name = name; newChr.MapId = Constants.CharacterCreation.GetMapByType(jobType); if (hairColor < 0) hairColor = 0; if (jobType != (short)Constants.CharacterCreation.CreateTypes.Mihile) { hair += hairColor; } newChr.HairId = hair; newChr.FaceId = face; newChr.SkinColor = (byte)skin; newChr.Gender = gender; if (faceMark < 0) faceMark = 0; newChr.FaceMarking = faceMark; newChr.Job = Constants.CharacterCreation.GetJobByType(jobType); newChr.Level = 1; newChr.HP = 50; newChr.MaxHP = 50; newChr.MP = 50; newChr.MaxMP = 50; newChr.Str = 4; newChr.Dex = 4; newChr.Int = 4; newChr.Luk = 4; newChr.ApHp = 0; newChr.MapId = startMap; pClient.Account.Characters.Add(newChr); try { newChr.Create(); } catch (Exception ex) { Console.WriteLine("Error creating character for {0}, Exception: {1}.", pClient.Session.IP, ex.Message); pClient.Session.Disconnect(); return; } newChr.Id = Master.Instance.Accessor.GetLastId(); Master.Instance.Accessor.AppendInventories(newChr, true); Master.Instance.Accessor.LoadInventoriesId(newChr); Master.Instance.Accessor.CreateEquips(newChr, equips); foreach (KeyValuePair<InventoryType, Inventory> inv in newChr.Inventory) inv.Value.Save(); //TODO: Check for forbidden names and stuff like so. pClient.SendPacket(LoginPacket.CreateCharacterResult(newChr, true)); }
public static void AddJaguarInfo(Packet p, Character c) { p.WriteByte(0); // Record of quest: 111112. p.WriteZero(20); }
public static void AddItemInfo(Packet p, Item item, Character c) { //TODO: This shit. }
public static void AddCharacterInformation(Packet pPacket, Character pCharacter) { pPacket.WriteInt(-1); pPacket.WriteInt(-2097153); pPacket.WriteZero(20); AddCharacterStats(pPacket, pCharacter); pPacket.WriteByte(20); // TODO: Buddylist class. pPacket.WriteByte(0); pPacket.WriteByte(0); pPacket.WriteByte(0); AddInventoryInfo(pPacket, pCharacter); AddSkillInfo(pPacket, pCharacter); AddCooldownInfo(pPacket, pCharacter); AddQuestInfo(pPacket, pCharacter); AddRingInfo(pPacket, pCharacter); AddRocksInfo(pPacket, pCharacter); AddMonsterBookInfo(pPacket, pCharacter); pPacket.WriteShort(0); pPacket.WriteShort(0); // TODO: Quest info packet. pPacket.WriteShort(0); if (Constants.JobConstants.isWildHunter(pCharacter.Job)) AddJaguarInfo(pPacket, pCharacter); pPacket.WriteByte(0); AddStealSkills(pPacket, pCharacter); AddInnerStats(pPacket, pCharacter); pPacket.WriteLong(1); pPacket.WriteLong(1); pPacket.WriteLong(0); pPacket.WriteLong(0); pPacket.WriteByte(0); pPacket.WriteLong(Tools.GetTime(-2)); pPacket.WriteInt(0); pPacket.WriteByte(0); //TODO: Farm Info. pPacket.WriteMapleString("Creating..."); pPacket.WriteInt(0); // Waru. pPacket.WriteInt(0); // Level pPacket.WriteInt(0); // EXP pPacket.WriteInt(0); // AestheticPoints pPacket.WriteInt(0); // Gems pPacket.WriteInt(0); // ? pPacket.WriteZero(5); pPacket.WriteInt(0); pPacket.WriteZero(13); pPacket.WriteLong(Tools.GetTime(-2)); pPacket.WriteInt(0); pPacket.WriteInt(322037760); pPacket.WriteZero(68); pPacket.WriteLong(Tools.GetTime(Tools.CurrentTimeMillis())); pPacket.WriteInt(0); pPacket.WriteByte(1); pPacket.WriteShort(0); pPacket.WriteInt(41870555); pPacket.WriteInt(6550069); pPacket.WriteLong(4); for (int i = 0; i < 4; i++) pPacket.WriteLong(9410165 + i); }
public static void AddInventoryInfo(Packet p, Character c) { p.WriteLong(c.Meso); p.WriteLong(0); p.WriteByte(c.Inventory[InventoryType.EQUIP].SlotLimit); p.WriteByte(c.Inventory[InventoryType.USE].SlotLimit); p.WriteByte(c.Inventory[InventoryType.SETUP].SlotLimit); p.WriteByte(c.Inventory[InventoryType.ETC].SlotLimit); p.WriteByte(c.Inventory[InventoryType.CASH].SlotLimit); //Quest:122700, idc. p.WriteLong(Tools.GetTime(-2L)); //foreach (KeyValuePair<short, Equip> equip in c.Inventory[InventoryType.EQUIPPED].Equips) //{ // if (equip.Key < 0 && equip.Key > -100) // { // AddEquipPosition(p, equip.Value, false, false); // AddEquipInfo(p, equip.Value, c); // } //} p.WriteShort(0); //foreach (KeyValuePair<short, Equip> equip in c.Inventory[InventoryType.EQUIPPED].Equips) //{ // if (equip.Key <= -100 && equip.Key > -1000) // { // AddEquipPosition(p, equip.Value, false, false); // AddEquipInfo(p, equip.Value, c); // } //} p.WriteShort(0); //foreach (KeyValuePair<short, Equip> equip in c.Inventory[InventoryType.EQUIP].Equips) //{ // AddEquipPosition(p, equip.Value, false, false); // AddEquipInfo(p, equip.Value, c); //} p.WriteShort(0); //foreach (KeyValuePair<short, Equip> equip in c.Inventory[InventoryType.EQUIPPED].Equips) //{ // if (equip.Key <= -1000 && equip.Key > - 1100) { // AddEquipPosition(p, equip.Value, false, false); // AddEquipInfo(p, equip.Value, c); // } //} p.WriteShort(0); //foreach (KeyValuePair<short, Equip> equip in c.Inventory[InventoryType.EQUIPPED].Equips) //{ // if (equip.Key <= -1100 && equip.Key > - 1200) { // AddEquipPosition(p, equip.Value, false, false); // AddEquipInfo(p, equip.Value, c); // } //} p.WriteShort(0); //foreach (KeyValuePair<short, Equip> equip in c.Inventory[InventoryType.EQUIPPED].Equips) //{ // if (equip.Key >= -1200) { // AddEquipPosition(p, equip.Value, false, false); // AddEquipInfo(p, equip.Value, c); // } //} p.WriteShort(0); p.WriteShort(0); p.WriteShort(0); //foreach (KeyValuePair<short, Equip> equip in c.Inventory[InventoryType.EQUIPPED].Equips) //{ // if (equip.Key <= -5000 && equip.Key >= -5002) { // AddEquipPosition(p, equip.Value, false, false); // AddEquipInfo(p, equip.Value, c); // } //} p.WriteShort(0); p.WriteShort(0); p.WriteShort(0); p.WriteShort(0); p.WriteShort(0); //foreach (KeyValuePair<byte, Item> item in c.Inventory[InventoryType.USE].Items) //{ // AddItemPosition(p, item.Value, false, false); // AddItemInfo(p, item.Value, c); //} p.WriteByte(0); //foreach (KeyValuePair<byte, Item> item in c.Inventory[InventoryType.SETUP].Items) //{ // AddItemPosition(p, item.Value, false, false); // AddItemInfo(p, item.Value, c); //} p.WriteByte(0); //foreach (KeyValuePair<byte, Item> item in c.Inventory[InventoryType.ETC].Items) //{ // AddItemPosition(p, item.Value, false, false); // AddItemInfo(p, item.Value, c); //} p.WriteByte(0); //foreach (KeyValuePair<byte, Item> item in c.Inventory[InventoryType.CASH].Items) //{ // AddItemPosition(p, item.Value, false, false); // AddItemInfo(p, item.Value, c); //} p.WriteByte(0); //TODO: Extended slots~ p.WriteZero(17); }
public static void AddInnerStats(Packet p, Character c) { p.WriteShort(0); //Inner skills count. //TODO: Inner skills. p.WriteInt(c.HonorLevel); p.WriteInt(c.HonorEXP); }
public static void AddEquipInfo(Packet p, Equip equip, Character c) { p.WriteByte(1); // Item type. 2 - An item, 3 - A pet. TODO: Pets. p.WriteInt(equip.ItemID); p.WriteByte(0); // todo: unique id. AddExpirationTime(p, equip.Expiration); p.WriteByte(0); // TODO: Extended slots. p.WriteInt(0); // All values of all stats. p.WriteByte(equip.Slots); p.WriteByte(equip.Level); p.WriteShort(equip.Str); p.WriteShort(equip.Str); p.WriteShort(equip.Str); p.WriteShort(equip.Str); p.WriteShort(equip.Str); p.WriteShort(equip.Str); p.WriteShort(equip.Str); p.WriteShort(equip.Str); p.WriteShort(equip.Str); p.WriteShort(equip.Str); p.WriteShort(equip.Str); p.WriteShort(equip.Str); p.WriteShort(equip.Str); p.WriteShort(equip.Str); p.WriteShort(equip.Str); p.WriteShort(equip.Str); p.WriteByte(0); // Inc skills? p.WriteByte(equip.ItemLevel); p.WriteInt(equip.ItemEXP * 100000); p.WriteInt(0); // Durability. p.WriteInt(equip.ViciousHammer); p.WriteShort(0); // PVP Damage. p.WriteInt(4); p.WriteByte(0xFF); p.WriteMapleString(""); // Owner. p.WriteByte(0); // State. p.WriteByte(0); // Enhance. p.WriteShort(0); // ptl1 p.WriteShort(0); // ptl2 p.WriteShort(0); // ptl3 p.WriteShort(0); // bonus ptl 1 p.WriteShort(0); // bonus ptl2 p.WriteShort(0); p.WriteShort(0); p.WriteShort(0); // socket state p.WriteShort(0); // socket1 p.WriteShort(0); // socket 2 p.WriteShort(0); // socket 3 //if (equip.CashId > 0) //p.writelong p.WriteLong(Tools.GetTime(-2)); p.WriteInt(-1); }
public static void AddCooldownInfo(Packet p, Character c) { // Insert cooldowns of character to a list. p.WriteShort(0); // Cooldowns size. //For each cd - WriteInt(SkillID), WriteInt(TimeLeft). p.WriteShort(0); // CD is empty. }
public void ShowDrop(Character chr) { if (QuestID != 0 && chr.Id != PlayerID) { return; } //DropPacket.ShowDrop(chr, this, (byte)DropPacket.DropTypes.ShowExisting, false, new Pos()); }
public void TakeDrop(Character chr, bool petPickup) { //DropPacket.TakeDrop(chr, this, petPickup); Master.Instance.DataProvider.Maps[MapID].RemoveDrop(this); }
public bool giveDamage(Character f****r, int amount) { //if (HP == 0) return false; //if (!Damages.ContainsKey(f****r.mID)) // Damages.Add(f****r.mID, 0); //Damages[f****r.mID] += (ulong)amount; //if (HP < amount) // HP = 0; //else // HP -= amount; return true; }
public static void AddMonsterBookInfo(Packet p, Character c) { p.WriteInt(0); //Getscore>0, writeFinished. Else, writeUnfinished. p.WriteByte(0); p.WriteShort(0); p.WriteInt(0); }
public static Packet CharacterEnter(Character pCharacter) { Packet p = new Packet(); p.WriteShort((short)SendOpcodes.Player_Spawn); p.WriteInt(pCharacter.Id); p.WriteByte(pCharacter.Level); p.WriteMapleString(pCharacter.Name); // Quest 111111 - I don't care for now. p.WriteMapleString(""); // TODO: Guilds! p.WriteZero(8); p.WriteByte(0); // Buffs List<Pair<int, int>> BuffValue = new List<Pair<int, int>>(); List<Pair<int, int>> BuffValueNew = new List<Pair<int, int>>(); int[] Mask = new int[12]; Mask[0] |= -33554432; Mask[1] |= 512; Mask[5] |= 163840; for (int i = 0; i < Mask.Length; i++) { p.WriteInt(Mask[i]); } foreach (Pair<int, int> i in BuffValue) { if (i.Right == 3) { p.WriteInt(i.Left); } else if (i.Right == 2) { p.WriteShort((short)i.Left); } else if (i.Right == 1) { p.WriteByte((byte)i.Left); } } p.WriteInt(-1); if (BuffValueNew.Count < 1) { p.WriteZero(10); } else { p.WriteByte(0); foreach (Pair<int, int> i in BuffValueNew) { if (i.Right == 4) { p.WriteInt(i.Left); } else if (i.Right == 2) { p.WriteShort((short)i.Left); } else if (i.Right == 1) { p.WriteByte((byte)i.Left); } else if (i.Right == 0) { p.WriteZero((byte)i.Left); } } } p.WriteZero(20); int Magic_Spawn = new Random().Next(); p.WriteByte(1); p.WriteInt(Magic_Spawn); p.WriteZero(10); p.WriteByte(1); p.WriteInt(Magic_Spawn); p.WriteZero(10); p.WriteByte(1); p.WriteInt(Magic_Spawn); p.WriteShort(0); // TODO: Mounts. p.WriteLong(0L); p.WriteByte(1); p.WriteInt(Magic_Spawn); p.WriteLong(0L); p.WriteByte(1); p.WriteInt(Magic_Spawn); p.WriteZero(15); p.WriteByte(1); p.WriteInt(Magic_Spawn); p.WriteZero(16); p.WriteByte(1); p.WriteInt(Magic_Spawn); p.WriteShort(0); p.WriteShort(pCharacter.Job); p.WriteShort(pCharacter.Subcategory); HelpPacket.AddCharacterLooks(p, pCharacter, true); p.WriteZero(8); p.WriteInt(0); // Valentine effect. TODO. p.WriteZero(20); // Quest 124000. p.WriteInt(0); p.WriteZero(8); p.WriteInt(0); p.WriteInt(0); // TODO: Item effect. p.WriteInt(0); // TODO: Chair. p.WriteInt(0); p.WritePosition(pCharacter.Position); p.WriteByte(pCharacter.Stance); p.WriteShort(pCharacter.Foothold); p.WriteByte(0); p.WriteByte(0); p.WriteByte(0); p.WriteShort(1); // TODO: Mounts. p.WriteInt(0); p.WriteInt(0); p.WriteInt(0); p.WriteByte(0); p.WriteByte(0); // TODO: Chalkboard. //p.WriteMapleString(Chalkboard Text); p.WriteByte(0); p.WriteByte(0); p.WriteByte(0); p.WriteByte(0); // TODO: Berserk. p.WriteInt(0); p.WriteMapleString("Creating..."); p.WriteInt(0); // Waru. p.WriteInt(0); // Level p.WriteInt(0); // EXP p.WriteInt(0); // AestheticPoints p.WriteInt(0); // Gems p.WriteInt(0); // ? p.WriteZero(5); p.WriteInt(0); p.WriteByte(0xFF); p.WriteInt(0xFF); p.WriteZero(9); return p; }
public void setControl(Character control, bool spawn, Character display) { //Controller = control; //if (HP == 0) return; //if (control != null) //{ // MobPacket.SendMobRequestControl(control, this, spawn, null); //} //else if (ControlStatus == MobControlStatus.ControlNone) //{ // MobPacket.SendMobRequestControl(control, this, spawn, display); //} }
public static void AddQuestInfo(Packet p, Character c) { // Started quests's list. p.WriteByte(1); p.WriteShort(0); // Started quests size. // For each started quest, writeShort(id), if the quest has mob kills - build a string of kills and shit, and write the string as maple string. If not, get custom data as maplestring. p.WriteShort(0); p.WriteByte(1); //List of completed quests. p.WriteShort(0); // Completed quests size. // For each completed quest, write short the ID and writeInt the completion time. }
public static Packet EnterField(Character pCharacter) { Packet p = new Packet(); p.WriteShort((short)SendOpcodes.Field_Enter); p.WriteShort(2); p.WriteLong(1); p.WriteLong(2); p.WriteLong(pCharacter.Client.Channel); p.WriteByte(pCharacter.PortalCount); p.WriteByte(2); p.WriteBytes(new byte[8]); p.WriteInt(pCharacter.MapId); p.WriteByte(pCharacter.MapPosition); p.WriteInt(pCharacter.HP); p.WriteByte(0); p.WriteLong(Tools.GetTime(Tools.CurrentTimeMillis())); p.WriteInt(100); p.WriteShort(0); p.WriteByte(1); return p; }
public static void AddRocksInfo(Packet p, Character c) { //Put reg rocks maps into array. Write map ID of each one //In order: Regular Rocks, VIP Rocks, Hyper Rocks. for (int i = 0; i < 5; i++) { p.WriteInt(999999999); } for (int i = 0; i < 10; i++) { p.WriteInt(999999999); } for (int i = 0; i < 13; i++) { p.WriteInt(999999999); } for (int i = 0; i < 13; i++) { p.WriteInt(999999999); } }
public static void AddRingInfo(Packet p, Character c) { p.WriteShort(0); //Triple<List<MpaleRing>, List<MapleRing>, List<MapleRing>> - of character's rings. //The following applies 3 times: 3 ring slots. p.WriteShort(0); // Rings size. p.WriteShort(0); // Rings size. p.WriteShort(0); // Rings size. // For each ring, writeInt(partnerCharacterID), writeString(ParterName, 13), writeLong(RingID), writeLong(PartnerRingID). }
public static void AddCharacterStats(Packet pPacket, Character pCharacter) { pCharacter.Subcategory = Constants.JobConstants.GetSubcategory(pCharacter.Job); pPacket.WriteInt(pCharacter.Id); pPacket.WritePaddedString(pCharacter.Name, 13); pPacket.WriteByte(pCharacter.Gender); pPacket.WriteByte(pCharacter.SkinColor); pPacket.WriteInt(pCharacter.FaceId); pPacket.WriteInt(pCharacter.HairId); pPacket.WriteZero(24); pPacket.WriteByte(pCharacter.Level); pPacket.WriteShort(pCharacter.Job); pPacket.WriteShort(pCharacter.Str); pPacket.WriteShort(pCharacter.Dex); pPacket.WriteShort(pCharacter.Int); pPacket.WriteShort(pCharacter.Luk); pPacket.WriteInt(pCharacter.HP); pPacket.WriteInt(pCharacter.MaxHP); pPacket.WriteInt(pCharacter.MP); pPacket.WriteInt(pCharacter.MaxMP); pPacket.WriteShort(pCharacter.AP); if (Constants.JobConstants.isSeparatedSp(pCharacter.Job)) { byte length = (byte)pCharacter.SP.Count((b) => b > 0); pPacket.WriteByte(length); foreach (int i in pCharacter.SP) { if (i > 0) { pPacket.WriteByte((byte)(i + 1)); pPacket.WriteInt(pCharacter.SP[i]); } } } else { pPacket.WriteShort(pCharacter.SP[0]); } pPacket.WriteLong(pCharacter.EXP); pPacket.WriteInt(pCharacter.Fame); pPacket.WriteShort(0); // Migration Data, v141. pPacket.WriteShort(-1800); // Migration Data, v141. pPacket.WriteInt(0); // Gachapon EXP. pPacket.WriteInt(pCharacter.MapId); pPacket.WriteByte(pCharacter.MapPosition); pPacket.WriteInt(0); pPacket.WriteShort(pCharacter.Subcategory); if (Constants.JobConstants.isDemonAvenger(pCharacter.Job) || Constants.JobConstants.isDemonSlayer(pCharacter.Job) || Constants.JobConstants.isXenon(pCharacter.Job)) pPacket.WriteInt(pCharacter.FaceMarking); pPacket.WriteByte(pCharacter.Fatigue); pPacket.WriteInt(Constants.GetCurrentDate()); pPacket.WriteInt(pCharacter.Ambition); pPacket.WriteInt(pCharacter.Insight); pPacket.WriteInt(pCharacter.Willpower); pPacket.WriteInt(pCharacter.Diligence); pPacket.WriteInt(pCharacter.Empathy); pPacket.WriteInt(pCharacter.Charm); pPacket.WriteZero(13); pPacket.WriteLong(Tools.GetTime(Tools.CurrentTimeMillis())); pPacket.WriteInt(pCharacter.BattleEXP); pPacket.WriteByte(pCharacter.BattleRank); pPacket.WriteInt(pCharacter.BattlePoints); pPacket.WriteByte(5); pPacket.WriteByte(6); pPacket.WriteByte(0); pPacket.WriteInt(0); pPacket.WriteBytes(new byte[] { 59, 55, 79, 1, 0, 64 }); pPacket.WriteSByte(-32); pPacket.WriteSByte(-3); pPacket.WriteShort(0); pPacket.WriteZero(3); for (int i = 0; i < 9; i++) { pPacket.WriteInt(0); pPacket.WriteByte(0); pPacket.WriteInt(0); } pPacket.WriteReversedLong(Tools.GetTime(Tools.CurrentTimeMillis())); }