Skip to content

Commit

Permalink
feat: add isNameTagAlwaysVisible and setNameTagAlwaysVisible methods
Browse files Browse the repository at this point in the history
  • Loading branch information
wu-vincent committed Dec 23, 2024
1 parent 9c92d42 commit a0f1c74
Show file tree
Hide file tree
Showing 15 changed files with 86 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,6 @@
#include "bedrock/world/actor/actor_flags.h"

namespace SynchedActorDataAccess {
bool getActorFlag(const EntityContext &, ActorFlags);
void setActorFlag(EntityContext &, ActorFlags, bool);
}
3 changes: 2 additions & 1 deletion include/bedrock/world/actor/actor.h
Original file line number Diff line number Diff line change
Expand Up @@ -246,7 +246,8 @@ class Actor {
virtual void _playStepSound(BlockPos const &, Block const &) = 0;

public:
[[nodiscard]] bool getStatusFlag(ActorFlags flags) const;
[[nodiscard]] bool getStatusFlag(ActorFlags) const;
void setStatusFlag(ActorFlags, bool);
[[nodiscard]] bool isType(ActorType type) const;
[[nodiscard]] bool hasType(ActorType type) const;
[[nodiscard]] bool isPlayer() const;
Expand Down
2 changes: 2 additions & 0 deletions include/bedrock/world/actor/actor_data_ids.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

#pragma once

// NOLINTBEGIN(*-identifier-naming)
enum class ActorDataIDs : uint8_t {
RESERVED_0 = 0,
STRUCTURAL_INTEGRITY = 1,
Expand Down Expand Up @@ -149,3 +150,4 @@ enum class ActorDataIDs : uint8_t {
VISIBLE_MOB_EFFECTS = 131,
Count = 132,
};
// NOLINTEND(*-identifier-naming)
14 changes: 14 additions & 0 deletions include/endstone/actor/actor.h
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,20 @@ class Actor : public CommandSender {
*/
virtual void setNameTagVisible(bool visible) = 0;

/**
* @brief Checks if the actor's name tag is always visible.
*
* @return True if the name tag is always visible, false otherwise.
*/
[[nodiscard]] virtual bool isNameTagAlwaysVisible() const = 0;

/**
* @brief Sets whether the actor's name tag should always be visible.
*
* @param visible True to make the name tag always visible, false to disable always visibility.
*/
virtual void setNameTagAlwaysVisible(bool visible) = 0;

/**
* @brief Gets the current name tag of the actor.
*
Expand Down
2 changes: 2 additions & 0 deletions include/endstone/detail/actor/actor.h
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@ class EndstoneActor : public Actor, public std::enable_shared_from_this<Endstone
[[nodiscard]] bool removeScoreboardTag(std::string tag) const override;
[[nodiscard]] bool isNameTagVisible() const override;
void setNameTagVisible(bool visible) override;
[[nodiscard]] bool isNameTagAlwaysVisible() const override;
void setNameTagAlwaysVisible(bool visible) override;
[[nodiscard]] std::string getNameTag() const override;
void setNameTag(std::string name) override;
[[nodiscard]] std::string getScoreTag() const override;
Expand Down
2 changes: 2 additions & 0 deletions include/endstone/detail/actor/mob.h
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,8 @@ class EndstoneMob : public EndstoneActor, public Mob {
[[nodiscard]] bool removeScoreboardTag(std::string tag) const override;
[[nodiscard]] bool isNameTagVisible() const override;
void setNameTagVisible(bool visible) override;
[[nodiscard]] bool isNameTagAlwaysVisible() const override;
void setNameTagAlwaysVisible(bool visible) override;
[[nodiscard]] std::string getNameTag() const override;
void setNameTag(std::string name) override;
[[nodiscard]] std::string getScoreTag() const override;
Expand Down
2 changes: 2 additions & 0 deletions include/endstone/detail/player.h
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,8 @@ class EndstonePlayer : public EndstoneMob, public Player {
[[nodiscard]] bool removeScoreboardTag(std::string tag) const override;
[[nodiscard]] bool isNameTagVisible() const override;
void setNameTagVisible(bool visible) override;
[[nodiscard]] bool isNameTagAlwaysVisible() const override;
void setNameTagAlwaysVisible(bool visible) override;
[[nodiscard]] std::string getNameTag() const override;
void setNameTag(std::string name) override;
[[nodiscard]] std::string getScoreTag() const override;
Expand Down
14 changes: 11 additions & 3 deletions python/src/endstone/_internal/endstone_python.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -145,12 +145,20 @@ class Actor(CommandSender):
Returns true if the actor is in water.
"""
@property
def is_nametag_visible(self) -> bool:
def is_name_tag_always_visible(self) -> bool:
"""
Gets or sets if the actor's name tag is always visible or not.
"""
@is_name_tag_always_visible.setter
def is_name_tag_always_visible(self, arg1: bool) -> None:
...
@property
def is_name_tag_visible(self) -> bool:
"""
Gets or sets if the actor's name tag is visible or not.
"""
@is_nametag_visible.setter
def is_nametag_visible(self, arg1: bool) -> None:
@is_name_tag_visible.setter
def is_name_tag_visible(self, arg1: bool) -> None:
...
@property
def is_on_ground(self) -> bool:
Expand Down
10 changes: 10 additions & 0 deletions src/endstone_core/actor/actor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -245,6 +245,16 @@ void EndstoneActor::setNameTagVisible(bool visible)
actor_.setNameTagVisible(visible);
}

bool EndstoneActor::isNameTagAlwaysVisible() const
{
return actor_.getStatusFlag(ActorFlags::ALWAYS_SHOW_NAME);
}

void EndstoneActor::setNameTagAlwaysVisible(bool visible)
{
actor_.setStatusFlag(ActorFlags::ALWAYS_SHOW_NAME, visible);
}

std::string EndstoneActor::getNameTag() const
{
return actor_.getNameTag();
Expand Down
10 changes: 10 additions & 0 deletions src/endstone_core/actor/mob.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,16 @@ void EndstoneMob::setNameTagVisible(bool visible)
EndstoneActor::setNameTagVisible(visible);
}

bool EndstoneMob::isNameTagAlwaysVisible() const
{
return EndstoneActor::isNameTagAlwaysVisible();
}

void EndstoneMob::setNameTagAlwaysVisible(bool visible)
{
EndstoneActor::setNameTagAlwaysVisible(visible);
}

std::string EndstoneMob::getNameTag() const
{
return EndstoneActor::getNameTag();
Expand Down
10 changes: 10 additions & 0 deletions src/endstone_core/player.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,16 @@ void EndstonePlayer::setNameTagVisible(bool visible)
EndstoneMob::setNameTagVisible(visible);
}

bool EndstonePlayer::isNameTagAlwaysVisible() const
{
return EndstoneMob::isNameTagAlwaysVisible();
}

void EndstonePlayer::setNameTagAlwaysVisible(bool visible)
{
EndstoneMob::setNameTagAlwaysVisible(visible);
}

std::string EndstonePlayer::getNameTag() const
{
return EndstoneMob::getNameTag();
Expand Down
4 changes: 3 additions & 1 deletion src/endstone_python/actor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,10 @@ void init_actor(py::module_ &m, py::class_<Actor, CommandSender> &actor, py::cla
.def("add_scoreboard_tag", &Actor::addScoreboardTag, "Adds a tag to this actor.", py::arg("tag"))
.def("remove_scoreboard_tag", &Actor::removeScoreboardTag, "Removes a given tag from this actor.",
py::arg("tag"))
.def_property("is_nametag_visible", &Actor::isNameTagVisible, &Actor::setNameTagVisible,
.def_property("is_name_tag_visible", &Actor::isNameTagVisible, &Actor::setNameTagVisible,
"Gets or sets if the actor's name tag is visible or not.")
.def_property("is_name_tag_always_visible", &Actor::isNameTagAlwaysVisible, &Actor::setNameTagAlwaysVisible,
"Gets or sets if the actor's name tag is always visible or not.")
.def_property("name_tag", &Actor::getNameTag, &Actor::setNameTag,
"Gets or sets the current name tag of the actor.")
.def_property("score_tag", &Actor::getScoreTag, &Actor::setScoreTag,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,14 @@
#include "bedrock/entity/components/actor_data_dirty_flags_component.h"
#include "bedrock/entity/components/actor_data_flag_component.h"

bool SynchedActorDataAccess::getActorFlag(const EntityContext &entity, ActorFlags flag)
{
if (auto *data_flag = entity.tryGetComponent<ActorDataFlagComponent>()) {
return data_flag->getStatusFlag(flag);
}
return false;
}

void SynchedActorDataAccess::setActorFlag(EntityContext &entity, ActorFlags flag, bool value)
{
auto &dirty_flags = entity.getOrAddComponent<ActorDataDirtyFlagsComponent>();
Expand Down
12 changes: 8 additions & 4 deletions src/endstone_runtime/bedrock/world/actor/actor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -73,10 +73,14 @@ void Actor::teleportTo(const Vec3 &pos, bool should_stop_riding, int cause, int
entity_type, keep_velocity);
}

bool Actor::getStatusFlag(ActorFlags flags) const
bool Actor::getStatusFlag(ActorFlags flag) const
{
auto component = getPersistentComponent<ActorDataFlagComponent>();
return component->getStatusFlag(flags);
return SynchedActorDataAccess::getActorFlag(entity_context_, flag);
}

void Actor::setStatusFlag(ActorFlags flag, bool value)
{
SynchedActorDataAccess::setActorFlag(entity_context_, flag, value);
}

bool Actor::isType(ActorType type) const
Expand Down Expand Up @@ -308,7 +312,7 @@ int Actor::getMaxHealth() const

void Actor::setNameTagVisible(bool visible)
{
SynchedActorDataAccess::setActorFlag(entity_context_, ActorFlags::CAN_SHOW_NAME, visible);
setStatusFlag(ActorFlags::CAN_SHOW_NAME, visible);
}

const std::string &Actor::getNameTag() const
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ const std::string &SynchedActorData::getString(ID id) const

DataItem &SynchedActorData::_get(ID id)
{
return *items_array_[id].get();
return *items_array_[id];
}

DataItem *SynchedActorData::_find(ID id) const
Expand Down

0 comments on commit a0f1c74

Please sign in to comment.