Skip to content

Commit

Permalink
Implement .freezplayer/.unfreezlayer command (#144)
Browse files Browse the repository at this point in the history
REQUIRES DB UPDATE : Rel22_01_010_freeze_gm_command.sql

This command will apply freeze aura (spellId:9454) :
- Player cannot more anymore or use any spell nor logout ;
- Effet does not disappear even if player quits game via ALT+F4.....Can only be removed by an GM using ".unfreezeplayer" command or .unaura command

A GM with lower security level cannot freeze another GM with a higher security level.
  • Loading branch information
Elmsroth authored and billy1arm committed Jul 3, 2022
1 parent ac55373 commit 7046cdb
Show file tree
Hide file tree
Showing 6 changed files with 1,291 additions and 998 deletions.
213 changes: 212 additions & 1 deletion src/game/ChatCommands/CastAndAuraCommands.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@
CommandTable : castCommandTable
/***********************************************************************/

bool AddAuraToPlayer(const SpellEntry* spellInfo, Unit* target, WorldObject* caster);

bool ChatHandler::HandleCastCommand(char* args)
{
if (!*args)
Expand Down Expand Up @@ -321,4 +323,213 @@ bool ChatHandler::HandleUnAuraCommand(char* args)
target->RemoveAurasDueToSpell(spellID);

return true;
}
}

/**********************************************************************
CommandTable : Main Command table
/***********************************************************************/

bool ChatHandler::HandleAuraGroupCommand(char* args)
{
// number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r or Htalent form
uint32 spellID = ExtractSpellIdFromLink(&args);

SpellEntry const* spellInfo = sSpellStore.LookupEntry(spellID);
if (!spellInfo)
{
PSendSysMessage("Spell %u does not exists", spellID);
return false;
}

if (!IsSpellAppliesAura(spellInfo, (1 << EFFECT_INDEX_0) | (1 << EFFECT_INDEX_1) | (1 << EFFECT_INDEX_2)) &&
!IsSpellHaveEffect(spellInfo, SPELL_EFFECT_PERSISTENT_AREA_AURA))
{
PSendSysMessage(LANG_SPELL_NO_HAVE_AURAS, spellID);
SetSentErrorMessage(true);
return false;
}

Unit* rawTarget = getSelectedUnit();
Player* playerTarget ;

if (rawTarget)
{
if (rawTarget->GetTypeId() == TYPEID_UNIT)
{
SendSysMessage(LANG_NO_CHAR_SELECTED);
SetSentErrorMessage(true);
return false;
}

playerTarget = (Player*)rawTarget;
}
else
{
playerTarget = m_session->GetPlayer();
}


Group* grp = playerTarget->GetGroup();

if (!grp)
{
std::string nameLink = GetNameLink(playerTarget);

if (playerTarget->IsDead())
{
PSendSysMessage(LANG_COMMAND_AURAGROUP_CANNOT_APPLY_AURA_PLAYER_IS_DEAD, nameLink.c_str());
return false;
}
else
{
AddAuraToPlayer(spellInfo, playerTarget, m_session->GetPlayer());
PSendSysMessage(LANG_COMMAND_AURAGROUP_AURA_APPLIED, spellInfo->Id, nameLink.c_str());
return true;
}
}
else
{
// Apply to all members of the group
for (GroupReference* itr = grp->GetFirstMember(); itr != NULL; itr = itr->next())
{
Player* pl = itr->getSource();

//Skip if player is not found
if (!pl || !pl->GetSession())
{
continue;
}

std::string nameLink = GetNameLink(pl);

//skip if player is dead
if (pl->IsDead())
{
PSendSysMessage(LANG_COMMAND_AURAGROUP_CANNOT_APPLY_AURA_PLAYER_IS_DEAD, nameLink.c_str());
continue;
}

AddAuraToPlayer(spellInfo, pl, m_session->GetPlayer());
PSendSysMessage(LANG_COMMAND_AURAGROUP_AURA_APPLIED, spellInfo->Id, nameLink.c_str());

}

return true;
}
}

