Fixed an issue with the battle list filter.

More work on the minimap, interface changes, fixed direction controls, fixed reseting, fixed some draw things (needs some more work to finish).
Fixed a bug in the battle list causing Battle.onFollow(creature) to execute when there was no follow.
This commit is contained in:
BeniS 2012-07-09 23:37:47 +12:00 committed by Eduardo Bart
parent c8d9833444
commit 902ce06e88
13 changed files with 135 additions and 38 deletions

1
.gitignore vendored
View File

@ -27,3 +27,4 @@ CMakeLists.txt.user*
/modules/myotclientrc.lua /modules/myotclientrc.lua
!.gitignore !.gitignore
otclient.map otclient.map
otclient.layout

View File

@ -130,13 +130,13 @@ function Battle.doCreatureFitFilters(creature)
local hideSkulls = hideSkullsButton:isChecked() local hideSkulls = hideSkullsButton:isChecked()
local hideParty = hidePartyButton:isChecked() local hideParty = hidePartyButton:isChecked()
if hidePlayers and not creature:asMonster() and not creature:asNpc() then if hidePlayers and creature:asPlayer() then
return false return false
elseif hideNPCs and creature:asNpc() then elseif hideNPCs and creature:asNpc() then
return false return false
elseif hideMonsters and creature:asMonster() then elseif hideMonsters and creature:asMonster() then
return false return false
elseif hideSkulls and creature:getSkull() == SkullNone then elseif hideSkulls and creature:asPlayer() and creature:getSkull() == SkullNone then
return false return false
elseif hideParty and creature:getShield() > ShieldWhiteBlue then elseif hideParty and creature:getShield() > ShieldWhiteBlue then
return false return false
@ -359,6 +359,7 @@ function Battle.checkBattleButton(battleButton)
end end
if battleButton.isTarget or battleButton.isFollowed then if battleButton.isTarget or battleButton.isFollowed then
-- set new last battle button switched
if lastBattleButtonSwitched and lastBattleButtonSwitched ~= battleButton then if lastBattleButtonSwitched and lastBattleButtonSwitched ~= battleButton then
lastBattleButtonSwitched.isTarget = false lastBattleButtonSwitched.isTarget = false
lastBattleButtonSwitched.isFollowed = false lastBattleButtonSwitched.isFollowed = false

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

