protected override void OnAttackedByEnemy(DOL.GS.AttackData ad) { base.OnAttackedByEnemy(ad); if (ad.Attacker == Body.TargetObject) { m_targetLastAD = ad; m_style = StyleChooser.GetBestStyle(Body, m_lastAD, m_targetLastAD); Body.NextCombatStyle = m_style; } }
public override bool Start() { if (!base.Start()) { return(false); } if (Body != null) { Body.NextCombatBackupStyle = StyleChooser.GetBestStyle(Body, null, null); } return(true); }
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); } }