bool ChatHandler::HandleUnAuraGroupCommand(char* args)
{
// Must have args : spellId or "all"
if(!*args)
{
return false;
}

bool removeAll = false;

std::string argstr = args;
if (argstr == "all")
{
removeAll = true;
}

uint32 spellIdToRemove;

if (!removeAll)
{
spellIdToRemove = ExtractSpellIdFromLink(&args);
if (!spellIdToRemove)
{
return false;
}
}

// Now remove the aura(s)
Unit* rawTarget = getSelectedUnit();
Player* playerTarget;

if (rawTarget)
{
if (rawTarget->GetTypeId() == TYPEID_UNIT)
{
SendSysMessage(LANG_NO_CHAR_SELECTED);
SetSentErrorMessage(true);
return false;
}

playerTarget = (Player*)rawTarget;
}
else
{
playerTarget = m_session->GetPlayer();
}


Group* grp = playerTarget->GetGroup();

if (!grp)
{
std::string nameLink = GetNameLink(playerTarget);

//security : avoid to remove ghost form if player is dead
if (playerTarget->IsDead())
{
PSendSysMessage(LANG_COMMAND_AURAGROUP_CANNOT_UNAURA_DEAD_PLAYER, nameLink.c_str());
return false;
}
else
{
if (removeAll)
{
playerTarget->RemoveAllAuras();
PSendSysMessage(LANG_COMMAND_AURAGROUP_ALL_AURA_REMOVED, nameLink.c_str());
}
else
{
playerTarget->RemoveAurasDueToSpell(spellIdToRemove);
PSendSysMessage(LANG_COMMAND_AURAGROUP_AURA_REMOVED_FOR_SPELL, spellIdToRemove, nameLink.c_str());
}

return true;
}
}
else
{
// Apply to all members of the group
for (GroupReference* itr = grp->GetFirstMember(); itr != NULL; itr = itr->next())
{
Player* pl = itr->getSource();

if (!pl || !pl->GetSession())
{
continue;
}

std::string nameLink = GetNameLink(pl);
if (pl->IsDead())
{
PSendSysMessage(LANG_COMMAND_AURAGROUP_CANNOT_UNAURA_DEAD_PLAYER, nameLink.c_str());
continue;
}
else
{
if (removeAll)
{
pl->RemoveAllAuras();
PSendSysMessage(LANG_COMMAND_AURAGROUP_ALL_AURA_REMOVED, nameLink.c_str());
}
else
{
pl->RemoveAurasDueToSpell(spellIdToRemove);
PSendSysMessage(LANG_COMMAND_AURAGROUP_AURA_REMOVED_FOR_SPELL, spellIdToRemove, nameLink.c_str());
}

}

}

return true;
}
}

125 changes: 124 additions & 1 deletion src/game/ChatCommands/GMCommands.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -375,7 +375,6 @@ bool ChatHandler::HandleModifyStandStateCommand(char* args)
return true;
}


bool ChatHandler::HandleChangeWeatherCommand(char* args)
{
// Weather is OFF
Expand Down Expand Up @@ -425,3 +424,127 @@ bool ChatHandler::HandleChangeWeatherCommand(char* args)

return true;
}

// Internal shortcut function to freeze a player
bool freezePlayer(Player* player, WorldObject* caster)
{
SpellEntry const* spellInfo = sSpellStore.LookupEntry(SPELL_GM_FREEZE);
return AddAuraToPlayer(spellInfo, player, caster);
}

// Internal shortcut function to freeze a player
void unFreezePlayer(Player* player)
{
player->RemoveAurasDueToSpell(SPELL_GM_FREEZE);
}


