public static Packet AddCreatureInfo(this Packet packet, Creature creature, CreaturePacketType type) { // Check for MabiPC for private data. var character = creature as PlayerCreature; if (type == CreaturePacketType.Private && character == null) throw new Exception("PlayerCreature required for private creature packet."); // Get incomplete quests only once, if we need them. //IEnumerable<MabiQuest> incompleteQuests = null; //int incompleteQuestsCount = 0; //if (type == CreaturePacketType.Private && character != null) //{ // incompleteQuests = character.Quests.Values.Where(quest => quest.State < MabiQuestState.Complete); // incompleteQuestsCount = incompleteQuests.Count(); //} var pos = creature.GetPosition(); // Start // -------------------------------------------------------------- packet.PutLong(creature.EntityId); packet.PutByte((byte)type); // Looks/Location // -------------------------------------------------------------- packet.PutString(creature.Name); packet.PutString(""); // Title packet.PutString(""); // Eng Title packet.PutInt(creature.Race); packet.PutByte(creature.SkinColor); packet.PutByte(creature.EyeType); packet.PutByte(creature.EyeColor); packet.PutByte(creature.MouthType); packet.PutUInt((uint)creature.State); if (type == CreaturePacketType.Public) { packet.PutUInt((uint)creature.StateEx); // [180300, NA166 (18.09.2013) { packet.PutInt(0); } } packet.PutFloat(creature.Height); packet.PutFloat(creature.Weight); packet.PutFloat(creature.Upper); packet.PutFloat(creature.Lower); packet.PutInt(creature.RegionId); packet.PutInt(pos.X); packet.PutInt(pos.Y); packet.PutByte(creature.Direction); packet.PutInt((int)creature.BattleStance); packet.PutByte((byte)creature.Inventory.WeaponSet); packet.PutUInt(creature.Color1); packet.PutUInt(creature.Color2); packet.PutUInt(creature.Color3); // Stats // -------------------------------------------------------------- packet.PutFloat(creature.CombatPower); packet.PutString(creature.StandStyle); if (type == CreaturePacketType.Private) { packet.PutFloat(creature.Life); packet.PutFloat(creature.LifeInjured); packet.PutFloat(creature.LifeMaxBaseTotal); packet.PutFloat(creature.LifeMaxMod); packet.PutFloat(creature.Mana); packet.PutFloat(creature.ManaMaxBaseTotal); packet.PutFloat(creature.ManaMaxMod); packet.PutFloat(creature.Stamina); packet.PutFloat(creature.StaminaMaxBaseTotal); packet.PutFloat(creature.StaminaMaxMod); packet.PutFloat(creature.StaminaHunger); packet.PutFloat(0.5f); packet.PutShort(creature.Level); packet.PutInt(creature.LevelTotal); packet.PutShort(0); // Max Level (reached ever?) packet.PutShort(0); // Rebirthes packet.PutShort(0); packet.PutLong(AuraData.ExpDb.CalculateRemaining(creature.Level, creature.Exp) * 1000); packet.PutShort(creature.Age); packet.PutFloat(creature.StrBaseTotal); packet.PutFloat(creature.StrMod); packet.PutFloat(creature.DexBaseTotal); packet.PutFloat(creature.DexMod); packet.PutFloat(creature.IntBaseTotal); packet.PutFloat(creature.IntMod); packet.PutFloat(creature.WillBaseTotal); packet.PutFloat(creature.WillMod); packet.PutFloat(creature.LuckBaseTotal); packet.PutFloat(creature.LuckMod); packet.PutFloat(creature.LifeFoodMod); packet.PutFloat(creature.ManaFoodMod); packet.PutFloat(creature.StaminaFoodMod); packet.PutFloat(creature.StrFoodMod); packet.PutFloat(creature.DexFoodMod); packet.PutFloat(creature.IntFoodMod); packet.PutFloat(creature.WillFoodMod); packet.PutFloat(creature.LuckFoodMod); packet.PutShort(creature.AbilityPoints); packet.PutShort(0); // AttackMinBase packet.PutShort(0); // AttackMinMod packet.PutShort(0); // AttackMaxBase packet.PutShort(0); // AttackMaxMod packet.PutShort(0); // WAttackMinBase packet.PutShort(0); // WAttackMinMod packet.PutShort(0); // WAttackMaxBase packet.PutShort(0); // WAttackMaxMod packet.PutShort(0); // LeftAttackMinMod packet.PutShort(0); // LeftAttackMaxMod packet.PutShort(0); // RightAttackMinMod packet.PutShort(0); // RightAttackMaxMod packet.PutShort(0); // LeftWAttackMinMod packet.PutShort(0); // LeftWAttackMaxMod packet.PutShort(0); // RightWAttackMinMod packet.PutShort(0); // RightWAttackMaxMod packet.PutFloat(0); // LeftCriticalMod packet.PutFloat(0); // RightCriticalMod packet.PutShort(0); // LeftRateMod packet.PutShort(0); // RightRateMod packet.PutFloat(0); // MagicDefenseMod // [180300, NA166 (18.09.2013)] Magic Protection { packet.PutFloat(0); // MagicProtectMod } packet.PutFloat(0); // MagicAttackMod packet.PutShort(15); // MeleeAttackRateMod packet.PutShort(15); // RangeAttackRateMod packet.PutFloat(0); // CriticalBase packet.PutFloat(0); // CriticalMod packet.PutFloat((short)creature.ProtectionBase); packet.PutFloat(creature.ProtectionMod); packet.PutShort((short)creature.DefenseBase); packet.PutShort((short)creature.DefenseMod); packet.PutShort(0); // RateBase packet.PutShort(0); // RateMod packet.PutShort(0); // Rank1 packet.PutShort(0); // Rank2 // [180300, NA166 (18.09.2013)] Armor Pierce { packet.PutShort(0); // ArmorPierceMod } packet.PutLong(0); // Score packet.PutShort((short)creature.AttackMinBaseMod); packet.PutShort((short)creature.AttackMaxBaseMod); packet.PutShort((short)creature.WAttackMinBase); packet.PutShort((short)creature.WAttackMaxBase); packet.PutFloat(creature.CriticalBase * 100); packet.PutFloat(creature.ProtectionBaseMod); packet.PutShort((short)creature.DefenseBaseMod); packet.PutShort((short)(creature.BalanceBase * 100)); // In some tests the damage display would be messed up if // those two weren't set to something. packet.PutShort(0); // MeleeAttackMinBaseMod (8 / 3) packet.PutShort(0); // MeleeAttackMaxBaseMod (18 / 4) packet.PutShort(0); // MeleeWAttackMinBaseMod packet.PutShort(0); // MeleeWAttackMaxBaseMod packet.PutShort(0); // RangeAttackMinBaseMod (10) packet.PutShort(0); // RangeAttackMaxBaseMod (25) packet.PutShort(0); // RangeWAttackMinBaseMod packet.PutShort(0); // RangeWAttackMaxBaseMod // [180100] Guns { packet.PutShort(0); // DualgunAttackMinBaseMod packet.PutShort(0); // DualgunAttackMaxBaseMod packet.PutShort(0); // DualgunWAttackMinBaseMod packet.PutShort(0); // DualgunWAttackMaxBaseMod } packet.PutShort(0); // PoisonBase packet.PutShort(0); // PoisonMod packet.PutShort(67); // PoisonImmuneBase packet.PutShort(0); // PoisonImmuneMod packet.PutFloat(0.5f); // PoisonDamageRatio1 packet.PutFloat(0); // PoisonDamageRatio2 packet.PutFloat(0); // toxicStr packet.PutFloat(0); // toxicInt packet.PutFloat(0); // toxicDex packet.PutFloat(0); // toxicWill packet.PutFloat(0); // toxicLuck packet.PutString("Uladh_main/town_TirChonaill/TirChonaill_Spawn_A"); // Last town packet.PutShort(1); // ExploLevel packet.PutShort(0); // ExploMaxKeyLevel packet.PutInt(0); // ExploCumLevel packet.PutLong(0); // ExploExp packet.PutInt(0); // DiscoverCount packet.PutFloat(0); // conditionStr packet.PutFloat(0); // conditionInt packet.PutFloat(0); // conditionDex packet.PutFloat(0); // conditionWill packet.PutFloat(0); // conditionLuck packet.PutByte(9); // ElementPhysical packet.PutByte(0); // ElementLightning packet.PutByte(0); // ElementFire packet.PutByte(0); // ElementIce var regens = creature.Regens.GetList(); packet.PutInt(regens.Count); foreach (var regen in regens) packet.AddRegen(regen); } else if (type == CreaturePacketType.Public || type == CreaturePacketType.Minimal) { packet.PutFloat(creature.Life); packet.PutFloat(creature.LifeMaxBaseTotal); packet.PutFloat(creature.LifeMaxMod); packet.PutFloat(creature.LifeInjured); var regens = creature.Regens.GetPublicList(); packet.PutInt(regens.Count); foreach (var regen in regens) packet.AddRegen(regen); // Another 6 elements list? packet.PutInt(0); } // Titles // -------------------------------------------------------------- packet.PutUShort(creature.Titles.SelectedTitle); packet.PutLong(creature.Titles.Applied); if (type == CreaturePacketType.Private) { // List of available titles var titles = character.Titles.GetList(); packet.PutShort((short)titles.Count); foreach (var title in titles) { packet.PutUShort(title.Key); packet.PutByte((byte)title.Value); packet.PutInt(0); } } if (type == CreaturePacketType.Private || type == CreaturePacketType.Public) { packet.PutUShort(creature.Titles.SelectedOptionTitle); } // Items and expiring? (Last part of minimal) // -------------------------------------------------------------- if (type == CreaturePacketType.Minimal) { packet.PutString(""); packet.PutByte(0); var items = creature.Inventory.Equipment; packet.PutInt(items.Count()); foreach (var item in items) { packet.PutLong(item.EntityId); packet.PutBin(item.Info); } packet.PutInt(0); // PetRemainingTime packet.PutLong(0); // PetLastTime packet.PutLong(0); // PetExpireTime return packet; } // Mate // -------------------------------------------------------------- if (type == CreaturePacketType.Private) { packet.PutLong(0); // MateID packet.PutString(""); // MateName packet.PutLong(0); // MarriageTime packet.PutShort(0); // MarriageCount } else if (type == CreaturePacketType.Public) { packet.PutString(""); // MateName } // Destiny // -------------------------------------------------------------- packet.PutByte(0); // (0:Venturer, 1:Knight, 2:Wizard, 3:Bard, 4:Merchant, 5:Alchemist) // Inventory // -------------------------------------------------------------- if (type == CreaturePacketType.Private) { packet.PutInt(creature.RaceData.InventoryWidth); packet.PutInt(creature.RaceData.InventoryHeight); var items = creature.Inventory.Items; packet.PutInt(items.Count()); foreach (var item in items) packet.AddItemInfo(item, ItemPacketType.Private); } else if (type == CreaturePacketType.Public) { var items = creature.Inventory.Equipment; packet.PutInt(items.Count()); foreach (var item in items) { packet.PutLong(item.EntityId); packet.PutBin(item.Info); } } // [180300, NA169 (23.10.2013)] ? // Strange one, it's in the logs, but stucks the char in // casting animation. Dependent on something? // -------------------------------------------------------------- if (type == CreaturePacketType.Private) { //packet.PutInt(2); // Count? //packet.PutInt(36); //packet.PutInt(8); //packet.PutInt(38); //packet.PutInt(4); } // Keywords // -------------------------------------------------------------- if (type == CreaturePacketType.Private) { var keywords = character.Keywords.GetList(); packet.PutShort((short)keywords.Count); foreach (var keyword in keywords) packet.PutUShort(keyword); } // Skills // -------------------------------------------------------------- if (type == CreaturePacketType.Private) { var skills = creature.Skills.GetList(); packet.PutShort((short)skills.Count); foreach (var skill in skills) packet.PutBin(skill.Info); packet.PutInt(0); // SkillVarBufferList // loop // packet.PutInt // packet.PutFloat } else if (type == CreaturePacketType.Public) { packet.PutShort(0); // CurrentSkill packet.PutByte(0); // SkillStackCount packet.PutInt(0); // SkillProgress packet.PutInt(0); // SkillSyncList // loop // packet.PutShort // packet.PutShort } // [150100] ? { packet.PutByte(0); // {PLGCNT} } // Party // -------------------------------------------------------------- //if (creature.Party != null) //{ // packet.PutByte(creature.Party.IsOpen && creature.Party.Leader == creature); // packet.PutString(creature.Party.GetMemberWantedString()); //} //else { packet.PutByte(0); packet.PutString(""); } // PvP // -------------------------------------------------------------- packet.AddPvPInfo(creature); // Conditions // -------------------------------------------------------------- packet.AddConditions(creature.Conditions); // Guild // -------------------------------------------------------------- //if (creature.Guild != null) //{ // packet.PutLong(creature.Guild.Id); // packet.PutString(creature.Guild.Name); // packet.PutInt((uint)creature.GuildMember.MemberRank); // packet.PutByte(0); // packet.PutByte(0); // packet.PutByte(0); // packet.PutInt(0); // packet.PutByte(0); // packet.PutByte(0); // packet.PutByte(0); // packet.PutByte(0); // packet.PutString(creature.Guild.Title); //} //else { packet.PutLong(0); packet.PutString(""); packet.PutInt(0); packet.PutByte(0); packet.PutByte(0); packet.PutByte(0); packet.PutInt(0); packet.PutByte(0); packet.PutByte(0); packet.PutByte(0); packet.PutByte(0); packet.PutString(""); } // PTJ // -------------------------------------------------------------- if (type == CreaturePacketType.Private) { packet.PutLong(0); // ArbeitID packet.PutInt(0); // ArbeitRecordList // loop // packet.PutShort // packet.PutShort // packet.PutShort } // Following a master // -------------------------------------------------------------- if (type == CreaturePacketType.Private) { if (creature.Master != null) { packet.PutLong(creature.Master.EntityId); packet.PutByte(2); // Type (1:RPCharacter, 2:Pet, 3:Transport, 4:PartnerVehicle) packet.PutByte(0); // SubType } else { packet.PutLong(0); packet.PutByte(0); packet.PutByte(0); } } // [170100] ? // -------------------------------------------------------------- if (type == CreaturePacketType.Private) { packet.PutFloat(1); packet.PutLong(0); } // Transformation // -------------------------------------------------------------- packet.PutByte(0); // Type (1:Paladin, 2:DarkKnight, 3:SubraceTransformed, 4:TransformedElf, 5:TransformedGiant) packet.PutShort(0); // Level packet.PutShort(0); // SubType // Pet // -------------------------------------------------------------- if (creature.Master != null) { packet.PutString(creature.Master.Name); if (type == CreaturePacketType.Private) { packet.PutInt(2000000000); // RemainingSummonTime packet.PutLong(0); // LastSummonTime packet.PutLong(0); // PetExpireTime packet.PutByte(0); // Loyalty packet.PutByte(0); // Favor packet.PutLong(DateTime.Now); // SummonTime packet.PutByte(0); // KeepingMode packet.PutLong(0); // KeepingProp packet.PutLong(creature.Master.EntityId); packet.PutByte(0); // PetSealCount {PSCNT} } else if (type == CreaturePacketType.Public) { packet.PutLong(creature.Master.EntityId); packet.PutByte(0); // KeepingMode packet.PutLong(0); // KeepingProp } } else { packet.PutString(""); if (type == CreaturePacketType.Private) { packet.PutInt(0); packet.PutLong(0); packet.PutLong(0); packet.PutByte(0); packet.PutByte(0); packet.PutLong(0); packet.PutByte(0); packet.PutLong(0); packet.PutLong(0); packet.PutByte(0); } else if (type == CreaturePacketType.Public) { packet.PutLong(0); packet.PutByte(0); packet.PutLong(0); } } // House // -------------------------------------------------------------- if (type == CreaturePacketType.Private) packet.PutLong(0); // HouseID // Taming // -------------------------------------------------------------- packet.PutLong(0); // MasterID packet.PutByte(0); // IsTamed packet.PutByte(0); // TamedType (1:DarkKnightTamed, 2:InstrumentTamed, 3:AnimalTraining, 4:MercenaryTamed, 5:Recalled, 6:SoulStoneTamed, 7:TamedFriend) packet.PutByte(1); // IsMasterMode packet.PutInt(0); // LimitTime // Vehicle // -------------------------------------------------------------- packet.PutInt(0); // Type packet.PutInt(0); // TypeFlag (0x1:Driver, 0x4:Owner) packet.PutLong(0); // VehicleId packet.PutInt(0); // SeatIndex packet.PutByte(0); // PassengerList // loop // packet.PutLong // Showdown // -------------------------------------------------------------- packet.PutInt(0); // unknown at 0x18 packet.PutLong(0); // unknown at 0x08 packet.PutLong(0); // unknown at 0x10 packet.PutByte(1); // IsPartyPvpDropout // Transport // -------------------------------------------------------------- packet.PutLong(0); // TransportID packet.PutInt(0); // HuntPoint // Aviation // -------------------------------------------------------------- packet.PutByte(0); // --v //packet.PutByte(creature.IsFlying); //if (creature.IsFlying) //{ // var pos = creature.GetPosition(); // packet.PutFloat(pos.X); // packet.PutFloat(pos.H); // packet.PutFloat(pos.Y); // packet.PutFloat(creature.Destination.X); // packet.PutFloat(creature.Destination.H); // packet.PutFloat(creature.Destination.Y); // packet.PutFloat(creature.Direction); //} // Skiing // -------------------------------------------------------------- packet.PutByte(0); // IsSkiing // loop // packet.PutFloat // packet.PutFloat // packet.PutFloat // packet.PutFloat // packet.PutInt // packet.PutInt // packet.PutByte // packet.PutByte // Farming // [150100-170400] Public too // -------------------------------------------------------------- if (type == CreaturePacketType.Private) { packet.PutLong(0); // FarmId // packet.PutLong // packet.PutLong // packet.PutLong // packet.PutShort // packet.PutShort // packet.PutShort // packet.PutShort // packet.PutShort // packet.PutShort // packet.PutByte // packet.PutLong // packet.PutByte // packet.PutLong } // Event (CaptureTheFlag, WaterBalloonBattle) // -------------------------------------------------------------- packet.PutByte(0); // EventFullSuitIndex packet.PutByte(0); // TeamId // if? // packet.PutInt // HitPoint // packet.PutInt // MaxHitPoint // [170300] ? { packet.PutString(""); packet.PutByte(0); } // Heartstickers // -------------------------------------------------------------- if (type == CreaturePacketType.Private) { packet.PutShort(0); packet.PutShort(0); } // Joust // -------------------------------------------------------------- packet.PutInt(0); // JoustId if (type == CreaturePacketType.Private) { packet.PutInt(0); // JoustPoint packet.PutByte(0); // unknown at 0x1D packet.PutByte(0); // unknown at 0x1C packet.PutByte(0); // WeekWinCount packet.PutShort(0); // DailyWinCount packet.PutShort(0); // DailyLoseCount packet.PutShort(0); // ServerWinCount packet.PutShort(0); // ServerLoseCount } else if (type == CreaturePacketType.Public) { packet.PutLong(0); // HorseId packet.PutFloat(0); // Life packet.PutInt(100); // LifeMax packet.PutByte(9); // unknown at 0x6C packet.PutByte(0); // IsJousting } // Achievements // -------------------------------------------------------------- if (type == CreaturePacketType.Private) { packet.PutInt(0); // TotalScore packet.PutShort(0); // AchievementList // loop // packet.PutShort achievementId } // PrivateFarm // -------------------------------------------------------------- if (type == CreaturePacketType.Private) { packet.PutInt(0); // FavoriteFarmList // loop // packet.PutLong // FarmId // packet.PutInt // ZoneId // packet.PutShort // PosX // packet.PutShort // PoxY // packet.PutString // FarmName // packet.PutString // OwnerName } // Family // -------------------------------------------------------------- packet.PutLong(0); // FamilyId // if // packet.PutString // FamilyName // packet.PutShort // packet.PutShort // packet.PutShort // packet.PutString // FamilyTitle // Demigod // -------------------------------------------------------------- if (type == CreaturePacketType.Private) { packet.PutInt(0); // SupportType (0:None, 1:Neamhain, 2:Morrighan) } // [150100] NPC options // -------------------------------------------------------------- if (type == CreaturePacketType.Public && creature.Is(EntityType.NPC)) { packet.PutShort(0); // OnlyShowFilter packet.PutShort(0); // HideFilter } // [150100] Commerce // -------------------------------------------------------------- { packet.PutByte(1); // IsInCommerceCombat packet.PutLong(0); // TransportCharacterId packet.PutFloat(1); // ScaleHeight } // [170100] Talents // -------------------------------------------------------------- { if (type == CreaturePacketType.Public) { packet.PutLong(0); packet.PutByte(0); packet.PutByte(0); packet.PutFloat(1); packet.PutLong(0); packet.PutShort(0); // --v packet.PutByte(0); // --v //packet.PutShort((ushort)creature.Talents.SelectedTitle); //packet.PutByte((byte)creature.Talents.Grandmaster); } else if (type == CreaturePacketType.Private) { packet.AddPrivateTalentInfo(creature); } } // [170300] Shamala // -------------------------------------------------------------- { if (type == CreaturePacketType.Private) { // Transformation Diary packet.PutInt(0); // --v //packet.PutSInt(character.Shamalas.Count); //foreach (var trans in character.Shamalas) //{ // packet.PutInt(trans.Id); // packet.PutByte(trans.Counter); // packet.PutByte((byte)trans.State); //} } else if (type == CreaturePacketType.Public) { // Current transformation info //if (creature.Shamala != null) //{ // packet.PutInt(creature.Shamala.Id); // packet.PutByte(0); // packet.PutInt(creature.ShamalaRace.Id); // packet.PutFloat(creature.Shamala.Size); // packet.PutInt(creature.Shamala.Color1); // packet.PutInt(creature.Shamala.Color2); // packet.PutInt(creature.Shamala.Color3); //} //else { packet.PutInt(0); packet.PutByte(0); packet.PutInt(0); packet.PutFloat(1); packet.PutInt(0x808080); packet.PutInt(0x808080); packet.PutInt(0x808080); } packet.PutByte(0); packet.PutByte(0); } } // [180100] ? // -------------------------------------------------------------- if (type == CreaturePacketType.Private) { packet.PutInt(0); packet.PutInt(0); } // [NA170403, TW170300] ? // -------------------------------------------------------------- { packet.PutInt(0); packet.PutLong(0); packet.PutLong(0); // Rock/Paper/Scissors? packet.PutString(""); // Banner text? packet.PutByte(0); // Banner enabled? } // [180300, NA166 (18.09.2013)] ? // Required, even though it looks like a list. // -------------------------------------------------------------- { packet.PutInt(10); // Count? packet.PutLong(4194304); packet.PutInt(1347950097); packet.PutLong(34359771136); packet.PutInt(1346340501); packet.PutLong(0); packet.PutInt(0); packet.PutLong(0); packet.PutInt(0); packet.PutLong(0); packet.PutInt(0); packet.PutLong(0); packet.PutInt(0); packet.PutLong(0); packet.PutInt(0); packet.PutLong(0); packet.PutInt(0); packet.PutLong(0); packet.PutInt(0); packet.PutLong(0); packet.PutInt(0); } // [180500, NA181 (12.02.2014)] ? // Without this the "me" creature in the Smash cutscene had a // red aura. // -------------------------------------------------------------- if (type == CreaturePacketType.Public) { packet.PutByte(0); } // Character // -------------------------------------------------------------- if (type == CreaturePacketType.Public) { packet.PutLong(0); // AimingTarget packet.PutLong(0); // Executor packet.PutShort(0); // ReviveTypeList // loop // packet.PutInt // < int g18 monsters? } packet.PutByte(0); // IsGhost // SittingProp if (creature.Temp.SittingProp == null) packet.PutLong(0); else packet.PutLong(creature.Temp.SittingProp.EntityId); packet.PutInt(-1); // SittedSocialMotionId // ? (Last Part of public) // -------------------------------------------------------------- if (type == CreaturePacketType.Public) { packet.PutLong(0); // DoubleGoreTarget (Doppelganger condition) packet.PutInt(0); // DoubleGoreTargetType // [180300, NA169 (23.10.2013)] ? { packet.PutLong(0); } if (!creature.IsMoving) { packet.PutByte(0); } else { var dest = creature.GetDestination(); packet.PutByte((byte)(!creature.IsWalking ? 2 : 1)); packet.PutInt(dest.X); packet.PutInt(dest.Y); } if (creature.Is(EntityType.NPC)) { packet.PutString(creature.StandStyleTalking); } // [150100] Bomb Event { packet.PutByte(0); // BombEventState } // [170400] ? { packet.PutByte(0); } // [180?00] ? { packet.PutByte(1); } // [180500, NA181 (12.02.2014)] ? { packet.PutByte(1); } return packet; } // private: // [JP] ? // This int is needed in the JP client (1704 log), // but doesn't appear in the NA 1704 or KR test 1801 log. { //packet.PutInt(4); } // Premium stuff // -------------------------------------------------------------- packet.PutByte(0); // IsUsingExtraStorage (old service) packet.PutByte(1); // IsUsingNaosSupport (old service) (Style tab in 1803?) packet.PutByte(0); // IsUsingAdvancedPlay (old service) packet.PutByte(0); // PremiumService 0 packet.PutByte(0); // PremiumService 1 packet.PutByte(1); // Premium Gestures packet.PutByte(1); // ? (Default 1 on NA?) packet.PutByte(0); // [170402, TW170300] New premium thing { packet.PutByte(1); // VIP inv? (since 1803?) } // [180300, NA166 (18.09.2013)] ? { packet.PutByte(0); packet.PutByte(0); } packet.PutInt(0); packet.PutByte(0); packet.PutInt(0); packet.PutInt(0); packet.PutInt(0); // Quests // -------------------------------------------------------------- var quests = character.Quests.GetIncompleteList(); packet.PutInt(quests.Count); foreach (var quest in quests) packet.AddQuest(quest); // Char // -------------------------------------------------------------- packet.PutByte(0); // NaoDress (0:normal, 12:??, 13:??) packet.PutLong(character.CreationTime); packet.PutLong(character.LastRebirth); packet.PutString(""); packet.PutByte(0); packet.PutByte(2); // [150100] Pocket ExpireTime List // Apperantly a list of "pockets"?, incl expiration time. // Ends with a long 0? // -------------------------------------------------------------- { // Style packet.PutLong(DateTime.Now.AddMonths(1)); packet.PutShort(72); // ? packet.PutLong(0); packet.PutShort(73); packet.PutLong(0); } return packet; }