aboutsummaryrefslogtreecommitdiff
path: root/src/game/CreatureGroups.cpp
diff options
context:
space:
mode:
authormaximius <none@none>2009-10-17 15:35:07 -0700
committermaximius <none@none>2009-10-17 15:35:07 -0700
commit26b5e033ffde3d161382fc9addbfa99738379641 (patch)
treea344f369ca32945f787a02dee35c3dbe342bed7e /src/game/CreatureGroups.cpp
parentf21f47005dcb6b76e1abc9f35fbcd03eed191bff (diff)
*Massive cleanup (\n\n -> \n, *\n -> \n, cleanup for(...) to for (...), and some other cleanups by hand)
*Fix a possible crash in Spell::DoAllEffectOnTarget --HG-- branch : trunk
Diffstat (limited to 'src/game/CreatureGroups.cpp')
-rw-r--r--src/game/CreatureGroups.cpp48
1 files changed, 2 insertions, 46 deletions
diff --git a/src/game/CreatureGroups.cpp b/src/game/CreatureGroups.cpp
index 97610754e69..c0816f36804 100644
--- a/src/game/CreatureGroups.cpp
+++ b/src/game/CreatureGroups.cpp
@@ -17,28 +17,21 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-
#include "Creature.h"
#include "CreatureGroups.h"
#include "ObjectMgr.h"
#include "ProgressBar.h"
#include "Policies/SingletonImp.h"
#include "CreatureAI.h"
-
#define MAX_DESYNC 5.0f
-
INSTANTIATE_SINGLETON_1(CreatureGroupManager);
-
CreatureGroupInfoType CreatureGroupMap;
-
void CreatureGroupManager::AddCreatureToGroup(uint32 groupId, Creature *member)
{
Map *map = member->FindMap();
if(!map)
return;
-
CreatureGroupHolderType::iterator itr = map->CreatureGroupHolder.find(groupId);
-
//Add member to an existing group
if(itr != map->CreatureGroupHolder.end())
{
@@ -54,58 +47,47 @@ void CreatureGroupManager::AddCreatureToGroup(uint32 groupId, Creature *member)
group->AddMember(member);
}
}
-
void CreatureGroupManager::RemoveCreatureFromGroup(CreatureGroup *group, Creature *member)
{
sLog.outDebug("Deleting member pointer to GUID: %u from group %u", group->GetId(), member->GetDBTableGUIDLow());
group->RemoveMember(member);
-
if(group->isEmpty())
{
Map *map = member->FindMap();
if(!map)
return;
-
sLog.outDebug("Deleting group with InstanceID %u", member->GetInstanceId());
map->CreatureGroupHolder.erase(group->GetId());
delete group;
}
}
-
void CreatureGroupManager::LoadCreatureFormations()
{
//Clear existing map
CreatureGroupMap.clear();
-
//Check Integrity of the table
QueryResult *result = WorldDatabase.PQuery("SELECT MAX(leaderGUID) FROM creature_formations");
-
if(!result)
{
sLog.outErrorDb(" ...an error occured while loading the table creature_formations ( maybe it doesn't exist ?)\n");
return;
}
delete result;
-
//Get group data
result = WorldDatabase.PQuery("SELECT leaderGUID, memberGUID, dist, angle, groupAI FROM creature_formations ORDER BY leaderGUID");
-
if(!result)
{
sLog.outErrorDb("The table creature_formations is empty or corrupted");
return;
}
-
uint32 total_records = result->GetRowCount();
barGoLink bar( total_records);
Field *fields;
-
FormationInfo *group_member;
//Loading data...
do
{
fields = result->Fetch();
-
bar.step();
//Load group member data
group_member = new FormationInfo;
@@ -123,7 +105,6 @@ void CreatureGroupManager::LoadCreatureFormations()
group_member->follow_dist = 0;
group_member->follow_angle = 0;
}
-
// check data correctness
{
QueryResult* result = WorldDatabase.PQuery("SELECT guid FROM creature WHERE guid = %u", group_member->leaderGUID);
@@ -132,7 +113,6 @@ void CreatureGroupManager::LoadCreatureFormations()
sLog.outErrorDb("creature_formations table leader guid %u incorrect (not exist)", group_member->leaderGUID);
continue;
}
-
result = WorldDatabase.PQuery("SELECT guid FROM creature WHERE guid = %u", memberGUID);
if(!result)
{
@@ -140,71 +120,56 @@ void CreatureGroupManager::LoadCreatureFormations()
continue;
}
}
-
CreatureGroupMap[memberGUID] = group_member;
- }
+ }
while(result->NextRow()) ;
-
sLog.outString();
sLog.outString( ">> Loaded %u creatures in formations", total_records );
sLog.outString();
//Free some heap
delete result;
}
-
void CreatureGroup::AddMember(Creature *member)
{
sLog.outDebug("CreatureGroup::AddMember: Adding unit GUID: %u.", member->GetGUIDLow());
-
//Check if it is a leader
if(member->GetDBTableGUIDLow() == m_groupID)
{
sLog.outDebug("Unit GUID: %u is formation leader. Adding group.", member->GetGUIDLow());
m_leader = member;
}
-
m_members[member] = CreatureGroupMap.find(member->GetDBTableGUIDLow())->second;
member->SetFormation(this);
}
-
void CreatureGroup::RemoveMember(Creature *member)
{
if(m_leader == member)
m_leader = NULL;
-
m_members.erase(member);
member->SetFormation(NULL);
}
-
void CreatureGroup::MemberAttackStart(Creature *member, Unit *target)
{
uint8 groupAI = CreatureGroupMap[member->GetDBTableGUIDLow()]->groupAI;
if(!groupAI)
return;
-
if(groupAI == 1 && member != m_leader)
return;
-
for(CreatureGroupMemberType::iterator itr = m_members.begin(); itr != m_members.end(); ++itr)
{
sLog.outDebug("GROUP ATTACK: group instance id %u calls member instid %u", m_leader->GetInstanceId(), member->GetInstanceId());
//sLog.outDebug("AI:%u:Group member found: %u, attacked by %s.", groupAI, itr->second->GetGUIDLow(), member->getVictim()->GetName());
-
//Skip one check
if(itr->first == member)
continue;
-
if(!itr->first->isAlive())
continue;
-
if(itr->first->getVictim())
continue;
-
if(itr->first->canAttack(target))
itr->first->AI()->AttackStart(target);
}
}
-
void CreatureGroup::FormationReset(bool dismiss)
{
for(CreatureGroupMemberType::iterator itr = m_members.begin(); itr != m_members.end(); ++itr)
@@ -220,37 +185,28 @@ void CreatureGroup::FormationReset(bool dismiss)
}
m_Formed = !dismiss;
}
-
void CreatureGroup::LeaderMoveTo(float x, float y, float z)
{
if(!m_leader)
return;
-
float pathangle = atan2(m_leader->GetPositionY() - y, m_leader->GetPositionX() - x);
-
for(CreatureGroupMemberType::iterator itr = m_members.begin(); itr != m_members.end(); ++itr)
{
Creature *member = itr->first;
if(member == m_leader || !member->isAlive() || member->getVictim())
continue;
-
float angle = itr->second->follow_angle;
- float dist = itr->second->follow_dist;
-
+ float dist = itr->second->follow_dist;
float dx = x + cos(angle + pathangle) * dist;
float dy = y + sin(angle + pathangle) * dist;
float dz = z;
-
Trinity::NormalizeMapCoord(dx);
Trinity::NormalizeMapCoord(dy);
-
member->UpdateGroundPositionZ(dx, dy, dz);
-
if(member->IsWithinDist(m_leader, dist + MAX_DESYNC))
member->SetUnitMovementFlags(m_leader->GetUnitMovementFlags());
else
member->RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
-
member->GetMotionMaster()->MovePoint(0, dx, dy, dz);
member->SetHomePosition(dx, dy, dz, pathangle);
}