Generalize hud_builtin_enable into hud_set_flags
authorkwolekr <kwolekr@minetest.net>
Thu, 25 Apr 2013 23:27:22 +0000 (19:27 -0400)
committerkwolekr <kwolekr@minetest.net>
Thu, 25 Apr 2013 23:37:36 +0000 (19:37 -0400)
12 files changed:
doc/lua_api.txt
src/client.cpp
src/client.h
src/clientserver.h
src/game.cpp
src/hud.cpp
src/hud.h
src/player.cpp
src/scriptapi_object.cpp
src/scriptapi_object.h
src/server.cpp
src/server.h

index 5b1942aefb3ee0fd80e3d2b594d3153f8cf2ad06..07fb1ccd684a353c1892ecf73c6230b72d39a91e 100644 (file)
@@ -1434,9 +1434,10 @@ 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
+- hud_set_flags(flags): sets specified HUD flags to true/false
+  ^ flags: (is visible) hotbar, healthbar, crosshair, wielditem
+  ^ pass a table containing a true/false value of each flag to be set or unset
+  ^ if a flag is nil, the flag is not modified
 
 InvRef: Reference to an inventory
 methods:
index 941e9e8820c018997302c78f2a2e8220fc490a50..56505c66c07875ca525ee5ed03cb254d244bedcd 100644 (file)
@@ -2097,8 +2097,8 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
                u32 id  = readU32(is);
                u8 stat = (HudElementStat)readU8(is);
                
-               if (stat == HUD_STAT_POS || stat == HUD_STAT_SCALE
-                || stat == HUD_STAT_ALIGN || stat == HUD_STAT_OFFSET)
+               if (stat == HUD_STAT_POS || stat == HUD_STAT_SCALE ||
+                       stat == HUD_STAT_ALIGN || stat == HUD_STAT_OFFSET)
                        v2fdata = readV2F1000(is);
                else if (stat == HUD_STAT_NAME || stat == HUD_STAT_TEXT)
                        sdata = deSerializeString(is);
@@ -2114,19 +2114,19 @@ 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)
+       else if(command == TOCLIENT_HUD_SET_FLAGS)
        {       
                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);
+               Player *player = m_env.getLocalPlayer();
+               assert(player != NULL);
 
-               ClientEvent event;
-               event.type = CE_HUD_BUILTIN_ENABLE;
-               event.hudbuiltin.id     = (HudBuiltinElement)id;
-               event.hudbuiltin.flag   = flag;
-               m_client_event_queue.push_back(event);
+               u32 flags = readU32(is);
+               u32 mask  = readU32(is);
+               
+               player->hud_flags &= ~mask;
+               player->hud_flags |= flags;
        }
        else
        {
index 33872864e6c31d9bf705d1223e4fe0e84cb95bb0..67ba6c5659f3172bdac1d47817688ad127fc3dce 100644 (file)
@@ -163,8 +163,7 @@ enum ClientEventType
        CE_DELETE_PARTICLESPAWNER,
        CE_HUDADD,
        CE_HUDRM,
-       CE_HUDCHANGE,
-       CE_HUD_BUILTIN_ENABLE
+       CE_HUDCHANGE
 };
 
 struct ClientEvent
@@ -244,10 +243,6 @@ struct ClientEvent
                        std::string *sdata;
                        u32 data;
                } hudchange;
-               struct{
-                       u32 id;
-                       u32 flag;
-               } hudbuiltin;
        };
 };
 
index 114b04d13b452ce1389e55b1b3053cb8fa9a176b..cfa87ada7323aa4a9abab13eef37e534b238f09c 100644 (file)
@@ -474,11 +474,11 @@ enum ToClientCommand
                 u32 data]
        */
 
-       TOCLIENT_HUD_BUILTIN_ENABLE = 0x4c,
+       TOCLIENT_HUD_SET_FLAGS = 0x4c,
        /*
                u16 command
-               u8 id
-               u8 flag
+               u32 flags
+               u32 mask
        */
 };
 
