Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Added support to disable built-in HUD elements
- Loading branch information
|
@@ -1433,6 +1433,9 @@ Player-only: (no-op for other objects) |
|
|
- 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: |
|
|
|
@@ -2114,6 +2114,20 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id) |
|
|
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 " |
|
|
|
@@ -163,7 +163,8 @@ enum ClientEventType |
|
|
CE_DELETE_PARTICLESPAWNER, |
|
|
CE_HUDADD, |
|
|
CE_HUDRM, |
|
|
CE_HUDCHANGE |
|
|
CE_HUDCHANGE, |
|
|
CE_HUD_BUILTIN_ENABLE |
|
|
}; |
|
|
|
|
|
struct ClientEvent |
|
@@ -243,6 +244,10 @@ struct ClientEvent |
|
|
std::string *sdata; |
|
|
u32 data; |
|
|
} hudchange; |
|
|
struct{ |
|
|
u32 id; |
|
|
u32 flag; |
|
|
} hudbuiltin; |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
@@ -94,6 +94,7 @@ SharedBuffer<u8> makePacket_TOCLIENT_TIME_OF_DAY(u16 time, float time_speed); |
|
|
TOCLIENT_HUD_ADD |
|
|
TOCLIENT_HUD_RM |
|
|
TOCLIENT_HUD_CHANGE |
|
|
TOCLIENT_HUD_BUILTIN_ENABLE |
|
|
*/ |
|
|
|
|
|
#define LATEST_PROTOCOL_VERSION 20 |
|
@@ -456,13 +457,13 @@ enum ToClientCommand |
|
|
v2f1000 offset |
|
|
*/ |
|
|
|
|
|
TOCLIENT_HUDRM = 0x50, |
|
|
TOCLIENT_HUDRM = 0x4a, |
|
|
/* |
|
|
u16 command |
|
|
u32 id |
|
|
*/ |
|
|
|
|
|
TOCLIENT_HUDCHANGE = 0x51, |
|
|
TOCLIENT_HUDCHANGE = 0x4b, |
|
|
/* |
|
|
u16 command |
|
|
u32 id |
|
@@ -472,6 +473,13 @@ enum ToClientCommand |
|
|
u8[len] data | |
|
|
u32 data] |
|
|
*/ |
|
|
|
|
|
TOCLIENT_HUD_BUILTIN_ENABLE = 0x4c, |
|
|
/* |
|
|
u16 command |
|
|
u8 id |
|
|
u8 flag |
|
|
*/ |
|
|
}; |
|
|
|
|
|
enum ToServerCommand |
|
|
|
@@ -2186,6 +2186,14 @@ void the_game( |
|
|
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; |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
@@ -3070,7 +3078,7 @@ void the_game( |
|
|
/* |
|
|
Wielded tool |
|
|
*/ |
|
|
if(show_hud) |
|
|
if(show_hud && (player->hud_flags & HUD_DRAW_WIELDITEM)) |
|
|
{ |
|
|
// Warning: This clears the Z buffer. |
|
|
camera.drawWieldedTool(); |
|
@@ -3094,7 +3102,7 @@ void the_game( |
|
|
/* |
|
|
Draw crosshair |
|
|
*/ |
|
|
if (show_hud) |
|
|
if (show_hud && (player->hud_flags & HUD_DRAW_CROSSHAIR)) |
|
|
hud.drawCrosshair(); |
|
|
|
|
|
} // timer |
|
@@ -3109,7 +3117,8 @@ void the_game( |
|
|
if (show_hud) |
|
|
{ |
|
|
hud.drawHotbar(v2s32(displaycenter.X, screensize.Y), |
|
|
client.getHP(), client.getPlayerItem()); |
|
|
client.getHP(), client.getPlayerItem(), |
|
|
player->hud_flags); |
|
|
} |
|
|
|
|
|
/* |
|
|
|
@@ -277,7 +277,7 @@ void Hud::drawStatbar(v2s32 pos, u16 corner, u16 drawdir, std::string texture, s |
|
|
} |
|
|
|
|
|
|
|
|
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; |
|
@@ -288,8 +288,10 @@ void Hud::drawHotbar(v2s32 centerlowerpos, s32 halfheartcount, u16 playeritem) { |
|
|
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)); |
|
|
} |
|
|
|
|
|
|
@@ -31,6 +31,11 @@ with this program; if not, write to the Free Software Foundation, Inc., |
|
|
#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 { |
|
@@ -66,6 +71,14 @@ struct HudElement { |
|
|
}; |
|
|
|
|
|
|
|
|
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++) { |
|
@@ -94,7 +107,7 @@ class Hud { |
|
|
IGameDef *gamedef; |
|
|
LocalPlayer *player; |
|
|
Inventory *inventory; |
|
|
|
|
|
|
|
|
v2u32 screensize; |
|
|
v2s32 displaycenter; |
|
|
s32 hotbar_imagesize; |
|
@@ -112,7 +125,7 @@ class Hud { |
|
|
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(); |
|
|
|
@@ -18,6 +18,7 @@ with this program; if not, write to the Free Software Foundation, Inc., |
|
|
*/ |
|
|
|
|
|
#include "player.h" |
|
|
#include "hud.h" |
|
|
#include "constants.h" |
|
|
#include "gamedef.h" |
|
|
#include "connection.h" // PEER_ID_INEXISTENT |
|
@@ -76,6 +77,11 @@ Player::Player(IGameDef *gamedef): |
|
|
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() |
|
|
|
@@ -245,6 +245,7 @@ class Player |
|
|
u32 keyPressed; |
|
|
|
|
|
std::vector<HudElement *> hud; |
|
|
u32 hud_flags; |
|
|
|
|
|
protected: |
|
|
IGameDef *m_gamedef; |
|
|
|
@@ -52,6 +52,15 @@ struct EnumString es_HudElementStat[] = |
|
|
{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 |
|
@@ -902,6 +911,33 @@ int ObjectRef::l_hud_get(lua_State *L) |
|
|
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) |
|
|
{ |
|
@@ -1012,6 +1048,7 @@ const luaL_reg ObjectRef::methods[] = { |
|
|
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} |
|
|
|
@@ -202,6 +202,9 @@ class ObjectRef |
|
|
// 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); |
|
|
|
|
|
|
@@ -3675,6 +3675,22 @@ void Server::SendHUDChange(u16 peer_id, u32 id, HudElementStat stat, void *value |
|
|
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 |
|
@@ -4664,6 +4680,14 @@ bool Server::hudChange(Player *player, u32 id, HudElementStat stat, void *data) |
|
|
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); |
|
|
|
@@ -540,6 +540,7 @@ class Server : public con::PeerHandler, public MapEventReceiver, |
|
|
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: |
|
|
|
|
@@ -583,6 +584,7 @@ class Server : public con::PeerHandler, public MapEventReceiver, |
|
|
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 |
|
|