Merge branch 'master' of github.com:TrinityCore/TrinityCore into 4.3.4

This commit is contained in:
Vincent_Michael
2013-02-26 16:11:15 +01:00
23 changed files with 346 additions and 82 deletions
+240 -7
View File
@@ -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;
@@ -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');
+1 -1
View File
@@ -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),
+1 -1
View File
@@ -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),
+2 -2
View File
@@ -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);
+1 -1
View File
@@ -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),
+1 -1
View File
@@ -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),
+1 -1
View File
@@ -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),
+1 -1
View File
@@ -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),
+9 -9
View File
@@ -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),
+1 -1
View File
@@ -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),
@@ -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.');
@@ -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:
+6 -4
View File
@@ -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
+1 -1
View File
@@ -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;
+2
View File
@@ -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");
+20 -19
View File
@@ -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;
+1 -1
View File
@@ -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);
+25 -1
View File
@@ -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));
+1
View File
@@ -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
+3 -18
View File
@@ -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())
+3 -5
View File
@@ -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;
+11
View File
@@ -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)