private static void Flash2(AbilityBuilder builder)
        {
            builder.Create(Feat.Flash2, PerkType.Flash)
            .Name("Flash II")
            .HasRecastDelay(RecastGroup.Flash, 60f)
            .RequirementStamina(20)
            .UsesActivationType(AbilityActivationType.Casted)
            .HasImpactAction((activator, target, level) =>
            {
                var nth    = 1;
                var nearby = GetNearestCreature(Type.IsAlive, 1, target, nth);
                while (GetIsObjectValid(nearby))
                {
                    if (GetDistanceBetween(target, nearby) > 5.0f)
                    {
                        break;
                    }

                    ApplyEffectToObject(DurationType.Instant, EffectVisualEffect(VisualEffect.Vfx_Imp_Pdk_Generic_Head_Hit), nearby);
                    StatusEffect.Apply(activator, nearby, StatusEffectType.Blind2, 45f);
                    Enmity.ModifyEnmity(activator, nearby, 50);

                    nth++;
                    nearby = GetNearestCreature(Type.IsAlive, 1, target, nth);
                }

                ApplyEffectToObject(DurationType.Instant, EffectVisualEffect(VisualEffect.Vfx_Imp_Pdk_Generic_Pulse), activator);
            });
        }
예제 #2
0
        private static void Raise(AbilityBuilder builder)
        {
            builder.Create(Feat.Raise, PerkType.Raise)
            .Name("Raise I")
            .HasRecastDelay(RecastGroup.Raise, 60f)
            .HasActivationDelay(15f)
            .RequirementMP(25)
            .UsesActivationType(AbilityActivationType.Casted)
            .HasCustomValidation((activator, target, level) =>
            {
                if (GetCurrentHitPoints(target) > -11 ||
                    !GetIsDead(target))
                {
                    return("Your target is still alive.");
                }

                return(string.Empty);
            })
            .HasImpactAction((activator, target, level) =>
            {
                ApplyEffectToObject(DurationType.Instant, EffectResurrection(), target);

                CombatPoint.AddCombatPointToAllTagged(activator, SkillType.WhiteMagic, 5);
                Enmity.ModifyEnmityOnAll(activator, 60);
            });
        }
        private static void Poisona(AbilityBuilder builder)
        {
            builder.Create(Feat.Poisona, PerkType.Poisona)
            .Name("Poisona")
            .HasRecastDelay(RecastGroup.Raise, 60f)
            .HasActivationDelay(1f)
            .RequirementMP(4)
            .UsesActivationType(AbilityActivationType.Casted)
            .HasCustomValidation((activator, target, level) =>
            {
                if (!StatusEffect.HasStatusEffect(target, StatusEffectType.Poison1) &&
                    !StatusEffect.HasStatusEffect(target, StatusEffectType.Poison2) &&
                    !StatusEffect.HasStatusEffect(target, StatusEffectType.Poison3))
                {
                    return("Your target is not poisoned.");
                }

                return(string.Empty);
            })
            .HasImpactAction((activator, target, level) =>
            {
                StatusEffect.Remove(target, StatusEffectType.Poison1);
                StatusEffect.Remove(target, StatusEffectType.Poison2);
                StatusEffect.Remove(target, StatusEffectType.Poison3);

                ApplyEffectToObject(DurationType.Instant, EffectVisualEffect(VisualEffect.Vfx_Imp_Head_Nature), target);

                CombatPoint.AddCombatPointToAllTagged(activator, SkillType.WhiteMagic, 3);
                Enmity.ModifyEnmity(activator, target, 6);
            });
        }
