diff --git a/.gitignore b/.gitignore index 2487d29e..606033f3 100644 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,6 @@ appimage-build/ *.DS_Store *~ + +/res/content/* +!/res/content/base \ No newline at end of file diff --git a/src/frontend/InventoryView.cpp b/src/frontend/InventoryView.cpp index 05fb768e..332cab33 100644 --- a/src/frontend/InventoryView.cpp +++ b/src/frontend/InventoryView.cpp @@ -31,6 +31,7 @@ SlotLayout::SlotLayout( glm::vec2 position, bool background, bool itemSource, + slotcallback updateFunc, slotcallback shareFunc, slotcallback rightClick ) @@ -38,6 +39,7 @@ SlotLayout::SlotLayout( position(position), background(background), itemSource(itemSource), + updateFunc(updateFunc), shareFunc(shareFunc), rightClick(rightClick) {} @@ -218,6 +220,9 @@ void SlotView::clicked(gui::GUI* gui, mousecode button) { if (layout.shareFunc) { layout.shareFunc(layout.index, stack); } + if (layout.updateFunc) { + layout.updateFunc(layout.index, stack); + } return; } if (!layout.itemSource && stack.accepts(grabbed)) { @@ -236,6 +241,9 @@ void SlotView::clicked(gui::GUI* gui, mousecode button) { } else if (button == mousecode::BUTTON_2) { if (layout.rightClick) { layout.rightClick(inventoryid, stack); + if (layout.updateFunc) { + layout.updateFunc(layout.index, stack); + } return; } if (layout.itemSource) @@ -258,6 +266,9 @@ void SlotView::clicked(gui::GUI* gui, mousecode button) { } } } + if (layout.updateFunc) { + layout.updateFunc(layout.index, stack); + } } void SlotView::onFocus(gui::GUI* gui) { @@ -384,10 +395,13 @@ static slotcallback readSlotFunc(InventoryView* view, gui::UiXmlReader& reader, static void readSlot(InventoryView* view, gui::UiXmlReader& reader, xml::xmlelement element) { int index = element->attr("index", "0").asInt(); bool itemSource = element->attr("item-source", "false").asBool(); - SlotLayout layout(index, glm::vec2(), true, itemSource, nullptr, nullptr); + SlotLayout layout(index, glm::vec2(), true, itemSource, nullptr, nullptr, nullptr); if (element->has("pos")) { layout.position = element->attr("pos").asVec2(); } + if (element->has("updatefunc")) { + layout.updateFunc = readSlotFunc(view, reader, element, "updatefunc"); + } if (element->has("sharefunc")) { layout.shareFunc = readSlotFunc(view, reader, element, "sharefunc"); } @@ -421,10 +435,13 @@ static void readSlotsGrid(InventoryView* view, gui::UiXmlReader& reader, xml::xm count = rows * cols; } bool itemSource = element->attr("item-source", "false").asBool(); - SlotLayout layout(-1, glm::vec2(), true, itemSource, nullptr, nullptr); + SlotLayout layout(-1, glm::vec2(), true, itemSource, nullptr, nullptr, nullptr); if (element->has("pos")) { layout.position = element->attr("pos").asVec2(); } + if (element->has("updatefunc")) { + layout.updateFunc = readSlotFunc(view, reader, element, "updatefunc"); + } if (element->has("sharefunc")) { layout.shareFunc = readSlotFunc(view, reader, element, "sharefunc"); } diff --git a/src/frontend/InventoryView.h b/src/frontend/InventoryView.h index 6124eccf..81e8a4e8 100644 --- a/src/frontend/InventoryView.h +++ b/src/frontend/InventoryView.h @@ -43,6 +43,7 @@ struct SlotLayout { glm::vec2 position; bool background; bool itemSource; + slotcallback updateFunc; slotcallback shareFunc; slotcallback rightClick; int padding = 0; @@ -51,6 +52,7 @@ struct SlotLayout { glm::vec2 position, bool background, bool itemSource, + slotcallback updateFunc, slotcallback shareFunc, slotcallback rightClick); }; diff --git a/src/frontend/hud.cpp b/src/frontend/hud.cpp index 3215980f..21800a22 100644 --- a/src/frontend/hud.cpp +++ b/src/frontend/hud.cpp @@ -145,7 +145,7 @@ std::shared_ptr Hud::createContentAccess() { accessInventory->getSlot(id-1).set(ItemStack(id, 1)); } - SlotLayout slotLayout(-1, glm::vec2(), false, true, + SlotLayout slotLayout(-1, glm::vec2(), false, true, nullptr, [=](uint, ItemStack& item) { auto copy = ItemStack(item); inventory->move(copy, indices); @@ -165,7 +165,7 @@ std::shared_ptr Hud::createContentAccess() { std::shared_ptr Hud::createHotbar() { auto inventory = player->getInventory(); - SlotLayout slotLayout(-1, glm::vec2(), false, false, nullptr, nullptr); + SlotLayout slotLayout(-1, glm::vec2(), false, false, nullptr, nullptr, nullptr); InventoryBuilder builder; builder.addGrid(10, 10, glm::vec2(), 4, true, slotLayout); auto view = builder.build(); @@ -185,7 +185,7 @@ Hud::Hud(Engine* engine, LevelFrontend* frontend, Player* player) { interaction = std::make_unique(); grabbedItemView = std::make_shared( - SlotLayout(-1, glm::vec2(), false, false, nullptr, nullptr) + SlotLayout(-1, glm::vec2(), false, false, nullptr, nullptr, nullptr) ); grabbedItemView->bind( 0, diff --git a/src/interfaces/Object.h b/src/interfaces/Object.h index 5ffe1cb6..220d3253 100644 --- a/src/interfaces/Object.h +++ b/src/interfaces/Object.h @@ -1,7 +1,8 @@ #ifndef OBJECT_H #define OBJECT_H -#include "stdlib.h" +#include +#include #include class Level; diff --git a/src/logic/PlayerController.cpp b/src/logic/PlayerController.cpp index 1ebe8d0a..5d1ba910 100644 --- a/src/logic/PlayerController.cpp +++ b/src/logic/PlayerController.cpp @@ -299,12 +299,10 @@ void PlayerController::updateInteraction(){ } if (rclick && !input.shift) { bool preventDefault = false; - - if (item->rt.funcsset.on_use) { - preventDefault |= scripting::on_item_use(player.get(), item); - } if (item->rt.funcsset.on_use_on_block) { - preventDefault |= scripting::on_item_use_on_block(player.get(), item, x, y, z); + preventDefault = scripting::on_item_use_on_block(player.get(), item, x, y, z); + } else if (item->rt.funcsset.on_use) { + preventDefault = scripting::on_item_use(player.get(), item); } if (preventDefault) { return;