move 'player.pick' binding handler to Lua
This commit is contained in:
parent
22d207ba28
commit
9164edf971
@ -23,4 +23,30 @@ function on_hud_open()
|
||||
local velocity = vec3.add(throw_force, vec3.add(pvel, DROP_INIT_VEL))
|
||||
drop.rigidbody:set_vel(velocity)
|
||||
end)
|
||||
input.add_callback("player.pick", function ()
|
||||
if hud.is_paused() or hud.is_inventory_open() then
|
||||
return
|
||||
end
|
||||
local pid = hud.get_player()
|
||||
local x, y, z = player.get_selected_block(pid)
|
||||
if x == nil then
|
||||
return
|
||||
end
|
||||
local id = block.get_picking_item(block.get(x, y, z))
|
||||
local inv, cur_slot = player.get_inventory(pid)
|
||||
local slot = inventory.find_by_item(inv, id, 0, 9)
|
||||
if slot then
|
||||
player.set_selected_slot(pid, slot)
|
||||
return
|
||||
end
|
||||
if not rules.get("allow-content-access") then
|
||||
return
|
||||
end
|
||||
slot = inventory.find_by_item(inv, 0, 0, 9)
|
||||
if slot then
|
||||
cur_slot = slot
|
||||
end
|
||||
player.set_selected_slot(pid, cur_slot)
|
||||
inventory.set(inv, cur_slot, id, 1)
|
||||
end)
|
||||
end
|
||||
|
||||
@ -320,7 +320,6 @@ function __vc_on_hud_open()
|
||||
|
||||
_rules.create("allow-content-access", hud._is_content_access(), function(value)
|
||||
hud._set_content_access(value)
|
||||
input.set_enabled("player.pick", value)
|
||||
end)
|
||||
_rules.create("allow-flight", true, function(value)
|
||||
input.set_enabled("player.flight", value)
|
||||
|
||||
@ -26,7 +26,6 @@ inline const std::string BIND_PLAYER_FLIGHT = "player.flight";
|
||||
inline const std::string BIND_PLAYER_ATTACK = "player.attack";
|
||||
inline const std::string BIND_PLAYER_DESTROY = "player.destroy";
|
||||
inline const std::string BIND_PLAYER_BUILD = "player.build";
|
||||
inline const std::string BIND_PLAYER_PICK = "player.pick";
|
||||
inline const std::string BIND_PLAYER_FAST_INTERACTOIN =
|
||||
"player.fast_interaction";
|
||||
inline const std::string BIND_HUD_INVENTORY = "hud.inventory";
|
||||
|
||||
@ -23,10 +23,13 @@ size_t Inventory::findEmptySlot(size_t begin, size_t end) const {
|
||||
return npos;
|
||||
}
|
||||
|
||||
size_t Inventory::findSlotByItem(itemid_t id, size_t begin, size_t end) {
|
||||
size_t Inventory::findSlotByItem(
|
||||
itemid_t id, size_t begin, size_t end, size_t minCount
|
||||
) {
|
||||
end = std::min(slots.size(), end);
|
||||
for (size_t i = begin; i < end; i++) {
|
||||
if (slots[i].getItemId() == id) {
|
||||
const auto& stack = slots[i];
|
||||
if (stack.getItemId() == id && stack.getCount() >= minCount) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
@ -22,7 +22,9 @@ public:
|
||||
|
||||
ItemStack& getSlot(size_t index);
|
||||
size_t findEmptySlot(size_t begin = 0, size_t end = -1) const;
|
||||
size_t findSlotByItem(itemid_t id, size_t begin = 0, size_t end = -1);
|
||||
size_t findSlotByItem(
|
||||
itemid_t id, size_t begin = 0, size_t end = -1, size_t minCount = 1
|
||||
);
|
||||
|
||||
inline size_t size() const {
|
||||
return slots.size();
|
||||
|
||||
@ -341,28 +341,6 @@ static int determine_rotation(
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void pick_block(
|
||||
ContentIndices* indices,
|
||||
const Block& block,
|
||||
Player& player,
|
||||
int x,
|
||||
int y,
|
||||
int z
|
||||
) {
|
||||
itemid_t id = block.rt.pickingItem;
|
||||
auto inventory = player.getInventory();
|
||||
size_t slotid = inventory->findSlotByItem(id, 0, 10);
|
||||
if (slotid == Inventory::npos) {
|
||||
slotid = player.getChosenSlot();
|
||||
} else {
|
||||
player.setChosenSlot(slotid);
|
||||
}
|
||||
ItemStack& stack = inventory->getSlot(slotid);
|
||||
if (stack.getItemId() != id) {
|
||||
stack.set(ItemStack(id, 1));
|
||||
}
|
||||
}
|
||||
|
||||
voxel* PlayerController::updateSelection(float maxDistance) {
|
||||
auto indices = level.content->getIndices();
|
||||
auto& chunks = *player.chunks;
|
||||
@ -568,10 +546,6 @@ void PlayerController::updateInteraction(float delta) {
|
||||
if (def && rclick) {
|
||||
processRightClick(*def, target);
|
||||
}
|
||||
if (Events::jactive(BIND_PLAYER_PICK)) {
|
||||
auto coord = selection.actualPosition;
|
||||
pick_block(indices, target, player, coord.x, coord.y, coord.z);
|
||||
}
|
||||
}
|
||||
|
||||
Player* PlayerController::getPlayer() {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user