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:
parent
c8d9833444
commit
902ce06e88
|
@ -27,3 +27,4 @@ CMakeLists.txt.user*
|
||||||
/modules/myotclientrc.lua
|
/modules/myotclientrc.lua
|
||||||
!.gitignore
|
!.gitignore
|
||||||
otclient.map
|
otclient.map
|
||||||
|
otclient.layout
|
||||||
|
|
|
@ -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 |
|
@ -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)
|
||||||
|
|
|
@ -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 |
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue