From eb7d462413efa4a3244b8263ed4111e7b1333c09 Mon Sep 17 00:00:00 2001 From: Skold177 <113406182+Skold177@users.noreply.github.com> Date: Sat, 24 Jan 2026 19:23:30 -0500 Subject: [PATCH] [lua] [sql] ENM Automaton Assault Adds the ENM Automaton Assault with captures from retail. --- scripts/actions/mobskills/crescent_moon.lua | 26 +++ scripts/actions/mobskills/freezebite.lua | 22 +- scripts/actions/mobskills/frostbite.lua | 25 +++ scripts/actions/mobskills/hard_slash.lua | 26 +++ scripts/actions/mobskills/power_slash.lua | 8 +- scripts/actions/mobskills/shockwave.lua | 10 +- scripts/actions/mobskills/sickle_moon.lua | 8 +- .../Mine_Shaft_2716/automaton_assault.lua | 157 ++++++++++++++ scripts/enum/item.lua | 11 + scripts/enum/mob_skill.lua | 8 + scripts/zones/Mine_Shaft_2716/IDs.lua | 14 +- .../Mine_Shaft_2716/mobs/Elvaan_Automaton.lua | 110 ++++++++++ .../Mine_Shaft_2716/mobs/Galkan_Automaton.lua | 112 ++++++++++ .../Mine_Shaft_2716/mobs/Hume_Automaton.lua | 197 ++++++++++++++++++ .../mobs/Mithran_Automaton.lua | 114 ++++++++++ .../mobs/Tarutaru_Automaton.lua | 127 +++++++++++ sql/mob_groups.sql | 10 +- sql/mob_pools.sql | 10 +- sql/mob_skills.sql | 14 +- sql/mob_spawn_points.sql | 30 +-- 20 files changed, 974 insertions(+), 65 deletions(-) create mode 100644 scripts/actions/mobskills/crescent_moon.lua create mode 100644 scripts/actions/mobskills/frostbite.lua create mode 100644 scripts/actions/mobskills/hard_slash.lua create mode 100644 scripts/battlefields/Mine_Shaft_2716/automaton_assault.lua create mode 100644 scripts/zones/Mine_Shaft_2716/mobs/Elvaan_Automaton.lua create mode 100644 scripts/zones/Mine_Shaft_2716/mobs/Galkan_Automaton.lua create mode 100644 scripts/zones/Mine_Shaft_2716/mobs/Hume_Automaton.lua create mode 100644 scripts/zones/Mine_Shaft_2716/mobs/Mithran_Automaton.lua create mode 100644 scripts/zones/Mine_Shaft_2716/mobs/Tarutaru_Automaton.lua diff --git a/scripts/actions/mobskills/crescent_moon.lua b/scripts/actions/mobskills/crescent_moon.lua new file mode 100644 index 00000000000..469ec8b007d --- /dev/null +++ b/scripts/actions/mobskills/crescent_moon.lua @@ -0,0 +1,26 @@ +----------------------------------- +-- Crescent Moon +-- +-- Description: Delivers a powerful strike to a single target. +-- Type: Physical +-- Utsusemi/Blink absorb: 1 shadow +-- Range: Melee +----------------------------------- +---@type TMobSkill +local mobskillObject = {} + +mobskillObject.onMobSkillCheck = function(target, mob, skill) + return 0 +end + +mobskillObject.onMobWeaponSkill = function(target, mob, skill) + local numhits = 1 + local accmod = 1 + local ftp = 3 + local info = xi.mobskills.mobPhysicalMove(mob, target, skill, numhits, accmod, ftp, xi.mobskills.physicalTpBonus.NO_EFFECT) + local dmg = xi.mobskills.mobFinalAdjustments(info.dmg, mob, skill, target, xi.attackType.PHYSICAL, xi.damageType.BLUNT, info.hitslanded) + target:takeDamage(dmg, mob, xi.attackType.PHYSICAL, xi.damageType.BLUNT) + return dmg +end + +return mobskillObject diff --git a/scripts/actions/mobskills/freezebite.lua b/scripts/actions/mobskills/freezebite.lua index 9da33f0f3f3..c59a48c32cf 100644 --- a/scripts/actions/mobskills/freezebite.lua +++ b/scripts/actions/mobskills/freezebite.lua @@ -1,15 +1,11 @@ ----------------------------------- -- Freezebite --- Great Sword weapon skill --- Skill Level: 100 --- Delivers an ice elemental attack. Damage varies with TP. --- Aligned with the Snow Gorget & Breeze Gorget. --- Aligned with the Snow Belt & Breeze Belt. --- Element: Ice --- Modifiers: STR:30% INT:20% --- 100%TP 200%TP 300%TP --- 1.00 1.50 3.00 +-- Description: Delivers an Ice elemental attack. +-- Type: Magical +-- Utsusemi/Blink absorb: 1 shadow +-- Range: Melee ----------------------------------- + ---@type TMobSkill local mobskillObject = {} @@ -18,13 +14,11 @@ mobskillObject.onMobSkillCheck = function(target, mob, skill) end mobskillObject.onMobWeaponSkill = function(target, mob, skill) - local params = {} - params.numHits = 1 - params.ftpMod = { 1.0, 1.5, 3.0 } - params.str_wsc = 0.3 params.int_wsc = 0.2 - local damage, _, _, _ = xi.weaponskills.doPhysicalWeaponskill(mob, target, 0, params, 0, nil, true, nil) + local damage = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.ICE, 4, xi.mobskills.magicalTpBonus.NO_EFFECT) + damage = xi.mobskills.mobFinalAdjustments(damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.WIPE_SHADOWS) target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + return damage end diff --git a/scripts/actions/mobskills/frostbite.lua b/scripts/actions/mobskills/frostbite.lua new file mode 100644 index 00000000000..3146ca878dc --- /dev/null +++ b/scripts/actions/mobskills/frostbite.lua @@ -0,0 +1,25 @@ +----------------------------------- +-- Frostbite +-- Description: Delivers an Ice elemental attack. +-- Type: Magical +-- Utsusemi/Blink absorb: 1 shadow +-- Range: Melee +----------------------------------- + +---@type TMobSkill +local mobskillObject = {} + +mobskillObject.onMobSkillCheck = function(target, mob, skill) + return 0 +end + +mobskillObject.onMobWeaponSkill = function(target, mob, skill) + local damage = xi.mobskills.mobMagicalMove(mob, target, skill, mob:getMainLvl() + 2, xi.element.ICE, 4, xi.mobskills.magicalTpBonus.NO_EFFECT) + damage = xi.mobskills.mobFinalAdjustments(damage, mob, skill, target, xi.attackType.MAGICAL, xi.damageType.ICE, xi.mobskills.shadowBehavior.WIPE_SHADOWS) + + target:takeDamage(damage, mob, xi.attackType.MAGICAL, xi.damageType.ICE) + + return damage +end + +return mobskillObject diff --git a/scripts/actions/mobskills/hard_slash.lua b/scripts/actions/mobskills/hard_slash.lua new file mode 100644 index 00000000000..c5cd2a9ecb6 --- /dev/null +++ b/scripts/actions/mobskills/hard_slash.lua @@ -0,0 +1,26 @@ +----------------------------------- +-- Hard Slash +-- +-- Description: Delivers a single-hit attack. +-- Type: Physical +-- Utsusemi/Blink absorb: 1 shadow +-- Range: Melee +----------------------------------- +---@type TMobSkill +local mobskillObject = {} + +mobskillObject.onMobSkillCheck = function(target, mob, skill) + return 0 +end + +mobskillObject.onMobWeaponSkill = function(target, mob, skill) + local numhits = 1 + local accmod = 1 + local ftp = 3 + local info = xi.mobskills.mobPhysicalMove(mob, target, skill, numhits, accmod, ftp, xi.mobskills.physicalTpBonus.NO_EFFECT) + local dmg = xi.mobskills.mobFinalAdjustments(info.dmg, mob, skill, target, xi.attackType.PHYSICAL, xi.damageType.BLUNT, info.hitslanded) + target:takeDamage(dmg, mob, xi.attackType.PHYSICAL, xi.damageType.BLUNT) + return dmg +end + +return mobskillObject diff --git a/scripts/actions/mobskills/power_slash.lua b/scripts/actions/mobskills/power_slash.lua index 2889253516d..fe6324a2380 100644 --- a/scripts/actions/mobskills/power_slash.lua +++ b/scripts/actions/mobskills/power_slash.lua @@ -15,10 +15,10 @@ end mobskillObject.onMobWeaponSkill = function(target, mob, skill) local numhits = 1 - local accmod = 1 - local ftp = 3 - local info = xi.mobskills.mobPhysicalMove(mob, target, skill, numhits, accmod, ftp, xi.mobskills.physicalTpBonus.NO_EFFECT) - local dmg = xi.mobskills.mobFinalAdjustments(info.dmg, mob, skill, target, xi.attackType.PHYSICAL, xi.damageType.BLUNT, info.hitslanded) + local accmod = 1 + local ftp = 3 + local info = xi.mobskills.mobPhysicalMove(mob, target, skill, numhits, accmod, ftp, xi.mobskills.physicalTpBonus.NO_EFFECT) + local dmg = xi.mobskills.mobFinalAdjustments(info.dmg, mob, skill, target, xi.attackType.PHYSICAL, xi.damageType.BLUNT, info.hitslanded) target:takeDamage(dmg, mob, xi.attackType.PHYSICAL, xi.damageType.BLUNT) return dmg end diff --git a/scripts/actions/mobskills/shockwave.lua b/scripts/actions/mobskills/shockwave.lua index cd7c92b60ef..45f57b2a62e 100644 --- a/scripts/actions/mobskills/shockwave.lua +++ b/scripts/actions/mobskills/shockwave.lua @@ -12,14 +12,14 @@ end mobskillObject.onMobWeaponSkill = function(target, mob, skill) local numhits = 1 - local accmod = 1 - local ftp = 2 - local info = xi.mobskills.mobPhysicalMove(mob, target, skill, numhits, accmod, ftp, xi.mobskills.physicalTpBonus.NO_EFFECT) - local dmg = xi.mobskills.mobFinalAdjustments(info.dmg, mob, skill, target, xi.attackType.PHYSICAL, xi.damageType.SLASHING, info.hitslanded) + local accmod = 1 + local ftp = 2 + local info = xi.mobskills.mobPhysicalMove(mob, target, skill, numhits, accmod, ftp, 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) - xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SLEEP_I, 1, 0, 60) + xi.mobskills.mobStatusEffectMove(mob, target, xi.effect.SLEEP_I, 1, 0, 180) return dmg end diff --git a/scripts/actions/mobskills/sickle_moon.lua b/scripts/actions/mobskills/sickle_moon.lua index d26ead28e60..1174dbcf1a3 100644 --- a/scripts/actions/mobskills/sickle_moon.lua +++ b/scripts/actions/mobskills/sickle_moon.lua @@ -11,10 +11,10 @@ end mobskillObject.onMobWeaponSkill = function(target, mob, skill) local numhits = 2 - local accmod = 4 - local ftp = 4 -- fTP and fTP scaling unknown. TODO: capture ftp - local info = xi.mobskills.mobPhysicalMove(mob, target, skill, numhits, accmod, ftp, xi.mobskills.physicalTpBonus.NO_EFFECT, 0, 0, 0) - local dmg = xi.mobskills.mobFinalAdjustments(info.dmg, mob, skill, target, xi.attackType.PHYSICAL, xi.damageType.SLASHING, info.hitslanded) + local accmod = 4 + local ftp = 2 -- fTP and fTP scaling unknown. TODO: capture ftp + local info = xi.mobskills.mobPhysicalMove(mob, target, skill, numhits, accmod, ftp, xi.mobskills.physicalTpBonus.NO_EFFECT, 0, 0, 0) + 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) return dmg end diff --git a/scripts/battlefields/Mine_Shaft_2716/automaton_assault.lua b/scripts/battlefields/Mine_Shaft_2716/automaton_assault.lua new file mode 100644 index 00000000000..e12a70595b0 --- /dev/null +++ b/scripts/battlefields/Mine_Shaft_2716/automaton_assault.lua @@ -0,0 +1,157 @@ +----------------------------------- +-- Automaton Assault +-- Level 60 ENM +-- !addkeyitem SHAFT_GATE_OPERATING_DIAL +-- TODO: Uncomment Gravity resistance in all automatons when implemented +----------------------------------- +local mineshaftID = zones[xi.zone.MINE_SHAFT_2716] +----------------------------------- + +local content = Battlefield:new({ + zoneId = xi.zone.MINE_SHAFT_2716, + battlefieldId = xi.battlefield.id.AUTOMATON_ASSAULT, + maxPlayers = 6, + levelCap = 60, + timeLimit = utils.minutes(15), + index = 4, + entryNpc = '_0d0', + exitNpcs = { '_0d1', '_0d2', '_0d3' }, + requiredKeyItems = { xi.ki.SHAFT_GATE_OPERATING_DIAL, message = mineshaftID.text.SNAPS_IN_TWO, }, + grantXP = 2000, + armouryCrates = + { + mineshaftID.mob.HUME_AUTOMATON - 1, + mineshaftID.mob.HUME_AUTOMATON + 5, + mineshaftID.mob.HUME_AUTOMATON + 11, + }, +}) + +local raceOffsets = +{ + [xi.race.HUME_M ] = 0, + [xi.race.HUME_F ] = 0, + [xi.race.ELVAAN_M] = 1, + [xi.race.ELVAAN_F] = 1, + [xi.race.TARU_M ] = 2, + [xi.race.TARU_F ] = 2, + [xi.race.MITHRA ] = 3, + [xi.race.GALKA ] = 4, +} + +----------------------------------- +-- Registration Gate - All Races Must Match +----------------------------------- +function content:onEntryEventUpdate(player, csid, option, npc) + if not player:hasStatusEffect(xi.effect.BATTLEFIELD) then + local race = raceOffsets[player:getRace()] + local zoneId = player:getZoneID() + + for _, member in pairs(player:getAlliance()) do + if + member:getZoneID() == zoneId and + member:getStatus() ~= xi.status.DISAPPEAR + then + local memberRace = raceOffsets[member:getRace()] + + if memberRace ~= race then + player:updateEvent(xi.battlefield.returnCode.REQS_NOT_MET) + player:setLocalVar('noPosUpdate', 1) + return 0 + end + end + end + end + + return Battlefield.onEntryEventUpdate(self, player, csid, option, npc) +end + +----------------------------------- +-- Build Enemy Group - Exclude Initiators Race +----------------------------------- +local function buildAutomatonGroup(battlefield, initiatorRace) + local area = battlefield:getArea() + local excludeOffset = raceOffsets[initiatorRace] or 0 + local base = mineshaftID.mob.HUME_AUTOMATON + (area - 1) * 6 + local ids = {} + + for offset = 0, 4 do + if offset ~= excludeOffset then + ids[#ids + 1] = base + offset + end + end + + local mobIds = { {}, {}, {} } + mobIds[area] = ids + + return { + mobIds = mobIds, + allDeath = utils.bind(content.handleAllMonstersDefeated, content), + } +end + +----------------------------------- +-- Initialize Battlefield +----------------------------------- +function content:onBattlefieldInitialize(battlefield) + local initiatorRace = GetPlayerByID(battlefield:getInitiator()):getRace() or xi.race.HUME_M + local replacedSlot = raceOffsets[initiatorRace] or 0 + + battlefield:setLocalVar('initiatorRace', initiatorRace) + battlefield:setLocalVar('replacedSlot', replacedSlot) + + self.groups = { buildAutomatonGroup(battlefield, initiatorRace) } + Battlefield.onBattlefieldInitialize(self, battlefield) +end + +----------------------------------- +-- Loot Tables +----------------------------------- +local earringTable = +{ + [0] = { xi.item.BELINKYS_EARRING, xi.item.QUANTZS_EARRING }, -- Hume M/F + [1] = { xi.item.DESAMILIONS_EARRING, xi.item.MELNINAS_EARRING }, -- Elvaan M/F + [2] = { xi.item.WAETOTOS_EARRING, xi.item.MORUKAKAS_EARRING }, -- Taru M/F + [3] = { xi.item.RYAKHOS_EARRING, xi.item.FEYUHS_EARRING }, -- Mithra + [4] = { xi.item.ZEDOMAS_EARRING, xi.item.GAYANJS_EARRING }, -- Galka +} + +local function getLootPool(battlefield) + -- Get earrings based on race. + local key = raceOffsets[battlefield:getLocalVar('initiatorRace')] + local earring1 = earringTable[key][1] + local earring2 = earringTable[key][2] + + -- Build loot table. + local lootTable = + { + { + { itemId = xi.item.SACK_OF_LUGWORM_SAND, weight = 10000 }, + }, + + { + { itemId = xi.item.NONE, weight = 8000 }, + { itemId = earring1, weight = 2000 }, + }, + + { + { itemId = xi.item.NONE, weight = 8000 }, + { itemId = earring2, weight = 2000 }, + }, + } + + return lootTable or content.loot +end + +function content:handleOpenArmouryCrate(player, npc) + npcUtil.openCrate(npc, function() + local battlefield = player:getBattlefield() + local lootPool = getLootPool(battlefield) + + self:handleLootRolls(battlefield, lootPool, npc, player:getMod(xi.mod.MOGHANCEMENT_GIL_BONUS_P)) + battlefield:setStatus(xi.battlefield.status.WON) + + return true + end) +end + +return content:register() diff --git a/scripts/enum/item.lua b/scripts/enum/item.lua index 64f3c913049..2f42f0a5967 100644 --- a/scripts/enum/item.lua +++ b/scripts/enum/item.lua @@ -1203,6 +1203,7 @@ xi.item = PREMIUM_BAG = 1827, SPOOL_OF_RED_GRASS_THREAD = 1828, SQUARE_OF_RED_GRASS_CLOTH = 1829, + SACK_OF_LUGWORM_SAND = 1830, BROKEN_HUME_FISHING_ROD = 1832, BROKEN_HALCYON_FISHING_ROD = 1833, SABER_SHOOT = 1837, @@ -6288,6 +6289,16 @@ xi.item = RERAISE_EARRING = 14790, SANATIVE_EARRING = 14791, RELAXING_EARRING = 14792, + BELINKYS_EARRING = 14793, + QUANTZS_EARRING = 14794, + DESAMILIONS_EARRING = 14795, + MELNINAS_EARRING = 14796, + WAETOTOS_EARRING = 14797, + MORUKAKAS_EARRING = 14798, + RYAKHOS_EARRING = 14799, + FEYUHS_EARRING = 14800, + ZEDOMAS_EARRING = 14801, + GAYANJS_EARRING = 14802, OPTICAL_EARRING = 14803, HEIMS_EARRING = 14805, NOVIO_EARRING = 14808, diff --git a/scripts/enum/mob_skill.lua b/scripts/enum/mob_skill.lua index 30d338eca31..eddaab7408c 100644 --- a/scripts/enum/mob_skill.lua +++ b/scripts/enum/mob_skill.lua @@ -9,6 +9,14 @@ xi.mobSkill = SHARK_BITE = 24, EVISCERATION = 25, + HARD_SLASH_1 = 48, + POWER_SLASH_1 = 49, + FROSTBITE_1 = 50, + FREEZEBITE_1 = 51, + SHOCKWAVE_1 = 52, + CRESCENT_MOON_1 = 53, + SICKLE_MOON_1 = 54, + VORPAL_SCYTHE = 101, GUILLOTINE_1 = 102, diff --git a/scripts/zones/Mine_Shaft_2716/IDs.lua b/scripts/zones/Mine_Shaft_2716/IDs.lua index 9ec3839054e..493fc764bb7 100644 --- a/scripts/zones/Mine_Shaft_2716/IDs.lua +++ b/scripts/zones/Mine_Shaft_2716/IDs.lua @@ -23,6 +23,7 @@ zones[xi.zone.MINE_SHAFT_2716] = TIME_LIMIT_FOR_THIS_BATTLE_IS = 7382, -- The time limit for this battle is minutes. PARTY_MEMBERS_HAVE_FALLEN = 7418, -- All party members have fallen in battle. Now leaving the battlefield. THE_PARTY_WILL_BE_REMOVED = 7425, -- If all party members' HP are still zero after # minute[/s], the party will be removed from the battlefield. + DO_NOT_MEET_REQUIREMENTS = 7429, -- You do not meet the requirements to enter the battlefield with your party members. Access is denied. SNAPS_IN_TWO = 7433, -- The snaps in two! CONQUEST_BASE = 7442, -- Tallying conquest results... ENTERING_THE_BATTLEFIELD_FOR = 7605, -- Entering the battlefield for [A Century of Hardship/Return to the Depths/Bionic Bug/Pulling the Strings/Automaton Assault/The Mobline Comedy/To Movalpolos!]! @@ -34,12 +35,13 @@ zones[xi.zone.MINE_SHAFT_2716] = }, mob = { - BUGBBY = GetFirstID('Bugbby'), - BUGBOY = GetFirstID('Bugboy'), - CHEKOCHUK = GetFirstID('Chekochuk'), - MOVAMUQ = GetFirstID('Movamuq'), - SWIPOSTIK = GetFirstID('Swipostik'), - TRIKOTRAK = GetFirstID('Trikotrak'), + BUGBBY = GetFirstID('Bugbby'), + BUGBOY = GetFirstID('Bugboy'), + CHEKOCHUK = GetFirstID('Chekochuk'), + MOVAMUQ = GetFirstID('Movamuq'), + SWIPOSTIK = GetFirstID('Swipostik'), + TRIKOTRAK = GetFirstID('Trikotrak'), + HUME_AUTOMATON = GetFirstID('Hume_Automaton'), }, npc = { diff --git a/scripts/zones/Mine_Shaft_2716/mobs/Elvaan_Automaton.lua b/scripts/zones/Mine_Shaft_2716/mobs/Elvaan_Automaton.lua new file mode 100644 index 00000000000..5ebf24b3b22 --- /dev/null +++ b/scripts/zones/Mine_Shaft_2716/mobs/Elvaan_Automaton.lua @@ -0,0 +1,110 @@ +----------------------------------- +-- Area: Mine Shaft 2716 +-- ENM : Automaton Assault +-- Mob: Elvaan Automaton +----------------------------------- +---@type TMobEntity +local entity = {} +----------------------------------- +local orderIndex = 1 +----------------------------------- + +local raceKey = +{ + [xi.race.HUME_M ] = 0, + [xi.race.HUME_F ] = 0, + [xi.race.ELVAAN_M] = 1, + [xi.race.ELVAAN_F] = 1, + [xi.race.TARU_M ] = 2, + [xi.race.TARU_F ] = 2, + [xi.race.MITHRA ] = 3, + [xi.race.GALKA ] = 4, +} + +local function callNextAutomaton(mob, target, nextOrderIndex) + local battlefield = mob:getBattlefield() + if not battlefield then + return + end + + local replacedSlot = raceKey[battlefield:getLocalVar('initiatorRace')] or 0 + local nextAutomatonOffset = (nextOrderIndex % 4) + 1 -- Next slot in line, looping back to 1 after 4 using modulo (4 % 4 = 0 + 1 = 1) + + -- If an Automaton has been replaced and that Automaton is the next in line, call the Hume Automaton instead. + if + replacedSlot ~= 0 and + replacedSlot == nextAutomatonOffset + then + nextAutomatonOffset = 0 + end + + -- Base ID for the Hume Automaton in the current battlefield area. + local baseId = zones[xi.zone.MINE_SHAFT_2716].mob.HUME_AUTOMATON + (battlefield:getArea() - 1) * 6 + + -- Get the next automaton based on calculated offset. + local nextAutomaton = GetMobByID(baseId + nextAutomatonOffset) + if not nextAutomaton then + return false + end + + if not nextAutomaton:isAlive() then + return false + end + + nextAutomaton:updateEnmity(target) -- Call the next automaton to engage the target. + return true -- Return true to set automatonCalled to 1. +end + +entity.onMobSpawn = function(mob) + mob:setMod(xi.mod.SILENCE_RES_RANK, 9) + mob:setMod(xi.mod.DARK_SLEEP_RES_RANK, 9) + mob:setMod(xi.mod.BIND_RES_RANK, 9) + --mob:setMod(xi.mod.GRAVITY_RES_RANK, 9) + mob:setMobMod(xi.mobMod.BASE_DAMAGE_MULTIPLIER, 200) + mob:setMagicCastingEnabled(false) + + mob:setMobMod(xi.mobMod.NO_LINK, 1) + mob:setLocalVar('nextAutomatonCalled', 0) +end + +entity.onMobFight = function(mob, target) + if mob:getHPP() >= 10 then + return + end + + if mob:getLocalVar('nextAutomatonCalled') == 1 then + return + end + + if callNextAutomaton(mob, target, orderIndex) then + mob:setLocalVar('nextAutomatonCalled', 1) + end +end + +entity.onMobMobskillChoose = function(mob, target, skillId) + local skills = + { + xi.mobSkill.HARD_SLASH_1, + xi.mobSkill.POWER_SLASH_1, + xi.mobSkill.FROSTBITE_1, + xi.mobSkill.FREEZEBITE_1, + xi.mobSkill.SHOCKWAVE_1, + xi.mobSkill.CRESCENT_MOON_1, + xi.mobSkill.SICKLE_MOON_1, + } + + return skills[math.random(1, #skills)] +end + +entity.onMobDeath = function(mob, player, optParams) + if optParams.isKiller or optParams.noKiller then + if + mob:getLocalVar('nextAutomatonCalled') == 0 and + callNextAutomaton(mob, player, orderIndex) + then + mob:setLocalVar('nextAutomatonCalled', 1) + end + end +end + +return entity diff --git a/scripts/zones/Mine_Shaft_2716/mobs/Galkan_Automaton.lua b/scripts/zones/Mine_Shaft_2716/mobs/Galkan_Automaton.lua new file mode 100644 index 00000000000..be80e949e3c --- /dev/null +++ b/scripts/zones/Mine_Shaft_2716/mobs/Galkan_Automaton.lua @@ -0,0 +1,112 @@ +----------------------------------- +-- Area: Mine Shaft 2716 +-- ENM : Automaton Assault +-- Mob: Galkan Automaton +----------------------------------- +---@type TMobEntity +local entity = {} +----------------------------------- +local orderIndex = 4 +----------------------------------- + +local raceKey = +{ + [xi.race.HUME_M ] = 0, + [xi.race.HUME_F ] = 0, + [xi.race.ELVAAN_M] = 1, + [xi.race.ELVAAN_F] = 1, + [xi.race.TARU_M ] = 2, + [xi.race.TARU_F ] = 2, + [xi.race.MITHRA ] = 3, + [xi.race.GALKA ] = 4, +} + +local function callNextAutomaton(mob, target, nextOrderIndex) + local battlefield = mob:getBattlefield() + if not battlefield then + return + end + + local replacedSlot = raceKey[battlefield:getLocalVar('initiatorRace')] or 0 + local nextAutomatonOffset = (nextOrderIndex % 4) + 1 -- Next slot in line, looping back to 1 after 4 using modulo (4 % 4 = 0 + 1 = 1) + + -- If an Automaton has been replaced and that Automaton is the next in line, call the Hume Automaton instead. + if + replacedSlot ~= 0 and + replacedSlot == nextAutomatonOffset + then + nextAutomatonOffset = 0 + end + + -- Base ID for the Hume Automaton in the current battlefield area. + local baseId = zones[xi.zone.MINE_SHAFT_2716].mob.HUME_AUTOMATON + (battlefield:getArea() - 1) * 6 + + -- Get the next automaton based on calculated offset. + local nextAutomaton = GetMobByID(baseId + nextAutomatonOffset) + if not nextAutomaton then + return false + end + + if not nextAutomaton:isAlive() then + return false + end + + nextAutomaton:updateEnmity(target) -- Call the next automaton to engage the target. + return true -- Return true to set automatonCalled to 1. +end + +entity.onMobSpawn = function(mob) + mob:setMod(xi.mod.SILENCE_RES_RANK, 9) + mob:setMod(xi.mod.DARK_SLEEP_RES_RANK, 9) + mob:setMod(xi.mod.BIND_RES_RANK, 9) + --mob:setMod(xi.mod.GRAVITY_RES_RANK, 9) + mob:setMod(xi.mod.UDMGMAGIC, 10000) + mob:setMod(xi.mod.UDMGPHYS, -9500) + mob:setMod(xi.mod.UDMGRANGE, -5000) + mob:setMagicCastingEnabled(false) + + mob:setMobMod(xi.mobMod.NO_LINK, 1) + mob:setLocalVar('nextAutomatonCalled', 0) +end + +entity.onMobFight = function(mob, target) + if mob:getHPP() >= 10 then + return + end + + if mob:getLocalVar('nextAutomatonCalled') == 1 then + return + end + + if callNextAutomaton(mob, target, orderIndex) then + mob:setLocalVar('nextAutomatonCalled', 1) + end +end + +entity.onMobMobskillChoose = function(mob, target, skillId) + local skills = + { + xi.mobSkill.HARD_SLASH_1, + xi.mobSkill.POWER_SLASH_1, + xi.mobSkill.FROSTBITE_1, + xi.mobSkill.FREEZEBITE_1, + xi.mobSkill.SHOCKWAVE_1, + xi.mobSkill.CRESCENT_MOON_1, + xi.mobSkill.SICKLE_MOON_1, + } + + return skills[math.random(1, #skills)] +end + +entity.onMobDeath = function(mob, player, optParams) + if optParams.isKiller or optParams.noKiller then + if + mob:getLocalVar('nextAutomatonCalled') == 0 and + callNextAutomaton(mob, player, orderIndex) + then + mob:setLocalVar('nextAutomatonCalled', 1) + end + end +end + +return entity diff --git a/scripts/zones/Mine_Shaft_2716/mobs/Hume_Automaton.lua b/scripts/zones/Mine_Shaft_2716/mobs/Hume_Automaton.lua new file mode 100644 index 00000000000..0ccee8c5e8f --- /dev/null +++ b/scripts/zones/Mine_Shaft_2716/mobs/Hume_Automaton.lua @@ -0,0 +1,197 @@ +----------------------------------- +-- Area: Mine Shaft 2716 +-- ENM : Automaton Assault +-- Mob: Hume Automaton +----------------------------------- +---@type TMobEntity +local entity = {} +----------------------------------- + +-- Spawn points of all possible replacements +local spawnPoints = +{ + [1] = -- Elvaan + { + [1] = { x = -466.000, y = 121.704, z = 26.000, rot = 64 }, + [2] = { x = 14.138, y = 1.704, z = 22.883, rot = 64 }, + [3] = { x = 494.362, y = -118.296, z = 22.365, rot = 64 }, + }, + + [2] = -- Tarutaru + { + [1] = { x = -462.000, y = 121.637, z = 26.000, rot = 64 }, + [2] = { x = 18.138, y = 1.637, z = 22.883, rot = 64 }, + [3] = { x = 498.362, y = -118.363, z = 22.365, rot = 64 }, + }, + + [3] = -- Mithra + { + [1] = { x = -458.000, y = 121.637, z = 26.000, rot = 64 }, + [2] = { x = 22.138, y = 1.637, z = 22.883, rot = 64 }, + [3] = { x = 502.362, y = -118.363, z = 22.365, rot = 64 }, + }, + + [4] = -- Galka + { + [1] = { x = -454.000, y = 121.704, z = 26.000, rot = 64 }, + [2] = { x = 26.138, y = 1.704, z = 22.883, rot = 64 }, + [3] = { x = 506.362, y = -118.296, z = 22.365, rot = 64 }, + }, +} + +local raceKey = +{ + [xi.race.HUME_M ] = 0, + [xi.race.HUME_F ] = 0, + [xi.race.ELVAAN_M] = 1, + [xi.race.ELVAAN_F] = 1, + [xi.race.TARU_M ] = 2, + [xi.race.TARU_F ] = 2, + [xi.race.MITHRA ] = 3, + [xi.race.GALKA ] = 4, +} + +local function callNextAutomaton(mob, target) + local battlefield = mob:getBattlefield() + if not battlefield then + return false + end + + local replacedSlot = battlefield:getLocalVar('replacedSlot') -- Returns 1-4 based on which automaton is being replaced + local nextSlotOffset = (replacedSlot % 4) + 1 -- Next slot in line, looping back to 1 after 4 using modulo (4 % 4 = 0 + 1 = 1) + + -- Base ID for the Hume Automaton in the current battlefield area. + local baseId = mob:getID() + + -- Get the next automaton based on calculated offset. + local nextAutomaton = GetMobByID(baseId + nextSlotOffset) + if not nextAutomaton then + return false + end + + if not nextAutomaton:isAlive() then + return false + end + + nextAutomaton:updateEnmity(target) -- Call the next automaton to engage the target. + + return true -- Return true to set automatonCalled to 1. +end + +entity.onMobSpawn = function(mob) + mob:setMod(xi.mod.SILENCE_RES_RANK, 9) + mob:setMod(xi.mod.DARK_SLEEP_RES_RANK, 9) + mob:setMod(xi.mod.BIND_RES_RANK, 9) + --mob:setMod(xi.mod.GRAVITY_RES_RANK, 9) + local battlefield = mob:getBattlefield() + if not battlefield then + return + end + + local raceIndex = raceKey[battlefield:getLocalVar('initiatorRace')] + if raceIndex == 0 then + return + end + + local spawnPoint = spawnPoints[raceIndex][battlefield:getArea()] + mob:setSpawn(spawnPoint.x, spawnPoint.y, spawnPoint.z, spawnPoint.rot) + mob:setPos(spawnPoint.x, spawnPoint.y, spawnPoint.z) + + mob:setMobMod(xi.mobMod.NO_LINK, 1) + mob:setLocalVar('nextAutomatonCalled', 0) + + -- Elvaan + if raceIndex == 1 then + mob:setMobMod(xi.mobMod.BASE_DAMAGE_MULTIPLIER, 200) + mob:setMagicCastingEnabled(false) + mob:setMaxHP(3000) + mob:setHP(3050) + + -- Tarutaru + elseif raceIndex == 2 then + mob:setMod(xi.mod.UDMGPHYS, 10000) + mob:setMod(xi.mod.UDMGMAGIC, -9500) + mob:setMod(xi.mod.UDMGRANGE, -5000) + mob:setMod(xi.mod.MATT, 76) + mob:setMod(xi.mod.FASTCAST, 20) + mob:setMagicCastingEnabled(true) + mob:setMaxHP(2000) + mob:setHP(2050) + + -- Mithra + elseif raceIndex == 3 then + mob:setMod(xi.mod.UDMGRANGE, 10000) + mob:setMod(xi.mod.UDMGMAGIC, -9500) + mob:setMod(xi.mod.UDMGPHYS, -5000) + mob:setMod(xi.mod.EVA, 240) + mob:setMod(xi.mod.DOUBLE_ATTACK, 40) + mob:setMaxHP(2800) + mob:setHP(2850) + mob:setMagicCastingEnabled(false) + + -- Galka + elseif raceIndex == 4 then + mob:setMod(xi.mod.UDMGMAGIC, 10000) + mob:setMod(xi.mod.UDMGPHYS, -9500) + mob:setMod(xi.mod.UDMGRANGE, -5000) + mob:setMaxHP(3500) + mob:setHP(3550) + mob:setMagicCastingEnabled(false) + end +end + +entity.onMobFight = function(mob, target) + if mob:getHPP() >= 10 then + return + end + + if mob:getLocalVar('nextAutomatonCalled') == 1 then + return + end + + if callNextAutomaton(mob, target) then + mob:setLocalVar('nextAutomatonCalled', 1) + end +end + +entity.onMobMobskillChoose = function(mob, target, skillId) + local skills = + { + xi.mobSkill.HARD_SLASH_1, + xi.mobSkill.POWER_SLASH_1, + xi.mobSkill.FROSTBITE_1, + xi.mobSkill.FREEZEBITE_1, + xi.mobSkill.SHOCKWAVE_1, + xi.mobSkill.CRESCENT_MOON_1, + xi.mobSkill.SICKLE_MOON_1, + } + + return skills[math.random(1, #skills)] +end + +entity.onMobSpellChoose = function(mob, target, spellId) + local spellList = + { + xi.magic.spell.STONEGA_II, + xi.magic.spell.WATERGA_II, + xi.magic.spell.AEROGA_II, + xi.magic.spell.FIRAGA_II, + xi.magic.spell.BLIZZAGA_II, + xi.magic.spell.THUNDAGA_II, + } + + return spellList[math.random(#spellList)] +end + +entity.onMobDeath = function(mob, player, optParams) + if optParams.isKiller or optParams.noKiller then + if + mob:getLocalVar('nextAutomatonCalled') == 0 and + callNextAutomaton(mob, player) + then + mob:setLocalVar('nextAutomatonCalled', 1) + end + end +end + +return entity diff --git a/scripts/zones/Mine_Shaft_2716/mobs/Mithran_Automaton.lua b/scripts/zones/Mine_Shaft_2716/mobs/Mithran_Automaton.lua new file mode 100644 index 00000000000..b7d4bbefd78 --- /dev/null +++ b/scripts/zones/Mine_Shaft_2716/mobs/Mithran_Automaton.lua @@ -0,0 +1,114 @@ +----------------------------------- +-- Area: Mine Shaft 2716 +-- ENM : Automaton Assault +-- Mob: Mithran Automaton +----------------------------------- +---@type TMobEntity +local entity = {} +----------------------------------- +local orderIndex = 3 +----------------------------------- + +local raceKey = +{ + [xi.race.HUME_M ] = 0, + [xi.race.HUME_F ] = 0, + [xi.race.ELVAAN_M] = 1, + [xi.race.ELVAAN_F] = 1, + [xi.race.TARU_M ] = 2, + [xi.race.TARU_F ] = 2, + [xi.race.MITHRA ] = 3, + [xi.race.GALKA ] = 4, +} + +local function callNextAutomaton(mob, target, nextOrderIndex) + local battlefield = mob:getBattlefield() + if not battlefield then + return + end + + local replacedSlot = raceKey[battlefield:getLocalVar('initiatorRace')] or 0 + local nextAutomatonOffset = (nextOrderIndex % 4) + 1 -- Next slot in line, looping back to 1 after 4 using modulo (4 % 4 = 0 + 1 = 1) + + -- If an Automaton has been replaced and that Automaton is the next in line, call the Hume Automaton instead. + if + replacedSlot ~= 0 and + replacedSlot == nextAutomatonOffset + then + nextAutomatonOffset = 0 + end + + -- Base ID for the Hume Automaton in the current battlefield area. + local baseId = zones[xi.zone.MINE_SHAFT_2716].mob.HUME_AUTOMATON + (battlefield:getArea() - 1) * 6 + + -- Get the next automaton based on calculated offset. + local nextAutomaton = GetMobByID(baseId + nextAutomatonOffset) + if not nextAutomaton then + return false + end + + if not nextAutomaton:isAlive() then + return false + end + + nextAutomaton:updateEnmity(target) -- Call the next automaton to engage the target. + return true -- Return true to set automatonCalled to 1. +end + +entity.onMobSpawn = function(mob) + mob:setMod(xi.mod.SILENCE_RES_RANK, 9) + mob:setMod(xi.mod.DARK_SLEEP_RES_RANK, 9) + mob:setMod(xi.mod.BIND_RES_RANK, 9) + --mob:setMod(xi.mod.GRAVITY_RES_RANK, 9) + mob:setMod(xi.mod.UDMGRANGE, 10000) + mob:setMod(xi.mod.UDMGMAGIC, -9500) + mob:setMod(xi.mod.UDMGPHYS, -5000) + mob:setMod(xi.mod.EVA, 240) + mob:setMod(xi.mod.DOUBLE_ATTACK, 40) + mob:setMagicCastingEnabled(false) + + mob:setMobMod(xi.mobMod.NO_LINK, 1) + mob:setLocalVar('nextAutomatonCalled', 0) +end + +entity.onMobFight = function(mob, target) + if mob:getHPP() >= 10 then + return + end + + if mob:getLocalVar('nextAutomatonCalled') == 1 then + return + end + + if callNextAutomaton(mob, target, orderIndex) then + mob:setLocalVar('nextAutomatonCalled', 1) + end +end + +entity.onMobMobskillChoose = function(mob, target, skillId) + local skills = + { + xi.mobSkill.HARD_SLASH_1, + xi.mobSkill.POWER_SLASH_1, + xi.mobSkill.FROSTBITE_1, + xi.mobSkill.FREEZEBITE_1, + xi.mobSkill.SHOCKWAVE_1, + xi.mobSkill.CRESCENT_MOON_1, + xi.mobSkill.SICKLE_MOON_1, + } + + return skills[math.random(1, #skills)] +end + +entity.onMobDeath = function(mob, player, optParams) + if optParams.isKiller or optParams.noKiller then + if + mob:getLocalVar('nextAutomatonCalled') == 0 and + callNextAutomaton(mob, player, orderIndex) + then + mob:setLocalVar('nextAutomatonCalled', 1) + end + end +end + +return entity diff --git a/scripts/zones/Mine_Shaft_2716/mobs/Tarutaru_Automaton.lua b/scripts/zones/Mine_Shaft_2716/mobs/Tarutaru_Automaton.lua new file mode 100644 index 00000000000..310e1e4b001 --- /dev/null +++ b/scripts/zones/Mine_Shaft_2716/mobs/Tarutaru_Automaton.lua @@ -0,0 +1,127 @@ +----------------------------------- +-- Area: Mine Shaft 2716 +-- ENM : Automaton Assault +-- Mob: Tarutaru Automaton +----------------------------------- +---@type TMobEntity +local entity = {} +----------------------------------- +local orderIndex = 2 +----------------------------------- + +local raceKey = +{ + [xi.race.HUME_M ] = 0, + [xi.race.HUME_F ] = 0, + [xi.race.ELVAAN_M] = 1, + [xi.race.ELVAAN_F] = 1, + [xi.race.TARU_M ] = 2, + [xi.race.TARU_F ] = 2, + [xi.race.MITHRA ] = 3, + [xi.race.GALKA ] = 4, +} + +local function callNextAutomaton(mob, target, nextOrderIndex) + local battlefield = mob:getBattlefield() + if not battlefield then + return + end + + local replacedSlot = raceKey[battlefield:getLocalVar('initiatorRace')] or 0 + local nextAutomatonOffset = (nextOrderIndex % 4) + 1 -- Next slot in line, looping back to 1 after 4 using modulo (4 % 4 = 0 + 1 = 1) + + -- If an Automaton has been replaced and that Automaton is the next in line, call the Hume Automaton instead. + if + replacedSlot ~= 0 and + replacedSlot == nextAutomatonOffset + then + nextAutomatonOffset = 0 + end + + -- Base ID for the Hume Automaton in the current battlefield area. + local baseId = zones[xi.zone.MINE_SHAFT_2716].mob.HUME_AUTOMATON + (battlefield:getArea() - 1) * 6 + + -- Get the next automaton based on calculated offset. + local nextAutomaton = GetMobByID(baseId + nextAutomatonOffset) + if not nextAutomaton then + return false + end + + if not nextAutomaton:isAlive() then + return false + end + + nextAutomaton:updateEnmity(target) -- Call the next automaton to engage the target. + return true -- Return true to set automatonCalled to 1. +end + +entity.onMobSpawn = function(mob) + mob:setMod(xi.mod.SILENCE_RES_RANK, 9) + mob:setMod(xi.mod.DARK_SLEEP_RES_RANK, 9) + mob:setMod(xi.mod.BIND_RES_RANK, 9) + --mob:setMod(xi.mod.GRAVITY_RES_RANK, 9) + mob:setMod(xi.mod.UDMGPHYS, 10000) + mob:setMod(xi.mod.UDMGMAGIC, -9500) + mob:setMod(xi.mod.UDMGRANGE, -5000) + mob:setMod(xi.mod.MATT, 76) + + mob:setMobMod(xi.mobMod.NO_LINK, 1) + mob:setMobMod(xi.mobMod.NO_STANDBACK, 1) + mob:setLocalVar('nextAutomatonCalled', 0) +end + +entity.onMobFight = function(mob, target) + if mob:getHPP() >= 10 then + return + end + + if mob:getLocalVar('nextAutomatonCalled') == 1 then + return + end + + if callNextAutomaton(mob, target, orderIndex) then + mob:setLocalVar('nextAutomatonCalled', 1) + end +end + +entity.onMobMobskillChoose = function(mob, target, skillId) + local skills = + { + xi.mobSkill.HARD_SLASH_1, + xi.mobSkill.POWER_SLASH_1, + xi.mobSkill.FROSTBITE_1, + xi.mobSkill.FREEZEBITE_1, + xi.mobSkill.SHOCKWAVE_1, + xi.mobSkill.CRESCENT_MOON_1, + xi.mobSkill.SICKLE_MOON_1, + } + + return skills[math.random(1, #skills)] +end + +entity.onMobSpellChoose = function(mob, target, spellId) + local spellList = + { + xi.magic.spell.FREEZE, + xi.magic.spell.TORNADO, + xi.magic.spell.QUAKE, + xi.magic.spell.BURST, + xi.magic.spell.FLOOD, + xi.magic.spell.FLARE, + } + + return spellList[math.random(#spellList)] +end + +entity.onMobDeath = function(mob, player, optParams) + if optParams.isKiller or optParams.noKiller then + if + mob:getLocalVar('nextAutomatonCalled') == 0 and + callNextAutomaton(mob, player, orderIndex) + then + mob:setLocalVar('nextAutomatonCalled', 1) + end + end +end + +return entity diff --git a/sql/mob_groups.sql b/sql/mob_groups.sql index 44b8081b2b8..8513d05f4d4 100644 --- a/sql/mob_groups.sql +++ b/sql/mob_groups.sql @@ -561,11 +561,11 @@ INSERT INTO `mob_groups` VALUES (12,1299,13,'Fantoccini_Monster',0,128,0,0,0,0,N INSERT INTO `mob_groups` VALUES (13,1300,13,'Fantoccini_Wyvern',0,128,0,0,0,0,NULL); INSERT INTO `mob_groups` VALUES (14,1298,13,'Fantoccini_Avatar',0,128,0,0,0,0,NULL); INSERT INTO `mob_groups` VALUES (15,1297,13,'Fantoccini_Automaton',0,128,0,0,0,0,NULL); -INSERT INTO `mob_groups` VALUES (16,2006,13,'Hume_Automaton',0,128,0,0,0,0,NULL); -INSERT INTO `mob_groups` VALUES (17,1206,13,'Elvaan_Automaton',0,128,0,0,0,0,NULL); -INSERT INTO `mob_groups` VALUES (18,3850,13,'Tarutaru_Automaton',0,128,0,0,0,0,NULL); -INSERT INTO `mob_groups` VALUES (19,2680,13,'Mithran_Automaton',0,128,0,0,0,0,NULL); -INSERT INTO `mob_groups` VALUES (20,1452,13,'Galkan_Automaton',0,128,0,0,0,0,NULL); +INSERT INTO `mob_groups` VALUES (16,2006,13,'Hume_Automaton',0,128,0,3000,3000,0,NULL); +INSERT INTO `mob_groups` VALUES (17,1206,13,'Elvaan_Automaton',0,128,0,3000,3000,0,NULL); +INSERT INTO `mob_groups` VALUES (18,3850,13,'Tarutaru_Automaton',0,128,0,2000,2000,0,NULL); +INSERT INTO `mob_groups` VALUES (19,2680,13,'Mithran_Automaton',0,128,0,2900,2900,0,NULL); +INSERT INTO `mob_groups` VALUES (20,1452,13,'Galkan_Automaton',0,128,0,3600,3600,0,NULL); INSERT INTO `mob_groups` VALUES (21,0,13,'Buggesy',0,128,0,0,0,0,NULL); INSERT INTO `mob_groups` VALUES (22,0,13,'Bugafrod',0,128,0,0,0,0,NULL); INSERT INTO `mob_groups` VALUES (23,0,13,'Viovek',0,128,0,0,0,0,NULL); diff --git a/sql/mob_pools.sql b/sql/mob_pools.sql index 808e99232a9..d76c916e14c 100644 --- a/sql/mob_pools.sql +++ b/sql/mob_pools.sql @@ -1261,7 +1261,7 @@ INSERT INTO `mob_pools` VALUES (1202,'Else','Else',149,0x01000402DE10DA20DA30DA4 INSERT INTO `mob_pools` VALUES (1203,'Elusive_Edwin','Elusive_Edwin',113,0x0000C00100000000000000000000000000000000,1,1,6,240,100,0,0,0,1,2,0,32,0,1179,0,0,0,0,0,21,113,1,15); INSERT INTO `mob_pools` VALUES (1204,'Elvaanlopper_Grokdok','Elvaanlopper_Grokdok',189,0x0000170400000000000000000000000000000000,12,12,2,240,100,0,1,0,1,2,0,32,0,159,0,0,0,0,0,334,334,3,20); INSERT INTO `mob_pools` VALUES (1205,'Elvaansticker_Bxafraff','Elvaansticker_Bxafraff',189,0x0000180400000000000000000000000000000000,14,14,8,240,100,0,1,0,1,2,0,32,0,1183,0,0,0,0,0,334,334,3,20); -INSERT INTO `mob_pools` VALUES (1206,'Elvaan_Automaton','Elvaan_Automaton',145,0x0500D50400000000000000000000000000000000,7,7,4,240,100,0,0,0,0,18,0,0,6345,1155,0,0,4,0,0,145,145,NULL,NULL); +INSERT INTO `mob_pools` VALUES (1206,'Elvaan_Automaton','Elvaan_Automaton',145,0x0500D50400000000000000000000000000000000,7,7,4,280,100,0,0,0,1,0,0,0,6345,1155,0,0,1,0,0,2,145,1,20); INSERT INTO `mob_pools` VALUES (1207,'Emerald_Quadav','Emerald_Quadav',202,0x00009B0200000000000000000000000000000000,5,5,4,265,100,0,1,0,1,0,0,0,659,1155,0,0,3,0,0,202,202,1,15); INSERT INTO `mob_pools` VALUES (1208,'Emergent_Elm','Emergent_Elm',245,0x0000870100000000000000000000000000000000,1,1,7,270,100,0,1,0,1,2,0,0,0,1157,0,0,0,0,0,245,245,2,43); INSERT INTO `mob_pools` VALUES (1209,'Empathic_Flan','Empathic_Flan',112,0x0000070700000000000000000000000000000000,4,4,12,240,100,0,1,0,0,2,0,0,0,0,0,0,2,0,0,112,112,NULL,NULL); @@ -1507,7 +1507,7 @@ INSERT INTO `mob_pools` VALUES (1448,'Gakke','Gakke',165,0x0000BE060000000000000 INSERT INTO `mob_pools` VALUES (1449,'Galarhigg','Galarhigg',87,0x0000A40100000000000000000000000000000000,1,1,6,240,100,0,1,0,0,18,6150,32,1516,131,0,0,0,0,0,1156,87,2,39); INSERT INTO `mob_pools` VALUES (1450,'Gale_Bats','Gale_Bats',47,0x0000040100000000000000000000000000000000,1,1,11,240,100,0,0,0,0,0,0,64,1027,643,8,0,0,0,0,47,47,1,16); INSERT INTO `mob_pools` VALUES (1451,'Galgalim','Galgalim',139,0x0000800100000000000000000000000000000000,4,4,12,280,100,0,1,0,1,16,0,0,1961,135,0,0,10,0,0,139,139,NULL,NULL); -INSERT INTO `mob_pools` VALUES (1452,'Galkan_Automaton','Galkan_Automaton',146,0x0500E50400000000000000000000000000000000,7,7,4,240,100,0,0,0,1,16,0,0,2397,131,0,0,4,0,0,146,146,NULL,NULL); +INSERT INTO `mob_pools` VALUES (1452,'Galkan_Automaton','Galkan_Automaton',146,0x0500E50400000000000000000000000000000000,7,7,4,280,100,0,0,0,1,0,0,0,2397,131,0,0,4,0,0,2,146,1,20); INSERT INTO `mob_pools` VALUES (1453,'Galkarider_Retzpratz','Galkarider_Retzpratz',189,0x0000160400000000000000000000000000000000,11,11,9,240,100,0,1,0,1,2,0,32,46,159,0,0,0,0,0,334,334,3,20); INSERT INTO `mob_pools` VALUES (1454,'Gallinipper_AC','Gallinipper_AC',113,0x0000C00100000000000000000000000000000000,1,1,8,240,100,0,1,0,1,0,0,0,645,131,8,0,0,0,0,113,113,1,15); INSERT INTO `mob_pools` VALUES (1455,'Gamayun','Gamayun',37,0x00001C0300000000000000000000000000000000,1,1,6,240,100,0,0,0,0,2,0,0,0,0,0,0,0,0,0,37,324,NULL,NULL); @@ -2061,7 +2061,7 @@ INSERT INTO `mob_pools` VALUES (2002,'Huge_Spider','Huge_Spider',235,0x000036010 INSERT INTO `mob_pools` VALUES (2003,'Huge_Wasp','Huge_Wasp',48,0x0000100100000000000000000000000000000000,1,1,2,240,100,0,0,0,0,0,0,0,502,643,8,0,0,0,0,48,48,1,10); INSERT INTO `mob_pools` VALUES (2004,'Huginn','Huginn',55,0x0000BC0100000000000000000000000000000000,1,1,5,240,100,0,0,1,1,2,0,0,0,3,0,0,0,0,0,0,55,1,20); INSERT INTO `mob_pools` VALUES (2005,'Humegutter_Adzjbadj','Humegutter_Adzjbadj',189,0x0000170400000000000000000000000000000000,1,1,2,240,100,0,1,0,1,2,0,32,0,159,0,0,0,0,0,334,334,3,20); -INSERT INTO `mob_pools` VALUES (2006,'Hume_Automaton','Hume_Automaton',149,0x0500D40400000000000000000000000000000000,7,7,4,240,100,0,0,0,0,18,0,0,1749,1027,0,0,4,0,0,149,149,NULL,NULL); +INSERT INTO `mob_pools` VALUES (2006,'Hume_Automaton','Hume_Automaton',149,0x0500D40400000000000000000000000000000000,7,7,4,280,100,0,0,0,0,18,0,0,1749,1027,0,0,4,0,0,2,149,1,17); INSERT INTO `mob_pools` VALUES (2007,'Humnox_Drumbelly','Humnox_Drumbelly',373,0x0000410400000000000000000000000000000000,10,10,2,240,100,0,1,0,1,2,0,32,0,159,0,0,6,0,0,373,373,3,20); INSERT INTO `mob_pools` VALUES (2008,'Hundredfaced_Hapool_Ja','Hundredfaced_Hapool_Ja',176,0x0600530600000000000000000000000000000000,13,13,10,280,100,0,1,1,1,2,0,32,0,159,4,0,7,0,0,176,176,3,12); INSERT INTO `mob_pools` VALUES (2009,'Hundredscar_Hajwaj','Hundredscar_Hajwaj',189,0x0000FB0300000000000000000000000000000000,1,1,5,240,100,0,1,0,1,2,0,32,0,155,0,0,0,0,0,334,334,1,15); @@ -2735,7 +2735,7 @@ INSERT INTO `mob_pools` VALUES (2676,'Mint_Custard','Mint_Custard',112,0x0000080 INSERT INTO `mob_pools` VALUES (2677,'Mischievous_Micholas','Mischievous_Micholas',188,0x0000A00100000000000000000000000000000000,1,1,7,200,100,0,0,0,1,2,0,32,0,157,0,0,0,0,0,188,188,2,21); INSERT INTO `mob_pools` VALUES (2678,'Miser_Murphy','Miser_Murphy',121,0x0000700100000000000000000000000000000000,5,4,12,200,100,0,1,0,0,2,0,32,350,157,0,0,28,0,0,121,121,2,9); INSERT INTO `mob_pools` VALUES (2679,'Mist_Lizard','Mist_Lizard',174,0x0000480100000000000000000000000000000000,1,1,7,240,100,0,0,0,1,0,0,0,980,131,0,0,0,0,0,174,174,1,16); -INSERT INTO `mob_pools` VALUES (2680,'Mithran_Automaton','Mithran_Automaton',152,0x0500E40400000000000000000000000000000000,7,7,4,240,100,0,0,0,1,16,0,0,6476,515,0,0,4,0,0,152,152,NULL,NULL); +INSERT INTO `mob_pools` VALUES (2680,'Mithran_Automaton','Mithran_Automaton',152,0x0500E40400000000000000000000000000000000,7,7,4,280,100,0,0,0,1,16,0,0,6476,515,0,0,4,0,0,2,151,1,17); INSERT INTO `mob_pools` VALUES (2681,'Mithraslaver_Debhabob','Mithraslaver_Debhabob',189,0x0000170400000000000000000000000000000000,9,9,2,240,100,0,1,0,1,2,0,32,707,159,0,0,0,0,0,334,334,3,20); INSERT INTO `mob_pools` VALUES (2682,'Mighrah','Mighrah',122,0x0600890400000000000000000000000000000000,1,1,6,240,100,0,1,1,0,2,0,0,0,0,0,0,0,0,0,122,122,NULL,NULL); INSERT INTO `mob_pools` VALUES (2683,'MiRhe_Whisperblade','MiRhe_Whisperblade',202,0x00001C0400000000000000000000000000000000,13,13,6,265,100,0,1,0,1,2,0,32,0,159,0,0,7,0,0,202,337,NULL,NULL); @@ -3906,7 +3906,7 @@ INSERT INTO `mob_pools` VALUES (3846,'Tartalo','Tartalo',4,0x0000080100000000000 INSERT INTO `mob_pools` VALUES (3847,'Tartaruga_Gigante','Tartaruga_Gigante',2,0x0000910100000000000000000000000000000000,4,3,7,380,100,0,1,1,0,18,0,0,0,3,0,0,77,0,0,2,2,1,32); INSERT INTO `mob_pools` VALUES (3848,'Tartarus_Eft','Tartarus_Eft',98,0x0000450500000000000000000000000000000000,1,1,8,210,100,0,0,0,1,0,0,0,442,133,0,0,0,0,0,98,98,2,13); INSERT INTO `mob_pools` VALUES (3849,'Taruroaster_Biggsjig','Taruroaster_Biggsjig',189,0x0000190400000000000000000000000000000000,4,4,5,240,100,0,1,0,1,2,0,32,7,159,0,0,2,0,0,334,334,3,20); -INSERT INTO `mob_pools` VALUES (3850,'Tarutaru_Automaton','Tarutaru_Automaton',154,0x0500D60400000000000000000000000000000000,7,7,4,240,100,0,0,0,1,16,0,0,905,3,0,0,4,0,0,154,154,NULL,NULL); +INSERT INTO `mob_pools` VALUES (3850,'Tarutaru_Automaton','Tarutaru_Automaton',154,0x0500D60400000000000000000000000000000000,4,5,4,280,100,0,0,0,1,16,0,0,905,3,0,0,4,0,0,2,153,1,15); INSERT INTO `mob_pools` VALUES (3851,'Tatzlwurm','Tatzlwurm',266,0x00008E0100000000000000000000000000000000,1,1,7,240,100,0,1,0,1,16,0,0,7,133,0,0,0,0,0,266,266,2,36); INSERT INTO `mob_pools` VALUES (3852,'Taurus','Taurus',240,0x00004F0500000000000000000000000000000000,2,1,1,390,100,0,1,1,1,0,0,0,284,131,0,0,0,0,0,240,240,1,12); INSERT INTO `mob_pools` VALUES (3853,'Tavnazian_Ram','Tavnazian_Ram',208,0x0000580100000000000000000000000000000000,1,1,7,320,100,0,1,0,1,0,0,0,608,133,0,0,0,0,0,208,208,2,48); diff --git a/sql/mob_skills.sql b/sql/mob_skills.sql index be525317e30..86cbcfbc81b 100644 --- a/sql/mob_skills.sql +++ b/sql/mob_skills.sql @@ -87,13 +87,13 @@ INSERT INTO `mob_skills` VALUES (42,11,'savage_blade',0,0.0,7.0,2000,0,4,0,0,0,9 -- INSERT INTO `mob_skills` VALUES (45,??,'atonement' -- INSERT INTO `mob_skills` VALUES (46,??,'expiacion' -- INSERT INTO `mob_skills` VALUES (47,??,'sanguine_blade' --- INSERT INTO `mob_skills` VALUES (48,??,'hard_slash' -INSERT INTO `mob_skills` VALUES (49,107,'power_slash',0,0.0,10.0,2000,500,4,0,0,0,1,0,0); --- INSERT INTO `mob_skills` VALUES (50,??,'frostbite' --- INSERT INTO `mob_skills` VALUES (51,??,'freezebite' --- INSERT INTO `mob_skills` VALUES (52,??,'shockwave' --- INSERT INTO `mob_skills` VALUES (53,??,'crescent_moon' -INSERT INTO `mob_skills` VALUES (54,112,'sickle_moon',0,0.0,10.0,2000,500,4,0,0,0,4,8,0); +INSERT INTO `mob_skills` VALUES (48,106,'hard_slash',0,0.0,10.0,2000,0,4,0,0,0,4,0,0); +INSERT INTO `mob_skills` VALUES (49,107,'power_slash',0,0.0,10.0,2000,0,4,0,0,0,4,0,0); +INSERT INTO `mob_skills` VALUES (50,108,'frostbite',0,0.0,10.0,2000,0,4,0,0,0,7,0,0); +INSERT INTO `mob_skills` VALUES (51,109,'freezebite',0,0.0,10.0,2000,0,4,0,0,0,7,6,0); +INSERT INTO `mob_skills` VALUES (52,110,'shockwave',1,0.0,10.0,2000,0,4,0,0,0,5,0,0); +INSERT INTO `mob_skills` VALUES (53,111,'crescent_moon',0,0.0,10.0,2000,0,4,0,0,0,4,0,0); +INSERT INTO `mob_skills` VALUES (54,112,'sickle_moon',0,0.0,10.0,2000,0,4,0,0,0,4,8,0); -- INSERT INTO `mob_skills` VALUES (55,??,'spinning_slash' INSERT INTO `mob_skills` VALUES (56,114,'ground_strike',0,0.0,10.0,2000,500,4,0,0,0,12,10,0); -- INSERT INTO `mob_skills` VALUES (57,??,'scourge' diff --git a/sql/mob_spawn_points.sql b/sql/mob_spawn_points.sql index 5c264364d01..651f74bf99f 100644 --- a/sql/mob_spawn_points.sql +++ b/sql/mob_spawn_points.sql @@ -2770,21 +2770,21 @@ INSERT INTO `mob_spawn_points` VALUES (16830526,0,'Fantoccini_Avatar','Fantoccin INSERT INTO `mob_spawn_points` VALUES (16830527,0,'Fantoccini_Automaton','Fantoccini Automaton',15,49,49,501.054,-118.864,5.299,63); -- Automaton Assault -INSERT INTO `mob_spawn_points` VALUES (16830529,0,'Hume_Automaton','Hume Automaton',16,60,60,-462.139,119.625,-91.037,96); -INSERT INTO `mob_spawn_points` VALUES (16830530,0,'Elvaan_Automaton','Elvaan Automaton',17,60,60,-469.964,119.625,-99.018,239); -INSERT INTO `mob_spawn_points` VALUES (16830531,0,'Tarutaru_Automaton','Tarutaru Automaton',18,60,60,-460.115,119.625,-66.674,61); -INSERT INTO `mob_spawn_points` VALUES (16830532,0,'Mithran_Automaton','Mithran Automaton',19,60,60,-459.948,119.525,-70.782,191); -INSERT INTO `mob_spawn_points` VALUES (16830533,0,'Galkan_Automaton','Galkan Automaton',20,60,60,-459.356,119.829,1.849,54); -INSERT INTO `mob_spawn_points` VALUES (16830535,0,'Hume_Automaton','Hume Automaton',16,60,60,17.843,-0.375,-91.100,96); -INSERT INTO `mob_spawn_points` VALUES (16830536,0,'Elvaan_Automaton','Elvaan Automaton',17,60,60,10.018,-0.375,-99.081,239); -INSERT INTO `mob_spawn_points` VALUES (16830537,0,'Tarutaru_Automaton','Tarutaru Automaton',18,60,60,19.867,-0.375,-66.737,61); -INSERT INTO `mob_spawn_points` VALUES (16830538,0,'Mithran_Automaton','Mithran Automaton',19,60,60,20.034,-0.475,-70.845,191); -INSERT INTO `mob_spawn_points` VALUES (16830539,0,'Galkan_Automaton','Galkan Automaton',20,60,60,20.626,-0.171,1.786,54); -INSERT INTO `mob_spawn_points` VALUES (16830541,0,'Hume_Automaton','Hume Automaton',16,60,60,497.812,-120.375,-91.096,96); -INSERT INTO `mob_spawn_points` VALUES (16830542,0,'Elvaan_Automaton','Elvaan Automaton',17,60,60,489.987,-120.375,-99.077,239); -INSERT INTO `mob_spawn_points` VALUES (16830543,0,'Tarutaru_Automaton','Tarutaru Automaton',18,60,60,499.836,-120.375,-66.733,61); -INSERT INTO `mob_spawn_points` VALUES (16830544,0,'Mithran_Automaton','Mithran Automaton',19,60,60,500.003,-120.475,-70.841,191); -INSERT INTO `mob_spawn_points` VALUES (16830545,0,'Galkan_Automaton','Galkan Automaton',20,60,60,500.595,-120.171,1.790,54); +INSERT INTO `mob_spawn_points` VALUES (16830529,0,'Hume_Automaton','Hume Automaton',16,62,62,-466,121.704,26,64); +INSERT INTO `mob_spawn_points` VALUES (16830530,0,'Elvaan_Automaton','Elvaan Automaton',17,62,62,-466,121.704,26,64); +INSERT INTO `mob_spawn_points` VALUES (16830531,0,'Tarutaru_Automaton','Tarutaru Automaton',18,62,62,-462,121.637,26,64); +INSERT INTO `mob_spawn_points` VALUES (16830532,0,'Mithran_Automaton','Mithran Automaton',19,62,62,-458,121.637,26,64); +INSERT INTO `mob_spawn_points` VALUES (16830533,0,'Galkan_Automaton','Galkan Automaton',20,62,62,-454,121.704,26,64); +INSERT INTO `mob_spawn_points` VALUES (16830535,0,'Hume_Automaton','Hume Automaton',16,62,62,14.138,1.704,22.883,64); +INSERT INTO `mob_spawn_points` VALUES (16830536,0,'Elvaan_Automaton','Elvaan Automaton',17,62,62,14.138,1.704,22.883,64); +INSERT INTO `mob_spawn_points` VALUES (16830537,0,'Tarutaru_Automaton','Tarutaru Automaton',18,62,62,18.138,1.637,22.883,64); +INSERT INTO `mob_spawn_points` VALUES (16830538,0,'Mithran_Automaton','Mithran Automaton',19,62,62,22.138,1.637,22.883,64); +INSERT INTO `mob_spawn_points` VALUES (16830539,0,'Galkan_Automaton','Galkan Automaton',20,62,62,26.138,1.704,22.883,64); +INSERT INTO `mob_spawn_points` VALUES (16830541,0,'Hume_Automaton','Hume Automaton',16,62,62,494.362,-118.296,22.365,64); +INSERT INTO `mob_spawn_points` VALUES (16830542,0,'Elvaan_Automaton','Elvaan Automaton',17,62,62,494.362,-118.296,22.365,64); +INSERT INTO `mob_spawn_points` VALUES (16830543,0,'Tarutaru_Automaton','Tarutaru Automaton',18,62,62,498.362,-118.363,22.365,64); +INSERT INTO `mob_spawn_points` VALUES (16830544,0,'Mithran_Automaton','Mithran Automaton',19,62,62,502.362,-118.363,22.365,64); +INSERT INTO `mob_spawn_points` VALUES (16830545,0,'Galkan_Automaton','Galkan Automaton',20,62,62,506.362,-118.296,22.365,64); -- The Mobline Comedy INSERT INTO `mob_spawn_points` VALUES (16830546,0,'Buggesy','Buggesy',21,0,0,0.000,0.000,0.000,0);