diff --git a/doc/en/scripting.md b/doc/en/scripting.md index 4d6620bb..d6b9fa86 100644 --- a/doc/en/scripting.md +++ b/doc/en/scripting.md @@ -105,6 +105,18 @@ player.get_selected_block(playerid: int) -> x,y,z Returns position of the selected block or nil +```python +player.get_selected_entity(playerid: int) -> int +``` + +Returns unique indentifier of the entity selected by player + +```python +player.get_entity(playerid: int) -> int +``` + +Returns unique identifier of the player entity + ## *world* library ## Библиотека *world* diff --git a/doc/ru/scripting.md b/doc/ru/scripting.md index c986dd88..ea48535a 100644 --- a/doc/ru/scripting.md +++ b/doc/ru/scripting.md @@ -101,6 +101,18 @@ player.get_selected_block(playerid: int) -> x,y,z Возвращает координаты выделенного блока, либо nil +```python +player.get_selected_entity(playerid: int) -> int +``` + +Возвращает уникальный идентификатор сущности, на которую нацелен игрок + +```python +player.get_entity(playerid: int) -> int +``` + +Возвращает уникальный идентификатор сущности игрока + ## Библиотека *world* ```python diff --git a/res/content/base/scripts/components/drop.lua b/res/content/base/scripts/components/drop.lua index 36cb53a8..d5fc9591 100644 --- a/res/content/base/scripts/components/drop.lua +++ b/res/content/base/scripts/components/drop.lua @@ -72,7 +72,7 @@ function on_fall() end function on_sensor_enter(index, oid) - local playerentity = player.get_entity(hud.get_player()):get_uid() + local playerentity = player.get_entity(hud.get_player()) if ready and oid == playerentity and index == 0 then entity:despawn() inventory.add(player.get_inventory(oid), dropitem.id, dropitem.count) diff --git a/src/logic/scripting/lua/libplayer.cpp b/src/logic/scripting/lua/libplayer.cpp index 13629b35..38194290 100644 --- a/src/logic/scripting/lua/libplayer.cpp +++ b/src/logic/scripting/lua/libplayer.cpp @@ -15,14 +15,14 @@ inline std::shared_ptr get_player(lua::State* L, int idx) { return level->getObject(lua::tointeger(L, idx)); } -static int l_player_get_pos(lua::State* L) { +static int l_get_pos(lua::State* L) { if (auto player = get_player(L, 1)) { return lua::pushvec3(L, player->getPosition()); } return 0; } -static int l_player_set_pos(lua::State* L) { +static int l_set_pos(lua::State* L) { auto player = get_player(L, 1); if (!player) { return 0; @@ -34,7 +34,7 @@ static int l_player_set_pos(lua::State* L) { return 0; } -static int l_player_get_vel(lua::State* L) { +static int l_get_vel(lua::State* L) { if (auto player = get_player(L, 1)) { if (auto hitbox = player->getHitbox()) { return lua::pushvec3(L, hitbox->velocity); @@ -43,7 +43,7 @@ static int l_player_get_vel(lua::State* L) { return 0; } -static int l_player_set_vel(lua::State* L) { +static int l_set_vel(lua::State* L) { auto player = get_player(L, 1); if (!player) { return 0; @@ -57,14 +57,14 @@ static int l_player_set_vel(lua::State* L) { return 0; } -static int l_player_get_rot(lua::State* L) { +static int l_get_rot(lua::State* L) { if (auto player = get_player(L, 1)) { return lua::pushvec3(L, player->cam); } return 0; } -static int l_player_set_rot(lua::State* L) { +static int l_set_rot(lua::State* L) { auto player = get_player(L, 1); if (!player) { return 0; @@ -83,14 +83,14 @@ static int l_player_set_rot(lua::State* L) { return 0; } -static int l_player_get_dir(lua::State* L) { +static int l_get_dir(lua::State* L) { if (auto player = get_player(L, 1)) { return lua::pushvec3_arr(L, player->camera->front); } return 0; } -static int l_player_get_inv(lua::State* L) { +static int l_get_inv(lua::State* L) { auto player = get_player(L, 1); if (!player) { return 0; @@ -100,35 +100,35 @@ static int l_player_get_inv(lua::State* L) { return 2; } -static int l_player_is_flight(lua::State* L) { +static int l_is_flight(lua::State* L) { if (auto player = get_player(L, 1)) { return lua::pushboolean(L, player->isFlight()); } return 0; } -static int l_player_set_flight(lua::State* L) { +static int l_set_flight(lua::State* L) { if (auto player = get_player(L, 1)) { player->setFlight(lua::toboolean(L, 2)); } return 0; } -static int l_player_is_noclip(lua::State* L) { +static int l_is_noclip(lua::State* L) { if (auto player = get_player(L, 1)) { return lua::pushboolean(L, player->isNoclip()); } return 0; } -static int l_player_set_noclip(lua::State* L) { +static int l_set_noclip(lua::State* L) { if (auto player = get_player(L, 1)) { player->setNoclip(lua::toboolean(L, 2)); } return 0; } -static int l_player_get_selected_block(lua::State* L) { +static int l_get_selected_block(lua::State* L) { if (auto player = get_player(L, 1)) { if (player->selection.vox.id == BLOCK_VOID) { return 0; @@ -138,7 +138,16 @@ static int l_player_get_selected_block(lua::State* L) { return 0; } -static int l_player_get_spawnpoint(lua::State* L) { +static int l_get_selected_entity(lua::State* L) { + if (auto player = get_player(L, 1)) { + if (player->selection.entity) { + return lua::pushinteger(L, player->selection.entity); + } + } + return 0; +} + +static int l_get_spawnpoint(lua::State* L) { if (auto player = get_player(L, 1)) { return lua::pushvec3(L, player->getSpawnPoint()); } @@ -146,7 +155,7 @@ static int l_player_get_spawnpoint(lua::State* L) { } -static int l_player_set_spawnpoint(lua::State* L) { +static int l_set_spawnpoint(lua::State* L) { auto player = get_player(L, 1); if (player) { @@ -158,19 +167,15 @@ static int l_player_set_spawnpoint(lua::State* L) { return 0; } -static int l_player_get_entity(lua::State* L) { +static int l_get_entity(lua::State* L) { auto player = get_player(L, 1); if (player == nullptr) { return 0; } - if (lua::get_from(L, "entities", "get")) { - lua::pushinteger(L, player->getEntity()); - return lua::call(L, 1); - } - return 0; + return lua::pushinteger(L, player->getEntity()); } -static int l_player_set_entity(lua::State* L) { +static int l_set_entity(lua::State* L) { auto player = get_player(L, 1); if (player == nullptr) { return 0; @@ -181,7 +186,7 @@ static int l_player_set_entity(lua::State* L) { return 0; } -static int l_player_set_camera(lua::State* L) { +static int l_set_camera(lua::State* L) { auto player = get_player(L, 1); if (player == nullptr) { return 0; @@ -192,23 +197,24 @@ static int l_player_set_camera(lua::State* L) { } const luaL_Reg playerlib [] = { - {"get_pos", lua::wrap}, - {"set_pos", lua::wrap}, - {"get_vel", lua::wrap}, - {"set_vel", lua::wrap}, - {"get_rot", lua::wrap}, - {"set_rot", lua::wrap}, - {"get_dir", lua::wrap}, - {"get_inventory", lua::wrap}, - {"is_flight", lua::wrap}, - {"set_flight", lua::wrap}, - {"is_noclip", lua::wrap}, - {"set_noclip", lua::wrap}, - {"get_selected_block", lua::wrap}, - {"set_spawnpoint", lua::wrap}, - {"get_spawnpoint", lua::wrap}, - {"get_entity", lua::wrap}, - {"set_entity", lua::wrap}, - {"set_camera", lua::wrap}, + {"get_pos", lua::wrap}, + {"set_pos", lua::wrap}, + {"get_vel", lua::wrap}, + {"set_vel", lua::wrap}, + {"get_rot", lua::wrap}, + {"set_rot", lua::wrap}, + {"get_dir", lua::wrap}, + {"get_inventory", lua::wrap}, + {"is_flight", lua::wrap}, + {"set_flight", lua::wrap}, + {"is_noclip", lua::wrap}, + {"set_noclip", lua::wrap}, + {"get_selected_block", lua::wrap}, + {"get_selected_entity", lua::wrap}, + {"set_spawnpoint", lua::wrap}, + {"get_spawnpoint", lua::wrap}, + {"get_entity", lua::wrap}, + {"set_entity", lua::wrap}, + {"set_camera", lua::wrap}, {NULL, NULL} }; diff --git a/src/objects/Player.cpp b/src/objects/Player.cpp index 0e2a6c7e..ac01964e 100644 --- a/src/objects/Player.cpp +++ b/src/objects/Player.cpp @@ -60,7 +60,6 @@ Hitbox* Player::getHitbox() { return nullptr; } -#include "EntityDef.hpp" void Player::updateInput(PlayerInput& input, float delta) { auto hitbox = getHitbox(); if (hitbox == nullptr) {