Add ObjectRef.hud_set_hotbar_itemcount and add TOCLIENT_HUD_SET_PARAM
parent
730d316efe
commit
96fe1de832
|
@ -1399,6 +1399,8 @@ Player-only: (no-op for other objects)
|
||||||
^ flags: (is visible) hotbar, healthbar, crosshair, wielditem
|
^ flags: (is visible) hotbar, healthbar, crosshair, wielditem
|
||||||
^ pass a table containing a true/false value of each flag to be set or unset
|
^ 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
|
^ if a flag is nil, the flag is not modified
|
||||||
|
- hud_set_hotbar_itemcount(count): sets number of items in builtin hotbar
|
||||||
|
^ count: number of items, must be between 1 and 23
|
||||||
|
|
||||||
InvRef: Reference to an inventory
|
InvRef: Reference to an inventory
|
||||||
methods:
|
methods:
|
||||||
|
|
|
@ -2136,6 +2136,23 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
|
||||||
player->hud_flags &= ~mask;
|
player->hud_flags &= ~mask;
|
||||||
player->hud_flags |= flags;
|
player->hud_flags |= flags;
|
||||||
}
|
}
|
||||||
|
else if(command == TOCLIENT_HUD_SET_PARAM)
|
||||||
|
{
|
||||||
|
std::string datastring((char *)&data[2], datasize - 2);
|
||||||
|
std::istringstream is(datastring, std::ios_base::binary);
|
||||||
|
|
||||||
|
Player *player = m_env.getLocalPlayer();
|
||||||
|
assert(player != NULL);
|
||||||
|
|
||||||
|
u16 param = readU16(is);
|
||||||
|
std::string value = deSerializeString(is);
|
||||||
|
|
||||||
|
if(param == HUD_PARAM_HOTBAR_ITEMCOUNT && value.size() == 4){
|
||||||
|
s32 hotbar_itemcount = readS32((u8*) value.c_str());
|
||||||
|
if(hotbar_itemcount > 0 && hotbar_itemcount <= HUD_HOTBAR_ITEMCOUNT_MAX)
|
||||||
|
player->hud_hotbar_itemcount = hotbar_itemcount;
|
||||||
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
infostream<<"Client: Ignoring unknown command "
|
infostream<<"Client: Ignoring unknown command "
|
||||||
|
|
|
@ -480,6 +480,14 @@ enum ToClientCommand
|
||||||
u32 flags
|
u32 flags
|
||||||
u32 mask
|
u32 mask
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
TOCLIENT_HUD_SET_PARAM = 0x4d,
|
||||||
|
/*
|
||||||
|
u16 command
|
||||||
|
u16 param
|
||||||
|
u16 len
|
||||||
|
u8[len] value
|
||||||
|
*/
|
||||||
};
|
};
|
||||||
|
|
||||||
enum ToServerCommand
|
enum ToServerCommand
|
||||||
|
|
|
@ -1987,7 +1987,7 @@ void the_game(
|
||||||
{
|
{
|
||||||
s32 wheel = input->getMouseWheel();
|
s32 wheel = input->getMouseWheel();
|
||||||
u16 max_item = MYMIN(PLAYER_INVENTORY_SIZE-1,
|
u16 max_item = MYMIN(PLAYER_INVENTORY_SIZE-1,
|
||||||
hud.hotbar_itemcount-1);
|
player->hud_hotbar_itemcount-1);
|
||||||
|
|
||||||
if(wheel < 0)
|
if(wheel < 0)
|
||||||
{
|
{
|
||||||
|
@ -2011,7 +2011,7 @@ void the_game(
|
||||||
const KeyPress *kp = NumberKey + (i + 1) % 10;
|
const KeyPress *kp = NumberKey + (i + 1) % 10;
|
||||||
if(input->wasKeyDown(*kp))
|
if(input->wasKeyDown(*kp))
|
||||||
{
|
{
|
||||||
if(i < PLAYER_INVENTORY_SIZE && i < hud.hotbar_itemcount)
|
if(i < PLAYER_INVENTORY_SIZE && i < player->hud_hotbar_itemcount)
|
||||||
{
|
{
|
||||||
new_playeritem = i;
|
new_playeritem = i;
|
||||||
|
|
||||||
|
|
|
@ -43,7 +43,6 @@ Hud::Hud(video::IVideoDriver *driver, gui::IGUIEnvironment* guienv,
|
||||||
screensize = v2u32(0, 0);
|
screensize = v2u32(0, 0);
|
||||||
displaycenter = v2s32(0, 0);
|
displaycenter = v2s32(0, 0);
|
||||||
hotbar_imagesize = 48;
|
hotbar_imagesize = 48;
|
||||||
hotbar_itemcount = 8;
|
|
||||||
|
|
||||||
tsrc = gamedef->getTextureSource();
|
tsrc = gamedef->getTextureSource();
|
||||||
|
|
||||||
|
@ -286,6 +285,7 @@ void Hud::drawHotbar(v2s32 centerlowerpos, s32 halfheartcount, u16 playeritem) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
s32 hotbar_itemcount = player->hud_hotbar_itemcount;
|
||||||
s32 padding = hotbar_imagesize / 12;
|
s32 padding = hotbar_imagesize / 12;
|
||||||
s32 width = hotbar_itemcount * (hotbar_imagesize + padding * 2);
|
s32 width = hotbar_itemcount * (hotbar_imagesize + padding * 2);
|
||||||
v2s32 pos = centerlowerpos - v2s32(width / 2, hotbar_imagesize + padding * 2);
|
v2s32 pos = centerlowerpos - v2s32(width / 2, hotbar_imagesize + padding * 2);
|
||||||
|
|
|
@ -36,6 +36,11 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
#define HUD_FLAG_CROSSHAIR_VISIBLE (1 << 2)
|
#define HUD_FLAG_CROSSHAIR_VISIBLE (1 << 2)
|
||||||
#define HUD_FLAG_WIELDITEM_VISIBLE (1 << 3)
|
#define HUD_FLAG_WIELDITEM_VISIBLE (1 << 3)
|
||||||
|
|
||||||
|
#define HUD_PARAM_HOTBAR_ITEMCOUNT 1
|
||||||
|
|
||||||
|
#define HUD_HOTBAR_ITEMCOUNT_DEFAULT 8
|
||||||
|
#define HUD_HOTBAR_ITEMCOUNT_MAX 23
|
||||||
|
|
||||||
class Player;
|
class Player;
|
||||||
|
|
||||||
enum HudElementType {
|
enum HudElementType {
|
||||||
|
@ -102,7 +107,6 @@ public:
|
||||||
v2u32 screensize;
|
v2u32 screensize;
|
||||||
v2s32 displaycenter;
|
v2s32 displaycenter;
|
||||||
s32 hotbar_imagesize;
|
s32 hotbar_imagesize;
|
||||||
s32 hotbar_itemcount;
|
|
||||||
|
|
||||||
video::SColor crosshair_argb;
|
video::SColor crosshair_argb;
|
||||||
video::SColor selectionbox_argb;
|
video::SColor selectionbox_argb;
|
||||||
|
|
|
@ -81,6 +81,8 @@ Player::Player(IGameDef *gamedef):
|
||||||
|
|
||||||
hud_flags = HUD_FLAG_HOTBAR_VISIBLE | HUD_FLAG_HEALTHBAR_VISIBLE |
|
hud_flags = HUD_FLAG_HOTBAR_VISIBLE | HUD_FLAG_HEALTHBAR_VISIBLE |
|
||||||
HUD_FLAG_CROSSHAIR_VISIBLE | HUD_FLAG_WIELDITEM_VISIBLE;
|
HUD_FLAG_CROSSHAIR_VISIBLE | HUD_FLAG_WIELDITEM_VISIBLE;
|
||||||
|
|
||||||
|
hud_hotbar_itemcount = HUD_HOTBAR_ITEMCOUNT_DEFAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
Player::~Player()
|
Player::~Player()
|
||||||
|
|
|
@ -250,6 +250,7 @@ public:
|
||||||
|
|
||||||
std::vector<HudElement *> hud;
|
std::vector<HudElement *> hud;
|
||||||
u32 hud_flags;
|
u32 hud_flags;
|
||||||
|
s32 hud_hotbar_itemcount;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
IGameDef *m_gamedef;
|
IGameDef *m_gamedef;
|
||||||
|
|
|
@ -978,6 +978,23 @@ int ObjectRef::l_hud_set_flags(lua_State *L)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// hud_set_hotbar_itemcount(self, hotbar_itemcount)
|
||||||
|
int ObjectRef::l_hud_set_hotbar_itemcount(lua_State *L)
|
||||||
|
{
|
||||||
|
ObjectRef *ref = checkobject(L, 1);
|
||||||
|
Player *player = getplayer(ref);
|
||||||
|
if (player == NULL)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
s32 hotbar_itemcount = lua_tonumber(L, 2);
|
||||||
|
|
||||||
|
if (!STACK_TO_SERVER(L)->hudSetHotbarItemcount(player, hotbar_itemcount))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
lua_pushboolean(L, true);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
ObjectRef::ObjectRef(ServerActiveObject *object):
|
ObjectRef::ObjectRef(ServerActiveObject *object):
|
||||||
m_object(object)
|
m_object(object)
|
||||||
{
|
{
|
||||||
|
@ -1089,6 +1106,7 @@ const luaL_reg ObjectRef::methods[] = {
|
||||||
luamethod(ObjectRef, hud_change),
|
luamethod(ObjectRef, hud_change),
|
||||||
luamethod(ObjectRef, hud_get),
|
luamethod(ObjectRef, hud_get),
|
||||||
luamethod(ObjectRef, hud_set_flags),
|
luamethod(ObjectRef, hud_set_flags),
|
||||||
|
luamethod(ObjectRef, hud_set_hotbar_itemcount),
|
||||||
{0,0}
|
{0,0}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -209,6 +209,9 @@ private:
|
||||||
// hud_set_flags(self, flags)
|
// hud_set_flags(self, flags)
|
||||||
static int l_hud_set_flags(lua_State *L);
|
static int l_hud_set_flags(lua_State *L);
|
||||||
|
|
||||||
|
// hud_set_hotbar_itemcount(self, hotbar_itemcount)
|
||||||
|
static int l_hud_set_hotbar_itemcount(lua_State *L);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ObjectRef(ServerActiveObject *object);
|
ObjectRef(ServerActiveObject *object);
|
||||||
|
|
||||||
|
|
|
@ -3687,6 +3687,22 @@ void Server::SendHUDSetFlags(u16 peer_id, u32 flags, u32 mask)
|
||||||
m_con.Send(peer_id, 0, data, true);
|
m_con.Send(peer_id, 0, data, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Server::SendHUDSetParam(u16 peer_id, u16 param, const std::string &value)
|
||||||
|
{
|
||||||
|
std::ostringstream os(std::ios_base::binary);
|
||||||
|
|
||||||
|
// Write command
|
||||||
|
writeU16(os, TOCLIENT_HUD_SET_PARAM);
|
||||||
|
writeU16(os, param);
|
||||||
|
os<<serializeString(value);
|
||||||
|
|
||||||
|
// 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)
|
void Server::BroadcastChatMessage(const std::wstring &message)
|
||||||
{
|
{
|
||||||
for(std::map<u16, RemoteClient*>::iterator
|
for(std::map<u16, RemoteClient*>::iterator
|
||||||
|
@ -4684,6 +4700,18 @@ bool Server::hudSetFlags(Player *player, u32 flags, u32 mask) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Server::hudSetHotbarItemcount(Player *player, s32 hotbar_itemcount) {
|
||||||
|
if (!player)
|
||||||
|
return false;
|
||||||
|
if (hotbar_itemcount <= 0 || hotbar_itemcount > HUD_HOTBAR_ITEMCOUNT_MAX)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
std::ostringstream os(std::ios::binary);
|
||||||
|
writeS32(os, hotbar_itemcount);
|
||||||
|
SendHUDSetParam(player->peer_id, HUD_PARAM_HOTBAR_ITEMCOUNT, os.str());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void Server::notifyPlayers(const std::wstring msg)
|
void Server::notifyPlayers(const std::wstring msg)
|
||||||
{
|
{
|
||||||
BroadcastChatMessage(msg);
|
BroadcastChatMessage(msg);
|
||||||
|
|
|
@ -541,6 +541,7 @@ public:
|
||||||
bool hudRemove(Player *player, u32 id);
|
bool hudRemove(Player *player, u32 id);
|
||||||
bool hudChange(Player *player, u32 id, HudElementStat stat, void *value);
|
bool hudChange(Player *player, u32 id, HudElementStat stat, void *value);
|
||||||
bool hudSetFlags(Player *player, u32 flags, u32 mask);
|
bool hudSetFlags(Player *player, u32 flags, u32 mask);
|
||||||
|
bool hudSetHotbarItemcount(Player *player, s32 hotbar_itemcount);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
@ -585,6 +586,7 @@ private:
|
||||||
void SendHUDRemove(u16 peer_id, u32 id);
|
void SendHUDRemove(u16 peer_id, u32 id);
|
||||||
void SendHUDChange(u16 peer_id, u32 id, HudElementStat stat, void *value);
|
void SendHUDChange(u16 peer_id, u32 id, HudElementStat stat, void *value);
|
||||||
void SendHUDSetFlags(u16 peer_id, u32 flags, u32 mask);
|
void SendHUDSetFlags(u16 peer_id, u32 flags, u32 mask);
|
||||||
|
void SendHUDSetParam(u16 peer_id, u16 param, const std::string &value);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Send a node removal/addition event to all clients except ignore_id.
|
Send a node removal/addition event to all clients except ignore_id.
|
||||||
|
|
Loading…
Reference in New Issue