restore map clicking

This commit is contained in:
Eduardo Bart 2012-02-06 23:35:46 -02:00
parent 46df3c7dbe
commit 53ead20de5
6 changed files with 54 additions and 40 deletions

View File

@ -13,6 +13,7 @@ Module
- game_console - game_console
- game_outfit - game_outfit
- game_containers - game_containers
- game_combatcontrols
onLoad: | onLoad: |
dofile 'game' dofile 'game'

View File

@ -1,8 +1,13 @@
CombatControls = {} CombatControls = {}
local combatControlsButton
function CombatControls.init() function CombatControls.init()
combatControlsButton = TopMenu.addGameButton('combatControlsButton', 'Combat Controls', 'combatcontrols.png', CombatControls.toggle)
end end
function CombatControls.terminate() function CombatControls.terminate()
combatControlsButton:destroy()
combatControlsButton = nil
end end

View File

@ -3,5 +3,10 @@ Module
description: Combat controls window description: Combat controls window
author: OTClient team author: OTClient team
website: https://github.com/edubart/otclient website: https://github.com/edubart/otclient
onLoad: | onLoad: |
dofile 'combatcontrols' dofile 'combatcontrols'
CombatControls.init()
onUnload: |
CombatControls.terminate()

View File

@ -522,6 +522,45 @@ Position MapView::getCameraPosition()
return m_customCameraPosition; return m_customCameraPosition;
} }
TilePtr MapView::getTile(const Point& mousePos, const Rect& mapRect)
{
Point relativeMousePos = mousePos - mapRect.topLeft();
Size visibleSize = getVisibleSize();
Position cameraPosition = getCameraPosition();
float scaleFactor = m_tileSize / (float)Otc::TILE_PIXELS;
float horizontalStretchFactor = visibleSize.width() / (float)mapRect.width();
float verticalStretchFactor = visibleSize.height() / (float)mapRect.height();
Point tilePos2D = Point(relativeMousePos.x * horizontalStretchFactor, relativeMousePos.y * verticalStretchFactor);
if(m_followingCreature)
tilePos2D += m_followingCreature->getWalkOffset() * scaleFactor;
tilePos2D /= m_tileSize;
Position tilePos = Position(1 + (int)tilePos2D.x - m_virtualCenterOffset.x, 1 + (int)tilePos2D.y - m_virtualCenterOffset.y, 0) + cameraPosition;
if(!tilePos.isValid())
return nullptr;
// we must check every floor, from top to bottom to check for a clickable tile
TilePtr tile;
tilePos.coveredUp(tilePos.z - m_cachedFirstVisibleFloor);
for(int i = m_cachedFirstVisibleFloor; i <= m_cachedLastVisibleFloor; i++) {
tile = g_map.getTile(tilePos);
if(tile && tile->isClickable())
break;
tilePos.coveredDown();
}
if(!tile || !tile->isClickable())
return nullptr;
return tile;
}
Point MapView::transformPositionTo2D(const Position& position) Point MapView::transformPositionTo2D(const Position& position)
{ {
Position cameraPosition = getCameraPosition(); Position cameraPosition = getCameraPosition();

View File

@ -80,6 +80,7 @@ public:
int getFirstVisibleFloor(); int getFirstVisibleFloor();
int getLastVisibleFloor(); int getLastVisibleFloor();
Position getCameraPosition(); Position getCameraPosition();
TilePtr getTile(const Point& mousePos, const Rect& mapRect);
Size getVisibleDimension() { return m_visibleDimension; } Size getVisibleDimension() { return m_visibleDimension; }
Size getVisibleSize() { return m_visibleDimension * m_tileSize; } Size getVisibleSize() { return m_visibleDimension * m_tileSize; }
CreaturePtr getFollowingCreature() { return m_followingCreature; } CreaturePtr getFollowingCreature() { return m_followingCreature; }

View File

@ -103,48 +103,11 @@ void UIMap::setCameraPosition(const Position& pos)
TilePtr UIMap::getTile(const Point& mousePos) TilePtr UIMap::getTile(const Point& mousePos)
{ {
/*
if(!m_mapRect.contains(mousePos)) if(!m_mapRect.contains(mousePos))
return nullptr; return nullptr;
// Get tile position //TODO: move MapView code to UIMap and rework this shit
Point relativeStretchMousePos = mousePos - m_mapRect.topLeft(); return m_mapView->getTile(mousePos, m_mapRect);
LocalPlayerPtr localPlayer = g_game.getLocalPlayer();
if(localPlayer)
relativeStretchMousePos += localPlayer->getWalkOffset();
Size mapSize(g_map.getVibibleSize().width() * Otc::TILE_PIXELS, g_map.getVibibleSize().height() * Otc::TILE_PIXELS);
PointF stretchFactor(m_mapRect.width() / (float)mapSize.width(), m_mapRect.height() / (float)mapSize.height());
PointF relativeMousePos = PointF(relativeStretchMousePos.x, relativeStretchMousePos.y) / stretchFactor;
PointF tilePosF = relativeMousePos / Otc::TILE_PIXELS;
Position tilePos = Position(1 + (int)tilePosF.x - g_map.getCentralOffset().x, 1 + (int)tilePosF.y - g_map.getCentralOffset().y, 0) + g_map.getCentralPosition();
if(!tilePos.isValid())
return nullptr;
// Get tile
TilePtr tile = nullptr;
// We must check every floor, from top to bottom to check for a clickable tile
int firstFloor = g_map.getFirstVisibleFloor();
tilePos.coveredUp(tilePos.z - firstFloor);
for(int i = firstFloor; i <= Map::MAX_Z; i++) {
tile = g_map.getTile(tilePos);
if(tile && tile->isClickable())
break;
tilePos.coveredDown();
}
// todo: get creature, using walkOffset etc.
if(!tile || !tile->isClickable())
return nullptr;
return tile;
*/
return nullptr;
} }
void UIMap::onGeometryChange(const Rect& oldRect, const Rect& newRect) void UIMap::onGeometryChange(const Rect& oldRect, const Rect& newRect)