diff --git a/modules/game/game.lua b/modules/game/game.lua index 50aab512..bf8fd160 100644 --- a/modules/game/game.lua +++ b/modules/game/game.lua @@ -1,4 +1,5 @@ require 'textmessage' +require 'vip' -- private functions local function onGameKeyPress(self, keyCode, keyChar, keyboardModifiers) @@ -18,6 +19,8 @@ local function createMainInterface() Game.gameUi = loadUI('/game/ui/gameinterface.otui', UI.root) Game.gameMapUi = Game.gameUi:getChildById('gameMap') Game.gameUi.onKeyPress = onGameKeyPress + + createVipWindow() end diff --git a/modules/game/ui/viplist.otui b/modules/game/ui/viplist.otui new file mode 100644 index 00000000..9d868754 --- /dev/null +++ b/modules/game/ui/viplist.otui @@ -0,0 +1,12 @@ +Window + id: vipWindow + title: VIP + size: 200 200 + + TextList + id: vipList + anchors.fill: parent + margin.top: 19 + margin.bottom: 3 + margin.left: 3 + margin.right: 3 diff --git a/modules/game/vip.lua b/modules/game/vip.lua new file mode 100644 index 00000000..0f96aa20 --- /dev/null +++ b/modules/game/vip.lua @@ -0,0 +1,35 @@ +vipWindow = nil + +function createVipWindow() + vipWindow = loadUI("/game/ui/viplist.otui", Game.gameUi) +end + +function Game.onAddVip(id, name, online) + local vipList = vipWindow:getChildById('vipList') + + local label = UILabel.create() + vipList:addChild(label) + label:setId('vip' .. id) + label:setText(name) + + if online then + label:setForegroundColor('#00ff00') + else + label:setForegroundColor('#ff0000') + end + + label.vipOnline = online +end + +function Game.onVipStateChange(id, online) + local vipList = vipWindow:getChildById('vipList') + local label = vipList:getChildById('vip' .. id) + + if online then + label:setForegroundColor('#00ff00') + else + label:setForegroundColor('#ff0000') + end + + label.vipOnline = online +end diff --git a/src/otclient/net/protocolgameparse.cpp b/src/otclient/net/protocolgameparse.cpp index d8d7a28f..c9a4f38e 100644 --- a/src/otclient/net/protocolgameparse.cpp +++ b/src/otclient/net/protocolgameparse.cpp @@ -801,19 +801,31 @@ void ProtocolGame::parseOutfitWindow(InputMessage& msg) void ProtocolGame::parseVipState(InputMessage& msg) { - msg.getU32(); // player id - msg.getString(); // player name - msg.getU8(); // online + uint32 id = msg.getU32(); + std::string name = msg.getString(); + bool online = msg.getU8() != 0; + + g_dispatcher.addEvent([=] { + g_lua.callGlobalField("Game", "onAddVip", id, name, online); + }); } void ProtocolGame::parseVipLogin(InputMessage& msg) { - msg.getU32(); // player id + uint32 id = msg.getU32(); + + g_dispatcher.addEvent([=] { + g_lua.callGlobalField("Game", "onVipStateChange", id, true); + }); } void ProtocolGame::parseVipLogout(InputMessage& msg) { - msg.getU32(); // player id + uint32 id = msg.getU32(); + + g_dispatcher.addEvent([=] { + g_lua.callGlobalField("Game", "onVipStateChange", id, false); + }); } void ProtocolGame::parseShowTutorial(InputMessage& msg)