Skip to content

Commit

Permalink
feat: crusher and amber crusher actions (#3033)
Browse files Browse the repository at this point in the history
Adds the Crusher and Amber Crusher item actions.
  • Loading branch information
phacUFPE authored Oct 31, 2024
1 parent 135866a commit 00b7509
Show file tree
Hide file tree
Showing 4 changed files with 90 additions and 0 deletions.
16 changes: 16 additions & 0 deletions data-otservbr-global/lib/others/fragment_gems.lua
Original file line number Diff line number Diff line change
@@ -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
1 change: 1 addition & 0 deletions data-otservbr-global/lib/others/load.lua
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
dofile(DATA_DIRECTORY .. "/lib/others/dawnport.lua")
dofile(DATA_DIRECTORY .. "/lib/others/fragment_gems.lua")
31 changes: 31 additions & 0 deletions data-otservbr-global/scripts/actions/tools/amber_crusher.lua
Original file line number Diff line number Diff line change
@@ -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()
42 changes: 42 additions & 0 deletions data-otservbr-global/scripts/actions/tools/crusher.lua
Original file line number Diff line number Diff line change
@@ -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()

0 comments on commit 00b7509

Please sign in to comment.