예제 #4
0
        private static void Curaga1(AbilityBuilder builder)
        {
            builder.Create(Feat.Curaga1, PerkType.Curaga)
            .Name("Curaga I")
            .HasRecastDelay(RecastGroup.Curaga1, 12f)
            .HasActivationDelay(4.0f)
            .RequirementMP(12)
            .UsesActivationType(AbilityActivationType.Casted)
            .DisplaysVisualEffectWhenActivating()
            .HasImpactAction((activator, target, level) =>
            {
                var bonus = GetAbilityModifier(AbilityType.Wisdom, activator);

                foreach (var member in Party.GetAllPartyMembersWithinRange(activator, 5.0f))
                {
                    var amount = Random.D6(2) + bonus;

                    ApplyEffectToObject(DurationType.Instant, GetRacialType(target) == RacialType.Undead
                            ? EffectDamage(amount)
                            : EffectHeal(amount), target);

                    ApplyEffectToObject(DurationType.Instant, EffectVisualEffect(VisualEffect.Vfx_Imp_Healing_S), member);

                    Enmity.ModifyEnmityOnAll(activator, amount);
                }

                CombatPoint.AddCombatPointToAllTagged(activator, SkillType.WhiteMagic, 3);
            });
        }
        public static void ApplyLifeStealRecovery()
        {
            var target             = OBJECT_SELF;
            var lifeStealAmount    = GetLocalFloat(target, LifeStealVariableName);
            var lifeStealActivator = GetLocalObject(target, LifeStealActivatorVariableName);

            if (lifeStealAmount <= 0.0f)
            {
                return;
            }

            var damageDetails = Damage.GetDamageEventData();

            if (lifeStealActivator != damageDetails.Damager)
            {
                return;
            }

            var recoveryAmount = (int)(damageDetails.Total * lifeStealAmount);

            ApplyEffectToObject(DurationType.Instant, EffectHeal(recoveryAmount), lifeStealActivator);
            ApplyEffectToObject(DurationType.Instant, EffectVisualEffect(VisualEffect.Vfx_Imp_Healing_S), lifeStealActivator);

            Enmity.ModifyEnmity(lifeStealActivator, target, recoveryAmount + 6);
            CombatPoint.AddCombatPoint(lifeStealActivator, target, SkillType.Thievery, 2);

            DeleteLocalFloat(target, LifeStealVariableName);
            DeleteLocalObject(target, LifeStealActivatorVariableName);
        }
예제 #6
0
        private static void Cover3(AbilityBuilder builder)
        {
            builder.Create(Feat.Cover3, PerkType.Cover)
            .Name("Cover III")
            .HasRecastDelay(RecastGroup.Cover, 120f)
            .RequirementStamina(12)
            .UsesActivationType(AbilityActivationType.Casted)
            .DisplaysVisualEffectWhenActivating(VisualEffect.None)
            .HasCustomValidation((activator, target, level) =>
            {
                if (activator == target)
                {
                    return("You cannot Cover yourself.");
                }

                return(string.Empty);
            })
            .HasImpactAction((activator, target, level) =>
            {
                var length = 60f + GetAbilityModifier(AbilityType.Constitution, activator) * 2f;
                StatusEffect.Apply(activator, target, StatusEffectType.Cover3, length);
                ApplyEffectToObject(DurationType.Instant, EffectVisualEffect(VisualEffect.Vfx_Dur_Prot_Epic_Armor), target);

                Enmity.ModifyEnmityOnAll(activator, 10);
                CombatPoint.AddCombatPointToAllTagged(activator, SkillType.Chivalry, 3);
            });
        }
