Move the code for meta formspec into bool Game::nodePlacement(const ItemDefinition &selected_def,

master
DS-Minetest 2019-09-19 19:50:15 +02:00 committed by sfan5
parent 70f9e1aafa
commit cf78e37da3
1 changed files with 39 additions and 37 deletions

View File

@ -802,7 +802,8 @@ private:
void updateChat(f32 dtime, const v2u32 &screensize); void updateChat(f32 dtime, const v2u32 &screensize);
bool nodePlacement(const ItemDefinition &selected_def, const ItemStack &selected_item, bool nodePlacement(const ItemDefinition &selected_def, const ItemStack &selected_item,
const v3s16 &nodepos, const v3s16 &neighbourpos, const PointedThing &pointed); const v3s16 &nodepos, const v3s16 &neighbourpos, const PointedThing &pointed,
const NodeMetadata *meta);
static const ClientEventHandler clientEventHandler[CLIENTEVENT_MAX]; static const ClientEventHandler clientEventHandler[CLIENTEVENT_MAX];
InputHandler *input = nullptr; InputHandler *input = nullptr;
@ -3199,50 +3200,26 @@ void Game::handlePointingAtNode(const PointedThing &pointed,
runData.repeat_rightclick_timer = 0; runData.repeat_rightclick_timer = 0;
infostream << "Ground right-clicked" << std::endl; infostream << "Ground right-clicked" << std::endl;
if (meta && !meta->getString("formspec").empty() && !random_input camera->setDigging(1); // right click animation (always shown for feedback)
&& !isKeyDown(KeyType::SNEAK)) {
// Report right click to server
if (nodedef_manager->get(map.getNode(nodepos)).rightclickable) {
client->interact(INTERACT_PLACE, pointed);
}
infostream << "Launching custom inventory view" << std::endl; soundmaker->m_player_rightpunch_sound = SimpleSoundSpec();
InventoryLocation inventoryloc; // If the wielded item has node placement prediction,
inventoryloc.setNodeMeta(nodepos); // make that happen
// And also set the sound and send the interact
// But first check for meta formspec and rightclickable
auto &def = selected_item.getDefinition(itemdef_manager);
bool placed = nodePlacement(def, selected_item, nodepos, neighbourpos,
pointed, meta);
NodeMetadataFormSource *fs_src = new NodeMetadataFormSource( if (placed && client->modsLoaded())
&client->getEnv().getClientMap(), nodepos); client->getScript()->on_placenode(pointed, def);
TextDest *txt_dst = new TextDestNodeMetadata(nodepos, client);
auto *&formspec = m_game_ui->updateFormspec("");
GUIFormSpecMenu::create(formspec, client, &input->joystick, fs_src,
txt_dst, client->getFormspecPrepend());
formspec->setFormSpec(meta->getString("formspec"), inventoryloc);
} else {
// Report right click to server
camera->setDigging(1); // right click animation (always shown for feedback)
soundmaker->m_player_rightpunch_sound = SimpleSoundSpec();
// If the wielded item has node placement prediction,
// make that happen
// And also set the sound and send the interact
auto &def = selected_item.getDefinition(itemdef_manager);
bool placed = nodePlacement(def, selected_item, nodepos, neighbourpos,
pointed);
if (placed && client->modsLoaded())
client->getScript()->on_placenode(pointed, def);
}
} }
} }
bool Game::nodePlacement(const ItemDefinition &selected_def, bool Game::nodePlacement(const ItemDefinition &selected_def,
const ItemStack &selected_item, const v3s16 &nodepos, const v3s16 &neighbourpos, const ItemStack &selected_item, const v3s16 &nodepos, const v3s16 &neighbourpos,
const PointedThing &pointed) const PointedThing &pointed, const NodeMetadata *meta)
{ {
std::string prediction = selected_def.node_placement_prediction; std::string prediction = selected_def.node_placement_prediction;
const NodeDefManager *nodedef = client->ndef(); const NodeDefManager *nodedef = client->ndef();
@ -3256,6 +3233,31 @@ bool Game::nodePlacement(const ItemDefinition &selected_def,
return false; return false;
} }
// formspec in meta
if (meta && !meta->getString("formspec").empty() && !random_input
&& !isKeyDown(KeyType::SNEAK)) {
// on_rightclick callbacks are called anyway
if (nodedef_manager->get(map.getNode(nodepos)).rightclickable)
client->interact(INTERACT_PLACE, pointed);
infostream << "Launching custom inventory view" << std::endl;
InventoryLocation inventoryloc;
inventoryloc.setNodeMeta(nodepos);
NodeMetadataFormSource *fs_src = new NodeMetadataFormSource(
&client->getEnv().getClientMap(), nodepos);
TextDest *txt_dst = new TextDestNodeMetadata(nodepos, client);
auto *&formspec = m_game_ui->updateFormspec("");
GUIFormSpecMenu::create(formspec, client, &input->joystick, fs_src,
txt_dst, client->getFormspecPrepend());
formspec->setFormSpec(meta->getString("formspec"), inventoryloc);
return false;
}
// on_rightclick callback
if (prediction.empty() || (nodedef->get(node).rightclickable && if (prediction.empty() || (nodedef->get(node).rightclickable &&
!isKeyDown(KeyType::SNEAK))) { !isKeyDown(KeyType::SNEAK))) {
// Report to server // Report to server