From 3990ee76e745bc4b6c3c3572ab5e406f480f475f Mon Sep 17 00:00:00 2001 From: Samuel Date: Thu, 11 Oct 2012 17:36:00 +0200 Subject: [PATCH] Minimap Icons Now server can call: doPlayerAddMapMark(cid, pos, icon, description) and it will be parsed. TODO: Adding map icons by rightclick on minimap menu. Removing icons. Needs to be tested when switching between different versions. --- modules/game_minimap/images/mapflags.png | Bin 0 -> 2836 bytes modules/game_minimap/minimap.lua | 135 ++++++++++++++++++++++- modules/game_minimap/minimap.otui | 13 +++ src/otclient/const.h | 24 ++++ src/otclient/protocolgameparse.cpp | 9 +- 5 files changed, 175 insertions(+), 6 deletions(-) create mode 100644 modules/game_minimap/images/mapflags.png diff --git a/modules/game_minimap/images/mapflags.png b/modules/game_minimap/images/mapflags.png new file mode 100644 index 0000000000000000000000000000000000000000..7d25b6472fb26424676ab3dbbfa1aba9784523e8 GIT binary patch literal 2836 zcmV+v3+wcWP)WFU8GbZ8()Nlj2>E@cM*019|XL_t(&-tC!xP*r6b z$3GXma3PdXP%&3j0#P$kBnz5!HDP5F!4g9&#Z+w6#zg_qSTr{fa1@JmC04ZjL289* zVvKDYO}3-Nk~$*7O6t;*O1MJEj|-gr<9c4sx#wKeR(GcvpP4iF-1q&S=e+Oxz0dPL z@An!cNkX>J;DD|#H?8PcsR13kkNy8*dnkeNF*9@>SUZoH6r_udm=q)(_{-M@>*vD) z9%km-`}h*5T^iM`-_0p20C?zw)qMZ_o89`o-SOTjc57PlU0;X0j+G>dkf1Tr(cCnt zy0}1f`KJX-&-{I+6cRK>k|YU9l9)E}N$Inl*^;ZPBrd|%NLfpxq_ahPq-hhM6xfiU zG18~muS;h@>U`xD=`=`tLCRVhC4HLxy2kI>qCMi>4GV^dG3og|nwuu=b8}OTcb}V^ zbTl_jGy44zxEnCro71=jUg3d>ka)+Yy85*;qE zVF3^0J1PJtpn2Oieg%}@e8zWF0AT@@0=qe71&$^s0Ni)Q;SlV>xMS~doP~J%`l}K$A+h-R4HsCEDi`*ApQ}YR6a=jhq+Knl(S+;3L0()BUdw0E z?xO9vW9oj{!k>=@;3uFLa06&o_zHhMn!?g`A~nj^_LL9C#&V4QFz&=VZ~`oEa}$`c z2lCi2lO=z;xiR)Y9_K47RAXMdK%I8Viaw&O=p#mlPG{t!qeXk}_(*8=~-)s{$*_oiVNu1 z(ZQbDYdjt}n&99k@E`6&QDX~}3jz{ya4|R&+208 zUfhWLt~fy!fcd16JX4@5I%WGt5ovPd>5-S3w;zBNb1aef^wjA#$N9Z$Pd;yMrtZ{P zdH_xaaCdSf-Q>hjD{SnM0zs5prwhl8EuyWprCH(2f5c+fxS3W0`5%0ze5@ph?t>)52v1hm*OHu80a=&Z`Kgbt^_Kr=$rJ{l} zOQY~t^s6G{<^;?qjoiw1Z|6!^sf` z2O|NqLu{@Cz%{#0o9j?>>7pQ18If|E68r9B)9~om-{!opUjBjIpMFJ;qGP27xj>Q0 zQ<8SRvVzR*`^6a|Vp5Q_KG6$Dlaq$D)|O_n^A8GaXmEh!H>?!jQ304MDsWL?D^HhF zSo#l@-<{q+aQyLwss%Y;S;4#$@9@&vf2#b(XC!bUAwxu%T%fpRB&f!#EWXU0>Z6hM z+~lJ`pE=Lc$7;d+hWWB_PoeHQD5FVl9jviR()6)QHN}jK&Dnd1qGP27gM0wDb=FZ% zOnIJI5*@C=X6GNo);Z2^m@myg)&g*`u2Dsr((k4eZM6JuZ3ee{j?)|Oonqr=g=w%# z(tgf5+-*aoBgJg1k!gL)GS2e+;G+Y zDX)X)pusqsOpGjC&zZ25x_hm%h)|xzGS;T#C6jjUuQynd ztCnPP_k7Hj?Yns+ekqG*cMV!kzLEWUPxy5gabLjI+8UMIB$Jl4;RWIo-|s3Q(xZt_ z%xB$eF)C>aU|rHGlG9QdKDZxeFI;A0#zy3RB{qG>L6#>a(b?IFi;D|&b#>I$)v;>x z7B;15<*|{4>n%ENbGx|TUr|Xii{`(~f{0KuckCr6^9|3S?{sxPkU9Q^>gp7d2sMRPZrI8nfSRg88cxDE7zoBXKzpSrSEON?8`5kC@E>< z+_?v7YcuoM)JHU!tPL;l`y5xc9ByH1WCzQawGcVUNM?F8m8VNJr0v>~MX#PNjPUWI zrOk|!gB@`Rak}pxFkk>l$(Bf6vTPZ>d-vAG$*J+h+9ISTGqcJ+W>&fWV&+VV6asVK zPJ70gO`=T?JGsr7K(iym+KoiDxG=fRS%W(`(IO-a4eZGiFL;P+XkbrOzaTF6$Z=9r zQ)z8&Woy$THc7K4Z{Hs`5XLDwJ344;Znla4VADo%?Oy*rZEa>wxVPTR-b_iMfB*h`S5?K0>(|-4b0@FP46#Yx znXr{eE$!?XF%5v>yVq!N@;=pI=+teuZaeC5gA!vaCB|0vnSN3o+GX?c@u4s@mgE0i_0R7CP{^Z%af;pfuwd3S zwM0|f^$&wG-5h$m`;-v9=+-51+FLt$)aM~2gFRR48!?-;%JKQi3NhaH_IBJ{U1^o1 zZvFaXE*JMvpX~x*-!m`ju0!mR0&=EA(o3>aX_eNJmlA7Du2OcZxpWafzu^=TOIT5k z&@Br?Er09CSW#6D9yyld$BzTBDKS<=+pVge3pKSgHZ`$3|3m8QYI(q8fU2sDn-#{Y z&F`{$af~4Dd}Re4txYO5Lar3`_P1$aD|E4XX>rj@vvs5?%Xn99-YIae&J3aNgS|9! z+mw<(Sy`Edv_m`CH+8Of=DmYQ?@Fb3yIA?}9ho#G_Lh>@e=FbIE4k@TrK#JM(v;Y; mvNG{wvxU7cdELj}5%xcLc%Ppp@m>%B0000= 1 and icon <= 20) or not pos then + return + end + + version = version or g_game.getClientVersion() + -- Check if flag is set for that position + 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 version == flag.version then + return + end + end + + if not flagId then + flagId = nextFlagId + nextFlagId = nextFlagId + 1 + end + + local flagWidget = g_ui.createWidget('FlagWidget', flagsPanel) + flagWidget:setIconClip(getFlagIconClip(icon - 1)) + flagWidget:setId('flag' .. flagId) + flagWidget.position = pos + flagWidget.icon = icon + flagWidget.description = message + flagWidget:setTooltip(tr(message)) + flagWidget.id = flagId + flagWidget.version = version + updateMapFlag(flagId) +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.getClientVersion() and (minimapWidget:getZoom() >= 30 and minimapWidget:getZoom() <= 150) 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) + local firstPosition, lastPosition = getMapArea() + if not firstPosition or not lastPosition then + return + end + + 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)) + else + flag:setVisible(false) + end +end + +function updateMapFlags() + local firstPosition, lastPosition = getMapArea() + if not firstPosition or not lastPosition then + return + end + + 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)) + else + flag:setVisible(false) + end + end +end + function online() reset() loadMap() + + updateMapFlags() end function offline() @@ -133,6 +259,8 @@ function compassClick(self, mousePos, mouseButton, elapsed) local cameraPos = minimapWidget:getCameraPosition() local pos = {x = cameraPos.x + movex, y = cameraPos.y + movey, z = cameraPos.z} minimapWidget:setCameraPosition(pos) + + updateMapFlags() end function onButtonClick(id) @@ -153,6 +281,8 @@ function onButtonClick(id) minimapWidget:setCameraPosition(pos) end end + + updateMapFlags() end function onMinimapMouseRelease(self, mousePosition, mouseButton) @@ -179,6 +309,7 @@ function onMinimapMouseWheel(self, mousePos, direction) else self:zoomOut() end + updateMapFlags() end function onMiniWindowClose() diff --git a/modules/game_minimap/minimap.otui b/modules/game_minimap/minimap.otui index d7d6aa07..34ea0794 100644 --- a/modules/game_minimap/minimap.otui +++ b/modules/game_minimap/minimap.otui @@ -7,6 +7,13 @@ MapControl < Button $hover !pressed: icon-clip: 0 16 16 16 + +FlagWidget < UIWidget + size: 11 11 + icon-clip: 0 0 11 11 + icon-source: /game_minimap/images/mapflags.png + anchors.left: parent.left + anchors.top: parent.top FloorUpControl < MapControl icon-source: /game_minimap/images/floor_up.png @@ -26,6 +33,7 @@ MiniWindow height: 150 icon: minimap.png @onClose: modules.game_minimap.onMiniWindowClose() + @onGeometryChange: updateMapFlags() &save: true Label @@ -43,6 +51,11 @@ MiniWindow id: minimap anchors.fill: parent + Panel + id: flagsPanel + anchors.fill: minimap + phantom: true + FloorUpControl id: floorUp anchors.right: parent.right diff --git a/src/otclient/const.h b/src/otclient/const.h index 226126f3..f839a02b 100644 --- a/src/otclient/const.h +++ b/src/otclient/const.h @@ -359,6 +359,30 @@ namespace Otc PATHFIND_ALLOW_NONPATHABLE = 4, PATHFIND_ALLOW_NONWALKABLE = 8 }; + + enum AutomapFlags + { + MAPMARK_TICK = 0, + MAPMARK_QUESTION, + MAPMARK_EXCLAMATION, + MAPMARK_STAR, + MAPMARK_CROSS, + MAPMARK_TEMPLE, + MAPMARK_KISS, + MAPMARK_SHOVEL, + MAPMARK_SWORD, + MAPMARK_FLAG, + MAPMARK_LOCK, + MAPMARK_BAG, + MAPMARK_SKULL, + MAPMARK_DOLLAR, + MAPMARK_REDNORTH, + MAPMARK_REDSOUTH, + MAPMARK_REDEAST, + MAPMARK_REDWEST, + MAPMARK_GREENNORTH, + MAPMARK_GREENSOUTH + }; } #endif diff --git a/src/otclient/protocolgameparse.cpp b/src/otclient/protocolgameparse.cpp index b9beb8e4..b85977f4 100644 --- a/src/otclient/protocolgameparse.cpp +++ b/src/otclient/protocolgameparse.cpp @@ -1288,10 +1288,11 @@ void ProtocolGame::parseTutorialHint(const InputMessagePtr& msg) void ProtocolGame::parseAutomapFlag(const InputMessagePtr& msg) { - // ignored - getPosition(msg); // position - msg->getU8(); // icon - msg->getString(); // message + Position pos = getPosition(msg); // position + int icon = msg->getU8(); // icon + std::string description = msg->getString(); // message + + g_game.processAutomapFlag(pos, icon, description); } void ProtocolGame::parseQuestLog(const InputMessagePtr& msg)