aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/game/Chat.cpp3
-rw-r--r--src/game/Chat.h3
-rw-r--r--src/game/Language.h7
-rw-r--r--src/game/Level3.cpp176
-rw-r--r--src/game/MiscHandler.cpp1
-rw-r--r--src/trinitycore/trinitycore.conf.dist4
6 files changed, 192 insertions, 2 deletions
diff --git a/src/game/Chat.cpp b/src/game/Chat.cpp
index 27e692a29f7..b8950d5da82 100644
--- a/src/game/Chat.cpp
+++ b/src/game/Chat.cpp
@@ -472,6 +472,9 @@ ChatCommand * ChatHandler::getCommandTable()
{ "cometome", SEC_ADMINISTRATOR, &ChatHandler::HandleComeToMeCommand, "", NULL },
{ "damage", SEC_ADMINISTRATOR, &ChatHandler::HandleDamageCommand, "", NULL },
{ "combatstop", SEC_GAMEMASTER, &ChatHandler::HandleCombatStopCommand, "", NULL },
+ { "freeze", SEC_ADMINISTRATOR, &ChatHandler::HandleFreezeCommand, "", NULL },
+ { "unfreeze", SEC_ADMINISTRATOR, &ChatHandler::HandleUnFreezeCommand, "", NULL },
+ { "listfreeze", SEC_ADMINISTRATOR, &ChatHandler::HandleListFreezeCommand, "", NULL },
{ "flusharenapoints", SEC_ADMINISTRATOR, &ChatHandler::HandleFlushArenaPointsCommand, "", NULL },
{ NULL, 0, NULL, "", NULL }
diff --git a/src/game/Chat.h b/src/game/Chat.h
index 369043306c2..e6cbb4cb83a 100644
--- a/src/game/Chat.h
+++ b/src/game/Chat.h
@@ -245,6 +245,9 @@ class ChatHandler
bool HandleMuteCommand(const char* args);
bool HandleUnmuteCommand(const char* args);
bool HandleMovegensCommand(const char* args);
+ bool HandleFreezeCommand(const char *args);
+ bool HandleUnFreezeCommand(const char *args);
+ bool HandleListFreezeCommand(const char* args);
bool HandleBanCommand(const char* args);
bool HandleUnBanCommand(const char* args);
diff --git a/src/game/Language.h b/src/game/Language.h
index 9e7af05511c..20df6e7fe70 100644
--- a/src/game/Language.h
+++ b/src/game/Language.h
@@ -659,6 +659,13 @@ enum TrinityStrings
// Room for in-game strings 810-999 not used
// FREE IDS 1000-9999
+ LANG_COMMAND_FREEZE = 1000,
+ LANG_COMMAND_FREEZE_ERROR = 1001,
+ LANG_COMMAND_FREEZE_WRONG = 1002,
+ LANG_COMMAND_UNFREEZE = 1003,
+ LANG_COMMAND_NO_FROZEN_PLAYERS = 1004,
+ LANG_COMMAND_LIST_FREEZE = 1005,
+ LANG_COMMAND_FROZEN_PLAYERS = 1006,
// Use for not-in-svn patches 10000-10999
// opvp hp
diff --git a/src/game/Level3.cpp b/src/game/Level3.cpp
index 67520f63849..050b70fce6d 100644
--- a/src/game/Level3.cpp
+++ b/src/game/Level3.cpp
@@ -5507,6 +5507,182 @@ bool ChatHandler::HandleInstanceSaveDataCommand(const char * /*args*/)
return true;
}
+bool ChatHandler::HandleFreezeCommand(const char *args)
+{
+ std::string name;
+ Player* player;
+ char* TargetName = strtok((char*)args, " "); //get entered name
+ if (!TargetName) //if no name entered use target
+ {
+ player = getSelectedPlayer();
+ if (player) //prevent crash with creature as target
+ {
+ name = player->GetName();
+ normalizePlayerName(name);
+ }
+ }
+ else // if name entered
+ {
+ name = TargetName;
+ normalizePlayerName(name);
+ player = objmgr.GetPlayer(name.c_str()); //get player by name
+ }
+
+ if (!player)
+ {
+ SendSysMessage(LANG_COMMAND_FREEZE_WRONG);
+ return true;
+ }
+
+ if (player==m_session->GetPlayer())
+ {
+ SendSysMessage(LANG_COMMAND_FREEZE_ERROR);
+ return true;
+ }
+
+ //effect
+ if ((player) && (!(player==m_session->GetPlayer())))
+ {
+ PSendSysMessage(LANG_COMMAND_FREEZE,name.c_str());
+
+ //stop combat + make player unattackable + duel stop + stop some spells
+ player->setFaction(35);
+ player->CombatStop();
+ if(player->IsNonMeleeSpellCasted(true))
+ player->InterruptNonMeleeSpells(true);
+ player->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ player->SetUInt32Value(PLAYER_DUEL_TEAM, 1);
+
+ //if player class = hunter || warlock remove pet if alive
+ if((player->getClass() == CLASS_HUNTER) || (player->getClass() == CLASS_WARLOCK))
+ {
+ if(Pet* pet = player->GetPet())
+ {
+ pet->SavePetToDB(PET_SAVE_AS_CURRENT);
+ // not let dismiss dead pet
+ if(pet && pet->isAlive())
+ player->RemovePet(pet,PET_SAVE_NOT_IN_SLOT);
+ }
+ }
+
+ //stop movement and disable spells
+ uint32 spellID = 9454;
+ //m_session->GetPlayer()->CastSpell(player,spellID,false);
+ SpellEntry const *spellInfo = sSpellStore.LookupEntry( spellID );
+ if(spellInfo) //TODO: Change the duration of the aura to -1 instead of 5000000
+ {
+ for(uint32 i = 0;i<3;i++)
+ {
+ uint8 eff = spellInfo->Effect[i];
+ if (eff>=TOTAL_SPELL_EFFECTS)
+ continue;
+ if( eff == SPELL_EFFECT_APPLY_AREA_AURA_PARTY || eff == SPELL_EFFECT_APPLY_AURA ||
+ eff == SPELL_EFFECT_PERSISTENT_AREA_AURA || eff == SPELL_EFFECT_APPLY_AREA_AURA_FRIEND ||
+ eff == SPELL_EFFECT_APPLY_AREA_AURA_ENEMY)
+ {
+ Aura *Aur = CreateAura(spellInfo, i, NULL, player);
+ player->AddAura(Aur);
+ }
+ }
+ }
+
+ //save player
+ player->SaveToDB();
+ }
+ return true;
+}
+
+bool ChatHandler::HandleUnFreezeCommand(const char *args)
+{
+ std::string name;
+ Player* player;
+ char* TargetName = strtok((char*)args, " "); //get entered name
+ if (!TargetName) //if no name entered use target
+ {
+ player = getSelectedPlayer();
+ if (player) //prevent crash with creature as target
+ {
+ name = player->GetName();
+ }
+ }
+
+ else // if name entered
+ {
+ name = TargetName;
+ normalizePlayerName(name);
+ player = objmgr.GetPlayer(name.c_str()); //get player by name
+ }
+
+ //effect
+ if (player)
+ {
+ PSendSysMessage(LANG_COMMAND_UNFREEZE,name.c_str());
+
+ //Reset player faction + allow combat + allow duels
+ player->setFactionForRace(player->getRace());
+ player->RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+
+ //allow movement and spells
+ uint32 spellID = 9454;
+ player->RemoveAurasDueToSpell(spellID);
+
+ //save player
+ player->SaveToDB();
+ }
+
+ if (!player)
+ {
+ if (TargetName)
+ {
+ //check for offline players
+ QueryResult *result = CharacterDatabase.PQuery("SELECT characters.guid FROM `characters` WHERE characters.name = '%s'",name.c_str());
+ if(!result)
+ {
+ SendSysMessage(LANG_COMMAND_FREEZE_WRONG);
+ return true;
+ }
+ //if player found: delete his freeze aura
+ Field *fields=result->Fetch();
+ uint64 pguid = fields[0].GetUInt64();
+ delete result;
+ CharacterDatabase.PQuery("DELETE FROM `character_aura` WHERE character_aura.spell = 9454 AND character_aura.guid = '%u'",pguid);
+ PSendSysMessage(LANG_COMMAND_UNFREEZE,name.c_str());
+ return true;
+ }
+ else
+ {
+ SendSysMessage(LANG_COMMAND_FREEZE_WRONG);
+ return true;
+ }
+ }
+
+ return true;
+}
+
+bool ChatHandler::HandleListFreezeCommand(const char* args)
+{
+ //Get names from DB
+ QueryResult *result = CharacterDatabase.PQuery("SELECT characters.name FROM `characters` LEFT JOIN `character_aura` ON (characters.guid = character_aura.guid) WHERE character_aura.spell = 9454");
+ if(!result)
+ {
+ SendSysMessage(LANG_COMMAND_NO_FROZEN_PLAYERS);
+ return true;
+ }
+ //Header of the names
+ PSendSysMessage(LANG_COMMAND_LIST_FREEZE);
+
+ //Output of the results
+ do
+ {
+ Field *fields = result->Fetch();
+ std::string fplayers = fields[0].GetCppString();
+ PSendSysMessage(LANG_COMMAND_FROZEN_PLAYERS,fplayers.c_str());
+ } while (result->NextRow());
+
+ delete result;
+ return true;
+}
+
bool ChatHandler::HandleFlushArenaPointsCommand(const char * /*args*/)
{
sBattleGroundMgr.DistributeArenaPoints();
diff --git a/src/game/MiscHandler.cpp b/src/game/MiscHandler.cpp
index 76f6646ed5a..3557aa8cd97 100644
--- a/src/game/MiscHandler.cpp
+++ b/src/game/MiscHandler.cpp
@@ -287,6 +287,7 @@ void WorldSession::HandleLogoutRequestOpcode( WorldPacket & /*recv_data*/ )
//Can not logout if...
if( GetPlayer()->isInCombat() || //...is in combat
GetPlayer()->duel || //...is in Duel
+ GetPlayer()->HasAura(9454,0) || //...is frozen by GM via freeze command
//...is jumping ...is falling
GetPlayer()->HasUnitMovementFlag(MOVEMENTFLAG_JUMPING | MOVEMENTFLAG_FALLING))
{
diff --git a/src/trinitycore/trinitycore.conf.dist b/src/trinitycore/trinitycore.conf.dist
index ba3f4bdd881..7e4351e8779 100644
--- a/src/trinitycore/trinitycore.conf.dist
+++ b/src/trinitycore/trinitycore.conf.dist
@@ -83,7 +83,7 @@ EAIErrorLevel = 2
# number (bitmask value of selected processors)
#
# ProcessPriority
-# Process proirity setting (Used only at Windows)
+# Process priority setting (Used only at Windows)
# Default: 1 (HIGH)
# 0 (Normal)
#
@@ -845,7 +845,7 @@ Visibility.Distance.Grey.Object = 10
# Rate.Drop.Item.Artifact
# Rate.Drop.Item.Referenced
# Rate.Drop.Money
-# Drop rates (items by qualify and money)
+# Drop rates (items by quality and money)
# Default: 1
#
# Rate.Drop.Money