diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/game/Chat.cpp | 3 | ||||
-rw-r--r-- | src/game/Chat.h | 3 | ||||
-rw-r--r-- | src/game/Language.h | 7 | ||||
-rw-r--r-- | src/game/Level3.cpp | 176 | ||||
-rw-r--r-- | src/game/MiscHandler.cpp | 1 | ||||
-rw-r--r-- | src/trinitycore/trinitycore.conf.dist | 4 |
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 |