diff --git a/sql/migrations/20190430202017_world.sql b/sql/migrations/20190430202017_world.sql index eea3e119f..135125ff5 100644 --- a/sql/migrations/20190430202017_world.sql +++ b/sql/migrations/20190430202017_world.sql @@ -34,6 +34,23 @@ ALTER TABLE `auctionhousebot` CHANGE COLUMN `bid` `bid` INT(11) UNSIGNED NOT NULL DEFAULT '1' COMMENT 'Bid Price' AFTER `stack`, CHANGE COLUMN `buyout` `buyout` INT(11) UNSIGNED NOT NULL DEFAULT '1' COMMENT 'Buyout Price' AFTER `bid`; +-- Change delay field to unsigned. +ALTER TABLE `autobroadcast` + CHANGE COLUMN `delay` `delay` INT(11) UNSIGNED NULL DEFAULT NULL FIRST; + +-- Rename the comments filed to comment. +ALTER TABLE `autobroadcast` + CHANGE COLUMN `comments` `comment` VARCHAR(255) NULL DEFAULT NULL AFTER `string_id`; + +-- Change map field to unsigned. +ALTER TABLE `battleground_events` + CHANGE COLUMN `map` `map` SMALLINT(5) UNSIGNED NOT NULL FIRST; + +-- Change cinematic and timer fields to unsigned. +ALTER TABLE `cinematic_waypoints` + CHANGE COLUMN `cinematic` `cinematic` INT(11) UNSIGNED NULL DEFAULT '0' FIRST, + CHANGE COLUMN `timer` `timer` INT(11) UNSIGNED NULL DEFAULT '0' AFTER `cinematic`; + -- End of migration. END IF; diff --git a/sql/migrations/20190502192619_world.sql b/sql/migrations/20190502192619_world.sql new file mode 100644 index 000000000..299746539 --- /dev/null +++ b/sql/migrations/20190502192619_world.sql @@ -0,0 +1,32 @@ +DROP PROCEDURE IF EXISTS add_migration; +delimiter ?? +CREATE PROCEDURE `add_migration`() +BEGIN +DECLARE v INT DEFAULT 1; +SET v = (SELECT COUNT(*) FROM `migrations` WHERE `id`='20190502192619'); +IF v=0 THEN +INSERT INTO `migrations` VALUES ('20190502192619'); +-- Add your query below. + + +-- Move some texts to database. +INSERT INTO `mangos_string` (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`) VALUES (345, 'INVIS mode is ON', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `mangos_string` (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`) VALUES (346, 'INVIS mode is OFF', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `mangos_string` (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`) VALUES (349, 'GOD mode is ON', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `mangos_string` (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`) VALUES (350, 'GOD mode is OFF', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `mangos_string` (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`) VALUES (2049, 'Ticket notifications enabled.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `mangos_string` (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`) VALUES (2050, 'Ticket notifications disabled.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + +-- Fix target type for GM spells. +UPDATE `spell_template` SET `effectImplicitTargetA1`=1, `effectImplicitTargetB1`=0, `effectRadiusIndex1`=0 WHERE (`build` > 5302) && (`entry` IN (456, 2765, 1509, 18139, 6147, 2763, 20114, 20115)); + +-- Add missing creature template for Terky needed by White Murloc Egg. +INSERT INTO `creature_template` (`entry`, `patch`, `display_id1`, `display_id2`, `display_id3`, `display_id4`, `name`, `subname`, `gossip_menu_id`, `level_min`, `level_max`, `health_min`, `health_max`, `mana_min`, `mana_max`, `armor`, `faction`, `npc_flags`, `speed_walk`, `speed_run`, `scale`, `detection_range`, `call_for_help_range`, `leash_range`, `rank`, `xp_multiplier`, `dmg_min`, `dmg_max`, `dmg_school`, `attack_power`, `dmg_multiplier`, `base_attack_time`, `ranged_attack_time`, `unit_class`, `unit_flags`, `dynamic_flags`, `beast_family`, `trainer_type`, `trainer_spell`, `trainer_class`, `trainer_race`, `ranged_dmg_min`, `ranged_dmg_max`, `ranged_attack_power`, `type`, `type_flags`, `loot_id`, `pickpocket_loot_id`, `skinning_loot_id`, `holy_res`, `fire_res`, `nature_res`, `frost_res`, `shadow_res`, `arcane_res`, `spell_id1`, `spell_id2`, `spell_id3`, `spell_id4`, `spell_list_id`, `pet_spell_list_id`, `gold_min`, `gold_max`, `ai_name`, `movement_type`, `inhabit_type`, `civilian`, `racial_leader`, `regeneration`, `equipment_id`, `trainer_id`, `vendor_id`, `mechanic_immune_mask`, `school_immune_mask`, `flags_extra`, `script_name`) VALUES (16445, 0, 15398, 0, 0, 0, 'Terky', NULL, 0, 1, 1, 42, 42, 0, 0, 20, 188, 0, 0.75, 1.14286, 0.8, 20, 5, 0, 0, 1, 2, 2, 0, 44, 1, 2000, 2000, 1, 33536, 0, 0, 0, 0, 0, 0, 1, 1, 100, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '', 0, 3, 0, 0, 3, 0, 0, 0, 0, 0, 2, ''); + + +-- End of migration. +END IF; +END?? +delimiter ; +CALL add_migration(); +DROP PROCEDURE IF EXISTS add_migration; diff --git a/src/game/Chat/Chat.h b/src/game/Chat/Chat.h index 2752e58d2..7ec799fda 100644 --- a/src/game/Chat/Chat.h +++ b/src/game/Chat/Chat.h @@ -46,6 +46,8 @@ class Unit; class GmTicket; struct ItemPrototype; +#define SPELL_PLAYER_MUTED_VISUAL 1852 + enum CommandFlags { COMMAND_FLAGS_ONLY_ON_SELF = 0x1, diff --git a/src/game/Commands/AccountCommands.cpp b/src/game/Commands/AccountCommands.cpp index 7e36fd4bc..90f5778cc 100644 --- a/src/game/Commands/AccountCommands.cpp +++ b/src/game/Commands/AccountCommands.cpp @@ -19,6 +19,7 @@ #include "Database/DatabaseImpl.h" #include "World.h" #include "Player.h" +#include "SpellAuras.h" #include "Chat.h" #include "ObjectAccessor.h" #include "Language.h" @@ -1182,7 +1183,7 @@ bool ChatHandler::HandleMuteCommand(char* args) if (HasLowerSecurity(target, target_guid, true)) return false; - time_t mutetime = time(NULL) + notspeaktime * 60; + time_t mutetime = time(NULL) + notspeaktime * MINUTE; if (target) target->GetSession()->m_muteTime = mutetime; @@ -1190,7 +1191,16 @@ bool ChatHandler::HandleMuteCommand(char* args) LoginDatabase.PExecute("UPDATE account SET mutetime = " UI64FMTD " WHERE id = '%u'", uint64(mutetime), account_id); if (target) + { + if (SpellAuraHolder* pAura = target->AddAura(SPELL_PLAYER_MUTED_VISUAL, 0, nullptr)) + { + pAura->SetAuraDuration(notspeaktime * MINUTE * IN_MILLISECONDS); + pAura->SetAuraMaxDuration(notspeaktime * MINUTE * IN_MILLISECONDS); + pAura->RefreshHolder(); + } + ChatHandler(target).PSendSysMessage(LANG_YOUR_CHAT_DISABLED, notspeaktime); + } std::string nameLink = playerLink(target_name); @@ -1245,7 +1255,10 @@ bool ChatHandler::HandleUnmuteCommand(char* args) LoginDatabase.PExecute("UPDATE account SET mutetime = '0' WHERE id = '%u'", account_id); if (target) + { + target->RemoveAurasDueToSpell(SPELL_PLAYER_MUTED_VISUAL); ChatHandler(target).PSendSysMessage(LANG_YOUR_CHAT_ENABLED); + } std::string nameLink = playerLink(target_name); diff --git a/src/game/Commands/CharacterCommands.cpp b/src/game/Commands/CharacterCommands.cpp index 4728d52d1..56c3661b8 100644 --- a/src/game/Commands/CharacterCommands.cpp +++ b/src/game/Commands/CharacterCommands.cpp @@ -86,12 +86,9 @@ bool ChatHandler::HandleGodCommand(char* args) SetSentErrorMessage(true); return false; } - pPlayer->SetGodMode(value); + pPlayer->SetGodMode(value, true); } - if (pPlayer->IsGod()) - SendSysMessage("Mode GOD : [ON]"); - else - SendSysMessage("Mode GOD : [OFF]"); + return true; } @@ -2394,28 +2391,47 @@ bool ChatHandler::HandleLearnAllCommand(char* /*args*/) bool ChatHandler::HandleLearnAllGMCommand(char* /*args*/) { - static const char *gmSpellList[] = + static uint32 gmSpellList[] = { - "24347", // Become A Fish, No Breath Bar - "35132", // Visual Boom - "38488", // Attack 4000-8000 AOE - "38795", // Attack 2000 AOE + Slow Down 90% - "15712", // Attack 200 - "1852", // GM Spell Silence - "31899", // Kill - "31924", // Kill - "29878", // Kill My Self - "26644", // More Kill - - "28550", //Invisible 24 - "23452", //Invisible + Target - "0" + 5, // Death Touch + 265, // Area Death (TEST) + 30879, // Permanent Area Damage 50k + 7482, // dmg + 8295, // dmg2 + 10073, // dmg3 + 11821, // dmg4 + 18389, // dmg5 + 18390, // dmg6 + 19901, // dmg7 + 27254, // dmg8 + 27255, // dmg9 + 27258, // dmg10 + 27261, // dmg11 + 25059, // Dmg Shield + 26666, // Dmg Shield2 +#if SUPPORTED_CLIENT_BUILD > CLIENT_BUILD_1_10_2 + 456, // SHOWLABEL Only OFF + 2765, // SHOWLABEL Only ON + 1509, // GM Only OFF + 18139, // GM Only ON + 6147, // INVIS Only OFF + 2763, // INVIS Only ON + 20114, // BM Only OFF + 20115, // BM Only ON +#endif + 24341, // Revive + 29313, // CooldownAll + 1302, // Damage Immunity Test + 9454, // Freeze + 31366, // Root Anybody Forever + 1908, // Uber Heal Over Time + 8358, // Mana Spike + 23965, // Instant Heal }; - uint16 gmSpellIter = 0; - while (strcmp(gmSpellList[gmSpellIter], "0")) + for (int i = 0; i < sizeof(gmSpellList) / sizeof(uint32); i++) { - uint32 spell = atol((char*)gmSpellList[gmSpellIter++]); + uint32 spell = gmSpellList[i]; SpellEntry const* spellInfo = sSpellMgr.GetSpellEntry(spell); if (!spellInfo || !SpellMgr::IsSpellValid(spellInfo, m_session->GetPlayer())) diff --git a/src/game/Commands/MiscCommands.cpp b/src/game/Commands/MiscCommands.cpp index 0ca3e6233..c099d2095 100644 --- a/src/game/Commands/MiscCommands.cpp +++ b/src/game/Commands/MiscCommands.cpp @@ -119,16 +119,7 @@ bool ChatHandler::HandleGMCommand(char* args) return false; } - if (value) - { - m_session->GetPlayer()->SetGameMaster(true); - m_session->SendNotification(LANG_GM_ON); - } - else - { - m_session->GetPlayer()->SetGameMaster(false); - m_session->SendNotification(LANG_GM_OFF); - } + m_session->GetPlayer()->SetGameMaster(value, true); return true; } @@ -153,16 +144,7 @@ bool ChatHandler::HandleGMChatCommand(char* args) return false; } - if (value) - { - m_session->GetPlayer()->SetGMChat(true); - m_session->SendNotification(LANG_GM_CHAT_ON); - } - else - { - m_session->GetPlayer()->SetGMChat(false); - m_session->SendNotification(LANG_GM_CHAT_OFF); - } + m_session->GetPlayer()->SetGMChat(value, true); return true; } @@ -194,17 +176,10 @@ bool ChatHandler::HandleGMVisibleCommand(char* args) return false; } - if (value) - { - m_session->GetPlayer()->SetGMVisible(true); - m_session->SendNotification(LANG_INVISIBLE_VISIBLE); - } - else - { + if (!value) m_session->GetPlayer()->SetGMInvisibilityLevel(visibilityLevel); - m_session->SendNotification(LANG_INVISIBLE_INVISIBLE, visibilityLevel); - m_session->GetPlayer()->SetGMVisible(false); - } + + m_session->GetPlayer()->SetGMVisible(value, true); return true; } diff --git a/src/game/Commands/UnitCommands.cpp b/src/game/Commands/UnitCommands.cpp index f034598e5..072b31b9f 100644 --- a/src/game/Commands/UnitCommands.cpp +++ b/src/game/Commands/UnitCommands.cpp @@ -237,7 +237,7 @@ bool ChatHandler::HandleFreezeCommand(char* args) Unit* pTarget = GetSelectedUnit(); if (!pTarget) return false; - pTarget->CastSpell(pTarget, 29826, true); + pTarget->CastSpell(pTarget, 9454, true); return true; } @@ -246,7 +246,7 @@ bool ChatHandler::HandleUnfreezeCommand(char* args) Unit* pTarget = GetSelectedUnit(); if (!pTarget) return false; - pTarget->RemoveAurasDueToSpell(29826); + pTarget->RemoveAurasDueToSpell(9454); return true; } diff --git a/src/game/Handlers/ChatHandler.cpp b/src/game/Handlers/ChatHandler.cpp index 1b10766ae..8789e1c07 100644 --- a/src/game/Handlers/ChatHandler.cpp +++ b/src/game/Handlers/ChatHandler.cpp @@ -211,14 +211,18 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket & recv_data) if (type != CHAT_MSG_AFK && type != CHAT_MSG_DND) { - auto currTime = time(NULL); - - if (m_muteTime > currTime) // Muted + if (type != CHAT_MSG_WHISPER) // whisper checked later { - std::string timeStr = secsToTimeString(m_muteTime - currTime); - SendNotification(GetMangosString(LANG_WAIT_BEFORE_SPEAKING), timeStr.c_str()); - return; + auto currTime = time(nullptr); + + if (m_muteTime > currTime) // Muted + { + std::string timeStr = secsToTimeString(m_muteTime - currTime); + SendNotification(GetMangosString(LANG_WAIT_BEFORE_SPEAKING), timeStr.c_str()); + return; + } } + if (lang != LANG_ADDON && GetMasterPlayer()) GetMasterPlayer()->UpdateSpeakTime(); // Anti chat flood } @@ -441,6 +445,19 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket & recv_data) return; } + // Can only whisper GMs while muted. + if (pSecurity == SEC_PLAYER) + { + auto currTime = time(nullptr); + + if (m_muteTime > currTime) // Muted + { + std::string timeStr = secsToTimeString(m_muteTime - currTime); + SendNotification(GetMangosString(LANG_WAIT_BEFORE_SPEAKING), timeStr.c_str()); + return; + } + } + if (tSecurity == SEC_PLAYER && pSecurity == SEC_PLAYER) { if (!sWorld.getConfig(CONFIG_BOOL_ALLOW_TWO_SIDE_INTERACTION_CHAT) && GetPlayer()->GetTeam() != player->GetTeam()) diff --git a/src/game/Language.h b/src/game/Language.h index ac9bc574c..83f827717 100644 --- a/src/game/Language.h +++ b/src/game/Language.h @@ -188,7 +188,7 @@ enum MangosStrings LANG_XP_RATE_MIN = 177, LANG_XP_RATE_MAX = 178, LANG_XP_RATE_SET = 179, - // Room for more level 1 178-199 not used + // Room for more level 1 180-199 not used // level 2 chat LANG_NO_SELECTION = 200, @@ -337,12 +337,12 @@ enum MangosStrings LANG_CREATURE_NOT_FOLLOW_YOU_NOW = 342, LANG_CREATURE_NON_TAMEABLE = 343, LANG_YOU_ALREADY_HAVE_PET = 344, - // 345 used in master branch - // 346 used in master branch + LANG_INVIS_ON = 345, + LANG_INVIS_OFF = 346, LANG_COMMAND_GOTAXINODENOTFOUND = 347, LANG_GAMEOBJECT_HAVE_INVALID_DATA = 348, - // 349 used in master branch - // 350 used in master branch + LANG_GOD_ON = 349, + LANG_GOD_OFF = 350, // 351 used in master branch // 352 used in master branch // 353 used in master branch diff --git a/src/game/Objects/Player.cpp b/src/game/Objects/Player.cpp index 211bfe9c8..9b13f3482 100644 --- a/src/game/Objects/Player.cpp +++ b/src/game/Objects/Player.cpp @@ -2479,7 +2479,29 @@ struct SetGameMasterOffHelper uint32 faction; }; -void Player::SetGameMaster(bool on) +void Player::SetGMChat(bool on, bool notify) +{ + if (on) + { + m_ExtraFlags |= PLAYER_EXTRA_GM_CHAT; + if (notify) + { + ChatHandler(this).SendSysMessage(LANG_GM_CHAT_ON); + GetSession()->SendNotification(LANG_GM_CHAT_ON); + } + } + else + { + m_ExtraFlags &= ~PLAYER_EXTRA_GM_CHAT; + if (notify) + { + ChatHandler(this).SendSysMessage(LANG_GM_CHAT_OFF); + GetSession()->SendNotification(LANG_GM_CHAT_OFF); + } + } +} + +void Player::SetGameMaster(bool on, bool notify) { if (on) { @@ -2494,6 +2516,12 @@ void Player::SetGameMaster(bool on) getHostileRefManager().setOnlineOfflineState(false); CombatStopWithPets(); + + if (notify) + { + ChatHandler(this).SendSysMessage(LANG_GM_ON); + GetSession()->SendNotification(LANG_GM_ON); + } } else { @@ -2511,6 +2539,12 @@ void Player::SetGameMaster(bool on) UpdateArea(m_areaUpdateId); getHostileRefManager().setOnlineOfflineState(true); + + if (notify) + { + ChatHandler(this).SendSysMessage(LANG_GM_OFF); + GetSession()->SendNotification(LANG_GM_OFF); + } } m_camera.UpdateVisibilityForOwner(); @@ -2527,7 +2561,7 @@ void Player::SetGameMaster(bool on) RefreshBitsForVisibleUnits(&m, TYPEMASK_PLAYER); } -void Player::SetGMVisible(bool on) +void Player::SetGMVisible(bool on, bool notify) { // 'Invisibilite superieure' const uint32 VISUAL_AURA = 16380; @@ -2543,6 +2577,12 @@ void Player::SetGMVisible(bool on) SetVisibility(VISIBILITY_GROUP_INVISIBILITY); else SetVisibility(VISIBILITY_ON); + + if (notify) + { + ChatHandler(this).SendSysMessage(LANG_INVISIBLE_VISIBLE); + GetSession()->SendNotification(LANG_INVIS_OFF); + } } else { @@ -2555,11 +2595,28 @@ void Player::SetGMVisible(bool on) SetGameMaster(true); SetVisibility(VISIBILITY_OFF); + + if (notify) + { + ChatHandler(this).PSendSysMessage(LANG_INVISIBLE_INVISIBLE, GetGMInvisibilityLevel()); + GetSession()->SendNotification(LANG_INVIS_ON); + } } // Sauvegarde directement pour que le site n'affiche plus le MJ parmis les joueurs co. CharacterDatabase.PExecute("UPDATE characters SET extra_flags = %u WHERE guid = %u", m_ExtraFlags, GetGUIDLow()); } +void Player::SetGodMode(bool on, bool notify) +{ + SetOption(PLAYER_CHEAT_GOD, on); + + if (notify) + { + ChatHandler(this).SendSysMessage(on ? LANG_GOD_ON : LANG_GOD_OFF); + GetSession()->SendNotification(on ? LANG_GOD_ON : LANG_GOD_OFF); + } +} + bool Player::IsAllowedWhisperFrom(ObjectGuid guid) const { if (PlayerSocial const* social = GetSocial()) @@ -15064,6 +15121,16 @@ void Player::LoadAura(AuraSaveStruct& s, uint32 timediff) s.remaintime -= timediff * IN_MILLISECONDS; } + // Special case for chat silenced indicator + if (spellproto->Id == SPELL_PLAYER_MUTED_VISUAL) + { + auto currTime = time(nullptr); + auto muteTime = GetSession()->m_muteTime; + if (muteTime <= currTime) + return; + s.remaintime = (muteTime - currTime) * IN_MILLISECONDS; + } + // prevent wrong values of remaincharges if (spellproto->procCharges == 0) s.remaincharges = 0; diff --git a/src/game/Objects/Player.h b/src/game/Objects/Player.h index 8b6e7e7ee..77046f66c 100644 --- a/src/game/Objects/Player.h +++ b/src/game/Objects/Player.h @@ -917,15 +917,15 @@ class MANGOS_DLL_SPEC Player final: public Unit void SetAcceptTicket(bool on) { if(on) m_ExtraFlags |= PLAYER_EXTRA_GM_ACCEPT_TICKETS; else m_ExtraFlags &= ~PLAYER_EXTRA_GM_ACCEPT_TICKETS; } bool IsGameMaster() const { return m_ExtraFlags & PLAYER_EXTRA_GM_ON; } - void SetGameMaster(bool on); + void SetGameMaster(bool on, bool notify = false); bool IsGMChat() const { return GetSession()->GetSecurity() >= SEC_MODERATOR && (m_ExtraFlags & PLAYER_EXTRA_GM_CHAT); } - void SetGMChat(bool on) { if(on) m_ExtraFlags |= PLAYER_EXTRA_GM_CHAT; else m_ExtraFlags &= ~PLAYER_EXTRA_GM_CHAT; } + void SetGMChat(bool on, bool notify = false); bool IsTaxiCheater() const { return m_ExtraFlags & PLAYER_EXTRA_TAXICHEAT; } void SetTaxiCheater(bool on) { if(on) m_ExtraFlags |= PLAYER_EXTRA_TAXICHEAT; else m_ExtraFlags &= ~PLAYER_EXTRA_TAXICHEAT; } bool IsGMVisible() const { return !(m_ExtraFlags & PLAYER_EXTRA_GM_INVISIBLE); } - void SetGMVisible(bool on); + void SetGMVisible(bool on, bool notify = false); void SetPvPDeath(bool on) { if(on) m_ExtraFlags |= PLAYER_EXTRA_PVP_DEATH; else m_ExtraFlags &= ~PLAYER_EXTRA_PVP_DEATH; } - void SetGodMode(bool on) { SetOption(PLAYER_CHEAT_GOD, on); } + void SetGodMode(bool on, bool notify = false); bool IsGod() const { return HasOption(PLAYER_CHEAT_GOD); } bool HasOption(uint32 o) const { return (_playerOptions & o); } diff --git a/src/game/Spells/Spell.cpp b/src/game/Spells/Spell.cpp index fcde2580d..5126af71e 100644 --- a/src/game/Spells/Spell.cpp +++ b/src/game/Spells/Spell.cpp @@ -639,6 +639,11 @@ void Spell::FillTargetMap() break; } break; + case TARGET_ALL_ENEMY_IN_AREA: + if ((m_targets.m_targetMask & TARGET_FLAG_SOURCE_LOCATION) && !(m_targets.m_targetMask & TARGET_FLAG_DEST_LOCATION)) + m_targets.setDestination(m_targets.m_srcX, m_targets.m_srcY, m_targets.m_srcZ); + SetTargetMap(SpellEffectIndex(i), m_spellInfo->EffectImplicitTargetA[i], tmpUnitMap); + break; default: switch (m_spellInfo->EffectImplicitTargetB[i]) { diff --git a/src/game/Spells/SpellEffects.cpp b/src/game/Spells/SpellEffects.cpp index f815d04e8..ce960d451 100644 --- a/src/game/Spells/SpellEffects.cpp +++ b/src/game/Spells/SpellEffects.cpp @@ -4393,6 +4393,62 @@ void Spell::EffectScriptEffect(SpellEffectIndex eff_idx) { switch (m_spellInfo->Id) { +#if SUPPORTED_CLIENT_BUILD > CLIENT_BUILD_1_10_2 + case 456: // SHOWLABEL Only OFF + { + if (Player* pPlayer = ToPlayer(m_caster)) + pPlayer->SetGMChat(false, true); + return; + } + case 2765: // SHOWLABEL Only ON + { + if (Player* pPlayer = ToPlayer(m_caster)) + pPlayer->SetGMChat(true, true);; + return; + } + case 1509: // GM Only OFF + { + if (Player* pPlayer = ToPlayer(m_caster)) + pPlayer->SetGameMaster(false, true); + return; + } + case 18139: // GM Only ON + { + if (Player* pPlayer = ToPlayer(m_caster)) + pPlayer->SetGameMaster(true, true); + return; + } + case 6147: // INVIS Only OFF + { + if (Player* pPlayer = ToPlayer(m_caster)) + pPlayer->SetGMVisible(true, true); + return; + } + case 2763: // INVIS Only ON + { + if (Player* pPlayer = ToPlayer(m_caster)) + pPlayer->SetGMVisible(false, true); + return; + } + case 20114: // BM Only OFF + { + if (Player* pPlayer = ToPlayer(m_caster)) + pPlayer->SetGodMode(false, true); + return; + } + case 20115: // BM Only ON + { + if (Player* pPlayer = ToPlayer(m_caster)) + pPlayer->SetGodMode(true, true); + return; + } + case 29313: // CooldownAll + { + if (m_caster) + m_caster->RemoveAllSpellCooldown(); + return; + } +#endif case 8856: // Bending Shinbone { if (!itemTarget && m_caster->GetTypeId() != TYPEID_PLAYER)