예제 #7
0
        public Dictionary <Feat, AbilityDetail> BuildAbilities()
        {
            var builder = new AbilityBuilder()
                          .Create(Feat.Sleep, PerkType.Sleep)
                          .Name("Sleep")
                          .HasRecastDelay(RecastGroup.Sleep, 12f)
                          .HasActivationDelay(2f)
                          .RequirementMP(8)
                          .UsesActivationType(AbilityActivationType.Casted)
                          .DisplaysVisualEffectWhenActivating()
                          .HasImpactAction((activator, target, level) =>
            {
                var resistance   = Resistance.GetResistance(target, ResistanceType.Sleep);
                var baseDuration = Random.NextFloat(15.0f, 30.0f);
                var duration     = baseDuration * resistance;

                StatusEffect.Apply(activator, target, StatusEffectType.Sleep, duration);
                Resistance.ModifyResistance(target, ResistanceType.Sleep, -0.25f);

                CombatPoint.AddCombatPoint(activator, target, SkillType.BlackMagic, 3);
                Enmity.ModifyEnmity(activator, target, 18);
            });

            return(builder.Build());
        }
        private static void RecoveryStab3(AbilityBuilder builder)
        {
            builder.Create(Feat.RecoveryStab3, PerkType.RecoveryStab)
            .Name("Recovery Stab III")
            .HasRecastDelay(RecastGroup.RecoveryStab, 60f)
            .RequirementStamina(16)
            .UsesActivationType(AbilityActivationType.Weapon)
            .HasImpactAction((activator, target, level) =>
            {
                var bonus = GetAbilityModifier(AbilityType.Wisdom, activator);
                foreach (var member in Party.GetAllPartyMembersWithinRange(activator, 5.0f))
                {
                    var amount   = Random.D8(3) + bonus;
                    var duration = 24f;

                    if (StatusEffect.HasStatusEffect(activator, StatusEffectType.DeliberateStab))
                    {
                        duration *= 2f;
                    }

                    ApplyEffectToObject(DurationType.Instant, EffectHeal(amount), member);
                    ApplyEffectToObject(DurationType.Instant, EffectVisualEffect(VisualEffect.Vfx_Imp_Healing_S), member);
                    ApplyEffectToObject(DurationType.Temporary, EffectRegenerate(1, 6f), member, duration);


                    Enmity.ModifyEnmityOnAll(activator, amount + 6);
                }

                CombatPoint.AddCombatPointToAllTagged(activator, SkillType.RedMagic, 3);
                Enmity.ModifyEnmityOnAll(activator, 10);
            });
        }
예제 #9
0
        private static void TransferStamina1(AbilityBuilder builder)
        {
            builder.Create(Feat.TransferStamina1, PerkType.TransferStamina)
            .Name("Transfer Stamina I")
            .HasRecastDelay(RecastGroup.Transfer, 60f)
            .RequirementMP(20)
            .UsesActivationType(AbilityActivationType.Casted)
            .HasActivationDelay(4f)
            .HasCustomValidation((activator, target, level) =>
            {
                if (!GetIsPC(target) || GetIsDM(target))
                {
                    return("Only players may be targeted with this ability.");
                }

                return(string.Empty);
            })
            .HasImpactAction((activator, target, level) =>
            {
                const int BaseTransferAmount = 10;

                var playerId = GetObjectUUID(target);
                var dbPlayer = DB.Get <Player>(playerId);
                Stat.RestoreStamina(target, dbPlayer, BaseTransferAmount);
                DB.Set(playerId, dbPlayer);

                CombatPoint.AddCombatPointToAllTagged(activator, SkillType.RedMagic, 2);
                Enmity.ModifyEnmityOnAll(activator, 6);
            });
        }
        private static void Provoke2(AbilityBuilder builder)
        {
            builder.Create(Feat.Provoke2, PerkType.Provoke)
            .Name("Provoke II")
            .HasRecastDelay(RecastGroup.Provoke2, 90f)
            .RequirementStamina(15)
            .UsesActivationType(AbilityActivationType.Casted)
            .HasImpactAction((activator, target, level) =>
            {
                var nth    = 1;
                var nearby = GetNearestCreature(CreatureType.IsAlive, 1, target, nth);
                while (GetIsObjectValid(nearby))
                {
                    if (GetDistanceBetween(target, nearby) > 5.0f)
                    {
                        break;
                    }

                    ApplyEffectToObject(DurationType.Instant, EffectVisualEffect(VisualEffect.Vfx_Imp_Destruction), nearby);
                    Enmity.ModifyEnmity(activator, nearby, 30);

                    nth++;
                    nearby = GetNearestCreature(CreatureType.IsAlive, 1, target, nth);
                }
            });
        }