@ -30,9 +30,16 @@ function onMinimapMouseWheel(self, mousePos, direction)
end end
end end
--[[
Known Issue (TODO):
If you move the minimap compass directions and
you change floor it will not update the minimap.
]]
-- public functions -- public functions
function Minimap.init() function Minimap.init()
connect(g_game, { onGameStart = Minimap.reset }) connect(g_game, { onGameStart = Minimap.reset,
onForceWalk = Minimap.center } )
g_keyboard.bindKeyDown('Ctrl+M', Minimap.toggle) g_keyboard.bindKeyDown('Ctrl+M', Minimap.toggle)
minimapButton = TopMenu.addGameToggleButton('minimapButton', tr('Minimap') .. ' (Ctrl+M)', 'minimap.png', Minimap.toggle) minimapButton = TopMenu.addGameToggleButton('minimapButton', tr('Minimap') .. ' (Ctrl+M)', 'minimap.png', Minimap.toggle)
@ -70,7 +77,9 @@ function Minimap.init()
end end
function Minimap.terminate() function Minimap.terminate()
disconnect(g_game, { onGameStart = Minimap.reset }) disconnect(g_game, { onGameStart = Minimap.reset,
onForceWalk = Minimap.center } )
g_keyboard.unbindKeyDown('Ctrl+M') g_keyboard.unbindKeyDown('Ctrl+M')
minimapButton:destroy() minimapButton:destroy()
@ -102,6 +111,12 @@ function Minimap.reset()
minimapWidget:setZoom(DEFAULT_ZOOM) minimapWidget:setZoom(DEFAULT_ZOOM)
end end
function Minimap.center()
local player = g_game.getLocalPlayer()
if not player then return end
minimapWidget:followCreature(player)
end
function Minimap.isClickInRange(position, fromPosition, toPosition) function Minimap.isClickInRange(position, fromPosition, toPosition)
return (position.x >= fromPosition.x and position.y >= fromPosition.y and position.x <= toPosition.x and position.y <= toPosition.y) return (position.x >= fromPosition.x and position.y >= fromPosition.y and position.x <= toPosition.x and position.y <= toPosition.y)
end end
@ -111,32 +126,23 @@ compassZones.west = {x = 0, y = 30, posx = -1, posy = 0}
compassZones.north = {x = 30, y = 0, posx = 0, posy = -1} compassZones.north = {x = 30, y = 0, posx = 0, posy = -1}
compassZones.south = {x = 30, y = 57, posx = 0, posy = 1} compassZones.south = {x = 30, y = 57, posx = 0, posy = 1}
compassZones.east = {x = 57, y = 30, posx = 1, posy = 0} compassZones.east = {x = 57, y = 30, posx = 1, posy = 0}
compassZones.center = {x = 30, y = 30, posx = 0, posy = 0, center = true}
function Minimap.compassClick(self, mousePos) function Minimap.compassClick(self, mousePos)
local compassPos = self:getRect() local compassPos = self:getRect()
local pos = {x = mousePos.x-compassPos.x, y = mousePos.y-compassPos.y} local pos = {x = mousePos.x-compassPos.x, y = mousePos.y-compassPos.y}
local move = {x = 0, y = 0} local move = {x = 0, y = 0}
local center = false
for i,v in pairs(compassZones) do for i,v in pairs(compassZones) do
local lowPos = {x = v.x-15, y = v.y-15} local lowPos = {x = v.x-15, y = v.y-15}
local highPos = {x = v.x+15, y = v.y+15} local highPos = {x = v.x+15, y = v.y+15}
if Minimap.isClickInRange(pos, lowPos, highPos) then if Minimap.isClickInRange(pos, lowPos, highPos) then
move.x = move.x + v.posx * minimapWidget:getZoom()/10 move.x = move.x + v.posx * minimapWidget:getZoom()/10
move.y = move.y + v.posy * minimapWidget:getZoom()/10 move.y = move.y + v.posy * minimapWidget:getZoom()/10
if v.center then center = true end
break break
end end
end end
if center then local cameraPos = minimapWidget:getCameraPosition()
local player = g_game.getLocalPlayer() local pos = {x = cameraPos.x + move.x, y = cameraPos.y + move.y, z = cameraPos.z}
if not player then return end minimapWidget:setCameraPosition(pos)
minimapWidget:followCreature(player)
else
local cameraPos = minimapWidget:getCameraPosition()
local pos = {x = cameraPos.x + move.x, y = cameraPos.y + move.y, z = cameraPos.z}
minimapWidget:setCameraPosition(pos)
end
end end
function Minimap.onButtonClick(id) function Minimap.onButtonClick(id)

View File

@ -1,3 +1,30 @@
MapControl < Button
size: 16 16
$pressed:
image-clip: 0 0 16 16
$hover !pressed:
image-clip: 0 16 16 16
$!pressed !hover:
image-clip: 0 32 16 16
$disabled:
image-color: #ffffff88
FloorUpControl < MapControl
image-source: /game_minimap/floor_up.png
FloorDownControl < MapControl
image-source: /game_minimap/floor_down.png
//ZoomOutControl < MapControl
//image-source: /game_minimap/zoom_out.png
//ZoomInControl < MapControl
//image-source: /game_minimap/zoom_in.png
MiniWindow MiniWindow
id: minimapWindow id: minimapWindow
!text: tr('Minimap') !text: tr('Minimap')
@ -17,46 +44,74 @@ MiniWindow
UIButton UIButton
id: compass id: compass
image-source: /game_minimap/compass.png image-source: /game_minimap/compass.png
color: #ffffff
anchors.left: minimap.right anchors.left: minimap.right
anchors.top: minimap.top anchors.top: minimap.top
size: 60 60 size: 60 60
margin-top: 3
margin-left: 5 margin-left: 5
@onClick: function(...) Minimap.compassClick(...) end @onClick: function(...) Minimap.compassClick(...) end
UIButton
id: compassReset
text: Reset
font: verdana-11px-rounded
anchors.left: compass.left
anchors.top: compass.top
margin-top: 25
margin-left: 14
@onClick: function(...) Minimap.center(...) end
$pressed:
color: #eb9f4f88
margin-top: 26
margin-left: 15
$hover !pressed:
color: #eb9f4f
$!pressed !hover:
color: #ffffff
margin-top: 25
margin-left: 14
$disabled:
image-color: #ffffff88
Button Button
id: zoomOut id: zoomOut
text: - text: -
size: 20 20 font: terminus-14px-bold
size: 16 16
anchors.left: minimap.right anchors.left: minimap.right
anchors.top: compass.bottom anchors.top: compass.bottom
margin-top: 5 margin-top: 10
margin-left: 15 margin-left: 10
enabled: true
@onClick: Minimap.onButtonClick(self:getId()) @onClick: Minimap.onButtonClick(self:getId())
Button Button
id: zoomIn id: zoomIn
text: + text: +
size: 20 20 size: 16 16
anchors.left: zoomOut.left anchors.left: zoomOut.left
anchors.top: zoomOut.bottom anchors.top: zoomOut.bottom
margin-top: 2 margin-top: 4
enabled: true
@onClick: Minimap.onButtonClick(self:getId()) @onClick: Minimap.onButtonClick(self:getId())
Button FloorUpControl
id: levelUp id: levelUp
text: /\
size: 20 20
anchors.left: zoomOut.right anchors.left: zoomOut.right
anchors.top: zoomOut.top anchors.top: zoomOut.top
margin-left: 2 margin-left: 15
enabled: true
@onClick: Minimap.onButtonClick(self:getId()) @onClick: Minimap.onButtonClick(self:getId())
Button FloorDownControl
id: levelDown id: levelDown
text: \/
size: 20 20
anchors.left: zoomIn.right anchors.left: zoomIn.right
anchors.top: zoomIn.top anchors.top: zoomIn.top
margin-left: 2 margin-left: 15
enabled: true
@onClick: Minimap.onButtonClick(self:getId()) @onClick: Minimap.onButtonClick(self:getId())

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

