public static Packet AddCreatureInfo(this Packet packet, Creature creature, CreaturePacketType type)
{
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.RaceId);
packet.PutByte(creature.SkinColor);
packet.PutShort(creature.EyeType); // [180600, NA187 (25.06.2014)] Changed from byte to short
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(Convert.ToInt32(creature.IsInBattleStance));
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.TotalLevel - creature.Level);
packet.PutShort(0); // Max Level (reached ever?)
packet.PutShort((short)creature.RebirthCount);
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((short)creature.AttackMinBase);
packet.PutShort((short)creature.AttackMinMod);
packet.PutShort((short)creature.AttackMaxBase);
packet.PutShort((short)creature.AttackMaxMod);
packet.PutShort((short)creature.InjuryMinBase);
packet.PutShort((short)creature.InjuryMinMod);
packet.PutShort((short)creature.InjuryMaxBase);
packet.PutShort((short)creature.InjuryMaxMod);
packet.PutShort((short)creature.LeftAttackMinMod);
packet.PutShort((short)creature.LeftAttackMaxMod);
packet.PutShort((short)creature.RightAttackMinMod);
packet.PutShort((short)creature.RightAttackMaxMod);
packet.PutShort((short)creature.LeftInjuryMinMod);
packet.PutShort((short)creature.LeftInjuryMaxMod);
packet.PutShort((short)creature.RightInjuryMinMod);
packet.PutShort((short)creature.RightInjuryMaxMod);
packet.PutFloat(creature.LeftCriticalMod);
packet.PutFloat(creature.RightCriticalMod);
packet.PutShort((short)creature.LeftBalanceMod);
packet.PutShort((short)creature.RightBalanceMod);
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(creature.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((short)creature.BalanceBase);
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.InjuryMinBaseMod);
packet.PutShort((short)creature.InjuryMaxBaseMod);
packet.PutFloat(creature.CriticalBaseMod);
packet.PutFloat(creature.ProtectionBaseMod);
packet.PutShort((short)creature.DefenseBaseMod);
packet.PutShort((short)creature.BalanceBaseMod);
// In some tests the damage display would be messed up if
// those two weren't set to something.
// In recent tests they were simply added to the min/max dmg,
// purpose unknown.
packet.PutShort(0); // MeleeAttackMinBaseMod (8 / 3)
packet.PutShort(0); // MeleeAttackMaxBaseMod (18 / 4)
packet.PutShort(0); // MeleeInjuryMinBaseMod
packet.PutShort(0); // MeleeInjuryMaxBaseMod
packet.PutShort(0); // RangeAttackMinBaseMod (10)
packet.PutShort(0); // RangeAttackMaxBaseMod (25)
packet.PutShort(0); // RangeInjuryMinBaseMod
packet.PutShort(0); // RangeInjuryMaxBaseMod
// [180100] Guns
{
packet.PutShort(0); // DualgunAttackMinBaseMod
packet.PutShort(0); // DualgunAttackMaxBaseMod
packet.PutShort(0); // DualgunInjuryMinBaseMod
packet.PutShort(0); // DualgunInjuryMaxBaseMod
}
// [180800, NA189 (23.07.2014)] Ninja?
{
packet.PutShort(0); // ? AttackMinBaseMod
packet.PutShort(0); // ? AttackMaxBaseMod
packet.PutShort(0); // ? InjuryMinBaseMod
packet.PutShort(0); // ? InjuryMaxBaseMod
}
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(creature.LastTown);
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
// [180800, NA196 (14.10.2014)] ?
{
packet.PutByte(0);
packet.PutByte(0);
}
// [190200, NA203 (22.04.2015)] ?
{
packet.PutByte(0);
}
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);
// [180800, NA196 (14.10.2014)] ?
{
packet.PutShort(0);
}
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 = creature.Titles.GetList();
packet.PutShort((short)titles.Count);
foreach (var title in titles)
{
packet.PutUShort(title.Key);
packet.PutByte((byte)title.Value);
packet.PutLong(0); // [190100, NA200 (2014-01-15)] Changed from Int to Long
}
}
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.GetAllEquipment();
packet.PutInt(items.Length);
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.GetItems();
packet.PutInt(items.Length);
foreach (var item in items)
packet.AddItemInfo(item, ItemPacketType.Private);
}
else if (type == CreaturePacketType.Public)
{
var items = creature.Inventory.GetAllEquipment();
packet.PutInt(items.Length);
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 = creature.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
// Wrong?
//packet.PutInt(0); // SkillSyncList
// loop
// packet.PutShort
// packet.PutShort
// Not 100% sure what this is, Yiting added the above years
// ago, now it looks like this is a list of skill bins.
// The skills listed seem to be skills of type "7",
// which seem to be skills that have their Start/Stop
// packets being broadcasted.
// It's possible that it was two shorts originally,
// the skill id + the flags. [exec]
var skills = creature.Skills.GetList(s => s.Data.Type == SkillType.BroadcastStartStop);
packet.PutInt(skills.Count);
foreach (var skill in skills)
packet.PutBin(skill.Info);
}
// [150100] ?
{
packet.PutByte(0); // {PLGCNT}
}
// [190200, NA203 (24.04.2015)] ?
{
packet.PutInt(0);
}
// Party
// --------------------------------------------------------------
if (creature.IsInParty)
{
packet.PutByte(creature.Party.IsOpen && creature.Party.Leader == creature);
packet.PutString(creature.Party.ToString());
}
else
{
packet.PutByte(0);
packet.PutString("");
}
// PvP
// --------------------------------------------------------------
packet.AddPvPInfo(creature);
// [180800, NA196 (14.10.2014)] ?
{
packet.PutByte(0);
}
// 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
var records = creature.Quests.GetPtjTrackRecords();
packet.PutInt(records.Length);
foreach (var record in records)
{
packet.PutShort((short)record.Type);
packet.PutShort((short)record.Done);
packet.PutShort((short)record.Success);
}
}
// 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 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?
}
// [190100, NA198 (11.12.2014)] ?
// --------------------------------------------------------------
{
packet.PutInt(0);
}
// [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, except for something at the very end)
// --------------------------------------------------------------
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 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);
}
}
if (type == CreaturePacketType.Private)
{
// 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
// --------------------------------------------------------------
// [180600, NA187 (25.06.2014)] ?
{
packet.PutByte(0);
}
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);
}
// [180800, NA196 (14.10.2014)] ?
{
packet.PutByte(0);
}
packet.PutInt(0);
packet.PutByte(0);
packet.PutInt(0);
packet.PutInt(0);
packet.PutInt(0);
// Quests
// --------------------------------------------------------------
var quests = creature.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(creature.CreationTime);
packet.PutLong(creature.LastRebirth);
packet.PutString("");
packet.PutByte(0); // "true" makes character lie on floor?
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);
}
}
// [190200, NA215 (18.11.2015)] Chat Sticker
{
var stickerId = 0;
var end = DateTime.MinValue;
if (creature.Vars.Perm["ChatStickerId"] != null)
{
stickerId = creature.Vars.Perm["ChatStickerId"];
end = creature.Vars.Perm["ChatStickerEnd"];
}
packet.PutInt((int)stickerId);
packet.PutLong(end);
}
return packet;
}