From 60986eb80f465ea584d1e65a291c23dd5c821aed Mon Sep 17 00:00:00 2001 From: Henrique Santiago Date: Tue, 29 Jan 2013 18:36:27 -0200 Subject: [PATCH] Minimap fix and remove option --- modules/game_minimap/minimap.lua | 34 +++++++++++++++++++++----------- modules/gamelib/const.lua | 1 + src/client/const.h | 1 + src/client/game.cpp | 9 +++++++-- src/client/game.h | 3 ++- src/client/protocolgameparse.cpp | 17 +++++++++++----- 6 files changed, 46 insertions(+), 19 deletions(-) diff --git a/modules/game_minimap/minimap.lua b/modules/game_minimap/minimap.lua index c08611f3..c843a407 100644 --- a/modules/game_minimap/minimap.lua +++ b/modules/game_minimap/minimap.lua @@ -21,7 +21,8 @@ function init() connect(g_game, { onGameStart = online, onGameEnd = offline, - onAutomapFlag = addMapFlag + onAddAutomapFlag = addMapFlag, + onRemoveAutomapFlag = removeMapFlag, }) connect(LocalPlayer, { onPositionChange = center }) @@ -65,7 +66,8 @@ function terminate() disconnect(g_game, { onGameStart = online, onGameEnd = offline, - onAutomapFlag = addMapFlag + onAddAutomapFlag = addMapFlag, + onRemoveAutomapFlag = removeMapFlag, }) disconnect(LocalPlayer, { onPositionChange = center }) @@ -118,7 +120,7 @@ function showFlagDialog(position) for i = 1, 20 do local checkbox = flagWindow:getChildById('flag' .. i) table.insert(flagCheckbox, checkbox) - checkbox.icon = i + checkbox.icon = i - 1 flagRadioGroup:addWidget(checkbox) end @@ -174,7 +176,7 @@ function getFlagIconClip(id) end function addMapFlag(pos, icon, message, flagId, version) - if not(icon >= 1 and icon <= 20) or not pos then + if not (icon >= 0 and icon <= 19) or not pos then return end @@ -194,7 +196,7 @@ function addMapFlag(pos, icon, message, flagId, version) end local flagWidget = g_ui.createWidget('FlagWidget', flagsPanel) - flagWidget:setIconClip(getFlagIconClip(icon - 1)) + flagWidget:setIconClip(getFlagIconClip(icon)) flagWidget:setId('flag' .. flagId) flagWidget.position = pos flagWidget.icon = icon @@ -208,13 +210,23 @@ function addMapFlag(pos, icon, message, flagId, version) flagWidget.onMousePress = onFlagMousePress end +function removeMapFlag(pos, icon, message) + for i=1, flagsPanel:getChildCount() do + local flag = flagsPanel:getChildByIndex(i) + if flag.position.x == pos.x and flag.position.y == pos.y and flag.position.z == pos.z and flag.icon == icon and flag.description == message then + flag:destroy() + break + end + end +end + function getMapArea() return minimapWidget:getPosition( { x = 1 + minimapWidget:getX(), y = 1 + minimapWidget:getY() } ), minimapWidget:getPosition( { x = -2 + minimapWidget:getWidth() + minimapWidget:getX(), y = -2 + minimapWidget:getHeight() + minimapWidget:getY() } ) end function isFlagVisible(flag, firstPosition, lastPosition) - return flag.version == g_game.getProtocolVersion() and (minimapWidget:getZoom() >= 0 and minimapWidget:getZoom() <= 2) and flag.position.x >= firstPosition.x and flag.position.x <= lastPosition.x and flag.position.y >= firstPosition.y and flag.position.y <= lastPosition.y and flag.position.z == firstPosition.z + return flag.version == g_game.getProtocolVersion() and (minimapWidget:getZoom() >= -2 and minimapWidget:getZoom() <= 4) and flag.position.x >= firstPosition.x and flag.position.x <= lastPosition.x and flag.position.y >= firstPosition.y and flag.position.y <= lastPosition.y and flag.position.z == firstPosition.z end function updateMapFlag(id) @@ -226,8 +238,8 @@ function updateMapFlag(id) local flag = flagsPanel:getChildById('flag' .. id) if isFlagVisible(flag, firstPosition, lastPosition) then flag:setVisible(true) - flag:setMarginLeft( -5 + (minimapWidget:getWidth() / (lastPosition.x - firstPosition.x)) * (flag.position.x - firstPosition.x)) - flag:setMarginTop( -5 + (minimapWidget:getHeight() / (lastPosition.y - firstPosition.y)) * (flag.position.y - firstPosition.y)) + flag:setMarginLeft(-5.5 + (minimapWidget:getWidth() / (lastPosition.x - firstPosition.x)) * (flag.position.x - firstPosition.x)) + flag:setMarginTop(-5.5 + (minimapWidget:getHeight() / (lastPosition.y - firstPosition.y)) * (flag.position.y - firstPosition.y)) else flag:setVisible(false) end @@ -239,12 +251,12 @@ function updateMapFlags() return end - for i = 1, flagsPanel:getChildCount() do + for i=1, flagsPanel:getChildCount() do local flag = flagsPanel:getChildByIndex(i) if isFlagVisible(flag, firstPosition, lastPosition) then flag:setVisible(true) - flag:setMarginLeft( -5 + (minimapWidget:getWidth() / (lastPosition.x - firstPosition.x)) * (flag.position.x - firstPosition.x)) - flag:setMarginTop( -5 + (minimapWidget:getHeight() / (lastPosition.y - firstPosition.y)) * (flag.position.y - firstPosition.y)) + flag:setMarginLeft(-5.5 + (minimapWidget:getWidth() / (lastPosition.x - firstPosition.x)) * (flag.position.x - firstPosition.x)) + flag:setMarginTop(-5.5 + (minimapWidget:getHeight() / (lastPosition.y - firstPosition.y)) * (flag.position.y - firstPosition.y)) else flag:setVisible(false) end diff --git a/modules/gamelib/const.lua b/modules/gamelib/const.lua index 22024fbb..fe536645 100644 --- a/modules/gamelib/const.lua +++ b/modules/gamelib/const.lua @@ -76,6 +76,7 @@ GameDiagonalAnimatedText = 34 GameLoginPending = 35 GameNewSpeedLaw = 36 GameForceFirstAutoWalkStep = 37 +GameMinimapRemove = 38 TextColors = { red = '#f55e5e', --'#c83200' diff --git a/src/client/const.h b/src/client/const.h index 259b6e74..337ace35 100644 --- a/src/client/const.h +++ b/src/client/const.h @@ -347,6 +347,7 @@ namespace Otc GameLoginPending = 35, GameNewSpeedLaw = 36, GameForceFirstAutoWalkStep = 37, + GameMinimapRemove = 38, // 51-100 reserved to be defined in lua LastGameFeature = 101 }; diff --git a/src/client/game.cpp b/src/client/game.cpp index cb265b5f..d627b856 100644 --- a/src/client/game.cpp +++ b/src/client/game.cpp @@ -371,9 +371,14 @@ void Game::processTutorialHint(int id) g_lua.callGlobalField("g_game", "onTutorialHint", id); } -void Game::processAutomapFlag(const Position& pos, int icon, const std::string& message) +void Game::processAddAutomapFlag(const Position& pos, int icon, const std::string& message) { - g_lua.callGlobalField("g_game", "onAutomapFlag", pos, icon, message); + g_lua.callGlobalField("g_game", "onAddAutomapFlag", pos, icon, message); +} + +void Game::processRemoveAutomapFlag(const Position& pos, int icon, const std::string& message) +{ + g_lua.callGlobalField("g_game", "onRemoveAutomapFlag", pos, icon, message); } void Game::processOpenOutfitWindow(const Outfit& currentOufit, const std::vector >& outfitList, diff --git a/src/client/game.h b/src/client/game.h index 13947d1c..453f6f71 100644 --- a/src/client/game.h +++ b/src/client/game.h @@ -103,7 +103,8 @@ protected: // tutorial hint void processTutorialHint(int id); - void processAutomapFlag(const Position& pos, int icon, const std::string& message); + void processAddAutomapFlag(const Position& pos, int icon, const std::string& message); + void processRemoveAutomapFlag(const Position& pos, int icon, const std::string& message); // outfit void processOpenOutfitWindow(const Outfit& currentOufit, const std::vector >& outfitList, diff --git a/src/client/protocolgameparse.cpp b/src/client/protocolgameparse.cpp index ae6091a8..eac4ab41 100644 --- a/src/client/protocolgameparse.cpp +++ b/src/client/protocolgameparse.cpp @@ -1406,17 +1406,24 @@ void ProtocolGame::parseVipLogout(const InputMessagePtr& msg) void ProtocolGame::parseTutorialHint(const InputMessagePtr& msg) { - int id = msg->getU8(); // tutorial id + int id = msg->getU8(); g_game.processTutorialHint(id); } void ProtocolGame::parseAutomapFlag(const InputMessagePtr& msg) { - Position pos = getPosition(msg); // position - int icon = msg->getU8(); // icon - std::string description = msg->getString(); // message + Position pos = getPosition(msg); + int icon = msg->getU8(); + std::string description = msg->getString(); + + bool remove = false; + if(g_game.getFeature(Otc::GameMinimapRemove)) + remove = msg->getU8() != 0; - g_game.processAutomapFlag(pos, icon, description); + if(!remove) + g_game.processAddAutomapFlag(pos, icon, description); + else + g_game.processRemoveAutomapFlag(pos, icon, description); } void ProtocolGame::parseQuestLog(const InputMessagePtr& msg)