Skip to content

Commit

Permalink
Add on_secondary_use when right clicking an item in the air
Browse files Browse the repository at this point in the history
  • Loading branch information
thePalindrome authored and paramat committed Dec 2, 2015
1 parent 57b4295 commit 97908cc
Show file tree
Hide file tree
Showing 8 changed files with 71 additions and 0 deletions.
7 changes: 7 additions & 0 deletions builtin/game/item.lua
Original file line number Diff line number Diff line change
Expand Up @@ -347,6 +347,10 @@ function core.item_place(itemstack, placer, pointed_thing, param2)
return itemstack
end

function core.item_secondary_use(itemstack, placer)
return itemstack
end

function core.item_drop(itemstack, dropper, pos)
if dropper and dropper:is_player() then
local v = dropper:get_look_dir()
Expand Down Expand Up @@ -605,6 +609,7 @@ core.craftitemdef_default = {
-- Interaction callbacks
on_place = redef_wrapper(core, 'item_place'), -- core.item_place
on_drop = redef_wrapper(core, 'item_drop'), -- core.item_drop
on_secondary_use = redef_wrapper(core, 'item_secondary_use'),
on_use = nil,
}

Expand All @@ -622,6 +627,7 @@ core.tooldef_default = {

-- Interaction callbacks
on_place = redef_wrapper(core, 'item_place'), -- core.item_place
on_secondary_use = redef_wrapper(core, 'item_secondary_use'),
on_drop = redef_wrapper(core, 'item_drop'), -- core.item_drop
on_use = nil,
}
Expand All @@ -640,6 +646,7 @@ core.noneitemdef_default = { -- This is used for the hand and unknown items

-- Interaction callbacks
on_place = redef_wrapper(core, 'item_place'),
on_secondary_use = redef_wrapper(core, 'item_secondary_use'),
on_drop = nil,
on_use = nil,
}
1 change: 1 addition & 0 deletions builtin/game/register.lua
Original file line number Diff line number Diff line change
Expand Up @@ -272,6 +272,7 @@ core.register_item(":unknown", {
description = "Unknown Item",
inventory_image = "unknown_item.png",
on_place = core.item_place,
on_secondary_use = core.item_secondary_use,
on_drop = core.item_drop,
groups = {not_in_creative_inventory=1},
diggable = true,
Expand Down
5 changes: 5 additions & 0 deletions doc/lua_api.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3303,6 +3303,11 @@ Definition tables
--[[
^ Shall place item and return the leftover itemstack
^ default: minetest.item_place ]]
on_secondary_use = func(itemstack, user, pointed_thing),
--[[
^ Same as on_place but called when pointing at nothing.
^ pointed_thing : always { type = "nothing" }
]]
on_drop = func(itemstack, dropper, pos),
--[[
^ Shall drop item and return the leftover itemstack
Expand Down
1 change: 1 addition & 0 deletions src/client.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -946,6 +946,7 @@ void Client::interact(u8 action, const PointedThing& pointed)
2: digging completed
3: place block or item (to abovesurface)
4: use item
5: perform secondary action of item
*/

NetworkPacket pkt(TOSERVER_INTERACT, 1 + 2 + 0);
Expand Down
12 changes: 12 additions & 0 deletions src/game.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1525,6 +1525,7 @@ class Game {
void processPlayerInteraction(std::vector<aabb3f> &highlight_boxes,
GameRunData *runData, f32 dtime, bool show_hud,
bool show_debug);
void handlePointingAtNothing(GameRunData *runData, const ItemStack &playerItem);
void handlePointingAtNode(GameRunData *runData,
const PointedThing &pointed, const ItemDefinition &playeritem_def,
const ToolCapabilities &playeritem_toolcap, f32 dtime);
Expand Down Expand Up @@ -3603,6 +3604,8 @@ void Game::processPlayerInteraction(std::vector<aabb3f> &highlight_boxes,
} else if (input->getLeftState()) {
// When button is held down in air, show continuous animation
runData->left_punch = true;
} else if (input->getRightClicked()) {
handlePointingAtNothing(runData, playeritem);
}

runData->pointed_old = pointed;
Expand All @@ -3618,6 +3621,15 @@ void Game::processPlayerInteraction(std::vector<aabb3f> &highlight_boxes,
}


void Game::handlePointingAtNothing(GameRunData *runData, const ItemStack &playerItem)
{
infostream << "Right Clicked in Air" << std::endl;
PointedThing fauxPointed;
fauxPointed.type = POINTEDTHING_NOTHING;
client->interact(5, fauxPointed);
}


void Game::handlePointingAtNode(GameRunData *runData,
const PointedThing &pointed, const ItemDefinition &playeritem_def,
const ToolCapabilities &playeritem_toolcap, f32 dtime)
Expand Down
17 changes: 17 additions & 0 deletions src/network/serverpackethandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1653,6 +1653,23 @@ void Server::handleCommand_Interact(NetworkPacket* pkt)
}

} // action == 4

/*
5: rightclick air
*/
else if (action == 5) {
ItemStack item = playersao->getWieldedItem();

actionstream << player->getName() << " activates "
<< item.name << std::endl;

if (m_script->item_OnSecondaryUse(
item, playersao)) {
if( playersao->setWieldedItem(item)) {
SendInventory(playersao);
}
}
}


/*
Expand Down
26 changes: 26 additions & 0 deletions src/script/cpp_api/s_item.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,32 @@ bool ScriptApiItem::item_OnUse(ItemStack &item,
return true;
}

bool ScriptApiItem::item_OnSecondaryUse(ItemStack &item, ServerActiveObject *user)
{
SCRIPTAPI_PRECHECKHEADER

int error_handler = PUSH_ERROR_HANDLER(L);

if (!getItemCallback(item.name.c_str(), "on_secondary_use"))
return false;

LuaItemStack::create(L, item);
objectrefGetOrCreate(L, user);
PointedThing pointed;
pointed.type = POINTEDTHING_NOTHING;
pushPointedThing(pointed);
PCALL_RES(lua_pcall(L, 3, 1, error_handler));
if (!lua_isnil(L, -1)) {
try {
item = read_item(L, -1, getServer());
} catch (LuaError &e) {
throw LuaError(std::string(e.what()) + ". item=" + item.name);
}
}
lua_pop(L, 2); // Pop item and error handler
return true;
}

bool ScriptApiItem::item_OnCraft(ItemStack &item, ServerActiveObject *user,
const InventoryList *old_craft_grid, const InventoryLocation &craft_inv)
{
Expand Down
2 changes: 2 additions & 0 deletions src/script/cpp_api/s_item.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ class ScriptApiItem
ServerActiveObject *placer, const PointedThing &pointed);
bool item_OnUse(ItemStack &item,
ServerActiveObject *user, const PointedThing &pointed);
bool item_OnSecondaryUse(ItemStack &item,
ServerActiveObject *user);
bool item_OnCraft(ItemStack &item, ServerActiveObject *user,
const InventoryList *old_craft_grid, const InventoryLocation &craft_inv);
bool item_CraftPredict(ItemStack &item, ServerActiveObject *user,
Expand Down

0 comments on commit 97908cc

Please sign in to comment.