From 26d8ac9da512e2967c9f00dba087c041052b3edd Mon Sep 17 00:00:00 2001 From: ThrisStraizo <45871917+ThrisStraizo@users.noreply.github.com> Date: Sun, 4 Jan 2026 09:32:21 -0800 Subject: [PATCH] Bomb Queen Fight Rework (Again) Rework the bomb queen fight --- .../actions/mobskills/self-destruct_bomb.lua | 4 -- .../Ifrits_Cauldron/mobs/Bomb_Bastard.lua | 27 ++++++++++---- .../Ifrits_Cauldron/mobs/Bomb_Prince.lua | 27 ++++++++++---- .../Ifrits_Cauldron/mobs/Bomb_Princess.lua | 27 ++++++++++---- .../zones/Ifrits_Cauldron/mobs/Bomb_Queen.lua | 37 ++++++++++++++----- sql/mob_groups.sql | 8 ++-- sql/mob_pools.sql | 8 ++-- sql/mob_spawn_points.sql | 2 +- 8 files changed, 93 insertions(+), 47 deletions(-) diff --git a/scripts/actions/mobskills/self-destruct_bomb.lua b/scripts/actions/mobskills/self-destruct_bomb.lua index c6e73a810ab..821ef748e23 100644 --- a/scripts/actions/mobskills/self-destruct_bomb.lua +++ b/scripts/actions/mobskills/self-destruct_bomb.lua @@ -6,10 +6,6 @@ local mobskillObject = {} mobskillObject.onMobSkillCheck = function(target, mob, skill) - if mob:isMobType(xi.mobType.NOTORIOUS) or mob:getHPP() >= 90 then - return 1 - end - return 0 end diff --git a/scripts/zones/Ifrits_Cauldron/mobs/Bomb_Bastard.lua b/scripts/zones/Ifrits_Cauldron/mobs/Bomb_Bastard.lua index 2844ec2563c..61e4ecdfdfd 100644 --- a/scripts/zones/Ifrits_Cauldron/mobs/Bomb_Bastard.lua +++ b/scripts/zones/Ifrits_Cauldron/mobs/Bomb_Bastard.lua @@ -2,27 +2,38 @@ -- Area: Ifrit's Cauldron -- NM: Bomb Bastard ----------------------------------- +local ID = zones[xi.zone.IFRITS_CAULDRON] +----------------------------------- ---@type TMobEntity local entity = {} entity.onMobInitialize = function(mob) + mob:setMobMod(xi.mobMod.IDLE_DESPAWN, 900) mob:setMobMod(xi.mobMod.EXP_BONUS, -100) mob:setMobMod(xi.mobMod.GIL_BONUS, -100) mob:setMobMod(xi.mobMod.NO_DROPS, 1) - mob:setMod(xi.mod.STUN_MEVA, 50) + mob:addImmunity(xi.immunity.STUN) + mob:addImmunity(xi.immunity.SILENCE) + mob:addImmunity(xi.immunity.LIGHT_SLEEP) + mob:addImmunity(xi.immunity.DARK_SLEEP) + mob:addImmunity(xi.immunity.TERROR) + mob:addImmunity(xi.immunity.PETRIFY) + + mob:setMod(xi.mod.REGAIN, 100) end -entity.onMobFight = function(mob, target) - if - mob:getLocalVar('usedDestruct') == 0 and - mob:getBattleTime() > 10 - then - mob:setLocalVar('usedDestruct', 1) - mob:useMobAbility(xi.mobSkill.SELF_DESTRUCT_BOMB) +entity.onMobSpawn = function(mob) + local bombQueen = GetMobByID(ID.mob.BOMB_QUEEN) + if bombQueen and bombQueen:isAlive() then + bombQueen:setMagicCastingEnabled(true) end end +entity.onMobMobskillChoose = function(mob, target) + return xi.mobSkill.SELF_DESTRUCT_BOMB +end + entity.onMobDeath = function(mob, player, optParams) end diff --git a/scripts/zones/Ifrits_Cauldron/mobs/Bomb_Prince.lua b/scripts/zones/Ifrits_Cauldron/mobs/Bomb_Prince.lua index c19da8de975..6d0d92853cc 100644 --- a/scripts/zones/Ifrits_Cauldron/mobs/Bomb_Prince.lua +++ b/scripts/zones/Ifrits_Cauldron/mobs/Bomb_Prince.lua @@ -2,27 +2,38 @@ -- Area: Ifrit's Cauldron -- NM: Bomb Prince ----------------------------------- +local ID = zones[xi.zone.IFRITS_CAULDRON] +----------------------------------- ---@type TMobEntity local entity = {} entity.onMobInitialize = function(mob) + mob:setMobMod(xi.mobMod.IDLE_DESPAWN, 900) mob:setMobMod(xi.mobMod.EXP_BONUS, -100) mob:setMobMod(xi.mobMod.GIL_BONUS, -100) mob:setMobMod(xi.mobMod.NO_DROPS, 1) - mob:setMod(xi.mod.STUN_MEVA, 50) + mob:addImmunity(xi.immunity.STUN) + mob:addImmunity(xi.immunity.SILENCE) + mob:addImmunity(xi.immunity.LIGHT_SLEEP) + mob:addImmunity(xi.immunity.DARK_SLEEP) + mob:addImmunity(xi.immunity.TERROR) + mob:addImmunity(xi.immunity.PETRIFY) + + mob:setMod(xi.mod.REGAIN, 100) end -entity.onMobFight = function(mob, target) - if - mob:getLocalVar('usedDestruct') == 0 and - mob:getBattleTime() > 10 - then - mob:setLocalVar('usedDestruct', 1) - mob:useMobAbility(xi.mobSkill.SELF_DESTRUCT_BOMB) +entity.onMobSpawn = function(mob) + local bombQueen = GetMobByID(ID.mob.BOMB_QUEEN) + if bombQueen and bombQueen:isAlive() then + bombQueen:setMagicCastingEnabled(true) end end +entity.onMobMobskillChoose = function(mob, target) + return xi.mobSkill.SELF_DESTRUCT_BOMB +end + entity.onMobDeath = function(mob, player, optParams) end diff --git a/scripts/zones/Ifrits_Cauldron/mobs/Bomb_Princess.lua b/scripts/zones/Ifrits_Cauldron/mobs/Bomb_Princess.lua index 6f9ad0265ae..a37505f7ad3 100644 --- a/scripts/zones/Ifrits_Cauldron/mobs/Bomb_Princess.lua +++ b/scripts/zones/Ifrits_Cauldron/mobs/Bomb_Princess.lua @@ -2,27 +2,38 @@ -- Area: Ifrit's Cauldron -- NM: Bomb Princess ----------------------------------- +local ID = zones[xi.zone.IFRITS_CAULDRON] +----------------------------------- ---@type TMobEntity local entity = {} entity.onMobInitialize = function(mob) + mob:setMobMod(xi.mobMod.IDLE_DESPAWN, 900) mob:setMobMod(xi.mobMod.EXP_BONUS, -100) mob:setMobMod(xi.mobMod.GIL_BONUS, -100) mob:setMobMod(xi.mobMod.NO_DROPS, 1) - mob:setMod(xi.mod.STUN_MEVA, 50) + mob:addImmunity(xi.immunity.STUN) + mob:addImmunity(xi.immunity.SILENCE) + mob:addImmunity(xi.immunity.LIGHT_SLEEP) + mob:addImmunity(xi.immunity.DARK_SLEEP) + mob:addImmunity(xi.immunity.TERROR) + mob:addImmunity(xi.immunity.PETRIFY) + + mob:setMod(xi.mod.REGAIN, 100) end -entity.onMobFight = function(mob, target) - if - mob:getLocalVar('usedDestruct') == 0 and - mob:getBattleTime() > 10 - then - mob:setLocalVar('usedDestruct', 1) - mob:useMobAbility(xi.mobSkill.SELF_DESTRUCT_BOMB) +entity.onMobSpawn = function(mob) + local bombQueen = GetMobByID(ID.mob.BOMB_QUEEN) + if bombQueen and bombQueen:isAlive() then + bombQueen:setMagicCastingEnabled(true) end end +entity.onMobMobskillChoose = function(mob, target) + return xi.mobSkill.SELF_DESTRUCT_BOMB +end + entity.onMobDeath = function(mob, player, optParams) end diff --git a/scripts/zones/Ifrits_Cauldron/mobs/Bomb_Queen.lua b/scripts/zones/Ifrits_Cauldron/mobs/Bomb_Queen.lua index a2b84450303..83367e70df9 100644 --- a/scripts/zones/Ifrits_Cauldron/mobs/Bomb_Queen.lua +++ b/scripts/zones/Ifrits_Cauldron/mobs/Bomb_Queen.lua @@ -1,9 +1,6 @@ ----------------------------------- -- Area: Ifrit's Cauldron -- NM: Bomb Queen --- Vid: https://www.youtube.com/watch?v=AVsEbYjSAHM ------------------------------------ -mixins = { require('scripts/mixins/draw_in') } ----------------------------------- ---@type TMobEntity local entity = {} @@ -24,31 +21,51 @@ local callPetParams = { inactiveTime = 5000, dieWithOwner = true, + ignoreInactive = true, maxSpawns = 1, } entity.onMobInitialize = function(mob) mob:setMobMod(xi.mobMod.IDLE_DESPAWN, 900) - mob:setMobMod(xi.mobMod.HP_STANDBACK, -1) - mob:setMobMod(xi.mobMod.GIL_MIN, 15000) + mob:setMobMod(xi.mobMod.NO_MOVE, 1) + + mob:addImmunity(xi.immunity.STUN) + mob:addImmunity(xi.immunity.SILENCE) + mob:addImmunity(xi.immunity.LIGHT_SLEEP) + mob:addImmunity(xi.immunity.DARK_SLEEP) + mob:addImmunity(xi.immunity.TERROR) + mob:addImmunity(xi.immunity.PETRIFY) + + mob:setMobMod(xi.mobMod.GIL_MIN, 18000) mob:setMobMod(xi.mobMod.GIL_MAX, 18000) mob:setMobMod(xi.mobMod.MUG_GIL, 3370) - mob:setMod(xi.mod.STUN_MEVA, 50) end entity.onMobSpawn = function(mob) - mob:addImmunity(xi.immunity.STUN) + mob:setMobMod(xi.mobMod.BASE_DAMAGE_MULTIPLIER, 150) + mob:setMod(xi.mod.REGEN, 25) mob:setLocalVar('spawn_time', GetSystemTime() + 5) -- five seconds for first pet end entity.onMobFight = function(mob, target) - -- Every 30 seconds spawn a random Prince or Princess. If none remain then summon the Bastard. - -- Retail confirmed + -- Every 17-30 seconds unless extended by a spell cast spawn a random Prince or Princess. If none remain then summon the Bastard. + local drawInTable = + { + conditions = + { + mob:checkDistance(target) >= mob:getMeleeRange(target), + }, + + position = { x = 020.918, y = 019.953, z = -108.722, rot = 058.000 }, + } + + utils.drawIn(target, drawInTable) if not xi.combat.behavior.isEntityBusy(mob) and GetSystemTime() >= mob:getLocalVar('spawn_time') then - mob:setLocalVar('spawn_time', GetSystemTime() + 30) + mob:setLocalVar('spawn_time', GetSystemTime() + math.random(17, 30)) + mob:setMagicCastingEnabled(false) -- will call the first that is not spawned if not xi.mob.callPets(mob, utils.shuffle(basicPets), callPetParams) then diff --git a/sql/mob_groups.sql b/sql/mob_groups.sql index e27f299cefe..3f8e4dac5a9 100644 --- a/sql/mob_groups.sql +++ b/sql/mob_groups.sql @@ -13662,10 +13662,10 @@ INSERT INTO `mob_groups` VALUES (21,2015,205,'Hurricane_Wyvern',300,0,1340,0,0,7 INSERT INTO `mob_groups` VALUES (22,4258,205,'Vouivre',0,32,2591,31000,0,79,81,0); INSERT INTO `mob_groups` VALUES (23,265,205,'Ash_Dragon',0,128,179,60000,10000,85,85,0); INSERT INTO `mob_groups` VALUES (24,2664,205,'Mimic',0,128,1691,0,0,63,69,0); -INSERT INTO `mob_groups` VALUES (25,498,205,'Bomb_Queen',0,128,334,50000,0,80,81,0); -INSERT INTO `mob_groups` VALUES (26,497,205,'Bomb_Princess',0,128,0,1000,0,64,65,0); -INSERT INTO `mob_groups` VALUES (27,496,205,'Bomb_Prince',0,128,0,1000,0,64,65,0); -INSERT INTO `mob_groups` VALUES (28,494,205,'Bomb_Bastard',0,128,0,1500,0,64,65,0); +INSERT INTO `mob_groups` VALUES (25,498,205,'Bomb_Queen',0,128,334,47000,47000,79,81,0); +INSERT INTO `mob_groups` VALUES (26,497,205,'Bomb_Princess',0,128,0,1120,0,72,74,0); +INSERT INTO `mob_groups` VALUES (27,496,205,'Bomb_Prince',0,128,0,1120,0,72,74,0); +INSERT INTO `mob_groups` VALUES (28,494,205,'Bomb_Bastard',0,128,0,1120,0,72,74,0); INSERT INTO `mob_groups` VALUES (29,3844,205,'Tarasque',0,128,2377,7600,0,72,74,0); INSERT INTO `mob_groups` VALUES (30,607,205,'Cailleach_Bheur',0,128,0,9300,9300,82,82,0); INSERT INTO `mob_groups` VALUES (31,5175,205,'Ildebrann',0,128,0,0,9999,98,99,0); diff --git a/sql/mob_pools.sql b/sql/mob_pools.sql index bc1750799b8..52c63e18cec 100644 --- a/sql/mob_pools.sql +++ b/sql/mob_pools.sql @@ -549,11 +549,11 @@ INSERT INTO `mob_pools` VALUES (490,'Bomb','Bomb',56,0x0000180100000000000000000 INSERT INTO `mob_pools` VALUES (491,'Bombadeel','Bombadeel',136,0x0000280100000000000000000000000000000000,1,1,6,240,100,0,0,0,0,2,0,0,0,0,0,0,0,0,0,794,136,3,41); INSERT INTO `mob_pools` VALUES (492,'Bomblix_Flamefinger','Bomblix_Flamefinger',133,0x0000BC0200000000000000000000000000000000,4,4,11,240,100,0,0,0,0,2,0,32,7,159,0,0,283,0,0,980,133,3,25); INSERT INTO `mob_pools` VALUES (493,'Bombshells','Bombshells',68,0x0000230100000000000000000000000000000000,1,1,11,240,100,0,1,1,0,32,0,64,10,641,4,0,0,0,0,68,68,0,32); -INSERT INTO `mob_pools` VALUES (494,'Bomb_Bastard','Bomb_Bastard',56,0x0000180100000000000000000000000000000000,1,1,11,240,100,0,1,0,1,2,0,0,0,3,0,0,0,0,0,56,56,NULL,NULL); +INSERT INTO `mob_pools` VALUES (494,'Bomb_Bastard','Bomb_Bastard',56,0x0000180100000000000000000000000000000000,1,1,11,480,100,0,1,0,1,2,0,0,0,3,0,0,0,0,0,56,56,NULL,NULL); INSERT INTO `mob_pools` VALUES (495,'Bomb_King','Bomb_King',56,0x0000180100000000000000000000000000000000,1,1,5,240,100,0,1,0,0,2,0,0,0,133,0,0,0,0,0,56,56,2,13); -INSERT INTO `mob_pools` VALUES (496,'Bomb_Prince','Bomb_Prince',56,0x0000180100000000000000000000000000000000,1,1,11,240,100,0,1,0,1,2,0,0,5760,641,0,0,0,0,0,56,56,0,10); -INSERT INTO `mob_pools` VALUES (497,'Bomb_Princess','Bomb_Princess',56,0x0000180100000000000000000000000000000000,1,1,11,240,100,0,1,0,1,2,0,0,538,641,0,0,0,0,0,56,56,0,10); -INSERT INTO `mob_pools` VALUES (498,'Bomb_Queen','Bomb_Queen',56,0x0000180100000000000000000000000000000000,4,15,12,240,100,0,1,0,0,2,0,0,6,647,0,0,295,0,0,56,56,3,16); +INSERT INTO `mob_pools` VALUES (496,'Bomb_Prince','Bomb_Prince',56,0x0000180100000000000000000000000000000000,1,1,11,480,100,0,1,0,1,2,0,0,5760,641,0,0,0,0,0,56,56,0,10); +INSERT INTO `mob_pools` VALUES (497,'Bomb_Princess','Bomb_Princess',56,0x0000180100000000000000000000000000000000,1,1,11,480,100,0,1,0,1,2,0,0,538,641,0,0,0,0,0,56,56,0,10); +INSERT INTO `mob_pools` VALUES (498,'Bomb_Queen','Bomb_Queen',56,0x0000180100000000000000000000000000000000,4,1,12,240,100,0,1,0,0,2,0,0,6,647,0,0,295,0,0,0,56,3,16); INSERT INTO `mob_pools` VALUES (499,'Bonfire','Bonfire',56,0x0000180100000000000000000000000000000000,1,1,11,240,100,0,1,0,0,0,0,0,1,131,16,0,0,0,0,56,56,1,12); INSERT INTO `mob_pools` VALUES (500,'Bonnacon','Bonnacon',57,0x00004D0500000000000000000000000000000000,1,8,5,360,100,0,1,0,0,2,0,32,232,157,0,0,0,0,0,57,57,NULL,NULL); INSERT INTO `mob_pools` VALUES (501,'Bonze_Marberry','Bonze_Marberry',243,0x0000C60400000000000000000000000000000000,4,4,6,240,100,0,1,0,1,2,6160,32,291,157,0,0,2,0,0,243,243,2,11); diff --git a/sql/mob_spawn_points.sql b/sql/mob_spawn_points.sql index 82618ffe968..cb43035a096 100644 --- a/sql/mob_spawn_points.sql +++ b/sql/mob_spawn_points.sql @@ -69968,7 +69968,7 @@ INSERT INTO `mob_spawn_points` VALUES (17617154,0,'Volcanic_Bomb','Volcanic Bomb INSERT INTO `mob_spawn_points` VALUES (17617155,0,'Volcanic_Bomb','Volcanic Bomb',18,-382.992,27.940,259.001,105); INSERT INTO `mob_spawn_points` VALUES (17617156,0,'Volcanic_Bomb','Volcanic Bomb',18,-21.588,39.921,62.884,127); INSERT INTO `mob_spawn_points` VALUES (17617157,0,'Mimic','Mimic',24,1.000,1.000,1.000,0); -INSERT INTO `mob_spawn_points` VALUES (17617158,0,'Bomb_Queen','Bomb Queen',25,14.682,20.058,-104.121,0); +INSERT INTO `mob_spawn_points` VALUES (17617158,0,'Bomb_Queen','Bomb Queen',25,21.128,19.687,-110.232,0); INSERT INTO `mob_spawn_points` VALUES (17617159,0,'Bomb_Princess','Bomb Princess',26,1.000,1.000,1.000,0); INSERT INTO `mob_spawn_points` VALUES (17617160,0,'Bomb_Prince','Bomb Prince',27,1.000,1.000,1.000,0); INSERT INTO `mob_spawn_points` VALUES (17617161,0,'Bomb_Princess','Bomb Princess',26,1.000,1.000,1.000,0);