bool ChatHandler::HandleFreezePlayerCommand(char* args)
{
Player* targetPlayer = nullptr;

// 1. Try to extract player name from args if not empty
if (*args)
{
char* playerName = ExtractLiteralArg(&args);

if (!ExtractPlayerTarget(&playerName, &targetPlayer))
{
SendSysMessage(LANG_COMMAND_FREEZE_PLAYER_PLAYER_NOT_FOUND);
SetSentErrorMessage(true);
return false;
}
}

// 2. If arg is empty, gets the current selected target (returns current player if no unit selected)
if (!targetPlayer)
{
Unit* selectedTtarget = getSelectedPlayer();

if (!selectedTtarget)
{
SendSysMessage(LANG_NO_CHAR_SELECTED);
SetSentErrorMessage(true);
return false;
}
targetPlayer = (Player*)selectedTtarget;
}


const char* targetName = targetPlayer->GetName();
Player * currentGM = m_session->GetPlayer();

// Prevent freezing yourself !
if (targetPlayer == currentGM)
{
SendSysMessage(LANG_NO_CHAR_SELECTED);
SendSysMessage(LANG_COMMAND_FREEZE_PLAYER_CANNOT_FREEZE_YOURSELF);
SetSentErrorMessage(true);
return false;
}

// Check if target can be freezed
if (targetPlayer->GetSession()->GetSecurity() > m_session->GetSecurity())
{
PSendSysMessage(LANG_COMMAND_FREEZE_PLAYER_CANNOT_FREEZE_HIGHER_SECLEVEL, targetName);
SetSentErrorMessage(true);
return false;
}

freezePlayer(targetPlayer, currentGM);

// Notif GM
PSendSysMessage(LANG_COMMAND_FREEZE_PLAYER, targetName);

// Send message to player to prevent he has been frozen
ChatHandler(targetPlayer).SendSysMessage(LANG_COMMAND_FREEZE_PLAYER_YOU_HAVE_BEEN_FROZEN);

return true;
}


bool ChatHandler::HandleUnfreezePlayerCommand(char* args)
{

Player* targetPlayer = nullptr;

// 1. Try to extract player name from args if not empty
if (*args)
{
char* playerName = ExtractLiteralArg(&args);

if (!ExtractPlayerTarget(&playerName, &targetPlayer))
{
SendSysMessage(LANG_COMMAND_UNFREEZE_PLAYER_PLAYER_NOT_FOUND);
SetSentErrorMessage(true);
return false;
}
}

// 2. If arg is empty, gets the current selected target (returns current player if no unit selected)
if (!targetPlayer)
{
Unit* selectedTtarget = getSelectedPlayer();

if (!selectedTtarget)
{
SendSysMessage(LANG_NO_CHAR_SELECTED);
SetSentErrorMessage(true);
return false;
}
targetPlayer = (Player*)selectedTtarget;
}

unFreezePlayer(targetPlayer);

// Notif GM
PSendSysMessage(LANG_COMMAND_UNFREEZE_PLAYER, targetPlayer->GetName());

// Send message to player to prevent he has been unfrozen
ChatHandler(targetPlayer).SendSysMessage(LANG_COMMAND_FREEZE_PLAYER_YOU_HAVE_BEEN_UNFROZEN);

return true;
}



7 changes: 4 additions & 3 deletions src/game/Server/SharedDefines.h
Original file line number Diff line number Diff line change
Expand Up @@ -2824,9 +2824,10 @@ enum CreatureEntriesConsts

enum SpellEntriesConsts
{
SPELL_FILLING_EMPTY_JAR__CURSED_OOZE = 15698,
SPELL_FILLING_EMPTY_JAR__TAINTED_OOZE = 15699,
SPELL_FILLING_EMPTY_JAR__PURE_OOZE = 15702, // (Works on Primal, Muculent and Glutonous Ooze)
SPELL_FILLING_EMPTY_JAR__CURSED_OOZE = 15698,
SPELL_FILLING_EMPTY_JAR__TAINTED_OOZE = 15699,
SPELL_FILLING_EMPTY_JAR__PURE_OOZE = 15702, // (Works on Primal, Muculent and Glutonous Ooze)
SPELL_GM_FREEZE = 9454,
};

#endif

1 comment on commit 7046cdb

@billy1arm
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Correction: DB Change is file: Rel22_03_016_freeze_gm_command.sql

Please sign in to comment.