From 57f84914c35372dd9e4e8d587a6aba598f651348 Mon Sep 17 00:00:00 2001 From: David Cernat Date: Sun, 14 Jul 2019 22:42:55 +0300 Subject: [PATCH] [Client] Prevent permanent deletion of player markers on cell changes --- apps/openmw/mwgui/mapwindow.cpp | 9 --------- apps/openmw/mwmp/DedicatedPlayer.cpp | 27 +++++++++++++++------------ apps/openmw/mwmp/DedicatedPlayer.hpp | 2 +- apps/openmw/mwmp/LocalPlayer.cpp | 8 ++++++++ apps/openmw/mwmp/PlayerList.cpp | 11 +++++++++++ apps/openmw/mwmp/PlayerList.hpp | 2 ++ 6 files changed, 37 insertions(+), 22 deletions(-) diff --git a/apps/openmw/mwgui/mapwindow.cpp b/apps/openmw/mwgui/mapwindow.cpp index fe74a0e1f..437d4395f 100644 --- a/apps/openmw/mwgui/mapwindow.cpp +++ b/apps/openmw/mwgui/mapwindow.cpp @@ -458,15 +458,6 @@ namespace MWGui updateMagicMarkers(); updateCustomMarkers(); - /* - Start of tes3mp addition - - Update player markers when cell changes to fix their locations - */ - updatePlayerMarkers(); - /* - End of tes3mp addition - */ } void LocalMapBase::requestMapRender(const MWWorld::CellStore *cell) diff --git a/apps/openmw/mwmp/DedicatedPlayer.cpp b/apps/openmw/mwmp/DedicatedPlayer.cpp index 0b6041eb2..da7ebd1e6 100644 --- a/apps/openmw/mwmp/DedicatedPlayer.cpp +++ b/apps/openmw/mwmp/DedicatedPlayer.cpp @@ -384,7 +384,9 @@ void DedicatedPlayer::setCell() removeMarker(); // Otherwise, update their marker so the player shows up in the right cell on the world map else - updateMarker(); + { + enableMarker(); + } // If this player is now in a cell that we are the local authority over, we should send them all // NPC data in that cell @@ -408,7 +410,9 @@ void DedicatedPlayer::setCell() void DedicatedPlayer::updateMarker() { if (!markerEnabled) + { return; + } GUIController *gui = Main::get().getGUIController(); @@ -419,7 +423,15 @@ void DedicatedPlayer::updateMarker() gui->mPlayerMarkers.addMarker(marker); } else + { gui->mPlayerMarkers.addMarker(marker, true); + } +} + +void DedicatedPlayer::enableMarker() +{ + markerEnabled = true; + updateMarker(); } void DedicatedPlayer::removeMarker() @@ -431,18 +443,9 @@ void DedicatedPlayer::removeMarker() GUIController *gui = Main::get().getGUIController(); if (gui->mPlayerMarkers.contains(marker)) - Main::get().getGUIController()->mPlayerMarkers.deleteMarker(marker); -} - -void DedicatedPlayer::setMarkerState(bool state) -{ - if (state) { - markerEnabled = true; - updateMarker(); + Main::get().getGUIController()->mPlayerMarkers.deleteMarker(marker); } - else - removeMarker(); } void DedicatedPlayer::playAnimation() @@ -472,7 +475,7 @@ void DedicatedPlayer::createReference(const std::string& recId) ESM::CustomMarker mEditingMarker = Main::get().getGUIController()->createMarker(guid); marker = mEditingMarker; - setMarkerState(true); + enableMarker(); } void DedicatedPlayer::deleteReference() diff --git a/apps/openmw/mwmp/DedicatedPlayer.hpp b/apps/openmw/mwmp/DedicatedPlayer.hpp index 4b0cd1dc4..3f76f4d2f 100644 --- a/apps/openmw/mwmp/DedicatedPlayer.hpp +++ b/apps/openmw/mwmp/DedicatedPlayer.hpp @@ -47,7 +47,7 @@ namespace mwmp void updateMarker(); void removeMarker(); - void setMarkerState(bool state); + void enableMarker(); void playAnimation(); void playSpeech(); diff --git a/apps/openmw/mwmp/LocalPlayer.cpp b/apps/openmw/mwmp/LocalPlayer.cpp index 9ef04afcd..91cae931d 100644 --- a/apps/openmw/mwmp/LocalPlayer.cpp +++ b/apps/openmw/mwmp/LocalPlayer.cpp @@ -36,6 +36,7 @@ #include "LocalPlayer.hpp" #include "Main.hpp" #include "Networking.hpp" +#include "PlayerList.hpp" #include "CellController.hpp" #include "GUIController.hpp" #include "MechanicsHelper.hpp" @@ -463,6 +464,13 @@ void LocalPlayer::updateCell(bool forceUpdate) getNetworking()->getPlayerPacket(ID_PLAYER_CELL_CHANGE)->Send(); isChangingRegion = false; + + // If this is an interior cell, are there any other players in it? If so, + // enable their markers + if (!ptrCell->isExterior()) + { + mwmp::PlayerList::enableMarkers(*ptrCell); + } } } diff --git a/apps/openmw/mwmp/PlayerList.cpp b/apps/openmw/mwmp/PlayerList.cpp index 9860f98aa..d56fbea79 100644 --- a/apps/openmw/mwmp/PlayerList.cpp +++ b/apps/openmw/mwmp/PlayerList.cpp @@ -92,6 +92,17 @@ bool PlayerList::isDedicatedPlayer(const MWWorld::Ptr &ptr) return (getPlayer(ptr) != 0); } +void PlayerList::enableMarkers(const ESM::Cell& cell) +{ + for (auto &playerEntry : players) + { + if (Main::get().getCellController()->isSameCell(cell, playerEntry.second->cell)) + { + playerEntry.second->enableMarker(); + } + } +} + /* Go through all DedicatedPlayers checking if their mHitAttemptActorId matches this one and set it to -1 if it does diff --git a/apps/openmw/mwmp/PlayerList.hpp b/apps/openmw/mwmp/PlayerList.hpp index c8a9eb959..1cdb8d6a9 100644 --- a/apps/openmw/mwmp/PlayerList.hpp +++ b/apps/openmw/mwmp/PlayerList.hpp @@ -37,6 +37,8 @@ namespace mwmp static bool isDedicatedPlayer(const MWWorld::Ptr &ptr); + static void enableMarkers(const ESM::Cell& cell); + static void clearHitAttemptActorId(int actorId); private: