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); }); }
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); }); }
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); }
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); }); }
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); }); }
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); } }); }
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); }); }
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); }); }
/// <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); }
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; }
/// <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); }); }
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); }); }
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); }); }
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); }); }
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); }); }