aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/base/auth_database.sql247
-rw-r--r--sql/updates/auth/2013_02_25_00_auth_misc.sql3
-rw-r--r--sql/updates/auth/2013_02_25_03_auth_misc.sql2
-rw-r--r--sql/updates/auth/2013_02_25_04_auth_misc.sql2
-rw-r--r--sql/updates/auth/2013_02_25_07_auth_misc.sql4
-rw-r--r--sql/updates/auth/2013_02_25_09_auth_misc.sql2
-rw-r--r--sql/updates/auth/2013_02_25_10_auth_misc.sql2
-rw-r--r--sql/updates/auth/2013_02_25_11_auth_misc.sql2
-rw-r--r--sql/updates/auth/2013_02_25_12_auth_misc.sql2
-rw-r--r--sql/updates/auth/2013_02_25_13_auth_misc.sql18
-rw-r--r--sql/updates/auth/2013_02_25_14_auth_misc.sql2
-rw-r--r--sql/updates/world/2013_02_24_05_world_command.sql4
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedCreature.cpp16
-rw-r--r--src/server/game/Entities/Object/Object.cpp10
-rw-r--r--src/server/game/Entities/Object/Object.h2
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp2
-rw-r--r--src/server/game/Globals/ObjectMgr.h39
-rw-r--r--src/server/game/Maps/Map.h2
-rw-r--r--src/server/game/Spells/Spell.cpp26
-rw-r--r--src/server/game/Spells/Spell.h1
-rw-r--r--src/server/game/Spells/SpellMgr.cpp21
-rw-r--r--src/server/game/Spells/SpellMgr.h8
-rw-r--r--src/server/scripts/Commands/cs_reload.cpp11
23 files changed, 346 insertions, 82 deletions
diff --git a/sql/base/auth_database.sql b/sql/base/auth_database.sql
index f72d66a2fec..7f5fad649ba 100644
--- a/sql/base/auth_database.sql
+++ b/sql/base/auth_database.sql
@@ -265,7 +265,106 @@ CREATE TABLE `rbac_group_roles` (
LOCK TABLES `rbac_group_roles` WRITE;
/*!40000 ALTER TABLE `rbac_group_roles` DISABLE KEYS */;
-INSERT INTO `rbac_group_roles` VALUES (1,1),(2,2),(3,3),(4,4),(2,5),(1,6),(1,7);
+INSERT INTO `rbac_group_roles` VALUES
+(1, 1),
+(2, 2),
+(3, 3),
+(4, 4),
+(2, 5),
+(1, 6),
+(1, 7),
+(2, 8),
+(3, 8),
+(4, 8),
+(2, 9),
+(3, 9),
+(4, 9),
+(2, 10),
+(3, 10),
+(4, 10),
+(2, 11),
+(3, 11),
+(4, 11),
+(2, 12),
+(3, 12),
+(4, 12),
+(2, 13),
+(3, 13),
+(4, 13),
+(2, 14),
+(3, 14),
+(4, 14),
+(2, 15),
+(3, 15),
+(4, 15),
+(2, 16),
+(3, 16),
+(4, 16),
+(2, 17),
+(3, 17),
+(4, 17),
+(4, 18),
+(1, 19),
+(2, 19),
+(3, 19),
+(4, 19),
+(2, 20),
+(3, 20),
+(4, 20),
+(2, 21),
+(3, 21),
+(4, 21),
+(2, 22),
+(3, 22),
+(4, 22),
+(4, 23),
+(2, 24),
+(3, 24),
+(4, 24),
+(2, 25),
+(3, 25),
+(4, 25),
+(2, 26),
+(3, 26),
+(4, 26),
+(2, 27),
+(3, 27),
+(4, 27),
+(1, 28),
+(2, 28),
+(3, 28),
+(4, 28),
+(2, 29),
+(3, 29),
+(4, 29),
+(1, 30),
+(2, 30),
+(3, 30),
+(4, 30),
+(2, 31),
+(3, 31),
+(4, 31),
+(2, 32),
+(3, 32),
+(4, 32),
+(2, 33),
+(3, 33),
+(4, 33),
+(2, 34),
+(3, 34),
+(4, 34),
+(2, 35),
+(3, 35),
+(4, 35),
+(2, 36),
+(3, 36),
+(4, 36),
+(2, 37),
+(3, 37),
+(4, 37),
+(2, 38),
+(3, 38),
+(4, 38);
/*!40000 ALTER TABLE `rbac_group_roles` ENABLE KEYS */;
UNLOCK TABLES;
@@ -278,7 +377,7 @@ DROP TABLE IF EXISTS `rbac_groups`;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `rbac_groups` (
`id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'Group id',
- `name` varchar(50) NOT NULL COMMENT 'Group name',
+ `name` varchar(100) NOT NULL COMMENT 'Group name',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Group List';
/*!40101 SET character_set_client = @saved_cs_client */;
@@ -289,7 +388,11 @@ CREATE TABLE `rbac_groups` (
LOCK TABLES `rbac_groups` WRITE;
/*!40000 ALTER TABLE `rbac_groups` DISABLE KEYS */;
-INSERT INTO `rbac_groups` VALUES (1,'Player'),(2,'Moderator'),(3,'GameMaster'),(4,'Administrator');
+INSERT INTO `rbac_groups` VALUES
+(1,'Player'),
+(2,'Moderator'),
+(3,'GameMaster'),
+(4,'Administrator');
/*!40000 ALTER TABLE `rbac_groups` ENABLE KEYS */;
UNLOCK TABLES;
@@ -313,7 +416,53 @@ CREATE TABLE `rbac_permissions` (
LOCK TABLES `rbac_permissions` WRITE;
/*!40000 ALTER TABLE `rbac_permissions` DISABLE KEYS */;
-INSERT INTO `rbac_permissions` VALUES (1,'Instant logout'),(2,'Skip Queue'),(3,'Join Normal Battleground'),(4,'Join Random Battleground'),(5,'Join Arenas'),(6,'Join Dungeon Finder'),(7,'Player Commands (Temporal till commands moved to rbac)'),(8,'Moderator Commands (Temporal till commands moved to rbac)'),(9,'GameMaster Commands (Temporal till commands moved to rbac)'),(10,'Administrator Commands (Temporal till commands moved to rbac)');
+INSERT INTO `rbac_permissions` VALUES
+(1, 'Instant logout'),
+(2, 'Skip Queue'),
+(3, 'Join Normal Battleground'),
+(4, 'Join Random Battleground'),
+(5, 'Join Arenas'),
+(6, 'Join Dungeon Finder'),
+(7, 'Player Commands (Temporal till commands moved to rbac)'),
+(8, 'Moderator Commands (Temporal till commands moved to rbac)'),
+(9, 'GameMaster Commands (Temporal till commands moved to rbac)'),
+(10, 'Administrator Commands (Temporal till commands moved to rbac)'),
+(11, 'Log GM trades'),
+(13, 'Skip Instance required bosses check'),
+(14, 'Skip character creation team mask check'),
+(15, 'Skip character creation class mask check'),
+(16, 'Skip character creation race mask check'),
+(17, 'Skip character creation reserved name check'),
+(18, 'Skip character creation heroic min level check'),
+(19, 'Skip needed requirements to use channel check'),
+(20, 'Skip disable map check'),
+(21, 'Skip reset talents when used more than allowed check'),
+(22, 'Skip spam chat check'),
+(23, 'Skip over-speed ping check'),
+(24, 'Two side faction characters on the same account'),
+(25, 'Allow say chat between factions'),
+(26, 'Allow channel chat between factions'),
+(27, 'Two side mail interaction'),
+(28, 'See two side who list'),
+(29, 'Add friends of other faction'),
+(30, 'Save character without delay with .save command'),
+(31, 'Use params with .unstuck command'),
+(32, 'Can be assigned tickets with .assign ticket command'),
+(33, 'Notify if a command was not found'),
+(34, 'Check if should appear in list using .gm ingame command'),
+(35, 'See all security levels with who command'),
+(36, 'Filter whispers'),
+(37, 'Use staff badge in chat'),
+(38, 'Resurrect with full Health Points'),
+(39, 'Restore saved gm setting states'),
+(40, 'Allows to add a gm to friend list'),
+(41, 'Use Config option START_GM_LEVEL to assign new character level'),
+(42, 'Allows to use CMSG_WORLD_TELEPORT opcode'),
+(43, 'Allows to use CMSG_WHOIS opcode'),
+(44, 'Receive global GM messages/texts'),
+(45, 'Join channels without announce'),
+(46, 'Change channel settings without being channel moderator'),
+(47, 'Enables lower security than target check');
/*!40000 ALTER TABLE `rbac_permissions` ENABLE KEYS */;
UNLOCK TABLES;
@@ -340,7 +489,53 @@ CREATE TABLE `rbac_role_permissions` (
LOCK TABLES `rbac_role_permissions` WRITE;
/*!40000 ALTER TABLE `rbac_role_permissions` DISABLE KEYS */;
-INSERT INTO `rbac_role_permissions` VALUES (5,1),(5,2),(6,3),(6,4),(6,5),(7,6),(1,7),(2,8),(3,9),(4,10);
+INSERT INTO `rbac_role_permissions` VALUES
+(5, 1),
+(5, 2),
+(6, 3),
+(6, 4),
+(6, 5),
+(7, 6),
+(1, 7),
+(2, 8),
+(3, 9),
+(4, 10),
+(8, 11),
+(9, 13),
+(33, 14),
+(33, 15),
+(33, 16),
+(33, 17),
+(33, 18),
+(27, 19),
+(22, 20),
+(23, 21),
+(24, 22),
+(17, 23),
+(34, 24);
+(28, 25),
+(30, 26),
+(19, 27),
+(35, 28),
+(36, 29),
+(11, 30),
+(12, 31),
+(10, 32),
+(20, 33),
+(14, 34),
+(37, 35),
+(29, 36),
+(15, 37),
+(13, 38),
+(25, 39),
+(38, 40),
+(26, 41),
+(18, 42),
+(18, 43),
+(16, 44),
+(31, 45),
+(32, 46),
+(21, 47);
/*!40000 ALTER TABLE `rbac_role_permissions` ENABLE KEYS */;
UNLOCK TABLES;
@@ -353,7 +548,7 @@ DROP TABLE IF EXISTS `rbac_roles`;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `rbac_roles` (
`id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'Role id',
- `name` varchar(50) NOT NULL COMMENT 'Role name',
+ `name` varchar(100) NOT NULL COMMENT 'Role name',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Roles List';
/*!40101 SET character_set_client = @saved_cs_client */;
@@ -364,7 +559,45 @@ CREATE TABLE `rbac_roles` (
LOCK TABLES `rbac_roles` WRITE;
/*!40000 ALTER TABLE `rbac_roles` DISABLE KEYS */;
-INSERT INTO `rbac_roles` VALUES (1,'Player Commands'),(2,'Moderator Commands'),(3,'GameMaster Commands'),(4,'Administrator Commands'),(5,'Quick Login/Logout'),(6,'Use Battleground/Arenas'),(7,'Use Dungeon Finder');
+INSERT INTO `rbac_roles` VALUES
+(1, 'Player Commands'),
+(2, 'Moderator Commands'),
+(3, 'GameMaster Commands'),
+(4, 'Administrator Commands'),
+(5, 'Quick Login/Logout'),
+(6, 'Use Battleground/Arenas'),
+(7, 'Use Dungeon Finder'),
+(8, 'Log GM trades'),
+(9, 'Skip Instance required bosses check'),
+(10, 'Ticket management'),
+(11, 'Instant .save'),
+(12, 'Allow params with .unstuck'),
+(13, 'Full HP after resurrect'),
+(14, 'Appear in GM ingame list'),
+(15, 'Use staff badge in chat'),
+(16, 'Receive global GM messages/texts'),
+(17, 'Skip over-speed ping check'),
+(18, 'Allows Admin Opcodes'),
+(19, 'Two side mail interaction'),
+(20, 'Notify if a command was not found'),
+(21, 'Enables lower security than target check'),
+(22, 'Skip disable map check'),
+(23, 'Skip reset talents when used more than allowed check'),
+(24, 'Skip spam chat check'),
+(25, 'Restore saved gm setting states'),
+(26, 'Use Config option START_GM_LEVEL to assign new character level'),
+(27, 'Skips needed requirements to use channel check'),
+(28, 'Allow say chat between factions'),
+(29, 'Filter whispers'),
+(30, 'Allow channel chat between factions'),
+(31, 'Join channels without announce'),
+(32, 'Change channel settings without being channel moderator'),
+(33, 'Skip character creation checks'),
+(34, 'Two side faction characters on the same account')
+(35, 'See two side who list'),
+(36, 'Add friends of other faction'),
+(37, 'See all security levels with who command'),
+(38, 'Allows to add a gm to friend list');
/*!40000 ALTER TABLE `rbac_roles` ENABLE KEYS */;
UNLOCK TABLES;
diff --git a/sql/updates/auth/2013_02_25_00_auth_misc.sql b/sql/updates/auth/2013_02_25_00_auth_misc.sql
index 5531252037a..3cce3c0d5ce 100644
--- a/sql/updates/auth/2013_02_25_00_auth_misc.sql
+++ b/sql/updates/auth/2013_02_25_00_auth_misc.sql
@@ -1,3 +1,6 @@
+ALTER TABLE `rbac_roles` MODIFY COLUMN `name` varchar(100) NOT NULL COMMENT 'Role name';
+ALTER TABLE `rbac_roles` MODIFY COLUMN `name` varchar(100) NOT NULL COMMENT 'Group name';
+
-- Add new permission
DELETE FROM `rbac_permissions` WHERE `id` = 11;
INSERT INTO `rbac_permissions` (`id`, `name`) VALUES (11, 'Log GM trades');
diff --git a/sql/updates/auth/2013_02_25_03_auth_misc.sql b/sql/updates/auth/2013_02_25_03_auth_misc.sql
index ab2c6e0692c..5f290ebf0cd 100644
--- a/sql/updates/auth/2013_02_25_03_auth_misc.sql
+++ b/sql/updates/auth/2013_02_25_03_auth_misc.sql
@@ -20,7 +20,7 @@ INSERT INTO `rbac_role_permissions` (`roleId`, `permissionId`) VALUES
(13, 38);
-- Add it to all GM+ groups
-DELETE FROM `rbac_role_permissions` WHERE `roleId` IN (11, 12, 13);
+DELETE FROM `rbac_group_roles` WHERE `roleId` IN (11, 12, 13);
INSERT INTO `rbac_group_roles` (`groupId`, `roleId`) VALUES
(2, 11),
(3, 11),
diff --git a/sql/updates/auth/2013_02_25_04_auth_misc.sql b/sql/updates/auth/2013_02_25_04_auth_misc.sql
index faaee3582ea..bf42990a1bd 100644
--- a/sql/updates/auth/2013_02_25_04_auth_misc.sql
+++ b/sql/updates/auth/2013_02_25_04_auth_misc.sql
@@ -17,7 +17,7 @@ INSERT INTO `rbac_role_permissions` (`roleId`, `permissionId`) VALUES
(15, 37);
-- Add it to all GM+ groups
-DELETE FROM `rbac_role_permissions` WHERE `roleId` IN (14, 15);
+DELETE FROM `rbac_group_roles` WHERE `roleId` IN (14, 15);
INSERT INTO `rbac_group_roles` (`groupId`, `roleId`) VALUES
(2, 14),
(3, 14),
diff --git a/sql/updates/auth/2013_02_25_07_auth_misc.sql b/sql/updates/auth/2013_02_25_07_auth_misc.sql
index 2416f08280c..4c6dadf4eaa 100644
--- a/sql/updates/auth/2013_02_25_07_auth_misc.sql
+++ b/sql/updates/auth/2013_02_25_07_auth_misc.sql
@@ -15,7 +15,7 @@ INSERT INTO `rbac_role_permissions` (`roleId`, `permissionId`) VALUES
(18, 42),
(18, 43);
--- Add it to all GM+ groups
-DELETE FROM `rbac_role_permissions` WHERE `roleId` = 18;
+-- Add it to admins groups
+DELETE FROM `rbac_group_roles` WHERE `roleId` = 18;
INSERT INTO `rbac_group_roles` (`groupId`, `roleId`) VALUES
(4, 18);
diff --git a/sql/updates/auth/2013_02_25_09_auth_misc.sql b/sql/updates/auth/2013_02_25_09_auth_misc.sql
index f2affe05b70..6297bf7427a 100644
--- a/sql/updates/auth/2013_02_25_09_auth_misc.sql
+++ b/sql/updates/auth/2013_02_25_09_auth_misc.sql
@@ -17,7 +17,7 @@ INSERT INTO `rbac_role_permissions` (`roleId`, `permissionId`) VALUES
(21, 47);
-- Add it to all GM+ groups
-DELETE FROM `rbac_role_permissions` WHERE `roleId` IN (20, 21);
+DELETE FROM `rbac_group_roles` WHERE `roleId` IN (20, 21);
INSERT INTO `rbac_group_roles` (`groupId`, `roleId`) VALUES
(2, 20),
(3, 20),
diff --git a/sql/updates/auth/2013_02_25_10_auth_misc.sql b/sql/updates/auth/2013_02_25_10_auth_misc.sql
index 4255bdac8ba..ccca7c74f06 100644
--- a/sql/updates/auth/2013_02_25_10_auth_misc.sql
+++ b/sql/updates/auth/2013_02_25_10_auth_misc.sql
@@ -26,7 +26,7 @@ INSERT INTO `rbac_role_permissions` (`roleId`, `permissionId`) VALUES
(26, 41);
-- Add it to all GM+ groups
-DELETE FROM `rbac_role_permissions` WHERE `roleId` IN (22, 23, 24, 25, 26);
+DELETE FROM `rbac_group_roles` WHERE `roleId` IN (22, 23, 24, 25, 26);
INSERT INTO `rbac_group_roles` (`groupId`, `roleId`) VALUES
(2, 22),
(3, 22),
diff --git a/sql/updates/auth/2013_02_25_11_auth_misc.sql b/sql/updates/auth/2013_02_25_11_auth_misc.sql
index 9c2897394e5..90c19526b06 100644
--- a/sql/updates/auth/2013_02_25_11_auth_misc.sql
+++ b/sql/updates/auth/2013_02_25_11_auth_misc.sql
@@ -20,7 +20,7 @@ INSERT INTO `rbac_role_permissions` (`roleId`, `permissionId`) VALUES
(29, 36);
-- Add it to all GM+ groups
-DELETE FROM `rbac_role_permissions` WHERE `roleId` IN (27, 28, 29);
+DELETE FROM `rbac_group_roles` WHERE `roleId` IN (27, 28, 29);
INSERT INTO `rbac_group_roles` (`groupId`, `roleId`) VALUES
(2, 27),
(3, 27),
diff --git a/sql/updates/auth/2013_02_25_12_auth_misc.sql b/sql/updates/auth/2013_02_25_12_auth_misc.sql
index 2b394dc9bcb..30e203ea4b3 100644
--- a/sql/updates/auth/2013_02_25_12_auth_misc.sql
+++ b/sql/updates/auth/2013_02_25_12_auth_misc.sql
@@ -20,7 +20,7 @@ INSERT INTO `rbac_role_permissions` (`roleId`, `permissionId`) VALUES
(32, 46);
-- Add it to all GM+ groups
-DELETE FROM `rbac_role_permissions` WHERE `roleId` IN (30, 31, 32);
+DELETE FROM `rbac_group_roles` WHERE `roleId` IN (30, 31, 32);
INSERT INTO `rbac_group_roles` (`groupId`, `roleId`) VALUES
(1, 30),
(2, 30),
diff --git a/sql/updates/auth/2013_02_25_13_auth_misc.sql b/sql/updates/auth/2013_02_25_13_auth_misc.sql
index 82247ecd07d..9a7806ede68 100644
--- a/sql/updates/auth/2013_02_25_13_auth_misc.sql
+++ b/sql/updates/auth/2013_02_25_13_auth_misc.sql
@@ -1,18 +1,18 @@
-- Add new permissions
DELETE FROM `rbac_permissions` WHERE `id` IN (14, 15, 16, 17, 18, 24);
INSERT INTO `rbac_permissions` (`id`, `name`) VALUES
-(14, 'Skips character creation team mask check'),
-(15, 'Skips character creation class mask check'),
-(16, 'Skips character creation race mask check'),
-(17, 'Skips character creation reserved name check'),
-(18, 'Skips character creation heroic min level check'),
-(24, 'Creation of two side faction characters in same account');
+(14, 'Skip character creation team mask check'),
+(15, 'Skip character creation class mask check'),
+(16, 'Skip character creation race mask check'),
+(17, 'Skip character creation reserved name check'),
+(18, 'Skip character creation heroic min level check'),
+(24, 'Two side faction characters on the same account');
-- Add new role
DELETE FROM `rbac_roles` WHERE `id` IN (33, 34);
INSERT INTO `rbac_roles` (`id`, `name`) VALUES
-(33, 'Skips character creation checks'),
-(34, 'Creation of two side faction characters in same account');
+(33, 'Skip character creation checks'),
+(34, 'Two side faction characters on the same account');
-- Add the permission to the role
DELETE FROM `rbac_role_permissions` WHERE `roleId` IN (33, 34);
@@ -25,7 +25,7 @@ INSERT INTO `rbac_role_permissions` (`roleId`, `permissionId`) VALUES
(34, 24);
-- Add it to all groups
-DELETE FROM `rbac_role_permissions` WHERE `roleId` IN (33, 34);
+DELETE FROM `rbac_group_roles` WHERE `roleId` IN (33, 34);
INSERT INTO `rbac_group_roles` (`groupId`, `roleId`) VALUES
(2, 33),
(3, 33),
diff --git a/sql/updates/auth/2013_02_25_14_auth_misc.sql b/sql/updates/auth/2013_02_25_14_auth_misc.sql
index c02b600b12f..f88280feae7 100644
--- a/sql/updates/auth/2013_02_25_14_auth_misc.sql
+++ b/sql/updates/auth/2013_02_25_14_auth_misc.sql
@@ -23,7 +23,7 @@ INSERT INTO `rbac_role_permissions` (`roleId`, `permissionId`) VALUES
(38, 40);
-- Add it to all groups
-DELETE FROM `rbac_role_permissions` WHERE `roleId` IN (35, 36, 37, 38);
+DELETE FROM `rbac_group_roles` WHERE `roleId` IN (35, 36, 37, 38);
INSERT INTO `rbac_group_roles` (`groupId`, `roleId`) VALUES
(2, 35),
(3, 35),
diff --git a/sql/updates/world/2013_02_24_05_world_command.sql b/sql/updates/world/2013_02_24_05_world_command.sql
new file mode 100644
index 00000000000..0b153be15bc
--- /dev/null
+++ b/sql/updates/world/2013_02_24_05_world_command.sql
@@ -0,0 +1,4 @@
+DELETE FROM `command` WHERE `name` = 'reload creature_summon_groups';
+INSERT INTO `command` (`name`,`security`,`help`) VALUES
+('reload creature_summon_groups',3,'Syntax: .reload creature_summon_groups
+Reload creature_summon_groups table.');
diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp
index 1b7948c4774..4200c086275 100644
--- a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp
+++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp
@@ -515,35 +515,35 @@ bool BossAI::CheckBoundary(Unit* who)
switch (itr->first)
{
case BOUNDARY_N:
- if (me->GetPositionX() > itr->second)
+ if (who->GetPositionX() > itr->second)
return false;
break;
case BOUNDARY_S:
- if (me->GetPositionX() < itr->second)
+ if (who->GetPositionX() < itr->second)
return false;
break;
case BOUNDARY_E:
- if (me->GetPositionY() < itr->second)
+ if (who->GetPositionY() < itr->second)
return false;
break;
case BOUNDARY_W:
- if (me->GetPositionY() > itr->second)
+ if (who->GetPositionY() > itr->second)
return false;
break;
case BOUNDARY_NW:
- if (me->GetPositionX() + me->GetPositionY() > itr->second)
+ if (who->GetPositionX() + who->GetPositionY() > itr->second)
return false;
break;
case BOUNDARY_SE:
- if (me->GetPositionX() + me->GetPositionY() < itr->second)
+ if (who->GetPositionX() + who->GetPositionY() < itr->second)
return false;
break;
case BOUNDARY_NE:
- if (me->GetPositionX() - me->GetPositionY() > itr->second)
+ if (who->GetPositionX() - who->GetPositionY() > itr->second)
return false;
break;
case BOUNDARY_SW:
- if (me->GetPositionX() - me->GetPositionY() < itr->second)
+ if (who->GetPositionX() - who->GetPositionY() < itr->second)
return false;
break;
default:
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index 1851847f408..511ea6627df 100644
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -2470,7 +2470,7 @@ TempSummon* Map::SummonCreature(uint32 entry, Position const& pos, SummonPropert
* @param list List to store pointers to summoned creatures.
*/
-void Map::SummonCreatureGroup(uint8 group, std::list<TempSummon*>& list)
+void Map::SummonCreatureGroup(uint8 group, std::list<TempSummon*>* list /*= NULL*/)
{
std::vector<TempSummonData> const* data = sObjectMgr->GetSummonGroup(GetId(), SUMMONER_TYPE_MAP, group);
if (!data)
@@ -2478,7 +2478,8 @@ void Map::SummonCreatureGroup(uint8 group, std::list<TempSummon*>& list)
for (std::vector<TempSummonData>::const_iterator itr = data->begin(); itr != data->end(); ++itr)
if (TempSummon* summon = SummonCreature(itr->entry, itr->pos, NULL, itr->time))
- list.push_back(summon);
+ if (list)
+ list->push_back(summon);
}
void WorldObject::SetZoneScript()
@@ -2566,7 +2567,7 @@ Creature* WorldObject::SummonTrigger(float x, float y, float z, float ang, uint3
* @param group Id of group to summon.
* @param list List to store pointers to summoned creatures.
*/
-void WorldObject::SummonCreatureGroup(uint8 group, std::list<TempSummon*>& list)
+void WorldObject::SummonCreatureGroup(uint8 group, std::list<TempSummon*>* list /*= NULL*/)
{
ASSERT((GetTypeId() == TYPEID_GAMEOBJECT || GetTypeId() == TYPEID_UNIT) && "Only GOs and creatures can summon npc groups!");
@@ -2576,7 +2577,8 @@ void WorldObject::SummonCreatureGroup(uint8 group, std::list<TempSummon*>& list)
for (std::vector<TempSummonData>::const_iterator itr = data->begin(); itr != data->end(); ++itr)
if (TempSummon* summon = SummonCreature(itr->entry, itr->pos, itr->type, itr->time))
- list.push_back(summon);
+ if (list)
+ list->push_back(summon);
}
Creature* WorldObject::FindNearestCreature(uint32 entry, float range, bool alive) const
diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h
index 0f34c5df4b9..063cadcb610 100644
--- a/src/server/game/Entities/Object/Object.h
+++ b/src/server/game/Entities/Object/Object.h
@@ -872,7 +872,7 @@ class WorldObject : public Object, public WorldLocation
}
GameObject* SummonGameObject(uint32 entry, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 respawnTime);
Creature* SummonTrigger(float x, float y, float z, float ang, uint32 dur, CreatureAI* (*GetAI)(Creature*) = NULL);
- void SummonCreatureGroup(uint8 group, std::list<TempSummon*>& list);
+ void SummonCreatureGroup(uint8 group, std::list<TempSummon*>* list = NULL);
Creature* FindNearestCreature(uint32 entry, float range, bool alive = true) const;
GameObject* FindNearestGameObject(uint32 entry, float range) const;
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index 265b981639f..46fec55b820 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -1450,6 +1450,8 @@ void ObjectMgr::LoadTempSummons()
{
uint32 oldMSTime = getMSTime();
+ _tempSummonDataStore.clear(); // needed for reload case
+
// 0 1 2 3 4 5 6 7 8 9
QueryResult result = WorldDatabase.Query("SELECT summonerId, summonerType, groupId, entry, position_x, position_y, position_z, orientation, summonType, summonTime FROM creature_summon_groups");
diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
index 6dc0aceec96..d1413ac9fa1 100644
--- a/src/server/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
@@ -63,6 +63,26 @@ struct PageText
uint16 NextPage;
};
+/// Key for storing temp summon data in TempSummonDataContainer
+struct TempSummonGroupKey
+{
+ TempSummonGroupKey(uint32 summonerEntry, SummonerType summonerType, uint8 group)
+ : _summonerEntry(summonerEntry), _summonerType(summonerType), _summonGroup(group)
+ {
+ }
+
+ bool operator<(TempSummonGroupKey const& rhs) const
+ {
+ // memcmp is only reliable if struct doesn't have any padding (packed)
+ return memcmp(this, &rhs, sizeof(TempSummonGroupKey)) < 0;
+ }
+
+private:
+ uint32 _summonerEntry; ///< Summoner's entry
+ SummonerType _summonerType; ///< Summoner's type, see SummonerType for available types
+ uint8 _summonGroup; ///< Summon's group id
+};
+
// GCC have alternative #pragma pack() syntax and old gcc version not support pack(pop), also any gcc version not support it at some platform
#if defined(__GNUC__)
#pragma pack()
@@ -417,25 +437,6 @@ struct TrinityStringLocale
StringVector Content;
};
-/// Key for storing temp summon data in TempSummonDataContainer
-struct TempSummonGroupKey
-{
- TempSummonGroupKey(uint32 summonerEntry, SummonerType summonerType, uint8 group)
- : _summonerEntry(summonerEntry), _summonerType(summonerType), _summonGroup(group)
- {
- }
-
- bool operator<(TempSummonGroupKey const& rhs) const
- {
- return memcmp(this, &rhs, sizeof(TempSummonGroupKey)) < 0;
- }
-
-private:
- uint32 _summonerEntry; ///< Summoner's entry
- SummonerType _summonerType; ///< Summoner's type, see SummonerType for available types
- uint8 _summonGroup; ///< Summon's group id
-};
-
typedef std::map<uint64, uint64> LinkedRespawnContainer;
typedef UNORDERED_MAP<uint32, CreatureData> CreatureDataContainer;
typedef UNORDERED_MAP<uint32, GameObjectData> GameObjectDataContainer;
diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h
index d3f7ac7bbf1..4eaec222b95 100644
--- a/src/server/game/Maps/Map.h
+++ b/src/server/game/Maps/Map.h
@@ -435,7 +435,7 @@ class Map : public GridRefManager<NGridType>
void UpdateIteratorBack(Player* player);
TempSummon* SummonCreature(uint32 entry, Position const& pos, SummonPropertiesEntry const* properties = NULL, uint32 duration = 0, Unit* summoner = NULL, uint32 spellId = 0, uint32 vehId = 0);
- void SummonCreatureGroup(uint8 group, std::list<TempSummon*>& list);
+ void SummonCreatureGroup(uint8 group, std::list<TempSummon*>* list = NULL);
Creature* GetCreature(uint64 guid);
GameObject* GetGameObject(uint64 guid);
DynamicObject* GetDynamicObject(uint64 guid);
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 57b316a3141..d8eb279a5bc 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -827,7 +827,8 @@ void Spell::SelectEffectImplicitTargets(SpellEffIndex effIndex, SpellImplicitTar
if (effects[effIndex].TargetA.GetTarget() == effects[j].TargetA.GetTarget() &&
effects[effIndex].TargetB.GetTarget() == effects[j].TargetB.GetTarget() &&
effects[effIndex].ImplicitTargetConditions == effects[j].ImplicitTargetConditions &&
- effects[effIndex].CalcRadius(m_caster) == effects[j].CalcRadius(m_caster))
+ effects[effIndex].CalcRadius(m_caster) == effects[j].CalcRadius(m_caster) &&
+ CheckScriptEffectImplicitTargets(effIndex, j))
{
effectMask |= 1 << j;
}
@@ -7162,6 +7163,29 @@ void Spell::CallScriptObjectTargetSelectHandlers(WorldObject*& target, SpellEffI
}
}
+bool Spell::CheckScriptEffectImplicitTargets(uint32 effIndex, uint32 effIndexToCheck)
+{
+ // Skip if there are not any script
+ if (!m_loadedScripts.size())
+ return true;
+
+ for (std::list<SpellScript*>::iterator itr = m_loadedScripts.begin(); itr != m_loadedScripts.end(); ++itr)
+ {
+ std::list<SpellScript::ObjectTargetSelectHandler>::iterator targetSelectHookEnd = (*itr)->OnObjectTargetSelect.end(), targetSelectHookItr = (*itr)->OnObjectTargetSelect.begin();
+ for (; targetSelectHookItr != targetSelectHookEnd; ++targetSelectHookItr)
+ if (((*targetSelectHookItr).IsEffectAffected(m_spellInfo, effIndex) && !(*targetSelectHookItr).IsEffectAffected(m_spellInfo, effIndexToCheck)) ||
+ (!(*targetSelectHookItr).IsEffectAffected(m_spellInfo, effIndex) && (*targetSelectHookItr).IsEffectAffected(m_spellInfo, effIndexToCheck)))
+ return false;
+
+ std::list<SpellScript::ObjectAreaTargetSelectHandler>::iterator areaTargetSelectHookEnd = (*itr)->OnObjectAreaTargetSelect.end(), areaTargetSelectHookItr = (*itr)->OnObjectAreaTargetSelect.begin();
+ for (; areaTargetSelectHookItr != areaTargetSelectHookEnd; ++areaTargetSelectHookItr)
+ if (((*areaTargetSelectHookItr).IsEffectAffected(m_spellInfo, effIndex) && !(*areaTargetSelectHookItr).IsEffectAffected(m_spellInfo, effIndexToCheck)) ||
+ (!(*areaTargetSelectHookItr).IsEffectAffected(m_spellInfo, effIndex) && (*areaTargetSelectHookItr).IsEffectAffected(m_spellInfo, effIndexToCheck)))
+ return false;
+ }
+ return true;
+}
+
bool Spell::CanExecuteTriggersOnHit(uint8 effMask, SpellInfo const* triggeredByAura) const
{
bool only_on_caster = (triggeredByAura && (triggeredByAura->AttributesEx4 & SPELL_ATTR4_PROC_ONLY_ON_CASTER));
diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h
index 27474645d77..08a7b087be2 100644
--- a/src/server/game/Spells/Spell.h
+++ b/src/server/game/Spells/Spell.h
@@ -636,6 +636,7 @@ class Spell
void CallScriptAfterHitHandlers();
void CallScriptObjectAreaTargetSelectHandlers(std::list<WorldObject*>& targets, SpellEffIndex effIndex);
void CallScriptObjectTargetSelectHandlers(WorldObject*& target, SpellEffIndex effIndex);
+ bool CheckScriptEffectImplicitTargets(uint32 effIndex, uint32 effIndexToCheck);
std::list<SpellScript*> m_loadedScripts;
struct HitTriggerSpell
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index 8ec3d7d3731..febfac27ee1 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -592,21 +592,6 @@ bool SpellMgr::IsSpellRequiringSpell(uint32 spellid, uint32 req_spellid) const
return false;
}
-const SpellsRequiringSpellMap SpellMgr::GetSpellsRequiringSpell()
-{
- return this->mSpellsReqSpell;
-}
-
-uint32 SpellMgr::GetSpellRequired(uint32 spell_id) const
-{
- SpellRequiredMap::const_iterator itr = mSpellReq.find(spell_id);
-
- if (itr == mSpellReq.end())
- return 0;
-
- return itr->second;
-}
-
SpellLearnSkillNode const* SpellMgr::GetSpellLearnSkill(uint32 spell_id) const
{
SpellLearnSkillMap::const_iterator itr = mSpellLearnSkills.find(spell_id);
@@ -777,7 +762,7 @@ SpellProcEventEntry const* SpellMgr::GetSpellProcEvent(uint32 spellId) const
return NULL;
}
-bool SpellMgr::IsSpellProcEventCanTriggeredBy(SpellProcEventEntry const* spellProcEvent, uint32 EventProcFlag, SpellInfo const* procSpell, uint32 procFlags, uint32 procExtra, bool active)
+bool SpellMgr::IsSpellProcEventCanTriggeredBy(SpellProcEventEntry const* spellProcEvent, uint32 EventProcFlag, SpellInfo const* procSpell, uint32 procFlags, uint32 procExtra, bool active) const
{
// No extra req need
uint32 procEvent_procEx = PROC_EX_NONE;
@@ -914,7 +899,7 @@ SpellProcEntry const* SpellMgr::GetSpellProcEntry(uint32 spellId) const
return NULL;
}
-bool SpellMgr::CanSpellTriggerProcOnEvent(SpellProcEntry const& procEntry, ProcEventInfo& eventInfo)
+bool SpellMgr::CanSpellTriggerProcOnEvent(SpellProcEntry const& procEntry, ProcEventInfo& eventInfo) const
{
// proc type doesn't match
if (!(eventInfo.GetTypeMask() & procEntry.typeMask))
@@ -1015,7 +1000,7 @@ SkillLineAbilityMapBounds SpellMgr::GetSkillLineAbilityMapBounds(uint32 spell_id
return mSkillLineAbilityMap.equal_range(spell_id);
}
-PetAura const* SpellMgr::GetPetAura(uint32 spell_id, uint8 eff)
+PetAura const* SpellMgr::GetPetAura(uint32 spell_id, uint8 eff) const
{
SpellPetAuraMap::const_iterator itr = mSpellPetAuraMap.find((spell_id<<8) + eff);
if (itr != mSpellPetAuraMap.end())
diff --git a/src/server/game/Spells/SpellMgr.h b/src/server/game/Spells/SpellMgr.h
index 578ba5be5d2..653fccb17af 100644
--- a/src/server/game/Spells/SpellMgr.h
+++ b/src/server/game/Spells/SpellMgr.h
@@ -632,8 +632,6 @@ class SpellMgr
SpellRequiredMapBounds GetSpellsRequiredForSpellBounds(uint32 spell_id) const;
SpellsRequiringSpellMapBounds GetSpellsRequiringSpellBounds(uint32 spell_id) const;
bool IsSpellRequiringSpell(uint32 spellid, uint32 req_spellid) const;
- const SpellsRequiringSpellMap GetSpellsRequiringSpell();
- uint32 GetSpellRequired(uint32 spell_id) const;
// Spell learning
SpellLearnSkillNode const* GetSpellLearnSkill(uint32 spell_id) const;
@@ -658,11 +656,11 @@ class SpellMgr
// Spell proc event table
SpellProcEventEntry const* GetSpellProcEvent(uint32 spellId) const;
- bool IsSpellProcEventCanTriggeredBy(SpellProcEventEntry const* spellProcEvent, uint32 EventProcFlag, SpellInfo const* procSpell, uint32 procFlags, uint32 procExtra, bool active);
+ bool IsSpellProcEventCanTriggeredBy(SpellProcEventEntry const* spellProcEvent, uint32 EventProcFlag, SpellInfo const* procSpell, uint32 procFlags, uint32 procExtra, bool active) const;
// Spell proc table
SpellProcEntry const* GetSpellProcEntry(uint32 spellId) const;
- bool CanSpellTriggerProcOnEvent(SpellProcEntry const& procEntry, ProcEventInfo& eventInfo);
+ bool CanSpellTriggerProcOnEvent(SpellProcEntry const& procEntry, ProcEventInfo& eventInfo) const;
// Spell bonus data table
SpellBonusEntry const* GetSpellBonusData(uint32 spellId) const;
@@ -672,7 +670,7 @@ class SpellMgr
SkillLineAbilityMapBounds GetSkillLineAbilityMapBounds(uint32 spell_id) const;
- PetAura const* GetPetAura(uint32 spell_id, uint8 eff);
+ PetAura const* GetPetAura(uint32 spell_id, uint8 eff) const;
SpellEnchantProcEntry const* GetSpellEnchantProcEvent(uint32 enchId) const;
bool IsArenaAllowedEnchancment(uint32 ench_id) const;
diff --git a/src/server/scripts/Commands/cs_reload.cpp b/src/server/scripts/Commands/cs_reload.cpp
index 4dcbf204388..ef1af6c544f 100644
--- a/src/server/scripts/Commands/cs_reload.cpp
+++ b/src/server/scripts/Commands/cs_reload.cpp
@@ -82,6 +82,7 @@ public:
{ "creature_loot_template", SEC_ADMINISTRATOR, true, &HandleReloadLootTemplatesCreatureCommand, "", NULL },
{ "creature_onkill_reputation", SEC_ADMINISTRATOR, true, &HandleReloadOnKillReputationCommand, "", NULL },
{ "creature_questrelation", SEC_ADMINISTRATOR, true, &HandleReloadCreatureQuestRelationsCommand, "", NULL },
+ { "creature_summon_groups", SEC_ADMINISTRATOR, true, &HandleReloadCreatureSummonGroupsCommand, "", NULL },
{ "creature_template", SEC_ADMINISTRATOR, true, &HandleReloadCreatureTemplateCommand, "", NULL },
//{ "db_script_string", SEC_ADMINISTRATOR, true, &HandleReloadDbScriptStringCommand, "", NULL },
{ "disables", SEC_ADMINISTRATOR, true, &HandleReloadDisablesCommand, "", NULL },
@@ -189,6 +190,8 @@ public:
HandleReloadTrinityStringCommand(handler, "");
HandleReloadGameTeleCommand(handler, "");
+ HandleReloadCreatureSummonGroupsCommand(handler, "");
+
HandleReloadVehicleAccessoryCommand(handler, "");
HandleReloadVehicleTemplateAccessoryCommand(handler, "");
@@ -384,6 +387,14 @@ public:
return true;
}
+ static bool HandleReloadCreatureSummonGroupsCommand(ChatHandler* handler, const char* /*args*/)
+ {
+ sLog->outInfo(LOG_FILTER_GENERAL, "Reloading creature summon groups...");
+ sObjectMgr->LoadTempSummons();
+ handler->SendGlobalGMSysMessage("DB table `creature_summon_groups` reloaded.");
+ return true;
+ }
+
static bool HandleReloadCreatureTemplateCommand(ChatHandler* handler, const char* args)
{
if (!*args)