using Server.MirEnvir; using S = ServerPackets; namespace Server.MirDatabase { public class MagicInfo { protected static Envir Envir { get { return Envir.Main; } } public string Name; public Spell Spell; public byte BaseCost, LevelCost, Icon; public byte Level1, Level2, Level3; public ushort Need1, Need2, Need3; public uint DelayBase = 1800, DelayReduction; public ushort PowerBase, PowerBonus; public ushort MPowerBase, MPowerBonus; public float MultiplierBase = 1.0f, MultiplierBonus; public byte Range = 9; public override string ToString() { return Name; } public MagicInfo() { } public MagicInfo (BinaryReader reader, int version = int.MaxValue, int Customversion = int.MaxValue) { Name = reader.ReadString(); Spell = (Spell)reader.ReadByte(); BaseCost = reader.ReadByte(); LevelCost = reader.ReadByte(); Icon = reader.ReadByte(); Level1 = reader.ReadByte(); Level2 = reader.ReadByte(); Level3 = reader.ReadByte(); Need1 = reader.ReadUInt16(); Need2 = reader.ReadUInt16(); Need3 = reader.ReadUInt16(); DelayBase = reader.ReadUInt32(); DelayReduction = reader.ReadUInt32(); PowerBase = reader.ReadUInt16(); PowerBonus = reader.ReadUInt16(); MPowerBase = reader.ReadUInt16(); MPowerBonus = reader.ReadUInt16(); if (version > 66) Range = reader.ReadByte(); if (version > 70) { MultiplierBase = reader.ReadSingle(); MultiplierBonus = reader.ReadSingle(); } } public void Save(BinaryWriter writer) { writer.Write(Name); writer.Write((byte)Spell); writer.Write(BaseCost); writer.Write(LevelCost); writer.Write(Icon); writer.Write(Level1); writer.Write(Level2); writer.Write(Level3); writer.Write(Need1); writer.Write(Need2); writer.Write(Need3); writer.Write(DelayBase); writer.Write(DelayReduction); writer.Write(PowerBase); writer.Write(PowerBonus); writer.Write(MPowerBase); writer.Write(MPowerBonus); writer.Write(Range); writer.Write(MultiplierBase); writer.Write(MultiplierBonus); } } public class UserMagic { protected static Envir Envir { get { return Envir.Main; } } public Spell Spell; public MagicInfo Info; public byte Level, Key; public ushort Experience; public bool IsTempSpell; public long CastTime; private MagicInfo GetMagicInfo(Spell spell) { for (int i = 0; i < Envir.MagicInfoList.Count; i++) { MagicInfo info = Envir.MagicInfoList[i]; if (info.Spell != spell) continue; return info; } return null; } public UserMagic(Spell spell) { Spell = spell; Info = GetMagicInfo(Spell); } public UserMagic(BinaryReader reader, int version, int customVersion) { Spell = (Spell) reader.ReadByte(); Info = GetMagicInfo(Spell); Level = reader.ReadByte(); Key = reader.ReadByte(); Experience = reader.ReadUInt16(); if (version < 15) return; IsTempSpell = reader.ReadBoolean(); if (version < 65) return; CastTime = reader.ReadInt64(); } public void Save(BinaryWriter writer) { writer.Write((byte) Spell); writer.Write(Level); writer.Write(Key); writer.Write(Experience); writer.Write(IsTempSpell); writer.Write(CastTime); } public Packet GetInfo(bool hero) { return new S.NewMagic { Magic = CreateClientMagic(), Hero = hero }; } public ClientMagic CreateClientMagic() { return new ClientMagic { Name = Info.Name, Spell = Spell, BaseCost = Info.BaseCost, LevelCost = Info.LevelCost, Icon = Info.Icon, Level1 = Info.Level1, Level2 = Info.Level2, Level3 = Info.Level3, Need1 = Info.Need1, Need2 = Info.Need2, Need3 = Info.Need3, Level = Level, Key = Key, Experience = Experience, IsTempSpell = IsTempSpell, Delay = GetDelay(), Range = Info.Range, CastTime = CastTime - Envir.Time }; } public int GetDamage(int DamageBase) { return (int)((DamageBase + GetPower()) * GetMultiplier()); } public float GetMultiplier() { return (Info.MultiplierBase + (Level * Info.MultiplierBonus)); } public int GetPower() { return (int)Math.Round((MPower() / 4F) * (Level + 1) + DefPower()); } public int MPower() { if (Info.MPowerBonus > 0) { return Envir.Random.Next(Info.MPowerBase, Info.MPowerBonus + Info.MPowerBase); } else return Info.MPowerBase; } public int DefPower() { if (Info.PowerBonus > 0) { return Envir.Random.Next(Info.PowerBase, Info.PowerBonus + Info.PowerBase); } else return Info.PowerBase; } public int GetPower(int power) { return (int)Math.Round(power / 4F * (Level + 1) + DefPower()); } public long GetDelay() { return Info.DelayBase - (Level * Info.DelayReduction); } } }