diff --git a/doc/en/scripting/builtins/libinput.md b/doc/en/scripting/builtins/libinput.md index 02f2a8d0..2c577389 100644 --- a/doc/en/scripting/builtins/libinput.md +++ b/doc/en/scripting/builtins/libinput.md @@ -48,6 +48,12 @@ input.get_mouse_pos() --> {int, int} Returns cursor screen position. +```lua +input.get_mouse_delta() --> {int, int} +``` + +Returns cursor movement delta. + ```lua input.get_bindings() --> strings array ``` diff --git a/doc/ru/scripting/builtins/libinput.md b/doc/ru/scripting/builtins/libinput.md index afe22ee6..96bc3105 100644 --- a/doc/ru/scripting/builtins/libinput.md +++ b/doc/ru/scripting/builtins/libinput.md @@ -48,6 +48,12 @@ input.get_mouse_pos() --> {int, int} Возвращает позицию курсора на экране. +```lua +input.get_mouse_delta() --> {int, int} +``` + +Возращает дельту позиции курсора. + ```lua input.get_bindings() --> массив строк ``` diff --git a/src/frontend/LevelFrontend.cpp b/src/frontend/LevelFrontend.cpp index 5dfdf822..9a8553da 100644 --- a/src/frontend/LevelFrontend.cpp +++ b/src/frontend/LevelFrontend.cpp @@ -49,8 +49,7 @@ LevelFrontend::LevelFrontend( auto sound = rassets.get(material->stepsSound); glm::vec3 pos {}; auto soundsCamera = currentPlayer->currentCamera.get(); - if (soundsCamera == currentPlayer->spCamera.get() || - soundsCamera == currentPlayer->tpCamera.get()) { + if (currentPlayer->isCurrentCameraBuiltin()) { soundsCamera = currentPlayer->fpCamera.get(); } bool relative = player == currentPlayer && diff --git a/src/logic/PlayerController.cpp b/src/logic/PlayerController.cpp index 0ced9425..9de01404 100644 --- a/src/logic/PlayerController.cpp +++ b/src/logic/PlayerController.cpp @@ -207,8 +207,7 @@ void CameraControl::update( tpCamera->front = camera->front; tpCamera->right = camera->right; } - if (player.currentCamera == spCamera || player.currentCamera == tpCamera || - player.currentCamera == camera) { + if (player.isCurrentCameraBuiltin()) { player.currentCamera->setFov(glm::radians(settings.fov.get())); } } @@ -280,7 +279,7 @@ void PlayerController::postUpdate( updateFootsteps(delta); } - if (!pause && input) { + if (!pause && input && player.isCurrentCameraBuiltin()) { camControl.updateMouse(this->input, windowHeight); } camControl.refreshRotation(); diff --git a/src/logic/scripting/lua/libs/libinput.cpp b/src/logic/scripting/lua/libs/libinput.cpp index 6d75fd4b..eb605671 100644 --- a/src/logic/scripting/lua/libs/libinput.cpp +++ b/src/logic/scripting/lua/libs/libinput.cpp @@ -82,6 +82,12 @@ static int l_get_mouse_pos(lua::State* L) { return lua::pushvec2(L, engine->getInput().getCursor().pos); } +static int l_get_mouse_delta(lua::State* L) { + if (engine->isHeadless()) + return 0; + return lua::pushvec2(L, engine->getInput().getCursor().delta); +} + static int l_get_bindings(lua::State* L) { if (engine->isHeadless()) return 0; @@ -171,6 +177,7 @@ const luaL_Reg inputlib[] = { {"mousecode", lua::wrap}, {"add_callback", lua::wrap}, {"get_mouse_pos", lua::wrap}, + {"get_mouse_delta", lua::wrap}, {"get_bindings", lua::wrap}, {"get_binding_text", lua::wrap}, {"is_active", lua::wrap}, diff --git a/src/objects/Player.cpp b/src/objects/Player.cpp index f14f9d2d..f27dc743 100644 --- a/src/objects/Player.cpp +++ b/src/objects/Player.cpp @@ -84,6 +84,12 @@ Hitbox* Player::getHitbox() { return nullptr; } +bool Player::isCurrentCameraBuiltin() const { + return currentCamera.get() == fpCamera.get() || + currentCamera.get() == spCamera.get() || + currentCamera.get() == tpCamera.get(); +} + void Player::updateSelectedEntity() { selectedEid = selection.entity; } diff --git a/src/objects/Player.hpp b/src/objects/Player.hpp index 7d6523f2..18c5a599 100644 --- a/src/objects/Player.hpp +++ b/src/objects/Player.hpp @@ -131,6 +131,8 @@ public: return position; } + bool isCurrentCameraBuiltin() const; + Hitbox* getHitbox(); void setSpawnPoint(glm::vec3 point); @@ -147,4 +149,8 @@ public: inline u64id_t getId() const { return id; } + + Level& getLevel() const { + return level; + } };