From 0a1914803fcf4afb6d7cdca47fac01cc56c7ee6e Mon Sep 17 00:00:00 2001 From: insunaa Date: Mon, 1 Apr 2024 10:17:54 +0200 Subject: [PATCH] Chat/GM: Add unkillable command Closes https://github.com/cmangos/mangos-wotlk/pull/510 --- src/game/Chat/Chat.cpp | 1 + src/game/Chat/Chat.h | 1 + src/game/Chat/Level3.cpp | 15 +++++++++++++++ src/game/Entities/Player.cpp | 13 +++++++++++++ src/game/Entities/Player.h | 6 ++++++ 5 files changed, 36 insertions(+) diff --git a/src/game/Chat/Chat.cpp b/src/game/Chat/Chat.cpp index a2b579e19ca..94677bd54bf 100644 --- a/src/game/Chat/Chat.cpp +++ b/src/game/Chat/Chat.cpp @@ -322,6 +322,7 @@ ChatCommand* ChatHandler::getCommandTable() { { "chat", SEC_ADMINISTRATOR, false, &ChatHandler::HandleGMChatCommand, "", nullptr }, { "fly", SEC_ADMINISTRATOR, false, &ChatHandler::HandleGMFlyCommand, "", nullptr }, + { "unkillable", SEC_ADMINISTRATOR, false, &ChatHandler::HandleGMUnkillableCommand, "", nullptr }, { "ingame", SEC_ADMINISTRATOR, true, &ChatHandler::HandleGMListIngameCommand, "", nullptr }, { "list", SEC_ADMINISTRATOR, true, &ChatHandler::HandleGMListFullCommand, "", nullptr }, { "mountup", SEC_ADMINISTRATOR, false, &ChatHandler::HandleGMMountUpCommand, "", nullptr }, diff --git a/src/game/Chat/Chat.h b/src/game/Chat/Chat.h index 40abf530d12..8b49f229677 100644 --- a/src/game/Chat/Chat.h +++ b/src/game/Chat/Chat.h @@ -364,6 +364,7 @@ class ChatHandler bool HandleGMCommand(char* args); bool HandleGMChatCommand(char* args); bool HandleGMFlyCommand(char* args); + bool HandleGMUnkillableCommand(char* args); bool HandleGMListFullCommand(char* args); bool HandleGMListIngameCommand(char* args); bool HandleGMMountUpCommand(char* args); diff --git a/src/game/Chat/Level3.cpp b/src/game/Chat/Level3.cpp index f72f3620dab..68adc39cbaa 100644 --- a/src/game/Chat/Level3.cpp +++ b/src/game/Chat/Level3.cpp @@ -6101,6 +6101,21 @@ bool ChatHandler::HandleGMFlyCommand(char* args) return true; } +bool ChatHandler::HandleGMUnkillableCommand(char* args) +{ + bool value; + if (!ExtractOnOff(&args, value)) + { + SendSysMessage(LANG_USE_BOL); + SetSentErrorMessage(true); + return false; + } + Player* target = m_session->GetPlayer(); + target->SetDeathPrevention(value); + PSendSysMessage("GM Unkillability %s.", value ? "enabled" : "disabled"); + return true; +} + bool ChatHandler::HandlePDumpLoadCommand(char* args) { char* file = ExtractQuotedOrLiteralArg(&args); diff --git a/src/game/Entities/Player.cpp b/src/game/Entities/Player.cpp index 8f06dc00846..090a4350431 100644 --- a/src/game/Entities/Player.cpp +++ b/src/game/Entities/Player.cpp @@ -24809,6 +24809,19 @@ void Player::SendLootError(ObjectGuid guid, LootError error) const SendDirectMessage(data); } +void Player::SetDeathPrevention(bool enable) +{ + if (enable) + m_ExtraFlags |= PLAYER_EXTRA_GM_UNKILLABLE; + else + m_ExtraFlags &= ~PLAYER_EXTRA_GM_UNKILLABLE; +} + +bool Player::IsPreventingDeath() const +{ + return m_ExtraFlags & PLAYER_EXTRA_GM_UNKILLABLE; +} + void Player::ResetDeathTimer() { // 6 minutes until repop at graveyard diff --git a/src/game/Entities/Player.h b/src/game/Entities/Player.h index b6f86443a86..bd3fe9e1ed4 100644 --- a/src/game/Entities/Player.h +++ b/src/game/Entities/Player.h @@ -556,6 +556,9 @@ enum PlayerExtraFlags // other states PLAYER_EXTRA_PVP_DEATH = 0x0100, // store PvP death status until corpse creating. PLAYER_EXTRA_WHISP_RESTRICTION = 0x0200, + + // death prevention + PLAYER_EXTRA_GM_UNKILLABLE = 0x0400, }; // 2^n values @@ -2523,6 +2526,9 @@ class Player : public Unit void SendLootError(ObjectGuid guid, LootError error) const; + void SetDeathPrevention(bool enable); + bool IsPreventingDeath() const override; + // cooldown system virtual void AddGCD(SpellEntry const& spellEntry, uint32 forcedDuration = 0, bool updateClient = false) override; virtual void AddCooldown(SpellEntry const& spellEntry, ItemPrototype const* itemProto = nullptr, bool permanent = false, uint32 forcedDuration = 0, bool ignoreCat = false) override;