public void SendStatistics(StatUpdateFlags flags) { if (Player.CanWalkThroughWalls || Player.CanWalkThroughUnits) { flags |= StatUpdateFlags.GameMasterA; } else { flags |= StatUpdateFlags.Swimming; } var p = new ServerPacket(0x08); p.WriteByte((byte)flags); if ((flags & StatUpdateFlags.Primary) == StatUpdateFlags.Primary) { p.Write(new byte[] { 1, 0, 0 }); p.WriteByte((byte)Player.Level); p.WriteByte(0x00); p.WriteByte((byte)Player.Ability); p.WriteUInt32(Player.MaximumHP); p.WriteUInt32(Player.MaximumMP); p.WriteUInt16(Player.Str); p.WriteUInt16(Player.Int); p.WriteUInt16(Player.Wis); p.WriteUInt16(Player.Con); p.WriteUInt16(Player.Dex); p.WriteByte(Player.AvailableStatPoints > 0); p.WriteByte((byte)Player.AvailableStatPoints); p.WriteUInt16((ushort)Player.MaximumWeight); p.WriteUInt16((ushort)Player.CurrentWeight); p.WriteUInt32(uint.MinValue); } if ((flags & StatUpdateFlags.Current) == StatUpdateFlags.Current) { p.WriteUInt32((uint)Player.CurrentHP); p.WriteUInt32((uint)Player.CurrentMP); } if ((flags & StatUpdateFlags.Experience) == StatUpdateFlags.Experience) { p.WriteUInt32((uint)Player.Experience); p.WriteUInt32((uint)(Player.ToNextLevel - Player.Experience)); p.WriteUInt32((uint)(Player.ToNextLevel - Player.ToThisLevel)); p.WriteUInt32((uint)Player.AbilityExp); p.WriteUInt32((uint)(Player.ToNextAbility - Player.AbilityExp)); p.WriteUInt32((uint)(Player.ToNextAbility - Player.ToThisAbility)); p.WriteUInt32((uint)Player.GamePoints); p.WriteUInt32((uint)Player.Gold); } if ((flags & StatUpdateFlags.Secondary) == StatUpdateFlags.Secondary) { p.WriteUInt32(uint.MinValue); p.WriteUInt16(ushort.MinValue); p.WriteByte((byte)Player.OffenseElement); p.WriteByte((byte)Player.DefenseElement); p.WriteByte((byte)(Player.MagicResistance / 10)); p.WriteByte(byte.MinValue); p.WriteSByte(Player.ArmorClass); p.WriteSByte(Player.Dmg); p.WriteSByte(Player.Hit); } Enqueue(p); }