public void Attack(MirDirection dir, Spell spell) { LogTime = Envir.Time + Globals.LogDelay; bool Mined = false; bool MoonLightAttack = false; bool DarkBodyAttack = false; if (!CanAttack) { switch (spell) { case Spell.Slaying: Slaying = false; break; } Enqueue(new S.UserLocation { Direction = Direction, Location = CurrentLocation }); return; } if (Hidden) { for (int i = 0; i < Buffs.Count; i++) { switch (Buffs[i].Type) { case BuffType.Hiding: case BuffType.MoonLight: case BuffType.DarkBody: MoonLightAttack = true; DarkBodyAttack = true; Buffs[i].ExpireTime = 0; break; } } } byte level = 0; UserMagic magic; if (RidingMount) { spell = Spell.None; } switch (spell) { case Spell.Slaying: if (!Slaying) spell = Spell.None; else { magic = GetMagic(Spell.Slaying); level = magic.Level; } Slaying = false; break; case Spell.DoubleSlash: magic = GetMagic(spell); if (magic == null || magic.Info.BaseCost + (magic.Level * magic.Info.LevelCost) > MP) { spell = Spell.None; break; } level = magic.Level; ChangeMP(-(magic.Info.BaseCost + magic.Level * magic.Info.LevelCost)); break; case Spell.Thrusting: case Spell.FlamingSword: magic = GetMagic(spell); if ((magic == null) || (!FlamingSword && (spell == Spell.FlamingSword))) { spell = Spell.None; break; } level = magic.Level; break; case Spell.HalfMoon: case Spell.CrossHalfMoon: magic = GetMagic(spell); if (magic == null || magic.Info.BaseCost + (magic.Level * magic.Info.LevelCost) > MP) { spell = Spell.None; break; } level = magic.Level; ChangeMP(-(magic.Info.BaseCost + magic.Level * magic.Info.LevelCost)); break; case Spell.TwinDrakeBlade: magic = GetMagic(spell); if (!TwinDrakeBlade || magic == null || magic.Info.BaseCost + magic.Level * magic.Info.LevelCost > MP) { spell = Spell.None; break; } level = magic.Level; ChangeMP(-(magic.Info.BaseCost + magic.Level * magic.Info.LevelCost)); break; default: spell = Spell.None; break; } if (!Slaying) { magic = GetMagic(Spell.Slaying); if (magic != null && Envir.Random.Next(12) <= magic.Level) { Slaying = true; Enqueue(new S.SpellToggle { Spell = Spell.Slaying, CanUse = Slaying }); } } Direction = dir; if (RidingMount) DecreaseMountLoyalty(3); Enqueue(new S.UserLocation { Direction = Direction, Location = CurrentLocation }); Broadcast(new S.ObjectAttack { ObjectID = ObjectID, Direction = Direction, Location = CurrentLocation, Spell = spell, Level = level }); AttackTime = Envir.Time + AttackSpeed; ActionTime = Envir.Time + 550; RegenTime = Envir.Time + RegenDelay; Point target = Functions.PointMove(CurrentLocation, dir, 1); int damage = GetAttackPower(MinDC, MaxDC); if (MoonLightAttack || DarkBodyAttack) { magic = MoonLightAttack ? GetMagic(Spell.MoonLight) : GetMagic(Spell.DarkBody); if (magic != null) { damage += (magic.Level + 1) * 5; } } if (!CurrentMap.ValidPoint(target)) { switch (spell) { case Spell.Thrusting: goto Thrusting; case Spell.HalfMoon: goto HalfMoon; case Spell.CrossHalfMoon: goto CrossHalfMoon; case Spell.None: Mined = true; goto Mining; } return; } Cell cell = CurrentMap.GetCell(target); if (cell.Objects == null) { switch (spell) { case Spell.Thrusting: goto Thrusting; case Spell.HalfMoon: goto HalfMoon; case Spell.CrossHalfMoon: goto CrossHalfMoon; } return; } for (int i = 0; i < cell.Objects.Count; i++) { MapObject ob = cell.Objects[i]; if (ob.Race != ObjectType.Player && ob.Race != ObjectType.Monster) continue; if (!ob.IsAttackTarget(this)) continue; //Only undead targets if (ob.Undead) damage = Math.Min(int.MaxValue, damage + Holy); #region FatalSword magic = GetMagic(Spell.FatalSword); DefenceType defence = DefenceType.ACAgility; if (magic != null) { if (FatalSword) { damage += (magic.Level + 1) * 5; LevelMagic(magic); S.ObjectEffect p = new S.ObjectEffect { ObjectID = ob.ObjectID, Effect = SpellEffect.FatalSword }; defence = DefenceType.Agility; CurrentMap.Broadcast(p, ob.CurrentLocation); FatalSword = false; } if (!FatalSword && Envir.Random.Next(10) == 0) FatalSword = true; } #endregion #region MPEater magic = GetMagic(Spell.MPEater); if (magic != null) { int baseCount = 1 + Accuracy / 2; int maxCount = baseCount + magic.Level * 5; MPEaterCount += Envir.Random.Next(baseCount, maxCount); if (MPEater) { LevelMagic(magic); defence = DefenceType.ACAgility; S.ObjectEffect p = new S.ObjectEffect { ObjectID = ob.ObjectID, Effect = SpellEffect.MPEater, EffectType = ObjectID }; CurrentMap.Broadcast(p, ob.CurrentLocation); int addMp = 5 * (magic.Level + Accuracy / 4); if (ob.Race == ObjectType.Player) { ((PlayerObject)ob).ChangeMP(-addMp); } ChangeMP(addMp); MPEaterCount = 0; MPEater = false; } else if (!MPEater && 100 <= MPEaterCount) MPEater = true; } #endregion #region Hemorrhage magic = GetMagic(Spell.Hemorrhage); if (magic != null) { HemorrhageAttackCount += Envir.Random.Next(1, 1 + magic.Level * 2); if (Hemorrhage) { damage += damage * 10 / 2; //20% LevelMagic(magic); S.ObjectEffect ef = new S.ObjectEffect { ObjectID = ob.ObjectID, Effect = SpellEffect.Hemorrhage }; CurrentMap.Broadcast(ef, ob.CurrentLocation); if (ob == null || ob.Node == null) continue; long calcDuration = magic.Level * 2 + Luck / 6; ob.ApplyPoison(new Poison { Duration = (calcDuration <= 0) ? 1 : calcDuration, Owner = this, PType = PoisonType.Bleeding, TickSpeed = 1000, Value = MaxDC + 1 }, this); ob.OperateTime = 0; HemorrhageAttackCount = 0; Hemorrhage = false; } else if (!Hemorrhage && 55 <= HemorrhageAttackCount) Hemorrhage = true; } #endregion DelayedAction action; switch (spell) { case Spell.Slaying: magic = GetMagic(Spell.Slaying); damage += 5 + magic.Level; LevelMagic(magic); break; case Spell.DoubleSlash: magic = GetMagic(Spell.DoubleSlash); damage = damage * (magic.Level + 8) / 10; // 110% Damage level 3 if (defence == DefenceType.ACAgility) defence = DefenceType.MACAgility; action = new DelayedAction(DelayedType.Damage, Envir.Time + 400, ob, damage, DefenceType.Agility, false); ActionList.Add(action); LevelMagic(magic); break; case Spell.Thrusting: magic = GetMagic(Spell.Thrusting); LevelMagic(magic); break; case Spell.HalfMoon: magic = GetMagic(Spell.HalfMoon); LevelMagic(magic); break; case Spell.CrossHalfMoon: magic = GetMagic(Spell.CrossHalfMoon); LevelMagic(magic); break; case Spell.TwinDrakeBlade: magic = GetMagic(Spell.TwinDrakeBlade); damage = damage * (magic.Level + 8) / 10; // 110% Damage level 3 TwinDrakeBlade = false; action = new DelayedAction(DelayedType.Damage, Envir.Time + 400, ob, damage, DefenceType.Agility, false); ActionList.Add(action); LevelMagic(magic); if ((((ob.Race != ObjectType.Player) || Settings.PvpCanResistPoison) && (Envir.Random.Next(Settings.PoisonAttackWeight) >= ob.PoisonResist)) && (ob.Level < Level + 10 && Envir.Random.Next(ob.Race == ObjectType.Player ? 40 : 20) <= magic.Level + 1)) { ob.ApplyPoison(new Poison { PType = PoisonType.Stun, Duration = ob.Race == ObjectType.Player ? 2 : 2 + magic.Level, TickSpeed = 1000 }, this); ob.Broadcast(new S.ObjectEffect { ObjectID = ob.ObjectID, Effect = SpellEffect.TwinDrakeBlade }); } break; case Spell.FlamingSword: magic = GetMagic(Spell.FlamingSword); damage = (damage) + (int)(((double)damage / 100) * ((4 + magic.Level * 4) * 10)); FlamingSword = false; defence = DefenceType.AC; //action = new DelayedAction(DelayedType.Damage, Envir.Time + 400, ob, damage, DefenceType.Agility, true); //ActionList.Add(action); LevelMagic(magic); break; } //if (ob.Attacked(this, damage, defence) <= 0) break; action = new DelayedAction(DelayedType.Damage, Envir.Time + 300, ob, damage, defence, true); ActionList.Add(action); break; } Thrusting: if (spell == Spell.Thrusting) { target = Functions.PointMove(target, dir, 1); if (!CurrentMap.ValidPoint(target)) return; cell = CurrentMap.GetCell(target); if (cell.Objects == null) return; for (int i = 0; i < cell.Objects.Count; i++) { MapObject ob = cell.Objects[i]; if (ob.Race != ObjectType.Player && ob.Race != ObjectType.Monster) continue; if (!ob.IsAttackTarget(this)) continue; magic = GetMagic(spell); damage = damage * (magic.Level + 1) / 4; ob.Attacked(this, damage, DefenceType.Agility, false); break; } } HalfMoon: if (spell == Spell.HalfMoon) { dir = Functions.PreviousDir(dir); magic = GetMagic(spell); damage = damage * (magic.Level + 3) / 10; for (int i = 0; i < 4; i++) { target = Functions.PointMove(CurrentLocation, dir, 1); dir = Functions.NextDir(dir); if (target == Front) continue; if (!CurrentMap.ValidPoint(target)) continue; cell = CurrentMap.GetCell(target); if (cell.Objects == null) continue; for (int o = 0; o < cell.Objects.Count; o++) { MapObject ob = cell.Objects[o]; if (ob.Race != ObjectType.Player && ob.Race != ObjectType.Monster) continue; if (!ob.IsAttackTarget(this)) continue; ob.Attacked(this, damage, DefenceType.Agility, false); break; } } } CrossHalfMoon: if (spell == Spell.CrossHalfMoon) { magic = GetMagic(spell); damage = damage * (magic.Level + 4) / 10; for (int i = 0; i < 8; i++) { target = Functions.PointMove(CurrentLocation, dir, 1); dir = Functions.NextDir(dir); if (target == Front) continue; if (!CurrentMap.ValidPoint(target)) continue; cell = CurrentMap.GetCell(target); if (cell.Objects == null) continue; for (int o = 0; o < cell.Objects.Count; o++) { MapObject ob = cell.Objects[o]; if (ob.Race != ObjectType.Player && ob.Race != ObjectType.Monster) continue; if (!ob.IsAttackTarget(this)) continue; ob.Attacked(this, damage, DefenceType.Agility, false); break; } } } Mining: if (Mined) { if (Info.Equipment[(int)EquipmentSlot.Weapon] == null) return; if (!Info.Equipment[(int)EquipmentSlot.Weapon].Info.CanMine) return; if (CurrentMap.Mine == null) return; MineSpot Mine = CurrentMap.Mine[target.X, target.Y]; if ((Mine == null) || (Mine.Mine == null)) return; if (Mine.StonesLeft > 0) { Mine.StonesLeft--; if (Envir.Random.Next(100) <= (Mine.Mine.HitRate + (Info.Equipment[(int)EquipmentSlot.Weapon].Info.Accuracy + Info.Equipment[(int)EquipmentSlot.Weapon].Accuracy) * 10)) { //create some rubble on the floor (or increase whats there) SpellObject Rubble = null; Cell minecell = CurrentMap.GetCell(CurrentLocation); for (int i = 0; i < minecell.Objects.Count; i++) { if (minecell.Objects[i].Race != ObjectType.Spell) continue; SpellObject ob = (SpellObject)minecell.Objects[i]; if (ob.Spell != Spell.Rubble) continue; Rubble = ob; Rubble.ExpireTime = Envir.Time + (5 * 60 * 1000); break; } if (Rubble == null) { Rubble = new SpellObject { Spell = Spell.Rubble, Value = 1, ExpireTime = Envir.Time + (5 * 60 * 1000), TickSpeed = 2000, Caster = null, CurrentLocation = CurrentLocation, CurrentMap = this.CurrentMap, Direction = MirDirection.Up }; CurrentMap.AddObject(Rubble); Rubble.Spawned(); } if (Rubble != null) ActionList.Add(new DelayedAction(DelayedType.Mine, Envir.Time + 400, Rubble)); //check if we get a payout if (Envir.Random.Next(100) <= (Mine.Mine.DropRate + (MineRate * 5))) { GetMinePayout(Mine.Mine); } DamageItem(Info.Equipment[(int)EquipmentSlot.Weapon], 5 + Envir.Random.Next(15)); } } else { if (Envir.Time > Mine.LastRegenTick) { Mine.LastRegenTick = Envir.Time + Mine.Mine.SpotRegenRate * 60 * 1000; Mine.StonesLeft = (byte)Envir.Random.Next(Mine.Mine.MaxStones); } } } }
public void Attack(MirDirection dir, Spell spell) { if (!CanAttack) { switch (spell) { case Spell.Slaying: Slaying = false; break; } Enqueue(new S.UserLocation {Direction = Direction, Location = CurrentLocation}); return; } byte level = 0; UserMagic magic; switch (spell) { case Spell.Slaying: if (!Slaying) spell = Spell.None; else { magic = GetMagic(Spell.Slaying); level = magic.Level; } Slaying = false; break; case Spell.DoubleSlash: magic = GetMagic(spell); if (magic == null || magic.Info.BaseCost + (magic.Level*magic.Info.LevelCost) > MP) { spell = Spell.None; break; } level = magic.Level; ChangeMP(-(magic.Info.BaseCost + magic.Level*magic.Info.LevelCost)); break; case Spell.Thrusting: magic = GetMagic(spell); if (magic == null) { spell = Spell.None; break; } level = magic.Level; break; case Spell.HalfMoon: case Spell.CrossHalfMoon: magic = GetMagic(spell); if (magic == null || magic.Info.BaseCost + (magic.Level*magic.Info.LevelCost) > MP) { spell = Spell.None; break; } level = magic.Level; ChangeMP(-(magic.Info.BaseCost + magic.Level*magic.Info.LevelCost)); break; case Spell.TwinDrakeBlade: magic = GetMagic(spell); if (!TwinDrakeBlade || magic == null || magic.Info.BaseCost + magic.Level*magic.Info.LevelCost > MP) { spell = Spell.None; break; } level = magic.Level; ChangeMP(-(magic.Info.BaseCost + magic.Level*magic.Info.LevelCost)); break; default: spell = Spell.None; break; } if (!Slaying) { magic = GetMagic(Spell.Slaying); if (magic != null && Envir.Random.Next(12) <= magic.Level) { Slaying = true; Enqueue(new S.SpellToggle {Spell = Spell.Slaying, CanUse = Slaying}); } } Direction = dir; Enqueue(new S.UserLocation {Direction = Direction, Location = CurrentLocation}); Broadcast(new S.ObjectAttack {ObjectID = ObjectID, Direction = Direction, Location = CurrentLocation, Spell = spell, Level = level}); AttackTime = Envir.Time + AttackSpeed; ActionTime = Envir.Time + 550; RegenTime = Envir.Time + RegenDelay; Point target = Functions.PointMove(CurrentLocation, dir, 1); int damage = GetAttackPower(MinDC, MaxDC); if (!CurrentMap.ValidPoint(target)) { switch (spell) { case Spell.Thrusting: goto Thrusting; case Spell.HalfMoon: goto HalfMoon; case Spell.CrossHalfMoon: goto CrossHalfMoon; } return; } Cell cell = CurrentMap.GetCell(target); if (cell.Objects == null) { switch (spell) { case Spell.Thrusting: goto Thrusting; case Spell.HalfMoon: goto HalfMoon; case Spell.CrossHalfMoon: goto CrossHalfMoon; } return; } for (int i = 0; i < cell.Objects.Count; i++) { MapObject ob = cell.Objects[i]; if (ob.Race != ObjectType.Player && ob.Race != ObjectType.Monster) continue; if (!ob.IsAttackTarget(this)) continue; //Only targets magic = GetMagic(Spell.FatalSword); DefenceType defence = DefenceType.ACAgility; if (magic != null) { if (FatalSword) { damage += (magic.Level + 1)*5; LevelMagic(magic); S.ObjectEffect p = new S.ObjectEffect {ObjectID = ob.ObjectID, Effect = SpellEffect.FatalSword}; defence = DefenceType.Agility; CurrentMap.Broadcast(p, ob.CurrentLocation); FatalSword = false; } if (!FatalSword && Envir.Random.Next(10) == 0) FatalSword = true; } DelayedAction action; switch (spell) { case Spell.Slaying: magic = GetMagic(Spell.Slaying); damage += (magic.Level + 1)*8; LevelMagic(magic); break; case Spell.DoubleSlash: magic = GetMagic(Spell.DoubleSlash); damage = damage*(magic.Level + 8)/10; // 110% Damage level 3 if (defence == DefenceType.ACAgility) defence = DefenceType.MACAgility; action = new DelayedAction(DelayedType.Damage, Envir.Time + 400, ob, damage, DefenceType.Agility, true); ActionList.Add(action); LevelMagic(magic); break; case Spell.Thrusting: magic = GetMagic(Spell.Thrusting); LevelMagic(magic); break; case Spell.HalfMoon: magic = GetMagic(Spell.HalfMoon); LevelMagic(magic); break; case Spell.CrossHalfMoon: magic = GetMagic(Spell.CrossHalfMoon); LevelMagic(magic); break; case Spell.TwinDrakeBlade: magic = GetMagic(Spell.TwinDrakeBlade); damage = damage*(magic.Level + 7)/10; // 110% Damage level 3 TwinDrakeBlade = false; action = new DelayedAction(DelayedType.Damage, Envir.Time + 400, ob, damage, DefenceType.Agility, true); ActionList.Add(action); LevelMagic(magic); if (ob.Level < Level + 10 && Envir.Random.Next(ob.Race == ObjectType.Player ? 40 : 20) <= magic.Level + 1) { ob.ApplyPoison(new Poison {PType = PoisonType.Stun, Duration = ob.Race == ObjectType.Player ? 2 : 2 + magic.Level, TickSpeed = 1000}); ob.Broadcast(new S.ObjectEffect {ObjectID = ob.ObjectID, Effect = SpellEffect.TwinDrakeBlade}); } break; } if (ob.Attacked(this, damage, defence) <= 0) break; //Level Fencing / SpiritSword for (int m = 0; m < Info.Magics.Count; m++) { magic = Info.Magics[m]; switch (magic.Spell) { case Spell.Fencing: case Spell.SpiritSword: LevelMagic(magic); break; } } break; } Thrusting: if (spell == Spell.Thrusting) { target = Functions.PointMove(target, dir, 1); if (!CurrentMap.ValidPoint(target)) return; cell = CurrentMap.GetCell(target); if (cell.Objects == null) return; for (int i = 0; i < cell.Objects.Count; i++) { MapObject ob = cell.Objects[i]; if (ob.Race != ObjectType.Player && ob.Race != ObjectType.Monster) continue; if (!ob.IsAttackTarget(this)) continue; magic = GetMagic(spell); damage = damage*(magic.Level + 1)/4; ob.Attacked(this, damage, DefenceType.Agility); break; } } HalfMoon: if (spell == Spell.HalfMoon) { dir = Functions.PreviousDir(dir); magic = GetMagic(spell); damage = damage*(magic.Level + 3)/10; for (int i = 0; i < 4; i++) { target = Functions.PointMove(CurrentLocation, dir, 1); dir = Functions.NextDir(dir); if (target == Front) continue; if (!CurrentMap.ValidPoint(target)) continue; cell = CurrentMap.GetCell(target); if (cell.Objects == null) continue; for (int o = 0; o < cell.Objects.Count; o++) { MapObject ob = cell.Objects[o]; if (ob.Race != ObjectType.Player && ob.Race != ObjectType.Monster) continue; if (!ob.IsAttackTarget(this)) continue; ob.Attacked(this, damage, DefenceType.Agility); break; } } } CrossHalfMoon: if (spell == Spell.CrossHalfMoon) { magic = GetMagic(spell); damage = damage*(magic.Level + 4)/10; for (int i = 0; i < 8; i++) { target = Functions.PointMove(CurrentLocation, dir, 1); dir = Functions.NextDir(dir); if (target == Front) continue; if (!CurrentMap.ValidPoint(target)) continue; cell = CurrentMap.GetCell(target); if (cell.Objects == null) continue; for (int o = 0; o < cell.Objects.Count; o++) { MapObject ob = cell.Objects[o]; if (ob.Race != ObjectType.Player && ob.Race != ObjectType.Monster) continue; if (!ob.IsAttackTarget(this)) continue; ob.Attacked(this, damage, DefenceType.Agility); break; } } } }
public void Attack(MirDirection dir, Spell spell) { bool Mined = false; if (!CanAttack) { switch (spell) { case Spell.Slaying: Slaying = false; break; } Enqueue(new S.UserLocation {Direction = Direction, Location = CurrentLocation}); return; } byte level = 0; UserMagic magic; switch (spell) { case Spell.Slaying: if (!Slaying) spell = Spell.None; else { magic = GetMagic(Spell.Slaying); level = magic.Level; } Slaying = false; break; case Spell.DoubleSlash: magic = GetMagic(spell); if (magic == null || magic.Info.BaseCost + (magic.Level*magic.Info.LevelCost) > MP) { spell = Spell.None; break; } level = magic.Level; ChangeMP(-(magic.Info.BaseCost + magic.Level*magic.Info.LevelCost)); break; case Spell.Thrusting: case Spell.FlamingSword: magic = GetMagic(spell); if (magic == null) { spell = Spell.None; break; } level = magic.Level; break; case Spell.HalfMoon: case Spell.CrossHalfMoon: magic = GetMagic(spell); if (magic == null || magic.Info.BaseCost + (magic.Level*magic.Info.LevelCost) > MP) { spell = Spell.None; break; } level = magic.Level; ChangeMP(-(magic.Info.BaseCost + magic.Level*magic.Info.LevelCost)); break; case Spell.TwinDrakeBlade: magic = GetMagic(spell); if (!TwinDrakeBlade || magic == null || magic.Info.BaseCost + magic.Level*magic.Info.LevelCost > MP) { spell = Spell.None; break; } level = magic.Level; ChangeMP(-(magic.Info.BaseCost + magic.Level*magic.Info.LevelCost)); break; default: spell = Spell.None; break; } if (!Slaying) { magic = GetMagic(Spell.Slaying); if (magic != null && Envir.Random.Next(12) <= magic.Level) { Slaying = true; Enqueue(new S.SpellToggle {Spell = Spell.Slaying, CanUse = Slaying}); } } Direction = dir; Enqueue(new S.UserLocation {Direction = Direction, Location = CurrentLocation}); Broadcast(new S.ObjectAttack {ObjectID = ObjectID, Direction = Direction, Location = CurrentLocation, Spell = spell, Level = level}); AttackTime = Envir.Time + AttackSpeed; ActionTime = Envir.Time + 550; RegenTime = Envir.Time + RegenDelay; Point target = Functions.PointMove(CurrentLocation, dir, 1); int damage = GetAttackPower(MinDC, MaxDC); if (!CurrentMap.ValidPoint(target)) { switch (spell) { case Spell.Thrusting: goto Thrusting; case Spell.HalfMoon: goto HalfMoon; case Spell.CrossHalfMoon: goto CrossHalfMoon; case Spell.None: Mined = true; goto Mining; } return; } Cell cell = CurrentMap.GetCell(target); if (cell.Objects == null) { switch (spell) { case Spell.Thrusting: goto Thrusting; case Spell.HalfMoon: goto HalfMoon; case Spell.CrossHalfMoon: goto CrossHalfMoon; } return; } for (int i = 0; i < cell.Objects.Count; i++) { MapObject ob = cell.Objects[i]; if (ob.Race != ObjectType.Player && ob.Race != ObjectType.Monster) continue; if (!ob.IsAttackTarget(this)) continue; //Only targets if (ob.Undead) damage = Math.Min(int.MaxValue, damage + Holy); magic = GetMagic(Spell.FatalSword); DefenceType defence = DefenceType.ACAgility; if (magic != null) { if (FatalSword) { damage += (magic.Level + 1)*5; LevelMagic(magic); S.ObjectEffect p = new S.ObjectEffect {ObjectID = ob.ObjectID, Effect = SpellEffect.FatalSword}; defence = DefenceType.Agility; CurrentMap.Broadcast(p, ob.CurrentLocation); FatalSword = false; } if (!FatalSword && Envir.Random.Next(10) == 0) FatalSword = true; } DelayedAction action; switch (spell) { case Spell.Slaying: magic = GetMagic(Spell.Slaying); damage += (magic.Level + 1)*8; LevelMagic(magic); break; case Spell.DoubleSlash: magic = GetMagic(Spell.DoubleSlash); damage = damage*(magic.Level + 8)/10; // 110% Damage level 3 if (defence == DefenceType.ACAgility) defence = DefenceType.MACAgility; action = new DelayedAction(DelayedType.Damage, Envir.Time + 400, ob, damage, DefenceType.Agility, true); ActionList.Add(action); LevelMagic(magic); break; case Spell.Thrusting: magic = GetMagic(Spell.Thrusting); LevelMagic(magic); break; case Spell.HalfMoon: magic = GetMagic(Spell.HalfMoon); LevelMagic(magic); break; case Spell.CrossHalfMoon: magic = GetMagic(Spell.CrossHalfMoon); LevelMagic(magic); break; case Spell.TwinDrakeBlade: magic = GetMagic(Spell.TwinDrakeBlade); damage = damage*(magic.Level + 8)/10; // 110% Damage level 3 TwinDrakeBlade = false; action = new DelayedAction(DelayedType.Damage, Envir.Time + 400, ob, damage, DefenceType.Agility, true); ActionList.Add(action); LevelMagic(magic); if ((((ob.Race != ObjectType.Player) || Settings.PvpCanResistPoison) && (Envir.Random.Next(Settings.PoisonAttackWeight) >= ob.PoisonResist)) && (ob.Level < Level + 10 && Envir.Random.Next(ob.Race == ObjectType.Player ? 40 : 20) <= magic.Level + 1)) { ob.ApplyPoison(new Poison {PType = PoisonType.Stun, Duration = ob.Race == ObjectType.Player ? 2 : 2 + magic.Level, TickSpeed = 1000}, this); ob.Broadcast(new S.ObjectEffect {ObjectID = ob.ObjectID, Effect = SpellEffect.TwinDrakeBlade}); } break; case Spell.FlamingSword: magic = GetMagic(Spell.FlamingSword); damage = damage + (damage / 100 * ((4 + magic.Level * 4) * 10)); FlamingSword = false; action = new DelayedAction(DelayedType.Damage, Envir.Time + 400, ob, damage, DefenceType.Agility, true); ActionList.Add(action); LevelMagic(magic); break; } if (ob.Attacked(this, damage, defence) <= 0) break; //Level Fencing / SpiritSword for (int m = 0; m < Info.Magics.Count; m++) { magic = Info.Magics[m]; switch (magic.Spell) { case Spell.Fencing: case Spell.SpiritSword: LevelMagic(magic); break; } } break; } Thrusting: if (spell == Spell.Thrusting) { target = Functions.PointMove(target, dir, 1); if (!CurrentMap.ValidPoint(target)) return; cell = CurrentMap.GetCell(target); if (cell.Objects == null) return; for (int i = 0; i < cell.Objects.Count; i++) { MapObject ob = cell.Objects[i]; if (ob.Race != ObjectType.Player && ob.Race != ObjectType.Monster) continue; if (!ob.IsAttackTarget(this)) continue; magic = GetMagic(spell); damage = damage*(magic.Level + 1)/4; ob.Attacked(this, damage, DefenceType.Agility); break; } } HalfMoon: if (spell == Spell.HalfMoon) { dir = Functions.PreviousDir(dir); magic = GetMagic(spell); damage = damage*(magic.Level + 3)/10; for (int i = 0; i < 4; i++) { target = Functions.PointMove(CurrentLocation, dir, 1); dir = Functions.NextDir(dir); if (target == Front) continue; if (!CurrentMap.ValidPoint(target)) continue; cell = CurrentMap.GetCell(target); if (cell.Objects == null) continue; for (int o = 0; o < cell.Objects.Count; o++) { MapObject ob = cell.Objects[o]; if (ob.Race != ObjectType.Player && ob.Race != ObjectType.Monster) continue; if (!ob.IsAttackTarget(this)) continue; ob.Attacked(this, damage, DefenceType.Agility); break; } } } CrossHalfMoon: if (spell == Spell.CrossHalfMoon) { magic = GetMagic(spell); damage = damage*(magic.Level + 4)/10; for (int i = 0; i < 8; i++) { target = Functions.PointMove(CurrentLocation, dir, 1); dir = Functions.NextDir(dir); if (target == Front) continue; if (!CurrentMap.ValidPoint(target)) continue; cell = CurrentMap.GetCell(target); if (cell.Objects == null) continue; for (int o = 0; o < cell.Objects.Count; o++) { MapObject ob = cell.Objects[o]; if (ob.Race != ObjectType.Player && ob.Race != ObjectType.Monster) continue; if (!ob.IsAttackTarget(this)) continue; ob.Attacked(this, damage, DefenceType.Agility); break; } } } Mining: if (Mined) { if(Info.Equipment[(int)EquipmentSlot.Weapon] == null) return; if(!Info.Equipment[(int)EquipmentSlot.Weapon].Info.CanMine) return; if (CurrentMap.Mine == null) return; MineSpot Mine = CurrentMap.Mine[target.X, target.Y]; if ((Mine == null) || (Mine.Mine == null)) return; if (Mine.StonesLeft > 0) { Mine.StonesLeft--; if (Envir.Random.Next(100) <= (Mine.Mine.HitRate + (Info.Equipment[(int)EquipmentSlot.Weapon].Info.Accuracy + Info.Equipment[(int)EquipmentSlot.Weapon].Accuracy)*10)) { //create some rubble on the floor (or increase whats there) SpellObject Rubble = null; Cell minecell = CurrentMap.GetCell(CurrentLocation); for (int i = 0; i < minecell.Objects.Count; i++) { if (minecell.Objects[i].Race != ObjectType.Spell) continue; SpellObject ob = (SpellObject)minecell.Objects[i]; if (ob.Spell != Spell.Rubble) continue; Rubble = ob; Rubble.ExpireTime = Envir.Time + (5 * 60 * 1000); break; } if (Rubble == null) { Rubble = new SpellObject { Spell = Spell.Rubble, Value = 1, ExpireTime = Envir.Time + (5 * 60 * 1000), TickSpeed = 2000, Caster = null, CurrentLocation = CurrentLocation, CurrentMap = this.CurrentMap, Direction = MirDirection.Up }; CurrentMap.AddObject(Rubble); Rubble.Spawned(); } if (Rubble != null) ActionList.Add(new DelayedAction(DelayedType.Mine, Envir.Time + 400,Rubble)); //check if we get a payout if (Envir.Random.Next(100) <= Mine.Mine.DropRate) { GetMinePayout(Mine.Mine); } DamageItem(Info.Equipment[(int)EquipmentSlot.Weapon], 5 + Envir.Random.Next(15)); } } else { if (Envir.Time > Mine.LastRegenTick) { Mine.LastRegenTick = Envir.Time + Mine.Mine.SpotRegenRate * 60 * 1000; Mine.StonesLeft = (byte)Envir.Random.Next(Mine.Mine.MaxStones); } } } }
protected override void ProcessTarget() { if (!CanAttack || Target == null) { return; } var tornado = (FindAllTargets(2, CurrentLocation, false)); if (Envir.Random.Next(4) == 1 && Envir.Time > SpawnDelay) { SpawnDelay = Envir.Time + 60 * Settings.Second; Broadcast(new S.ObjectAttack { ObjectID = ObjectID, Direction = Direction, Location = CurrentLocation, Type = 2 }); Broadcast(new S.ObjectEffect { ObjectID = ObjectID, Effect = SpellEffect.RestlessJarSpawn }); Broadcast(new S.ObjectEffect { ObjectID = Target.ObjectID, Effect = SpellEffect.RestlessJarSpawnOnPlayer }); SpawnSlaves(); } else if (Envir.Random.Next(15) == 0 && tornado.Count > 0) { ShockTime = 0; Broadcast(new S.ObjectAttack { ObjectID = ObjectID, Direction = Direction, Location = CurrentLocation }); Broadcast(new S.ObjectEffect { ObjectID = ObjectID, Effect = SpellEffect.RestlessJarTornado }); for (int i = 0; i < tornado.Count; i++) { Target = tornado[i]; MirDirection pushdir = Functions.DirectionFromPoint(CurrentLocation, Target.CurrentLocation); Target.Pushed(this, pushdir, 3 + Envir.Random.Next(3)); } List <MapObject> targets = FindAllTargets(7, CurrentLocation, false); if (targets.Count != 0) { for (int i = 0; i < targets.Count; i++) { Target = targets[i]; Target.ApplyPoison(new Poison { PType = PoisonType.Paralysis, Duration = 5, TickSpeed = 1000 }, this); } } } else { List <MapObject> targets = FindAllTargets(Info.ViewRange, CurrentLocation, false); if (targets.Count == 0) { return; } ShockTime = 0; Broadcast(new S.ObjectAttack { ObjectID = ObjectID, Direction = Direction, Location = CurrentLocation, Type = 2 }); for (int i = 0; i < targets.Count; i++) { Target = targets[i]; Target.Attacked(this, GetAttackPower(MinDC, MaxDC), DefenceType.ACAgility); var p = new S.ObjectEffect { ObjectID = ObjectID, Effect = SpellEffect.RestlessJarMultipleHit, TargetID = Target.ObjectID }; Broadcast(p); } } ActionTime = Envir.Time + 300; AttackTime = Envir.Time + AttackSpeed; }