Developer

2 min readUpdated Jun 10, 2026

Overview

ML Recycler provides server-side event hooks for reacting to recycler actions and handler hooks in the open/ folder for custom logic. Integration is primarily event-driven. Listen to the hook events from your other scripts.

Server Event Hooks

The recycler fires named events at key points. Register handlers in any server script:

Processing

your_script/server.lua
1AddEventHandler('ml_recycler:hook:itemAdded', function(source, data)
2    -- data: recyclerId, recyclerType, recyclerTier, slotIndex, itemName, itemCount, status
3end)
4
5AddEventHandler('ml_recycler:hook:processingComplete', function(data)
6    -- data: recyclerId, recyclerType, recyclerTier, slotIndex, itemName, itemCount, owner
7end)
8
9AddEventHandler('ml_recycler:hook:lootCollected', function(source, data)
10    -- data: recyclerId, recyclerType, slotIndex, loot (array of {item, count})
11end)

Maintenance

your_script/server.lua
1AddEventHandler('ml_recycler:hook:refueled', function(source, data)
2    -- data: recyclerId, recyclerType, fuelItem, quantity, newFuel
3end)
4
5AddEventHandler('ml_recycler:hook:repaired', function(source, data)
6    -- data: recyclerId, recyclerType, repairItem, quantity, newDurability
7end)
8
9AddEventHandler('ml_recycler:hook:malfunction', function(source, data)
10    -- data: recyclerId, recyclerType, durability
11end)

Upgrades

your_script/server.lua
1AddEventHandler('ml_recycler:hook:upgradeInstalled', function(source, data)
2    -- data: recyclerId, recyclerType, upgradeKey, upgrades (array)
3end)
4
5AddEventHandler('ml_recycler:hook:upgradeRemoved', function(source, data)
6    -- data: recyclerId, recyclerType, upgradeKey, upgrades (array)
7end)
8AddEventHandler('ml_recycler:hook:upgradeBroken', function(data)
9    -- data: recyclerId, recyclerType, upgradeKey  (no source; fires from the server loop when a worn upgrade hits zero)
10end)

Placement

your_script/server.lua
1AddEventHandler('ml_recycler:hook:recyclerPlaced', function(source, data)
2    -- data: recyclerId, recyclerType, coords, heading
3end)
4
5AddEventHandler('ml_recycler:hook:recyclerPickedUp', function(source, data)
6    -- data: recyclerId, recyclerType
7end)

Server Handlers

Located in open/server.lua.

open/server.lua
1function OpenServer.BeforeGiveItem(src, item, amount)
2    return true -- return false to block
3end
4
5function OpenServer.OnActionComplete(src, actionType, data)
6end
  • BeforeGiveItem: Called before giving loot items to the player. Return false to block.
  • OnActionComplete: Fires after any completed action.

Shared Handlers

Located in open/shared.lua.

open/shared.lua
1function OpenHandlers.OnPlayerAction(src, data)
2    return true -- return false to block
3end
4
5function OpenHandlers.ValidateAction(src, actionType)
6    return true -- return false to block
7end

Client Handlers

Located in open/client.lua.

open/client.lua
1function OpenClient.BeforeOpenUI(data)
2    return true -- return false to block UI
3end

Examples

your_script/server.lua
1AddEventHandler('ml_recycler:hook:lootCollected', function(source, data)
2    exports.ml_skills:AddXp(source, 'crafting', 15)
3end)
your_script/server.lua
1AddEventHandler('ml_recycler:hook:lootCollected', function(source, data)
2    for _, loot in ipairs(data.loot) do
3        if loot.rarity == 'legendary' then
4            Bridge.Log({
5                webhook = 'YOUR_WEBHOOK',
6                title = 'Legendary Drop!',
7                description = loot.item .. ' x' .. loot.count,
8                player = source,
9            })
10        end
11    end
12end)
open/shared.lua
1function OpenHandlers.ValidateAction(src, actionType)
2    if actionType == 'place' then
3        -- Add your zone check logic
4    end
5    return true
6end