diff options
-rw-r--r-- | src/being/localplayer.cpp | 18 | ||||
-rw-r--r-- | src/being/localplayer.h | 4 | ||||
-rw-r--r-- | src/client.cpp | 3 | ||||
-rw-r--r-- | src/gui/dialogsmanager.cpp | 30 | ||||
-rw-r--r-- | src/gui/dialogsmanager.h | 10 | ||||
-rw-r--r-- | src/gui/windows/okdialog.cpp | 1 | ||||
-rw-r--r-- | src/listeners/playerpostdeathlistener.h | 6 | ||||
-rw-r--r-- | src/net/ea/playerhandler.cpp | 21 |
8 files changed, 65 insertions, 28 deletions
diff --git a/src/being/localplayer.cpp b/src/being/localplayer.cpp index 935b64c70..a9a51bd56 100644 --- a/src/being/localplayer.cpp +++ b/src/being/localplayer.cpp @@ -110,6 +110,7 @@ extern SkillDialog *skillDialog; LocalPlayer::LocalPlayer(const int id, const uint16_t subtype) : Being(id, ActorType::Player, subtype, nullptr), AttributeListener(), + PlayerDeathListener(), StatListener(), mGMLevel(0), mCrazyMoveState(0), @@ -1106,6 +1107,13 @@ void LocalPlayer::attributeChanged(const int id, case Attributes::LEVEL: mLevel = newVal; break; + case Attributes::HP: + if (oldVal != 0 && newVal == 0 + && localPlayer->getCurrentAction() != BeingAction::DEAD) + { + PlayerDeathListener::distributeEvent(); + } + break; default: break; } @@ -3276,3 +3284,13 @@ void LocalPlayer::setTestParticle(const std::string &fileName, mTestParticleHash = UpdaterWindow::getFileHash(mTestParticleName); } } + +void LocalPlayer::playerDeath() +{ + if (mAction != BeingAction::DEAD) + { + setAction(BeingAction::DEAD, 0); + recalcSpritesOrder(); + } +} + diff --git a/src/being/localplayer.h b/src/being/localplayer.h index 46ed22cb8..dd5043572 100644 --- a/src/being/localplayer.h +++ b/src/being/localplayer.h @@ -31,6 +31,7 @@ #include "listeners/actorspritelistener.h" #include "listeners/attributelistener.h" +#include "listeners/playerdeathlistener.h" #include "listeners/statlistener.h" #include <vector> @@ -49,6 +50,7 @@ class OkDialog; class LocalPlayer final : public Being, public ActorSpriteListener, public AttributeListener, + public PlayerDeathListener, public StatListener { public: @@ -289,6 +291,8 @@ class LocalPlayer final : public Being, */ void optionChanged(const std::string &value) override final; + void playerDeath() override final; + /** * set a following player. */ diff --git a/src/client.cpp b/src/client.cpp index f0919ed9a..b12d4a004 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -382,7 +382,7 @@ void Client::gameInit() gui = new Gui(); gui->postInit(mainGraphics); - + dialogsManager = new DialogsManager; popupManager = new PopupManager; initSoundManager(); @@ -654,6 +654,7 @@ void Client::gameClear() delete2(mCurrentDialog); delete2(popupManager); + delete2(dialogsManager); delete2(gui); if (inventoryHandler) diff --git a/src/gui/dialogsmanager.cpp b/src/gui/dialogsmanager.cpp index 0b515c2f3..0ef8a1582 100644 --- a/src/gui/dialogsmanager.cpp +++ b/src/gui/dialogsmanager.cpp @@ -36,8 +36,12 @@ #include "gui/windows/okdialog.h" #include "gui/windows/updaterwindow.h" +#include "listeners/playerpostdeathlistener.h" + #include "net/inventoryhandler.h" +#include "resources/db/deaddb.h" + #include "utils/gettext.h" #include "debug.h" @@ -46,7 +50,18 @@ #undef ERROR #endif -extern OkDialog *deathNotice; +OkDialog *deathNotice; +DialogsManager *dialogsManager = nullptr; + +namespace +{ + PlayerPostDeathListener postDeathListener; +} // namespace + +DialogsManager::DialogsManager() : + PlayerDeathListener() +{ +} void DialogsManager::closeDialogs() { @@ -96,3 +111,16 @@ Window *DialogsManager::openErrorDialog(const std::string &header, return dialog; } } + +void DialogsManager::playerDeath() +{ + logger->log("DialogsManager::playerDeath"); + // TRANSLATORS: message header + deathNotice = new OkDialog(_("Message"), + DeadDB::getRandomString(), + // TRANSLATORS: ok dialog button + _("Revive"), + DialogType::OK, + false, true, nullptr, 260); + deathNotice->addActionListener(&postDeathListener); +} diff --git a/src/gui/dialogsmanager.h b/src/gui/dialogsmanager.h index 9c7dc0d46..b9625ae07 100644 --- a/src/gui/dialogsmanager.h +++ b/src/gui/dialogsmanager.h @@ -23,15 +23,19 @@ #ifndef GUI_DIALOGSMANAGER_H #define GUI_DIALOGSMANAGER_H +#include "listeners/playerdeathlistener.h" + #include <string> #include "localconsts.h" class Window; -class DialogsManager final +class DialogsManager final : public PlayerDeathListener { public: + DialogsManager(); + static void closeDialogs(); static void createUpdaterWindow(); @@ -39,6 +43,10 @@ class DialogsManager final static Window *openErrorDialog(const std::string &header, const std::string &message, const bool modal); + + void playerDeath() override final; }; +extern DialogsManager *dialogsManager; + #endif // GUI_DIALOGSMANAGER_H diff --git a/src/gui/windows/okdialog.cpp b/src/gui/windows/okdialog.cpp index b6c3bfc41..37d0d018a 100644 --- a/src/gui/windows/okdialog.cpp +++ b/src/gui/windows/okdialog.cpp @@ -35,7 +35,6 @@ #include "debug.h" OkDialog *weightNotice = nullptr; -OkDialog *deathNotice = nullptr; OkDialog::OkDialog(const std::string &restrict title, const std::string &restrict msg, diff --git a/src/listeners/playerpostdeathlistener.h b/src/listeners/playerpostdeathlistener.h index 6ab8fd25b..152dbd361 100644 --- a/src/listeners/playerpostdeathlistener.h +++ b/src/listeners/playerpostdeathlistener.h @@ -20,8 +20,8 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef LISTENERS_PLAYERDEATHLISTENER_H -#define LISTENERS_PLAYERDEATHLISTENER_H +#ifndef LISTENERS_PLAYERPOSTDEATHLISTENER_H +#define LISTENERS_PLAYERPOSTDEATHLISTENER_H #include "being/localplayer.h" @@ -60,4 +60,4 @@ struct PlayerPostDeathListener final : public ActionListener } }; -#endif // LISTENERS_PLAYERDEATHLISTENER_H +#endif // LISTENERS_PLAYERPOSTDEATHLISTENER_H diff --git a/src/net/ea/playerhandler.cpp b/src/net/ea/playerhandler.cpp index 940b629d4..2835b3def 100644 --- a/src/net/ea/playerhandler.cpp +++ b/src/net/ea/playerhandler.cpp @@ -41,11 +41,8 @@ #include "resources/notifytypes.h" -#include "resources/db/deaddb.h" - #include "resources/map/map.h" -#include "listeners/playerpostdeathlistener.h" #include "listeners/weightlistener.h" #include "net/messagein.h" @@ -65,7 +62,6 @@ static const int MAP_TELEPORT_SCROLL_DISTANCE = 8; namespace { WeightListener weightListener; - PlayerPostDeathListener postDeathListener; } // anonymous namespace namespace Ea @@ -186,23 +182,6 @@ void PlayerHandler::processPlayerStatUpdate1(Net::MessageIn &msg) } playerHandler->setStat(type, value, -1, true); - - if (PlayerInfo::getAttribute(Attributes::HP) == 0 && !deathNotice) - { - // TRANSLATORS: message header - deathNotice = new OkDialog(_("Message"), - DeadDB::getRandomString(), - // TRANSLATORS: ok dialog button - _("Revive"), - DialogType::OK, - false, true, nullptr, 260); - deathNotice->addActionListener(&postDeathListener); - if (localPlayer->getCurrentAction() != BeingAction::DEAD) - { - localPlayer->setAction(BeingAction::DEAD, 0); - localPlayer->recalcSpritesOrder(); - } - } BLOCK_END("PlayerHandler::processPlayerStatUpdate1") } |