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))
|
local velocity = vec3.add(throw_force, vec3.add(pvel, DROP_INIT_VEL))
|
||||||
drop.rigidbody:set_vel(velocity)
|
drop.rigidbody:set_vel(velocity)
|
||||||
end)
|
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
|
end
|
||||||
|
|||||||
@ -320,7 +320,6 @@ function __vc_on_hud_open()
|
|||||||
|
|
||||||
_rules.create("allow-content-access", hud._is_content_access(), function(value)
|
_rules.create("allow-content-access", hud._is_content_access(), function(value)
|
||||||
hud._set_content_access(value)
|
hud._set_content_access(value)
|
||||||
input.set_enabled("player.pick", value)
|
|
||||||
end)
|
end)
|
||||||
_rules.create("allow-flight", true, function(value)
|
_rules.create("allow-flight", true, function(value)
|
||||||
input.set_enabled("player.flight", 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_ATTACK = "player.attack";
|
||||||
inline const std::string BIND_PLAYER_DESTROY = "player.destroy";
|
inline const std::string BIND_PLAYER_DESTROY = "player.destroy";
|
||||||
inline const std::string BIND_PLAYER_BUILD = "player.build";
|
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 =
|
inline const std::string BIND_PLAYER_FAST_INTERACTOIN =
|
||||||
"player.fast_interaction";
|
"player.fast_interaction";
|
||||||
inline const std::string BIND_HUD_INVENTORY = "hud.inventory";
|
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;
|
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);
|
end = std::min(slots.size(), end);
|
||||||
for (size_t i = begin; i < end; i++) {
|
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;
|
return i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -22,7 +22,9 @@ public:
|
|||||||
|
|
||||||
ItemStack& getSlot(size_t index);
|
ItemStack& getSlot(size_t index);
|
||||||
size_t findEmptySlot(size_t begin = 0, size_t end = -1) const;
|
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 {
|
inline size_t size() const {
|
||||||
return slots.size();
|
return slots.size();
|
||||||
|
|||||||
@ -341,28 +341,6 @@ static int determine_rotation(
|
|||||||
return 0;
|
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) {
|
voxel* PlayerController::updateSelection(float maxDistance) {
|
||||||
auto indices = level.content->getIndices();
|
auto indices = level.content->getIndices();
|
||||||
auto& chunks = *player.chunks;
|
auto& chunks = *player.chunks;
|
||||||
@ -568,10 +546,6 @@ void PlayerController::updateInteraction(float delta) {
|
|||||||
if (def && rclick) {
|
if (def && rclick) {
|
||||||
processRightClick(*def, target);
|
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() {
|
Player* PlayerController::getPlayer() {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user