/// <summary> /// Apply effect on target or do spell action if non duration spell /// </summary> /// <param name="target">target that gets the effect</param> /// <param name="effectiveness">factor from 0..1 (0%-100%)</param> public override void ApplyEffectOnTarget(GameLiving target, double effectiveness) { GamePlayer player = Caster as GamePlayer; if (player == null) { return; } INpcTemplate template = NpcTemplateMgr.GetTemplate(Spell.LifeDrainReturn); if (template == null) { if (log.IsWarnEnabled) { log.WarnFormat("NPC template {0} not found! Spell: {1}", Spell.LifeDrainReturn, Spell.ToString()); } MessageToCaster("NPC template " + Spell.LifeDrainReturn + " not found!", eChatType.CT_System); return; } Point2D summonloc; beffect = CreateSpellEffect(target, effectiveness); { summonloc = target.GetPointFromHeading(target.Heading, 64); BrittleBrain controlledBrain = new BrittleBrain(player); controlledBrain.IsMainPet = false; summoned = new GameNPC(template); summoned.SetOwnBrain(controlledBrain); summoned.X = summonloc.X; summoned.Y = summonloc.Y; summoned.Z = target.Z; summoned.CurrentRegion = target.CurrentRegion; summoned.Heading = (ushort)((target.Heading + 2048) % 4096); summoned.Realm = target.Realm; summoned.CurrentSpeed = 0; summoned.Level = 1; summoned.Size = 10; summoned.AddToWorld(); controlledBrain.AggressionState = eAggressionState.Passive; GameEventMgr.AddHandler(summoned, GameLivingEvent.Dying, new DOLEventHandler(GuardDie)); beffect.Start(Caster); } }
/// <summary> /// Apply effect on target or do spell action if non duration spell /// </summary> /// <param name="target">target that gets the effect</param> /// <param name="effectiveness">factor from 0..1 (0%-100%)</param> public override void ApplyEffectOnTarget(GameLiving target, double effectiveness) { if (!(Caster is GamePlayer player)) { return; } INpcTemplate template = NpcTemplateMgr.GetTemplate(Spell.LifeDrainReturn); if (template == null) { if (log.IsWarnEnabled) { log.Warn($"NPC template {Spell.LifeDrainReturn} not found! Spell: {Spell}"); } MessageToCaster($"NPC template {Spell.LifeDrainReturn} not found!", eChatType.CT_System); return; } beffect = CreateSpellEffect(target, effectiveness); { var summonloc = target.GetPointFromHeading(target.Heading, 64); BrittleBrain controlledBrain = new BrittleBrain(player); controlledBrain.IsMainPet = false; summoned = new GameNPC(template); summoned.SetOwnBrain(controlledBrain); summoned.X = summonloc.X; summoned.Y = summonloc.Y; summoned.Z = target.Z; summoned.CurrentRegion = target.CurrentRegion; summoned.Heading = (ushort)((target.Heading + 2048) % 4096); summoned.Realm = target.Realm; summoned.CurrentSpeed = 0; summoned.Level = Caster.Level; summoned.Size = 50; summoned.AddToWorld(); controlledBrain.AggressionState = eAggressionState.Passive; beffect.Start(Caster); } }
/// <summary> /// Apply effect on target or do spell action if non duration spell /// </summary> /// <param name="target">target that gets the effect</param> /// <param name="effectiveness">factor from 0..1 (0%-100%)</param> public override void ApplyEffectOnTarget(GameLiving target, double effectiveness) { GamePlayer player = Caster as GamePlayer; if (player == null) { return; } INpcTemplate template = NpcTemplateMgr.GetTemplate(Spell.LifeDrainReturn); if (template == null) { if (log.IsWarnEnabled) log.WarnFormat("NPC template {0} not found! Spell: {1}", Spell.LifeDrainReturn, Spell.ToString()); MessageToCaster("NPC template " + Spell.LifeDrainReturn + " not found!", eChatType.CT_System); return; } Point2D summonloc; beffect = CreateSpellEffect(target, effectiveness); { summonloc = target.GetPointFromHeading( target.Heading, 64 ); BrittleBrain controlledBrain = new BrittleBrain(player); controlledBrain.IsMainPet = false; summoned = new GameNPC(template); summoned.SetOwnBrain(controlledBrain); summoned.X = summonloc.X; summoned.Y = summonloc.Y; summoned.Z = target.Z; summoned.CurrentRegion = target.CurrentRegion; summoned.Heading = (ushort)((target.Heading + 2048) % 4096); summoned.Realm = target.Realm; summoned.CurrentSpeed = 0; summoned.Level = 1; summoned.Size = 10; summoned.AddToWorld(); controlledBrain.AggressionState = eAggressionState.Passive; GameEventMgr.AddHandler(summoned, GameLivingEvent.Dying, new DOLEventHandler(GuardDie)); beffect.Start(Caster); } }
public override void Notify(DOL.Events.DOLEvent e, object sender, EventArgs args) { base.Notify(e, sender, args); // Some interesting events we might want to respond to: //GameObjectEvent.TakeDamage //GameLivingEvent.AttackedByEnemy //GameLivingEvent.AttackFinished //GameLivingEvent.Dying //GameLivingEvent.EnemyKilled //GameLivingEvent.Moving //GameNPCEvent.TurnTo //GameNPCEvent.TurnToHeading if (sender != Body) { return; } if (e == GameLivingEvent.AttackFinished) { AttackData ad = (args as AttackFinishedEventArgs).AttackData; m_lastAD = ad; m_style = StyleChooser.GetBestStyle(Body, m_lastAD, m_targetLastAD); Body.NextCombatStyle = m_style; GameLiving target = ad.Target; // Maneuvering may fail if the target is up against a wall or something - then again, mobs can generally walk through walls // Let it fail? Or maneuver closer (say, 5 units instead of 65)? if (m_style != null && m_style.OpeningRequirementType == Style.eOpening.Positional) { float angle = target.GetAngle(Body); Point2D positionalPoint; switch (m_style.OpeningRequirementValue) { case (int)Style.eOpeningPosition.Front: if (!(angle >= 315 || angle < 45)) { positionalPoint = target.GetPointFromHeading(Body.Heading, 65); Body.WalkTo(positionalPoint.X, positionalPoint.Y, target.Z, 1250); } break; case (int)Style.eOpeningPosition.Side: if (!(angle >= 45 && angle < 150) && !(angle >= 210 && angle < 315)) { positionalPoint = target.GetPointFromHeading((ushort)(target.Heading + (110.0 * (4096.0 / 360.0))), 65); Body.WalkTo(positionalPoint.X, positionalPoint.Y, target.Z, 1250); } break; case (int)Style.eOpeningPosition.Back: if (!(angle >= 150 && angle < 210)) { positionalPoint = target.GetPointFromHeading((ushort)((target.Heading + 2048) & 0xFFF), 65); Body.WalkTo(positionalPoint.X, positionalPoint.Y, target.Z, 1250); } break; } Body.TurnTo(target); } // mobs often "forget" to wield their weapon after getting stunned - this is an attempt to get them to wield it if (m_style != null) { if (Body.ActiveWeaponSlot == GameLiving.eActiveWeaponSlot.TwoHanded && Body.Inventory != null && Body.Inventory.GetItem(eInventorySlot.TwoHandWeapon) != null) { Body.SwitchWeapon(GameLiving.eActiveWeaponSlot.TwoHanded); } else { Body.SwitchWeapon(GameLiving.eActiveWeaponSlot.Standard); } } } else { base.Notify(e, sender, args); } }