diff --git a/res/content/base/scripts/components/player_animator.lua b/res/content/base/scripts/components/player_animator.lua index f85deddc..1fdf4722 100644 --- a/res/content/base/scripts/components/player_animator.lua +++ b/res/content/base/scripts/components/player_animator.lua @@ -12,7 +12,11 @@ local function refresh_model(id) end function on_render() - local invid, slotid = player.get_inventory(hud.get_player()) + local pid = entity:get_player() + if pid == -1 then + return + end + local invid, slotid = player.get_inventory(pid) local id, _ = inventory.get(invid, slotid) if id ~= itemid then refresh_model(id) diff --git a/res/modules/internal/stdcomp.lua b/res/modules/internal/stdcomp.lua index 6c77af1d..dfa14175 100644 --- a/res/modules/internal/stdcomp.lua +++ b/res/modules/internal/stdcomp.lua @@ -66,6 +66,7 @@ local Entity = {__index={ get_uid=function(self) return self.eid end, def_index=function(self) return entities.get_def(self.eid) end, def_name=function(self) return entities.def_name(entities.get_def(self.eid)) end, + get_player=function(self) return entities.get_player(self.eid) end, }} local entities = {} diff --git a/src/logic/scripting/lua/libs/libentity.cpp b/src/logic/scripting/lua/libs/libentity.cpp index 211bf5b1..cecac6e9 100644 --- a/src/logic/scripting/lua/libs/libentity.cpp +++ b/src/logic/scripting/lua/libs/libentity.cpp @@ -54,7 +54,7 @@ static int l_get_def(lua::State* L) { return 0; } -static int l_show(lua::State* L) { +static int l_spawn(lua::State* L) { auto level = controller->getLevel(); auto defname = lua::tostring(L, 1); auto& def = content->entities.require(defname); @@ -81,6 +81,15 @@ static int l_get_skeleton(lua::State* L) { return 0; } +static int l_get_player(lua::State* L) { + entityid_t eid = lua::touinteger(L, 1); + auto level = controller->getLevel(); + if (auto entity = level->entities->get(eid)) { + return lua::pushinteger(L, entity->getPlayer()); + } + return 0; +} + static int l_set_skeleton(lua::State* L) { if (auto entity = get_entity(L, 1)) { std::string skeletonName = lua::require_string(L, 2); @@ -221,10 +230,11 @@ const luaL_Reg entitylib[] = { {"def_hitbox", lua::wrap}, {"get_def", lua::wrap}, {"defs_count", lua::wrap}, - {"spawn", lua::wrap}, + {"spawn", lua::wrap}, {"despawn", lua::wrap}, {"get_skeleton", lua::wrap}, {"set_skeleton", lua::wrap}, + {"get_player", lua::wrap}, {"get_all_in_box", lua::wrap}, {"get_all_in_radius", lua::wrap}, {"raycast", lua::wrap}, diff --git a/src/objects/Entities.hpp b/src/objects/Entities.hpp index 001b3dd9..3d183014 100644 --- a/src/objects/Entities.hpp +++ b/src/objects/Entities.hpp @@ -34,6 +34,7 @@ struct EntityId { entityid_t uid; const EntityDef& def; bool destroyFlag = false; + int64_t player = -1; }; struct Transform { @@ -161,6 +162,14 @@ public: return entity; } + int64_t getPlayer() const { + return registry.get(entity).player; + } + + void setPlayer(int64_t id) { + registry.get(entity).player = id; + } + void destroy(); }; diff --git a/src/objects/Player.cpp b/src/objects/Player.cpp index e0a4a49e..731627fe 100644 --- a/src/objects/Player.cpp +++ b/src/objects/Player.cpp @@ -65,8 +65,14 @@ void Player::updateEntity() { if (eid == 0) { auto& def = level.content.entities.require("base:player"); eid = level.entities->spawn(def, getPosition()); + if (auto entity = level.entities->get(eid)) { + entity->setPlayer(id); + } } else if (auto entity = level.entities->get(eid)) { position = entity->getTransform().pos; + if (auto entity = level.entities->get(eid)) { + entity->setPlayer(id); + } } else if (chunks->getChunkByVoxel(position)) { logger.error() << "player entity despawned or deleted; " "will be respawned";