mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-02-04 12:39:55 +00:00
Fix disabled door markers appearing on the map (Fixes #3348)
This commit is contained in:
parent
3925f1fe81
commit
ddbfe0c944
@ -163,7 +163,6 @@ namespace MWGui
|
||||
, mInterior(false)
|
||||
, mLocalMap(NULL)
|
||||
, mCompass(NULL)
|
||||
, mPrefix()
|
||||
, mChanged(true)
|
||||
, mFogOfWarToggled(true)
|
||||
, mFogOfWarEnabled(fogOfWarEnabled)
|
||||
@ -174,6 +173,7 @@ namespace MWGui
|
||||
, mMarkerUpdateTimer(0.0f)
|
||||
, mLastDirectionX(0.0f)
|
||||
, mLastDirectionY(0.0f)
|
||||
, mNeedDoorMarkersUpdate(false)
|
||||
{
|
||||
mCustomMarkers.eventMarkersChanged += MyGUI::newDelegate(this, &LocalMapBase::updateCustomMarkers);
|
||||
}
|
||||
@ -368,12 +368,6 @@ namespace MWGui
|
||||
|
||||
applyFogOfWar();
|
||||
|
||||
|
||||
// clear all previous door markers
|
||||
for (std::vector<MyGUI::Widget*>::iterator it = mDoorMarkerWidgets.begin(); it != mDoorMarkerWidgets.end(); ++it)
|
||||
MyGUI::Gui::getInstance().destroyWidget(*it);
|
||||
mDoorMarkerWidgets.clear();
|
||||
|
||||
// Update the map textures
|
||||
TextureVector textures;
|
||||
for (int mx=0; mx<mNumCells; ++mx)
|
||||
@ -399,60 +393,9 @@ namespace MWGui
|
||||
}
|
||||
mMapTextures.swap(textures);
|
||||
|
||||
MWBase::World* world = MWBase::Environment::get().getWorld();
|
||||
|
||||
// Retrieve the door markers we want to show
|
||||
std::vector<MWBase::World::DoorMarker> doors;
|
||||
if (interior)
|
||||
{
|
||||
MWWorld::CellStore* cell = world->getInterior (mPrefix);
|
||||
world->getDoorMarkers(cell, doors);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int dX=-mCellDistance; dX<=mCellDistance; ++dX)
|
||||
{
|
||||
for (int dY=-mCellDistance; dY<=mCellDistance; ++dY)
|
||||
{
|
||||
MWWorld::CellStore* cell = world->getExterior (mCurX+dX, mCurY+dY);
|
||||
world->getDoorMarkers(cell, doors);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Create a widget for each marker
|
||||
int counter = 0;
|
||||
for (std::vector<MWBase::World::DoorMarker>::iterator it = doors.begin(); it != doors.end(); ++it)
|
||||
{
|
||||
MWBase::World::DoorMarker marker = *it;
|
||||
|
||||
std::vector<std::string> destNotes;
|
||||
CustomMarkerCollection::RangeType markers = mCustomMarkers.getMarkers(marker.dest);
|
||||
for (CustomMarkerCollection::ContainerType::const_iterator it = markers.first; it != markers.second; ++it)
|
||||
destNotes.push_back(it->second.mNote);
|
||||
|
||||
MarkerUserData data (mLocalMapRender);
|
||||
data.notes = destNotes;
|
||||
data.caption = marker.name;
|
||||
MyGUI::IntPoint widgetPos = getMarkerPosition(marker.x, marker.y, data);
|
||||
MyGUI::IntCoord widgetCoord(widgetPos.left - 4,
|
||||
widgetPos.top - 4,
|
||||
8, 8);
|
||||
++counter;
|
||||
MarkerWidget* markerWidget = mLocalMap->createWidget<MarkerWidget>("MarkerButton",
|
||||
widgetCoord, MyGUI::Align::Default);
|
||||
markerWidget->setNormalColour(MyGUI::Colour::parse(MyGUI::LanguageManager::getInstance().replaceTags("#{fontcolour=normal}")));
|
||||
markerWidget->setHoverColour(MyGUI::Colour::parse(MyGUI::LanguageManager::getInstance().replaceTags("#{fontcolour=normal_over}")));
|
||||
markerWidget->setDepth(Local_MarkerLayer);
|
||||
markerWidget->setNeedMouseFocus(true);
|
||||
// Used by tooltips to not show the tooltip if marker is hidden by fog of war
|
||||
markerWidget->setUserString("ToolTipType", "MapMarker");
|
||||
|
||||
markerWidget->setUserData(data);
|
||||
doorMarkerCreated(markerWidget);
|
||||
|
||||
mDoorMarkerWidgets.push_back(markerWidget);
|
||||
}
|
||||
// Delay the door markers update until scripts have been given a chance to run.
|
||||
// If we don't do this, door markers that should be disabled will still appear on the map.
|
||||
mNeedDoorMarkersUpdate = true;
|
||||
|
||||
updateMagicMarkers();
|
||||
updateCustomMarkers();
|
||||
@ -565,6 +508,12 @@ namespace MWGui
|
||||
|
||||
void LocalMapBase::onFrame(float dt)
|
||||
{
|
||||
if (mNeedDoorMarkersUpdate)
|
||||
{
|
||||
updateDoorMarkers();
|
||||
mNeedDoorMarkersUpdate = false;
|
||||
}
|
||||
|
||||
mMarkerUpdateTimer += dt;
|
||||
|
||||
if (mMarkerUpdateTimer >= 0.25)
|
||||
@ -574,6 +523,69 @@ namespace MWGui
|
||||
}
|
||||
}
|
||||
|
||||
void LocalMapBase::updateDoorMarkers()
|
||||
{
|
||||
// clear all previous door markers
|
||||
for (std::vector<MyGUI::Widget*>::iterator it = mDoorMarkerWidgets.begin(); it != mDoorMarkerWidgets.end(); ++it)
|
||||
MyGUI::Gui::getInstance().destroyWidget(*it);
|
||||
mDoorMarkerWidgets.clear();
|
||||
|
||||
MWBase::World* world = MWBase::Environment::get().getWorld();
|
||||
|
||||
// Retrieve the door markers we want to show
|
||||
std::vector<MWBase::World::DoorMarker> doors;
|
||||
if (mInterior)
|
||||
{
|
||||
MWWorld::CellStore* cell = world->getInterior (mPrefix);
|
||||
world->getDoorMarkers(cell, doors);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int dX=-mCellDistance; dX<=mCellDistance; ++dX)
|
||||
{
|
||||
for (int dY=-mCellDistance; dY<=mCellDistance; ++dY)
|
||||
{
|
||||
MWWorld::CellStore* cell = world->getExterior (mCurX+dX, mCurY+dY);
|
||||
world->getDoorMarkers(cell, doors);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Create a widget for each marker
|
||||
int counter = 0;
|
||||
for (std::vector<MWBase::World::DoorMarker>::iterator it = doors.begin(); it != doors.end(); ++it)
|
||||
{
|
||||
MWBase::World::DoorMarker marker = *it;
|
||||
|
||||
std::vector<std::string> destNotes;
|
||||
CustomMarkerCollection::RangeType markers = mCustomMarkers.getMarkers(marker.dest);
|
||||
for (CustomMarkerCollection::ContainerType::const_iterator it = markers.first; it != markers.second; ++it)
|
||||
destNotes.push_back(it->second.mNote);
|
||||
|
||||
MarkerUserData data (mLocalMapRender);
|
||||
data.notes = destNotes;
|
||||
data.caption = marker.name;
|
||||
MyGUI::IntPoint widgetPos = getMarkerPosition(marker.x, marker.y, data);
|
||||
MyGUI::IntCoord widgetCoord(widgetPos.left - 4,
|
||||
widgetPos.top - 4,
|
||||
8, 8);
|
||||
++counter;
|
||||
MarkerWidget* markerWidget = mLocalMap->createWidget<MarkerWidget>("MarkerButton",
|
||||
widgetCoord, MyGUI::Align::Default);
|
||||
markerWidget->setNormalColour(MyGUI::Colour::parse(MyGUI::LanguageManager::getInstance().replaceTags("#{fontcolour=normal}")));
|
||||
markerWidget->setHoverColour(MyGUI::Colour::parse(MyGUI::LanguageManager::getInstance().replaceTags("#{fontcolour=normal_over}")));
|
||||
markerWidget->setDepth(Local_MarkerLayer);
|
||||
markerWidget->setNeedMouseFocus(true);
|
||||
// Used by tooltips to not show the tooltip if marker is hidden by fog of war
|
||||
markerWidget->setUserString("ToolTipType", "MapMarker");
|
||||
|
||||
markerWidget->setUserData(data);
|
||||
doorMarkerCreated(markerWidget);
|
||||
|
||||
mDoorMarkerWidgets.push_back(markerWidget);
|
||||
}
|
||||
}
|
||||
|
||||
void LocalMapBase::updateMagicMarkers()
|
||||
{
|
||||
// clear all previous markers
|
||||
|
@ -155,6 +155,10 @@ namespace MWGui
|
||||
|
||||
float mLastDirectionX;
|
||||
float mLastDirectionY;
|
||||
|
||||
private:
|
||||
void updateDoorMarkers();
|
||||
bool mNeedDoorMarkersUpdate;
|
||||
};
|
||||
|
||||
class EditNoteDialog : public MWGui::WindowModal
|
||||
|
Loading…
x
Reference in New Issue
Block a user