private void UltimateEnhancer(MapObject target, UserMagic magic, out bool cast) { cast = false; if (target == null || !target.IsFriendlyTarget(this)) return; UserItem item = GetAmulet(1); if (item == null) return; long expiretime = GetAttackPower(MinSC, MaxSC) * 2 + (magic.Level + 1) * 10; int value = MaxSC >= 5 ? Math.Min(8, MaxSC / 5) : 1; switch (target.Race) { case ObjectType.Monster: case ObjectType.Player: //Only targets if (target.IsFriendlyTarget(this)) { target.AddBuff(new Buff { Type = BuffType.UltimateEnhancer, Caster = this, ExpireTime = Envir.Time + expiretime * 1000, Values = new int[] { value } }); target.OperateTime = 0; LevelMagic(magic); ConsumeItem(item, 1); cast = true; } break; } }
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 EnergyShield(MapObject target, UserMagic magic, out bool cast) { cast = false; if (!target.IsFriendlyTarget(this)) target = this; //offical is only party target int duration = 30 + 50 * magic.Level; int power = GetAttackPower(magic.GetPower(MinSC), magic.GetPower(MaxSC) + 1); int chance = 9 - (Luck / 3 + magic.Level); int[] values = { chance < 2 ? 2 : chance, power }; switch (target.Race) { case ObjectType.Player: //Only targets if (target.IsFriendlyTarget(this)) { target.AddBuff(new Buff { Type = BuffType.EnergyShield, Caster = this, ExpireTime = Envir.Time + duration * 1000, Visible = true, Values = values }); target.OperateTime = 0; LevelMagic(magic); cast = true; } break; } }
private void Purification(MapObject target, UserMagic magic) { if (target == null || !target.IsFriendlyTarget(this)) return; DelayedAction action = new DelayedAction(DelayedType.Magic, Envir.Time + 500, magic, target); ActionList.Add(action); }
private void Healing(MapObject target, UserMagic magic) { if (target == null || !target.IsFriendlyTarget(this)) return; int health = GetAttackPower(MinSC, MaxSC) * 2 + magic.GetPower() + Level; DelayedAction action = new DelayedAction(DelayedType.Magic, Envir.Time + 500, magic, health, target); ActionList.Add(action); }
private void EnergyShields(MapObject target, UserMagic magic, out bool cast) { cast = false; if (target == null || !target.IsFriendlyTarget(this)) return; UserItem item = GetAmulet(1); if (item == null) return; int expireTime = GetAttackPower(MinSC, MaxSC) * 2 + (magic.Level + 1) * 10; //int value = MaxSC >= 5 ? Math.Min(8, MaxSC / 5) : 1; ActionList.Add(new DelayedAction(DelayedType.Magic, Envir.Time + 500, magic, expireTime)); }
public void ProcessSpell(MapObject ob) { if (Envir.Time < StartTime) { return; } List <MapObject> listtargets = new List <MapObject>(); switch (Spell) { case Spell.FireWall: if (ob.Race != ObjectType.Player && ob.Race != ObjectType.Monster) { return; } if (ob.Dead) { return; } if (!ob.IsAttackTarget(Caster)) { return; } ob.Attacked(Caster, Value, DefenceType.MAC, false); break; case Spell.Healing: //SafeZone if (ob.Race != ObjectType.Player && (ob.Race != ObjectType.Monster || ob.Master == null || ob.Master.Race != ObjectType.Player)) { return; } if (ob.Dead || ob.HealAmount != 0 || ob.PercentHealth == 100) { return; } ob.HealAmount += 25; Broadcast(new S.ObjectEffect { ObjectID = ob.ObjectID, Effect = SpellEffect.Healing }); break; case Spell.PoisonCloud: if (ob.Race != ObjectType.Player && ob.Race != ObjectType.Monster) { return; } if (ob.Dead) { return; } if (!ob.IsAttackTarget(Caster)) { return; } ob.Attacked(Caster, Value, DefenceType.MAC, false); if (!ob.Dead) { ob.ApplyPoison(new Poison { Duration = 15, Owner = Caster, PType = PoisonType.Green, TickSpeed = 2000, Value = Value / 20 }, Caster, false, false); } break; case Spell.HealingCircle: //五行阵 if (ob.Race != ObjectType.Player && ob.Race != ObjectType.Monster) { return; } if (ob.Dead) { return; } //伤害敌军 if (ob.IsAttackTarget(Caster)) { ob.Attacked(Caster, Value * 10 / 8, DefenceType.MAC, false); } else if (ob.IsFriendlyTarget(Caster)) //治疗友军 { //if (ob.HealAmount != 0 || ob.PercentHealth == 100) return; if (ob.HealAmount > Value * 2 || ob.PercentHealth == 100) { return; } ob.HealAmount += (ushort)(Value * 2); Broadcast(new S.ObjectEffect { ObjectID = ob.ObjectID, Effect = SpellEffect.Healing }); } break; case Spell.MoonMist: //月影雾 if (ob.Race != ObjectType.Player && ob.Race != ObjectType.Monster) { return; } if (ob.Dead) { return; } //伤害敌军 if (ob.IsAttackTarget(Caster)) { ob.Attacked(Caster, Value * 10 / 8, DefenceType.MAC, false); } break; case Spell.Blizzard: if (ob.Race != ObjectType.Player && ob.Race != ObjectType.Monster) { return; } if (ob.Dead) { return; } if (Caster != null && Caster.ActiveBlizzard == false) { return; } if (!ob.IsAttackTarget(Caster)) { return; } ob.Attacked(Caster, Value, DefenceType.MAC, false); if (!ob.Dead && Envir.Random.Next(8) == 0) { ob.ApplyPoison(new Poison { Duration = 5 + Envir.Random.Next(Caster.Freezing), Owner = Caster, PType = PoisonType.Slow, TickSpeed = 2000, }, Caster); } break; case Spell.MeteorStrike: if (ob.Race != ObjectType.Player && ob.Race != ObjectType.Monster) { return; } if (ob.Dead) { return; } if (Caster != null && Caster.ActiveBlizzard == false) { return; } if (!ob.IsAttackTarget(Caster)) { return; } ob.Attacked(Caster, Value, DefenceType.MAC, false); break; case Spell.ExplosiveTrap: if (ob.Race != ObjectType.Player && ob.Race != ObjectType.Monster) { return; } if (ob.Dead) { return; } if (!ob.IsAttackTarget(Caster)) { return; } if (DetonatedTrap) { return; //make sure explosion happens only once } DetonateTrapNow(); ob.Attacked(Caster, Value, DefenceType.MAC, false); break; case Spell.MapLava: if (ob is PlayerObject) { PlayerObject pOb = (PlayerObject)ob; if (pOb.Observer) { return; } //这里要有伤害啊 ob.Struck(Value, DefenceType.MAC); } break; case Spell.MapLightning: { if (ob is PlayerObject player) { if (player.Account.AdminAccount && player.Observer) { return; } player.Struck(Value, DefenceType.MAC); } } break; case Spell.MapQuake1: case Spell.MapQuake2: if (Value == 0) { return; } if (ob.Race != ObjectType.Player && ob.Race != ObjectType.Monster) { return; } if (ob.Dead) { return; } ob.Struck(Value, DefenceType.MAC); break; case Spell.Portal: if (ob.Race != ObjectType.Player) { return; } if (Caster != ob && (Caster == null || (Caster.GroupMembers == null) || (!Caster.GroupMembers.Contains((PlayerObject)ob)))) { return; } if (ExitMap == null) { return; } MirDirection dir = ob.Direction; Point newExit = Functions.PointMove(ExitCoord, dir, 1); if (!ExitMap.ValidPoint(newExit)) { return; } ob.Teleport(ExitMap, newExit, false); Value = Value - 1; if (Value < 1) { ExpireTime = Envir.Time; return; } break; case Spell.MonKITO: if (Tick == 2) { Param = true; Broadcast(GetInfo()); ExpireTime = Envir.Time; listtargets = CurrentMap.getMapObjects(CurrentLocation.X, CurrentLocation.Y, 2); for (int o = 0; o < listtargets.Count; o++) { MapObject _ob = listtargets[o]; if (_ob.Race != ObjectType.Player && _ob.Race != ObjectType.Monster) { continue; } if (!_ob.IsAttackTarget(MonCaster)) { continue; } _ob.Attacked(MonCaster, Value, DefenceType.MAC); } } break; case Spell.MonFireCircle: if (Tick >= 6) { ExpireTime = Envir.Time; } if (Tick > 1) { Param = true; Broadcast(GetInfo()); Param = false; listtargets = CurrentMap.getMapObjects(CurrentLocation.X, CurrentLocation.Y, 2); for (int o = 0; o < listtargets.Count; o++) { MapObject _ob = listtargets[o]; if (_ob.Race != ObjectType.Player && _ob.Race != ObjectType.Monster) { continue; } if (!_ob.IsAttackTarget(MonCaster)) { continue; } _ob.Attacked(MonCaster, Value, DefenceType.MAC); } } break; case Spell.MonPoisonFog: if (ob.Race != ObjectType.Player && ob.Race != ObjectType.Monster) { return; } if (ob.Dead) { return; } if (!ob.IsAttackTarget(MonCaster)) { return; } ob.Attacked(MonCaster, Value, DefenceType.MAC); break; case Spell.MonRotateAxe: if (Tick > 1) { listtargets = CurrentMap.getMapObjects(CurrentLocation.X, CurrentLocation.Y, 2); for (int o = 0; o < listtargets.Count; o++) { MapObject _ob = listtargets[o]; if (_ob.Race != ObjectType.Player && _ob.Race != ObjectType.Monster) { continue; } if (!_ob.IsAttackTarget(MonCaster)) { continue; } _ob.Attacked(MonCaster, Value, DefenceType.MAC); } } break; case Spell.MonGhostFlag1: //鬼旗,附近5格的友军,解毒,加血 if (Tick > 1) { listtargets = CurrentMap.getMapObjects(CurrentLocation.X, CurrentLocation.Y, 5); for (int o = 0; o < listtargets.Count; o++) { MapObject _ob = listtargets[o]; if (_ob.Race != ObjectType.Player && _ob.Race != ObjectType.Monster) { continue; } if (!_ob.IsFriendlyTarget(MonCaster)) { continue; } _ob.PoisonList.Clear(); _ob.HealAmount = (ushort)Math.Min(ushort.MaxValue, _ob.HealAmount + Value); } } break; case Spell.MonGhostHead: if (Tick >= RandomUtils.Next(2, 5)) { Param = true; Broadcast(GetInfo()); ExpireTime = Envir.Time; listtargets = CurrentMap.getMapObjects(CurrentLocation.X, CurrentLocation.Y, 2); for (int o = 0; o < listtargets.Count; o++) { MapObject _ob = listtargets[o]; if (_ob.Race != ObjectType.Player && _ob.Race != ObjectType.Monster) { continue; } if (!_ob.IsAttackTarget(MonCaster)) { continue; } _ob.Attacked(MonCaster, Value, DefenceType.MAC); } } break; } }