From d606102bb35d0d6ec734293f546aa48ca8449483 Mon Sep 17 00:00:00 2001 From: CriticalXI Date: Wed, 22 Jan 2025 15:28:38 -0700 Subject: [PATCH] [lua, sql] HNM Kings Rework --- scripts/actions/mobskills/absolute_terror.lua | 2 +- scripts/actions/mobskills/aqua_breath.lua | 8 +- scripts/actions/mobskills/dragon_breath.lua | 4 +- scripts/actions/mobskills/earth_breath.lua | 7 +- scripts/actions/mobskills/harden_shell.lua | 8 +- .../actions/mobskills/head_butt_turtle.lua | 5 +- scripts/actions/mobskills/howl.lua | 2 +- scripts/actions/mobskills/hurricane_wing.lua | 11 ++- scripts/actions/mobskills/shock_wave.lua | 13 ++- scripts/actions/mobskills/spike_flail.lua | 4 +- scripts/actions/mobskills/super_buff.lua | 2 +- scripts/actions/mobskills/thunderbolt.lua | 7 +- scripts/actions/mobskills/tortoise_stomp.lua | 5 +- scripts/actions/mobskills/wild_horn.lua | 2 +- scripts/actions/spells/black/meteor.lua | 5 ++ scripts/effects/super_buff.lua | 13 +-- .../Behemoths_Dominion/mobs/Behemoth.lua | 3 + .../Behemoths_Dominion/mobs/King_Behemoth.lua | 22 ++++- scripts/zones/Dragons_Aery/mobs/Darter.lua | 12 +++ scripts/zones/Dragons_Aery/mobs/Fafnir.lua | 14 +++- scripts/zones/Dragons_Aery/mobs/Nidhogg.lua | 5 +- .../Valley_of_Sorrows/mobs/Adamantoise.lua | 12 ++- .../Valley_of_Sorrows/mobs/Aspidochelone.lua | 82 ++++++++++++++++++- sql/mob_groups.sql | 8 +- sql/mob_pools.sql | 12 +-- 25 files changed, 210 insertions(+), 58 deletions(-) create mode 100644 scripts/zones/Dragons_Aery/mobs/Darter.lua diff --git a/scripts/actions/mobskills/absolute_terror.lua b/scripts/actions/mobskills/absolute_terror.lua index 6734376a238..319d74e5278 100644 --- a/scripts/actions/mobskills/absolute_terror.lua +++ b/scripts/actions/mobskills/absolute_terror.lua @@ -22,7 +22,7 @@ end mobskillObject.onMobWeaponSkill = function(target, mob, skill) local power = 30 - local duration = 30 -- Reference: http://wiki.ffxiclopedia.org/wiki/Absolute_Terror + local duration = math.random(15, 45) if skill:isAoE() then duration = 10 diff --git a/scripts/actions/mobskills/aqua_breath.lua b/scripts/actions/mobskills/aqua_breath.lua index ac8b14d13e5..3e5856d7d4d 100644 --- a/scripts/actions/mobskills/aqua_breath.lua +++ b/scripts/actions/mobskills/aqua_breath.lua @@ -14,7 +14,13 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local dmgmod = xi.mobskills.mobBreathMove(mob, target, skill, 0.25, 1.5, xi.element.WATER, 400) + local dmgCap = 500 + local dmgmod = xi.mobskills.mobBreathMove(mob, target, skill, 0.10, 1.5, xi.element.WATER, dmgCap) + 100 + + if dmgmod > dmgCap then + dmgmod = dmgCap + end + local dmg = xi.mobskills.mobFinalAdjustments(dmgmod, mob, skill, target, xi.attackType.BREATH, xi.damageType.WATER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) target:takeDamage(dmg, mob, xi.attackType.BREATH, xi.damageType.WATER) diff --git a/scripts/actions/mobskills/dragon_breath.lua b/scripts/actions/mobskills/dragon_breath.lua index 5b0394de602..367732ab85b 100644 --- a/scripts/actions/mobskills/dragon_breath.lua +++ b/scripts/actions/mobskills/dragon_breath.lua @@ -22,8 +22,8 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local dmgmod = xi.mobskills.mobBreathMove(mob, target, skill, 0.2, 1.25, xi.element.FIRE, 1400) - dmgmod = utils.conalDamageAdjustment(mob, target, skill, dmgmod, 0.9) + local dmgmod = xi.mobskills.mobBreathMove(mob, target, skill, 0.15, 1.25, xi.element.FIRE, 1596) + dmgmod = utils.conalDamageAdjustment(mob, target, skill, dmgmod, 0.2) local dmg = xi.mobskills.mobFinalAdjustments(dmgmod, mob, skill, target, xi.attackType.BREATH, xi.damageType.FIRE, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) diff --git a/scripts/actions/mobskills/earth_breath.lua b/scripts/actions/mobskills/earth_breath.lua index 7a21f41653b..1a2c7f8f10e 100644 --- a/scripts/actions/mobskills/earth_breath.lua +++ b/scripts/actions/mobskills/earth_breath.lua @@ -13,7 +13,12 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local dmgmod = xi.mobskills.mobBreathMove(mob, target, skill, 0.167, 1.875, xi.element.EARTH, 500) + local dmgCap = 500 + local dmgmod = xi.mobskills.mobBreathMove(mob, target, skill, 0.10, 1.875, xi.element.EARTH, 500) + 100 + + if dmgmod > dmgCap then + dmgmod = dmgCap + end local dmg = xi.mobskills.mobFinalAdjustments(dmgmod, mob, skill, target, xi.attackType.BREATH, xi.damageType.EARTH, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) target:takeDamage(dmg, mob, xi.attackType.BREATH, xi.damageType.EARTH) diff --git a/scripts/actions/mobskills/harden_shell.lua b/scripts/actions/mobskills/harden_shell.lua index 5488ac31dbe..6342fe20f4c 100644 --- a/scripts/actions/mobskills/harden_shell.lua +++ b/scripts/actions/mobskills/harden_shell.lua @@ -11,7 +11,13 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - skill:setMsg(xi.mobskills.mobBuffMove(mob, xi.effect.DEFENSE_BOOST, 100, 0, 60)) + local duration = math.random(60, 180) + + if mob:isNM() then + skill:setMsg(xi.mobskills.mobBuffMove(mob, xi.effect.DEFENSE_BOOST, 80, 0, duration)) + else + skill:setMsg(xi.mobskills.mobBuffMove(mob, xi.effect.DEFENSE_BOOST, 33, 0, duration)) + end return xi.effect.DEFENSE_BOOST end diff --git a/scripts/actions/mobskills/head_butt_turtle.lua b/scripts/actions/mobskills/head_butt_turtle.lua index d269082b930..39b03f1bad3 100644 --- a/scripts/actions/mobskills/head_butt_turtle.lua +++ b/scripts/actions/mobskills/head_butt_turtle.lua @@ -12,11 +12,12 @@ end mobskillObject.onMobWeaponSkill = function(target, mob, skill) local numhits = 1 local accmod = 1 - local dmgmod = 3 + local dmgmod = 1 local info = xi.mobskills.mobPhysicalMove(mob, target, skill, numhits, accmod, dmgmod, xi.mobskills.physicalTpBonus.DMG_VARIES, 1, 2, 3) local dmg = xi.mobskills.mobFinalAdjustments(info.dmg, mob, skill, target, xi.attackType.PHYSICAL, xi.damageType.BLUNT, info.hitslanded) - xi.mobskills.mobPhysicalStatusEffectMove(mob, target, skill, xi.effect.ACCURACY_DOWN, 50, 0, 120) + local duration = math.random(120, 180) + xi.mobskills.mobPhysicalStatusEffectMove(mob, target, skill, xi.effect.ACCURACY_DOWN, 40, 0, duration) target:takeDamage(dmg, mob, xi.attackType.PHYSICAL, xi.damageType.BLUNT) return dmg diff --git a/scripts/actions/mobskills/howl.lua b/scripts/actions/mobskills/howl.lua index 69e87e3ab71..32392a72aac 100644 --- a/scripts/actions/mobskills/howl.lua +++ b/scripts/actions/mobskills/howl.lua @@ -14,7 +14,7 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - skill:setMsg(xi.mobskills.mobBuffMove(mob, xi.effect.WARCRY, 25, 0, 180)) + skill:setMsg(xi.mobskills.mobBuffMove(mob, xi.effect.WARCRY, 15, 0, 180)) return xi.effect.WARCRY end diff --git a/scripts/actions/mobskills/hurricane_wing.lua b/scripts/actions/mobskills/hurricane_wing.lua index 3acdaa3f7b5..fc0c168b46a 100644 --- a/scripts/actions/mobskills/hurricane_wing.lua +++ b/scripts/actions/mobskills/hurricane_wing.lua @@ -22,13 +22,16 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 5 - - damage = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.WIND, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) + local damage = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.WIND, 4, xi.mobskills.magicalTpBonus.NO_EFFECT) damage = xi.mobskills.mobFinalAdjustments(damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS) target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BLINDNESS, 60, 0, 30) + + if mob:getPool() == 2840 then -- Nidhogg + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BLINDNESS, 160, 0, 30) + else + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.BLINDNESS, 100, 0, 30) + end return damage end diff --git a/scripts/actions/mobskills/shock_wave.lua b/scripts/actions/mobskills/shock_wave.lua index 84ada409b65..880ca5badf4 100644 --- a/scripts/actions/mobskills/shock_wave.lua +++ b/scripts/actions/mobskills/shock_wave.lua @@ -14,13 +14,12 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local numhits = 1 - local accmod = 1 - local dmgmod = 3.2 - local info = xi.mobskills.mobPhysicalMove(mob, target, skill, numhits, accmod, dmgmod, xi.mobskills.physicalTpBonus.NO_EFFECT) - local dmg = xi.mobskills.mobFinalAdjustments(info.dmg, mob, skill, target, xi.attackType.PHYSICAL, xi.damageType.BLUNT, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) - target:takeDamage(dmg, mob, xi.attackType.PHYSICAL, xi.damageType.BLUNT) - return dmg + local damage = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.WIND, 0.6, xi.mobskills.magicalTpBonus.NO_EFFECT, 1) + damage = xi.mobskills.mobFinalAdjustments(damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.WIND, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.WIND) + + return damage end return mobskillObject diff --git a/scripts/actions/mobskills/spike_flail.lua b/scripts/actions/mobskills/spike_flail.lua index c91fac4b6e2..2b6198149ad 100644 --- a/scripts/actions/mobskills/spike_flail.lua +++ b/scripts/actions/mobskills/spike_flail.lua @@ -25,8 +25,8 @@ end mobskillObject.onMobWeaponSkill = function(target, mob, skill) local numhits = 1 - local accmod = 2 - local dmgmod = math.random(5, 7) + local accmod = 1 + local dmgmod = 4 local info = xi.mobskills.mobPhysicalMove(mob, target, skill, numhits, accmod, dmgmod, xi.mobskills.physicalTpBonus.DMG_VARIES, 2, 3, 4) local dmg = xi.mobskills.mobFinalAdjustments(info.dmg, mob, skill, target, xi.attackType.PHYSICAL, xi.damageType.SLASHING, xi.mobskills.shadowBehavior.NUMSHADOWS_3) target:takeDamage(dmg, mob, xi.attackType.PHYSICAL, xi.damageType.SLASHING) diff --git a/scripts/actions/mobskills/super_buff.lua b/scripts/actions/mobskills/super_buff.lua index b194b951b11..35d3614e6f1 100644 --- a/scripts/actions/mobskills/super_buff.lua +++ b/scripts/actions/mobskills/super_buff.lua @@ -11,7 +11,7 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - target:addStatusEffectEx(xi.effect.SUPER_BUFF, 0, 50, 0, 30) + target:addStatusEffectEx(xi.effect.SUPER_BUFF, 0, 25, 0, 30) skill:setMsg(xi.msg.basic.NONE) return 0 end diff --git a/scripts/actions/mobskills/thunderbolt.lua b/scripts/actions/mobskills/thunderbolt.lua index f065df435fd..65a917f77f2 100644 --- a/scripts/actions/mobskills/thunderbolt.lua +++ b/scripts/actions/mobskills/thunderbolt.lua @@ -12,13 +12,12 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local damage = mob:getWeaponDmg() * 2 - - damage = xi.mobskills.mobMagicalMove(mob, target, skill, damage, xi.element.THUNDER, 1, xi.mobskills.magicalTpBonus.NO_EFFECT) + local duration = math.random(8, 14) + local damage = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.THUNDER, 0.6, xi.mobskills.magicalTpBonus.NO_EFFECT) damage = xi.mobskills.mobFinalAdjustments(damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.THUNDER, xi.mobskills.shadowBehavior.IGNORE_SHADOWS) target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.THUNDER) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.STUN, 1, 0, 4) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.STUN, 1, 0, duration) return damage end diff --git a/scripts/actions/mobskills/tortoise_stomp.lua b/scripts/actions/mobskills/tortoise_stomp.lua index 2b9c453a6b1..57c7aee3b29 100644 --- a/scripts/actions/mobskills/tortoise_stomp.lua +++ b/scripts/actions/mobskills/tortoise_stomp.lua @@ -15,11 +15,12 @@ end mobskillObject.onMobWeaponSkill = function(target, mob, skill) local numhits = 1 local accmod = 1 - local dmgmod = 2.8 + local dmgmod = 1 local info = xi.mobskills.mobPhysicalMove(mob, target, skill, numhits, accmod, dmgmod, xi.mobskills.physicalTpBonus.NO_EFFECT) local dmg = xi.mobskills.mobFinalAdjustments(info.dmg, mob, skill, target, xi.attackType.PHYSICAL, xi.damageType.BLUNT, info.hitslanded) - xi.mobskills.mobPhysicalStatusEffectMove(mob, target, skill, xi.effect.DEFENSE_DOWN, 30, 0, 180) + local duration = math.random(120, 180) + xi.mobskills.mobPhysicalStatusEffectMove(mob, target, skill, xi.effect.DEFENSE_DOWN, 25, 0, duration) target:takeDamage(dmg, mob, xi.attackType.PHYSICAL, xi.damageType.BLUNT) return dmg diff --git a/scripts/actions/mobskills/wild_horn.lua b/scripts/actions/mobskills/wild_horn.lua index dc61596dd0d..9779b64cdf7 100644 --- a/scripts/actions/mobskills/wild_horn.lua +++ b/scripts/actions/mobskills/wild_horn.lua @@ -19,7 +19,7 @@ end mobskillObject.onMobWeaponSkill = function(target, mob, skill) local numhits = 3 local accmod = 1 - local dmgmod = 1.3 + local dmgmod = 1.5 local info = xi.mobskills.mobPhysicalMove(mob, target, skill, numhits, accmod, dmgmod, xi.mobskills.physicalTpBonus.NO_EFFECT) local dmg = xi.mobskills.mobFinalAdjustments(info.dmg, mob, skill, target, xi.attackType.PHYSICAL, xi.damageType.SLASHING, info.hitslanded) target:takeDamage(dmg, mob, xi.attackType.PHYSICAL, xi.damageType.SLASHING) diff --git a/scripts/actions/spells/black/meteor.lua b/scripts/actions/spells/black/meteor.lua index e98cac3c6a5..5128230a2d0 100644 --- a/scripts/actions/spells/black/meteor.lua +++ b/scripts/actions/spells/black/meteor.lua @@ -26,6 +26,11 @@ spellObject.onSpellCast = function(caster, target, spell) local dmg = 0 if caster:isPC() then dmg = ((100 + caster:getMod(xi.mod.MATT)) / (100 + target:getMod(xi.mod.MDEF))) * (caster:getStat(xi.mod.INT) + caster:getSkillLevel(xi.skill.ELEMENTAL_MAGIC) / 6) * 3.5 + elseif -- Behemoth family + caster:getFamily() == 51 or + caster:getFamily() == 479 + then + dmg = 14 + caster:getMainLvl() * 30 else dmg = ((100 + caster:getMod(xi.mod.MATT)) / (100 + target:getMod(xi.mod.MDEF))) * (caster:getStat(xi.mod.INT) + (caster:getMaxSkillLevel(caster:getMainLvl(), xi.job.BLM, xi.skill.ELEMENTAL_MAGIC)) / 6) * 9.4 end diff --git a/scripts/effects/super_buff.lua b/scripts/effects/super_buff.lua index 7393d0103a9..666510e6b15 100644 --- a/scripts/effects/super_buff.lua +++ b/scripts/effects/super_buff.lua @@ -6,10 +6,10 @@ local effectObject = {} effectObject.onEffectGain = function(target, effect) local power = effect:getPower() - target:addMod(xi.mod.ATTP, power) - target:addMod(xi.mod.DEFP, power) - target:addMod(xi.mod.MATT, power) - target:addMod(xi.mod.MEVA, power) + effect:addMod(xi.mod.ATTP, power) + effect:addMod(xi.mod.DEFP, power) + effect:addMod(xi.mod.MATT, power) + effect:addMod(xi.mod.MEVA, power) -- The following only applies to Nidhogg. If this buff is to be used anywhere else, a check on mob name (NOT ID) would be a good choice target:setAnimationSub(2) end @@ -18,11 +18,6 @@ effectObject.onEffectTick = function(target, effect) end effectObject.onEffectLose = function(target, effect) - local power = effect:getPower() - target:delMod(xi.mod.ATTP, power) - target:delMod(xi.mod.DEFP, power) - target:delMod(xi.mod.MATT, power) - target:delMod(xi.mod.MEVA, power) target:setAnimationSub(0) end diff --git a/scripts/zones/Behemoths_Dominion/mobs/Behemoth.lua b/scripts/zones/Behemoths_Dominion/mobs/Behemoth.lua index fde66753b35..d443a7bb584 100644 --- a/scripts/zones/Behemoths_Dominion/mobs/Behemoth.lua +++ b/scripts/zones/Behemoths_Dominion/mobs/Behemoth.lua @@ -11,6 +11,9 @@ local entity = {} entity.onMobSpawn = function(mob) mob:setLocalVar('[rage]timer', 1800) -- 30 minutes mob:setMobMod(xi.mobMod.NO_MOVE, 0) + mob:setMobMod(xi.mobMod.WEAPON_BONUS, 37) -- 109 total weapon damage + mob:setMod(xi.mod.EVA, 301) + mob:setMod(xi.mod.ATT, 211) -- Despawn the ??? GetNPCByID(ID.npc.BEHEMOTH_QM):setStatus(xi.status.DISAPPEAR) diff --git a/scripts/zones/Behemoths_Dominion/mobs/King_Behemoth.lua b/scripts/zones/Behemoths_Dominion/mobs/King_Behemoth.lua index b8e62426939..bfa032e328b 100644 --- a/scripts/zones/Behemoths_Dominion/mobs/King_Behemoth.lua +++ b/scripts/zones/Behemoths_Dominion/mobs/King_Behemoth.lua @@ -16,6 +16,15 @@ end entity.onMobSpawn = function(mob) mob:setLocalVar('[rage]timer', 3600) -- 60 minutes mob:setMobMod(xi.mobMod.NO_MOVE, 0) + mob:setMobMod(xi.mobMod.WEAPON_BONUS, 58) -- 145 total weapaon damage + mob:setMod(xi.mod.MDEF, 20) + mob:setMod(xi.mod.ATT, 462) + mob:setMod(xi.mod.DEF, 500) + mob:setMod(xi.mod.EVA, 370) + mob:setMod(xi.mod.TRIPLE_ATTACK, 5) + mob:addImmunity(xi.immunity.LIGHT_SLEEP) + mob:addImmunity(xi.immunity.DARK_SLEEP) + mob:addImmunity(xi.immunity.STUN) -- Despawn the ??? GetNPCByID(ID.npc.BEHEMOTH_QM):setStatus(xi.status.DISAPPEAR) @@ -45,10 +54,19 @@ entity.onMobFight = function(mob, target) mob:setMobMod(xi.mobMod.NO_MOVE, 0) end end + + local delay = mob:getLocalVar('delay') + if + os.time() > delay and + mob:canUseAbilities() + then -- Use Meteor every 40s, based on capture + mob:castSpell(218, target) -- meteor + mob:setLocalVar('delay', os.time() + 40) + end end entity.onAdditionalEffect = function(mob, target, damage) - return xi.mob.onAddEffect(mob, target, damage, xi.mob.ae.STUN, { chance = 20, duration = math.random(5, 10) }) + return xi.mob.onAddEffect(mob, target, damage, xi.mob.ae.STUN, { chance = 20, duration = math.random(4, 8) }) end entity.onSpellPrecast = function(mob, spell) @@ -57,7 +75,7 @@ entity.onSpellPrecast = function(mob, spell) spell:setFlag(xi.magic.spellFlag.HIT_ALL) spell:setRadius(30) spell:setAnimation(280) - spell:setMPCost(1) + spell:setMPCost(0) end end diff --git a/scripts/zones/Dragons_Aery/mobs/Darter.lua b/scripts/zones/Dragons_Aery/mobs/Darter.lua new file mode 100644 index 00000000000..99906e5266d --- /dev/null +++ b/scripts/zones/Dragons_Aery/mobs/Darter.lua @@ -0,0 +1,12 @@ +----------------------------------- +-- Area: Dragons Aery +-- Mob: Darter +----------------------------------- +---@type TMobEntity +local entity = {} + +entity.onMobInitialize = function(mob) + mob:setMobMod(xi.mobMod.ALLI_HATE, 30) -- 30 yalm distance +end + +return entity diff --git a/scripts/zones/Dragons_Aery/mobs/Fafnir.lua b/scripts/zones/Dragons_Aery/mobs/Fafnir.lua index db7bf3a03c7..c027956d06d 100644 --- a/scripts/zones/Dragons_Aery/mobs/Fafnir.lua +++ b/scripts/zones/Dragons_Aery/mobs/Fafnir.lua @@ -10,7 +10,9 @@ local entity = {} entity.onMobSpawn = function(mob) mob:setLocalVar('[rage]timer', 3600) -- 60 minutes - mob:setMobMod(xi.mobMod.WEAPON_BONUS, 50) -- Level 90 + 50 = 140 Base Weapon Damage + mob:setMobMod(xi.mobMod.NO_MOVE, 0) + mob:setMobMod(xi.mobMod.WEAPON_BONUS, 48) -- 140 total weapon damage + mob:setMod(xi.mod.ATT, 435) -- Despawn the ??? GetNPCByID(ID.npc.FAFNIR_QM):setStatus(xi.status.DISAPPEAR) @@ -28,7 +30,15 @@ entity.onMobFight = function(mob, target) wait = 3, } - utils.drawIn(target, drawInTable) + for _, condition in ipairs(drawInTable.conditions) do + if condition then + mob:setMobMod(xi.mobMod.NO_MOVE, 1) + utils.drawIn(target, drawInTable) + break + else + mob:setMobMod(xi.mobMod.NO_MOVE, 0) + end + end end entity.onMobDeath = function(mob, player, optParams) diff --git a/scripts/zones/Dragons_Aery/mobs/Nidhogg.lua b/scripts/zones/Dragons_Aery/mobs/Nidhogg.lua index fb389b6925b..e4fd9f769ae 100644 --- a/scripts/zones/Dragons_Aery/mobs/Nidhogg.lua +++ b/scripts/zones/Dragons_Aery/mobs/Nidhogg.lua @@ -10,8 +10,11 @@ local entity = {} entity.onMobSpawn = function(mob) mob:setLocalVar('[rage]timer', 3600) -- 60 minutes - mob:setMobMod(xi.mobMod.WEAPON_BONUS, 50) -- Level 90 + 50 = 140 Base Weapon Damage mob:setMobMod(xi.mobMod.NO_MOVE, 0) + mob:setMobMod(xi.mobMod.WEAPON_BONUS, 48) -- 140 total weapon damage + mob:setMod(xi.mod.ATT, 445) + mob:setMod(xi.mod.ACC, 444) + mob:setMod(xi.mod.EVA, 327) -- Despawn the ??? GetNPCByID(ID.npc.FAFNIR_QM):setStatus(xi.status.DISAPPEAR) diff --git a/scripts/zones/Valley_of_Sorrows/mobs/Adamantoise.lua b/scripts/zones/Valley_of_Sorrows/mobs/Adamantoise.lua index eef1aa25e35..8ccb2280a50 100644 --- a/scripts/zones/Valley_of_Sorrows/mobs/Adamantoise.lua +++ b/scripts/zones/Valley_of_Sorrows/mobs/Adamantoise.lua @@ -3,13 +3,23 @@ -- HNM: Adamantoise ----------------------------------- local ID = zones[xi.zone.VALLEY_OF_SORROWS] -mixins = { require('scripts/mixins/rage') } +mixins = +{ + require('scripts/mixins/rage'), + require('scripts/mixins/draw_in'), +} ----------------------------------- ---@type TMobEntity local entity = {} entity.onMobSpawn = function(mob) mob:setLocalVar('[rage]timer', 1800) -- 30 minutes + mob:addImmunity(xi.immunity.LIGHT_SLEEP) + mob:addImmunity(xi.immunity.DARK_SLEEP) + mob:setMod(xi.mod.DMGMAGIC, -3500) + mob:setMobMod(xi.mobMod.WEAPON_BONUS, 36) -- 108 total weapon damage + mob:setMod(xi.mod.DEF, 4112) + mob:setMod(xi.mod.ATT, 450) -- Despawn the ??? GetNPCByID(ID.npc.ADAMANTOISE_QM):setStatus(xi.status.DISAPPEAR) diff --git a/scripts/zones/Valley_of_Sorrows/mobs/Aspidochelone.lua b/scripts/zones/Valley_of_Sorrows/mobs/Aspidochelone.lua index 5634d08d501..d108ddbc042 100644 --- a/scripts/zones/Valley_of_Sorrows/mobs/Aspidochelone.lua +++ b/scripts/zones/Valley_of_Sorrows/mobs/Aspidochelone.lua @@ -3,16 +3,92 @@ -- HNM: Aspidochelone ----------------------------------- local ID = zones[xi.zone.VALLEY_OF_SORROWS] -mixins = { require('scripts/mixins/rage') } +mixins = +{ + require('scripts/mixins/rage'), + require('scripts/mixins/draw_in'), +} ----------------------------------- ---@type TMobEntity local entity = {} -entity.onMobSpawn = function(mob) - mob:setLocalVar('[rage]timer', 3600) -- 60 minutes +local intoShell = function(mob) + mob:setLocalVar('changeTime', os.time() + 90) + mob:setAnimationSub(1) + mob:setMobAbilityEnabled(false) + mob:setAutoAttackEnabled(false) + mob:setMod(xi.mod.REGEN, 130) + mob:setMod(xi.mod.UDMGRANGE, -9500) + mob:setMod(xi.mod.UDMGPHYS, -9500) + mob:setMobMod(xi.mobMod.NO_MOVE, 1) +end + +local outOfShell = function(mob) + mob:setMobAbilityEnabled(true) + mob:setAutoAttackEnabled(true) + mob:setMod(xi.mod.REGEN, 0) + mob:setMod(xi.mod.UDMGRANGE, 0) + mob:setMod(xi.mod.UDMGPHYS, 0) + mob:setMobMod(xi.mobMod.NO_MOVE, 0) +end +entity.onMobSpawn = function(mob) -- Despawn the ??? GetNPCByID(ID.npc.ADAMANTOISE_QM):setStatus(xi.status.DISAPPEAR) + + outOfShell(mob) -- Ensure out of shell mods are set on spawn + + mob:setLocalVar('[rage]timer', 3600) -- 60 minutes + mob:setLocalVar('dmgToChange', mob:getHP() - 1000) + mob:addImmunity(xi.immunity.LIGHT_SLEEP) + mob:addImmunity(xi.immunity.DARK_SLEEP) + mob:addMod(xi.mod.DOUBLE_ATTACK, 20) + mob:setMod(xi.mod.UDMGMAGIC, -3000) + mob:setMod(xi.mod.CURSERES, 100) + mob:setMobMod(xi.mobMod.WEAPON_BONUS, 45) -- 130 total weapon damage + mob:setMod(xi.mod.DEF, 702) + mob:setMod(xi.mod.ATT, 395) + mob:setMod(xi.mod.EVA, 310) + mob:setAnimationSub(0) +end + +entity.onMobFight = function(mob, target) + -- Aspid changes shell state at 1000 HP intervals based on what HP it was at when it last changed shell + -- If it in its shell, it will come out of shell at the damage threshold, reaching 100% HP, or 90 seconds have passed + local changeHP = mob:getLocalVar('dmgToChange') + + if -- In shell + mob:getAnimationSub() == 1 and + (os.time() > mob:getLocalVar('changeTime') or + mob:getHPP() == 100) + then + outOfShell(mob) + mob:setAnimationSub(2) + mob:setTP(3000) -- Immediately TPs coming out of shell + end + + if + changeHP ~= 0 and + mob:getHP() <= changeHP + then + mob:setLocalVar('dmgToChange', 0) + + if mob:getAnimationSub() == 1 then + outOfShell(mob) + mob:setAnimationSub(2) + mob:setTP(3000) -- Immediately TPs coming out of shell + elseif + mob:getAnimationSub() == 2 or + mob:getAnimationSub() == 0 + then + intoShell(mob) + end + + -- Complete shell exit/enter animation then set hp change var + mob:timer(1500, function(mobArg) + mobArg:setLocalVar('dmgToChange', mob:getHP() - 1000) + end) + end end entity.onMobDeath = function(mob, player, optParams) diff --git a/sql/mob_groups.sql b/sql/mob_groups.sql index 9a3f7fabb56..54472ec19f2 100644 --- a/sql/mob_groups.sql +++ b/sql/mob_groups.sql @@ -9018,8 +9018,8 @@ INSERT INTO `mob_groups` VALUES (5,980,127,'Demonic_Weapon',330,0,0,0,0,45,46,0) INSERT INTO `mob_groups` VALUES (6,2442,127,'Lost_Soul_blm',330,1,1541,0,0,45,47,0); INSERT INTO `mob_groups` VALUES (7,2585,127,'Master_Coeurl',330,0,1638,0,0,45,50,0); INSERT INTO `mob_groups` VALUES (8,407,127,'Bhuta',330,1,264,0,0,46,48,0); -INSERT INTO `mob_groups` VALUES (9,387,127,'Behemoth',0,128,251,35000,0,70,70,0); -INSERT INTO `mob_groups` VALUES (10,2255,127,'King_Behemoth',0,128,1450,75000,0,85,85,0); +INSERT INTO `mob_groups` VALUES (9,387,127,'Behemoth',0,128,251,50000,0,70,70,0); +INSERT INTO `mob_groups` VALUES (10,2255,127,'King_Behemoth',0,128,1450,90000,0,85,85,0); INSERT INTO `mob_groups` VALUES (11,3135,127,'Picklix_Longindex',0,128,0,0,0,60,60,0); INSERT INTO `mob_groups` VALUES (12,2767,127,'Moxnix_Nightgoggle',0,128,0,0,0,58,58,0); INSERT INTO `mob_groups` VALUES (13,1074,127,'Doglix_Muttsnout',0,128,0,0,0,58,58,0); @@ -9039,8 +9039,8 @@ INSERT INTO `mob_groups` VALUES (2,3120,128,'Peryton',330,0,1991,0,0,69,72,0); INSERT INTO `mob_groups` VALUES (3,1341,128,'Fire_Elemental',330,4,6860,0,0,66,68,0); INSERT INTO `mob_groups` VALUES (4,71,128,'Air_Elemental',330,4,38,0,0,66,68,0); INSERT INTO `mob_groups` VALUES (5,4125,128,'Valley_Manticore',330,0,2537,0,0,71,74,0); -INSERT INTO `mob_groups` VALUES (6,44,128,'Adamantoise',0,128,21,7000,0,70,70,0); -INSERT INTO `mob_groups` VALUES (7,268,128,'Aspidochelone',0,128,183,15000,0,85,85,0); +INSERT INTO `mob_groups` VALUES (6,44,128,'Adamantoise',0,128,21,10000,0,70,70,0); +INSERT INTO `mob_groups` VALUES (7,268,128,'Aspidochelone',0,128,183,13000,0,85,85,0); INSERT INTO `mob_groups` VALUES (8,3643,128,'Skahnowa',0,128,0,0,0,1,1,0); INSERT INTO `mob_groups` VALUES (9,6856,128,'Tolba',0,128,0,0,0,0,0,0); diff --git a/sql/mob_pools.sql b/sql/mob_pools.sql index ed2e80666c3..04d8cef7168 100644 --- a/sql/mob_pools.sql +++ b/sql/mob_pools.sql @@ -97,7 +97,7 @@ INSERT INTO `mob_pools` VALUES (40,'Acrophies','Acrophies',172,0x000014010000000 INSERT INTO `mob_pools` VALUES (41,'Acro_Bat','Acro_Bat',46,0x0000000100000000000000000000000000000000,1,1,11,240,100,0,0,0,0,0,0,0,3185,1667,8,0,0,0,0,46,46); INSERT INTO `mob_pools` VALUES (42,'Adam','Adam',149,0x0100000100000000000000000000000000000000,1,1,7,240,100,0,1,1,0,16,0,0,0,3,0,0,0,0,0,149,149); INSERT INTO `mob_pools` VALUES (43,'Adamantking_Effigy','Adamantking_Effigy',94,0x0000220400000000000000000000000000000000,1,1,12,240,100,0,1,0,1,0,6800,0,0,1665,0,0,0,0,0,94,94); -INSERT INTO `mob_pools` VALUES (44,'Adamantoise','Adamantoise',2,0x0000900100000000000000000000000000000000,1,1,7,380,125,0,1,0,0,2,6144,0,0,1153,8,0,0,0,0,2,2); +INSERT INTO `mob_pools` VALUES (44,'Adamantoise','Adamantoise',2,0x0000900100000000000000000000000000000000,7,4,7,250,100,0,1,0,0,2,0,0,0,1153,8,0,0,0,0,2,2); INSERT INTO `mob_pools` VALUES (45,'Adamantshell','Adamantshell',77,0x0000640100000000000000000000000000000000,7,7,4,240,100,0,1,1,1,16,2048,0,1755,1667,8,0,0,0,256,77,77); INSERT INTO `mob_pools` VALUES (46,'Adaman_Quadav','Adaman_Quadav',202,0x0000910200000000000000000000000000000000,8,8,4,265,100,0,1,1,1,2,0,0,0,1157,0,0,5,0,0,202,202); INSERT INTO `mob_pools` VALUES (47,'Adamastor','Adamastor',126,0x0000C40200000000000000000000000000000000,1,1,11,240,100,0,0,0,0,2,0,32,0,1183,0,0,0,0,0,809,126); @@ -321,7 +321,7 @@ INSERT INTO `mob_pools` VALUES (264,'Ashu_Talif_Marine','Ashu_Talif_Marine',359, INSERT INTO `mob_pools` VALUES (265,'Ash_Dragon','Ash_Dragon',87,0x0000A40100000000000000000000000000000000,1,1,12,240,100,0,1,0,0,2,0,0,7,1157,0,0,0,0,0,87,87); INSERT INTO `mob_pools` VALUES (266,'Ash_Lizard','Ash_Lizard',174,0x0000490100000000000000000000000000000000,1,1,7,240,100,0,0,0,1,0,0,0,291,1155,0,0,0,0,0,174,174); INSERT INTO `mob_pools` VALUES (267,'Asphyxiated_Amsel','Asphyxiated_Amsel',121,0x0000700100000000000000000000000000000000,4,4,12,240,100,0,1,0,0,2,0,32,0,1183,0,0,28,0,0,121,121); -INSERT INTO `mob_pools` VALUES (268,'Aspidochelone','Aspidochelone',2,0x0000910100000000000000000000000000000000,1,1,7,380,125,0,1,1,0,2,6144,0,363,1155,6,0,0,0,0,2,2); +INSERT INTO `mob_pools` VALUES (268,'Aspidochelone','Aspidochelone',2,0x0000910100000000000000000000000000000000,7,4,7,250,100,0,1,1,0,2,0,0,363,1155,6,0,0,0,0,2,2); INSERT INTO `mob_pools` VALUES (269,'Asrai','Asrai',114,0x0000410500000000000000000000000000000000,1,1,8,200,100,0,1,0,0,6,0,32,6585,1179,0,0,0,0,0,114,114); INSERT INTO `mob_pools` VALUES (270,'Assailer_Chariot','Assailer_Chariot',63,0x0000200700000000000000000000000000000000,4,4,12,240,100,0,1,1,1,2,0,0,0,1157,0,0,281,0,0,978,63); INSERT INTO `mob_pools` VALUES (271,'Assassin_Fly','Assassin_Fly',113,0x0000C10100000000000000000000000000000000,1,1,8,240,100,0,0,0,1,0,0,0,616,1665,8,0,0,0,0,113,113); @@ -440,7 +440,7 @@ INSERT INTO `mob_pools` VALUES (383,'Bearclaw_Leveret','Bearclaw_Leveret',206,0x INSERT INTO `mob_pools` VALUES (384,'Bearclaw_Rabbit','Bearclaw_Rabbit',206,0x00000E0100000000000000000000000000000000,1,1,7,240,100,0,1,1,1,16,0,0,4385,135,0,0,0,0,0,206,206); INSERT INTO `mob_pools` VALUES (385,'Beelzebub','Beelzebub',48,0x0000100100000000000000000000000000000000,3,3,11,240,100,0,1,1,1,16,0,32,3240,159,0,0,74,0,0,48,48); INSERT INTO `mob_pools` VALUES (386,'Beet_Leafhopper','Beet_Leafhopper',113,0x0000C00100000000000000000000000000000000,1,1,8,240,100,0,1,0,1,2,0,0,1505,643,0,0,0,0,0,113,113); -INSERT INTO `mob_pools` VALUES (387,'Behemoth','Behemoth',51,0x0000940100000000000000000000000000000000,1,1,6,380,125,1024,1,1,0,2,0,0,0,129,0,0,0,0,0,51,51); +INSERT INTO `mob_pools` VALUES (387,'Behemoth','Behemoth',51,0x0000940100000000000000000000000000000000,1,6,6,210,100,1024,1,1,0,2,0,0,0,129,0,0,0,0,0,51,51); INSERT INTO `mob_pools` VALUES (388,'Beholder','Beholder',139,0x0000800100000000000000000000000000000000,4,4,12,240,100,0,1,0,0,0,0,0,0,131,0,0,10,0,0,139,139); INSERT INTO `mob_pools` VALUES (389,'Beli','Beli',126,0x0000C70200000000000000000000000000000000,11,1,5,240,100,0,1,1,1,16,0,32,7,157,0,0,0,0,256,126,126); INSERT INTO `mob_pools` VALUES (390,'Bendigeit_Vran','Bendigeit_Vran',221,0x0000130200000000000000000000000000000000,1,1,2,360,100,0,1,0,1,2,0,32,894,155,0,0,0,0,0,221,221); @@ -1333,7 +1333,7 @@ INSERT INTO `mob_pools` VALUES (1276,'Expunger','Expunger',86,0x0000400100000000 INSERT INTO `mob_pools` VALUES (1277,'Eyy_Mon_the_Ironbreaker','Eyy_Mon_the_Ironbreaker',360,0x00004C0200000000000000000000000000000000,13,13,2,240,100,0,1,0,1,2,0,32,0,1179,0,0,7,0,0,360,360); INSERT INTO `mob_pools` VALUES (1278,'Fachan','Fachan',4,0x0000080100000000000000000000000000000000,1,4,11,240,100,0,1,0,1,0,0,0,131,131,0,0,11,0,0,4,4); INSERT INTO `mob_pools` VALUES (1279,'Faerie','Faerie',195,0x0000EE0700000000000000000000000000000000,1,1,0,240,100,0,0,0,0,0,0,0,0,513,8,0,0,0,0,195,195); -INSERT INTO `mob_pools` VALUES (1280,'Fafnir','Fafnir',260,0x00000F0300000000000000000000000000000000,1,1,7,240,125,1040,1,1,1,2,0,32,0,153,0,0,0,0,0,260,260); +INSERT INTO `mob_pools` VALUES (1280,'Fafnir','Fafnir',260,0x00000F0300000000000000000000000000000000,1,1,7,240,100,1040,1,1,1,2,0,32,0,153,0,0,0,0,0,260,260); INSERT INTO `mob_pools` VALUES (1281,'Fairy_Ring','Fairy_Ring',116,0x0000780100000000000000000000000000000000,1,1,11,240,100,0,1,1,1,2,0,32,0,157,0,0,0,0,0,2009,116); INSERT INTO `mob_pools` VALUES (1282,'Falcatus_Aranei','Falcatus_Aranei',235,0x0000360100000000000000000000000000000000,1,1,7,240,100,0,0,0,1,2,0,0,0,3,0,0,0,0,0,236,235); INSERT INTO `mob_pools` VALUES (1283,'Fallen_Evacuee_blm','Fallen_Evacuee_blm',227,0x0000340200000000000000000000000000000000,4,4,5,240,100,0,1,0,0,0,0,0,350,129,0,0,28,0,0,227,227); @@ -2307,7 +2307,7 @@ INSERT INTO `mob_pools` VALUES (2251,'Kinepikwa','Kinepikwa',192,0x0000DF0700000 INSERT INTO `mob_pools` VALUES (2252,'Kingslayer_Doggvdegg','Kingslayer_Doggvdegg',334,0x00001B0800000000000000000000000000000000,1,1,4,240,100,0,1,1,1,0,0,0,1,157,0,0,0,0,0,334,334); INSERT INTO `mob_pools` VALUES (2253,'King_Apkallu','King_Apkallu',27,0x0000BB0600000000000000000000000000000000,2,2,1,480,100,0,0,0,0,0,0,0,616,133,5,0,0,0,0,27,27); INSERT INTO `mob_pools` VALUES (2254,'King_Arthro','King_Arthro',77,0x0000650100000000000000000000000000000000,2,5,12,240,100,0,1,0,0,2,20,32,514,157,0,0,79,0,0,77,77); -INSERT INTO `mob_pools` VALUES (2255,'King_Behemoth','King_Behemoth',479,0x0000940100000000000000000000000000000000,1,1,6,380,125,1024,1,1,0,2,6168,0,6713,131,0,0,126,0,0,479,479); +INSERT INTO `mob_pools` VALUES (2255,'King_Behemoth','King_Behemoth',479,0x0000940100000000000000000000000000000000,1,6,6,210,100,1024,1,1,0,2,0,0,6713,131,0,0,0,0,0,479,479); INSERT INTO `mob_pools` VALUES (2256,'King_Buffalo','King_Buffalo',57,0x00004D0500000000000000000000000000000000,1,8,12,360,100,0,1,0,0,0,0,0,608,133,0,0,0,0,0,57,57); INSERT INTO `mob_pools` VALUES (2257,'King_Goldemar','King_Goldemar',90,0x00002F0700000000000000000000000000000000,4,4,12,240,100,0,0,0,0,2,0,0,1,139,0,0,2,0,0,90,90); INSERT INTO `mob_pools` VALUES (2258,'King_of_Batons','King_of_Batons',61,0x0000AF0100000000000000000000000000000000,4,4,12,240,100,0,1,1,1,18,0,0,1048,135,0,0,2,0,0,61,61); @@ -2892,7 +2892,7 @@ INSERT INTO `mob_pools` VALUES (2836,'Nguruvilu','Nguruvilu',198,0x0000D00600000 INSERT INTO `mob_pools` VALUES (2837,'Nickel_Quadav','Nickel_Quadav',202,0x00008B0200000000000000000000000000000000,7,7,3,265,100,0,1,0,1,0,0,0,1,131,0,0,4,0,0,202,202); INSERT INTO `mob_pools` VALUES (2838,'Nickur','Nickur',86,0x0000400100000000000000000000000000000000,1,1,5,270,100,0,1,1,1,16,0,0,0,3,0,0,0,0,0,86,86); INSERT INTO `mob_pools` VALUES (2839,'Nicolaus','Nicolaus',149,0x0100070100108320003083408350006000700000,20,20,0,0,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,149,149); -INSERT INTO `mob_pools` VALUES (2840,'Nidhogg','Nidhogg',263,0x00000F0300000000000000000000000000000000,1,1,7,240,125,1040,1,1,0,2,0,32,46,155,6,0,0,0,0,263,263); +INSERT INTO `mob_pools` VALUES (2840,'Nidhogg','Nidhogg',263,0x00000F0300000000000000000000000000000000,1,1,7,240,100,1040,1,1,0,2,0,32,46,155,6,0,0,0,0,263,263); INSERT INTO `mob_pools` VALUES (2841,'Feraloxs_Slime','Feraloxs_Slime',229,0x0000240100000000000000000000000000000000,4,4,7,240,100,0,1,0,1,8,0,32,0,155,0,0,54,0,0,229,229); INSERT INTO `mob_pools` VALUES (2842,'Nightmare_Bats_IC_UR','Nightmare_Bats_IC_UR',47,0x0000040100000000000000000000000000000000,1,1,5,240,100,0,1,0,1,0,0,64,238,643,8,0,0,0,0,47,47); INSERT INTO `mob_pools` VALUES (2843,'Nightmare_Bugard','Nightmare_Bugard',58,0x0000470500000000000000000000000000000000,1,1,5,300,100,0,1,0,1,0,0,0,0,131,0,0,0,0,0,58,58);