Пример #1
0
        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);
            }
        }