From eb27f94bba3e5f271741ffe388c0068f0786e4bb Mon Sep 17 00:00:00 2001 From: Torchery <88600359+Torchery@users.noreply.github.com> Date: Sun, 8 Aug 2021 20:05:23 -0700 Subject: [PATCH 01/10] Fixes #3119 Added Leadership's Price Unique Amulet Added Leadership's Price Unique Amulet Wires77 said to put @Cinnabarit here i guess? --- src/Data/Uniques/amulet.lua | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/Data/Uniques/amulet.lua b/src/Data/Uniques/amulet.lua index 5d46c57802..c2a43037d0 100644 --- a/src/Data/Uniques/amulet.lua +++ b/src/Data/Uniques/amulet.lua @@ -613,6 +613,18 @@ Implicits: 1 {tags:speed}30% increased Projectile Speed {tags:speed}10% increased Movement Speed ]],[[ +Leadership's Price +Onyx Amulet +Requires Level 68 +Implicits: 1 +{tags:jewellery_attribute}+(10–16) to all Attributes ++(-3–3)% to maximum Fire Resistance ++(-3–3)% to maximum Cold Resistance ++(-3–3)% to maximum Lightning Resistance +You have Scorching Conflux, Brittle Conflux and Sapping Conflux while your two highest Attributes are equal +Cannot Ignite, Chill, Freeze or Shock +Corrupted +]],[[ Maligaro's Cruelty Turquoise Amulet Requires Level 20 From 70bb2f9de276d0ec0ab84bed25a9ced873c44ebc Mon Sep 17 00:00:00 2001 From: LocalIdentity Date: Mon, 9 Aug 2021 20:51:21 +1000 Subject: [PATCH 02/10] Add catalyst tags --- src/Data/Uniques/amulet.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Data/Uniques/amulet.lua b/src/Data/Uniques/amulet.lua index c2a43037d0..f83897d8cc 100644 --- a/src/Data/Uniques/amulet.lua +++ b/src/Data/Uniques/amulet.lua @@ -618,9 +618,9 @@ Onyx Amulet Requires Level 68 Implicits: 1 {tags:jewellery_attribute}+(10–16) to all Attributes -+(-3–3)% to maximum Fire Resistance -+(-3–3)% to maximum Cold Resistance -+(-3–3)% to maximum Lightning Resistance +{tags:jewellery_resistance}+(-3–3)% to maximum Fire Resistance +{tags:jewellery_resistance}+(-3–3)% to maximum Cold Resistance +{tags:jewellery_resistance}+(-3–3)% to maximum Lightning Resistance You have Scorching Conflux, Brittle Conflux and Sapping Conflux while your two highest Attributes are equal Cannot Ignite, Chill, Freeze or Shock Corrupted From b206e83bceeb418b5a1ad379262c3d96072f760a Mon Sep 17 00:00:00 2001 From: Torchery <88600359+Torchery@users.noreply.github.com> Date: Thu, 25 Aug 2022 17:39:14 -0700 Subject: [PATCH 03/10] Cleans up Aul's Uprising (Intelligence) mod-list "{tags:critical}{variant:10,11,12,13,14,15,16}2% additional Chance to receive a Critical Strike" This mod has not been in the game since 3.6, so this should clean up the mod-list visually. --- src/Data/Uniques/amulet.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Data/Uniques/amulet.lua b/src/Data/Uniques/amulet.lua index 4c37cd9f20..808ea45ecd 100644 --- a/src/Data/Uniques/amulet.lua +++ b/src/Data/Uniques/amulet.lua @@ -144,7 +144,6 @@ Implicits: 1 {tags:life}+(50-70) to maximum Life {variant:1,2,3,4,5}10% reduced Stun and Block Recovery {variant:6,7,8,9}Nearby Enemies grant 25% increased Flask Charges -{tags:critical}{variant:10,11,12,13,14,15,16}2% additional Chance to receive a Critical Strike {variant:1,2,3,4,5}Nearby Enemies have 10% reduced Stun and Block Recovery {tags:critical}{variant:10,11,12,13,14,15,16}Hits against Nearby Enemies have 50% increased Critical Strike Chance {variant:17}{tags:jewellery_defense}(15-20)% increased Global Defences From 443c30d2b58a495e271b1b693a21949a7402dd76 Mon Sep 17 00:00:00 2001 From: Torchery <88600359+Torchery@users.noreply.github.com> Date: Fri, 11 Aug 2023 21:39:34 -0700 Subject: [PATCH 04/10] fixed vaal slayer and added colossal what it says --- src/Data/Skills/spectre.lua | 334 +++++++++++++++++++++++++++++++- src/Data/Spectres.lua | 22 +++ src/Export/Minions/Spectres.txt | 2 + src/Export/Skills/spectre.txt | 91 ++++++++- src/Export/spec.lua | 210 ++++++++++++++++++++ 5 files changed, 648 insertions(+), 11 deletions(-) diff --git a/src/Data/Skills/spectre.lua b/src/Data/Skills/spectre.lua index 9d59f84156..ac4894ae81 100644 --- a/src/Data/Skills/spectre.lua +++ b/src/Data/Skills/spectre.lua @@ -412,6 +412,193 @@ skills["ChaosDegenAura"] = { [1] = { 16.666667039196, levelRequirement = 3, statInterpolation = { 3, }, }, }, } +skills["ElementalHitSkeletonKnight"] = { + name = "Elemental Hit - Fire Variant", + hidden = true, + color = 2, + baseEffectiveness = 1.1667000055313, + incrementalEffectiveness = 0.04280000180006, + description = "Each attack with this skill will choose an element at random, and will only be able to deal damage of that element. If the attack hits an enemy, it will also deal damage in an area around them, with the radius being larger if that enemy is suffering from an ailment of the chosen element. It will avoid choosing the same element twice in a row.", + skillTypes = { [SkillType.Attack] = true, [SkillType.Projectile] = true, [SkillType.ProjectilesFromUser] = true, [SkillType.Totemable] = true, [SkillType.Trappable] = true, [SkillType.Mineable] = true, [SkillType.MeleeSingleTarget] = true, [SkillType.Multistrikeable] = true, [SkillType.Melee] = true, [SkillType.Fire] = true, [SkillType.Cold] = true, [SkillType.Lightning] = true, [SkillType.RangedAttack] = true, [SkillType.MirageArcherCanUse] = true, [SkillType.Area] = true, [SkillType.Triggerable] = true, [SkillType.RandomElement] = true, }, + statDescriptionScope = "skill_stat_descriptions", + castTime = 1, + baseFlags = { + attack = true, + area = true, + melee = true, + projectile = true, + Fire = true, + Cold = true, + Lightning = true, + }, + baseMods = { + flag("DealNoPhysical"), + flag("DealNoChaos"), + flag("DealNoCold"), + flag("DealNoLightning"), + mod("AreaOfEffect", "MORE", 80, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Ignited", "Scorched" }), + mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Ignited" }), + mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Scorched" }), + }, + constantStats = { + { "chance_to_freeze_shock_ignite_%", 50 }, + }, + stats = { + "active_skill_damage_+%_final", + "skill_can_fire_arrows", + "skill_can_fire_wand_projectiles", + "action_attack_or_cast_time_uses_animation_length", + "projectile_uses_contact_position", + "use_scaled_contact_offset", + "is_area_damage", + }, + levels = { + [1] = { 150, baseMultiplier = 1.5, levelRequirement = 1, statInterpolation = { 2, }, }, + [3] = { 300, baseMultiplier = 1.5, levelRequirement = 45, statInterpolation = { 2, }, }, + [4] = { 400, baseMultiplier = 1.5, levelRequirement = 84, statInterpolation = { 2, }, }, + }, +} +skills["ElementalHitSkeletonKnight"] = { + name = "Elemental Hit - Cold Variant", + hidden = true, + color = 2, + baseEffectiveness = 1.1667000055313, + incrementalEffectiveness = 0.04280000180006, + description = "Each attack with this skill will choose an element at random, and will only be able to deal damage of that element. If the attack hits an enemy, it will also deal damage in an area around them, with the radius being larger if that enemy is suffering from an ailment of the chosen element. It will avoid choosing the same element twice in a row.", + skillTypes = { [SkillType.Attack] = true, [SkillType.Projectile] = true, [SkillType.ProjectilesFromUser] = true, [SkillType.Totemable] = true, [SkillType.Trappable] = true, [SkillType.Mineable] = true, [SkillType.MeleeSingleTarget] = true, [SkillType.Multistrikeable] = true, [SkillType.Melee] = true, [SkillType.Fire] = true, [SkillType.Cold] = true, [SkillType.Lightning] = true, [SkillType.RangedAttack] = true, [SkillType.MirageArcherCanUse] = true, [SkillType.Area] = true, [SkillType.Triggerable] = true, [SkillType.RandomElement] = true, }, + statDescriptionScope = "skill_stat_descriptions", + castTime = 1, + baseFlags = { + attack = true, + area = true, + melee = true, + projectile = true, + Fire = true, + Cold = true, + Lightning = true, + }, + baseMods = { + flag("DealNoPhysical"), + flag("DealNoChaos"), + flag("DealNoFire"), + flag("DealNoLightning"), + mod("AreaOfEffect", "MORE", 80, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Chilled", "Frozen", "Brittle" }), + mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Chilled" }), + mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Frozen" }), + mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Brittle" }), + }, + constantStats = { + { "chance_to_freeze_shock_ignite_%", 50 }, + }, + stats = { + "active_skill_damage_+%_final", + "skill_can_fire_arrows", + "skill_can_fire_wand_projectiles", + "action_attack_or_cast_time_uses_animation_length", + "projectile_uses_contact_position", + "use_scaled_contact_offset", + "is_area_damage", + }, + levels = { + [1] = { 150, baseMultiplier = 1.5, levelRequirement = 1, statInterpolation = { 2, }, }, + [3] = { 300, baseMultiplier = 1.5, levelRequirement = 45, statInterpolation = { 2, }, }, + [4] = { 400, baseMultiplier = 1.5, levelRequirement = 84, statInterpolation = { 2, }, }, + }, +} +skills["ElementalHitSkeletonKnight"] = { + name = "Elemental Hit - Lightning Variant", + hidden = true, + color = 2, + baseEffectiveness = 1.1667000055313, + incrementalEffectiveness = 0.04280000180006, + description = "Each attack with this skill will choose an element at random, and will only be able to deal damage of that element. If the attack hits an enemy, it will also deal damage in an area around them, with the radius being larger if that enemy is suffering from an ailment of the chosen element. It will avoid choosing the same element twice in a row.", + skillTypes = { [SkillType.Attack] = true, [SkillType.Projectile] = true, [SkillType.ProjectilesFromUser] = true, [SkillType.Totemable] = true, [SkillType.Trappable] = true, [SkillType.Mineable] = true, [SkillType.MeleeSingleTarget] = true, [SkillType.Multistrikeable] = true, [SkillType.Melee] = true, [SkillType.Fire] = true, [SkillType.Cold] = true, [SkillType.Lightning] = true, [SkillType.RangedAttack] = true, [SkillType.MirageArcherCanUse] = true, [SkillType.Area] = true, [SkillType.Triggerable] = true, [SkillType.RandomElement] = true, }, + statDescriptionScope = "skill_stat_descriptions", + castTime = 1, + baseFlags = { + attack = true, + area = true, + melee = true, + projectile = true, + Fire = true, + Cold = true, + Lightning = true, + }, + baseMods = { + flag("DealNoPhysical"), + flag("DealNoChaos"), + flag("DealNoFire"), + flag("DealNoCold"), + mod("AreaOfEffect", "MORE", 80, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Shocked", "Sapped" }), + mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Shocked" }), + mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Sapped" }), + }, + constantStats = { + { "chance_to_freeze_shock_ignite_%", 50 }, + }, + stats = { + "active_skill_damage_+%_final", + "skill_can_fire_arrows", + "skill_can_fire_wand_projectiles", + "action_attack_or_cast_time_uses_animation_length", + "projectile_uses_contact_position", + "use_scaled_contact_offset", + "is_area_damage", + }, + levels = { + [1] = { 150, baseMultiplier = 1.5, levelRequirement = 1, statInterpolation = { 2, }, }, + [3] = { 300, baseMultiplier = 1.5, levelRequirement = 45, statInterpolation = { 2, }, }, + [4] = { 400, baseMultiplier = 1.5, levelRequirement = 84, statInterpolation = { 2, }, }, + }, +} +skills["ElementalHitSkeletonKnight"] = { + name = "Elemental Hit - Defaulting to Fire PoB Code Limitation, one Skill Per Monsters Skill, Delete Later.", + hidden = true, + color = 2, + baseEffectiveness = 1.1667000055313, + incrementalEffectiveness = 0.04280000180006, + description = "Each attack with this skill will choose an element at random, and will only be able to deal damage of that element. If the attack hits an enemy, it will also deal damage in an area around them, with the radius being larger if that enemy is suffering from an ailment of the chosen element. It will avoid choosing the same element twice in a row.", + skillTypes = { [SkillType.Attack] = true, [SkillType.Projectile] = true, [SkillType.ProjectilesFromUser] = true, [SkillType.Totemable] = true, [SkillType.Trappable] = true, [SkillType.Mineable] = true, [SkillType.MeleeSingleTarget] = true, [SkillType.Multistrikeable] = true, [SkillType.Melee] = true, [SkillType.Fire] = true, [SkillType.Cold] = true, [SkillType.Lightning] = true, [SkillType.RangedAttack] = true, [SkillType.MirageArcherCanUse] = true, [SkillType.Area] = true, [SkillType.Triggerable] = true, [SkillType.RandomElement] = true, }, + statDescriptionScope = "skill_stat_descriptions", + castTime = 1, + baseFlags = { + attack = true, + area = true, + melee = true, + projectile = true, + Fire = true, + Cold = true, + Lightning = true, + }, + baseMods = { + flag("DealNoPhysical"), + flag("DealNoProjectile"), + flag("DealNoChaos"), + flag("DealNoCold"), + flag("DealNoLightning"), + mod("AreaOfEffect", "MORE", 80, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Ignited", "Scorched" }), + mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Ignited" }), + mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Scorched" }), + }, + constantStats = { + { "chance_to_freeze_shock_ignite_%", 50 }, + }, + stats = { + "active_skill_damage_+%_final", + "skill_can_fire_arrows", + "skill_can_fire_wand_projectiles", + "action_attack_or_cast_time_uses_animation_length", + "projectile_uses_contact_position", + "use_scaled_contact_offset", + "is_area_damage", + }, + levels = { + [1] = { 150, baseMultiplier = 1.5, levelRequirement = 1, statInterpolation = { 2, }, }, + [3] = { 300, baseMultiplier = 1.5, levelRequirement = 45, statInterpolation = { 2, }, }, + [4] = { 400, baseMultiplier = 1.5, levelRequirement = 84, statInterpolation = { 2, }, }, + }, +} + skills["DelayedBlastSpectre"] = { name = "Delayed Blast", hidden = true, @@ -544,7 +731,7 @@ skills["DemonModularBladeVortexSpectre"] = { }, } skills["ElementalHitSkeletonKnight"] = { - name = "Elemental Hit Fire", + name = "Elemental Hit - Fire Variant", hidden = true, color = 2, baseEffectiveness = 1.1667000055313, @@ -557,21 +744,158 @@ skills["ElementalHitSkeletonKnight"] = { attack = true, projectile = true, melee = true, + Fire = true, + Cold = true, + Lightning = true, }, baseMods = { flag("DealNoPhysical"), + flag("DealNoMelee"), flag("DealNoChaos"), flag("DealNoCold"), flag("DealNoLightning"), - mod("AreaOfEffect", "MORE", 80, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Ignited" }), + mod("AreaOfEffect", "MORE", 80, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Ignited", "Scorched" }), mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Ignited" }), + mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Scorched" }), + }, + constantStats = { + { "chance_to_freeze_shock_ignite_%", 50 }, + }, + stats = { + "active_skill_damage_+%_final", + "skill_can_fire_arrows", + "skill_can_fire_wand_projectiles", + "action_attack_or_cast_time_uses_animation_length", + "projectile_uses_contact_position", + "use_scaled_contact_offset", + "is_area_damage", + }, + levels = { + [1] = { 150, baseMultiplier = 1.5, levelRequirement = 1, statInterpolation = { 2, }, }, + [3] = { 300, baseMultiplier = 1.5, levelRequirement = 45, statInterpolation = { 2, }, }, + [4] = { 400, baseMultiplier = 1.5, levelRequirement = 84, statInterpolation = { 2, }, }, + }, +} +skills["ElementalHitSkeletonKnight"] = { + name = "Elemental Hit - Cold Variant", + hidden = true, + color = 2, + baseEffectiveness = 1.1667000055313, + incrementalEffectiveness = 0.04280000180006, + description = "Each attack with this skill will choose an element at random, and will only be able to deal damage of that element. If the attack hits an enemy, it will also deal damage in an area around them, with the radius being larger if that enemy is suffering from an ailment of the chosen element. It will avoid choosing the same element twice in a row.", + skillTypes = { [SkillType.Attack] = true, [SkillType.Projectile] = true, [SkillType.ProjectilesFromUser] = true, [SkillType.Totemable] = true, [SkillType.Trappable] = true, [SkillType.Mineable] = true, [SkillType.MeleeSingleTarget] = true, [SkillType.Multistrikeable] = true, [SkillType.Melee] = true, [SkillType.Fire] = true, [SkillType.Cold] = true, [SkillType.Lightning] = true, [SkillType.RangedAttack] = true, [SkillType.MirageArcherCanUse] = true, [SkillType.Area] = true, [SkillType.Triggerable] = true, [SkillType.RandomElement] = true, }, + statDescriptionScope = "skill_stat_descriptions", + castTime = 1, + baseFlags = { + attack = true, + projectile = true, + melee = true, + Fire = true, + Cold = true, + Lightning = true, + }, + baseMods = { + flag("DealNoPhysical"), + flag("DealNoMelee"), + flag("DealNoChaos"), + flag("DealNoFire"), + flag("DealNoLightning"), + mod("AreaOfEffect", "MORE", 80, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Chilled", "Frozen", "Brittle" }), mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Chilled" }), mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Frozen" }), - mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Shocked" }), - mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Scorched" }), mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Brittle" }), + }, + constantStats = { + { "chance_to_freeze_shock_ignite_%", 50 }, + }, + stats = { + "active_skill_damage_+%_final", + "skill_can_fire_arrows", + "skill_can_fire_wand_projectiles", + "action_attack_or_cast_time_uses_animation_length", + "projectile_uses_contact_position", + "use_scaled_contact_offset", + "is_area_damage", + }, + levels = { + [1] = { 150, baseMultiplier = 1.5, levelRequirement = 1, statInterpolation = { 2, }, }, + [3] = { 300, baseMultiplier = 1.5, levelRequirement = 45, statInterpolation = { 2, }, }, + [4] = { 400, baseMultiplier = 1.5, levelRequirement = 84, statInterpolation = { 2, }, }, + }, +} +skills["ElementalHitSkeletonKnight"] = { + name = "Elemental Hit - Lightning Variant", + hidden = true, + color = 2, + baseEffectiveness = 1.1667000055313, + incrementalEffectiveness = 0.04280000180006, + description = "Each attack with this skill will choose an element at random, and will only be able to deal damage of that element. If the attack hits an enemy, it will also deal damage in an area around them, with the radius being larger if that enemy is suffering from an ailment of the chosen element. It will avoid choosing the same element twice in a row.", + skillTypes = { [SkillType.Attack] = true, [SkillType.Projectile] = true, [SkillType.ProjectilesFromUser] = true, [SkillType.Totemable] = true, [SkillType.Trappable] = true, [SkillType.Mineable] = true, [SkillType.MeleeSingleTarget] = true, [SkillType.Multistrikeable] = true, [SkillType.Melee] = true, [SkillType.Fire] = true, [SkillType.Cold] = true, [SkillType.Lightning] = true, [SkillType.RangedAttack] = true, [SkillType.MirageArcherCanUse] = true, [SkillType.Area] = true, [SkillType.Triggerable] = true, [SkillType.RandomElement] = true, }, + statDescriptionScope = "skill_stat_descriptions", + castTime = 1, + baseFlags = { + attack = true, + projectile = true, + melee = true, + Fire = true, + Cold = true, + Lightning = true, + }, + baseMods = { + flag("DealNoPhysical"), + flag("DealNoMelee"), + flag("DealNoChaos"), + flag("DealNoFire"), + flag("DealNoCold"), + mod("AreaOfEffect", "MORE", 80, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Shocked", "Sapped" }), + mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Shocked" }), mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Sapped" }), - mod("Damage", "MORE", 10, 0, 0, { type = "Multiplier", var = "ElementalHitAilmentOnEnemy" }), + }, + constantStats = { + { "chance_to_freeze_shock_ignite_%", 50 }, + }, + stats = { + "active_skill_damage_+%_final", + "skill_can_fire_arrows", + "skill_can_fire_wand_projectiles", + "action_attack_or_cast_time_uses_animation_length", + "projectile_uses_contact_position", + "use_scaled_contact_offset", + "is_area_damage", + }, + levels = { + [1] = { 150, baseMultiplier = 1.5, levelRequirement = 1, statInterpolation = { 2, }, }, + [3] = { 300, baseMultiplier = 1.5, levelRequirement = 45, statInterpolation = { 2, }, }, + [4] = { 400, baseMultiplier = 1.5, levelRequirement = 84, statInterpolation = { 2, }, }, + }, +} +skills["ElementalHitSkeletonKnight"] = { + name = "Elemental Hit - Defaulting to Fire PoB Code Limitation, one Skill Per Monsters Skill, Delete Later.", + hidden = true, + color = 2, + baseEffectiveness = 1.1667000055313, + incrementalEffectiveness = 0.04280000180006, + description = "Each attack with this skill will choose an element at random, and will only be able to deal damage of that element. If the attack hits an enemy, it will also deal damage in an area around them, with the radius being larger if that enemy is suffering from an ailment of the chosen element. It will avoid choosing the same element twice in a row.", + skillTypes = { [SkillType.Attack] = true, [SkillType.Projectile] = true, [SkillType.ProjectilesFromUser] = true, [SkillType.Totemable] = true, [SkillType.Trappable] = true, [SkillType.Mineable] = true, [SkillType.MeleeSingleTarget] = true, [SkillType.Multistrikeable] = true, [SkillType.Melee] = true, [SkillType.Fire] = true, [SkillType.Cold] = true, [SkillType.Lightning] = true, [SkillType.RangedAttack] = true, [SkillType.MirageArcherCanUse] = true, [SkillType.Area] = true, [SkillType.Triggerable] = true, [SkillType.RandomElement] = true, }, + statDescriptionScope = "skill_stat_descriptions", + castTime = 1, + baseFlags = { + attack = true, + projectile = true, + melee = true, + Fire = true, + Cold = true, + Lightning = true, + }, + baseMods = { + flag("DealNoPhysical"), + flag("DealNoMelee"), + flag("DealNoChaos"), + flag("DealNoCold"), + flag("DealNoLightning"), + mod("AreaOfEffect", "MORE", 80, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Ignited", "Scorched" }), + mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Ignited" }), + mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Scorched" }), }, constantStats = { { "chance_to_freeze_shock_ignite_%", 50 }, diff --git a/src/Data/Spectres.lua b/src/Data/Spectres.lua index a266c8c506..e20b5ae2c2 100644 --- a/src/Data/Spectres.lua +++ b/src/Data/Spectres.lua @@ -488,6 +488,28 @@ minions["Metadata/Monster/CageSpider/CageSpider2"] = { modList = { }, } +-- Colossal Vaal Fallen +minions["Metadata/Monsters/Skeletons/SkeletonMeleeKnightElementalLargeSword"] = { + name = "Colossal Vaal Fallen", + life = 1.98, + armour = 0.8, + fireResist = 37, + coldResist = 37, + lightningResist = 37, + chaosResist = 0, + damage = 4.05, + damageSpread = 0.2, + attackTime = 1.5, + attackRange = 15, + accuracy = 1, + weaponType1 = "One Handed Sword", + skillList = { + "MeleeAtAnimationSpeed", + "ElementalHitSkeletonKnight", + }, + modList = { + }, +} -- Cannibals minions["Metadata/Monsters/Cannibal/CannibalMaleChampion"] = { name = "Cannibal Fire-eater", diff --git a/src/Export/Minions/Spectres.txt b/src/Export/Minions/Spectres.txt index ca4e257a24..8ef0fe81db 100644 --- a/src/Export/Minions/Spectres.txt +++ b/src/Export/Minions/Spectres.txt @@ -33,6 +33,8 @@ local minions, mod = ... #spectre Metadata/Monsters/Bull/Bull -- Cage Spider #spectre Metadata/Monster/CageSpider/CageSpider2 +-- Colossal Vaal Fallen +#spectre Metadata/Monsters/Skeletons/SkeletonMeleeKnightElementalLargeSword -- Cannibals #spectre Metadata/Monsters/Cannibal/CannibalMaleChampion -- Goatmen diff --git a/src/Export/Skills/spectre.txt b/src/Export/Skills/spectre.txt index c13d8258a9..da5fdf81ef 100644 --- a/src/Export/Skills/spectre.txt +++ b/src/Export/Skills/spectre.txt @@ -80,6 +80,53 @@ local skills, mod, flag, skill = ... #flags spell aura area #mods +#skill ElementalHitSkeletonKnight Elemental Hit - Fire Variant +#flags attack area melee projectile Fire Cold Lightning +#baseMod flag("DealNoPhysical") +#baseMod flag("DealNoChaos") +#baseMod flag("DealNoCold") +#baseMod flag("DealNoLightning") +#baseMod mod("AreaOfEffect", "MORE", 80, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Ignited", "Scorched" }) +#baseMod mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Ignited" }) +#baseMod mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Scorched" }) +#mods + +#skill ElementalHitSkeletonKnight Elemental Hit - Cold Variant +#flags attack area melee projectile Fire Cold Lightning +#baseMod flag("DealNoPhysical") +#baseMod flag("DealNoChaos") +#baseMod flag("DealNoFire") +#baseMod flag("DealNoLightning") +#baseMod mod("AreaOfEffect", "MORE", 80, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Chilled", "Frozen", "Brittle" }) +#baseMod mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Chilled" }) +#baseMod mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Frozen" }) +#baseMod mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Brittle" }) +#mods + +#skill ElementalHitSkeletonKnight Elemental Hit - Lightning Variant +#flags attack area melee projectile Fire Cold Lightning +#baseMod flag("DealNoPhysical") +#baseMod flag("DealNoChaos") +#baseMod flag("DealNoFire") +#baseMod flag("DealNoCold") +#baseMod mod("AreaOfEffect", "MORE", 80, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Shocked", "Sapped" }) +#baseMod mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Shocked" }) +#baseMod mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Sapped" }) +#mods + +#skill ElementalHitSkeletonKnight Elemental Hit - Defaulting to Fire PoB Code Limitation, one Skill Per Monsters Skill, Delete Later. +#flags attack area melee projectile Fire Cold Lightning +#baseMod flag("DealNoPhysical") +#baseMod flag("DealNoProjectile") +#baseMod flag("DealNoChaos") +#baseMod flag("DealNoCold") +#baseMod flag("DealNoLightning") +#baseMod mod("AreaOfEffect", "MORE", 80, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Ignited", "Scorched" }) +#baseMod mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Ignited" }) +#baseMod mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Scorched" }) +#mods + + #skill DelayedBlastSpectre Delayed Blast #flags spell area #mods @@ -101,21 +148,53 @@ local skills, mod, flag, skill = ... #baseMod skill("hitTimeOverride", 1) #mods -#skill ElementalHitSkeletonKnight Elemental Hit Fire -#flags attack projectile melee +#skill ElementalHitSkeletonKnight Elemental Hit - Fire Variant +#flags attack projectile melee Fire Cold Lightning #baseMod flag("DealNoPhysical") +#baseMod flag("DealNoMelee") #baseMod flag("DealNoChaos") #baseMod flag("DealNoCold") #baseMod flag("DealNoLightning") -#baseMod mod("AreaOfEffect", "MORE", 80, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Ignited" }) +#baseMod mod("AreaOfEffect", "MORE", 80, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Ignited", "Scorched" }) #baseMod mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Ignited" }) +#baseMod mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Scorched" }) +#mods + +#skill ElementalHitSkeletonKnight Elemental Hit - Cold Variant +#flags attack projectile melee Fire Cold Lightning +#baseMod flag("DealNoPhysical") +#baseMod flag("DealNoMelee") +#baseMod flag("DealNoChaos") +#baseMod flag("DealNoFire") +#baseMod flag("DealNoLightning") +#baseMod mod("AreaOfEffect", "MORE", 80, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Chilled", "Frozen", "Brittle" }) #baseMod mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Chilled" }) #baseMod mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Frozen" }) -#baseMod mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Shocked" }) -#baseMod mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Scorched" }) #baseMod mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Brittle" }) +#mods + +#skill ElementalHitSkeletonKnight Elemental Hit - Lightning Variant +#flags attack projectile melee Fire Cold Lightning +#baseMod flag("DealNoPhysical") +#baseMod flag("DealNoMelee") +#baseMod flag("DealNoChaos") +#baseMod flag("DealNoFire") +#baseMod flag("DealNoCold") +#baseMod mod("AreaOfEffect", "MORE", 80, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Shocked", "Sapped" }) +#baseMod mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Shocked" }) #baseMod mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Sapped" }) -#baseMod mod("Damage", "MORE", 10, 0, 0, { type = "Multiplier", var = "ElementalHitAilmentOnEnemy" }) +#mods + +#skill ElementalHitSkeletonKnight Elemental Hit - Defaulting to Fire PoB Code Limitation, one Skill Per Monsters Skill, Delete Later. +#flags attack projectile melee Fire Cold Lightning +#baseMod flag("DealNoPhysical") +#baseMod flag("DealNoMelee") +#baseMod flag("DealNoChaos") +#baseMod flag("DealNoCold") +#baseMod flag("DealNoLightning") +#baseMod mod("AreaOfEffect", "MORE", 80, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Ignited", "Scorched" }) +#baseMod mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Ignited" }) +#baseMod mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Scorched" }) #mods #skill ElementalHitSkeletonKnightIncursion diff --git a/src/Export/spec.lua b/src/Export/spec.lua index 070d5b12c9..f69a09c093 100644 --- a/src/Export/spec.lua +++ b/src/Export/spec.lua @@ -10496,5 +10496,215 @@ return { ZanaLevels={ }, ZanaQuests={ + }, + achievementitems={ + }, + activeskills={ + }, + activeskilltargettypes={ + }, + activeskilltype={ + }, + addbufftotargetvarieties={ + }, + aegisvariations={ + }, + alternatepassiveadditions={ + }, + alternatepassiveskills={ + }, + alternateskilltargetingbehaviours={ + }, + alternatetreeversions={ + }, + animateweaponuniques={ + }, + armourtypes={ + }, + ascendancy={ + }, + baseitemtypes={ + }, + buffcategories={ + }, + buffdefinitions={ + }, + bufftemplates={ + }, + buffvisualorbart={ + }, + buffvisualorbs={ + }, + buffvisualorbtypes={ + }, + buffvisuals={ + }, + buffvisualsartvariations={ + }, + buffvisualsetentries={ + }, + buffvisualsets={ + }, + characters={ + }, + clientstrings={ + }, + componentattributerequirements={ + }, + componentcharges={ + }, + costtypes={ + }, + craftingbenchoptions={ + }, + craftingbenchsortcategories={ + }, + craftingbenchunlockcategories={ + }, + craftingitemclasscategories={ + }, + crucibletags={ + }, + defaultmonsterstats={ + }, + effectivenesscostconstants={ + }, + essences={ + }, + essencetype={ + }, + flasks={ + }, + flavourtext={ + }, + gemtags={ + }, + genericbuffauras={ + }, + grantedeffectgroups={ + }, + grantedeffectqualitystats={ + }, + grantedeffectqualitytypes={ + }, + grantedeffects={ + }, + grantedeffectsperlevel={ + }, + grantedeffectstatsets={ + }, + grantedeffectstatsetsperlevel={ + }, + hideoutnpcs={ + }, + itemclasses={ + }, + itemexperienceperlevel={ + }, + itemexperiencetypes={ + }, + itemvisualidentity={ + }, + mavenjewelradiuskeystones={ + }, + modauraflags={ + }, + moddomains={ + }, + modeffectstats={ + }, + modfamily={ + }, + modgenerationtype={ + }, + mods={ + }, + modsellpricetypes={ + }, + modtype={ + }, + monstermapbossdifficulty={ + }, + monstermapdifficulty={ + }, + monsterresistances={ + }, + monstertypes={ + }, + monstervarieties={ + }, + multipartachievements={ + }, + npcs={ + }, + pantheonpanellayout={ + }, + passivejewelradii={ + }, + passivejewelslots={ + }, + passiveskillmasteryeffects={ + }, + passiveskillmasterygroups={ + }, + passiveskills={ + }, + passiveskillstatcategories={ + }, + passiveskilltypes={ + }, + passivetreeexpansionjewels={ + }, + passivetreeexpansionjewelsizes={ + }, + passivetreeexpansionskills={ + }, + passivetreeexpansionspecialskills={ + }, + projectiles={ + }, + remindertext={ + }, + shieldtypes={ + }, + shrines={ + }, + skillgems={ + }, + skillmines={ + }, + skilltotems={ + }, + skilltotemvariations={ + }, + soundeffects={ + }, + statinterpolationtypes={ + }, + stats={ + }, + statsemantics={ + }, + tablecharge={ + }, + tags={ + }, + uniquestashlayout={ + }, + uniquestashtypes={ + }, + virtualstatcontextflags={ + }, + weaponpassiveskills={ + }, + weaponpassiveskilltypes={ + }, + weaponpassivetreebalanceperitemlevel={ + }, + weaponpassivetreeuniquebasetypes={ + }, + weapontypes={ + }, + words={ } } \ No newline at end of file From ca1e9ca4fb8109c6bd54124cd6ba259e6625bd9d Mon Sep 17 00:00:00 2001 From: LocalIdentity Date: Sat, 12 Aug 2023 14:59:20 +1000 Subject: [PATCH 05/10] Drop spec changes --- src/Export/spec.lua | 210 -------------------------------------------- 1 file changed, 210 deletions(-) diff --git a/src/Export/spec.lua b/src/Export/spec.lua index f69a09c093..070d5b12c9 100644 --- a/src/Export/spec.lua +++ b/src/Export/spec.lua @@ -10496,215 +10496,5 @@ return { ZanaLevels={ }, ZanaQuests={ - }, - achievementitems={ - }, - activeskills={ - }, - activeskilltargettypes={ - }, - activeskilltype={ - }, - addbufftotargetvarieties={ - }, - aegisvariations={ - }, - alternatepassiveadditions={ - }, - alternatepassiveskills={ - }, - alternateskilltargetingbehaviours={ - }, - alternatetreeversions={ - }, - animateweaponuniques={ - }, - armourtypes={ - }, - ascendancy={ - }, - baseitemtypes={ - }, - buffcategories={ - }, - buffdefinitions={ - }, - bufftemplates={ - }, - buffvisualorbart={ - }, - buffvisualorbs={ - }, - buffvisualorbtypes={ - }, - buffvisuals={ - }, - buffvisualsartvariations={ - }, - buffvisualsetentries={ - }, - buffvisualsets={ - }, - characters={ - }, - clientstrings={ - }, - componentattributerequirements={ - }, - componentcharges={ - }, - costtypes={ - }, - craftingbenchoptions={ - }, - craftingbenchsortcategories={ - }, - craftingbenchunlockcategories={ - }, - craftingitemclasscategories={ - }, - crucibletags={ - }, - defaultmonsterstats={ - }, - effectivenesscostconstants={ - }, - essences={ - }, - essencetype={ - }, - flasks={ - }, - flavourtext={ - }, - gemtags={ - }, - genericbuffauras={ - }, - grantedeffectgroups={ - }, - grantedeffectqualitystats={ - }, - grantedeffectqualitytypes={ - }, - grantedeffects={ - }, - grantedeffectsperlevel={ - }, - grantedeffectstatsets={ - }, - grantedeffectstatsetsperlevel={ - }, - hideoutnpcs={ - }, - itemclasses={ - }, - itemexperienceperlevel={ - }, - itemexperiencetypes={ - }, - itemvisualidentity={ - }, - mavenjewelradiuskeystones={ - }, - modauraflags={ - }, - moddomains={ - }, - modeffectstats={ - }, - modfamily={ - }, - modgenerationtype={ - }, - mods={ - }, - modsellpricetypes={ - }, - modtype={ - }, - monstermapbossdifficulty={ - }, - monstermapdifficulty={ - }, - monsterresistances={ - }, - monstertypes={ - }, - monstervarieties={ - }, - multipartachievements={ - }, - npcs={ - }, - pantheonpanellayout={ - }, - passivejewelradii={ - }, - passivejewelslots={ - }, - passiveskillmasteryeffects={ - }, - passiveskillmasterygroups={ - }, - passiveskills={ - }, - passiveskillstatcategories={ - }, - passiveskilltypes={ - }, - passivetreeexpansionjewels={ - }, - passivetreeexpansionjewelsizes={ - }, - passivetreeexpansionskills={ - }, - passivetreeexpansionspecialskills={ - }, - projectiles={ - }, - remindertext={ - }, - shieldtypes={ - }, - shrines={ - }, - skillgems={ - }, - skillmines={ - }, - skilltotems={ - }, - skilltotemvariations={ - }, - soundeffects={ - }, - statinterpolationtypes={ - }, - stats={ - }, - statsemantics={ - }, - tablecharge={ - }, - tags={ - }, - uniquestashlayout={ - }, - uniquestashtypes={ - }, - virtualstatcontextflags={ - }, - weaponpassiveskills={ - }, - weaponpassiveskilltypes={ - }, - weaponpassivetreebalanceperitemlevel={ - }, - weaponpassivetreeuniquebasetypes={ - }, - weapontypes={ - }, - words={ } } \ No newline at end of file From c6add8f176bff37dabb35b9ac1330d686e7dc3f1 Mon Sep 17 00:00:00 2001 From: Torchery <88600359+Torchery@users.noreply.github.com> Date: Sat, 12 Aug 2023 01:27:06 -0700 Subject: [PATCH 06/10] Psuedo Fix for "ElementalHitSkeletonKnight" A Scuffed but functional Fix for Vaal Slayer & Newly Added Colossal Vaal Fallen Method to the fix is to take the inherit "physical" (its not supposed to be physical) damage and then convert 100% of that damage into each element while flagging DealNoPhysical and DealNoChaos to emulate hitting with the skill repeatedly. there are some problems with this however, such as how this skill is used by both Projectile Spectre aswell as Melee Area Spectre as well as flat phys scaling your damage (it wont in game) so your damage can get inflated, however this is the best we can do atm until someone more capable comes along to fix this skill properly, untill then this will relatively properly convey your overall dps with Elemental Hit. --- src/Data/Skills/spectre.lua | 334 +--------------------------------- src/Export/Skills/spectre.txt | 91 +-------- 2 files changed, 13 insertions(+), 412 deletions(-) diff --git a/src/Data/Skills/spectre.lua b/src/Data/Skills/spectre.lua index ac4894ae81..c101bbabed 100644 --- a/src/Data/Skills/spectre.lua +++ b/src/Data/Skills/spectre.lua @@ -412,193 +412,6 @@ skills["ChaosDegenAura"] = { [1] = { 16.666667039196, levelRequirement = 3, statInterpolation = { 3, }, }, }, } -skills["ElementalHitSkeletonKnight"] = { - name = "Elemental Hit - Fire Variant", - hidden = true, - color = 2, - baseEffectiveness = 1.1667000055313, - incrementalEffectiveness = 0.04280000180006, - description = "Each attack with this skill will choose an element at random, and will only be able to deal damage of that element. If the attack hits an enemy, it will also deal damage in an area around them, with the radius being larger if that enemy is suffering from an ailment of the chosen element. It will avoid choosing the same element twice in a row.", - skillTypes = { [SkillType.Attack] = true, [SkillType.Projectile] = true, [SkillType.ProjectilesFromUser] = true, [SkillType.Totemable] = true, [SkillType.Trappable] = true, [SkillType.Mineable] = true, [SkillType.MeleeSingleTarget] = true, [SkillType.Multistrikeable] = true, [SkillType.Melee] = true, [SkillType.Fire] = true, [SkillType.Cold] = true, [SkillType.Lightning] = true, [SkillType.RangedAttack] = true, [SkillType.MirageArcherCanUse] = true, [SkillType.Area] = true, [SkillType.Triggerable] = true, [SkillType.RandomElement] = true, }, - statDescriptionScope = "skill_stat_descriptions", - castTime = 1, - baseFlags = { - attack = true, - area = true, - melee = true, - projectile = true, - Fire = true, - Cold = true, - Lightning = true, - }, - baseMods = { - flag("DealNoPhysical"), - flag("DealNoChaos"), - flag("DealNoCold"), - flag("DealNoLightning"), - mod("AreaOfEffect", "MORE", 80, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Ignited", "Scorched" }), - mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Ignited" }), - mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Scorched" }), - }, - constantStats = { - { "chance_to_freeze_shock_ignite_%", 50 }, - }, - stats = { - "active_skill_damage_+%_final", - "skill_can_fire_arrows", - "skill_can_fire_wand_projectiles", - "action_attack_or_cast_time_uses_animation_length", - "projectile_uses_contact_position", - "use_scaled_contact_offset", - "is_area_damage", - }, - levels = { - [1] = { 150, baseMultiplier = 1.5, levelRequirement = 1, statInterpolation = { 2, }, }, - [3] = { 300, baseMultiplier = 1.5, levelRequirement = 45, statInterpolation = { 2, }, }, - [4] = { 400, baseMultiplier = 1.5, levelRequirement = 84, statInterpolation = { 2, }, }, - }, -} -skills["ElementalHitSkeletonKnight"] = { - name = "Elemental Hit - Cold Variant", - hidden = true, - color = 2, - baseEffectiveness = 1.1667000055313, - incrementalEffectiveness = 0.04280000180006, - description = "Each attack with this skill will choose an element at random, and will only be able to deal damage of that element. If the attack hits an enemy, it will also deal damage in an area around them, with the radius being larger if that enemy is suffering from an ailment of the chosen element. It will avoid choosing the same element twice in a row.", - skillTypes = { [SkillType.Attack] = true, [SkillType.Projectile] = true, [SkillType.ProjectilesFromUser] = true, [SkillType.Totemable] = true, [SkillType.Trappable] = true, [SkillType.Mineable] = true, [SkillType.MeleeSingleTarget] = true, [SkillType.Multistrikeable] = true, [SkillType.Melee] = true, [SkillType.Fire] = true, [SkillType.Cold] = true, [SkillType.Lightning] = true, [SkillType.RangedAttack] = true, [SkillType.MirageArcherCanUse] = true, [SkillType.Area] = true, [SkillType.Triggerable] = true, [SkillType.RandomElement] = true, }, - statDescriptionScope = "skill_stat_descriptions", - castTime = 1, - baseFlags = { - attack = true, - area = true, - melee = true, - projectile = true, - Fire = true, - Cold = true, - Lightning = true, - }, - baseMods = { - flag("DealNoPhysical"), - flag("DealNoChaos"), - flag("DealNoFire"), - flag("DealNoLightning"), - mod("AreaOfEffect", "MORE", 80, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Chilled", "Frozen", "Brittle" }), - mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Chilled" }), - mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Frozen" }), - mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Brittle" }), - }, - constantStats = { - { "chance_to_freeze_shock_ignite_%", 50 }, - }, - stats = { - "active_skill_damage_+%_final", - "skill_can_fire_arrows", - "skill_can_fire_wand_projectiles", - "action_attack_or_cast_time_uses_animation_length", - "projectile_uses_contact_position", - "use_scaled_contact_offset", - "is_area_damage", - }, - levels = { - [1] = { 150, baseMultiplier = 1.5, levelRequirement = 1, statInterpolation = { 2, }, }, - [3] = { 300, baseMultiplier = 1.5, levelRequirement = 45, statInterpolation = { 2, }, }, - [4] = { 400, baseMultiplier = 1.5, levelRequirement = 84, statInterpolation = { 2, }, }, - }, -} -skills["ElementalHitSkeletonKnight"] = { - name = "Elemental Hit - Lightning Variant", - hidden = true, - color = 2, - baseEffectiveness = 1.1667000055313, - incrementalEffectiveness = 0.04280000180006, - description = "Each attack with this skill will choose an element at random, and will only be able to deal damage of that element. If the attack hits an enemy, it will also deal damage in an area around them, with the radius being larger if that enemy is suffering from an ailment of the chosen element. It will avoid choosing the same element twice in a row.", - skillTypes = { [SkillType.Attack] = true, [SkillType.Projectile] = true, [SkillType.ProjectilesFromUser] = true, [SkillType.Totemable] = true, [SkillType.Trappable] = true, [SkillType.Mineable] = true, [SkillType.MeleeSingleTarget] = true, [SkillType.Multistrikeable] = true, [SkillType.Melee] = true, [SkillType.Fire] = true, [SkillType.Cold] = true, [SkillType.Lightning] = true, [SkillType.RangedAttack] = true, [SkillType.MirageArcherCanUse] = true, [SkillType.Area] = true, [SkillType.Triggerable] = true, [SkillType.RandomElement] = true, }, - statDescriptionScope = "skill_stat_descriptions", - castTime = 1, - baseFlags = { - attack = true, - area = true, - melee = true, - projectile = true, - Fire = true, - Cold = true, - Lightning = true, - }, - baseMods = { - flag("DealNoPhysical"), - flag("DealNoChaos"), - flag("DealNoFire"), - flag("DealNoCold"), - mod("AreaOfEffect", "MORE", 80, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Shocked", "Sapped" }), - mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Shocked" }), - mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Sapped" }), - }, - constantStats = { - { "chance_to_freeze_shock_ignite_%", 50 }, - }, - stats = { - "active_skill_damage_+%_final", - "skill_can_fire_arrows", - "skill_can_fire_wand_projectiles", - "action_attack_or_cast_time_uses_animation_length", - "projectile_uses_contact_position", - "use_scaled_contact_offset", - "is_area_damage", - }, - levels = { - [1] = { 150, baseMultiplier = 1.5, levelRequirement = 1, statInterpolation = { 2, }, }, - [3] = { 300, baseMultiplier = 1.5, levelRequirement = 45, statInterpolation = { 2, }, }, - [4] = { 400, baseMultiplier = 1.5, levelRequirement = 84, statInterpolation = { 2, }, }, - }, -} -skills["ElementalHitSkeletonKnight"] = { - name = "Elemental Hit - Defaulting to Fire PoB Code Limitation, one Skill Per Monsters Skill, Delete Later.", - hidden = true, - color = 2, - baseEffectiveness = 1.1667000055313, - incrementalEffectiveness = 0.04280000180006, - description = "Each attack with this skill will choose an element at random, and will only be able to deal damage of that element. If the attack hits an enemy, it will also deal damage in an area around them, with the radius being larger if that enemy is suffering from an ailment of the chosen element. It will avoid choosing the same element twice in a row.", - skillTypes = { [SkillType.Attack] = true, [SkillType.Projectile] = true, [SkillType.ProjectilesFromUser] = true, [SkillType.Totemable] = true, [SkillType.Trappable] = true, [SkillType.Mineable] = true, [SkillType.MeleeSingleTarget] = true, [SkillType.Multistrikeable] = true, [SkillType.Melee] = true, [SkillType.Fire] = true, [SkillType.Cold] = true, [SkillType.Lightning] = true, [SkillType.RangedAttack] = true, [SkillType.MirageArcherCanUse] = true, [SkillType.Area] = true, [SkillType.Triggerable] = true, [SkillType.RandomElement] = true, }, - statDescriptionScope = "skill_stat_descriptions", - castTime = 1, - baseFlags = { - attack = true, - area = true, - melee = true, - projectile = true, - Fire = true, - Cold = true, - Lightning = true, - }, - baseMods = { - flag("DealNoPhysical"), - flag("DealNoProjectile"), - flag("DealNoChaos"), - flag("DealNoCold"), - flag("DealNoLightning"), - mod("AreaOfEffect", "MORE", 80, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Ignited", "Scorched" }), - mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Ignited" }), - mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Scorched" }), - }, - constantStats = { - { "chance_to_freeze_shock_ignite_%", 50 }, - }, - stats = { - "active_skill_damage_+%_final", - "skill_can_fire_arrows", - "skill_can_fire_wand_projectiles", - "action_attack_or_cast_time_uses_animation_length", - "projectile_uses_contact_position", - "use_scaled_contact_offset", - "is_area_damage", - }, - levels = { - [1] = { 150, baseMultiplier = 1.5, levelRequirement = 1, statInterpolation = { 2, }, }, - [3] = { 300, baseMultiplier = 1.5, levelRequirement = 45, statInterpolation = { 2, }, }, - [4] = { 400, baseMultiplier = 1.5, levelRequirement = 84, statInterpolation = { 2, }, }, - }, -} - skills["DelayedBlastSpectre"] = { name = "Delayed Blast", hidden = true, @@ -731,7 +544,7 @@ skills["DemonModularBladeVortexSpectre"] = { }, } skills["ElementalHitSkeletonKnight"] = { - name = "Elemental Hit - Fire Variant", + name = "Elemental Hit - Psuedo Tri-Conversion", hidden = true, color = 2, baseEffectiveness = 1.1667000055313, @@ -742,112 +555,25 @@ skills["ElementalHitSkeletonKnight"] = { castTime = 1, baseFlags = { attack = true, - projectile = true, + area = true, melee = true, + projectile = true, Fire = true, Cold = true, Lightning = true, }, baseMods = { flag("DealNoPhysical"), - flag("DealNoMelee"), flag("DealNoChaos"), - flag("DealNoCold"), - flag("DealNoLightning"), - mod("AreaOfEffect", "MORE", 80, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Ignited", "Scorched" }), + mod("PhysicalDamageConvertToFire", "BASE", 100, 0, 0, { type = "BASE", }), + mod("PhysicalDamageConvertToCold", "BASE", 100, 0, 0, { type = "BASE", }), + mod("PhysicalDamageConvertToLightning", "BASE", 100, 0, 0, { type = "BASE", }), + mod("AreaOfEffect", "MORE", 80, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Ignited", "Scorched", "Chilled", "Frozen", "Brittle", "Shocked", "Sapped" }), mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Ignited" }), mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Scorched" }), - }, - constantStats = { - { "chance_to_freeze_shock_ignite_%", 50 }, - }, - stats = { - "active_skill_damage_+%_final", - "skill_can_fire_arrows", - "skill_can_fire_wand_projectiles", - "action_attack_or_cast_time_uses_animation_length", - "projectile_uses_contact_position", - "use_scaled_contact_offset", - "is_area_damage", - }, - levels = { - [1] = { 150, baseMultiplier = 1.5, levelRequirement = 1, statInterpolation = { 2, }, }, - [3] = { 300, baseMultiplier = 1.5, levelRequirement = 45, statInterpolation = { 2, }, }, - [4] = { 400, baseMultiplier = 1.5, levelRequirement = 84, statInterpolation = { 2, }, }, - }, -} -skills["ElementalHitSkeletonKnight"] = { - name = "Elemental Hit - Cold Variant", - hidden = true, - color = 2, - baseEffectiveness = 1.1667000055313, - incrementalEffectiveness = 0.04280000180006, - description = "Each attack with this skill will choose an element at random, and will only be able to deal damage of that element. If the attack hits an enemy, it will also deal damage in an area around them, with the radius being larger if that enemy is suffering from an ailment of the chosen element. It will avoid choosing the same element twice in a row.", - skillTypes = { [SkillType.Attack] = true, [SkillType.Projectile] = true, [SkillType.ProjectilesFromUser] = true, [SkillType.Totemable] = true, [SkillType.Trappable] = true, [SkillType.Mineable] = true, [SkillType.MeleeSingleTarget] = true, [SkillType.Multistrikeable] = true, [SkillType.Melee] = true, [SkillType.Fire] = true, [SkillType.Cold] = true, [SkillType.Lightning] = true, [SkillType.RangedAttack] = true, [SkillType.MirageArcherCanUse] = true, [SkillType.Area] = true, [SkillType.Triggerable] = true, [SkillType.RandomElement] = true, }, - statDescriptionScope = "skill_stat_descriptions", - castTime = 1, - baseFlags = { - attack = true, - projectile = true, - melee = true, - Fire = true, - Cold = true, - Lightning = true, - }, - baseMods = { - flag("DealNoPhysical"), - flag("DealNoMelee"), - flag("DealNoChaos"), - flag("DealNoFire"), - flag("DealNoLightning"), - mod("AreaOfEffect", "MORE", 80, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Chilled", "Frozen", "Brittle" }), mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Chilled" }), mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Frozen" }), mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Brittle" }), - }, - constantStats = { - { "chance_to_freeze_shock_ignite_%", 50 }, - }, - stats = { - "active_skill_damage_+%_final", - "skill_can_fire_arrows", - "skill_can_fire_wand_projectiles", - "action_attack_or_cast_time_uses_animation_length", - "projectile_uses_contact_position", - "use_scaled_contact_offset", - "is_area_damage", - }, - levels = { - [1] = { 150, baseMultiplier = 1.5, levelRequirement = 1, statInterpolation = { 2, }, }, - [3] = { 300, baseMultiplier = 1.5, levelRequirement = 45, statInterpolation = { 2, }, }, - [4] = { 400, baseMultiplier = 1.5, levelRequirement = 84, statInterpolation = { 2, }, }, - }, -} -skills["ElementalHitSkeletonKnight"] = { - name = "Elemental Hit - Lightning Variant", - hidden = true, - color = 2, - baseEffectiveness = 1.1667000055313, - incrementalEffectiveness = 0.04280000180006, - description = "Each attack with this skill will choose an element at random, and will only be able to deal damage of that element. If the attack hits an enemy, it will also deal damage in an area around them, with the radius being larger if that enemy is suffering from an ailment of the chosen element. It will avoid choosing the same element twice in a row.", - skillTypes = { [SkillType.Attack] = true, [SkillType.Projectile] = true, [SkillType.ProjectilesFromUser] = true, [SkillType.Totemable] = true, [SkillType.Trappable] = true, [SkillType.Mineable] = true, [SkillType.MeleeSingleTarget] = true, [SkillType.Multistrikeable] = true, [SkillType.Melee] = true, [SkillType.Fire] = true, [SkillType.Cold] = true, [SkillType.Lightning] = true, [SkillType.RangedAttack] = true, [SkillType.MirageArcherCanUse] = true, [SkillType.Area] = true, [SkillType.Triggerable] = true, [SkillType.RandomElement] = true, }, - statDescriptionScope = "skill_stat_descriptions", - castTime = 1, - baseFlags = { - attack = true, - projectile = true, - melee = true, - Fire = true, - Cold = true, - Lightning = true, - }, - baseMods = { - flag("DealNoPhysical"), - flag("DealNoMelee"), - flag("DealNoChaos"), - flag("DealNoFire"), - flag("DealNoCold"), - mod("AreaOfEffect", "MORE", 80, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Shocked", "Sapped" }), mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Shocked" }), mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Sapped" }), }, @@ -869,52 +595,6 @@ skills["ElementalHitSkeletonKnight"] = { [4] = { 400, baseMultiplier = 1.5, levelRequirement = 84, statInterpolation = { 2, }, }, }, } -skills["ElementalHitSkeletonKnight"] = { - name = "Elemental Hit - Defaulting to Fire PoB Code Limitation, one Skill Per Monsters Skill, Delete Later.", - hidden = true, - color = 2, - baseEffectiveness = 1.1667000055313, - incrementalEffectiveness = 0.04280000180006, - description = "Each attack with this skill will choose an element at random, and will only be able to deal damage of that element. If the attack hits an enemy, it will also deal damage in an area around them, with the radius being larger if that enemy is suffering from an ailment of the chosen element. It will avoid choosing the same element twice in a row.", - skillTypes = { [SkillType.Attack] = true, [SkillType.Projectile] = true, [SkillType.ProjectilesFromUser] = true, [SkillType.Totemable] = true, [SkillType.Trappable] = true, [SkillType.Mineable] = true, [SkillType.MeleeSingleTarget] = true, [SkillType.Multistrikeable] = true, [SkillType.Melee] = true, [SkillType.Fire] = true, [SkillType.Cold] = true, [SkillType.Lightning] = true, [SkillType.RangedAttack] = true, [SkillType.MirageArcherCanUse] = true, [SkillType.Area] = true, [SkillType.Triggerable] = true, [SkillType.RandomElement] = true, }, - statDescriptionScope = "skill_stat_descriptions", - castTime = 1, - baseFlags = { - attack = true, - projectile = true, - melee = true, - Fire = true, - Cold = true, - Lightning = true, - }, - baseMods = { - flag("DealNoPhysical"), - flag("DealNoMelee"), - flag("DealNoChaos"), - flag("DealNoCold"), - flag("DealNoLightning"), - mod("AreaOfEffect", "MORE", 80, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Ignited", "Scorched" }), - mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Ignited" }), - mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Scorched" }), - }, - constantStats = { - { "chance_to_freeze_shock_ignite_%", 50 }, - }, - stats = { - "active_skill_damage_+%_final", - "skill_can_fire_arrows", - "skill_can_fire_wand_projectiles", - "action_attack_or_cast_time_uses_animation_length", - "projectile_uses_contact_position", - "use_scaled_contact_offset", - "is_area_damage", - }, - levels = { - [1] = { 150, baseMultiplier = 1.5, levelRequirement = 1, statInterpolation = { 2, }, }, - [3] = { 300, baseMultiplier = 1.5, levelRequirement = 45, statInterpolation = { 2, }, }, - [4] = { 400, baseMultiplier = 1.5, levelRequirement = 84, statInterpolation = { 2, }, }, - }, -} skills["ElementalHitSkeletonKnightIncursion"] = { name = "Elemental Hit", hidden = true, diff --git a/src/Export/Skills/spectre.txt b/src/Export/Skills/spectre.txt index da5fdf81ef..168c247cad 100644 --- a/src/Export/Skills/spectre.txt +++ b/src/Export/Skills/spectre.txt @@ -80,53 +80,6 @@ local skills, mod, flag, skill = ... #flags spell aura area #mods -#skill ElementalHitSkeletonKnight Elemental Hit - Fire Variant -#flags attack area melee projectile Fire Cold Lightning -#baseMod flag("DealNoPhysical") -#baseMod flag("DealNoChaos") -#baseMod flag("DealNoCold") -#baseMod flag("DealNoLightning") -#baseMod mod("AreaOfEffect", "MORE", 80, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Ignited", "Scorched" }) -#baseMod mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Ignited" }) -#baseMod mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Scorched" }) -#mods - -#skill ElementalHitSkeletonKnight Elemental Hit - Cold Variant -#flags attack area melee projectile Fire Cold Lightning -#baseMod flag("DealNoPhysical") -#baseMod flag("DealNoChaos") -#baseMod flag("DealNoFire") -#baseMod flag("DealNoLightning") -#baseMod mod("AreaOfEffect", "MORE", 80, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Chilled", "Frozen", "Brittle" }) -#baseMod mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Chilled" }) -#baseMod mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Frozen" }) -#baseMod mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Brittle" }) -#mods - -#skill ElementalHitSkeletonKnight Elemental Hit - Lightning Variant -#flags attack area melee projectile Fire Cold Lightning -#baseMod flag("DealNoPhysical") -#baseMod flag("DealNoChaos") -#baseMod flag("DealNoFire") -#baseMod flag("DealNoCold") -#baseMod mod("AreaOfEffect", "MORE", 80, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Shocked", "Sapped" }) -#baseMod mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Shocked" }) -#baseMod mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Sapped" }) -#mods - -#skill ElementalHitSkeletonKnight Elemental Hit - Defaulting to Fire PoB Code Limitation, one Skill Per Monsters Skill, Delete Later. -#flags attack area melee projectile Fire Cold Lightning -#baseMod flag("DealNoPhysical") -#baseMod flag("DealNoProjectile") -#baseMod flag("DealNoChaos") -#baseMod flag("DealNoCold") -#baseMod flag("DealNoLightning") -#baseMod mod("AreaOfEffect", "MORE", 80, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Ignited", "Scorched" }) -#baseMod mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Ignited" }) -#baseMod mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Scorched" }) -#mods - - #skill DelayedBlastSpectre Delayed Blast #flags spell area #mods @@ -148,55 +101,23 @@ local skills, mod, flag, skill = ... #baseMod skill("hitTimeOverride", 1) #mods -#skill ElementalHitSkeletonKnight Elemental Hit - Fire Variant -#flags attack projectile melee Fire Cold Lightning +#skill ElementalHitSkeletonKnight Elemental Hit - Psuedo Tri-Conversion +#flags attack area melee projectile Fire Cold Lightning #baseMod flag("DealNoPhysical") -#baseMod flag("DealNoMelee") #baseMod flag("DealNoChaos") -#baseMod flag("DealNoCold") -#baseMod flag("DealNoLightning") -#baseMod mod("AreaOfEffect", "MORE", 80, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Ignited", "Scorched" }) +#baseMod mod("PhysicalDamageConvertToFire", "BASE", 100, 0, 0, { type = "BASE", }) +#baseMod mod("PhysicalDamageConvertToCold", "BASE", 100, 0, 0, { type = "BASE", }) +#baseMod mod("PhysicalDamageConvertToLightning", "BASE", 100, 0, 0, { type = "BASE", }) +#baseMod mod("AreaOfEffect", "MORE", 80, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Ignited", "Scorched", "Chilled", "Frozen", "Brittle", "Shocked", "Sapped" }) #baseMod mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Ignited" }) #baseMod mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Scorched" }) -#mods - -#skill ElementalHitSkeletonKnight Elemental Hit - Cold Variant -#flags attack projectile melee Fire Cold Lightning -#baseMod flag("DealNoPhysical") -#baseMod flag("DealNoMelee") -#baseMod flag("DealNoChaos") -#baseMod flag("DealNoFire") -#baseMod flag("DealNoLightning") -#baseMod mod("AreaOfEffect", "MORE", 80, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Chilled", "Frozen", "Brittle" }) #baseMod mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Chilled" }) #baseMod mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Frozen" }) #baseMod mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Brittle" }) -#mods - -#skill ElementalHitSkeletonKnight Elemental Hit - Lightning Variant -#flags attack projectile melee Fire Cold Lightning -#baseMod flag("DealNoPhysical") -#baseMod flag("DealNoMelee") -#baseMod flag("DealNoChaos") -#baseMod flag("DealNoFire") -#baseMod flag("DealNoCold") -#baseMod mod("AreaOfEffect", "MORE", 80, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Shocked", "Sapped" }) #baseMod mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Shocked" }) #baseMod mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Sapped" }) #mods -#skill ElementalHitSkeletonKnight Elemental Hit - Defaulting to Fire PoB Code Limitation, one Skill Per Monsters Skill, Delete Later. -#flags attack projectile melee Fire Cold Lightning -#baseMod flag("DealNoPhysical") -#baseMod flag("DealNoMelee") -#baseMod flag("DealNoChaos") -#baseMod flag("DealNoCold") -#baseMod flag("DealNoLightning") -#baseMod mod("AreaOfEffect", "MORE", 80, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Ignited", "Scorched" }) -#baseMod mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Ignited" }) -#baseMod mod("Multiplier:ElementalHitAilmentOnEnemy", "BASE", 1, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Scorched" }) -#mods - #skill ElementalHitSkeletonKnightIncursion #flags attack melee area #mods From b3f38ae567a41f2f1edf5d252d5d017dac58ecec Mon Sep 17 00:00:00 2001 From: Torchery <88600359+Torchery@users.noreply.github.com> Date: Fri, 25 Aug 2023 08:12:17 -0700 Subject: [PATCH 07/10] Update spectre.lua --- src/Data/Skills/spectre.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Data/Skills/spectre.lua b/src/Data/Skills/spectre.lua index 5a65529017..c2af705b29 100644 --- a/src/Data/Skills/spectre.lua +++ b/src/Data/Skills/spectre.lua @@ -544,7 +544,7 @@ skills["DemonModularBladeVortexSpectre"] = { }, } skills["ElementalHitSkeletonKnight"] = { - name = "Elemental Hit - Psuedo Tri-Conversion", + name = "Elemental Hit - Pseudo Tri-Conversion", hidden = true, color = 2, baseEffectiveness = 1.1667000055313, From 360173675af07acc990f295871f8acbe2683faa5 Mon Sep 17 00:00:00 2001 From: Torchery <88600359+Torchery@users.noreply.github.com> Date: Fri, 25 Aug 2023 08:21:23 -0700 Subject: [PATCH 08/10] Revert "Merge remote-tracking branch 'upstream/dev' into dev" This reverts commit 1857aacd67aac8f3b3010a6f2eaf7c6dac272e67, reversing changes made to b3f38ae567a41f2f1edf5d252d5d017dac58ecec. --- CHANGELOG.md | 21 ---------------- changelog.txt | 17 ------------- manifest.xml | 22 ++++++++--------- src/Data/ModCache.lua | 8 +++---- src/Data/SkillStatMap.lua | 6 +---- src/Data/Skills/sup_str.lua | 1 - src/Export/Skills/sup_str.txt | 2 +- src/Modules/Build.lua | 3 +-- src/Modules/CalcDefence.lua | 35 ++++++++++++++------------- src/Modules/CalcOffence.lua | 15 +----------- src/Modules/CalcSections.lua | 25 +++++++------------ src/Modules/CalcTriggers.lua | 45 ++++++++++++++++------------------- src/Modules/ModParser.lua | 4 ++-- 13 files changed, 68 insertions(+), 136 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9aca416791..5ad18328ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,26 +1,5 @@ # Changelog -## [v2.33.1](https://github.com/PathOfBuildingCommunity/PathOfBuilding/tree/v2.33.1) (2023/08/25) - -[Full Changelog](https://github.com/PathOfBuildingCommunity/PathOfBuilding/compare/v2.33.0...v2.33.1) - - - -## What's Changed -### Fixed Crashes -- Fix crash when using a trigger Wand mod [\#6486](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/6486) ([Paliak](https://github.com/Paliak)) -- Fix crash when using a trigger Helmet Focus mod [\#6486](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/6486) ([Paliak](https://github.com/Paliak)) -- Fix crash when using Flamewood Support [\#6486](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/6486) ([Paliak](https://github.com/Paliak)) -### User Interface -- Display Channel time in the sidebar for Skills triggered by Snipe [\#6486](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/6486) ([Paliak](https://github.com/Paliak)) -### Fixed Bugs -- Fix Hungry Loop not recognising Elemental Army [\#6489](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/6489) ([Paliak](https://github.com/Paliak)) -- Fix separate Totem Duration affecting Skill Duration [\#6488](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/6488) ([Paliak](https://github.com/Paliak)) -- Fix Melding of the Flesh not working correctly with Chieftain Valako ascendancy [\#6490](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/6490) ([Paliak](https://github.com/Paliak)) -- Fix Flamewood Support not being affected by Totem mods [\#6487](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/6487) ([Paliak](https://github.com/Paliak)) - - - ## [v2.33.0](https://github.com/PathOfBuildingCommunity/PathOfBuilding/tree/v2.33.0) (2023/08/25) [Full Changelog](https://github.com/PathOfBuildingCommunity/PathOfBuilding/compare/v2.32.2...v2.33.0) diff --git a/changelog.txt b/changelog.txt index 4b4a797dfa..117edf18e8 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,20 +1,3 @@ -VERSION[2.33.1][2023/08/25] - ---- Fixed Crashes --- -* Fix crash when using a trigger Wand mod (Paliak) -* Fix crash when using a trigger Helmet Focus mod (Paliak) -* Fix crash when using Flamewood Support (Paliak) - ---- User Interface --- -* Display Channel time in the sidebar for Skills triggered by Snipe (Paliak) - ---- Fixed Bugs --- -* Fix Hungry Loop not recognising Elemental Army (Paliak) -* Fix separate Totem Duration affecting Skill Duration (Paliak) -* Fix Melding of the Flesh not working correctly with Chieftain Valako ascendancy (Paliak) -* Fix Flamewood Support not being affected by Totem mods (Paliak) - - VERSION[2.33.0][2023/08/25] --- New to Path of Building --- diff --git a/manifest.xml b/manifest.xml index 99df5cc67d..5dd1d01912 100644 --- a/manifest.xml +++ b/manifest.xml @@ -1,11 +1,11 @@ - + - + @@ -112,7 +112,7 @@ - + @@ -133,8 +133,8 @@ - - + + @@ -194,26 +194,26 @@ - + - - + + - + - + - + diff --git a/src/Data/ModCache.lua b/src/Data/ModCache.lua index c508e686c0..dce59e7552 100644 --- a/src/Data/ModCache.lua +++ b/src/Data/ModCache.lua @@ -3565,7 +3565,7 @@ c["Has 2 Sockets"]={{[1]={flags=0,keywordFlags=0,name="SocketCount",type="BASE", c["Widowsilk Robe Quality: 20"]={nil,"Widowsilk Robe Quality: 20 "} c["Socketed Gems are Supported by Level 15 Increased Minion Life"]={{[1]={[1]={slotName="{SlotName}",type="SocketedIn"},flags=0,keywordFlags=0,name="ExtraSupport",type="LIST",value={level=15,skillId="SupportMinionLife"}}},nil} c["Shock Reflection"]={nil,"Shock Reflection "} -c["50% increased Totem Duration"]={{[1]={flags=0,keywordFlags=0,name="TotemDuration",type="INC",value=50}},nil} +c["50% increased Totem Duration"]={{[1]={flags=0,keywordFlags=16384,name="Duration",type="INC",value=50}},nil} c["Adds 1 to 10 Lightning Damage for each Shocked Enemy you've Killed Recently"]={{[1]={[1]={type="Multiplier",var="ShockedEnemyKilledRecently"},flags=0,keywordFlags=0,name="LightningMin",type="BASE",value=1},[2]={[1]={type="Multiplier",var="ShockedEnemyKilledRecently"},flags=0,keywordFlags=0,name="LightningMax",type="BASE",value=10}},nil} c["Minions have 9% chance to Freeze, Shock and Ignite"]={{[1]={flags=0,keywordFlags=0,name="MinionModifier",type="LIST",value={mod={flags=0,keywordFlags=0,name="EnemyFreezeChance",type="BASE",value=9}}},[2]={flags=0,keywordFlags=0,name="MinionModifier",type="LIST",value={mod={flags=0,keywordFlags=0,name="EnemyShockChance",type="BASE",value=9}}},[3]={flags=0,keywordFlags=0,name="MinionModifier",type="LIST",value={mod={flags=0,keywordFlags=0,name="EnemyIgniteChance",type="BASE",value=9}}}},nil} c["141% increased Armour and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="ArmourAndEnergyShield",type="INC",value=141}},nil} @@ -4578,7 +4578,7 @@ c["Lose 1% of Life on Kill"]={{[1]={[1]={percent=1,stat="Life",type="PercentStat c["Minions have 100% increased Movement Speed"]={{[1]={flags=0,keywordFlags=0,name="MinionModifier",type="LIST",value={mod={flags=0,keywordFlags=0,name="MovementSpeed",type="INC",value=100}}}},nil} c["+34 to Armour"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="BASE",value=34}},nil} c["Summoned Holy Relics have 24% reduced Cooldown Recovery Speed"]={{[1]={[1]={skillName="Summon Holy Relic",type="SkillName"},flags=0,keywordFlags=0,name="MinionModifier",type="LIST",value={mod={flags=0,keywordFlags=0,name="CooldownRecovery",type="INC",value=-24}}}},nil} -c["30% increased Totem Duration"]={{[1]={flags=0,keywordFlags=0,name="TotemDuration",type="INC",value=30}},nil} +c["30% increased Totem Duration"]={{[1]={flags=0,keywordFlags=16384,name="Duration",type="INC",value=30}},nil} c["80% increased Maximum total Life Recovery per second from Leech"]={{[1]={flags=0,keywordFlags=0,name="MaxLifeLeechRate",type="INC",value=80}},nil} c["Majestic Plate League: Ancestor"]={nil,"Majestic Plate League: Ancestor "} c["Minions have 37% increased maximum Life"]={{[1]={flags=0,keywordFlags=0,name="MinionModifier",type="LIST",value={mod={flags=0,keywordFlags=0,name="Life",type="INC",value=37}}}},nil} @@ -5089,7 +5089,7 @@ c["1% increased Maximum Mana per Abyss Jewel affecting you"]={{[1]={[1]={type="M c["0.34% of Attack Damage Leeched as Mana"]={{[1]={flags=1,keywordFlags=0,name="DamageManaLeech",type="BASE",value=0.34}},nil} c["+9% to all Elemental Resistances"]={{[1]={flags=0,keywordFlags=0,name="ElementalResist",type="BASE",value=9}},nil} c["Summoned Arbalists gain 40% of Physical Damage as Extra Lightning Damage"]={{[1]={[1]={skillName="Summon Arbalists",type="SkillName"},flags=0,keywordFlags=0,name="MinionModifier",type="LIST",value={mod={flags=0,keywordFlags=0,name="PhysicalDamageGainAsLightning",type="BASE",value=40}}}},nil} -c["20% increased Totem Duration"]={{[1]={flags=0,keywordFlags=0,name="TotemDuration",type="INC",value=20}},nil} +c["20% increased Totem Duration"]={{[1]={flags=0,keywordFlags=16384,name="Duration",type="INC",value=20}},nil} c["+40% to Critical Strike Multiplier if you've cast Enfeeble in the past 10 seconds"]={{[1]={[1]={type="Condition",var="SelfCastEnfeeble"},flags=0,keywordFlags=0,name="CritMultiplier",type="BASE",value=40}},nil} c["Minions have 10% increased Cast Speed"]={{[1]={flags=0,keywordFlags=0,name="MinionModifier",type="LIST",value={mod={flags=16,keywordFlags=0,name="Speed",type="INC",value=10}}}},nil} c["Elder Sword Quality: 20"]={nil,"Elder Sword Quality: 20 "} @@ -13268,7 +13268,7 @@ c["Seaglass Amulet"]={nil,"Seaglass Amulet "} c["Minions deal 37% increased Damage"]={{[1]={flags=0,keywordFlags=0,name="MinionModifier",type="LIST",value={mod={flags=0,keywordFlags=0,name="Damage",type="INC",value=37}}}},nil} c["Allocates Born in the Shadows if you have the matching modifier on Forbidden Flame"]={{[1]={flags=0,keywordFlags=0,name="GrantedAscendancyNode",type="LIST",value={name="born in the shadows",side="flame"}}},nil} c["Summoned Skeletons take 26% of their Maximum Life per second as Fire Damage"]={{[1]={[1]={skillName="Summon Skeleton",type="SkillName"},flags=0,keywordFlags=0,name="MinionModifier",type="LIST",value={mod={[1]={percent=26,stat="Life",type="PercentStat"},flags=0,keywordFlags=0,name="FireDegen",type="BASE",value=1}}}},nil} -c["100% increased Totem Duration"]={{[1]={flags=0,keywordFlags=0,name="TotemDuration",type="INC",value=100}},nil} +c["100% increased Totem Duration"]={{[1]={flags=0,keywordFlags=16384,name="Duration",type="INC",value=100}},nil} c["3% increased Area of Effect per Power Charge, up to a maximum of 50%"]={{[1]={[1]={globalLimit=50,globalLimitKey="VastPower",type="Multiplier",var="PowerCharge"},flags=0,keywordFlags=0,name="AreaOfEffect",type="INC",value=3}},nil} c["Auras from your Skills grant 5% increased Recovery Rate of Life,"]={{[1]={flags=0,keywordFlags=0,name="ExtraAuraEffect",type="LIST",value={mod={flags=0,keywordFlags=0,name="FlaskRecoveryRate",type="INC",value=5}}}}," of Life, "} c["47% chance to cause Bleeding on Hit"]={{[1]={flags=0,keywordFlags=0,name="BleedChance",type="BASE",value=47}},nil} diff --git a/src/Data/SkillStatMap.lua b/src/Data/SkillStatMap.lua index 319ed86873..e24fcba92f 100644 --- a/src/Data/SkillStatMap.lua +++ b/src/Data/SkillStatMap.lua @@ -1514,11 +1514,7 @@ return { div = 60, }, ["totem_duration_+%"] = { - mod("TotemDuration", "INC", nil), -}, -["base_totem_duration"] = { - mod("TotemDuration", "BASE", nil), - div = 1000 + mod("Duration", "INC", nil, 0, KeywordFlag.Totem), }, -- Minion ["minion_damage_+%"] = { diff --git a/src/Data/Skills/sup_str.lua b/src/Data/Skills/sup_str.lua index cf27fe4e4a..e0dc153846 100644 --- a/src/Data/Skills/sup_str.lua +++ b/src/Data/Skills/sup_str.lua @@ -2326,7 +2326,6 @@ skills["AvengingFlame"] = { }, baseFlags = { area = true, - totem = true, }, qualityStats = { Default = { diff --git a/src/Export/Skills/sup_str.txt b/src/Export/Skills/sup_str.txt index 3b33344f3b..356310dfc5 100644 --- a/src/Export/Skills/sup_str.txt +++ b/src/Export/Skills/sup_str.txt @@ -317,7 +317,7 @@ local skills, mod, flag, skill = ... -- Display only } }, -#flags area totem +#flags area #mods #skill SupportFortify diff --git a/src/Modules/Build.lua b/src/Modules/Build.lua index 1f361517a6..c3e16bb5ba 100644 --- a/src/Modules/Build.lua +++ b/src/Modules/Build.lua @@ -245,11 +245,10 @@ function buildMode:Init(dbFileName, buildName, buildXML, convertBuild) { stat = "WarcryCastTime", label = "Cast Time", fmt = ".2fs", compPercent = true, lowerIsBetter = true, flag = "warcry" }, { stat = "HitSpeed", label = "Hit Rate", fmt = ".2f", compPercent = true, condFunc = function(v,o) return not o.TriggerTime end }, { stat = "HitTime", label = "Channel Time", fmt = ".2fs", compPercent = true, flag = "channelRelease", lowerIsBetter = true, condFunc = function(v,o) return not o.TriggerTime end }, - { stat = "ChannelTimeToTrigger", label = "Channel Time", fmt = ".2fs", compPercent = true, lowerIsBetter = true, }, { stat = "TrapThrowingTime", label = "Trap Throwing Time", fmt = ".2fs", compPercent = true, lowerIsBetter = true, }, { stat = "TrapCooldown", label = "Trap Cooldown", fmt = ".3fs", lowerIsBetter = true }, { stat = "MineLayingTime", label = "Mine Throwing Time", fmt = ".2fs", compPercent = true, lowerIsBetter = true, }, - { stat = "TotemPlacementTime", label = "Totem Placement Time", fmt = ".2fs", compPercent = true, lowerIsBetter = true, condFunc = function(v,o) return not o.TriggerTime end }, + { stat = "TotemPlacementTime", label = "Totem Placement Time", fmt = ".2fs", compPercent = true, lowerIsBetter = true, }, { stat = "PreEffectiveCritChance", label = "Crit Chance", fmt = ".2f%%" }, { stat = "CritChance", label = "Effective Crit Chance", fmt = ".2f%%", condFunc = function(v,o) return v ~= o.PreEffectiveCritChance end }, { stat = "CritMultiplier", label = "Crit Multiplier", fmt = "d%%", pc = true, condFunc = function(v,o) return (o.CritChance or 0) > 0 end }, diff --git a/src/Modules/CalcDefence.lua b/src/Modules/CalcDefence.lua index 26aff31bf8..bd60657ead 100644 --- a/src/Modules/CalcDefence.lua +++ b/src/Modules/CalcDefence.lua @@ -295,6 +295,24 @@ function calcs.defence(env, actor) -- Resistances output["PhysicalResist"] = 0 + + -- Highest Maximum Elemental Resistance for Melding of the Flesh + if modDB:Flag(nil, "ElementalResistMaxIsHighestResistMax") then + local highestResistMax = 0; + local highestResistMaxType = ""; + for _, elem in ipairs(resistTypeList) do + local resistMax = modDB:Override(nil, elem.."ResistMax") or m_min(data.misc.MaxResistCap, modDB:Sum("BASE", nil, elem.."ResistMax", isElemental[elem] and "ElementalResistMax")) + if resistMax > highestResistMax and isElemental[elem] then + highestResistMax = resistMax; + highestResistMaxType = elem; + end + end + for _, elem in ipairs(resistTypeList) do + if isElemental[elem] then + modDB:NewMod(elem.."ResistMax", "OVERRIDE", highestResistMax, highestResistMaxType.." Melding of the Flesh"); + end + end + end -- Process Resistance conversion mods for _, resFrom in ipairs(resistTypeList) do @@ -337,23 +355,6 @@ function calcs.defence(env, actor) end end - -- Highest Maximum Elemental Resistance for Melding of the Flesh - if modDB:Flag(nil, "ElementalResistMaxIsHighestResistMax") then - local highestResistMax = 0; - local highestResistMaxType = ""; - for _, elem in ipairs(resistTypeList) do - local resistMax = modDB:Override(nil, elem.."ResistMax") or m_min(data.misc.MaxResistCap, modDB:Sum("BASE", nil, elem.."ResistMax", isElemental[elem] and "ElementalResistMax")) - if resistMax > highestResistMax and isElemental[elem] then - highestResistMax = resistMax; - highestResistMaxType = elem; - end - end - for _, elem in ipairs(resistTypeList) do - if isElemental[elem] then - modDB:NewMod(elem.."ResistMax", "OVERRIDE", highestResistMax, highestResistMaxType.." Melding of the Flesh"); - end - end - end for _, elem in ipairs(resistTypeList) do local min, max, total, totemTotal, totemMax diff --git a/src/Modules/CalcOffence.lua b/src/Modules/CalcOffence.lua index 38de86046d..5c62f675a3 100644 --- a/src/Modules/CalcOffence.lua +++ b/src/Modules/CalcOffence.lua @@ -1388,20 +1388,7 @@ function calcs.offence(env, actor, activeSkill) } end end - output.TotemDurationMod = calcLib.mod(skillModList, skillCfg, "Duration", "PrimaryDuration", "TotemDuration") - local TotemDurationBase = skillModList:Sum("BASE", skillCfg, "TotemDuration") - output.TotemDuration = m_ceil(TotemDurationBase * output.TotemDurationMod * data.misc.ServerTickRate) / data.misc.ServerTickRate - if breakdown then - breakdown.TotemDurationMod = breakdown.mod(skillModList, skillCfg, "Duration", "PrimaryDuration", "TotemDuration") - breakdown.TotemDuration = { - s_format("%.2fs ^8(base)", TotemDurationBase), - } - if output.TotemDurationMod ~= 1 then - t_insert(breakdown.TotemDuration, s_format("x %.4f ^8(duration modifier)", output.TotemDurationMod)) - end - t_insert(breakdown.TotemDuration, s_format("rounded up to nearest server tick")) - t_insert(breakdown.TotemDuration, s_format("= %.3fs", output.TotemDuration)) - end + end -- Skill uptime diff --git a/src/Modules/CalcSections.lua b/src/Modules/CalcSections.lua index f32606b9dc..1ce86d2757 100644 --- a/src/Modules/CalcSections.lua +++ b/src/Modules/CalcSections.lua @@ -625,7 +625,7 @@ return { { modName = "CooldownRecovery", cfg = "skill" }, }, }, { label = "Stored Uses", haveOutput = "StoredUses", { format = "{output:StoredUses}", - { breakdown = "StoredUses" }, + { breakdown = "StoredUses" }, { modName = "AdditionalCooldownUses", cfg = "skill" }, }, }, { label = "Duration Mod", flag = "duration", { format = "x {4:output:DurationMod}", @@ -730,26 +730,19 @@ return { { label = "Area of Effect modifiers", modName = "MineDetonationAreaOfEffect", cfg = "skill" }, }, }, { label = "Mine Aura Radius", haveOutput = "MineAuraRadius", { format = "{0:output:MineAuraRadius}", { breakdown = "MineAuraRadius" }, }, }, - { label = "Totem Place Time", flag = "totem", notFlag = "triggered", { format = "{2:output:TotemPlacementTime}s", + { label = "Totem Place Time", flag = "totem", { format = "{2:output:TotemPlacementTime}s", { breakdown = "TotemPlacementTime" }, { modName = "TotemPlacementSpeed", cfg = "skill" }, }, }, - { label = "Active Totem Limit", flag = "totem", notFlag = "triggered", { format = "{0:output:ActiveTotemLimit}", + { label = "Active Totem Limit", flag = "totem", { format = "{0:output:ActiveTotemLimit}", { breakdown = "ActiveTotemLimit" }, { modName = { "ActiveTotemLimit", "ActiveBallistaLimit" }, cfg = "skill" }, }, }, - { label = "Totem Duration Mod", flagList = {"duration", "totem"}, { format = "x {4:output:TotemDurationMod}", - { breakdown = "TotemDurationMod" }, - { modName = { "Duration", "PrimaryDuration", "TotemDuration" }, cfg = "skill" }, - }, }, - { label = "Totem Duration", flagList = {"duration", "totem"}, { format = "x {4:output:TotemDuration}", - { breakdown = "TotemDuration" }, - }, }, - { label = "Totem Life Mod", flag = "totem", notFlag = "triggered", { format = "x {2:output:TotemLifeMod}", + { label = "Totem Life Mod", flag = "totem", { format = "x {2:output:TotemLifeMod}", { breakdown = "TotemLifeMod" }, { modName = "TotemLife", cfg = "skill" }, }, }, - { label = "Totem Life", flag = "totem", notFlag = "triggered", { format = "{0:output:TotemLife}", { breakdown = "TotemLife" }, }, }, + { label = "Totem Life", flag = "totem", { format = "{0:output:TotemLife}", { breakdown = "TotemLife" }, }, }, { label = "Totem ES", haveOutput = "TotemEnergyShield", { format = "{0:output:TotemEnergyShield}", { breakdown = "TotemEnergyShield" }, { modName = "TotemEnergyShield", cfg = "skill" }, @@ -763,19 +756,19 @@ return { { modName = "TotemArmour", cfg = "skill" }, }, }, { label = "Active Brand Limit", flag = "brand", { format = "{0:output:ActiveBrandLimit}", { modName = "ActiveBrandLimit", cfg = "skill" }, }, }, - { label = "Totem Fire Res", flag = "totem", notFlag = "triggered",{ format = "{0:output:TotemFireResist}% (+{0:output:TotemFireResistOverCap}%)", + { label = "Totem Fire Res", flag = "totem", { format = "{0:output:TotemFireResist}% (+{0:output:TotemFireResistOverCap}%)", { breakdown = "TotemFireResist" }, { modName = { "TotemFireResistMax", "TotemElementalResistMax", "TotemFireResist", "TotemElementalResist" }, }, }, }, - { label = "Totem Cold Res", flag = "totem", notFlag = "triggered", { format = "{0:output:TotemColdResist}% (+{0:output:TotemColdResistOverCap}%)", + { label = "Totem Cold Res", flag="totem", { format = "{0:output:TotemColdResist}% (+{0:output:TotemColdResistOverCap}%)", { breakdown = "TotemColdResist" }, { modName = { "TotemColdResistMax", "TotemElementalResistMax", "TotemColdResist", "TotemElementalResist" }, }, }, }, - { label = "Totem Lightning Res", flag = "totem", notFlag = "triggered", { format = "{0:output:TotemLightningResist}% (+{0:output:TotemLightningResistOverCap}%)", + { label = "Totem Lightning Res", flag="totem", { format = "{0:output:TotemLightningResist}% (+{0:output:TotemLightningResistOverCap}%)", { breakdown = "TotemLightningResist" }, { modName = { "TotemLightningResistMax", "TotemElementalResistMax", "TotemLightningResist", "TotemElementalResist" }, }, }, }, - { label = "Totem Chaos Res", flag = "totem", notFlag = "triggered", { format = "{0:output:TotemChaosResist}% (+{0:output:TotemChaosResistOverCap}%)", + { label = "Totem Chaos Res", flag="totem", { format = "{0:output:TotemChaosResist}% (+{0:output:TotemChaosResistOverCap}%)", { breakdown = "TotemChaosResist" }, { modName = { "TotemChaosResistMax", "TotemChaosResist" }, }, }, }, diff --git a/src/Modules/CalcTriggers.lua b/src/Modules/CalcTriggers.lua index 196012b8ab..afaf093518 100644 --- a/src/Modules/CalcTriggers.lua +++ b/src/Modules/CalcTriggers.lua @@ -344,7 +344,7 @@ local function mirageArcherHandler(env) end local function helmetFocusHandler(env) - if not env.player.mainSkill.skillFlags.minion and not env.player.mainSkill.skillFlags.disable and env.player.mainSkill.triggeredBy then + if not env.player.mainSkill.skillFlags.minion and not env.player.mainSkill.skillFlags.disable then local triggerName = "Focus" env.player.mainSkill.skillData.triggered = true local output = env.player.output @@ -564,7 +564,6 @@ local function CWCHandler(env) -- Account for Trigger-related INC/MORE modifiers addTriggerIncMoreMods(env.player.mainSkill, env.player.mainSkill) - env.player.output.ChannelTimeToTrigger = source.skillData.triggerTime env.player.mainSkill.skillData.triggered = true env.player.mainSkill.skillFlags.globalTrigger = true env.player.mainSkill.skillData.triggerSource = source @@ -848,7 +847,7 @@ local function defaultTriggerHandler(env, config) end end if #triggeredSkills > 0 or not config.triggeredSkillCond then - if not source and not (actor.mainSkill.skillFlags.globalTrigger and config.triggeredSkillCond) then + if not source and not actor.mainSkill.skillFlags.globalTrigger then actor.mainSkill.skillData.triggered = nil actor.mainSkill.infoMessage2 = "DPS reported assuming Self-Cast" actor.mainSkill.infoMessage = s_format("No %s Triggering Skill Found", config.triggerName) @@ -1447,28 +1446,26 @@ local configTable = { triggeredSkillCond = function(env, skill) return skill.skillData.triggeredByUnique and env.player.mainSkill.socketGroup.slot == skill.socketGroup.slot end} end, ["Trigger Craft"] = function(env) - if env.player.mainSkill.skillData.triggeredByCraft then - local trigRate, source, uuid, useCastRate, triggeredSkills - triggeredSkills = {} - for _, skill in ipairs(env.player.activeSkillList) do - local triggered = skill.skillData.triggeredByUnique or skill.skillData.triggered or skill.skillTypes[SkillType.InbuiltTrigger] or skill.skillTypes[SkillType.Triggered] - if (skill.skillTypes[SkillType.Damage] or skill.skillTypes[SkillType.Attack] or skill.skillTypes[SkillType.Spell]) and not skill.skillFlags.aura and skill ~= env.player.mainSkill and not skill.skillData.triggeredByCraft and not skill.activeEffect.grantedEffect.fromItem and not triggered then - source, trigRate, uuid = findTriggerSkill(env, skill, source, trigRate) - if skill.skillFlags and (skill.skillFlags.totem or skill.skillFlags.golem or skill.skillFlags.banner or skill.skillFlags.ballista) and skill.activeEffect.grantedEffect.castTime then - if skill.activeEffect.grantedEffect.levels ~= nil then - trigRate = 1 / (skill.activeEffect.grantedEffect.castTime + (skill.activeEffect.grantedEffect.levels[skill.activeEffect.level].cooldown or 0)) - else - trigRate = 1 / skill.activeEffect.grantedEffect.castTime - end - useCastRate = true + local trigRate, source, uuid, useCastRate, triggeredSkills + triggeredSkills = {} + for _, skill in ipairs(env.player.activeSkillList) do + local triggered = skill.skillData.triggeredByUnique or skill.skillData.triggered or skill.skillTypes[SkillType.InbuiltTrigger] or skill.skillTypes[SkillType.Triggered] + if (skill.skillTypes[SkillType.Damage] or skill.skillTypes[SkillType.Attack] or skill.skillTypes[SkillType.Spell]) and skill ~= env.player.mainSkill and not skill.skillData.triggeredByCraft and not skill.activeEffect.grantedEffect.fromItem and not triggered then + source, trigRate, uuid = findTriggerSkill(env, skill, source, trigRate) + if skill.skillFlags and (skill.skillFlags.totem or skill.skillFlags.golem or skill.skillFlags.banner or skill.skillFlags.ballista) and skill.activeEffect.grantedEffect.castTime then + if skill.activeEffect.grantedEffect.levels ~= nil then + trigRate = 1 / (skill.activeEffect.grantedEffect.castTime + (skill.activeEffect.grantedEffect.levels[skill.activeEffect.level].cooldown or 0)) + else + trigRate = 1 / skill.activeEffect.grantedEffect.castTime end - end - if skill.skillData.triggeredByCraft and env.player.mainSkill.socketGroup.slot == skill.socketGroup.slot then - t_insert(triggeredSkills, packageSkillDataForSimulation(skill)) + useCastRate = true end end - return {trigRate = trigRate, source = source, uuid = uuid, useCastRate = useCastRate, triggeredSkills = triggeredSkills} + if skill.skillData.triggeredByCraft and env.player.mainSkill.socketGroup.slot == skill.socketGroup.slot then + t_insert(triggeredSkills, packageSkillDataForSimulation(skill)) + end end + return {trigRate = trigRate, source = source, uuid = uuid, useCastRate = useCastRate, triggeredSkills = triggeredSkills} end, ["Kitava's Thirst"] = function(env) local requiredManaCost = env.player.modDB:Sum("BASE", nil, "KitavaRequiredManaCost") @@ -1486,10 +1483,10 @@ local configTable = { end, ["Mjolner"] = function() return {triggerSkillCond = function(env, skill) - return (skill.skillTypes[SkillType.Damage] or skill.skillTypes[SkillType.Attack]) and band(skill.skillCfg.flags, bor(ModFlag.Mace, ModFlag.Weapon1H)) > 0 and not slotMatch(env, skill) + return (skill.skillTypes[SkillType.Damage] or skill.skillTypes[SkillType.Attack]) and band(skill.skillCfg.flags, bor(ModFlag.Mace, ModFlag.Weapon1H)) > 0 end, triggeredSkillCond = function(env, skill) - return skill.skillData.triggeredByMjolner and slotMatch(env, skill) + return skill.skillData.triggeredByMjolner and env.player.mainSkill.socketGroup.slot == skill.socketGroup.slot end} end, ["Cospri's Malice"] = function() @@ -1706,10 +1703,8 @@ local configTable = { skill.skillData.hitTimeMultiplier = snipeStages - 0.5 source, _, uuid = findTriggerSkill(env, skill, source) trigRate = GlobalCache.cachedData["CACHE"][uuid].Env.player.output.HitSpeed - env.player.output.ChannelTimeToTrigger = GlobalCache.cachedData["CACHE"][uuid].Env.player.output.HitTime end end - return {trigRate = trigRate, source = source} else env.player.mainSkill.skillData.triggered = nil diff --git a/src/Modules/ModParser.lua b/src/Modules/ModParser.lua index 80db3c1d38..3a7ec276ff 100644 --- a/src/Modules/ModParser.lua +++ b/src/Modules/ModParser.lua @@ -517,7 +517,7 @@ local modNameList = { -- Totem/trap/mine/brand modifiers ["totem placement speed"] = "TotemPlacementSpeed", ["totem life"] = "TotemLife", - ["totem duration"] = "TotemDuration", + ["totem duration"] = { "Duration", keywordFlags = KeywordFlag.Totem }, ["maximum number of summoned totems"] = "ActiveTotemLimit", ["maximum number of summoned totems."] = "ActiveTotemLimit", -- Mark plz ["maximum number of summoned ballista totems"] = { "ActiveBallistaLimit", tag = { type = "SkillType", skillType = SkillType.TotemsAreBallistae } }, @@ -1780,7 +1780,7 @@ local function triggerExtraSkill(name, level, noSupports, sourceSkill, triggerCh end end local function extraSupport(name, level, slot) - local skillId = gemIdLookup[name] or gemIdLookup[name:gsub("^increased ","")] or gemIdLookup[name:gsub(" support$","")] + local skillId = gemIdLookup[name] or gemIdLookup[name:gsub("^increased ","")] if itemSlotName == "main hand" then slot = "Weapon 1" From 39f66ed67e3ede64f50e2646921c285395b373a7 Mon Sep 17 00:00:00 2001 From: Torchery <88600359+Torchery@users.noreply.github.com> Date: Fri, 25 Aug 2023 08:21:31 -0700 Subject: [PATCH 09/10] Revert "Revert "Merge remote-tracking branch 'upstream/dev' into dev"" This reverts commit 360173675af07acc990f295871f8acbe2683faa5. --- CHANGELOG.md | 21 ++++++++++++++++ changelog.txt | 17 +++++++++++++ manifest.xml | 22 ++++++++--------- src/Data/ModCache.lua | 8 +++---- src/Data/SkillStatMap.lua | 6 ++++- src/Data/Skills/sup_str.lua | 1 + src/Export/Skills/sup_str.txt | 2 +- src/Modules/Build.lua | 3 ++- src/Modules/CalcDefence.lua | 35 +++++++++++++-------------- src/Modules/CalcOffence.lua | 15 +++++++++++- src/Modules/CalcSections.lua | 25 ++++++++++++------- src/Modules/CalcTriggers.lua | 45 +++++++++++++++++++---------------- src/Modules/ModParser.lua | 4 ++-- 13 files changed, 136 insertions(+), 68 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ad18328ee..9aca416791 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,26 @@ # Changelog +## [v2.33.1](https://github.com/PathOfBuildingCommunity/PathOfBuilding/tree/v2.33.1) (2023/08/25) + +[Full Changelog](https://github.com/PathOfBuildingCommunity/PathOfBuilding/compare/v2.33.0...v2.33.1) + + + +## What's Changed +### Fixed Crashes +- Fix crash when using a trigger Wand mod [\#6486](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/6486) ([Paliak](https://github.com/Paliak)) +- Fix crash when using a trigger Helmet Focus mod [\#6486](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/6486) ([Paliak](https://github.com/Paliak)) +- Fix crash when using Flamewood Support [\#6486](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/6486) ([Paliak](https://github.com/Paliak)) +### User Interface +- Display Channel time in the sidebar for Skills triggered by Snipe [\#6486](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/6486) ([Paliak](https://github.com/Paliak)) +### Fixed Bugs +- Fix Hungry Loop not recognising Elemental Army [\#6489](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/6489) ([Paliak](https://github.com/Paliak)) +- Fix separate Totem Duration affecting Skill Duration [\#6488](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/6488) ([Paliak](https://github.com/Paliak)) +- Fix Melding of the Flesh not working correctly with Chieftain Valako ascendancy [\#6490](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/6490) ([Paliak](https://github.com/Paliak)) +- Fix Flamewood Support not being affected by Totem mods [\#6487](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/6487) ([Paliak](https://github.com/Paliak)) + + + ## [v2.33.0](https://github.com/PathOfBuildingCommunity/PathOfBuilding/tree/v2.33.0) (2023/08/25) [Full Changelog](https://github.com/PathOfBuildingCommunity/PathOfBuilding/compare/v2.32.2...v2.33.0) diff --git a/changelog.txt b/changelog.txt index 117edf18e8..4b4a797dfa 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,20 @@ +VERSION[2.33.1][2023/08/25] + +--- Fixed Crashes --- +* Fix crash when using a trigger Wand mod (Paliak) +* Fix crash when using a trigger Helmet Focus mod (Paliak) +* Fix crash when using Flamewood Support (Paliak) + +--- User Interface --- +* Display Channel time in the sidebar for Skills triggered by Snipe (Paliak) + +--- Fixed Bugs --- +* Fix Hungry Loop not recognising Elemental Army (Paliak) +* Fix separate Totem Duration affecting Skill Duration (Paliak) +* Fix Melding of the Flesh not working correctly with Chieftain Valako ascendancy (Paliak) +* Fix Flamewood Support not being affected by Totem mods (Paliak) + + VERSION[2.33.0][2023/08/25] --- New to Path of Building --- diff --git a/manifest.xml b/manifest.xml index 5dd1d01912..99df5cc67d 100644 --- a/manifest.xml +++ b/manifest.xml @@ -1,11 +1,11 @@ - + - + @@ -112,7 +112,7 @@ - + @@ -133,8 +133,8 @@ - - + + @@ -194,26 +194,26 @@ - + - - + + - + - + - + diff --git a/src/Data/ModCache.lua b/src/Data/ModCache.lua index dce59e7552..c508e686c0 100644 --- a/src/Data/ModCache.lua +++ b/src/Data/ModCache.lua @@ -3565,7 +3565,7 @@ c["Has 2 Sockets"]={{[1]={flags=0,keywordFlags=0,name="SocketCount",type="BASE", c["Widowsilk Robe Quality: 20"]={nil,"Widowsilk Robe Quality: 20 "} c["Socketed Gems are Supported by Level 15 Increased Minion Life"]={{[1]={[1]={slotName="{SlotName}",type="SocketedIn"},flags=0,keywordFlags=0,name="ExtraSupport",type="LIST",value={level=15,skillId="SupportMinionLife"}}},nil} c["Shock Reflection"]={nil,"Shock Reflection "} -c["50% increased Totem Duration"]={{[1]={flags=0,keywordFlags=16384,name="Duration",type="INC",value=50}},nil} +c["50% increased Totem Duration"]={{[1]={flags=0,keywordFlags=0,name="TotemDuration",type="INC",value=50}},nil} c["Adds 1 to 10 Lightning Damage for each Shocked Enemy you've Killed Recently"]={{[1]={[1]={type="Multiplier",var="ShockedEnemyKilledRecently"},flags=0,keywordFlags=0,name="LightningMin",type="BASE",value=1},[2]={[1]={type="Multiplier",var="ShockedEnemyKilledRecently"},flags=0,keywordFlags=0,name="LightningMax",type="BASE",value=10}},nil} c["Minions have 9% chance to Freeze, Shock and Ignite"]={{[1]={flags=0,keywordFlags=0,name="MinionModifier",type="LIST",value={mod={flags=0,keywordFlags=0,name="EnemyFreezeChance",type="BASE",value=9}}},[2]={flags=0,keywordFlags=0,name="MinionModifier",type="LIST",value={mod={flags=0,keywordFlags=0,name="EnemyShockChance",type="BASE",value=9}}},[3]={flags=0,keywordFlags=0,name="MinionModifier",type="LIST",value={mod={flags=0,keywordFlags=0,name="EnemyIgniteChance",type="BASE",value=9}}}},nil} c["141% increased Armour and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="ArmourAndEnergyShield",type="INC",value=141}},nil} @@ -4578,7 +4578,7 @@ c["Lose 1% of Life on Kill"]={{[1]={[1]={percent=1,stat="Life",type="PercentStat c["Minions have 100% increased Movement Speed"]={{[1]={flags=0,keywordFlags=0,name="MinionModifier",type="LIST",value={mod={flags=0,keywordFlags=0,name="MovementSpeed",type="INC",value=100}}}},nil} c["+34 to Armour"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="BASE",value=34}},nil} c["Summoned Holy Relics have 24% reduced Cooldown Recovery Speed"]={{[1]={[1]={skillName="Summon Holy Relic",type="SkillName"},flags=0,keywordFlags=0,name="MinionModifier",type="LIST",value={mod={flags=0,keywordFlags=0,name="CooldownRecovery",type="INC",value=-24}}}},nil} -c["30% increased Totem Duration"]={{[1]={flags=0,keywordFlags=16384,name="Duration",type="INC",value=30}},nil} +c["30% increased Totem Duration"]={{[1]={flags=0,keywordFlags=0,name="TotemDuration",type="INC",value=30}},nil} c["80% increased Maximum total Life Recovery per second from Leech"]={{[1]={flags=0,keywordFlags=0,name="MaxLifeLeechRate",type="INC",value=80}},nil} c["Majestic Plate League: Ancestor"]={nil,"Majestic Plate League: Ancestor "} c["Minions have 37% increased maximum Life"]={{[1]={flags=0,keywordFlags=0,name="MinionModifier",type="LIST",value={mod={flags=0,keywordFlags=0,name="Life",type="INC",value=37}}}},nil} @@ -5089,7 +5089,7 @@ c["1% increased Maximum Mana per Abyss Jewel affecting you"]={{[1]={[1]={type="M c["0.34% of Attack Damage Leeched as Mana"]={{[1]={flags=1,keywordFlags=0,name="DamageManaLeech",type="BASE",value=0.34}},nil} c["+9% to all Elemental Resistances"]={{[1]={flags=0,keywordFlags=0,name="ElementalResist",type="BASE",value=9}},nil} c["Summoned Arbalists gain 40% of Physical Damage as Extra Lightning Damage"]={{[1]={[1]={skillName="Summon Arbalists",type="SkillName"},flags=0,keywordFlags=0,name="MinionModifier",type="LIST",value={mod={flags=0,keywordFlags=0,name="PhysicalDamageGainAsLightning",type="BASE",value=40}}}},nil} -c["20% increased Totem Duration"]={{[1]={flags=0,keywordFlags=16384,name="Duration",type="INC",value=20}},nil} +c["20% increased Totem Duration"]={{[1]={flags=0,keywordFlags=0,name="TotemDuration",type="INC",value=20}},nil} c["+40% to Critical Strike Multiplier if you've cast Enfeeble in the past 10 seconds"]={{[1]={[1]={type="Condition",var="SelfCastEnfeeble"},flags=0,keywordFlags=0,name="CritMultiplier",type="BASE",value=40}},nil} c["Minions have 10% increased Cast Speed"]={{[1]={flags=0,keywordFlags=0,name="MinionModifier",type="LIST",value={mod={flags=16,keywordFlags=0,name="Speed",type="INC",value=10}}}},nil} c["Elder Sword Quality: 20"]={nil,"Elder Sword Quality: 20 "} @@ -13268,7 +13268,7 @@ c["Seaglass Amulet"]={nil,"Seaglass Amulet "} c["Minions deal 37% increased Damage"]={{[1]={flags=0,keywordFlags=0,name="MinionModifier",type="LIST",value={mod={flags=0,keywordFlags=0,name="Damage",type="INC",value=37}}}},nil} c["Allocates Born in the Shadows if you have the matching modifier on Forbidden Flame"]={{[1]={flags=0,keywordFlags=0,name="GrantedAscendancyNode",type="LIST",value={name="born in the shadows",side="flame"}}},nil} c["Summoned Skeletons take 26% of their Maximum Life per second as Fire Damage"]={{[1]={[1]={skillName="Summon Skeleton",type="SkillName"},flags=0,keywordFlags=0,name="MinionModifier",type="LIST",value={mod={[1]={percent=26,stat="Life",type="PercentStat"},flags=0,keywordFlags=0,name="FireDegen",type="BASE",value=1}}}},nil} -c["100% increased Totem Duration"]={{[1]={flags=0,keywordFlags=16384,name="Duration",type="INC",value=100}},nil} +c["100% increased Totem Duration"]={{[1]={flags=0,keywordFlags=0,name="TotemDuration",type="INC",value=100}},nil} c["3% increased Area of Effect per Power Charge, up to a maximum of 50%"]={{[1]={[1]={globalLimit=50,globalLimitKey="VastPower",type="Multiplier",var="PowerCharge"},flags=0,keywordFlags=0,name="AreaOfEffect",type="INC",value=3}},nil} c["Auras from your Skills grant 5% increased Recovery Rate of Life,"]={{[1]={flags=0,keywordFlags=0,name="ExtraAuraEffect",type="LIST",value={mod={flags=0,keywordFlags=0,name="FlaskRecoveryRate",type="INC",value=5}}}}," of Life, "} c["47% chance to cause Bleeding on Hit"]={{[1]={flags=0,keywordFlags=0,name="BleedChance",type="BASE",value=47}},nil} diff --git a/src/Data/SkillStatMap.lua b/src/Data/SkillStatMap.lua index e24fcba92f..319ed86873 100644 --- a/src/Data/SkillStatMap.lua +++ b/src/Data/SkillStatMap.lua @@ -1514,7 +1514,11 @@ return { div = 60, }, ["totem_duration_+%"] = { - mod("Duration", "INC", nil, 0, KeywordFlag.Totem), + mod("TotemDuration", "INC", nil), +}, +["base_totem_duration"] = { + mod("TotemDuration", "BASE", nil), + div = 1000 }, -- Minion ["minion_damage_+%"] = { diff --git a/src/Data/Skills/sup_str.lua b/src/Data/Skills/sup_str.lua index e0dc153846..cf27fe4e4a 100644 --- a/src/Data/Skills/sup_str.lua +++ b/src/Data/Skills/sup_str.lua @@ -2326,6 +2326,7 @@ skills["AvengingFlame"] = { }, baseFlags = { area = true, + totem = true, }, qualityStats = { Default = { diff --git a/src/Export/Skills/sup_str.txt b/src/Export/Skills/sup_str.txt index 356310dfc5..3b33344f3b 100644 --- a/src/Export/Skills/sup_str.txt +++ b/src/Export/Skills/sup_str.txt @@ -317,7 +317,7 @@ local skills, mod, flag, skill = ... -- Display only } }, -#flags area +#flags area totem #mods #skill SupportFortify diff --git a/src/Modules/Build.lua b/src/Modules/Build.lua index c3e16bb5ba..1f361517a6 100644 --- a/src/Modules/Build.lua +++ b/src/Modules/Build.lua @@ -245,10 +245,11 @@ function buildMode:Init(dbFileName, buildName, buildXML, convertBuild) { stat = "WarcryCastTime", label = "Cast Time", fmt = ".2fs", compPercent = true, lowerIsBetter = true, flag = "warcry" }, { stat = "HitSpeed", label = "Hit Rate", fmt = ".2f", compPercent = true, condFunc = function(v,o) return not o.TriggerTime end }, { stat = "HitTime", label = "Channel Time", fmt = ".2fs", compPercent = true, flag = "channelRelease", lowerIsBetter = true, condFunc = function(v,o) return not o.TriggerTime end }, + { stat = "ChannelTimeToTrigger", label = "Channel Time", fmt = ".2fs", compPercent = true, lowerIsBetter = true, }, { stat = "TrapThrowingTime", label = "Trap Throwing Time", fmt = ".2fs", compPercent = true, lowerIsBetter = true, }, { stat = "TrapCooldown", label = "Trap Cooldown", fmt = ".3fs", lowerIsBetter = true }, { stat = "MineLayingTime", label = "Mine Throwing Time", fmt = ".2fs", compPercent = true, lowerIsBetter = true, }, - { stat = "TotemPlacementTime", label = "Totem Placement Time", fmt = ".2fs", compPercent = true, lowerIsBetter = true, }, + { stat = "TotemPlacementTime", label = "Totem Placement Time", fmt = ".2fs", compPercent = true, lowerIsBetter = true, condFunc = function(v,o) return not o.TriggerTime end }, { stat = "PreEffectiveCritChance", label = "Crit Chance", fmt = ".2f%%" }, { stat = "CritChance", label = "Effective Crit Chance", fmt = ".2f%%", condFunc = function(v,o) return v ~= o.PreEffectiveCritChance end }, { stat = "CritMultiplier", label = "Crit Multiplier", fmt = "d%%", pc = true, condFunc = function(v,o) return (o.CritChance or 0) > 0 end }, diff --git a/src/Modules/CalcDefence.lua b/src/Modules/CalcDefence.lua index bd60657ead..26aff31bf8 100644 --- a/src/Modules/CalcDefence.lua +++ b/src/Modules/CalcDefence.lua @@ -295,24 +295,6 @@ function calcs.defence(env, actor) -- Resistances output["PhysicalResist"] = 0 - - -- Highest Maximum Elemental Resistance for Melding of the Flesh - if modDB:Flag(nil, "ElementalResistMaxIsHighestResistMax") then - local highestResistMax = 0; - local highestResistMaxType = ""; - for _, elem in ipairs(resistTypeList) do - local resistMax = modDB:Override(nil, elem.."ResistMax") or m_min(data.misc.MaxResistCap, modDB:Sum("BASE", nil, elem.."ResistMax", isElemental[elem] and "ElementalResistMax")) - if resistMax > highestResistMax and isElemental[elem] then - highestResistMax = resistMax; - highestResistMaxType = elem; - end - end - for _, elem in ipairs(resistTypeList) do - if isElemental[elem] then - modDB:NewMod(elem.."ResistMax", "OVERRIDE", highestResistMax, highestResistMaxType.." Melding of the Flesh"); - end - end - end -- Process Resistance conversion mods for _, resFrom in ipairs(resistTypeList) do @@ -355,6 +337,23 @@ function calcs.defence(env, actor) end end + -- Highest Maximum Elemental Resistance for Melding of the Flesh + if modDB:Flag(nil, "ElementalResistMaxIsHighestResistMax") then + local highestResistMax = 0; + local highestResistMaxType = ""; + for _, elem in ipairs(resistTypeList) do + local resistMax = modDB:Override(nil, elem.."ResistMax") or m_min(data.misc.MaxResistCap, modDB:Sum("BASE", nil, elem.."ResistMax", isElemental[elem] and "ElementalResistMax")) + if resistMax > highestResistMax and isElemental[elem] then + highestResistMax = resistMax; + highestResistMaxType = elem; + end + end + for _, elem in ipairs(resistTypeList) do + if isElemental[elem] then + modDB:NewMod(elem.."ResistMax", "OVERRIDE", highestResistMax, highestResistMaxType.." Melding of the Flesh"); + end + end + end for _, elem in ipairs(resistTypeList) do local min, max, total, totemTotal, totemMax diff --git a/src/Modules/CalcOffence.lua b/src/Modules/CalcOffence.lua index 5c62f675a3..38de86046d 100644 --- a/src/Modules/CalcOffence.lua +++ b/src/Modules/CalcOffence.lua @@ -1388,7 +1388,20 @@ function calcs.offence(env, actor, activeSkill) } end end - + output.TotemDurationMod = calcLib.mod(skillModList, skillCfg, "Duration", "PrimaryDuration", "TotemDuration") + local TotemDurationBase = skillModList:Sum("BASE", skillCfg, "TotemDuration") + output.TotemDuration = m_ceil(TotemDurationBase * output.TotemDurationMod * data.misc.ServerTickRate) / data.misc.ServerTickRate + if breakdown then + breakdown.TotemDurationMod = breakdown.mod(skillModList, skillCfg, "Duration", "PrimaryDuration", "TotemDuration") + breakdown.TotemDuration = { + s_format("%.2fs ^8(base)", TotemDurationBase), + } + if output.TotemDurationMod ~= 1 then + t_insert(breakdown.TotemDuration, s_format("x %.4f ^8(duration modifier)", output.TotemDurationMod)) + end + t_insert(breakdown.TotemDuration, s_format("rounded up to nearest server tick")) + t_insert(breakdown.TotemDuration, s_format("= %.3fs", output.TotemDuration)) + end end -- Skill uptime diff --git a/src/Modules/CalcSections.lua b/src/Modules/CalcSections.lua index 1ce86d2757..f32606b9dc 100644 --- a/src/Modules/CalcSections.lua +++ b/src/Modules/CalcSections.lua @@ -625,7 +625,7 @@ return { { modName = "CooldownRecovery", cfg = "skill" }, }, }, { label = "Stored Uses", haveOutput = "StoredUses", { format = "{output:StoredUses}", - { breakdown = "StoredUses" }, + { breakdown = "StoredUses" }, { modName = "AdditionalCooldownUses", cfg = "skill" }, }, }, { label = "Duration Mod", flag = "duration", { format = "x {4:output:DurationMod}", @@ -730,19 +730,26 @@ return { { label = "Area of Effect modifiers", modName = "MineDetonationAreaOfEffect", cfg = "skill" }, }, }, { label = "Mine Aura Radius", haveOutput = "MineAuraRadius", { format = "{0:output:MineAuraRadius}", { breakdown = "MineAuraRadius" }, }, }, - { label = "Totem Place Time", flag = "totem", { format = "{2:output:TotemPlacementTime}s", + { label = "Totem Place Time", flag = "totem", notFlag = "triggered", { format = "{2:output:TotemPlacementTime}s", { breakdown = "TotemPlacementTime" }, { modName = "TotemPlacementSpeed", cfg = "skill" }, }, }, - { label = "Active Totem Limit", flag = "totem", { format = "{0:output:ActiveTotemLimit}", + { label = "Active Totem Limit", flag = "totem", notFlag = "triggered", { format = "{0:output:ActiveTotemLimit}", { breakdown = "ActiveTotemLimit" }, { modName = { "ActiveTotemLimit", "ActiveBallistaLimit" }, cfg = "skill" }, }, }, - { label = "Totem Life Mod", flag = "totem", { format = "x {2:output:TotemLifeMod}", + { label = "Totem Duration Mod", flagList = {"duration", "totem"}, { format = "x {4:output:TotemDurationMod}", + { breakdown = "TotemDurationMod" }, + { modName = { "Duration", "PrimaryDuration", "TotemDuration" }, cfg = "skill" }, + }, }, + { label = "Totem Duration", flagList = {"duration", "totem"}, { format = "x {4:output:TotemDuration}", + { breakdown = "TotemDuration" }, + }, }, + { label = "Totem Life Mod", flag = "totem", notFlag = "triggered", { format = "x {2:output:TotemLifeMod}", { breakdown = "TotemLifeMod" }, { modName = "TotemLife", cfg = "skill" }, }, }, - { label = "Totem Life", flag = "totem", { format = "{0:output:TotemLife}", { breakdown = "TotemLife" }, }, }, + { label = "Totem Life", flag = "totem", notFlag = "triggered", { format = "{0:output:TotemLife}", { breakdown = "TotemLife" }, }, }, { label = "Totem ES", haveOutput = "TotemEnergyShield", { format = "{0:output:TotemEnergyShield}", { breakdown = "TotemEnergyShield" }, { modName = "TotemEnergyShield", cfg = "skill" }, @@ -756,19 +763,19 @@ return { { modName = "TotemArmour", cfg = "skill" }, }, }, { label = "Active Brand Limit", flag = "brand", { format = "{0:output:ActiveBrandLimit}", { modName = "ActiveBrandLimit", cfg = "skill" }, }, }, - { label = "Totem Fire Res", flag = "totem", { format = "{0:output:TotemFireResist}% (+{0:output:TotemFireResistOverCap}%)", + { label = "Totem Fire Res", flag = "totem", notFlag = "triggered",{ format = "{0:output:TotemFireResist}% (+{0:output:TotemFireResistOverCap}%)", { breakdown = "TotemFireResist" }, { modName = { "TotemFireResistMax", "TotemElementalResistMax", "TotemFireResist", "TotemElementalResist" }, }, }, }, - { label = "Totem Cold Res", flag="totem", { format = "{0:output:TotemColdResist}% (+{0:output:TotemColdResistOverCap}%)", + { label = "Totem Cold Res", flag = "totem", notFlag = "triggered", { format = "{0:output:TotemColdResist}% (+{0:output:TotemColdResistOverCap}%)", { breakdown = "TotemColdResist" }, { modName = { "TotemColdResistMax", "TotemElementalResistMax", "TotemColdResist", "TotemElementalResist" }, }, }, }, - { label = "Totem Lightning Res", flag="totem", { format = "{0:output:TotemLightningResist}% (+{0:output:TotemLightningResistOverCap}%)", + { label = "Totem Lightning Res", flag = "totem", notFlag = "triggered", { format = "{0:output:TotemLightningResist}% (+{0:output:TotemLightningResistOverCap}%)", { breakdown = "TotemLightningResist" }, { modName = { "TotemLightningResistMax", "TotemElementalResistMax", "TotemLightningResist", "TotemElementalResist" }, }, }, }, - { label = "Totem Chaos Res", flag="totem", { format = "{0:output:TotemChaosResist}% (+{0:output:TotemChaosResistOverCap}%)", + { label = "Totem Chaos Res", flag = "totem", notFlag = "triggered", { format = "{0:output:TotemChaosResist}% (+{0:output:TotemChaosResistOverCap}%)", { breakdown = "TotemChaosResist" }, { modName = { "TotemChaosResistMax", "TotemChaosResist" }, }, }, }, diff --git a/src/Modules/CalcTriggers.lua b/src/Modules/CalcTriggers.lua index afaf093518..196012b8ab 100644 --- a/src/Modules/CalcTriggers.lua +++ b/src/Modules/CalcTriggers.lua @@ -344,7 +344,7 @@ local function mirageArcherHandler(env) end local function helmetFocusHandler(env) - if not env.player.mainSkill.skillFlags.minion and not env.player.mainSkill.skillFlags.disable then + if not env.player.mainSkill.skillFlags.minion and not env.player.mainSkill.skillFlags.disable and env.player.mainSkill.triggeredBy then local triggerName = "Focus" env.player.mainSkill.skillData.triggered = true local output = env.player.output @@ -564,6 +564,7 @@ local function CWCHandler(env) -- Account for Trigger-related INC/MORE modifiers addTriggerIncMoreMods(env.player.mainSkill, env.player.mainSkill) + env.player.output.ChannelTimeToTrigger = source.skillData.triggerTime env.player.mainSkill.skillData.triggered = true env.player.mainSkill.skillFlags.globalTrigger = true env.player.mainSkill.skillData.triggerSource = source @@ -847,7 +848,7 @@ local function defaultTriggerHandler(env, config) end end if #triggeredSkills > 0 or not config.triggeredSkillCond then - if not source and not actor.mainSkill.skillFlags.globalTrigger then + if not source and not (actor.mainSkill.skillFlags.globalTrigger and config.triggeredSkillCond) then actor.mainSkill.skillData.triggered = nil actor.mainSkill.infoMessage2 = "DPS reported assuming Self-Cast" actor.mainSkill.infoMessage = s_format("No %s Triggering Skill Found", config.triggerName) @@ -1446,26 +1447,28 @@ local configTable = { triggeredSkillCond = function(env, skill) return skill.skillData.triggeredByUnique and env.player.mainSkill.socketGroup.slot == skill.socketGroup.slot end} end, ["Trigger Craft"] = function(env) - local trigRate, source, uuid, useCastRate, triggeredSkills - triggeredSkills = {} - for _, skill in ipairs(env.player.activeSkillList) do - local triggered = skill.skillData.triggeredByUnique or skill.skillData.triggered or skill.skillTypes[SkillType.InbuiltTrigger] or skill.skillTypes[SkillType.Triggered] - if (skill.skillTypes[SkillType.Damage] or skill.skillTypes[SkillType.Attack] or skill.skillTypes[SkillType.Spell]) and skill ~= env.player.mainSkill and not skill.skillData.triggeredByCraft and not skill.activeEffect.grantedEffect.fromItem and not triggered then - source, trigRate, uuid = findTriggerSkill(env, skill, source, trigRate) - if skill.skillFlags and (skill.skillFlags.totem or skill.skillFlags.golem or skill.skillFlags.banner or skill.skillFlags.ballista) and skill.activeEffect.grantedEffect.castTime then - if skill.activeEffect.grantedEffect.levels ~= nil then - trigRate = 1 / (skill.activeEffect.grantedEffect.castTime + (skill.activeEffect.grantedEffect.levels[skill.activeEffect.level].cooldown or 0)) - else - trigRate = 1 / skill.activeEffect.grantedEffect.castTime + if env.player.mainSkill.skillData.triggeredByCraft then + local trigRate, source, uuid, useCastRate, triggeredSkills + triggeredSkills = {} + for _, skill in ipairs(env.player.activeSkillList) do + local triggered = skill.skillData.triggeredByUnique or skill.skillData.triggered or skill.skillTypes[SkillType.InbuiltTrigger] or skill.skillTypes[SkillType.Triggered] + if (skill.skillTypes[SkillType.Damage] or skill.skillTypes[SkillType.Attack] or skill.skillTypes[SkillType.Spell]) and not skill.skillFlags.aura and skill ~= env.player.mainSkill and not skill.skillData.triggeredByCraft and not skill.activeEffect.grantedEffect.fromItem and not triggered then + source, trigRate, uuid = findTriggerSkill(env, skill, source, trigRate) + if skill.skillFlags and (skill.skillFlags.totem or skill.skillFlags.golem or skill.skillFlags.banner or skill.skillFlags.ballista) and skill.activeEffect.grantedEffect.castTime then + if skill.activeEffect.grantedEffect.levels ~= nil then + trigRate = 1 / (skill.activeEffect.grantedEffect.castTime + (skill.activeEffect.grantedEffect.levels[skill.activeEffect.level].cooldown or 0)) + else + trigRate = 1 / skill.activeEffect.grantedEffect.castTime + end + useCastRate = true end - useCastRate = true + end + if skill.skillData.triggeredByCraft and env.player.mainSkill.socketGroup.slot == skill.socketGroup.slot then + t_insert(triggeredSkills, packageSkillDataForSimulation(skill)) end end - if skill.skillData.triggeredByCraft and env.player.mainSkill.socketGroup.slot == skill.socketGroup.slot then - t_insert(triggeredSkills, packageSkillDataForSimulation(skill)) - end + return {trigRate = trigRate, source = source, uuid = uuid, useCastRate = useCastRate, triggeredSkills = triggeredSkills} end - return {trigRate = trigRate, source = source, uuid = uuid, useCastRate = useCastRate, triggeredSkills = triggeredSkills} end, ["Kitava's Thirst"] = function(env) local requiredManaCost = env.player.modDB:Sum("BASE", nil, "KitavaRequiredManaCost") @@ -1483,10 +1486,10 @@ local configTable = { end, ["Mjolner"] = function() return {triggerSkillCond = function(env, skill) - return (skill.skillTypes[SkillType.Damage] or skill.skillTypes[SkillType.Attack]) and band(skill.skillCfg.flags, bor(ModFlag.Mace, ModFlag.Weapon1H)) > 0 + return (skill.skillTypes[SkillType.Damage] or skill.skillTypes[SkillType.Attack]) and band(skill.skillCfg.flags, bor(ModFlag.Mace, ModFlag.Weapon1H)) > 0 and not slotMatch(env, skill) end, triggeredSkillCond = function(env, skill) - return skill.skillData.triggeredByMjolner and env.player.mainSkill.socketGroup.slot == skill.socketGroup.slot + return skill.skillData.triggeredByMjolner and slotMatch(env, skill) end} end, ["Cospri's Malice"] = function() @@ -1703,8 +1706,10 @@ local configTable = { skill.skillData.hitTimeMultiplier = snipeStages - 0.5 source, _, uuid = findTriggerSkill(env, skill, source) trigRate = GlobalCache.cachedData["CACHE"][uuid].Env.player.output.HitSpeed + env.player.output.ChannelTimeToTrigger = GlobalCache.cachedData["CACHE"][uuid].Env.player.output.HitTime end end + return {trigRate = trigRate, source = source} else env.player.mainSkill.skillData.triggered = nil diff --git a/src/Modules/ModParser.lua b/src/Modules/ModParser.lua index 3a7ec276ff..80db3c1d38 100644 --- a/src/Modules/ModParser.lua +++ b/src/Modules/ModParser.lua @@ -517,7 +517,7 @@ local modNameList = { -- Totem/trap/mine/brand modifiers ["totem placement speed"] = "TotemPlacementSpeed", ["totem life"] = "TotemLife", - ["totem duration"] = { "Duration", keywordFlags = KeywordFlag.Totem }, + ["totem duration"] = "TotemDuration", ["maximum number of summoned totems"] = "ActiveTotemLimit", ["maximum number of summoned totems."] = "ActiveTotemLimit", -- Mark plz ["maximum number of summoned ballista totems"] = { "ActiveBallistaLimit", tag = { type = "SkillType", skillType = SkillType.TotemsAreBallistae } }, @@ -1780,7 +1780,7 @@ local function triggerExtraSkill(name, level, noSupports, sourceSkill, triggerCh end end local function extraSupport(name, level, slot) - local skillId = gemIdLookup[name] or gemIdLookup[name:gsub("^increased ","")] + local skillId = gemIdLookup[name] or gemIdLookup[name:gsub("^increased ","")] or gemIdLookup[name:gsub(" support$","")] if itemSlotName == "main hand" then slot = "Weapon 1" From 8720614c242f041bc463b69db3c584398e2504f2 Mon Sep 17 00:00:00 2001 From: Torchery <88600359+Torchery@users.noreply.github.com> Date: Fri, 25 Aug 2023 08:26:59 -0700 Subject: [PATCH 10/10] Update spectre.txt --- src/Export/Skills/spectre.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Export/Skills/spectre.txt b/src/Export/Skills/spectre.txt index 168c247cad..be9460120a 100644 --- a/src/Export/Skills/spectre.txt +++ b/src/Export/Skills/spectre.txt @@ -101,7 +101,7 @@ local skills, mod, flag, skill = ... #baseMod skill("hitTimeOverride", 1) #mods -#skill ElementalHitSkeletonKnight Elemental Hit - Psuedo Tri-Conversion +#skill ElementalHitSkeletonKnight Elemental Hit - Pseudo Tri-Conversion #flags attack area melee projectile Fire Cold Lightning #baseMod flag("DealNoPhysical") #baseMod flag("DealNoChaos")