예제 #11
0
        public static void IncreaseEnmityOnBoy()
        {
            var player       = GetLastUsedBy();
            var boy          = GetObjectByTag("ENMITY_TARGET");
            var lastAttacker = GetLastAttacker(player);

            Enmity.ModifyEnmity(boy, lastAttacker, 999);
        }
        private static void Convert(AbilityBuilder builder)
        {
            builder.Create(Feat.Convert, PerkType.Convert)
            .Name("Convert")
            .HasRecastDelay(RecastGroup.Convert, 600f)
            .UsesActivationType(AbilityActivationType.Casted)
            .HasCustomValidation((activator, target, level) =>
            {
                if (!GetIsPC(activator) || GetIsDM(activator))
                {
                    return("Only players may use this ability.");
                }

                var playerId = GetObjectUUID(activator);
                var dbPlayer = DB.Get <Player>(playerId);

                if (dbPlayer.MP <= 0)
                {
                    return("Your MP is too low to convert.");
                }

                return(string.Empty);
            })
            .HasImpactAction((activator, target, level) =>
            {
                var playerId = GetObjectUUID(activator);
                var dbPlayer = DB.Get <Player>(playerId);

                var currentHP = GetCurrentHitPoints(activator);
                var currentMP = dbPlayer.MP;

                // Set MP to 0 then do a restore by the player's HP.
                dbPlayer.MP = 0;
                Stat.RestoreMP(activator, dbPlayer, currentHP);
                DB.Set(playerId, dbPlayer);

                // Current HP is higher than MP. Deal damage.
                if (currentHP > currentMP)
                {
                    var damageAmount = currentHP - currentMP;
                    ApplyEffectToObject(DurationType.Instant, EffectDamage(damageAmount), activator);
                }
                // Current HP is lower than MP. Heal damage.
                else if (currentHP < currentMP)
                {
                    var recoverAmount = currentMP - currentHP;
                    ApplyEffectToObject(DurationType.Instant, EffectHeal(recoverAmount), activator);
                }

                ApplyEffectToObject(DurationType.Instant, EffectVisualEffect(VisualEffect.Vfx_Imp_Good_Help), activator);

                CombatPoint.AddCombatPointToAllTagged(activator, SkillType.RedMagic, 5);
                Enmity.ModifyEnmityOnAll(activator, 10);
            });
        }
예제 #13
0
        public EnmityViewModel(
            Enmity config,
            TargetInfoModel model)
        {
            this.config = config ?? Settings.Instance.Enmity;
            this.model  = model ?? TargetInfoModel.Instance;

            this.RaisePropertyChanged(nameof(Config));
            this.RaisePropertyChanged(nameof(Model));

            this.Initialize();
        }
        private static void AttemptSteal(uint activator, uint target, int baseChance)
        {
            var delta = 0.0f;

            // Players who use this ability have their Thievery skill checked against the CR
            // of the target. Other users simply have a delta of zero.
            if (GetIsPC(activator) && !GetIsDM(activator))
            {
                var playerId = GetObjectUUID(activator);
                var dbPlayer = DB.Get <Player>(playerId);
                var cr       = GetChallengeRating(target) * 3;
                var thievery = dbPlayer.Skills[SkillType.Thievery];

                delta = (thievery.Rank - cr) * 0.01f;
            }

            var chance = baseChance + (delta * baseChance);

            if (chance < 1)
            {
                chance = 1;
            }
            else if (chance > 95)
            {
                chance = 95;
            }

            if (Random.D100(1) <= chance)
            {
                for (var item = GetFirstItemInInventory(target); GetIsObjectValid(item); item = GetNextItemInInventory(target))
                {
                    // This item can be stolen. Copy it to the thief now.
                    if (GetLocalBool(item, "STEAL_ITEM"))
                    {
                        DeleteLocalBool(item, "STEAL_ITEM");
                        CopyItem(item, activator, true);

                        Messaging.SendMessageNearbyToPlayers(activator, $"{GetName(activator)} successfully steals '{GetName(item)}' from {GetName(target)}.");

                        DestroyObject(item);
                        break;
                    }
                }
            }
            else
            {
                SendMessageToPC(activator, $"You failed to steal from {GetName(target)}.");
            }

            CombatPoint.AddCombatPoint(activator, target, SkillType.Thievery, 3);
            Enmity.ModifyEnmity(activator, target, 5);
        }
 private static void Provoke1(AbilityBuilder builder)
 {
     builder.Create(Feat.Provoke1, PerkType.Provoke)
     .Name("Provoke I")
     .HasRecastDelay(RecastGroup.Provoke1, 30f)
     .RequirementStamina(2)
     .UsesActivationType(AbilityActivationType.Casted)
     .HasImpactAction((activator, target, level) =>
     {
         ApplyEffectToObject(DurationType.Instant, EffectVisualEffect(VisualEffect.Vfx_Imp_Destruction), target);
         Enmity.ModifyEnmity(activator, target, 50);
     });
 }
