mirror of
https://github.com/luanti-org/luanti.git
synced 2025-06-27 16:36:03 +00:00
Allow binding dig, place actions to keys; remove LMB/RMB hardcoding
Co-authored-by: Sam Caulfield <sam@samcaulfield.com>
This commit is contained in:
parent
fff0393187
commit
291a6b70d6
14 changed files with 284 additions and 310 deletions
|
@ -604,7 +604,6 @@ public:
|
|||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
|
||||
****************************************************************************/
|
||||
|
||||
const float object_hit_delay = 0.2;
|
||||
|
@ -625,15 +624,15 @@ struct GameRunData {
|
|||
u16 new_playeritem;
|
||||
PointedThing pointed_old;
|
||||
bool digging;
|
||||
bool ldown_for_dig;
|
||||
bool punching;
|
||||
bool btn_down_for_dig;
|
||||
bool dig_instantly;
|
||||
bool digging_blocked;
|
||||
bool left_punch;
|
||||
bool reset_jump_timer;
|
||||
float nodig_delay_timer;
|
||||
float dig_time;
|
||||
float dig_time_complete;
|
||||
float repeat_rightclick_timer;
|
||||
float repeat_place_timer;
|
||||
float object_hit_delay_timer;
|
||||
float time_from_last_punch;
|
||||
ClientActiveObject *selected_object;
|
||||
|
@ -787,6 +786,14 @@ protected:
|
|||
{
|
||||
return input->wasKeyDown(k);
|
||||
}
|
||||
inline bool wasKeyPressed(GameKeyType k)
|
||||
{
|
||||
return input->wasKeyPressed(k);
|
||||
}
|
||||
inline bool wasKeyReleased(GameKeyType k)
|
||||
{
|
||||
return input->wasKeyReleased(k);
|
||||
}
|
||||
|
||||
#ifdef __ANDROID__
|
||||
void handleAndroidChatInput();
|
||||
|
@ -900,7 +907,7 @@ private:
|
|||
bool m_cache_enable_free_move;
|
||||
f32 m_cache_mouse_sensitivity;
|
||||
f32 m_cache_joystick_frustum_sensitivity;
|
||||
f32 m_repeat_right_click_time;
|
||||
f32 m_repeat_place_time;
|
||||
f32 m_cache_cam_smoothing;
|
||||
f32 m_cache_fog_start;
|
||||
|
||||
|
@ -934,7 +941,7 @@ Game::Game() :
|
|||
&settingChangedCallback, this);
|
||||
g_settings->registerChangedCallback("joystick_frustum_sensitivity",
|
||||
&settingChangedCallback, this);
|
||||
g_settings->registerChangedCallback("repeat_rightclick_time",
|
||||
g_settings->registerChangedCallback("repeat_place_time",
|
||||
&settingChangedCallback, this);
|
||||
g_settings->registerChangedCallback("noclip",
|
||||
&settingChangedCallback, this);
|
||||
|
@ -992,7 +999,7 @@ Game::~Game()
|
|||
&settingChangedCallback, this);
|
||||
g_settings->deregisterChangedCallback("mouse_sensitivity",
|
||||
&settingChangedCallback, this);
|
||||
g_settings->deregisterChangedCallback("repeat_rightclick_time",
|
||||
g_settings->deregisterChangedCallback("repeat_place_time",
|
||||
&settingChangedCallback, this);
|
||||
g_settings->deregisterChangedCallback("noclip",
|
||||
&settingChangedCallback, this);
|
||||
|
@ -2465,8 +2472,8 @@ void Game::updatePlayerControl(const CameraOrientation &cam)
|
|||
isKeyDown(KeyType::SPECIAL1),
|
||||
isKeyDown(KeyType::SNEAK),
|
||||
isKeyDown(KeyType::ZOOM),
|
||||
input->getLeftState(),
|
||||
input->getRightState(),
|
||||
isKeyDown(KeyType::DIG),
|
||||
isKeyDown(KeyType::PLACE),
|
||||
cam.camera_pitch,
|
||||
cam.camera_yaw,
|
||||
input->joystick.getAxisWithoutDead(JA_SIDEWARD_MOVE),
|
||||
|
@ -2481,8 +2488,8 @@ void Game::updatePlayerControl(const CameraOrientation &cam)
|
|||
( (u32)(isKeyDown(KeyType::JUMP) & 0x1) << 4) |
|
||||
( (u32)(isKeyDown(KeyType::SPECIAL1) & 0x1) << 5) |
|
||||
( (u32)(isKeyDown(KeyType::SNEAK) & 0x1) << 6) |
|
||||
( (u32)(input->getLeftState() & 0x1) << 7) |
|
||||
( (u32)(input->getRightState() & 0x1) << 8) |
|
||||
( (u32)(isKeyDown(KeyType::DIG) & 0x1) << 7) |
|
||||
( (u32)(isKeyDown(KeyType::PLACE) & 0x1) << 8) |
|
||||
( (u32)(isKeyDown(KeyType::ZOOM) & 0x1) << 9)
|
||||
);
|
||||
|
||||
|
@ -3064,7 +3071,7 @@ void Game::processPlayerInteraction(f32 dtime, bool show_hud, bool show_debug)
|
|||
|
||||
PointedThing pointed = updatePointedThing(shootline,
|
||||
selected_def.liquids_pointable,
|
||||
!runData.ldown_for_dig,
|
||||
!runData.btn_down_for_dig,
|
||||
camera_offset);
|
||||
|
||||
if (pointed != runData.pointed_old) {
|
||||
|
@ -3072,20 +3079,18 @@ void Game::processPlayerInteraction(f32 dtime, bool show_hud, bool show_debug)
|
|||
hud->updateSelectionMesh(camera_offset);
|
||||
}
|
||||
|
||||
if (runData.digging_blocked && !input->getLeftState()) {
|
||||
// allow digging again if button is not pressed
|
||||
// Allow digging again if button is not pressed
|
||||
if (runData.digging_blocked && !isKeyDown(KeyType::DIG))
|
||||
runData.digging_blocked = false;
|
||||
}
|
||||
|
||||
/*
|
||||
Stop digging when
|
||||
- releasing left mouse button
|
||||
- releasing dig button
|
||||
- pointing away from node
|
||||
*/
|
||||
if (runData.digging) {
|
||||
if (input->getLeftReleased()) {
|
||||
infostream << "Left button released"
|
||||
<< " (stopped digging)" << std::endl;
|
||||
if (wasKeyReleased(KeyType::DIG)) {
|
||||
infostream << "Dig button released (stopped digging)" << std::endl;
|
||||
runData.digging = false;
|
||||
} else if (pointed != runData.pointed_old) {
|
||||
if (pointed.type == POINTEDTHING_NODE
|
||||
|
@ -3095,8 +3100,7 @@ void Game::processPlayerInteraction(f32 dtime, bool show_hud, bool show_debug)
|
|||
// Still pointing to the same node, but a different face.
|
||||
// Don't reset.
|
||||
} else {
|
||||
infostream << "Pointing away from node"
|
||||
<< " (stopped digging)" << std::endl;
|
||||
infostream << "Pointing away from node (stopped digging)" << std::endl;
|
||||
runData.digging = false;
|
||||
hud->updateSelectionMesh(camera_offset);
|
||||
}
|
||||
|
@ -3107,55 +3111,57 @@ void Game::processPlayerInteraction(f32 dtime, bool show_hud, bool show_debug)
|
|||
client->setCrack(-1, v3s16(0, 0, 0));
|
||||
runData.dig_time = 0.0;
|
||||
}
|
||||
} else if (runData.dig_instantly && input->getLeftReleased()) {
|
||||
// Remove e.g. torches faster when clicking instead of holding LMB
|
||||
} else if (runData.dig_instantly && wasKeyReleased(KeyType::DIG)) {
|
||||
// Remove e.g. torches faster when clicking instead of holding dig button
|
||||
runData.nodig_delay_timer = 0;
|
||||
runData.dig_instantly = false;
|
||||
}
|
||||
|
||||
if (!runData.digging && runData.ldown_for_dig && !input->getLeftState()) {
|
||||
runData.ldown_for_dig = false;
|
||||
}
|
||||
if (!runData.digging && runData.btn_down_for_dig && !isKeyDown(KeyType::DIG))
|
||||
runData.btn_down_for_dig = false;
|
||||
|
||||
runData.left_punch = false;
|
||||
runData.punching = false;
|
||||
|
||||
soundmaker->m_player_leftpunch_sound.name = "";
|
||||
|
||||
// Prepare for repeating, unless we're not supposed to
|
||||
if (input->getRightState() && !g_settings->getBool("safe_dig_and_place"))
|
||||
runData.repeat_rightclick_timer += dtime;
|
||||
if (isKeyDown(KeyType::PLACE) && !g_settings->getBool("safe_dig_and_place"))
|
||||
runData.repeat_place_timer += dtime;
|
||||
else
|
||||
runData.repeat_rightclick_timer = 0;
|
||||
runData.repeat_place_timer = 0;
|
||||
|
||||
if (selected_def.usable && input->getLeftState()) {
|
||||
if (input->getLeftClicked() && (!client->modsLoaded()
|
||||
|| !client->getScript()->on_item_use(selected_item, pointed)))
|
||||
if (selected_def.usable && isKeyDown(KeyType::DIG)) {
|
||||
if (wasKeyPressed(KeyType::DIG) && (!client->modsLoaded() ||
|
||||
!client->getScript()->on_item_use(selected_item, pointed)))
|
||||
client->interact(INTERACT_USE, pointed);
|
||||
} else if (pointed.type == POINTEDTHING_NODE) {
|
||||
handlePointingAtNode(pointed, selected_item, hand_item, dtime);
|
||||
} else if (pointed.type == POINTEDTHING_OBJECT) {
|
||||
v3f player_position = player->getPosition();
|
||||
handlePointingAtObject(pointed, tool_item, player_position, show_debug);
|
||||
} else if (input->getLeftState()) {
|
||||
} else if (isKeyDown(KeyType::DIG)) {
|
||||
// When button is held down in air, show continuous animation
|
||||
runData.left_punch = true;
|
||||
runData.punching = true;
|
||||
// Run callback even though item is not usable
|
||||
if (input->getLeftClicked() && client->modsLoaded())
|
||||
if (wasKeyPressed(KeyType::DIG) && client->modsLoaded())
|
||||
client->getScript()->on_item_use(selected_item, pointed);
|
||||
} else if (input->getRightClicked()) {
|
||||
} else if (wasKeyPressed(KeyType::PLACE)) {
|
||||
handlePointingAtNothing(selected_item);
|
||||
}
|
||||
|
||||
runData.pointed_old = pointed;
|
||||
|
||||
if (runData.left_punch || input->getLeftClicked())
|
||||
camera->setDigging(0); // left click animation
|
||||
if (runData.punching || wasKeyPressed(KeyType::DIG))
|
||||
camera->setDigging(0); // dig animation
|
||||
|
||||
input->resetLeftClicked();
|
||||
input->resetRightClicked();
|
||||
input->clearWasKeyPressed();
|
||||
input->clearWasKeyReleased();
|
||||
|
||||
input->resetLeftReleased();
|
||||
input->resetRightReleased();
|
||||
input->joystick.clearWasKeyDown(KeyType::MOUSE_L);
|
||||
input->joystick.clearWasKeyDown(KeyType::MOUSE_R);
|
||||
|
||||
input->joystick.clearWasKeyReleased(KeyType::MOUSE_L);
|
||||
input->joystick.clearWasKeyReleased(KeyType::MOUSE_R);
|
||||
}
|
||||
|
||||
|
||||
|
@ -3255,7 +3261,7 @@ PointedThing Game::updatePointedThing(
|
|||
|
||||
void Game::handlePointingAtNothing(const ItemStack &playerItem)
|
||||
{
|
||||
infostream << "Right Clicked in Air" << std::endl;
|
||||
infostream << "Attempted to place item while pointing at nothing" << std::endl;
|
||||
PointedThing fauxPointed;
|
||||
fauxPointed.type = POINTEDTHING_NOTHING;
|
||||
client->interact(INTERACT_ACTIVATE, fauxPointed);
|
||||
|
@ -3274,7 +3280,7 @@ void Game::handlePointingAtNode(const PointedThing &pointed,
|
|||
|
||||
ClientMap &map = client->getEnv().getClientMap();
|
||||
|
||||
if (runData.nodig_delay_timer <= 0.0 && input->getLeftState()
|
||||
if (runData.nodig_delay_timer <= 0.0 && isKeyDown(KeyType::DIG)
|
||||
&& !runData.digging_blocked
|
||||
&& client->checkPrivilege("interact")) {
|
||||
handleDigging(pointed, nodepos, selected_item, hand_item, dtime);
|
||||
|
@ -3295,13 +3301,14 @@ void Game::handlePointingAtNode(const PointedThing &pointed,
|
|||
}
|
||||
}
|
||||
|
||||
if ((input->getRightClicked() ||
|
||||
runData.repeat_rightclick_timer >= m_repeat_right_click_time) &&
|
||||
if ((wasKeyPressed(KeyType::PLACE) ||
|
||||
runData.repeat_place_timer >= m_repeat_place_time) &&
|
||||
client->checkPrivilege("interact")) {
|
||||
runData.repeat_rightclick_timer = 0;
|
||||
infostream << "Ground right-clicked" << std::endl;
|
||||
runData.repeat_place_timer = 0;
|
||||
infostream << "Place button pressed while looking at ground" << std::endl;
|
||||
|
||||
camera->setDigging(1); // right click animation (always shown for feedback)
|
||||
// Placing animation (always shown for feedback)
|
||||
camera->setDigging(1);
|
||||
|
||||
soundmaker->m_player_rightpunch_sound = SimpleSoundSpec();
|
||||
|
||||
|
@ -3367,8 +3374,7 @@ bool Game::nodePlacement(const ItemDefinition &selected_def,
|
|||
}
|
||||
|
||||
verbosestream << "Node placement prediction for "
|
||||
<< selected_def.name << " is "
|
||||
<< prediction << std::endl;
|
||||
<< selected_def.name << " is " << prediction << std::endl;
|
||||
v3s16 p = neighbourpos;
|
||||
|
||||
// Place inside node itself if buildable_to
|
||||
|
@ -3529,7 +3535,7 @@ void Game::handlePointingAtObject(const PointedThing &pointed,
|
|||
|
||||
m_game_ui->setInfoText(infotext);
|
||||
|
||||
if (input->getLeftState()) {
|
||||
if (isKeyDown(KeyType::DIG)) {
|
||||
bool do_punch = false;
|
||||
bool do_punch_damage = false;
|
||||
|
||||
|
@ -3539,12 +3545,12 @@ void Game::handlePointingAtObject(const PointedThing &pointed,
|
|||
runData.object_hit_delay_timer = object_hit_delay;
|
||||
}
|
||||
|
||||
if (input->getLeftClicked())
|
||||
if (wasKeyPressed(KeyType::DIG))
|
||||
do_punch = true;
|
||||
|
||||
if (do_punch) {
|
||||
infostream << "Left-clicked object" << std::endl;
|
||||
runData.left_punch = true;
|
||||
infostream << "Punched object" << std::endl;
|
||||
runData.punching = true;
|
||||
}
|
||||
|
||||
if (do_punch_damage) {
|
||||
|
@ -3559,8 +3565,8 @@ void Game::handlePointingAtObject(const PointedThing &pointed,
|
|||
if (!disable_send)
|
||||
client->interact(INTERACT_START_DIGGING, pointed);
|
||||
}
|
||||
} else if (input->getRightClicked()) {
|
||||
infostream << "Right-clicked object" << std::endl;
|
||||
} else if (wasKeyDown(KeyType::PLACE)) {
|
||||
infostream << "Pressed place button while pointing at object" << std::endl;
|
||||
client->interact(INTERACT_PLACE, pointed); // place
|
||||
}
|
||||
}
|
||||
|
@ -3606,7 +3612,7 @@ void Game::handleDigging(const PointedThing &pointed, const v3s16 &nodepos,
|
|||
return;
|
||||
client->interact(INTERACT_START_DIGGING, pointed);
|
||||
runData.digging = true;
|
||||
runData.ldown_for_dig = true;
|
||||
runData.btn_down_for_dig = true;
|
||||
}
|
||||
|
||||
if (!runData.dig_instantly) {
|
||||
|
@ -3700,7 +3706,7 @@ void Game::handleDigging(const PointedThing &pointed, const v3s16 &nodepos,
|
|||
client->setCrack(-1, nodepos);
|
||||
}
|
||||
|
||||
camera->setDigging(0); // left click animation
|
||||
camera->setDigging(0); // Dig animation
|
||||
}
|
||||
|
||||
|
||||
|
@ -4039,7 +4045,7 @@ void Game::readSettings()
|
|||
m_cache_enable_fog = g_settings->getBool("enable_fog");
|
||||
m_cache_mouse_sensitivity = g_settings->getFloat("mouse_sensitivity");
|
||||
m_cache_joystick_frustum_sensitivity = g_settings->getFloat("joystick_frustum_sensitivity");
|
||||
m_repeat_right_click_time = g_settings->getFloat("repeat_rightclick_time");
|
||||
m_repeat_place_time = g_settings->getFloat("repeat_place_time");
|
||||
|
||||
m_cache_enable_noclip = g_settings->getBool("noclip");
|
||||
m_cache_enable_free_move = g_settings->getBool("free_move");
|
||||
|
@ -4131,30 +4137,32 @@ void Game::showPauseMenu()
|
|||
"- %s: move backwards\n"
|
||||
"- %s: move left\n"
|
||||
"- %s: move right\n"
|
||||
"- %s: jump/climb\n"
|
||||
"- %s: sneak/go down\n"
|
||||
"- %s: jump/climb up\n"
|
||||
"- %s: dig/punch\n"
|
||||
"- %s: place/use\n"
|
||||
"- %s: sneak/climb down\n"
|
||||
"- %s: drop item\n"
|
||||
"- %s: inventory\n"
|
||||
"- Mouse: turn/look\n"
|
||||
"- Mouse left: dig/punch\n"
|
||||
"- Mouse right: place/use\n"
|
||||
"- Mouse wheel: select item\n"
|
||||
"- %s: chat\n"
|
||||
);
|
||||
|
||||
char control_text_buf[600];
|
||||
char control_text_buf[600];
|
||||
|
||||
porting::mt_snprintf(control_text_buf, sizeof(control_text_buf), control_text_template.c_str(),
|
||||
GET_KEY_NAME(keymap_forward),
|
||||
GET_KEY_NAME(keymap_backward),
|
||||
GET_KEY_NAME(keymap_left),
|
||||
GET_KEY_NAME(keymap_right),
|
||||
GET_KEY_NAME(keymap_jump),
|
||||
GET_KEY_NAME(keymap_sneak),
|
||||
GET_KEY_NAME(keymap_drop),
|
||||
GET_KEY_NAME(keymap_inventory),
|
||||
GET_KEY_NAME(keymap_chat)
|
||||
);
|
||||
porting::mt_snprintf(control_text_buf, sizeof(control_text_buf), control_text_template.c_str(),
|
||||
GET_KEY_NAME(keymap_forward),
|
||||
GET_KEY_NAME(keymap_backward),
|
||||
GET_KEY_NAME(keymap_left),
|
||||
GET_KEY_NAME(keymap_right),
|
||||
GET_KEY_NAME(keymap_jump),
|
||||
GET_KEY_NAME(keymap_dig),
|
||||
GET_KEY_NAME(keymap_place),
|
||||
GET_KEY_NAME(keymap_sneak),
|
||||
GET_KEY_NAME(keymap_drop),
|
||||
GET_KEY_NAME(keymap_inventory),
|
||||
GET_KEY_NAME(keymap_chat)
|
||||
);
|
||||
|
||||
std::string control_text = std::string(control_text_buf);
|
||||
str_formspec_escape(control_text);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue