Esempio n. 1
0
            private void Slice()
            {
                if (Deleted || !Alive)
                {
                    StopTimer();
                    return;
                }

                if (Aspect == null || Aspect.Deleted || !Aspect.Alive || !Aspect.InRange(this, Aspect.RangePerception * 2))
                {
                    Destroy();
                    return;
                }

                if (!Aspect.InCombat())
                {
                    return;
                }

                if (_Spawn == null)
                {
                    _Spawn = ListPool <ISpawnable> .AcquireObject();
                }

                if (_Spawn.Count < 3)
                {
                    var s = new Tinker(Aspect);

                    _Spawn.Add(s);

                    s.Spawner = this;

                    Register(s);

                    var p = this.GetRandomPoint3D(1, 2, Map, true, true);

                    s.OnBeforeSpawn(p, Map);
                    s.MoveToWorld(p, Map);
                    s.OnAfterSpawn();
                }
            }
            public override void OnThink()
            {
                base.OnThink();

                if (Deleted || !Alive || !Aspect.InCombat())
                {
                    return;
                }

                if (!this.InCombat() && Utility.RandomDouble() < 0.01)
                {
                    var t = Aspect.AcquireRandomTarget(Aspect.RangePerception);

                    if (t != null)
                    {
                        if (this.PlayAttackAnimation())
                        {
                            this.PlayAttackSound();
                        }

                        MoveToWorld(t.Location, t.Map);
                    }
                }

                if (_Aura == null)
                {
                    _Aura = new EnergyExplodeEffect(Location, Map, 2)
                    {
                        AverageZ      = false,
                        Reversed      = true,
                        Interval      = TimeSpan.FromMilliseconds(500.0),
                        EffectMutator = e =>
                        {
                            if (e.ProcessIndex == 0 && Utility.RandomDouble() < 0.33)
                            {
                                e.SoundID = 252;
                            }

                            e.Hue = Hue;
                        },
                        EffectHandler = HandleAura,
                        Callback      = () =>
                        {
                            if (this.PlayAttackAnimation())
                            {
                                this.PlayAttackSound();
                            }
                        }
                    };
                }

                if (_Aura.Sending || Core.TickCount < _NextAura)
                {
                    return;
                }

                _NextAura = Core.TickCount + 5000;

                _Aura.Start = Location;
                _Aura.Map   = Map;
                _Aura.Send();
            }
            public override void OnThink()
            {
                base.OnThink();

                if (Deleted || !Alive || Aspect == null || !Aspect.InCombat() || Core.TickCount < _NextHeal)
                {
                    return;
                }

                if (ControlMaster != Aspect)
                {
                    ControlMaster = Aspect;
                }

                if (ControlTarget != Aspect)
                {
                    ControlTarget = Aspect;
                }

                if (ControlOrder != OrderType.Follow)
                {
                    ControlOrder = OrderType.Follow;
                }

                if (!InRange(Aspect, Aspect.RangePerception))
                {
                    AIObject.MoveTo(Aspect, true, Aspect.RangePerception);

                    return;
                }

                _NextHeal = Core.TickCount + 5000;

                var q = new MovingEffectQueue();

                q.Callback = q.Dispose;

                for (var i = 0; i < 5; i++)
                {
                    var fx = new MovingEffectInfo(
                        this,
                        Aspect,
                        Map,
                        0x36F4,
                        1150,
                        10,
                        EffectRender.LightenMore,
                        TimeSpan.FromMilliseconds(200));

                    fx.ImpactCallback += HealAspect;

                    q.Add(fx);
                }

                if (this.PlayAttackAnimation())
                {
                    this.PlayAttackSound();

                    this.TryParalyze(
                        TimeSpan.FromSeconds(1.5),
                        m =>
                    {
                        SpellHelper.Turn(m, Aspect);

                        q.Process();
                    });
                }
                else
                {
                    SpellHelper.Turn(this, Aspect);

                    q.Process();
                }
            }