- hud_change(id, stat, value): change a value of a previously added HUD element
^ element stat values: position, name, scale, text, number, item, dir
- hud_get(id): gets the HUD element definition structure of the specified ID
+- hud_builtin_enable(what, flag): enable or disable built-in HUD items
+ ^ what: "hotbar", "healthbar", "crosshair", "wielditem"
+ ^ flag: true/false
InvRef: Reference to an inventory
methods:
event.hudchange.data = intdata;
m_client_event_queue.push_back(event);
}
+ else if(command == TOCLIENT_HUD_BUILTIN_ENABLE)
+ {
+ std::string datastring((char *)&data[2], datasize - 2);
+ std::istringstream is(datastring, std::ios_base::binary);
+
+ u32 id = readU8(is);
+ bool flag = (readU8(is) ? true : false);
+
+ ClientEvent event;
+ event.type = CE_HUD_BUILTIN_ENABLE;
+ event.hudbuiltin.id = (HudBuiltinElement)id;
+ event.hudbuiltin.flag = flag;
+ m_client_event_queue.push_back(event);
+ }
else
{
infostream<<"Client: Ignoring unknown command "
CE_DELETE_PARTICLESPAWNER,
CE_HUDADD,
CE_HUDRM,
- CE_HUDCHANGE
+ CE_HUDCHANGE,
+ CE_HUD_BUILTIN_ENABLE
};
struct ClientEvent
std::string *sdata;
u32 data;
} hudchange;
+ struct{
+ u32 id;
+ u32 flag;
+ } hudbuiltin;
};
};
TOCLIENT_HUD_ADD
TOCLIENT_HUD_RM
TOCLIENT_HUD_CHANGE
+ TOCLIENT_HUD_BUILTIN_ENABLE
*/
#define LATEST_PROTOCOL_VERSION 20
v2f1000 offset
*/
- TOCLIENT_HUDRM = 0x50,
+ TOCLIENT_HUDRM = 0x4a,
/*
u16 command
u32 id
*/
- TOCLIENT_HUDCHANGE = 0x51,
+ TOCLIENT_HUDCHANGE = 0x4b,
/*
u16 command
u32 id
u8[len] data |
u32 data]
*/
+
+ TOCLIENT_HUD_BUILTIN_ENABLE = 0x4c,
+ /*
+ u16 command
+ u8 id
+ u8 flag
+ */
};
enum ToServerCommand
delete event.hudchange.v2fdata;
delete event.hudchange.sdata;
}
+ else if (event.type == CE_HUD_BUILTIN_ENABLE) {
+ u32 bit = (u32)event.hudbuiltin.id;
+ u32 mask = 1 << bit;
+ if (event.hudbuiltin.flag)
+ player->hud_flags |= mask;
+ else
+ player->hud_flags &= ~mask;
+ }
}
}
/*
Wielded tool
*/
- if(show_hud)
+ if(show_hud && (player->hud_flags & HUD_DRAW_WIELDITEM))
{
// Warning: This clears the Z buffer.
camera.drawWieldedTool();
/*
Draw crosshair
*/
- if (show_hud)
+ if (show_hud && (player->hud_flags & HUD_DRAW_CROSSHAIR))
hud.drawCrosshair();
} // timer
if (show_hud)
{
hud.drawHotbar(v2s32(displaycenter.X, screensize.Y),
- client.getHP(), client.getPlayerItem());
+ client.getHP(), client.getPlayerItem(),
+ player->hud_flags);
}
/*
}
-void Hud::drawHotbar(v2s32 centerlowerpos, s32 halfheartcount, u16 playeritem) {
+void Hud::drawHotbar(v2s32 centerlowerpos, s32 halfheartcount, u16 playeritem, u32 flags) {
InventoryList *mainlist = inventory->getList("main");
if (mainlist == NULL) {
errorstream << "draw_hotbar(): mainlist == NULL" << std::endl;
s32 width = hotbar_itemcount * (hotbar_imagesize + padding * 2);
v2s32 pos = centerlowerpos - v2s32(width / 2, hotbar_imagesize + padding * 2);
- drawItem(pos, hotbar_imagesize, hotbar_itemcount, mainlist, playeritem + 1, 0);
- drawStatbar(pos - v2s32(0, 4), HUD_CORNER_LOWER, HUD_DIR_LEFT_RIGHT,
+ if (flags & HUD_DRAW_HOTBAR)
+ drawItem(pos, hotbar_imagesize, hotbar_itemcount, mainlist, playeritem + 1, 0);
+ if (flags & HUD_DRAW_HEALTHBAR)
+ drawStatbar(pos - v2s32(0, 4), HUD_CORNER_LOWER, HUD_DIR_LEFT_RIGHT,
"heart.png", halfheartcount, v2s32(0, 0));
}
#define HUD_CORNER_LOWER 1
#define HUD_CORNER_CENTER 2
+#define HUD_DRAW_HOTBAR (1 << 0)
+#define HUD_DRAW_HEALTHBAR (1 << 1)
+#define HUD_DRAW_CROSSHAIR (1 << 2)
+#define HUD_DRAW_WIELDITEM (1 << 3)
+
class Player;
enum HudElementType {
};
+enum HudBuiltinElement {
+ HUD_BUILTIN_HOTBAR = 0,
+ HUD_BUILTIN_HEALTHBAR,
+ HUD_BUILTIN_CROSSHAIR,
+ HUD_BUILTIN_WIELDITEM
+};
+
+
inline u32 hud_get_free_id(Player *player) {
size_t size = player->hud.size();
for (size_t i = 0; i != size; i++) {
IGameDef *gamedef;
LocalPlayer *player;
Inventory *inventory;
-
+
v2u32 screensize;
v2s32 displaycenter;
s32 hotbar_imagesize;
void drawLuaElements();
void drawStatbar(v2s32 pos, u16 corner, u16 drawdir, std::string texture, s32 count, v2s32 offset);
- void drawHotbar(v2s32 centerlowerpos, s32 halfheartcount, u16 playeritem);
+ void drawHotbar(v2s32 centerlowerpos, s32 halfheartcount, u16 playeritem, u32 flags);
void resizeHotbar();
void drawCrosshair();
*/
#include "player.h"
+#include "hud.h"
#include "constants.h"
#include "gamedef.h"
#include "connection.h" // PEER_ID_INEXISTENT
physics_override_speed = 1;
physics_override_jump = 1;
physics_override_gravity = 1;
+
+ hud_flags = HUD_DRAW_HOTBAR
+ | HUD_DRAW_HEALTHBAR
+ | HUD_DRAW_CROSSHAIR
+ | HUD_DRAW_WIELDITEM;
}
Player::~Player()
u32 keyPressed;
std::vector<HudElement *> hud;
+ u32 hud_flags;
protected:
IGameDef *m_gamedef;
{0, NULL},
};
+struct EnumString es_HudBuiltinElement[] =
+{
+ {HUD_BUILTIN_HOTBAR, "hotbar"},
+ {HUD_BUILTIN_HEALTHBAR, "healthbar"},
+ {HUD_BUILTIN_CROSSHAIR, "crosshair"},
+ {HUD_BUILTIN_WIELDITEM, "wielditem"},
+ {0, NULL},
+};
+
/*
ObjectRef
return 1;
}
+// hud_builtin_enable(self, id, flag)
+int ObjectRef::l_hud_builtin_enable(lua_State *L)
+{
+ ObjectRef *ref = checkobject(L, 1);
+ Player *player = getplayer(ref);
+ if (player == NULL)
+ return 0;
+
+ HudBuiltinElement id;
+ int id_i;
+
+ std::string s(lua_tostring(L, 2));
+
+ // Return nil if component is not in enum
+ if (!string_to_enum(es_HudBuiltinElement, id_i, s))
+ return 0;
+
+ id = (HudBuiltinElement)id_i;
+
+ bool flag = (bool)lua_toboolean(L, 3);
+
+ bool ok = get_server(L)->hudBuiltinEnable(player, id, flag);
+
+ lua_pushboolean(L, (int)ok);
+ return 1;
+}
+
ObjectRef::ObjectRef(ServerActiveObject *object):
m_object(object)
{
luamethod(ObjectRef, hud_remove),
luamethod(ObjectRef, hud_change),
luamethod(ObjectRef, hud_get),
+ luamethod(ObjectRef, hud_builtin_enable),
//luamethod(ObjectRef, hud_lock_next_bar),
//luamethod(ObjectRef, hud_unlock_bar),
{0,0}
// hud_get(self, id)
static int l_hud_get(lua_State *L);
+ // hud_builtin_enable(self, id, flag)
+ static int l_hud_builtin_enable(lua_State *L);
+
public:
ObjectRef(ServerActiveObject *object);
m_con.Send(peer_id, 0, data, true);
}
+void Server::SendHUDBuiltinEnable(u16 peer_id, u32 id, bool flag)
+{
+ std::ostringstream os(std::ios_base::binary);
+
+ // Write command
+ writeU16(os, TOCLIENT_HUD_BUILTIN_ENABLE);
+ writeU8(os, id);
+ writeU8(os, (flag ? 1 : 0));
+
+ // Make data buffer
+ std::string s = os.str();
+ SharedBuffer<u8> data((u8*)s.c_str(), s.size());
+ // Send as reliable
+ m_con.Send(peer_id, 0, data, true);
+}
+
void Server::BroadcastChatMessage(const std::wstring &message)
{
for(std::map<u16, RemoteClient*>::iterator
return true;
}
+bool Server::hudBuiltinEnable(Player *player, u32 id, bool flag) {
+ if (!player)
+ return false;
+
+ SendHUDBuiltinEnable(player->peer_id, id, flag);
+ return true;
+}
+
void Server::notifyPlayers(const std::wstring msg)
{
BroadcastChatMessage(msg);
u32 hudAdd(Player *player, HudElement *element);
bool hudRemove(Player *player, u32 id);
bool hudChange(Player *player, u32 id, HudElementStat stat, void *value);
+ bool hudBuiltinEnable(Player *player, u32 id, bool flag);
private:
void SendHUDAdd(u16 peer_id, u32 id, HudElement *form);
void SendHUDRemove(u16 peer_id, u32 id);
void SendHUDChange(u16 peer_id, u32 id, HudElementStat stat, void *value);
+ void SendHUDBuiltinEnable(u16 peer_id, u32 id, bool flag);
/*
Send a node removal/addition event to all clients except ignore_id.
Additionally, if far_players!=NULL, players further away than