예제 #16
0
        /// <summary>
        /// Returns the creature with the highest enmity on this enemy's enmity table.
        /// If no target can be determined, OBJECT_INVALID will be returned.
        /// </summary>
        /// <returns>The creature with the highest enmity, or OBJECT_INVALID if it cannot be determined.</returns>
        private static uint GetTarget()
        {
            var self        = OBJECT_SELF;
            var enmityTable = Enmity.GetEnmityTable(self);

            if (enmityTable.Count <= 0)
            {
                return(OBJECT_INVALID);
            }

            var highest = enmityTable.OrderByDescending(o => o.Value).First();

            return(highest.Key);
        }
예제 #17
0
        public static void OnPlayerDamaged()
        {
            NWPlayer   player = (Object.OBJECT_SELF);
            NWCreature npc    = (_.GetLastDamager(Object.OBJECT_SELF));

            if (!player.IsPlayer || !npc.IsNPC)
            {
                return;
            }

            int    damage = _.GetTotalDamageDealt();
            Enmity enmity = GetEnmity(npc, player);

            enmity.CumulativeAmount -= damage;
        }
예제 #18
0
        /// <summary>
        /// Returns the creature with the highest enmity on this enemy's enmity table.
        /// If no target can be determined, OBJECT_INVALID will be returned.
        /// </summary>
        /// <returns>The creature with the highest enmity, or OBJECT_INVALID if it cannot be determined.</returns>
        private static uint GetTarget()
        {
            var self        = OBJECT_SELF;
            var enmityTable = Enmity.GetEnmityTable(self);

            if (enmityTable.Count <= 0)
            {
                return(OBJECT_INVALID);
            }

            var highest = enmityTable.OrderByDescending(o => o.Value).First();

            //Console.WriteLine($"target = {GetName(highest.Key)}, enmity = {highest.Value}"); // todo debugging
            return(highest.Key);
        }
 private static void Invincible(AbilityBuilder builder)
 {
     builder.Create(Feat.Invincible, PerkType.Invincible)
     .Name("Invincible")
     .HasRecastDelay(RecastGroup.OneHourAbility, 3600f)
     .UsesActivationType(AbilityActivationType.Casted)
     .RequirementStamina(50)
     .HasImpactAction((activator, target, level) =>
     {
         StatusEffect.Apply(activator, target, StatusEffectType.Invincible, 30.0f);
         CombatPoint.AddCombatPointToAllTagged(activator, SkillType.Chivalry, 5);
         Enmity.ModifyEnmityOnAll(activator, 500);
         ApplyEffectToObject(DurationType.Instant, EffectVisualEffect(VisualEffect.Vfx_Fnf_Sound_Burst), target);
     });
 }
        private static void Refresh(AbilityBuilder builder)
        {
            builder.Create(Feat.Refresh, PerkType.Refresh)
            .Name("Refresh")
            .HasRecastDelay(RecastGroup.Refresh, 18f)
            .RequirementMP(12)
            .UsesActivationType(AbilityActivationType.Casted)
            .HasImpactAction((activator, target, level) =>
            {
                StatusEffect.Apply(activator, target, StatusEffectType.Refresh, 180f);
                ApplyEffectToObject(DurationType.Instant, EffectVisualEffect(VisualEffect.Vfx_Imp_Head_Mind), target);

                Enmity.ModifyEnmityOnAll(activator, 6);
                CombatPoint.AddCombatPointToAllTagged(activator, SkillType.RedMagic, 3);
            });
        }
