mirror of
https://github.com/MihailRis/voxelcore.git
synced 2026-10-04 18:41:51 +00:00
Merge branch 'main' into feat-inventory-enhancements-p8
This commit is contained in:
commit
a8ec87bdea
10 changed files with 122 additions and 41 deletions
|
|
@ -1,4 +1,4 @@
|
||||||
<inventory>
|
<inventory>
|
||||||
<slots-grid pos="0, 164" rows="1" count="10" sharefunc="inventory_share_func"/>
|
<slots-grid pos="0, 164" rows="1" count="10" sharefunc="share_func"/>
|
||||||
<slots-grid rows="3" start-index="10" count="30" sharefunc="inventory_share_func"/>
|
<slots-grid rows="3" start-index="10" count="30" sharefunc="share_func"/>
|
||||||
</inventory>
|
</inventory>
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1 @@
|
||||||
function inventory_share_func(invid, slotid)
|
share_func = require("core:inventory_utils").share_default_func
|
||||||
local blockinv = hud.get_block_inventory()
|
|
||||||
if blockinv ~= 0 then
|
|
||||||
inventory.move(invid, slotid, blockinv)
|
|
||||||
elseif rules.get("allow-content-access") then
|
|
||||||
inventory.set(invid, slotid, 0, 0)
|
|
||||||
elseif slotid < 10 then
|
|
||||||
inventory.move_range(invid, slotid, invid, 10)
|
|
||||||
else
|
|
||||||
inventory.move_range(invid, slotid, invid, 0, 9)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
|
||||||
21
res/modules/inventory_utils.lua
Normal file
21
res/modules/inventory_utils.lua
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
local M = {}
|
||||||
|
|
||||||
|
function M.share_default_func(invid, slotid)
|
||||||
|
local blockinv = hud.get_block_inventory()
|
||||||
|
local playerinv = player.get_inventory(hud.get_player())
|
||||||
|
if blockinv ~= 0 then
|
||||||
|
if invid == blockinv then
|
||||||
|
inventory.move(blockinv, slotid, playerinv)
|
||||||
|
else
|
||||||
|
inventory.move(invid, slotid, blockinv)
|
||||||
|
end
|
||||||
|
elseif rules.get("allow-content-access") then
|
||||||
|
inventory.set(invid, slotid, 0, 0)
|
||||||
|
elseif slotid < 10 then
|
||||||
|
inventory.move_range(invid, slotid, invid, 10)
|
||||||
|
else
|
||||||
|
inventory.move_range(invid, slotid, invid, 0, 9)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return M
|
||||||
|
|
@ -106,6 +106,7 @@ std::shared_ptr<UINode> HudElement::getNode() const {
|
||||||
std::shared_ptr<InventoryView> Hud::createContentAccess() {
|
std::shared_ptr<InventoryView> Hud::createContentAccess() {
|
||||||
auto& content = frontend.getLevel().content;
|
auto& content = frontend.getLevel().content;
|
||||||
auto& indices = *content.getIndices();
|
auto& indices = *content.getIndices();
|
||||||
|
auto& input = this->input;
|
||||||
auto inventory = player.getInventory();
|
auto inventory = player.getInventory();
|
||||||
|
|
||||||
size_t itemsCount = indices.items.count();
|
size_t itemsCount = indices.items.count();
|
||||||
|
|
@ -115,12 +116,19 @@ std::shared_ptr<InventoryView> Hud::createContentAccess() {
|
||||||
}
|
}
|
||||||
|
|
||||||
SlotLayout slotLayout(-1, glm::vec2(), false, true, nullptr,
|
SlotLayout slotLayout(-1, glm::vec2(), false, true, nullptr,
|
||||||
[inventory, &indices](uint, ItemStack& item) {
|
[inventory, &indices, &input](uint, ItemStack& item) {
|
||||||
auto copy = ItemStack(item);
|
auto copy = ItemStack(item);
|
||||||
|
if (input.pressed(Keycode::LEFT_CONTROL)) {
|
||||||
|
copy.maximizeCount(indices);
|
||||||
|
}
|
||||||
inventory->move(copy, indices);
|
inventory->move(copy, indices);
|
||||||
},
|
},
|
||||||
[this, inventory](uint, ItemStack& item) {
|
[this, inventory, &indices, &input](uint, ItemStack& item) {
|
||||||
inventory->getSlot(player.getChosenSlot()).set(item);
|
auto copy = ItemStack(item);
|
||||||
|
if (input.pressed(Keycode::LEFT_CONTROL)) {
|
||||||
|
copy.maximizeCount(indices);
|
||||||
|
}
|
||||||
|
inventory->getSlot(player.getChosenSlot()).set(copy);
|
||||||
});
|
});
|
||||||
|
|
||||||
InventoryBuilder builder(gui);
|
InventoryBuilder builder(gui);
|
||||||
|
|
|
||||||
|
|
@ -366,28 +366,12 @@ void SlotView::performLeftClick(ItemStack& stack, ItemStack& grabbed) {
|
||||||
);
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
auto indices = *content->getIndices();
|
||||||
if (!layout.itemSource && stack.accepts(grabbed) && layout.placing) {
|
if (!layout.itemSource && stack.accepts(grabbed) && layout.placing) {
|
||||||
action = InteractionAction::PUT;
|
action = InteractionAction::PUT;
|
||||||
stack.move(grabbed, *content->getIndices());
|
stack.move(grabbed, indices);
|
||||||
} else {
|
} else {
|
||||||
if (layout.itemSource) {
|
actIfCannotPut(stack, grabbed, action);
|
||||||
if (grabbed.isEmpty()) {
|
|
||||||
action = InteractionAction::TAKE;
|
|
||||||
grabbed.set(stack);
|
|
||||||
} else {
|
|
||||||
action = InteractionAction::PUT;
|
|
||||||
grabbed.clear();
|
|
||||||
}
|
|
||||||
} else if (grabbed.isEmpty()) {
|
|
||||||
if (layout.taking) {
|
|
||||||
action = InteractionAction::TAKE;
|
|
||||||
std::swap(grabbed, stack);
|
|
||||||
}
|
|
||||||
} else if (layout.taking && layout.placing) {
|
|
||||||
action = InteractionAction::PUT;
|
|
||||||
std::swap(grabbed, stack);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (action != InteractionAction::UNDEFINED) {
|
if (action != InteractionAction::UNDEFINED) {
|
||||||
|
|
@ -400,6 +384,39 @@ void SlotView::performLeftClick(ItemStack& stack, ItemStack& grabbed) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SlotView::actIfCannotPut(ItemStack& stack, ItemStack& grabbed, InteractionAction& action) {
|
||||||
|
const auto& input = gui.getInput();
|
||||||
|
auto indices = *content->getIndices();
|
||||||
|
if (layout.itemSource) {
|
||||||
|
if (grabbed.isEmpty()) {
|
||||||
|
action = InteractionAction::TAKE;
|
||||||
|
grabbed.set(stack);
|
||||||
|
if (input.pressed(Keycode::LEFT_CONTROL)) {
|
||||||
|
grabbed.maximizeCount(*content->getIndices());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (grabbed.accepts(stack)) {
|
||||||
|
auto& def = indices.items.require(stack.getItemId());
|
||||||
|
if (grabbed.getCount() < def.stackSize) {
|
||||||
|
action = InteractionAction::TAKE;
|
||||||
|
grabbed.setCount(grabbed.getCount() + 1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
action = InteractionAction::PUT;
|
||||||
|
grabbed.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (grabbed.isEmpty()) {
|
||||||
|
if (layout.taking) {
|
||||||
|
action = InteractionAction::TAKE;
|
||||||
|
std::swap(grabbed, stack);
|
||||||
|
}
|
||||||
|
} else if (layout.taking && layout.placing) {
|
||||||
|
action = InteractionAction::PUT;
|
||||||
|
std::swap(grabbed, stack);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void SlotView::performRightClick(ItemStack& stack, ItemStack& grabbed) {
|
void SlotView::performRightClick(ItemStack& stack, ItemStack& grabbed) {
|
||||||
if (layout.rightClick) {
|
if (layout.rightClick) {
|
||||||
layout.rightClick(inventoryId, stack);
|
layout.rightClick(inventoryId, stack);
|
||||||
|
|
|
||||||
|
|
@ -123,6 +123,8 @@ namespace gui {
|
||||||
SHARE = 2,
|
SHARE = 2,
|
||||||
UNDEFINED,
|
UNDEFINED,
|
||||||
};
|
};
|
||||||
|
private:
|
||||||
|
void actIfCannotPut(ItemStack& stack, ItemStack& grabbed, InteractionAction& action);
|
||||||
};
|
};
|
||||||
|
|
||||||
class InventoryView final : public gui::Container {
|
class InventoryView final : public gui::Container {
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,14 @@ void ItemStack::setCount(itemcount_t count) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ItemStack::maximizeCount(const ContentIndices& indices) {
|
||||||
|
auto& def = indices.items.require(getItemId());
|
||||||
|
this->count = def.stackSize;
|
||||||
|
if (count == 0) {
|
||||||
|
clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ItemStack::setField(std::string_view name, dv::value value) {
|
void ItemStack::setField(std::string_view name, dv::value value) {
|
||||||
if (fields == nullptr) {
|
if (fields == nullptr) {
|
||||||
if (value == nullptr) {
|
if (value == nullptr) {
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,7 @@ public:
|
||||||
void set(const ItemStack& item);
|
void set(const ItemStack& item);
|
||||||
void set(ItemStack&& item);
|
void set(ItemStack&& item);
|
||||||
void setCount(itemcount_t count);
|
void setCount(itemcount_t count);
|
||||||
|
void maximizeCount(const ContentIndices& indices);
|
||||||
|
|
||||||
/// @brief Set a field in the item stack data.
|
/// @brief Set a field in the item stack data.
|
||||||
void setField(std::string_view name, dv::value value);
|
void setField(std::string_view name, dv::value value);
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
#include "items/Inventories.hpp"
|
#include "items/Inventories.hpp"
|
||||||
#include "items/ItemStack.hpp"
|
#include "items/ItemStack.hpp"
|
||||||
#include "logic/BlocksController.hpp"
|
#include "logic/BlocksController.hpp"
|
||||||
|
#include "logic/scripting/lua/lua_util.hpp"
|
||||||
#include "world/Level.hpp"
|
#include "world/Level.hpp"
|
||||||
#include "api_lua.hpp"
|
#include "api_lua.hpp"
|
||||||
|
|
||||||
|
|
@ -180,7 +181,7 @@ static int l_move(lua::State* L) {
|
||||||
validate_slotid(slotAid, invA);
|
validate_slotid(slotAid, invA);
|
||||||
|
|
||||||
auto invBid = lua::tointeger(L, 3);
|
auto invBid = lua::tointeger(L, 3);
|
||||||
auto slotBid = lua::isnil(L, 4) ? -1 : lua::tointeger(L, 4);
|
auto slotBid = lua::isnoneornil(L, 4) ? -1 : lua::tointeger(L, 4);
|
||||||
auto& invB = get_inventory(invBid, 3);
|
auto& invB = get_inventory(invBid, 3);
|
||||||
auto& slot = invA.getSlot(slotAid);
|
auto& slot = invA.getSlot(slotAid);
|
||||||
if (slotBid == -1) {
|
if (slotBid == -1) {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
|
#define GLM_ENABLE_EXPERIMENTAL
|
||||||
|
#include <iostream>
|
||||||
|
#include <glm/gtx/string_cast.hpp>
|
||||||
#include "api_lua.hpp"
|
#include "api_lua.hpp"
|
||||||
|
|
||||||
#define GLM_ENABLE_EXPERIMENTAL
|
|
||||||
#include <glm/ext/matrix_transform.hpp>
|
#include <glm/ext/matrix_transform.hpp>
|
||||||
#include <glm/gtx/quaternion.hpp>
|
#include <glm/gtx/quaternion.hpp>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
@ -31,14 +33,14 @@ static int l_tostring(lua::State* L) {
|
||||||
lua::check_argc(L, 1);
|
lua::check_argc(L, 1);
|
||||||
auto quat = lua::toquat(L, 1);
|
auto quat = lua::toquat(L, 1);
|
||||||
|
|
||||||
|
float components[4] = {quat.w, quat.x, quat.y, quat.z};
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
ss << "quat"
|
ss << "quat {";
|
||||||
<< "{";
|
|
||||||
for (int i = 0; i < 4; i++) {
|
for (int i = 0; i < 4; i++) {
|
||||||
if (i > 0) {
|
if (i > 0) {
|
||||||
ss << ", ";
|
ss << ", ";
|
||||||
}
|
}
|
||||||
ss << quat[i];
|
ss << components[i];
|
||||||
}
|
}
|
||||||
ss << "}";
|
ss << "}";
|
||||||
return lua::pushstring(L, ss.str());
|
return lua::pushstring(L, ss.str());
|
||||||
|
|
@ -52,10 +54,42 @@ static int l_from_euler(lua::State *L) {
|
||||||
return lua::pushquat(L, glm::quat(euler));
|
return lua::pushquat(L, glm::quat(euler));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int l_mul(lua::State* L) {
|
||||||
|
uint argc = lua::check_argc(L, 2, 3);
|
||||||
|
glm::quat a = lua::toquat(L, 1);
|
||||||
|
glm::quat b = lua::toquat(L, 2);
|
||||||
|
|
||||||
|
glm::quat result = a * b;
|
||||||
|
|
||||||
|
if (argc == 3) {
|
||||||
|
lua::setquat(L, 3, result);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return lua::pushquat(L, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int l_mul_vec3(lua::State* L) {
|
||||||
|
uint argc = lua::check_argc(L, 2, 3);
|
||||||
|
glm::quat q = lua::toquat(L, 1);
|
||||||
|
glm::vec3 v = lua::tovec3(L, 2);
|
||||||
|
|
||||||
|
glm::vec3 result = q * v;
|
||||||
|
|
||||||
|
if (argc == 3) {
|
||||||
|
lua::setvec(L, 3, result);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return lua::pushvec3(L, result);
|
||||||
|
}
|
||||||
|
|
||||||
const luaL_Reg quatlib[] = {
|
const luaL_Reg quatlib[] = {
|
||||||
{"from_mat4", lua::wrap<l_from_mat4>},
|
{"from_mat4", lua::wrap<l_from_mat4>},
|
||||||
{"from_euler", lua::wrap<l_from_euler>},
|
{"from_euler", lua::wrap<l_from_euler>},
|
||||||
{"slerp", lua::wrap<l_slerp>},
|
{"slerp", lua::wrap<l_slerp>},
|
||||||
{"tostring", lua::wrap<l_tostring>},
|
{"tostring", lua::wrap<l_tostring>},
|
||||||
|
{"mul", lua::wrap<l_mul>},
|
||||||
|
{"mul_vec3", lua::wrap<l_mul_vec3>},
|
||||||
{nullptr, nullptr}
|
{nullptr, nullptr}
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue