HUD: Divorce SSM and CSM

This commit is contained in:
cx384
2026-06-30 15:42:29 +02:00
committed by Lars Müller
parent 6744c6c030
commit 99a609d9d6
10 changed files with 107 additions and 52 deletions
+33
View File
@@ -204,3 +204,36 @@ core.register_chatcommand("text", {
core.register_on_mods_loaded(function()
core.log("Yeah preview mod is loaded with other CSM mods.")
end)
-- Test commands
local id_list = {}
core.register_chatcommand("test_hud", {
func = function(param)
if param == "list" then
print(dump(core.localplayer:hud_get_all()))
return true, "See stdout"
elseif param == "add" then
local n = math.random(5) + 1
for i = 1, n do
id_list[#id_list + 1] = core.localplayer:hud_add({
type = "text",
position = {x=math.random(), y=math.random()},
name = "lab:" .. math.random(999),
text = math.random(999999)
})
end
return true, "Added " .. n .. " elements"
elseif param == "clear" then
local n = #id_list
for _, id in ipairs(id_list) do
assert(core.localplayer:hud_remove(id))
end
id_list = {}
return true, "Removed " .. n .. " elements"
end
return false, "Unknown command?"
end
})
+3 -3
View File
@@ -2300,7 +2300,7 @@ void Game::handleClientEvent_HudAdd(ClientEvent *event, CameraOrientation *cam)
e->text2 = event->hudadd->text2;
e->style = event->hudadd->style;
e->hideable = event->hudadd->hideable;
m_hud_server_to_client[server_id] = player->addHud(std::move(e));
m_hud_server_to_client[server_id] = player->hud.add(std::move(e));
delete event->hudadd;
}
@@ -2311,7 +2311,7 @@ void Game::handleClientEvent_HudRemove(ClientEvent *event, CameraOrientation *ca
auto i = m_hud_server_to_client.find(event->hudrm.id);
if (i != m_hud_server_to_client.end()) {
player->removeHud(i->second);
player->hud.remove(i->second);
m_hud_server_to_client.erase(i);
}
@@ -2325,7 +2325,7 @@ void Game::handleClientEvent_HudChange(ClientEvent *event, CameraOrientation *ca
auto i = m_hud_server_to_client.find(event->hudchange->id);
if (i != m_hud_server_to_client.end()) {
e = player->getHud(i->second);
e = player->hud.get(i->second);
}
if (e == nullptr) {
+11 -2
View File
@@ -308,7 +308,11 @@ void Hud::drawItems(v2s32 screen_pos, v2s32 screen_offset, s32 itemcount, v2f al
bool Hud::hasElementOfType(HudElementType type)
{
for (auto const &e : player->getHudElements()) {
for (auto const &e : player->hud.getElements()) {
if (e && e->type == type)
return true;
}
for (auto const &e : player->csm_hud.getElements()) {
if (e && e->type == type)
return true;
}
@@ -342,7 +346,12 @@ void Hud::drawLuaElements(const v3s16 &camera_offset, bool only_unhidable)
std::vector<HudElement*> elems;
for (auto const &e : player->getHudElements()) {
elems.reserve(player->hud.getElements().size() + player->csm_hud.getElements().size());
for (auto const &e : player->hud.getElements()) {
if (e)
elems.push_back(e.get());
}
for (auto const &e : player->csm_hud.getElements()) {
if (e)
elems.push_back(e.get());
}
+1
View File
@@ -12,6 +12,7 @@
#include "map.h"
#include "client.h"
#include "content_cao.h"
#include "hud_element.h"
/*
PlayerSettings
+2
View File
@@ -106,6 +106,8 @@ public:
float hurt_tilt_timer = 0.0f;
float hurt_tilt_strength = 0.0f;
PlayerHud csm_hud;
GenericCAO *getCAO() const { return m_cao; }
ClientActiveObject *getParent() const;
+25 -15
View File
@@ -103,41 +103,51 @@ ItemStack &Player::getWieldedItem(ItemStack *selected, ItemStack *hand) const
return (hand && selected->name.empty()) ? *hand : *selected;
}
u32 Player::addHud(std::unique_ptr<HudElement> toadd)
u32 PlayerHud::getFreeID()
{
u32 id = getFreeHudID();
size_t size = m_elements.size();
for (size_t i = 0; i != size; i++) {
if (!m_elements[i])
return i;
}
return size;
}
if (id < hud.size())
hud[id] = std::move(toadd);
u32 PlayerHud::add(std::unique_ptr<HudElement> toadd)
{
u32 id = getFreeID();
if (id < m_elements.size())
m_elements[id] = std::move(toadd);
else
hud.push_back(std::move(toadd));
m_elements.push_back(std::move(toadd));
return id;
}
HudElement* Player::getHud(u32 id)
HudElement* PlayerHud::get(u32 id)
{
if (id < hud.size())
return hud[id].get();
if (id < m_elements.size())
return m_elements[id].get();
return nullptr;
}
bool Player::removeHud(u32 id)
bool PlayerHud::remove(u32 id)
{
bool removed = false;
if (id < hud.size()) {
hud[id].reset();
if (id < m_elements.size()) {
m_elements[id].reset();
removed = true;
}
// shrink list if possible
while (!hud.empty() && hud.back() == nullptr)
hud.pop_back();
while (!m_elements.empty() && m_elements.back() == nullptr)
m_elements.pop_back();
return removed;
}
void Player::clearHud()
void PlayerHud::clear()
{
hud.clear();
m_elements.clear();
}
u16 Player::getMaxHotbarItemcount()
+20 -20
View File
@@ -124,6 +124,25 @@ struct PlayerPhysicsOverride
}
};
struct HudElement;
struct PlayerHud
{
const auto &getElements() const { return m_elements; }
/// Returns `nullptr` if not found
HudElement *get(u32 id);
/// Returns the ID of the added element
u32 add(std::unique_ptr<HudElement> e);
/// Returns whether removal succeeded
bool remove(u32 id);
void clear();
private:
u32 getFreeID();
std::vector<std::unique_ptr<HudElement>> m_elements;
};
/// @note numeric values are part of network protocol
enum CameraMode : int {
// not a mode. indicates that any may be used.
@@ -137,8 +156,6 @@ enum CameraMode : int {
extern const struct EnumString es_CameraMode[];
struct HudElement;
class Player
{
public:
@@ -159,16 +176,6 @@ public:
const std::string& getName() const { return m_name; }
u32 getFreeHudID()
{
size_t size = hud.size();
for (size_t i = 0; i != size; i++) {
if (!hud[i])
return i;
}
return size;
}
CameraMode allowed_camera_mode = CAMERA_MODE_ANY;
v3f eye_offset_first;
@@ -219,11 +226,7 @@ public:
return m_fov_override_spec;
}
const auto &getHudElements() const { return hud; }
HudElement* getHud(u32 id);
u32 addHud(std::unique_ptr<HudElement> hud);
bool removeHud(u32 id);
void clearHud();
PlayerHud hud;
u32 hud_flags;
s32 hud_hotbar_itemcount;
@@ -236,7 +239,4 @@ protected:
v3f m_speed; // velocity; in BS-space
u16 m_wield_index = 0;
PlayerFovSpec m_fov_override_spec = { 0.0f, false, 0.0f };
private:
std::vector<std::unique_ptr<HudElement>> hud;
};
+5 -5
View File
@@ -360,7 +360,7 @@ int LuaLocalPlayer::l_hud_add(lua_State *L)
auto elem = std::make_unique<HudElement>();
read_hud_element(L, elem.get());
u32 id = player->addHud(std::move(elem));
u32 id = player->csm_hud.add(std::move(elem));
if (id == U32_MAX) {
return 0;
}
@@ -373,7 +373,7 @@ int LuaLocalPlayer::l_hud_remove(lua_State *L)
{
LocalPlayer *player = getobject(L, 1);
u32 id = luaL_checkinteger(L, 2);
lua_pushboolean(L, player->removeHud(id));
lua_pushboolean(L, player->csm_hud.remove(id));
return 1;
}
@@ -384,7 +384,7 @@ int LuaLocalPlayer::l_hud_change(lua_State *L)
u32 id = luaL_checkinteger(L, 2);
HudElement *element = player->getHud(id);
HudElement *element = player->csm_hud.get(id);
if (!element)
return 0;
@@ -403,7 +403,7 @@ int LuaLocalPlayer::l_hud_get(lua_State *L)
u32 id = luaL_checkinteger(L, -1);
HudElement *e = player->getHud(id);
HudElement *e = player->csm_hud.get(id);
if (!e) {
lua_pushnil(L);
return 1;
@@ -422,7 +422,7 @@ int LuaLocalPlayer::l_hud_get_all(lua_State *L)
lua_newtable(L);
u32 id = 0;
for (auto const &elem : player->getHudElements()) {
for (auto const &elem : player->csm_hud.getElements()) {
if (elem != nullptr) {
push_hud_element(L, elem.get());
lua_rawseti(L, -2, id);
+3 -3
View File
@@ -2014,7 +2014,7 @@ int ObjectRef::l_hud_change(lua_State *L)
u32 id = luaL_checkint(L, 2);
HudElement *elem = player->getHud(id);
HudElement *elem = player->hud.get(id);
if (elem == nullptr)
return 0;
@@ -2041,7 +2041,7 @@ int ObjectRef::l_hud_get(lua_State *L)
u32 id = luaL_checkint(L, 2);
HudElement *elem = player->getHud(id);
HudElement *elem = player->hud.get(id);
if (elem == nullptr)
return 0;
@@ -2060,7 +2060,7 @@ int ObjectRef::l_hud_get_all(lua_State *L)
lua_newtable(L);
u32 id = 0;
for (auto const &elem : player->getHudElements()) {
for (auto const &elem : player->hud.getElements()) {
if (elem != nullptr) {
push_hud_element(L, elem.get());
lua_rawseti(L, -2, id);
+4 -4
View File
@@ -1261,7 +1261,7 @@ PlayerSAO *Server::StageTwoClientInit(session_t peer_id)
m_env->addPlayer(player);
/* Clean up old HUD elements from previous sessions */
player->clearHud();
player->hud.clear();
/* Add object to environment */
PlayerSAO *playersao = sao.get();
@@ -3536,9 +3536,9 @@ u32 Server::hudAdd(RemotePlayer *player, std::unique_ptr<HudElement> form)
if (!player)
return -1;
u32 id = player->addHud(std::move(form));
u32 id = player->hud.add(std::move(form));
SendHUDAdd(player->getPeerId(), id, player->getHud(id));
SendHUDAdd(player->getPeerId(), id, player->hud.get(id));
return id;
}
@@ -3547,7 +3547,7 @@ bool Server::hudRemove(RemotePlayer *player, u32 id) {
if (!player)
return false;
if (!player->removeHud(id))
if (!player->hud.remove(id))
return false;
SendHUDRemove(player->getPeerId(), id);