예제 #21
0
        private static void Blind1(AbilityBuilder builder)
        {
            builder.Create(Feat.Blind1, PerkType.Blind)
            .Name("Blind I")
            .HasRecastDelay(RecastGroup.Blind, 12f)
            .RequirementMP(6)
            .UsesActivationType(AbilityActivationType.Casted)
            .HasActivationDelay(2f)
            .HasImpactAction((activator, target, level) =>
            {
                StatusEffect.Apply(activator, target, StatusEffectType.Blind1, 15f);

                Enmity.ModifyEnmity(activator, target, 4);
                CombatPoint.AddCombatPointToAllTagged(activator, SkillType.RedMagic, 3);
            });
        }
예제 #22
0
        private static void WaspSting3(AbilityBuilder builder)
        {
            builder.Create(Feat.WaspSting3, PerkType.WaspSting)
            .Name("Wasp Sting III")
            .HasRecastDelay(RecastGroup.WaspSting, 60f)
            .RequirementStamina(12)
            .UsesActivationType(AbilityActivationType.Weapon)
            .HasImpactAction((activator, target, level) =>
            {
                ApplyEffectToObject(DurationType.Instant, EffectVisualEffect(VisualEffect.Vfx_Imp_Poison_S), target);
                StatusEffect.Apply(activator, target, StatusEffectType.Poison3, 24f);

                CombatPoint.AddCombatPoint(activator, target, SkillType.Thievery, 3);
                Enmity.ModifyEnmity(activator, target, 20);
            });
        }
예제 #23
0
        private static void Ironclad1(AbilityBuilder builder)
        {
            builder.Create(Feat.Ironclad1, PerkType.Ironclad)
            .Name("Ironclad I")
            .HasRecastDelay(RecastGroup.Ironclad, 300f)
            .RequirementStamina(10)
            .UsesActivationType(AbilityActivationType.Casted)
            .HasImpactAction((activator, target, level) =>
            {
                StatusEffect.Apply(activator, target, StatusEffectType.Ironclad1, 60f);
                ApplyEffectToObject(DurationType.Instant, EffectVisualEffect(VisualEffect.Vfx_Imp_Death_Ward), target);

                Enmity.ModifyEnmityOnAll(activator, 8);
                CombatPoint.AddCombatPointToAllTagged(activator, SkillType.Chivalry, 3);
            });
        }
