using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using DFEngine.Content.Game;
using DFEngine.Content.GameObjects;
using DFEngine.Content.Items;
using DFEngine.Network;
using DFEngine.Server;
namespace DFEngine
{
///
/// Class that extends the class,
/// allowing us to declare additional methods to help us.
///
public static class MessageExtensions
{
///
/// Writes the world's information to the message.
///
public static void Write(this NetworkMessage message, World world)
{
message.Write(world.Number);
message.Write(world.Name, 16);
message.Write(world.Status);
}
///
/// Writes a list of worlds to the message.
///
public static void Write(this NetworkMessage message, List worlds)
{
foreach (var world in worlds.OrderBy(world => world.Number))
{
message.Write(world);
}
}
///
/// Writes the character shape to the message.
///
public static void Write(this NetworkMessage message, CharacterShape shape)
{
message.Write((byte)(shape.Race | (byte)shape.Class << 2 | (byte)shape.Gender << 7));
message.Write(shape.Hair);
message.Write(shape.HairColor);
message.Write(shape.Face);
}
///
/// Writes an avatar's information to the message.
///
public static void Write(this NetworkMessage message, Avatar avatar)
{
message.Write(avatar.CharNo);
message.Write(avatar.Name, 20);
message.Write((ushort)avatar.Level);
message.Write(avatar.Slot);
message.Write(avatar.MapIndx, 12);
message.Write((byte)avatar.DeleteTime.Year);
message.Write((byte)avatar.DeleteTime.Month);
message.Write((byte)avatar.DeleteTime.Day);
message.Write((byte)avatar.DeleteTime.Hour);
message.Write((byte)avatar.DeleteTime.Minute);
message.Write(avatar.Shape);
message.Write(avatar.Equipment);
message.Write(avatar.KQHandle);
message.Write(avatar.KQMapIndx, 12);
message.Write(avatar.KQPosition);
message.Write(avatar.KQDate.ToInt32());
message.Fill(6, 0); // name change data, not used.
message.Write((int)avatar.TutorialState);
message.Write(avatar.TutorialStep);
}
///
/// Writes a list of avatars to the message.
///
public static void Write(this NetworkMessage message, List avatars)
{
avatars.For(message.Write);
}
///
/// Writes a character's equipment to a message.
///
public static void Write(this NetworkMessage message, Equipment equipment)
{
message.Write(equipment[ItemEquip.ITEMEQUIP_HAT]?.Info.ID ?? ushort.MaxValue);
message.Write(equipment[ItemEquip.ITEMEQUIP_MOUTH]?.Info.ID ?? ushort.MaxValue);
message.Write(equipment[ItemEquip.ITEMEQUIP_RIGHTHAND]?.Info.ID ?? ushort.MaxValue);
message.Write(equipment[ItemEquip.ITEMEQUIP_BODY]?.Info.ID ?? ushort.MaxValue);
message.Write(equipment[ItemEquip.ITEMEQUIP_LEFTHAND]?.Info.ID ?? ushort.MaxValue);
message.Write(equipment[ItemEquip.ITEMEQUIP_LEG]?.Info.ID ?? ushort.MaxValue);
message.Write(equipment[ItemEquip.ITEMEQUIP_SHOES]?.Info.ID ?? ushort.MaxValue);
message.Write(equipment[ItemEquip.ITEMEQUIP_SHOESACC]?.Info.ID ?? ushort.MaxValue);
message.Write(equipment[ItemEquip.ITEMEQUIP_LEGACC]?.Info.ID ?? ushort.MaxValue);
message.Write(equipment[ItemEquip.ITEMEQUIP_BODYACC]?.Info.ID ?? ushort.MaxValue);
message.Write(equipment[ItemEquip.ITEMEQUIP_HATACC]?.Info.ID ?? ushort.MaxValue);
message.Write(equipment[ItemEquip.ITEMEQUIP_SHOULDER_B]?.Info.ID ?? ushort.MaxValue);
message.Write(equipment[ItemEquip.ITEMEQUIP_EYE]?.Info.ID ?? ushort.MaxValue);
message.Write(equipment[ItemEquip.ITEMEQUIP_LEFTHANDACC]?.Info.ID ?? ushort.MaxValue);
message.Write(equipment[ItemEquip.ITEMEQUIP_RIGHTHANDACC]?.Info.ID ?? ushort.MaxValue);
message.Write(equipment[ItemEquip.ITEMEQUIP_BACK]?.Info.ID ?? ushort.MaxValue);
message.Write(equipment[ItemEquip.ITEMEQUIP_BELT]?.Info.ID ?? ushort.MaxValue);
message.Write(equipment[ItemEquip.ITEMEQUIP_TAIL]?.Info.ID ?? ushort.MaxValue);
message.Write(equipment[ItemEquip.ITEMEQUIP_MINIMON]?.Info.ID ?? ushort.MaxValue);
message.Write(equipment[ItemEquip.ITEMEQUIP_SHIELDACC]?.Info.ID ?? ushort.MaxValue);
message.Write((byte)(((equipment[ItemEquip.ITEMEQUIP_RIGHTHAND]?.Upgrades ?? 0) << 4) | (equipment[ItemEquip.ITEMEQUIP_LEFTHAND]?.Upgrades ?? 0)));
message.Fill(2, 0);
}
///
/// Writes a vector to the message.
///
public static void Write(this NetworkMessage message, Vector2 vector)
{
message.Write((int)(vector?.X ?? 0));
message.Write((int)(vector?.Y ?? 0));
}
public static void WriteParameters(this NetworkMessage message, Character character)
{
message.Write(Character.Global.GetNextEXP(character.Level - 1));
message.Write(Character.Global.GetNextEXP(character.Level));
message.Write(character.Stats.BaseSTR);
message.Write(character.Stats.CurrentSTR);
message.Write(character.Stats.BaseEND);
message.Write(character.Stats.CurrentEND);
message.Write(character.Stats.BaseDEX);
message.Write(character.Stats.CurrentDEX);
message.Write(character.Stats.BaseINT);
message.Write(character.Stats.CurrentINT);
message.Write(0); // BaseWIZ
message.Write(0); // BonusWIZ
message.Write(character.Stats.BaseSPR);
message.Write(character.Stats.CurrentSPR);
message.Write(character.Stats.BaseMinDmg);
message.Write(character.Stats.CurrentMinDmg);
message.Write(character.Stats.BaseMaxDmg);
message.Write(character.Stats.CurrentMaxDmg);
message.Write(character.Stats.BaseDef);
message.Write(character.Stats.CurrentDef);
message.Write(character.Stats.BaseAim);
message.Write(character.Stats.CurrentAim);
message.Write(character.Stats.BaseEvasion);
message.Write(character.Stats.CurrentEvasion);
message.Write(character.Stats.BaseMinMDmg);
message.Write(character.Stats.CurrentMinMDmg);
message.Write(character.Stats.BaseMaxMDmg);
message.Write(character.Stats.CurrentMaxMDmg);
message.Write(character.Stats.BaseMDef);
message.Write(character.Stats.CurrentMDef);
message.Write(0); // BaseMH
message.Write(0); // BonusMH
message.Write(0); // BaseMB
message.Write(0); // BonusMB
message.Write(character.Stats.CurrentMaxHP);
message.Write(character.Stats.CurrentMaxSP);
message.Write(character.Shape.BaseClass == CharacterClass.CC_CRUSADER ? character.Stats.CurrentMaxLP : 0);
message.Write(0);
message.Write(character.Stats.CurrentMaxHPStones);
message.Write(character.Stats.CurrentMaxSPStones);
message.Fill(16, 0); //PwrStone
message.Fill(16, 0); //GrdStone
message.Write(character.Stats.BaseIllnessResistance);
message.Write(character.Stats.CurrentIllnessResistance);
message.Write(character.Stats.BaseDiseaseResistance);
message.Write(character.Stats.CurrentDiseaseResistance);
message.Write(character.Stats.BaseCurseResistance);
message.Write(character.Stats.CurrentCurseResistance);
message.Write(character.Stats.BaseStunResistance);
message.Write(character.Stats.CurrentStunResistance);
message.Write((int) character.Position.X);
message.Write((int) character.Position.Y);
}
}
}