index e3251bf65c45383089008f233f5771ab48c373ab..189003e4caa262489f84faef07eff6e1d79ba900 100644 (file)
@@ -2186,14 +2186,6 @@ 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;
-                               }
                        }
                }
                
@@ -3078,7 +3070,7 @@ void the_game(
                /*
                        Wielded tool
                */
-               if(show_hud && (player->hud_flags & HUD_DRAW_WIELDITEM))
+               if(show_hud && (player->hud_flags & HUD_FLAG_WIELDITEM_VISIBLE))
                {
                        // Warning: This clears the Z buffer.
                        camera.drawWieldedTool();
@@ -3102,7 +3094,7 @@ void the_game(
                /*
                        Draw crosshair
                */
-               if (show_hud && (player->hud_flags & HUD_DRAW_CROSSHAIR))
+               if (show_hud)
                        hud.drawCrosshair();
                        
                } // timer
@@ -3117,8 +3109,7 @@ void the_game(
                if (show_hud)
                {
                        hud.drawHotbar(v2s32(displaycenter.X, screensize.Y),
-                                       client.getHP(), client.getPlayerItem(),
-                                       player->hud_flags);
+                                       client.getHP(), client.getPlayerItem());
                }
 
                /*
index 8daadad37028c05eddfe98e4128b5645de92c7d7..cf53354b214fecfb6bf05b5c959c64d735939276 100644 (file)
@@ -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, u32 flags) {
+void Hud::drawHotbar(v2s32 centerlowerpos, s32 halfheartcount, u16 playeritem) {
        InventoryList *mainlist = inventory->getList("main");
        if (mainlist == NULL) {
                errorstream << "draw_hotbar(): mainlist == NULL" << std::endl;
@@ -288,19 +288,21 @@ void Hud::drawHotbar(v2s32 centerlowerpos, s32 halfheartcount, u16 playeritem, u
        s32 width = hotbar_itemcount * (hotbar_imagesize + padding * 2);
        v2s32 pos = centerlowerpos - v2s32(width / 2, hotbar_imagesize + padding * 2);
        
-       if (flags & HUD_DRAW_HOTBAR)
+       if (player->hud_flags & HUD_FLAG_HOTBAR_VISIBLE)
                drawItem(pos, hotbar_imagesize, hotbar_itemcount, mainlist, playeritem + 1, 0);
-       if (flags & HUD_DRAW_HEALTHBAR)
+       if (player->hud_flags & HUD_FLAG_HEALTHBAR_VISIBLE)
                drawStatbar(pos - v2s32(0, 4), HUD_CORNER_LOWER, HUD_DIR_LEFT_RIGHT,
                                "heart.png", halfheartcount, v2s32(0, 0));
 }
 
 
 void Hud::drawCrosshair() {
-       driver->draw2DLine(displaycenter - v2s32(10, 0),
-                       displaycenter + v2s32(10, 0), crosshair_argb);
-       driver->draw2DLine(displaycenter - v2s32(0, 10),
-                       displaycenter + v2s32(0, 10), crosshair_argb);
+       if (player->hud_flags & HUD_FLAG_CROSSHAIR_VISIBLE) {
+               driver->draw2DLine(displaycenter - v2s32(10, 0),
+                               displaycenter + v2s32(10, 0), crosshair_argb);
+               driver->draw2DLine(displaycenter - v2s32(0, 10),
+                               displaycenter + v2s32(0, 10), crosshair_argb);
+       }
 }
 
 
index e0d7ccd6f6a60ad25b37421d933e45ce655f87c8..405e911760c9f567f96854dfd1dde970ad221b89 100644 (file)
--- a/src/hud.h
+++ b/src/hud.h
@@ -31,10 +31,10 @@ 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)
+#define HUD_FLAG_HOTBAR_VISIBLE    (1 << 0)
+#define HUD_FLAG_HEALTHBAR_VISIBLE (1 << 1)
+#define HUD_FLAG_CROSSHAIR_VISIBLE (1 << 2)
+#define HUD_FLAG_WIELDITEM_VISIBLE (1 << 3)
 
 class Player;
 
@@ -71,14 +71,6 @@ 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++) {
@@ -123,9 +115,10 @@ public:
        void drawItem(v2s32 upperleftpos, s32 imgsize, s32 itemcount,
                InventoryList *mainlist, u16 selectitem, u16 direction);
        void drawLuaElements();
-       void drawStatbar(v2s32 pos, u16 corner, u16 drawdir, std::string texture, s32 count, v2s32 offset);
+       void drawStatbar(v2s32 pos, u16 corner, u16 drawdir,
+                                        std::string texture, s32 count, v2s32 offset);
        
-       void drawHotbar(v2s32 centerlowerpos, s32 halfheartcount, u16 playeritem, u32 flags);
+       void drawHotbar(v2s32 centerlowerpos, s32 halfheartcount, u16 playeritem);
        void resizeHotbar();
        
        void drawCrosshair();
index d3e16810ff51a738353002288736437e33a3430d..34f0fda089da0c3b82d0847f19a283d5c2102b10 100644 (file)
@@ -54,35 +54,33 @@ Player::Player(IGameDef *gamedef):
        inventory.addList("craftresult", 1);
 
        // Can be redefined via Lua
-       inventory_formspec =  "size[8,7.5]"
+       inventory_formspec = "size[8,7.5]"
                //"image[1,0.6;1,2;player.png]"
                "list[current_player;main;0,3.5;8,4;]"
                "list[current_player;craft;3,0;3,3;]"
                "list[current_player;craftpreview;7,1;1,1;]";
 
        // Initialize movement settings at default values, so movement can work if the server fails to send them
-       movement_acceleration_default = 3 * BS;
-       movement_acceleration_air = 2 * BS;
-       movement_acceleration_fast = 10 * BS;
-       movement_speed_walk = 4 * BS;
-       movement_speed_crouch = 1.35 * BS;
-       movement_speed_fast = 20 * BS;
-       movement_speed_climb = 2 * BS;
-       movement_speed_jump = 6.5 * BS;
-       movement_liquid_fluidity = 1 * BS;
-       movement_liquid_fluidity_smooth = 0.5 * BS;
-       movement_liquid_sink = 10 * BS;
-       movement_gravity = 9.81 * BS;
+       movement_acceleration_default   = 3    * BS;
+       movement_acceleration_air       = 2    * BS;
+       movement_acceleration_fast      = 10   * BS;
+       movement_speed_walk             = 4    * BS;
+       movement_speed_crouch           = 1.35 * BS;
+       movement_speed_fast             = 20   * BS;
+       movement_speed_climb            = 2    * BS;
+       movement_speed_jump             = 6.5  * BS;
+       movement_liquid_fluidity        = 1    * BS;
+       movement_liquid_fluidity_smooth = 0.5  * BS;
+       movement_liquid_sink            = 10   * BS;
+       movement_gravity                = 9.81 * BS;
 
        // Movement overrides are multipliers and must be 1 by default
-       physics_override_speed = 1;
-       physics_override_jump = 1;
+       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;
+       hud_flags = HUD_FLAG_HOTBAR_VISIBLE | HUD_FLAG_HEALTHBAR_VISIBLE |
+                        HUD_FLAG_CROSSHAIR_VISIBLE | HUD_FLAG_WIELDITEM_VISIBLE;
 }
 
 Player::~Player()
index e2eec5104c7f067b7d93f25ec060c97bf89c41a3..4dfdeb8c88ee85a6aa30f63ef059d7451b5b0866 100644 (file)
@@ -54,10 +54,10 @@ struct EnumString es_HudElementStat[] =
 
 struct EnumString es_HudBuiltinElement[] =
 {
-       {HUD_BUILTIN_HOTBAR,           "hotbar"},
-       {HUD_BUILTIN_HEALTHBAR,        "healthbar"},
-       {HUD_BUILTIN_CROSSHAIR,        "crosshair"},
-       {HUD_BUILTIN_WIELDITEM,        "wielditem"},
+       {HUD_FLAG_HOTBAR_VISIBLE,    "hotbar"},
+       {HUD_FLAG_HEALTHBAR_VISIBLE, "healthbar"},
+       {HUD_FLAG_CROSSHAIR_VISIBLE, "crosshair"},
+       {HUD_FLAG_WIELDITEM_VISIBLE, "wielditem"},
        {0, NULL},
 };
 
@@ -911,30 +911,29 @@ 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)
+// hud_set_flags(self, flags)
+int ObjectRef::l_hud_set_flags(lua_State *L)
 {
        ObjectRef *ref = checkobject(L, 1);
        Player *player = getplayer(ref);
        if (player == NULL)
                return 0;
 
-       HudBuiltinElement id;
-       int id_i;
+       u32 flags = 0;
+       u32 mask  = 0;
+       bool flag;
        
-       std::string s(lua_tostring(L, 2));
-       
-       // Return nil if component is not in enum
-       if (!string_to_enum(es_HudBuiltinElement, id_i, s))
+       const EnumString *esp = es_HudBuiltinElement;
+       for (int i = 0; esp[i].str; i++) {
+               if (getboolfield(L, 2, esp[i].str, flag)) {
+                       flags |= esp[i].num * flag;
+                       mask  |= esp[i].num;
+               }
+       }
+       if (!get_server(L)->hudSetFlags(player, flags, mask))
                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);
+       lua_pushboolean(L, true);
        return 1;
 }
 
@@ -1048,9 +1047,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),
+       luamethod(ObjectRef, hud_set_flags),
        {0,0}
 };
 
index 81e8cda3347b59b8367fe0eac77e8a0c1e1db018..82535ee94fdfd8ee02ffbdcf2d1f634252fc68f9 100644 (file)
@@ -202,8 +202,8 @@ private:
        // 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);
+       // hud_set_flags(self, flags)
+       static int l_hud_set_flags(lua_State *L);
 
 public:
        ObjectRef(ServerActiveObject *object);
index a93d887e288e88ed3cce1faef4c71b8c33685423..d5e5051905a28fa2410b1178d26c1a113251d6f8 100644 (file)
@@ -3675,18 +3675,18 @@ 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)
+void Server::SendHUDSetFlags(u16 peer_id, u32 flags, u32 mask)
 {
        std::ostringstream os(std::ios_base::binary);
 
        // Write command
-       writeU16(os, TOCLIENT_HUD_BUILTIN_ENABLE);
-       writeU8(os, id);
-       writeU8(os, (flag ? 1 : 0));
+       writeU16(os, TOCLIENT_HUD_SET_FLAGS);
+       writeU32(os, flags);
+       writeU32(os, mask);
 
        // Make data buffer
        std::string s = os.str();
-       SharedBuffer<u8> data((u8*)s.c_str(), s.size());
+       SharedBuffer<u8> data((u8 *)s.c_str(), s.size());
        // Send as reliable
        m_con.Send(peer_id, 0, data, true);
 }
@@ -4680,11 +4680,11 @@ bool Server::hudChange(Player *player, u32 id, HudElementStat stat, void *data)
        return true;
 }
 
-bool Server::hudBuiltinEnable(Player *player, u32 id, bool flag) {
+bool Server::hudSetFlags(Player *player, u32 flags, u32 mask) {
        if (!player)
                return false;
 
-       SendHUDBuiltinEnable(player->peer_id, id, flag);
+       SendHUDSetFlags(player->peer_id, flags, mask);
        return true;
 }
 
index b951ae53fbab8f4ac0280d52ff20c2eb4ade7e73..dcd007d23f3e19a1f2993bd74dec472c28afed32 100644 (file)
@@ -540,7 +540,7 @@ public:
        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);
+       bool hudSetFlags(Player *player, u32 flags, u32 mask);
        
 private:
 
@@ -584,7 +584,8 @@ 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);
+       void SendHUDSetFlags(u16 peer_id, u32 flags, u32 mask);
+       
        /*
                Send a node removal/addition event to all clients except ignore_id.
                Additionally, if far_players!=NULL, players further away than