예제 #24
0
        private static void SubtleBlow2(AbilityBuilder builder)
        {
            builder.Create(Feat.SubtleBlow2, PerkType.SubtleBlow)
            .Name("Subtle Blow II")
            .HasRecastDelay(RecastGroup.SubtleBlow, 300f)
            .RequirementStamina(7)
            .UsesActivationType(AbilityActivationType.Casted)
            .HasImpactAction((activator, target, level) =>
            {
                StatusEffect.Apply(activator, target, StatusEffectType.SubtleBlow2, 30f);
                ApplyEffectToObject(DurationType.Instant, EffectVisualEffect(VisualEffect.Vfx_Imp_Ac_Bonus), target);

                CombatPoint.AddCombatPointToAllTagged(activator, SkillType.Chi, 3);
                Enmity.ModifyEnmityOnAll(activator, 8);
            });
        }
        private static void PerfectDodge(AbilityBuilder builder)
        {
            builder.Create(Feat.PerfectDodge, PerkType.PerfectDodge)
            .Name("Perfect Dodge")
            .HasRecastDelay(RecastGroup.OneHourAbility, 3600f)
            .UsesActivationType(AbilityActivationType.Casted)
            .RequirementStamina(50)
            .HasImpactAction((activator, target, level) =>
            {
                ApplyEffectToObject(DurationType.Temporary, EffectACIncrease(20), target, 30f);
                ApplyEffectToObject(DurationType.Temporary, EffectVisualEffect(VisualEffect.Vfx_Dur_Pixiedust), target, 30f);

                CombatPoint.AddCombatPointToAllTagged(activator, SkillType.Thievery, 5);
                Enmity.ModifyEnmityOnAll(activator, 150);
            });
        }
        private static void Manafont(AbilityBuilder builder)
        {
            builder.Create(Feat.Manafont, PerkType.Manafont)
            .Name("Manafont")
            .HasRecastDelay(RecastGroup.OneHourAbility, 3600f)
            .UsesActivationType(AbilityActivationType.Casted)
            .RequirementMP(50)
            .HasImpactAction((activator, target, level) =>
            {
                StatusEffect.Apply(activator, target, StatusEffectType.Manafont, 30f);
                ApplyEffectToObject(DurationType.Instant, EffectVisualEffect(VisualEffect.Vfx_Fnf_Sound_Burst), target);

                CombatPoint.AddCombatPointToAllTagged(activator, SkillType.RedMagic, 5);
                Enmity.ModifyEnmityOnAll(activator, 100);
            });
        }
        private static void PiercingStab3(AbilityBuilder builder)
        {
            builder.Create(Feat.PiercingStab3, PerkType.PiercingStab)
            .Name("Piercing Stab III")
            .HasRecastDelay(RecastGroup.PiercingStab, 60f)
            .RequirementStamina(15)
            .UsesActivationType(AbilityActivationType.Weapon)
            .HasImpactAction((activator, target, level) =>
            {
                var duration = CalculateDuration(activator);
                StatusEffect.Apply(activator, target, StatusEffectType.Bleed3, duration);
                ApplyEffectToObject(DurationType.Instant, EffectVisualEffect(VisualEffect.Vfx_Com_Chunk_Red_Small), target);

                CombatPoint.AddCombatPoint(activator, target, SkillType.RedMagic, 2);
                Enmity.ModifyEnmity(activator, target, 14);
            });
        }
        private static void Shadowstitch2(AbilityBuilder builder)
        {
            builder.Create(Feat.Shadowstitch2, PerkType.Shadowstitch)
            .Name("Shadowstitch II")
            .HasRecastDelay(RecastGroup.Shadowstitch, 60f)
            .RequirementStamina(18)
            .UsesActivationType(AbilityActivationType.Weapon)
            .HasImpactAction((activator, target, level) =>
            {
                var duration = 24f;
                ApplyEffectToObject(DurationType.Temporary, EffectVisualEffect(VisualEffect.Vfx_Dur_Aura_Magenta), target, duration);
                ApplyEffectToObject(DurationType.Temporary, EffectCutsceneImmobilize(), target, duration);

                CombatPoint.AddCombatPoint(activator, target, SkillType.Thievery, 3);
                Enmity.ModifyEnmity(activator, target, 18);
            });
        }
        private static void DeliberateStab(AbilityBuilder builder)
        {
            builder.Create(Feat.DeliberateStab, PerkType.DeliberateStab)
            .Name("Deliberate Stab")
            .HasRecastDelay(RecastGroup.DeliberateStab, 300f)
            .RequirementStamina(20)
            .UsesActivationType(AbilityActivationType.Casted)
            .HasActivationDelay(2f)
            .HasImpactAction((activator, target, level) =>
            {
                StatusEffect.Apply(activator, target, StatusEffectType.DeliberateStab, 30f);
                ApplyEffectToObject(DurationType.Instant, EffectVisualEffect(VisualEffect.Vfx_Imp_Divine_Strike_Holy), activator);

                Enmity.ModifyEnmityOnAll(activator, 3);
                CombatPoint.AddCombatPointToAllTagged(activator, SkillType.RedMagic, 3);
            });
        }
        private static void ElementalSeal(AbilityBuilder builder)
        {
            builder.Create(Feat.ElementalSeal, PerkType.ElementalSeal)
            .Name("Elemental Seal")
            .DisplaysVisualEffectWhenActivating()
            .HasRecastDelay(RecastGroup.OneHourAbility, 3600f)
            .UsesActivationType(AbilityActivationType.Casted)
            .RequirementMP(50)
            .HasImpactAction((activator, target, level) =>
            {
                StatusEffect.Apply(activator, target, StatusEffectType.ElementalSeal, 30f);
                ApplyEffectToObject(DurationType.Instant, EffectVisualEffect(VisualEffect.Vfx_Fnf_Howl_Mind), target);

                CombatPoint.AddCombatPointToAllTagged(activator, SkillType.BlackMagic, 5);
                Enmity.ModifyEnmityOnAll(activator, 300);
            });
        }