@ -241,6 +241,8 @@ void Game::processCreatureMove(const CreaturePtr& creature, const Position& oldP
{ {
// animate walk // animate walk
creature->walk(oldPos, newPos); creature->walk(oldPos, newPos);
g_lua.callGlobalField("g_game", "onCreatureMove", creature, oldPos, newPos);
} }
void Game::processCreatureTeleport(const CreaturePtr& creature) void Game::processCreatureTeleport(const CreaturePtr& creature)
@ -251,6 +253,8 @@ void Game::processCreatureTeleport(const CreaturePtr& creature)
// locks the walk for a while when teleporting // locks the walk for a while when teleporting
if(creature == m_localPlayer) if(creature == m_localPlayer)
m_localPlayer->lockWalk(); m_localPlayer->lockWalk();
g_lua.callGlobalField("g_game", "onCreatureTeleport", creature);
} }
void Game::processChannelList(const std::vector<std::tuple<int, std::string>>& channelList) void Game::processChannelList(const std::vector<std::tuple<int, std::string>>& channelList)
@ -528,6 +532,8 @@ void Game::forceWalk(Otc::Direction direction)
default: default:
break; break;
} }
g_lua.callGlobalField("g_game", "onForceWalk", direction);
} }
void Game::turn(Otc::Direction direction) void Game::turn(Otc::Direction direction)
@ -736,8 +742,11 @@ void Game::cancelAttackAndFollow()
m_localPlayer->lockWalk(); m_localPlayer->lockWalk();
setAttackingCreature(nullptr); if(isAttacking())
setFollowingCreature(nullptr); setAttackingCreature(nullptr);
if(isFollowing())
setFollowingCreature(nullptr);
m_protocolGame->sendCancelAttackAndFollow(); m_protocolGame->sendCancelAttackAndFollow();
} }

View File

