diff --git a/modules/client_topmenu/topmenu.lua b/modules/client_topmenu/topmenu.lua index bdfd89d2..5ad066c3 100644 --- a/modules/client_topmenu/topmenu.lua +++ b/modules/client_topmenu/topmenu.lua @@ -25,8 +25,8 @@ function TopMenu.init() TopMenu.addRightButton('logoutButton', 'Logout (Ctrl+Q)', '/core_styles/icons/logout.png', onLogout) Keyboard.bindKeyDown('Ctrl+Q', onLogout) - connect(Game, { onLogin = TopMenu.showGameButtons, - onLogout = TopMenu.hideGameButtons }) + connect(Game, { onGameStart = TopMenu.showGameButtons, + onGameEnd = TopMenu.hideGameButtons }) end function TopMenu.terminate() @@ -37,8 +37,8 @@ function TopMenu.terminate() topMenu:destroy() topMenu = nil - disconnect(Game, { onLogin = TopMenu.showGameButtons, - onLogout = TopMenu.hideGameButtons }) + disconnect(Game, { onGameStart = TopMenu.showGameButtons, + onGameEnd = TopMenu.hideGameButtons }) TopMenu = nil end diff --git a/modules/game/game.lua b/modules/game/game.lua index 21d8cb4e..52b6e302 100644 --- a/modules/game/game.lua +++ b/modules/game/game.lua @@ -108,5 +108,5 @@ local function onApplicationClose() end setonclose(onApplicationClose) -connect(Game, { onLogin = Game.createInterface }, true) -connect(Game, { onLogout = Game.destroyInterface }) +connect(Game, { onGameStart = Game.createInterface }, true) +connect(Game, { onGameEnd = Game.destroyInterface }) diff --git a/modules/game_combatcontrols/combatcontrols.lua b/modules/game_combatcontrols/combatcontrols.lua index 521d6501..462ff259 100644 --- a/modules/game_combatcontrols/combatcontrols.lua +++ b/modules/game_combatcontrols/combatcontrols.lua @@ -66,8 +66,8 @@ function CombatControls.init() connect(fightModeRadioGroup, { onSelectionChange = onFightModeChange }) connect(chaseModeButton, { onCheckChange = onChaseModeChange }) connect(safeFightButton, { onCheckChange = onSafeFightChange }) - connect(Game, { onLogin = CombatControls.online }) - connect(Game, { onLogout = CombatControls.offline }) + connect(Game, { onGameStart = CombatControls.online }) + connect(Game, { onGameEnd = CombatControls.offline }) if Game.isOnline() then CombatControls.online() @@ -94,8 +94,8 @@ function CombatControls.terminate() combatControlsWindow:destroy() combatControlsWindow = nil - disconnect(Game, { onLogin = CombatControls.online }) - disconnect(Game, { onLogout = CombatControls.offline }) + disconnect(Game, { onGameStart = CombatControls.online }) + disconnect(Game, { onGameEnd = CombatControls.offline }) CombatControls = nil end diff --git a/modules/game_console/console.lua b/modules/game_console/console.lua index 86739ccd..dede9fb0 100644 --- a/modules/game_console/console.lua +++ b/modules/game_console/console.lua @@ -365,8 +365,8 @@ local function onChannelList(channelList) end end -connect(Game, { onLogin = Console.create, - onLogout = Console.destroy, +connect(Game, { onGameStart = Console.create, + onGameEnd = Console.destroy, onCreatureSpeak = onCreatureSpeak, onChannelList = onChannelList, onOpenChannel = onOpenChannel, diff --git a/modules/game_containers/containers.lua b/modules/game_containers/containers.lua index 55fcabd4..56fb2d5a 100644 --- a/modules/game_containers/containers.lua +++ b/modules/game_containers/containers.lua @@ -43,7 +43,7 @@ function Containers.onContainerOpen(containerId, itemId, name, capacity, hasPare itemWidget:setStyle('Item') container:addChild(itemWidget) itemWidget.position = {x=65535, y=containerId+64, z=i-1} - + if i <= #items then local item = items[i] item:setPosition(itemWidget.position) @@ -70,7 +70,7 @@ function Containers.onContainerAddItem(containerId, item) while i >= 1 do local itemWidget = container:getChildByIndex(i) if not itemWidget then return end - + local nextItemWidget = container:getChildByIndex(i+1) if not nextItemWidget then return end @@ -79,7 +79,7 @@ function Containers.onContainerAddItem(containerId, item) swapItem:setPosition(nextItemWidget.position) nextItemWidget:setItem(swapItem) end - + i = i - 1 end @@ -94,7 +94,7 @@ end function Containers.onContainerUpdateItem(containerId, slot, item) local container = m_containers[containerId] if not container then return end - + local itemWidget = container:getChildByIndex(slot + 1) if not itemWidget then return end itemWidget:setItem(item) @@ -104,35 +104,35 @@ end function Containers.onContainerRemoveItem(containerId, slot) local container = m_containers[containerId] if not container then return end - + local itemWidget = container:getChildByIndex(slot+1) if not itemWidget then return end itemWidget:setItem(nil) - + for i=slot,container.itemCount-2 do local itemWidget = container:getChildByIndex(i+1) if not itemWidget then return end - + local nextItemWidget = container:getChildByIndex(i+2) if not nextItemWidget then return end - + local item = nextItemWidget:getItem() local pos = item:getPosition() pos.z = pos.z - 1 item:setPosition(pos) - + itemWidget:setItem(item) nextItemWidget:setItem(nil) end - + container.itemCount = container.itemCount - 1 end -connect(Game, { onLogin = Containers.clean, - onLogout = Containers.clean, +connect(Game, { onGameStart = Containers.clean, + onGameEnd = Containers.clean, onContainerOpen = Containers.onContainerOpen, onContainerClose = Containers.onContainerClose, onContainerAddItem = Containers.onContainerAddItem, onContainerUpdateItem = Containers.onContainerUpdateItem, onContainerRemoveItem = Containers.onContainerRemoveItem }) - + diff --git a/modules/game_healthbar/healthbar.lua b/modules/game_healthbar/healthbar.lua index 458fd1ed..8446dcda 100644 --- a/modules/game_healthbar/healthbar.lua +++ b/modules/game_healthbar/healthbar.lua @@ -53,7 +53,7 @@ function HealthBar.onManaChange(mana, maxMana) manaBar:setPercent(percent) end -connect(Game, { onLogin = HealthBar.create, - onLogout = HealthBar.destroy, +connect(Game, { onGameStart = HealthBar.create, + onGameEnd = HealthBar.destroy, onHealthChange = HealthBar.onHealthChange, onManaChange = HealthBar.onManaChange }) diff --git a/modules/game_inventory/inventory.lua b/modules/game_inventory/inventory.lua index 0977ae73..ca798e39 100644 --- a/modules/game_inventory/inventory.lua +++ b/modules/game_inventory/inventory.lua @@ -42,8 +42,8 @@ function Inventory.onSoulChange(soul) widget:setText("Soul:\n" .. soul) end -connect(Game, { onLogin = Inventory.create, - onLogout = Inventory.destroy, +connect(Game, { onGameStart = Inventory.create, + onGameEnd = Inventory.destroy, onInventoryChange = Inventory.onInventoryChange, onFreeCapacityChange = Inventory.onFreeCapacityChange, onSoulChange = Inventory.onSoulChange }) diff --git a/modules/game_outfit/outfit.lua b/modules/game_outfit/outfit.lua index de119017..8b35729a 100644 --- a/modules/game_outfit/outfit.lua +++ b/modules/game_outfit/outfit.lua @@ -199,4 +199,4 @@ end -- hooked events connect(Game, { onOpenOutfitWindow = Outfit.create, - onLogout = Outfit.destroy }) + onGameEnd = Outfit.destroy }) diff --git a/modules/game_skills/skills.lua b/modules/game_skills/skills.lua index 5eeed668..bc34a642 100644 --- a/modules/game_skills/skills.lua +++ b/modules/game_skills/skills.lua @@ -122,8 +122,8 @@ function Skills.onSkillChange(id, level, percent) setSkillPercent('skillId' .. id, percent, 'You have ' .. (100 - percent) .. ' percent to go') end -connect(Game, { onLogin = Skills.create, - onLogout = Skills.destroy, +connect(Game, { onGameStart = Skills.create, + onGameEnd = Skills.destroy, onExperienceChange = Skills.onExperienceChange, onLevelChange = Skills.onLevelChange, onHealthChange = Skills.onHealthChange, diff --git a/modules/game_textmessage/textmessage.lua b/modules/game_textmessage/textmessage.lua index aa45bb1e..bbfefc9e 100644 --- a/modules/game_textmessage/textmessage.lua +++ b/modules/game_textmessage/textmessage.lua @@ -111,7 +111,7 @@ local function onGameTextMessage(msgtypedesc, msg) TextMessage.display(msgtypedesc, msg) end -connect(Game, { onLogin = TextMessage.create, - onLogout = TextMessage.destroy, +connect(Game, { onGameStart = TextMessage.create, + onGameEnd = TextMessage.destroy, onDeath = onGameDeath, onTextMessage = onGameTextMessage }) diff --git a/modules/game_viplist/viplist.lua b/modules/game_viplist/viplist.lua index 0dccae7d..d7d7f586 100644 --- a/modules/game_viplist/viplist.lua +++ b/modules/game_viplist/viplist.lua @@ -57,7 +57,7 @@ function VipList.onAddVip(id, name, online) label:setPhantom(false) connect(label, { onDoubleClick = function () Game.openPrivateChannel(label:getText()) return true end } ) - + local nameLower = name:lower() local childrenCount = vipList:getChildCount() @@ -123,7 +123,7 @@ function VipList.onVipListLabelMousePress(widget, mousePos, mouseButton) end -connect(Game, { onLogin = VipList.create, - onLogout = VipList.destroy, +connect(Game, { onGameStart = VipList.create, + onGameEnd = VipList.destroy, onAddVip = VipList.onAddVip, onVipStateChange = VipList.onVipStateChange }) diff --git a/src/otclient/core/game.cpp b/src/otclient/core/game.cpp index 5e0014ed..02359bd8 100644 --- a/src/otclient/core/game.cpp +++ b/src/otclient/core/game.cpp @@ -72,7 +72,7 @@ void Game::processConnectionError(const boost::system::error_code& error) } } -void Game::processLogin(const LocalPlayerPtr& localPlayer, int serverBeat) +void Game::processGameStart(const LocalPlayerPtr& localPlayer, int serverBeat) { m_localPlayer = localPlayer; m_serverBeat = serverBeat; @@ -83,8 +83,16 @@ void Game::processLogin(const LocalPlayerPtr& localPlayer, int serverBeat) m_safeFight = true; m_protocolGame->sendFightTatics(m_fightMode, m_chaseMode, m_safeFight); - // NOTE: the entire map description is not known yet - g_lua.callGlobalField("Game", "onLogin", localPlayer); + // NOTE: the entire map description and local player informations is not known yet + g_lua.callGlobalField("Game", "onGameStart"); +} + +void Game::processLogin() +{ + if(!isOnline()) + return; + + g_lua.callGlobalField("Game", "onLogin", m_localPlayer); } void Game::processLogout() @@ -93,6 +101,8 @@ void Game::processLogout() g_lua.callGlobalField("Game", "onLogout", m_localPlayer); m_localPlayer = nullptr; + + g_lua.callGlobalField("Game", "onGameEnd"); } if(m_protocolGame) { diff --git a/src/otclient/core/game.h b/src/otclient/core/game.h index 6f83ca04..b9cdc22d 100644 --- a/src/otclient/core/game.h +++ b/src/otclient/core/game.h @@ -42,7 +42,8 @@ public: void cleanLogout() { logout(false); } void processLoginError(const std::string& error); void processConnectionError(const boost::system::error_code& error); - void processLogin(const LocalPlayerPtr& localPlayer, int serverBeat); + void processGameStart(const LocalPlayerPtr& localPlayer, int serverBeat); + void processLogin(); void processLogout(); void processDeath(); void processPlayerStats(double health, double maxHealth, diff --git a/src/otclient/core/tile.cpp b/src/otclient/core/tile.cpp index 824c679b..94bd6462 100644 --- a/src/otclient/core/tile.cpp +++ b/src/otclient/core/tile.cpp @@ -38,11 +38,11 @@ Tile::Tile(const Position& position) void Tile::draw(const Point& dest, float scaleFactor, int drawFlags) { - m_drawElevation = 0; bool animate = drawFlags & Otc::DrawAnimations; // first bottom items if(drawFlags & (Otc::DrawGround | Otc::DrawGroundBorders | Otc::DrawOnBottom)) { + m_drawElevation = 0; for(const ThingPtr& thing : m_things) { if(!thing->isGround() && !thing->isGroundBorder() && !thing->isOnBottom()) break; diff --git a/src/otclient/net/protocolgame.h b/src/otclient/net/protocolgame.h index b8eaa158..33a9e2b5 100644 --- a/src/otclient/net/protocolgame.h +++ b/src/otclient/net/protocolgame.h @@ -106,7 +106,7 @@ private: // Parse Messages void parseMessage(InputMessage& msg); - void parsePlayerLogin(InputMessage& msg); + void parseInitGame(InputMessage& msg); void parseGMActions(InputMessage& msg); void parseLoginError(InputMessage& msg); void parseFYIMessage(InputMessage& msg); diff --git a/src/otclient/net/protocolgameparse.cpp b/src/otclient/net/protocolgameparse.cpp index cc7fa337..c8a56f2d 100644 --- a/src/otclient/net/protocolgameparse.cpp +++ b/src/otclient/net/protocolgameparse.cpp @@ -41,7 +41,7 @@ void ProtocolGame::parseMessage(InputMessage& msg) switch(opt) { case Proto::GameServerInitGame: - parsePlayerLogin(msg); + parseInitGame(msg); break; case Proto::GameServerGMActions: parseGMActions(msg); @@ -265,7 +265,7 @@ void ProtocolGame::parseMessage(InputMessage& msg) } } -void ProtocolGame::parsePlayerLogin(InputMessage& msg) +void ProtocolGame::parseInitGame(InputMessage& msg) { uint playerId = msg.getU32(); int serverBeat = msg.getU16(); @@ -274,7 +274,7 @@ void ProtocolGame::parsePlayerLogin(InputMessage& msg) m_localPlayer = LocalPlayerPtr(new LocalPlayer); m_localPlayer->setId(playerId); m_localPlayer->setCanReportBugs(playerCanReportBugs); - g_game.processLogin(m_localPlayer, serverBeat); + g_game.processGameStart(m_localPlayer, serverBeat); } void ProtocolGame::parseGMActions(InputMessage& msg) @@ -1110,8 +1110,10 @@ ThingPtr ProtocolGame::internalGetThing(InputMessage& msg) creature->setPassable(passable); creature->setDirection(direction); + // now that the local player is known, we can schedule login event if(creature == m_localPlayer) { m_localPlayer->setKnown(true); + g_dispatcher.addEvent([] { g_game.processLogin(); }); } }