From 72d55371d2d5bc2a14567c20a7c391a24c9f1837 Mon Sep 17 00:00:00 2001 From: Kae <80987908+Novaenia@users.noreply.github.com> Date: Tue, 3 Jun 2025 09:32:41 +1000 Subject: add player.nametag, player.setNametag, world.entityNametag --- source/frontend/StarNameplatePainter.cpp | 4 ++-- source/game/StarMonster.cpp | 4 ++++ source/game/StarMonster.hpp | 1 + source/game/StarNpc.cpp | 4 ++++ source/game/StarNpc.hpp | 1 + source/game/StarPlayer.cpp | 11 +++++++++++ source/game/StarPlayer.hpp | 2 ++ source/game/interfaces/StarNametagEntity.hpp | 2 +- source/game/scripting/StarPlayerLuaBindings.cpp | 3 +++ source/game/scripting/StarWorldLuaBindings.cpp | 16 ++++++++++++++++ source/game/scripting/StarWorldLuaBindings.hpp | 1 + 11 files changed, 46 insertions(+), 3 deletions(-) diff --git a/source/frontend/StarNameplatePainter.cpp b/source/frontend/StarNameplatePainter.cpp index 0666af0..7dce6a5 100644 --- a/source/frontend/StarNameplatePainter.cpp +++ b/source/frontend/StarNameplatePainter.cpp @@ -39,7 +39,7 @@ void NameplatePainter::update(float dt, WorldClientPtr const& world, WorldCamera foundEntities.insert(entity->entityId()); if (!m_entitiesWithNametags.contains(entity->entityId())) { - Nametag nametag = {entity->name(), entity->statusText(), entity->nametagColor(), 1.0f, entity->entityId()}; + Nametag nametag = {entity->nametag(), entity->statusText(), entity->nametagColor(), 1.0f, entity->entityId()}; RectF boundBox = determineBoundBox(Vec2F(), nametag); m_nametags.addBubble(Vec2F(), boundBox, std::move(nametag)); } @@ -54,7 +54,7 @@ void NameplatePainter::update(float dt, WorldClientPtr const& world, WorldCamera bubbleState.boundBox = determineBoundBox(bubbleState.idealDestination, nametag); nametag.statusText = entity->statusText(); - nametag.name = entity->name(); + nametag.name = entity->nametag(); nametag.color = entity->nametagColor(); bool fullyOnScreen = world->geometry().rectContains(camera.worldScreenRect(), entity->position()); if (inspectionMode) diff --git a/source/game/StarMonster.cpp b/source/game/StarMonster.cpp index 98f4642..7e73b8b 100644 --- a/source/game/StarMonster.cpp +++ b/source/game/StarMonster.cpp @@ -818,6 +818,10 @@ Vec2F Monster::nametagOrigin() const { return mouthPosition(false); } +String Monster::nametag() const { + return name(); +} + bool Monster::aggressive() const { return m_aggressive; } diff --git a/source/game/StarMonster.hpp b/source/game/StarMonster.hpp index 5c964e3..1fab73f 100644 --- a/source/game/StarMonster.hpp +++ b/source/game/StarMonster.hpp @@ -113,6 +113,7 @@ public: bool displayNametag() const override; Vec3B nametagColor() const override; Vec2F nametagOrigin() const override; + String nametag() const override; bool aggressive() const override; diff --git a/source/game/StarNpc.cpp b/source/game/StarNpc.cpp index 7c1cf63..6c3a9cf 100644 --- a/source/game/StarNpc.cpp +++ b/source/game/StarNpc.cpp @@ -559,6 +559,10 @@ Vec2F Npc::nametagOrigin() const { return mouthPosition(false); } +String Npc::nametag() const { + return name(); +} + bool Npc::aggressive() const { return m_aggressive.get(); } diff --git a/source/game/StarNpc.hpp b/source/game/StarNpc.hpp index 21c562c..381b943 100644 --- a/source/game/StarNpc.hpp +++ b/source/game/StarNpc.hpp @@ -110,6 +110,7 @@ public: bool displayNametag() const override; Vec3B nametagColor() const override; Vec2F nametagOrigin() const override; + String nametag() const override; bool aggressive() const; diff --git a/source/game/StarPlayer.cpp b/source/game/StarPlayer.cpp index 151163f..6184a0a 100644 --- a/source/game/StarPlayer.cpp +++ b/source/game/StarPlayer.cpp @@ -2114,6 +2114,17 @@ Vec2F Player::nametagOrigin() const { return mouthPosition(false); } +String Player::nametag() const { + if (auto jNametag = getSecretProperty("nametag"); jNametag.isType(Json::Type::String)) + return jNametag.toString(); + else + return name(); +} + +void Player::setNametag(Maybe nametag) { + setSecretProperty("nametag", nametag ? Json(*nametag) : Json()); +} + void Player::updateIdentity() { m_identityUpdated = true; m_humanoid->setIdentity(m_identity); } diff --git a/source/game/StarPlayer.hpp b/source/game/StarPlayer.hpp index 5cc6f8f..f371766 100644 --- a/source/game/StarPlayer.hpp +++ b/source/game/StarPlayer.hpp @@ -315,6 +315,8 @@ public: bool displayNametag() const override; Vec3B nametagColor() const override; Vec2F nametagOrigin() const override; + String nametag() const override; + void setNametag(Maybe nametag); void updateIdentity(); diff --git a/source/game/interfaces/StarNametagEntity.hpp b/source/game/interfaces/StarNametagEntity.hpp index 0e42618..b236609 100644 --- a/source/game/interfaces/StarNametagEntity.hpp +++ b/source/game/interfaces/StarNametagEntity.hpp @@ -8,7 +8,7 @@ STAR_CLASS(NametagEntity); class NametagEntity : public virtual Entity { public: - virtual String name() const = 0; + virtual String nametag() const = 0; virtual Maybe statusText() const = 0; virtual bool displayNametag() const = 0; virtual Vec3B nametagColor() const = 0; diff --git a/source/game/scripting/StarPlayerLuaBindings.cpp b/source/game/scripting/StarPlayerLuaBindings.cpp index ff0b877..f8032d2 100755 --- a/source/game/scripting/StarPlayerLuaBindings.cpp +++ b/source/game/scripting/StarPlayerLuaBindings.cpp @@ -118,6 +118,9 @@ LuaCallbacks LuaBindings::makePlayerCallbacks(Player* player) { callbacks.registerCallback( "name", [player]() { return player->name(); }); callbacks.registerCallback("setName", [player](String const& name) { player->setName(name); }); + callbacks.registerCallback( "nametag", [player]() { return player->nametag(); }); + callbacks.registerCallback("setNametag", [player](Maybe const& nametag) { player->setNametag(nametag); }); + callbacks.registerCallback( "species", [player]() { return player->species(); }); callbacks.registerCallback("setSpecies", [player](String const& species) { player->setSpecies(species); }); diff --git a/source/game/scripting/StarWorldLuaBindings.cpp b/source/game/scripting/StarWorldLuaBindings.cpp index 2d952ea..64d1f30 100644 --- a/source/game/scripting/StarWorldLuaBindings.cpp +++ b/source/game/scripting/StarWorldLuaBindings.cpp @@ -512,6 +512,7 @@ namespace LuaBindings { callbacks.registerCallbackWithSignature, EntityId>("entitySpecies", bind(WorldEntityCallbacks::entitySpecies, world, _1)); callbacks.registerCallbackWithSignature, EntityId>("entityGender", bind(WorldEntityCallbacks::entityGender, world, _1)); callbacks.registerCallbackWithSignature, EntityId>("entityName", bind(WorldEntityCallbacks::entityName, world, _1)); + callbacks.registerCallbackWithSignature, EntityId>("entityNametag", bind(WorldEntityCallbacks::entityNametag, world, _1)); callbacks.registerCallbackWithSignature, EntityId, Maybe>("entityDescription", bind(WorldEntityCallbacks::entityDescription, world, _1, _2)); callbacks.registerCallbackWithSignature>>, EntityId, String>("entityPortrait", bind(WorldEntityCallbacks::entityPortrait, world, _1, _2)); callbacks.registerCallbackWithSignature, EntityId, String>("entityHandItem", bind(WorldEntityCallbacks::entityHandItem, world, _1, _2)); @@ -1451,6 +1452,21 @@ namespace LuaBindings { return {}; } + Maybe WorldEntityCallbacks::entityNametag(World* world, EntityId entityId) { + auto entity = world->entity(entityId); + + if (auto nametagEntity = as(entity)) { + return JsonObject{ + {"nametag", nametagEntity->nametag()}, + {"displayed", nametagEntity->displayNametag()}, + {"color", jsonFromColor(Color::rgb(nametagEntity->nametagColor()))}, + {"origin", jsonFromVec2F(nametagEntity->nametagOrigin())}, + }; + } + + return {}; + } + Maybe WorldEntityCallbacks::entityDescription(World* world, EntityId entityId, Maybe const& species) { if (auto entity = world->entity(entityId)) { if (auto inspectableEntity = as(entity)) { diff --git a/source/game/scripting/StarWorldLuaBindings.hpp b/source/game/scripting/StarWorldLuaBindings.hpp index 3f08a77..9d24d49 100644 --- a/source/game/scripting/StarWorldLuaBindings.hpp +++ b/source/game/scripting/StarWorldLuaBindings.hpp @@ -123,6 +123,7 @@ namespace LuaBindings { Maybe entitySpecies(World* world, EntityId entityId); Maybe entityGender(World* world, EntityId entityId); Maybe entityName(World* world, EntityId entityId); + Maybe entityNametag(World* world, EntityId entityId); Maybe entityDescription(World* world, EntityId entityId, Maybe const& species); LuaNullTermWrapper>> entityPortrait(World* world, EntityId entityId, String const& portraitMode); Maybe entityHandItem(World* world, EntityId entityId, String const& handName); -- cgit v1.2.3