From 00b75095cc250873b16533234fddffe2ff9b6a8a Mon Sep 17 00:00:00 2001 From: Pedro Cruz Date: Wed, 30 Oct 2024 22:34:53 -0300 Subject: [PATCH] feat: crusher and amber crusher actions (#3033) Adds the Crusher and Amber Crusher item actions. --- .../lib/others/fragment_gems.lua | 16 +++++++ data-otservbr-global/lib/others/load.lua | 1 + .../scripts/actions/tools/amber_crusher.lua | 31 ++++++++++++++ .../scripts/actions/tools/crusher.lua | 42 +++++++++++++++++++ 4 files changed, 90 insertions(+) create mode 100644 data-otservbr-global/lib/others/fragment_gems.lua create mode 100644 data-otservbr-global/scripts/actions/tools/amber_crusher.lua create mode 100644 data-otservbr-global/scripts/actions/tools/crusher.lua diff --git a/data-otservbr-global/lib/others/fragment_gems.lua b/data-otservbr-global/lib/others/fragment_gems.lua new file mode 100644 index 00000000000..cb82b9e951e --- /dev/null +++ b/data-otservbr-global/lib/others/fragment_gems.lua @@ -0,0 +1,16 @@ +MAX_GEM_BREAK = 10 + +FRAGMENT_GEMS = { + small = { ids = { 44602, 44605, 44608, 44611 }, fragment = 46625, range = { 1, 4 } }, + medium = { ids = { 44603, 44606, 44609, 44612 }, fragment = 46625, range = { 2, 8 } }, + great = { ids = { 44604, 44607, 44610, 44613 }, fragment = 46626, range = { 1, 4 } }, +} + +function getGemData(id) + for _, gem in pairs(FRAGMENT_GEMS) do + if table.contains(gem.ids, id) then + return gem.fragment, gem.range + end + end + return nil +end diff --git a/data-otservbr-global/lib/others/load.lua b/data-otservbr-global/lib/others/load.lua index 031c8fb2026..3d7da57cc77 100644 --- a/data-otservbr-global/lib/others/load.lua +++ b/data-otservbr-global/lib/others/load.lua @@ -1 +1,2 @@ dofile(DATA_DIRECTORY .. "/lib/others/dawnport.lua") +dofile(DATA_DIRECTORY .. "/lib/others/fragment_gems.lua") diff --git a/data-otservbr-global/scripts/actions/tools/amber_crusher.lua b/data-otservbr-global/scripts/actions/tools/amber_crusher.lua new file mode 100644 index 00000000000..d9c3edc4ce8 --- /dev/null +++ b/data-otservbr-global/scripts/actions/tools/amber_crusher.lua @@ -0,0 +1,31 @@ +local amberCrusher = Action() + +function amberCrusher.onUse(player, item, fromPosition, target, toPosition, isHotkey) + if not target or not target:isItem() or target:getId() == item:getId() or player:getItemCount(target:getId()) <= 0 then + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You can only use the crusher on a valid gem in your inventory.") + return false + end + + local fragmentType, fragmentRange = getGemData(target:getId()) + if not fragmentType then + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "This item can't be broken into fragments.") + return false + end + + if target:getCount() >= MAX_GEM_BREAK then + target:remove(MAX_GEM_BREAK) + for i = 1, MAX_GEM_BREAK, 1 do + player:addItem(fragmentType, math.random(fragmentRange[1], fragmentRange[2])) + end + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You have broken the gems into fragments.") + else + target:remove(1) + player:addItem(fragmentType, math.random(fragmentRange[1], fragmentRange[2])) + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You have broken the gem into fragments.") + end + + return true +end + +amberCrusher:id(46628) +amberCrusher:register() diff --git a/data-otservbr-global/scripts/actions/tools/crusher.lua b/data-otservbr-global/scripts/actions/tools/crusher.lua new file mode 100644 index 00000000000..8daa9f2771b --- /dev/null +++ b/data-otservbr-global/scripts/actions/tools/crusher.lua @@ -0,0 +1,42 @@ +local crusher = Action() + +function crusher.onUse(player, item, fromPosition, target, toPosition, isHotkey) + if not target or not target:isItem() or target:getId() == item:getId() or player:getItemCount(target:getId()) <= 0 then + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You can only use the crusher on a valid gem in your inventory.") + return false + end + + local fragmentType, fragmentRange = getGemData(target:getId()) + if not fragmentType then + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "This item can't be broken into fragments.") + return false + end + + local crusherCharges = item:getAttribute(ITEM_ATTRIBUTE_CHARGES) + if not crusherCharges or crusherCharges <= 0 then + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Your crusher has no more charges.") + return false + end + + target:remove(1) + + player:addItem(fragmentType, math.random(fragmentRange[1], fragmentRange[2])) + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You have broken the gem into fragments.") + + crusherCharges = crusherCharges - 1 + if crusherCharges > 0 then + local container = item:getParent() + item:setAttribute(ITEM_ATTRIBUTE_CHARGES, crusherCharges) + if container:isContainer() then + player:sendUpdateContainer(container) + end + else + item:remove() + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Your crusher has been consumed.") + end + + return true +end + +crusher:id(46627) +crusher:register()