public static List <UserMagic> loadByUserid(int userid) { List <UserMagic> list = new List <UserMagic>(); DbDataReader read = MirRunDB.ExecuteReader("select * from UserMagic where userid=@userid", new SQLiteParameter("userid", userid)); while (read.Read()) { if (read.IsDBNull(read.GetOrdinal("Spell"))) { continue; } UserMagic magic = new UserMagic((Spell)read.GetByte(read.GetOrdinal("Spell"))); magic.userid = userid; magic.Level = read.GetByte(read.GetOrdinal("Level")); magic.Key = read.GetByte(read.GetOrdinal("Key")); magic.Experience = (ushort)read.GetInt32(read.GetOrdinal("Experience")); magic.CastTime = read.GetInt64(read.GetOrdinal("CastTime")); magic.IsTempSpell = read.GetBoolean(read.GetOrdinal("IsTempSpell")); list.Add(magic); } return(list); }
public void SpecialArrowShot(MapObject target, UserMagic magic) { if (target == null || !target.IsAttackTarget(this)) return; if ((Info.MentalState != 1) && !CanFly(target.CurrentLocation)) return; int distance = Functions.MaxDistance(CurrentLocation, target.CurrentLocation); int damage = (GetAttackPower(MinMC, MaxMC) + magic.GetPower()); if (magic.Spell != Spell.CrippleShot) damage = (int)(damage * Math.Max(1, (distance * 0.4)));//range boost damage = ApplyArcherState(damage); int delay = distance * 50 + 500; //50 MS per Step DelayedAction action = new DelayedAction(DelayedType.Magic, Envir.Time + delay, magic, damage, target); ActionList.Add(action); }
public void DoKnockback(MapObject target, UserMagic magic)//ElementalShot - knockback { Cell cell = CurrentMap.GetCell(target.CurrentLocation); if (!cell.Valid || cell.Objects == null) return; if (target.CurrentLocation.Y < 0 || target.CurrentLocation.Y >= CurrentMap.Height || target.CurrentLocation.X < 0 || target.CurrentLocation.X >= CurrentMap.Height) return; if (target.Race != ObjectType.Monster && target.Race != ObjectType.Player) return; if (!target.IsAttackTarget(this) || target.Level >= Level) return; if (Envir.Random.Next(20) >= 6 + magic.Level * 3 + ElementsLevel + Level - target.Level) return; int distance = 1 + Math.Max(0, magic.Level - 1) + Envir.Random.Next(2); MirDirection dir = Functions.DirectionFromPoint(CurrentLocation, target.CurrentLocation); target.Pushed(this, dir, distance); }
private bool DelayedExplosion(MapObject target, UserMagic magic) { if (target == null || !target.IsAttackTarget(this) || !CanFly(target.CurrentLocation)) return false; int power = GetAttackPower(MinMC, MaxMC) + magic.GetPower(); int delay = Functions.MaxDistance(CurrentLocation, target.CurrentLocation) * 50 + 500; //50 MS per Step DelayedAction action = new DelayedAction(DelayedType.Magic, Envir.Time + delay, magic, power, target); ActionList.Add(action); return true; }
private bool DoubleShot(MapObject target, UserMagic magic) { if (target == null || !target.IsAttackTarget(this)) return false; if ((Info.MentalState != 1) && !CanFly(target.CurrentLocation)) return false; int distance = Functions.MaxDistance(CurrentLocation, target.CurrentLocation); int damage = (GetAttackPower(MinMC, MaxMC) + magic.GetPower()); damage = (int)(damage * Math.Max(1, (distance * 0.25)));//range boost damage = ApplyArcherState(damage); int delay = distance * 50 + 500; //50 MS per Step DelayedAction action = new DelayedAction(DelayedType.Magic, Envir.Time + delay, magic, damage, target); ActionList.Add(action); action = new DelayedAction(DelayedType.Magic, Envir.Time + delay + 50, magic, damage, target); ActionList.Add(action); return true; }
private void CrescentSlash(UserMagic magic) { int criticalDamage = Envir.Random.Next(0, 100) <= Accuracy ? MaxDC * 2 : MinDC * 2; //int damage = (MinDC / 5 + 4 * (magic.Level + Level / 20)) * criticalDamage / 20 + MaxDC; int damage = (MinDC / 5 + 4 * (magic.Level + Level / 20)) + criticalDamage / 20 + MaxDC; MirDirection backDir = Functions.ReverseDirection(Direction); MirDirection preBackDir = Functions.PreviousDir(backDir); MirDirection nextBackDir = Functions.NextDir(backDir); for (int i = 0; i < 8; i++) { MirDirection dir = (MirDirection)i; Point hitPoint = Functions.PointMove(CurrentLocation, dir, 1); if (dir != backDir && dir != preBackDir && dir != nextBackDir) { if (!CurrentMap.ValidPoint(hitPoint)) continue; Cell cell = CurrentMap.GetCell(hitPoint); if (cell.Objects == null) continue; for (int j = 0; j < cell.Objects.Count; j++) { MapObject target = cell.Objects[j]; switch (target.Race) { case ObjectType.Monster: case ObjectType.Player: //Only targets if (target.IsAttackTarget(this)) { DelayedAction action = new DelayedAction(DelayedType.Damage, Envir.Time + AttackSpeed, target, damage, DefenceType.AC, true); ActionList.Add(action); } break; } } LevelMagic(magic); } } }
private bool PoisonSword(UserMagic magic) { UserItem item = GetPoison(1); if (item == null) return false; Point hitPoint; Cell cell; MirDirection dir = Functions.PreviousDir(Direction); int power = GetAttackPower(MinDC, MaxDC) + magic.GetPower(); for (int i = 0; i < 5; i++) { hitPoint = Functions.PointMove(CurrentLocation, dir, 1); dir = Functions.NextDir(dir); if (!CurrentMap.ValidPoint(hitPoint)) continue; cell = CurrentMap.GetCell(hitPoint); if (cell.Objects == null) continue; for (int o = 0; o < cell.Objects.Count; o++) { MapObject target = cell.Objects[o]; if (target.Race != ObjectType.Player && target.Race != ObjectType.Monster) continue; if (target == null || !target.IsAttackTarget(this) || target.Node == null) continue; target.ApplyPoison(new Poison { Duration = 3 + power / 10 + magic.Level * 3, Owner = this, PType = PoisonType.Green, TickSpeed = 1000, Value = power / 10 + magic.Level + 1 + Envir.Random.Next(PoisonAttack) }, this); target.OperateTime = 0; break; } } LevelMagic(magic); ConsumeItem(item, 1); return true; }
public CharacterInfo(BinaryReader reader) { Index = reader.ReadInt32(); Name = reader.ReadString(); Level = reader.ReadByte(); Class = (MirClass) reader.ReadByte(); Gender = (MirGender) reader.ReadByte(); Hair = reader.ReadByte(); CreationIP = reader.ReadString(); CreationDate = DateTime.FromBinary(reader.ReadInt64()); Banned = reader.ReadBoolean(); BanReason = reader.ReadString(); ExpiryDate = DateTime.FromBinary(reader.ReadInt64()); LastIP = reader.ReadString(); LastDate = DateTime.FromBinary(reader.ReadInt64()); Deleted = reader.ReadBoolean(); DeleteDate = DateTime.FromBinary(reader.ReadInt64()); CurrentMapIndex = reader.ReadInt32(); CurrentLocation = new Point(reader.ReadInt32(), reader.ReadInt32()); Direction = (MirDirection)reader.ReadByte(); BindMapIndex = reader.ReadInt32(); BindLocation = new Point(reader.ReadInt32(), reader.ReadInt32()); HP = reader.ReadUInt16(); MP = reader.ReadUInt16(); Experience = reader.ReadInt64(); AMode = (AttackMode) reader.ReadByte(); PMode = (PetMode) reader.ReadByte(); if (Envir.LoadVersion > 34) { PKPoints = reader.ReadInt32(); } int count = reader.ReadInt32(); Array.Resize(ref Inventory, count); for (int i = 0; i < count; i++) { if (!reader.ReadBoolean()) continue; UserItem item = new UserItem(reader, Envir.LoadVersion, Envir.LoadCustomVersion); if (SMain.Envir.BindItem(item) && i < Inventory.Length) Inventory[i] = item; } count = reader.ReadInt32(); for (int i = 0; i < count; i++) { if (!reader.ReadBoolean()) continue; UserItem item = new UserItem(reader, Envir.LoadVersion, Envir.LoadCustomVersion); if (SMain.Envir.BindItem(item) && i < Equipment.Length) Equipment[i] = item; } count = reader.ReadInt32(); for (int i = 0; i < count; i++) { if (!reader.ReadBoolean()) continue; UserItem item = new UserItem(reader, Envir.LoadVersion, Envir.LoadCustomVersion); if (SMain.Envir.BindItem(item) && i < QuestInventory.Length) QuestInventory[i] = item; } count = reader.ReadInt32(); for (int i = 0; i < count; i++) { UserMagic magic = new UserMagic(reader); if (magic.Info == null) continue; Magics.Add(magic); } if (Envir.LoadVersion < 2) return; Thrusting = reader.ReadBoolean(); HalfMoon = reader.ReadBoolean(); CrossHalfMoon = reader.ReadBoolean(); DoubleSlash = reader.ReadBoolean(); if(Envir.LoadVersion > 46) { MentalState = reader.ReadByte(); } if (Envir.LoadVersion < 4) return; count = reader.ReadInt32(); for (int i = 0; i < count; i++) Pets.Add(new PetInfo(reader)); if (Envir.LoadVersion < 5) return; AllowGroup = reader.ReadBoolean(); if (Envir.LoadVersion < 12) return; if (Envir.LoadVersion == 12) count = reader.ReadInt32(); for (int i = 0; i < Globals.FlagIndexCount; i++) Flags[i] = reader.ReadBoolean(); if (Envir.LoadVersion > 27) GuildIndex = reader.ReadInt32(); if (Envir.LoadVersion > 30) AllowTrade = reader.ReadBoolean(); if (Envir.LoadVersion > 33) { count = reader.ReadInt32(); for (int i = 0; i < count; i++) { QuestProgressInfo quest = new QuestProgressInfo(reader); if (SMain.Envir.BindQuest(quest)) CurrentQuests.Add(quest); } } if(Envir.LoadVersion > 42) { count = reader.ReadInt32(); for (int i = 0; i < count; i++) { Buff buff = new Buff(reader); if (Envir.LoadVersion == 51) { buff.Caster = SMain.Envir.GetObject(reader.ReadUInt32()); } Buffs.Add(buff); } } if(Envir.LoadVersion > 43) { count = reader.ReadInt32(); for (int i = 0; i < count; i++) Mail.Add(new MailInfo(reader, Envir.LoadVersion, Envir.LoadCustomVersion)); } //IntelligentCreature if (Envir.LoadVersion > 44) { count = reader.ReadInt32(); for (int i = 0; i < count; i++) { UserIntelligentCreature creature = new UserIntelligentCreature(reader); if (creature.Info == null) continue; IntelligentCreatures.Add(creature); } if (Envir.LoadVersion == 45) { var old1 = (IntelligentCreatureType)reader.ReadByte(); var old2 = reader.ReadBoolean(); } PearlCount = reader.ReadInt32(); } if (Envir.LoadVersion > 49) { count = reader.ReadInt32(); for (int i = 0; i < count; i++) CompletedQuests.Add(reader.ReadInt32()); } if (Envir.LoadVersion > 50 && Envir.LoadVersion < 54) { count = reader.ReadInt32(); for (int i = 0; i < count; i++) { Poison poison = new Poison(reader); if (Envir.LoadVersion == 51) { poison.Owner = SMain.Envir.GetObject(reader.ReadUInt32()); } Poisons.Add(poison); } } if (Envir.LoadVersion > 56) { if (reader.ReadBoolean()) CurrentRefine = new UserItem(reader, Envir.LoadVersion, Envir.LoadCustomVersion); if (CurrentRefine != null) SMain.Envir.BindItem(CurrentRefine); CollectTime = reader.ReadInt64(); CollectTime += SMain.Envir.Time; } if (Envir.LoadVersion > 58) { count = reader.ReadInt32(); for (int i = 0; i < count; i++) Friends.Add(new FriendInfo(reader)); } if (Envir.LoadVersion > 59) { Married = reader.ReadInt32(); MarriedDate = DateTime.FromBinary(reader.ReadInt64()); Mentor = reader.ReadInt32(); MentorDate = DateTime.FromBinary(reader.ReadInt64()); isMentor = reader.ReadBoolean(); MentorExp = reader.ReadInt64(); } }
private void PetEnhancer(MapObject target, UserMagic magic, out bool cast) { cast = false; if (target == null || target.Race != ObjectType.Monster || !target.IsFriendlyTarget(this)) return; int duration = GetAttackPower(MinSC, MaxSC) + magic.GetPower(); cast = true; DelayedAction action = new DelayedAction(DelayedType.Magic, Envir.Time + 500, magic, duration, target); ActionList.Add(action); }
private void Curse(UserMagic magic, Point location, out bool cast) { cast = false; UserItem item = GetAmulet(1); if (item == null) return; cast = true; ConsumeItem(item, 1); if (Envir.Random.Next(10 - ((magic.Level + 1) * 2)) > 2) return; int delay = Functions.MaxDistance(CurrentLocation, location) * 50 + 500; //50 MS per Step DelayedAction action = new DelayedAction(DelayedType.Magic, Envir.Time + delay, this, magic, GetAttackPower(MinSC, MaxSC) + (magic.Level + 1) * 5, location, 1 + ((magic.Level + 1) * 2)); CurrentMap.ActionList.Add(action); }
public CharacterInfo(BinaryReader reader) { Index = reader.ReadInt32(); Name = reader.ReadString(); Level = reader.ReadByte(); Class = (MirClass)reader.ReadByte(); Gender = (MirGender)reader.ReadByte(); Hair = reader.ReadByte(); CreationIP = reader.ReadString(); CreationDate = DateTime.FromBinary(reader.ReadInt64()); Banned = reader.ReadBoolean(); BanReason = reader.ReadString(); ExpiryDate = DateTime.FromBinary(reader.ReadInt64()); LastIP = reader.ReadString(); LastDate = DateTime.FromBinary(reader.ReadInt64()); Deleted = reader.ReadBoolean(); DeleteDate = DateTime.FromBinary(reader.ReadInt64()); CurrentMapIndex = reader.ReadInt32(); CurrentLocation = new Point(reader.ReadInt32(), reader.ReadInt32()); Direction = (MirDirection)reader.ReadByte(); BindMapIndex = reader.ReadInt32(); BindLocation = new Point(reader.ReadInt32(), reader.ReadInt32()); HP = reader.ReadUInt16(); MP = reader.ReadUInt16(); Experience = reader.ReadInt64(); AMode = (AttackMode)reader.ReadByte(); PMode = (PetMode)reader.ReadByte(); if (Envir.LoadVersion > 34) { PKPoints = reader.ReadInt32(); } int count = reader.ReadInt32(); Array.Resize(ref Inventory, count); for (int i = 0; i < count; i++) { if (!reader.ReadBoolean()) { continue; } UserItem item = new UserItem(reader, Envir.LoadVersion); if (SMain.Envir.BindItem(item) && i < Inventory.Length) { Inventory[i] = item; } } count = reader.ReadInt32(); for (int i = 0; i < count; i++) { if (!reader.ReadBoolean()) { continue; } UserItem item = new UserItem(reader, Envir.LoadVersion); if (SMain.Envir.BindItem(item) && i < Equipment.Length) { Equipment[i] = item; } } count = reader.ReadInt32(); for (int i = 0; i < count; i++) { if (!reader.ReadBoolean()) { continue; } UserItem item = new UserItem(reader, Envir.LoadVersion); if (SMain.Envir.BindItem(item) && i < QuestInventory.Length) { QuestInventory[i] = item; } } count = reader.ReadInt32(); for (int i = 0; i < count; i++) { UserMagic magic = new UserMagic(reader); if (magic.Info == null) { continue; } Magics.Add(magic); } if (Envir.LoadVersion < 2) { return; } Thrusting = reader.ReadBoolean(); HalfMoon = reader.ReadBoolean(); CrossHalfMoon = reader.ReadBoolean(); DoubleSlash = reader.ReadBoolean(); if (Envir.LoadVersion > 46) { MentalState = reader.ReadByte(); } if (Envir.LoadVersion < 4) { return; } count = reader.ReadInt32(); for (int i = 0; i < count; i++) { Pets.Add(new PetInfo(reader)); } if (Envir.LoadVersion < 5) { return; } AllowGroup = reader.ReadBoolean(); if (Envir.LoadVersion < 12) { return; } if (Envir.LoadVersion == 12) { count = reader.ReadInt32(); } for (int i = 0; i < Globals.FlagIndexCount; i++) { Flags[i] = reader.ReadBoolean(); } if (Envir.LoadVersion > 27) { GuildIndex = reader.ReadInt32(); } if (Envir.LoadVersion > 30) { AllowTrade = reader.ReadBoolean(); } if (Envir.LoadVersion > 33) { count = reader.ReadInt32(); for (int i = 0; i < count; i++) { QuestProgressInfo quest = new QuestProgressInfo(reader); if (SMain.Envir.BindQuest(quest)) { CurrentQuests.Add(quest); } } } if (Envir.LoadVersion > 42) { count = reader.ReadInt32(); for (int i = 0; i < count; i++) { Buff buff = new Buff(reader); if (Envir.LoadVersion == 51) { buff.Caster = SMain.Envir.GetObject(reader.ReadUInt32()); } Buffs.Add(buff); } } if (Envir.LoadVersion > 43) { count = reader.ReadInt32(); for (int i = 0; i < count; i++) { Mail.Add(new MailInfo(reader)); } } //IntelligentCreature if (Envir.LoadVersion > 44) { count = reader.ReadInt32(); for (int i = 0; i < count; i++) { UserIntelligentCreature creature = new UserIntelligentCreature(reader); if (creature.Info == null) { continue; } IntelligentCreatures.Add(creature); } if (Envir.LoadVersion == 45) { var old1 = (IntelligentCreatureType)reader.ReadByte(); var old2 = reader.ReadBoolean(); } PearlCount = reader.ReadInt32(); } if (Envir.LoadVersion > 49) { count = reader.ReadInt32(); for (int i = 0; i < count; i++) { CompletedQuests.Add(reader.ReadInt32()); } } if (Envir.LoadVersion > 50 && Envir.LoadVersion < 54) { count = reader.ReadInt32(); for (int i = 0; i < count; i++) { Poison poison = new Poison(reader); if (Envir.LoadVersion == 51) { poison.Owner = SMain.Envir.GetObject(reader.ReadUInt32()); } Poisons.Add(poison); } } }
public CharacterInfo(BinaryReader reader, int version, int customVersion) { Index = reader.ReadInt32(); Name = reader.ReadString(); if (version < 62) { Level = (ushort)reader.ReadByte(); } else { Level = reader.ReadUInt16(); } Class = (MirClass)reader.ReadByte(); Gender = (MirGender)reader.ReadByte(); Hair = reader.ReadByte(); CreationIP = reader.ReadString(); CreationDate = DateTime.FromBinary(reader.ReadInt64()); Banned = reader.ReadBoolean(); BanReason = reader.ReadString(); ExpiryDate = DateTime.FromBinary(reader.ReadInt64()); LastIP = reader.ReadString(); LastLogoutDate = DateTime.FromBinary(reader.ReadInt64()); if (version > 81) { LastLoginDate = DateTime.FromBinary(reader.ReadInt64()); } Deleted = reader.ReadBoolean(); DeleteDate = DateTime.FromBinary(reader.ReadInt64()); CurrentMapIndex = reader.ReadInt32(); CurrentLocation = new Point(reader.ReadInt32(), reader.ReadInt32()); Direction = (MirDirection)reader.ReadByte(); BindMapIndex = reader.ReadInt32(); BindLocation = new Point(reader.ReadInt32(), reader.ReadInt32()); if (version <= 84) { HP = reader.ReadUInt16(); MP = reader.ReadUInt16(); } else { HP = reader.ReadInt32(); MP = reader.ReadInt32(); } Experience = reader.ReadInt64(); AMode = (AttackMode)reader.ReadByte(); PMode = (PetMode)reader.ReadByte(); if (version > 34) { PKPoints = reader.ReadInt32(); } int count = reader.ReadInt32(); Array.Resize(ref Inventory, count); for (int i = 0; i < count; i++) { if (!reader.ReadBoolean()) { continue; } UserItem item = new UserItem(reader, version, customVersion); if (Envir.BindItem(item) && i < Inventory.Length) { Inventory[i] = item; } } count = reader.ReadInt32(); for (int i = 0; i < count; i++) { if (!reader.ReadBoolean()) { continue; } UserItem item = new UserItem(reader, version, customVersion); if (Envir.BindItem(item) && i < Equipment.Length) { Equipment[i] = item; } } count = reader.ReadInt32(); for (int i = 0; i < count; i++) { if (!reader.ReadBoolean()) { continue; } UserItem item = new UserItem(reader, version, customVersion); if (Envir.BindItem(item) && i < QuestInventory.Length) { QuestInventory[i] = item; } } count = reader.ReadInt32(); for (int i = 0; i < count; i++) { UserMagic magic = new UserMagic(reader, version, customVersion); if (magic.Info == null) { continue; } magic.CastTime = int.MinValue; Magics.Add(magic); } Thrusting = reader.ReadBoolean(); HalfMoon = reader.ReadBoolean(); CrossHalfMoon = reader.ReadBoolean(); DoubleSlash = reader.ReadBoolean(); MentalState = reader.ReadByte(); count = reader.ReadInt32(); for (int i = 0; i < count; i++) { Pets.Add(new PetInfo(reader, version, customVersion)); } AllowGroup = reader.ReadBoolean(); for (int i = 0; i < Globals.FlagIndexCount; i++) { Flags[i] = reader.ReadBoolean(); } GuildIndex = reader.ReadInt32(); AllowTrade = reader.ReadBoolean(); count = reader.ReadInt32(); for (int i = 0; i < count; i++) { QuestProgressInfo quest = new QuestProgressInfo(reader, version, customVersion); if (Envir.BindQuest(quest)) { CurrentQuests.Add(quest); } } count = reader.ReadInt32(); for (int i = 0; i < count; i++) { Buff buff = new Buff(reader, version, customVersion); Buffs.Add(buff); } count = reader.ReadInt32(); for (int i = 0; i < count; i++) { Mail.Add(new MailInfo(reader, version, customVersion)); } count = reader.ReadInt32(); for (int i = 0; i < count; i++) { UserIntelligentCreature creature = new UserIntelligentCreature(reader, version, customVersion); if (creature.Info == null) { continue; } IntelligentCreatures.Add(creature); } if (version == 45) { var old1 = (IntelligentCreatureType)reader.ReadByte(); var old2 = reader.ReadBoolean(); } PearlCount = reader.ReadInt32(); count = reader.ReadInt32(); for (int i = 0; i < count; i++) { CompletedQuests.Add(reader.ReadInt32()); } if (reader.ReadBoolean()) { CurrentRefine = new UserItem(reader, version, customVersion); } if (CurrentRefine != null) { Envir.BindItem(CurrentRefine); } CollectTime = reader.ReadInt64(); CollectTime += Envir.Time; count = reader.ReadInt32(); for (int i = 0; i < count; i++) { Friends.Add(new FriendInfo(reader, version, customVersion)); } if (version > 75) { count = reader.ReadInt32(); for (var i = 0; i < count; i++) { RentedItems.Add(new ItemRentalInformation(reader, version, customVersion)); } HasRentedItem = reader.ReadBoolean(); } Married = reader.ReadInt32(); MarriedDate = DateTime.FromBinary(reader.ReadInt64()); Mentor = reader.ReadInt32(); MentorDate = DateTime.FromBinary(reader.ReadInt64()); IsMentor = reader.ReadBoolean(); MentorExp = reader.ReadInt64(); if (version >= 63) { int logCount = reader.ReadInt32(); for (int i = 0; i < logCount; i++) { GSpurchases.Add(reader.ReadInt32(), reader.ReadInt32()); } } }
public Hero_Info(BinaryReader reader) { Index = reader.ReadInt32(); Deleted = reader.ReadBoolean(); Name = reader.ReadString(); Class = (MirClass)reader.ReadByte(); Gender = (MirGender)reader.ReadByte(); Level = reader.ReadInt32(); CurrentEXP = reader.ReadInt64(); Hair = reader.ReadByte(); CurrentHP = reader.ReadUInt32(); CurrentMP = reader.ReadUInt32(); PlayerIndex = reader.ReadInt32(); int count = reader.ReadInt32(); Array.Resize(ref Inventory, count); for (int i = 0; i < count; i++) { if (!reader.ReadBoolean()) { continue; } UserItem item = new UserItem(reader, Envir.LoadVersion, Envir.LoadCustomVersion); if (MessageQueue.Envir.BindItem(item) && i < Inventory.Length) { Inventory[i] = item; } } count = reader.ReadInt32(); for (int i = 0; i < count; i++) { if (!reader.ReadBoolean()) { continue; } UserItem item = new UserItem(reader, Envir.LoadVersion, Envir.LoadCustomVersion); if (MessageQueue.Envir.BindItem(item) && i < Equipment.Length) { Equipment[i] = item; } } count = reader.ReadInt32(); for (int i = 0; i < count; i++) { if (!reader.ReadBoolean()) { continue; } UserItem item = new UserItem(reader, Envir.LoadVersion, Envir.LoadCustomVersion); if (MessageQueue.Envir.BindItem(item) && i < QuestInventory.Length) { QuestInventory[i] = item; } } count = reader.ReadInt32(); for (int i = 0; i < count; i++) { UserMagic magic = new UserMagic(reader); if (magic.Info == null) { continue; } Magics.Add(magic); } //reset all magic cooldowns on char loading < stops ppl from having none working skills after a server crash for (int i = 0; i < Magics.Count; i++) { Magics[i].CastTime = 0; } count = reader.ReadInt32(); for (int i = 0; i < count; i++) { Buff buff = new Buff(reader); if (Envir.LoadVersion == 51) { buff.Caster = MessageQueue.Envir.GetObject(reader.ReadUInt32()); } Buffs.Add(buff); } }
public override void Load(BinaryReader reader, int version, int customVersion) { Index = reader.ReadInt32(); Name = reader.ReadString(); Level = reader.ReadUInt16(); Class = (MirClass)reader.ReadByte(); Gender = (MirGender)reader.ReadByte(); Hair = reader.ReadByte(); CreationDate = DateTime.FromBinary(reader.ReadInt64()); Deleted = reader.ReadBoolean(); DeleteDate = DateTime.FromBinary(reader.ReadInt64()); HP = reader.ReadInt32(); MP = reader.ReadInt32(); Experience = reader.ReadInt64(); int count = reader.ReadInt32(); Array.Resize(ref Inventory, count); for (int i = 0; i < count; i++) { if (!reader.ReadBoolean()) { continue; } UserItem item = new UserItem(reader, version, customVersion); if (Envir.BindItem(item) && i < Inventory.Length) { Inventory[i] = item; } } count = reader.ReadInt32(); for (int i = 0; i < count; i++) { if (!reader.ReadBoolean()) { continue; } UserItem item = new UserItem(reader, version, customVersion); if (Envir.BindItem(item) && i < Equipment.Length) { Equipment[i] = item; } } count = reader.ReadInt32(); for (int i = 0; i < count; i++) { UserMagic magic = new UserMagic(reader, version, customVersion); if (magic.Info == null) { continue; } magic.CastTime = int.MinValue; Magics.Add(magic); } if (version > 99) { AutoPot = reader.ReadBoolean(); Grade = reader.ReadByte(); HPItemIndex = reader.ReadInt32(); MPItemIndex = reader.ReadInt32(); AutoHPPercent = reader.ReadByte(); AutoMPPercent = reader.ReadByte(); } if (version > 101) { SealCount = reader.ReadUInt16(); } }
public void ArcherSummon(UserMagic magic, MapObject target, Point location) { if (target != null && target.IsAttackTarget(this)) location = target.CurrentLocation; if (!CanFly(location)) return; uint duration = (uint)((magic.Level * 5 + 10) * 1000); int value = (int)duration; int delay = Functions.MaxDistance(CurrentLocation, location) * 50 + 500; //50 MS per Step DelayedAction action = new DelayedAction(DelayedType.Magic, Envir.Time + delay, magic, value, location, target); ActionList.Add(action); }
private void Portal(UserMagic magic, Point location, out bool cast) { cast = false; if (!CurrentMap.ValidPoint(location)) return; if (PortalObjectsArray[1] != null && PortalObjectsArray[1].Node != null) { PortalObjectsArray[0].ExpireTime = 0; PortalObjectsArray[0].Process(); } if (!CanFly(location)) return; int duration = 30 + (magic.Level * 30); int value = duration; DelayedAction action = new DelayedAction(DelayedType.Magic, Envir.Time + 500, this, magic, value, location); CurrentMap.ActionList.Add(action); cast = true; }
private void Entrapment(MapObject target, UserMagic magic) { if (target == null || !target.IsAttackTarget(this)) return; int damage = 0; DelayedAction action = new DelayedAction(DelayedType.Magic, Envir.Time + 500, magic, damage, target); ActionList.Add(action); }
private void BladeAvalanche(UserMagic magic) { int criticalDamage = Envir.Random.Next(0, 100) <= (1 + Luck) ? MaxDC * 2 : MinDC * 2; int nearDamage = (12 + 3 * (magic.Level + Level / 20)) * criticalDamage / 30 + MinDC; int farDamage = (8 + 2 * (magic.Level + Level / 20)) * criticalDamage / 30 + MinDC; int col = 3; int row = 3; Point[] loc = new Point[col]; //0 = left 1 = center 2 = right loc[0] = Functions.PointMove(CurrentLocation, Functions.PreviousDir(Direction), 1); loc[1] = Functions.PointMove(CurrentLocation, Direction, 1); loc[2] = Functions.PointMove(CurrentLocation, Functions.NextDir(Direction), 1); for (int i = 0; i < col; i++) { Point startPoint = loc[i]; for (int j = 0; j < row; j++) { Point hitPoint = Functions.PointMove(startPoint, Direction, j); if (!CurrentMap.ValidPoint(hitPoint)) continue; Cell cell = CurrentMap.GetCell(hitPoint); if (cell.Objects == null) continue; for (int k = 0; k < cell.Objects.Count; k++) { MapObject target = cell.Objects[k]; switch (target.Race) { case ObjectType.Monster: case ObjectType.Player: //Only targets if (target.IsAttackTarget(this)) { if (target.Attacked(this, j <= 1 ? nearDamage : farDamage, DefenceType.MAC, false) > 0) LevelMagic(magic); } break; } } } } }
private void Rage(UserMagic magic) { int count = Buffs.Where(x => x.Type == BuffType.Rage).ToList().Count(); if (count > 0) return; int duration = 48 + (6 * magic.Level); int value = (int)Math.Round(MaxDC * (0.12 + (0.03 * magic.Level))); AddBuff(new Buff { Type = BuffType.Rage, Caster = this, ExpireTime = Envir.Time + duration * 1000, Values = new int[] { value } }); OperateTime = 0; LevelMagic(magic); }
private void DarkBody(MapObject target, UserMagic magic) { MonsterObject monster; for (int i = 0; i < Pets.Count; i++) { monster = Pets[i]; if ((monster.Info.Name != Settings.AssassinCloneName) || monster.Dead) continue; if (monster.Node == null) continue; monster.Die(); return; } MonsterInfo info = Envir.GetMonsterInfo(Settings.AssassinCloneName); if (info == null) return; if (target == null) return; LevelMagic(magic); monster = MonsterObject.GetMonster(info); monster.Master = this; monster.Direction = Direction; monster.ActionTime = Envir.Time + 500; monster.RefreshNameColour(false); monster.Target = target; Pets.Add(monster); monster.Spawn(CurrentMap, CurrentLocation); for (int i = 0; i < Buffs.Count; i++) if (Buffs[i].Type == BuffType.DarkBody) return; AddBuff(new Buff { Type = BuffType.DarkBody, Caster = this, ExpireTime = Envir.Time + (GetAttackPower(MinAC, MaxAC) + (magic.Level + 1) * 5) * 500, Visible = true }); LevelMagic(magic); }
private void ShoulderDash(UserMagic magic) { if (InTrapRock) return; if (!CanWalk) return; ActionTime = Envir.Time + MoveDelay; int dist = Envir.Random.Next(2) + magic.Level + 2; int travel = 0; bool wall = true; Point location = CurrentLocation; MapObject target = null; for (int i = 0; i < dist; i++) { location = Functions.PointMove(location, Direction, 1); if (!CurrentMap.ValidPoint(location)) break; Cell cell = CurrentMap.GetCell(location); bool blocking = false; if (cell.Objects != null) { for (int c = cell.Objects.Count - 1; c >= 0; c--) { MapObject ob = cell.Objects[c]; if (!ob.Blocking) continue; wall = false; if (ob.Race != ObjectType.Monster && ob.Race != ObjectType.Player) { blocking = true; break; } if (target == null && ob.Race == ObjectType.Player) target = ob; if (Envir.Random.Next(20) >= 6 + magic.Level * 3 + Level - ob.Level || !ob.IsAttackTarget(this) || ob.Level >= Level || ob.Pushed(this, Direction, 1) == 0) { if (target == ob) target = null; blocking = true; break; } if (cell.Objects == null) break; } } if (blocking) { if (magic.Level != 3) break; Point location2 = Functions.PointMove(location, Direction, 1); if (!CurrentMap.ValidPoint(location2)) break; cell = CurrentMap.GetCell(location2); blocking = false; if (cell.Objects != null) { for (int c = cell.Objects.Count - 1; c >= 0; c--) { MapObject ob = cell.Objects[c]; if (!ob.Blocking) continue; if (ob.Race != ObjectType.Monster && ob.Race != ObjectType.Player) { blocking = true; break; } if (!ob.IsAttackTarget(this) || ob.Level >= Level || ob.Pushed(this, Direction, 1) == 0) { blocking = true; break; } if (cell.Objects == null) break; } } if (blocking) break; cell = CurrentMap.GetCell(location); if (cell.Objects != null) { for (int c = cell.Objects.Count - 1; c >= 0; c--) { MapObject ob = cell.Objects[c]; if (!ob.Blocking) continue; if (ob.Race != ObjectType.Monster && ob.Race != ObjectType.Player) { blocking = true; break; } if (Envir.Random.Next(20) >= 6 + magic.Level * 3 + Level - ob.Level || !ob.IsAttackTarget(this) || ob.Level >= Level || ob.Pushed(this, Direction, 1) == 0) { blocking = true; break; } if (cell.Objects == null) break; } } if (blocking) break; } travel++; CurrentMap.GetCell(CurrentLocation).Remove(this); RemoveObjects(Direction, 1); CurrentLocation = location; Enqueue(new S.UserDash { Direction = Direction, Location = location }); Broadcast(new S.ObjectDash { ObjectID = ObjectID, Direction = Direction, Location = location }); CurrentMap.GetCell(CurrentLocation).Add(this); AddObjects(Direction, 1); } if (travel > 0 && !wall) { if (target != null) target.Attacked(this, magic.Level + 1, DefenceType.None, false); LevelMagic(magic); } if (travel > 0) { ActionTime = Envir.Time + (travel * MoveDelay); Cell cell = CurrentMap.GetCell(CurrentLocation); for (int i = 0; i < cell.Objects.Count; i++) { if (cell.Objects[i].Race != ObjectType.Spell) continue; SpellObject ob = (SpellObject)cell.Objects[i]; if (ob.Spell != Spell.FireWall || !IsAttackTarget(ob.Caster)) continue; Attacked(ob.Caster, ob.Value, DefenceType.MAC, false); break; } } if (travel == 0 || wall && dist != travel) { if (travel > 0) { Enqueue(new S.UserDash { Direction = Direction, Location = Front }); Broadcast(new S.ObjectDash { ObjectID = ObjectID, Direction = Direction, Location = Front }); SafeZoneInfo szi = CurrentMap.GetSafeZone(CurrentLocation); if (szi != null) { BindLocation = szi.Location; BindMapIndex = CurrentMapIndex; InSafeZone = true; } else InSafeZone = false; } else Broadcast(new S.ObjectDash { ObjectID = ObjectID, Direction = Direction, Location = Front }); Enqueue(new S.UserDashFail { Direction = Direction, Location = CurrentLocation }); Broadcast(new S.ObjectDashFail { ObjectID = ObjectID, Direction = Direction, Location = CurrentLocation }); ReceiveChat("Not enough pushing Power.", ChatType.System); } magic.CastTime = Envir.Time; _stepCounter = 0; //ActionTime = Envir.Time + GetDelayTime(MoveDelay); Enqueue(new S.MagicCast { Spell = magic.Spell }); CellTime = Envir.Time + 500; }
private void FlashDash(UserMagic magic) { bool success = false; ActionTime = Envir.Time; int travel = 0; bool blocked = false; int jumpDistance = (magic.Level <= 1) ? 0 : 1;//3 max Point location = CurrentLocation; for (int i = 0; i < jumpDistance; i++) { location = Functions.PointMove(location, Direction, 1); if (!CurrentMap.ValidPoint(location)) break; Cell cInfo = CurrentMap.GetCell(location); if (cInfo.Objects != null) { for (int c = 0; c < cInfo.Objects.Count; c++) { MapObject ob = cInfo.Objects[c]; if (!ob.Blocking) continue; blocked = true; if ((cInfo.Objects == null) || blocked) break; } } if (blocked) break; travel++; } jumpDistance = travel; if (jumpDistance > 0) { location = Functions.PointMove(CurrentLocation, Direction, jumpDistance); CurrentMap.GetCell(CurrentLocation).Remove(this); RemoveObjects(Direction, 1); CurrentLocation = location; CurrentMap.GetCell(CurrentLocation).Add(this); AddObjects(Direction, 1); Enqueue(new S.UserDashAttack { Direction = Direction, Location = location }); Broadcast(new S.ObjectDashAttack { ObjectID = ObjectID, Direction = Direction, Location = location, Distance = jumpDistance }); } else { Broadcast(new S.ObjectAttack { ObjectID = ObjectID, Direction = Direction, Location = CurrentLocation }); } if (travel == 0) location = CurrentLocation; int attackDelay = (AttackSpeed - 120) <= 300 ? 300 : (AttackSpeed - 120); AttackTime = Envir.Time + attackDelay; SpellTime = Envir.Time + 300; location = Functions.PointMove(location, Direction, 1); if (CurrentMap.ValidPoint(location)) { Cell cInfo = CurrentMap.GetCell(location); if (cInfo.Objects != null) { for (int c = 0; c < cInfo.Objects.Count; c++) { MapObject ob = cInfo.Objects[c]; switch (ob.Race) { case ObjectType.Monster: case ObjectType.Player: //Only targets if (ob.IsAttackTarget(this)) { DelayedAction action = new DelayedAction(DelayedType.Damage, AttackTime, ob, GetAttackPower(MinDC, MaxDC), DefenceType.AC, true); ActionList.Add(action); success = true; if ((((ob.Race != ObjectType.Player) || Settings.PvpCanResistPoison) && (Envir.Random.Next(Settings.PoisonAttackWeight) >= ob.PoisonResist)) && (Envir.Random.Next(15) <= magic.Level + 1)) { DelayedAction pa = new DelayedAction(DelayedType.Poison, AttackTime, ob, PoisonType.Stun, SpellEffect.TwinDrakeBlade, magic.Level + 1, 1000); ActionList.Add(pa); } } break; } } } } if (success) //technicaly this makes flashdash lvl when it casts rather then when it hits (it wont lvl if it's not hitting!) LevelMagic(magic); magic.CastTime = Envir.Time; Enqueue(new S.MagicCast { Spell = magic.Spell }); }
private void SlashingBurst(UserMagic magic, out bool cast) { cast = true; // damage int damage = GetAttackPower(MaxDC, MaxDC) * magic.GetPower(); // objects = this, magic, damage, currentlocation, direction, attackRange DelayedAction action = new DelayedAction(DelayedType.Magic, Envir.Time + 500, this, magic, damage, CurrentLocation, Direction, 1); CurrentMap.ActionList.Add(action); // telpo location Point location = Functions.PointMove(CurrentLocation, Direction, 2); if (!CurrentMap.ValidPoint(location)) return; Cell cInfo = CurrentMap.GetCell(location); bool blocked = false; if (cInfo.Objects != null) { for (int c = 0; c < cInfo.Objects.Count; c++) { MapObject ob = cInfo.Objects[c]; if (!ob.Blocking) continue; blocked = true; if ((cInfo.Objects == null) || blocked) break; } } // blocked telpo cancel if (blocked) return; Teleport(CurrentMap, location, false); //// move character //CurrentMap.GetCell(CurrentLocation).Remove(this); //RemoveObjects(Direction, 1); //CurrentLocation = location; //CurrentMap.GetCell(CurrentLocation).Add(this); //AddObjects(Direction, 1); //Enqueue(new S.UserAttackMove { Direction = Direction, Location = location }); }
private void BackStep(UserMagic magic) { ActionTime = Envir.Time; if (!CanWalk) return; int travel = 0; bool blocked = false; int jumpDistance = (magic.Level == 0) ? 1 : magic.Level;//3 max MirDirection jumpDir = Functions.ReverseDirection(Direction); Point location = CurrentLocation; for (int i = 0; i < jumpDistance; i++) { location = Functions.PointMove(location, jumpDir, 1); if (!CurrentMap.ValidPoint(location)) break; Cell cInfo = CurrentMap.GetCell(location); if (cInfo.Objects != null) for (int c = 0; c < cInfo.Objects.Count; c++) { MapObject ob = cInfo.Objects[c]; if (!ob.Blocking) continue; blocked = true; if ((cInfo.Objects == null) || blocked) break; } if (blocked) break; travel++; } jumpDistance = travel; if (jumpDistance > 0) { for (int i = 0; i < jumpDistance; i++) { location = Functions.PointMove(CurrentLocation, jumpDir, 1); CurrentMap.GetCell(CurrentLocation).Remove(this); RemoveObjects(jumpDir, 1); CurrentLocation = location; CurrentMap.GetCell(CurrentLocation).Add(this); AddObjects(jumpDir, 1); } Enqueue(new S.UserBackStep { Direction = Direction, Location = location }); Broadcast(new S.ObjectBackStep { ObjectID = ObjectID, Direction = Direction, Location = location, Distance = jumpDistance }); LevelMagic(magic); } else { Broadcast(new S.ObjectBackStep { ObjectID = ObjectID, Direction = Direction, Location = CurrentLocation, Distance = jumpDistance }); ReceiveChat("Not enough jumping power.", ChatType.System); } magic.CastTime = Envir.Time; Enqueue(new S.MagicCast { Spell = magic.Spell }); CellTime = Envir.Time + 500; }
private void ImmortalSkin(UserMagic magic, out bool cast) { cast = true; ActionList.Add(new DelayedAction(DelayedType.Magic, Envir.Time + 500, magic)); }
private void ExplosiveTrap(UserMagic magic, Point location) { int trapCount = 0; for (int i = 0; i <= 3; i++) if (ArcherTrapObjectsArray[i, 0] != null) trapCount++; if (trapCount >= magic.Level + 1) return;//max 4 traps int freeTrapSpot = -1; for (int i = 0; i <= 3; i++) if (ArcherTrapObjectsArray[i, 0] == null) { freeTrapSpot = i; break; } if (freeTrapSpot == -1) return; int damage = GetAttackPower(MinMC, MaxMC) + magic.GetPower(); DelayedAction action = new DelayedAction(DelayedType.Magic, Envir.Time + 500, this, magic, damage, location, freeTrapSpot); CurrentMap.ActionList.Add(action); }
private void CounterAttackCast(UserMagic magic, MapObject target) { if (target == null || magic == null) return; if (CounterAttack == false) return; int criticalDamage = Envir.Random.Next(0, 100) <= Accuracy ? MaxDC * 2 : MinDC * 2; int damage = (MinDC / 5 + 4 * (magic.Level + Level / 20)) * criticalDamage / 20 + MaxDC; MirDirection dir = Functions.ReverseDirection(target.Direction); Direction = dir; if (Functions.InRange(CurrentLocation, target.CurrentLocation, 1) == false) return; if (Envir.Random.Next(10) > magic.Level + 6) return; Enqueue(new S.ObjectMagic { ObjectID = ObjectID, Direction = Direction, Location = CurrentLocation, Spell = Spell.CounterAttack, TargetID = target.ObjectID, Target = target.CurrentLocation, Cast = true, Level = GetMagic(Spell.CounterAttack).Level, SelfBroadcast = true }); DelayedAction action = new DelayedAction(DelayedType.Damage, AttackTime, target, damage, DefenceType.AC, true); ActionList.Add(action); LevelMagic(magic); CounterAttack = false; }
public void BindingShot(UserMagic magic, MapObject target, out bool cast) { cast = false; if (target == null || !target.IsAttackTarget(this) || !(target is MonsterObject)) return; if ((Info.MentalState != 1) && !CanFly(target.CurrentLocation)) return; if (target.Level > Level + 2) return; if (((MonsterObject)target).ShockTime >= Envir.Time) return;//Already shocked uint duration = (uint)((magic.Level * 5 + 10) * 1000); int value = (int)duration; int delay = Functions.MaxDistance(CurrentLocation, target.CurrentLocation) * 50 + 500; //50 MS per Step DelayedAction action = new DelayedAction(DelayedType.Magic, Envir.Time + delay, magic, value, target); ActionList.Add(action); cast = true; }
private void HeavenlySword(UserMagic magic) { int damage = GetAttackPower(MinDC, MaxDC) + magic.GetPower(); DelayedAction action = new DelayedAction(DelayedType.Magic, Envir.Time + 500, this, magic, damage, CurrentLocation, Direction); CurrentMap.ActionList.Add(action); }
public void NapalmShot(MapObject target, UserMagic magic) { if (target == null || !target.IsAttackTarget(this)) return; if ((Info.MentalState != 1) && !CanFly(target.CurrentLocation)) return; int distance = Functions.MaxDistance(CurrentLocation, target.CurrentLocation); int damage = (GetAttackPower(MinMC, MaxMC) + magic.GetPower()); damage = ApplyArcherState(damage); int delay = distance * 50 + 500; //50 MS per Step DelayedAction action = new DelayedAction(DelayedType.Magic, Envir.Time + delay, this, magic, damage, target.CurrentLocation); CurrentMap.ActionList.Add(action); }
private void SwiftFeet(UserMagic magic, out bool cast) { cast = true; AddBuff(new Buff { Type = BuffType.SwiftFeet, Caster = this, ExpireTime = Envir.Time + 25000 + magic.Level * 5000, Values = new int[] { 1 }, Visible = true }); LevelMagic(magic); }
public void OneWithNature(MapObject target, UserMagic magic) { int damage = GetAttackPower(MinMC, MaxMC) + magic.GetPower(); DelayedAction action = new DelayedAction(DelayedType.Magic, Envir.Time + 500, this, magic, damage, CurrentLocation); CurrentMap.ActionList.Add(action); }
private void MoonLight(UserMagic magic) { for (int i = 0; i < Buffs.Count; i++) if (Buffs[i].Type == BuffType.MoonLight) return; AddBuff(new Buff { Type = BuffType.MoonLight, Caster = this, ExpireTime = Envir.Time + (GetAttackPower(MinAC, MaxAC) + (magic.Level + 1) * 5) * 500, Visible = true }); LevelMagic(magic); }
public void LevelMagic(UserMagic magic) { byte exp = (byte)(Envir.Random.Next(3) + 1); if ((Settings.MentorSkillBoost) && (Info.Mentor != 0) && (Info.isMentor)) { Buff buff = Buffs.Where(e => e.Type == BuffType.Mentee).FirstOrDefault(); if (buff != null) { CharacterInfo Mentor = Envir.GetCharacterInfo(Info.Mentor); PlayerObject player = Envir.GetPlayer(Mentor.Name); if (player.CurrentMap == CurrentMap && Functions.InRange(player.CurrentLocation, CurrentLocation, Globals.DataRange) && !player.Dead) if (SkillNeckBoost == 1) exp *= 2; } } exp *= SkillNeckBoost; if (Level == 65535) exp = byte.MaxValue; int oldLevel = magic.Level; switch (magic.Level) { case 0: if (Level < magic.Info.Level1) return; magic.Experience += exp; if (magic.Experience >= magic.Info.Need1) { magic.Level++; magic.Experience = (ushort)(magic.Experience - magic.Info.Need1); RefreshStats(); } break; case 1: if (Level < magic.Info.Level2) return; magic.Experience += exp; if (magic.Experience >= magic.Info.Need2) { magic.Level++; magic.Experience = (ushort)(magic.Experience - magic.Info.Need2); RefreshStats(); } break; case 2: if (Level < magic.Info.Level3) return; magic.Experience += exp; if (magic.Experience >= magic.Info.Need3) { magic.Level++; magic.Experience = 0; RefreshStats(); } break; default: return; } if (oldLevel != magic.Level) { long delay = magic.GetDelay(); Enqueue(new S.MagicDelay { Spell = magic.Spell, Delay = delay }); } Enqueue(new S.MagicLeveled { Spell = magic.Spell, Level = magic.Level, Experience = magic.Experience }); }
private void Trap(UserMagic magic, MapObject target, out bool cast) { cast = false; if (target == null || !target.IsAttackTarget(this) || !(target is MonsterObject)) return; if (target.Level >= Level + 2) return; Point location = target.CurrentLocation; LevelMagic(magic); uint duration = 60000; int value = (int)duration; DelayedAction action = new DelayedAction(DelayedType.Magic, Envir.Time + 500, this, magic, value, location); CurrentMap.ActionList.Add(action); cast = true; }
public CharacterInfo(BinaryReader reader) { Index = reader.ReadInt32(); Name = reader.ReadString(); if (Envir.LoadVersion < 62) { Level = (ushort)reader.ReadByte(); } else { Level = reader.ReadUInt16(); } Class = (MirClass)reader.ReadByte(); Gender = (MirGender)reader.ReadByte(); Hair = reader.ReadByte(); CreationIP = reader.ReadString(); CreationDate = DateTime.FromBinary(reader.ReadInt64()); Banned = reader.ReadBoolean(); BanReason = reader.ReadString(); ExpiryDate = DateTime.FromBinary(reader.ReadInt64()); LastIP = reader.ReadString(); LastDate = DateTime.FromBinary(reader.ReadInt64()); Deleted = reader.ReadBoolean(); DeleteDate = DateTime.FromBinary(reader.ReadInt64()); CurrentMapIndex = reader.ReadInt32(); CurrentLocation = new Point(reader.ReadInt32(), reader.ReadInt32()); Direction = (MirDirection)reader.ReadByte(); BindMapIndex = reader.ReadInt32(); BindLocation = new Point(reader.ReadInt32(), reader.ReadInt32()); HP = reader.ReadUInt16(); MP = reader.ReadUInt16(); Experience = reader.ReadInt64(); AMode = (AttackMode)reader.ReadByte(); PMode = (PetMode)reader.ReadByte(); if (Envir.LoadVersion > 34) { PKPoints = reader.ReadInt32(); } int count = reader.ReadInt32(); Array.Resize(ref Inventory, count); for (int i = 0; i < count; i++) { if (!reader.ReadBoolean()) { continue; } UserItem item = new UserItem(reader, Envir.LoadVersion, Envir.LoadCustomVersion); if (SMain.Envir.BindItem(item) && i < Inventory.Length) { Inventory[i] = item; } } count = reader.ReadInt32(); for (int i = 0; i < count; i++) { if (!reader.ReadBoolean()) { continue; } UserItem item = new UserItem(reader, Envir.LoadVersion, Envir.LoadCustomVersion); if (SMain.Envir.BindItem(item) && i < Equipment.Length) { Equipment[i] = item; } } count = reader.ReadInt32(); for (int i = 0; i < count; i++) { if (!reader.ReadBoolean()) { continue; } UserItem item = new UserItem(reader, Envir.LoadVersion, Envir.LoadCustomVersion); if (SMain.Envir.BindItem(item) && i < QuestInventory.Length) { QuestInventory[i] = item; } } count = reader.ReadInt32(); for (int i = 0; i < count; i++) { UserMagic magic = new UserMagic(reader); if (magic.Info == null) { continue; } Magics.Add(magic); } //reset all magic cooldowns on char loading < stops ppl from having none working skills after a server crash for (int i = 0; i < Magics.Count; i++) { Magics[i].CastTime = 0; } if (Envir.LoadVersion < 2) { return; } Thrusting = reader.ReadBoolean(); HalfMoon = reader.ReadBoolean(); CrossHalfMoon = reader.ReadBoolean(); DoubleSlash = reader.ReadBoolean(); if (Envir.LoadVersion > 46) { MentalState = reader.ReadByte(); } if (Envir.LoadVersion < 4) { return; } count = reader.ReadInt32(); for (int i = 0; i < count; i++) { Pets.Add(new PetInfo(reader)); } if (Envir.LoadVersion < 5) { return; } AllowGroup = reader.ReadBoolean(); if (Envir.LoadVersion < 12) { return; } if (Envir.LoadVersion == 12) { count = reader.ReadInt32(); } for (int i = 0; i < Globals.FlagIndexCount; i++) { Flags[i] = reader.ReadBoolean(); } if (Envir.LoadVersion > 27) { GuildIndex = reader.ReadInt32(); } if (Envir.LoadVersion > 30) { AllowTrade = reader.ReadBoolean(); } if (Envir.LoadVersion > 77) { AllowObserve = reader.ReadBoolean(); } if (Envir.LoadVersion > 33) { count = reader.ReadInt32(); for (int i = 0; i < count; i++) { QuestProgressInfo quest = new QuestProgressInfo(reader); if (SMain.Envir.BindQuest(quest)) { CurrentQuests.Add(quest); } } } if (Envir.LoadVersion > 42) { count = reader.ReadInt32(); for (int i = 0; i < count; i++) { Buff buff = new Buff(reader); if (Envir.LoadVersion == 51) { buff.Caster = SMain.Envir.GetObject(reader.ReadUInt32()); } Buffs.Add(buff); } } if (Envir.LoadVersion > 43) { count = reader.ReadInt32(); for (int i = 0; i < count; i++) { Mail.Add(new MailInfo(reader, Envir.LoadVersion, Envir.LoadCustomVersion)); } } //IntelligentCreature if (Envir.LoadVersion > 44) { count = reader.ReadInt32(); for (int i = 0; i < count; i++) { UserIntelligentCreature creature = new UserIntelligentCreature(reader); if (creature.Info == null) { continue; } IntelligentCreatures.Add(creature); } if (Envir.LoadVersion == 45) { var old1 = (IntelligentCreatureType)reader.ReadByte(); var old2 = reader.ReadBoolean(); } PearlCount = reader.ReadInt32(); } if (Envir.LoadVersion > 49) { count = reader.ReadInt32(); for (int i = 0; i < count; i++) { CompletedQuests.Add(reader.ReadInt32()); } } if (Envir.LoadVersion > 50 && Envir.LoadVersion < 54) { count = reader.ReadInt32(); for (int i = 0; i < count; i++) { Poison poison = new Poison(reader); if (Envir.LoadVersion == 51) { poison.Owner = SMain.Envir.GetObject(reader.ReadUInt32()); } Poisons.Add(poison); } } if (Envir.LoadVersion > 56) { if (reader.ReadBoolean()) { CurrentRefine = new UserItem(reader, Envir.LoadVersion, Envir.LoadCustomVersion); } if (CurrentRefine != null) { SMain.Envir.BindItem(CurrentRefine); } CollectTime = reader.ReadInt64(); CollectTime += SMain.Envir.Time; } if (Envir.LoadVersion > 58) { count = reader.ReadInt32(); for (int i = 0; i < count; i++) { Friends.Add(new FriendInfo(reader)); } } if (Envir.LoadVersion > 75) { count = reader.ReadInt32(); for (var i = 0; i < count; i++) { RentedItems.Add(new ItemRentalInformation(reader)); } HasRentedItem = reader.ReadBoolean(); } if (Envir.LoadVersion > 59) { Married = reader.ReadInt32(); MarriedDate = DateTime.FromBinary(reader.ReadInt64()); Mentor = reader.ReadInt32(); MentorDate = DateTime.FromBinary(reader.ReadInt64()); isMentor = reader.ReadBoolean(); MentorExp = reader.ReadInt64(); } if (Envir.LoadVersion >= 63) { int logCount = reader.ReadInt32(); for (int i = 0; i < logCount; i++) { GSpurchases.Add(reader.ReadInt32(), reader.ReadInt32()); } } if (Envir.LoadCustomVersion >= 1) { count = reader.ReadInt32(); for (int i = 0; i < count; i++) { int dailyEvent = reader.ReadInt32(); DailyEventsCompleted.Add(dailyEvent); } count = reader.ReadInt32(); for (int i = 0; i < count; i++) { int weeklyEvent = reader.ReadInt32(); WeeklyEventsCompleted.Add(weeklyEvent); } } }
public CharacterInfo(BinaryReader reader) { Index = reader.ReadInt32(); Name = reader.ReadString(); Level = reader.ReadByte(); Class = (MirClass)reader.ReadByte(); Gender = (MirGender)reader.ReadByte(); Hair = reader.ReadByte(); CreationIP = reader.ReadString(); CreationDate = DateTime.FromBinary(reader.ReadInt64()); Banned = reader.ReadBoolean(); BanReason = reader.ReadString(); ExpiryDate = DateTime.FromBinary(reader.ReadInt64()); LastIP = reader.ReadString(); LastDate = DateTime.FromBinary(reader.ReadInt64()); Deleted = reader.ReadBoolean(); DeleteDate = DateTime.FromBinary(reader.ReadInt64()); CurrentMapIndex = reader.ReadInt32(); CurrentLocation = new Point(reader.ReadInt32(), reader.ReadInt32()); Direction = (MirDirection)reader.ReadByte(); BindMapIndex = reader.ReadInt32(); BindLocation = new Point(reader.ReadInt32(), reader.ReadInt32()); HP = reader.ReadUInt16(); MP = reader.ReadUInt16(); Experience = reader.ReadInt64(); AMode = (AttackMode)reader.ReadByte(); PMode = (PetMode)reader.ReadByte(); if (Envir.LoadVersion > 34) { PKPoints = reader.ReadInt32(); } int count = reader.ReadInt32(); for (int i = 0; i < count; i++) { if (!reader.ReadBoolean()) { continue; } UserItem item = new UserItem(reader, Envir.LoadVersion); if (SMain.Envir.BindItem(item) && i < Inventory.Length) { Inventory[i] = item; } } count = reader.ReadInt32(); for (int i = 0; i < count; i++) { if (!reader.ReadBoolean()) { continue; } UserItem item = new UserItem(reader, Envir.LoadVersion); if (SMain.Envir.BindItem(item) && i < Equipment.Length) { Equipment[i] = item; } } count = reader.ReadInt32(); for (int i = 0; i < count; i++) { if (!reader.ReadBoolean()) { continue; } UserItem item = new UserItem(reader, Envir.LoadVersion); if (SMain.Envir.BindItem(item) && i < QuestInventory.Length) { QuestInventory[i] = item; } } count = reader.ReadInt32(); for (int i = 0; i < count; i++) { UserMagic magic = new UserMagic(reader); if (magic.Info == null) { continue; } Magics.Add(magic); } if (Envir.LoadVersion < 2) { return; } Thrusting = reader.ReadBoolean(); HalfMoon = reader.ReadBoolean(); CrossHalfMoon = reader.ReadBoolean(); DoubleSlash = reader.ReadBoolean(); if (Envir.LoadVersion < 4) { return; } count = reader.ReadInt32(); for (int i = 0; i < count; i++) { Pets.Add(new PetInfo(reader)); } if (Envir.LoadVersion < 5) { return; } AllowGroup = reader.ReadBoolean(); if (Envir.LoadVersion < 12) { return; } if (Envir.LoadVersion == 12) { count = reader.ReadInt32(); } for (int i = 0; i < Globals.FlagIndexCount; i++) { Flags[i] = reader.ReadBoolean(); } if (Envir.LoadVersion > 27) { GuildIndex = reader.ReadInt32(); } if (Envir.LoadVersion > 30) { AllowTrade = reader.ReadBoolean(); } if (Envir.LoadVersion > 33) { count = reader.ReadInt32(); for (int i = 0; i < count; i++) { CurrentQuests.Add(new QuestProgressInfo(reader)); } } if (Envir.LoadVersion > 42) { count = reader.ReadInt32(); for (int i = 0; i < count; i++) { Buffs.Add(new Buff(reader)); } } if (Envir.LoadVersion > 43) { count = reader.ReadInt32(); for (int i = 0; i < count; i++) { Mail.Add(new MailInfo(reader)); } } }