Cuberite Forum

Full Version: How do I add crafting and furnace recipes?
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Hey,
I'm checking out Cuberite for a custom server I want to start. I'm a Java plugin developer for Spigot, so this is quite a change. I'm looking for a way to add and remove furnace and crafting recipes. I couldn't find it in the docs and the information on the forums is very fragmented and confusing.

Thanks for your help!
Hello and welcome to the Forum Smile

Cuberite has every furnace-, crafting- and brewing-recipe inside it's own text file. There is a crafting.txt, a furnace.txt as well as a brewing.txt in the 'Server' directory of the git repo. I think can tell you more about the documentation.
We should probably have a section in the book for explaining the recipe file format.
We do have documentation about the crafting.txt file. It's at the top of the file itself: https://github.com/cuberite/cuberite/blo...txt#L1-L34 If you want to use this method then you might like to take a look at my CraftMaker plugin. It's a plugin that allows people to create their own recipes by simply drawing them in a 3x3 grid.

If you want to remove a recipe as a plugin you'll have to use the OnPreCrafting hook. If you want to modify a recipe you'll have you have to use the OnPostCrafting hook. In case you want to add new recipes you'll have to use OnCraftingNoRecipe
Code:
PLUGIN = nil

--VARIABLES
recipes = {}

--PLUGIN
function Initialize(Plugin)
    Plugin:SetName("SmpMc")
    Plugin:SetVersion(1)

    -- Hooks
    -- cPluginManager.AddHook(cPluginManager.<hook>, <function>)
    cPluginManager.AddHook(cPluginManager.HOOK_CRAFTING_NO_RECIPE, OnCraftingNoRecipe)
    cPluginManager:AddHook(cPluginManager.HOOK_POST_CRAFTING, OnPostCrafting);

    PLUGIN = Plugin

    -- Command Bindings
    -- cPluginManager.BindCommand("/<command>", "<permission>", <function>, "<desc>")

    --Recipes
    table.insert(recipes, {{265, 264, 265, 265, -1, 265, 265, 265, 265}, makeItem(61, "§rEnhanced Furnace")})

    LOG("Initialised " .. Plugin:GetName() .. " v." .. Plugin:GetVersion())
    return true
end

function OnDisable()
    LOG(PLUGIN:GetName() .. " is shutting down...")
end

--HOOKS
function OnCraftingNoRecipe(Player, Grid, Recipe)
    r = getRecipe(Grid)
    if r == nil then return end
    Recipe:SetResult(r)
    return true
end

function OnPostCrafting(Player, Grid, Recipe)
    if getRecipe(Grid) ~= nil then Recipe:ConsumeIngredients(Grid) end
end

--UTIL
function getRecipe(Grid)
    items = {}
    table.insert(items, Grid:GetItem(0, 0).m_ItemType)
    table.insert(items, Grid:GetItem(1, 0).m_ItemType)
    table.insert(items, Grid:GetItem(2, 0).m_ItemType)
    table.insert(items, Grid:GetItem(0, 1).m_ItemType)
    table.insert(items, Grid:GetItem(1, 1).m_ItemType)
    table.insert(items, Grid:GetItem(2, 1).m_ItemType)
    table.insert(items, Grid:GetItem(0, 2).m_ItemType)
    table.insert(items, Grid:GetItem(1, 2).m_ItemType)
    table.insert(items, Grid:GetItem(2, 2).m_ItemType)

    for k,v in pairs(recipes) do
        if arrayEquals(items, v[1]) then
            return v[2]
        end
    end

    return nil
end

function makeItem(Type, Name)
    i = cItem(Type)
    i.m_CustomName = Name
    return i
end

function arrayEquals(ArrayOne, ArrayTwo)
    if #ArrayOne ~= #ArrayTwo then return false end
    for k,v in pairs(ArrayOne) do
        if ArrayTwo[k] ~= v then return false end
    end
    return true
end
This is what I have figured out so far for adding a new recipe. It works fine, except when I craft the item the ingredients aren't deleted. How do I fix this?
This is a known bug: https://github.com/cuberite/cuberite/issues/2503. I think that there is a missing packet update
I also tried it to fix a few times...