@ -127,7 +127,7 @@ void MapView::draw(const Rect& rect)
Point drawOffset = ((m_drawDimension - m_visibleDimension - Size(1,1)).toPoint()/2) * m_tileSize; Point drawOffset = ((m_drawDimension - m_visibleDimension - Size(1,1)).toPoint()/2) * m_tileSize;
if(m_followingCreature) if(isFollowingCreature())
drawOffset += m_followingCreature->getWalkOffset() * scaleFactor; drawOffset += m_followingCreature->getWalkOffset() * scaleFactor;
Size srcSize = rect.size(); Size srcSize = rect.size();
@ -210,11 +210,32 @@ void MapView::draw(const Rect& rect)
} }
} else if(m_viewMode > NEAR_VIEW) { } else if(m_viewMode > NEAR_VIEW) {
// draw a cross in the center instead of our creature // draw a cross in the center instead of our creature
/*
Known Issue: Changing Z axis causes the cross to go off a little bit.
*/
Rect vRect(0, 0, 2, 10); Rect vRect(0, 0, 2, 10);
Rect hRect(0, 0, 10, 2); Rect hRect(0, 0, 10, 2);
vRect.moveCenter(rect.center());
hRect.moveCenter(rect.center());
g_painter->setColor(Color::white); g_painter->setColor(Color::white);
if(!m_follow && m_followingCreature)
{
Position pos = m_followingCreature->getPosition();
Point p = transformPositionTo2D(pos, cameraPosition) - drawOffset;
p.x = p.x * horizontalStretchFactor;
p.y = p.y * verticalStretchFactor;
p += rect.topLeft();
vRect.setX(p.x); vRect.setY(p.y - 4);
hRect.setX(p.x - 4); hRect.setY(p.y);
hRect.setWidth(10); hRect.setHeight(2);
vRect.setWidth(2); vRect.setHeight(10);
}
else {
vRect.moveCenter(rect.center());
hRect.moveCenter(rect.center());
}
g_painter->drawFilledRect(vRect); g_painter->drawFilledRect(vRect);
g_painter->drawFilledRect(hRect); g_painter->drawFilledRect(hRect);
} }
@ -525,14 +546,15 @@ void MapView::optimizeForSize(const Size& visibleSize)
void MapView::followCreature(const CreaturePtr& creature) void MapView::followCreature(const CreaturePtr& creature)
{ {
m_follow = true;
m_followingCreature = creature; m_followingCreature = creature;
requestVisibleTilesCacheUpdate(); requestVisibleTilesCacheUpdate();
} }
void MapView::setCameraPosition(const Position& pos) void MapView::setCameraPosition(const Position& pos)
{ {
m_follow = false;
m_customCameraPosition = pos; m_customCameraPosition = pos;
m_followingCreature = nullptr;
requestVisibleTilesCacheUpdate(); requestVisibleTilesCacheUpdate();
} }
@ -623,8 +645,9 @@ int MapView::calcLastVisibleFloor()
Position MapView::getCameraPosition() Position MapView::getCameraPosition()
{ {
if(m_followingCreature) if(isFollowingCreature())
return m_followingCreature->getPosition(); return m_followingCreature->getPosition();
return m_customCameraPosition; return m_customCameraPosition;
} }
@ -641,13 +664,12 @@ TilePtr MapView::getTile(const Point& mousePos, const Rect& mapRect)
float scaleFactor = m_tileSize / (float)Otc::TILE_PIXELS; float scaleFactor = m_tileSize / (float)Otc::TILE_PIXELS;
float horizontalStretchFactor = visibleSize.width() / (float)mapRect.width(); float horizontalStretchFactor = visibleSize.width() / (float)mapRect.width();
float verticalStretchFactor = visibleSize.height() / (float)mapRect.height(); float verticalStretchFactor = visibleSize.height() / (float)mapRect.height();
Point tilePos2D = Point(relativeMousePos.x * horizontalStretchFactor, relativeMousePos.y * verticalStretchFactor); Point tilePos2D = Point(relativeMousePos.x * horizontalStretchFactor, relativeMousePos.y * verticalStretchFactor);
if(m_followingCreature) if(isFollowingCreature())
tilePos2D += m_followingCreature->getWalkOffset() * scaleFactor; tilePos2D += m_followingCreature->getWalkOffset() * scaleFactor;
tilePos2D /= m_tileSize; tilePos2D /= m_tileSize;

View File

@ -89,6 +89,7 @@ public:
// camera related // camera related
void followCreature(const CreaturePtr& creature); void followCreature(const CreaturePtr& creature);
CreaturePtr getFollowingCreature() { return m_followingCreature; } CreaturePtr getFollowingCreature() { return m_followingCreature; }
bool isFollowingCreature() { return m_followingCreature && m_follow; }
void setCameraPosition(const Position& pos); void setCameraPosition(const Position& pos);
Position getCameraPosition(); Position getCameraPosition();
@ -141,6 +142,7 @@ private:
Boolean<true> m_drawTexts; Boolean<true> m_drawTexts;
Boolean<true> m_smooth; Boolean<true> m_smooth;
Boolean<false> m_drawMinimapColors; Boolean<false> m_drawMinimapColors;
Boolean<true> m_follow;
std::vector<TilePtr> m_cachedVisibleTiles; std::vector<TilePtr> m_cachedVisibleTiles;
std::vector<CreaturePtr> m_cachedFloorVisibleCreatures; std::vector<CreaturePtr> m_cachedFloorVisibleCreatures;
EventPtr m_updateTilesCacheEvent; EventPtr m_updateTilesCacheEvent;

View File

@ -511,6 +511,7 @@ void ProtocolGame::parseCreatureMove(const InputMessagePtr& msg)
// update map tiles // update map tiles
if(!g_map.removeThing(thing)) if(!g_map.removeThing(thing))
g_logger.traceError("could not remove thing"); g_logger.traceError("could not remove thing");
g_map.addThing(thing, newPos); g_map.addThing(thing, newPos);
} }