Implement some GM spells.

This commit is contained in:
ratkosrb
2019-05-03 00:03:19 +03:00
parent 9a08c99536
commit 2c4e054e94
13 changed files with 273 additions and 73 deletions
+17
View File
@@ -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;
+32
View File
@@ -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;
+2
View File
@@ -46,6 +46,8 @@ class Unit;
class GmTicket;
struct ItemPrototype;
#define SPELL_PLAYER_MUTED_VISUAL 1852
enum CommandFlags
{
COMMAND_FLAGS_ONLY_ON_SELF = 0x1,
+14 -1
View File
@@ -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);
+39 -23
View File
@@ -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()))
+5 -30
View File
@@ -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;
}
+2 -2
View File
@@ -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;
}
+23 -6
View File
@@ -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())
+5 -5
View File
@@ -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
+69 -2
View File
@@ -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;
+4 -4
View File
@@ -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); }
+5
View File
@@ -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])
{
+56
View File
@@ -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)