Ejemplo n.º 1
0
        /// <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);
            }
        }
Ejemplo n.º 2
0
        /// <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);
            }
        }
Ejemplo n.º 3
0
		/// <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);
			}
		}
Ejemplo n.º 4
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);
            }
        }