public static void AddPlayerStats(PacketWriter packet, Character chr) { packet.WriteInt(chr.mID); packet.WriteStringPad(chr.mName, 0, 13); packet.WriteByte(chr.mGender); packet.WriteByte(chr.mSkin); packet.WriteInt(chr.mFace); packet.WriteInt(chr.mHair); for (int i = 0; i < 3; ++i) packet.WriteLong(0); // pet serial numbers packet.WriteByte(chr.mPrimaryStats.Level); packet.WriteShort(chr.mPrimaryStats.Job); packet.WriteShort(chr.mPrimaryStats.Str); packet.WriteShort(chr.mPrimaryStats.Dex); packet.WriteShort(chr.mPrimaryStats.Int); packet.WriteShort(chr.mPrimaryStats.Luk); packet.WriteInt(chr.mPrimaryStats.HP); packet.WriteInt(chr.mPrimaryStats.MaxHP); packet.WriteInt(chr.mPrimaryStats.MP); packet.WriteInt(chr.mPrimaryStats.MaxMP); packet.WriteShort(chr.mPrimaryStats.AP); if (Tools.is_extendsp_job(chr.mPrimaryStats.Job)) { int length = 0; for (int i = 0; i < chr.mPrimaryStats.SP.Length; ++i) if (chr.mPrimaryStats.SP[i] > 0) length++; packet.WriteByte(length); for (int i = 0; i < chr.mPrimaryStats.SP.Length; ++i) if (chr.mPrimaryStats.SP[i] > 0) { packet.WriteByte(i + 1); packet.WriteByte(chr.mPrimaryStats.SP[i]); } } else { packet.WriteShort(chr.mPrimaryStats.SP[0]); } packet.WriteInt(chr.mPrimaryStats.EXP); packet.WriteInt(chr.mPrimaryStats.Fame); packet.WriteInt(0); // gacha exp according to other sources packet.WriteInt(chr.mMap); packet.WriteByte(chr.mMapPosition); packet.WriteInt(0); // time played in seconds according to other sources if (chr.mPrimaryStats.Job >= 430 && chr.mPrimaryStats.Job <= 434) // dual blade packet.WriteShort(1); else if (chr.mPrimaryStats.Job >= 530 && chr.mPrimaryStats.Job <= 532) // cannoneer packet.WriteShort(2); else packet.WriteShort(0); if (chr.mPrimaryStats.Job >= 3001 && chr.mPrimaryStats.Job <= 3112) // demon slayer packet.WriteInt(chr.mPrimaryStats.DemonSlayerAccessory); packet.WriteByte(chr.mPrimaryStats.Fatigue); packet.WriteInt(0); // time (year month day 00) 8 digets packet.WriteInt(chr.mTraits.Ambition); packet.WriteInt(chr.mTraits.Insight); packet.WriteInt(chr.mTraits.Willpower); packet.WriteInt(chr.mTraits.Diligence); packet.WriteInt(chr.mTraits.Empathy); packet.WriteInt(chr.mTraits.Charm); packet.WriteShort(chr.mTraits.AmbitionGained); packet.WriteShort(chr.mTraits.InsightGained); packet.WriteShort(chr.mTraits.WillpowerGained); packet.WriteShort(chr.mTraits.DiligenceGained); packet.WriteShort(chr.mTraits.EmpathyGained); packet.WriteShort(chr.mTraits.CharmGained); packet.WriteInt(chr.mPrimaryStats.BattleEXP); packet.WriteByte(chr.mPrimaryStats.BattleRank); packet.WriteInt(chr.mPrimaryStats.BattlePoints); packet.WriteByte(5); packet.WriteInt(0); // could always just write a buffer of 8, but oh well lol packet.WriteInt((int)(DateTime.Now.ToFileTime() >> 32)); // FileTime.dwHighDateTime packet.WriteInt((int)(DateTime.Now.ToFileTime() << 32 >> 32)); // FileTime.dwLowDateTime }