Beispiel #1
0
void CreatureGroupManager::LoadCreatureGroups()
{
    uint32 oldMSTime = getMSTime();

    for (CreatureGroupInfoType::iterator itr = CreatureGroupMap.begin(); itr != CreatureGroupMap.end(); ++itr) // for reload case
        delete itr->second;
    CreatureGroupMap.clear();

    CreatureGroupDataMap.clear();

    //Check if groups without member exist
    PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_LOAD_CREGROUPS_WITHOUT_DATA);
    PreparedQueryResult result = WorldDatabase.Query(stmt);

    if (result)
        sLog->outDetail(">> %u Groups without member found, groups skipped.",result->Fetch()->GetInt32());

    //Check if member without group exist
    stmt = WorldDatabase.GetPreparedStatement(WORLD_LOAD_CREGROUP_DATA_WITHOUT_GROUP);
    result = WorldDatabase.Query(stmt);

    if (result)
        sLog->outDetail(">> %u Member without group found, member skipped.",result->Fetch()->GetInt32());

    //Get groups
    stmt = WorldDatabase.GetPreparedStatement(WORLD_LOAD_CREGROUPS);
    PreparedQueryResult result_data = WorldDatabase.Query(stmt);

    if (!result_data)
    {
        sLog->outString(">> Loaded 0 creature groups. DB table `creature_groups` is empty.");
            sLog->outString();
        return;
    }

    //Get member
    stmt = WorldDatabase.GetPreparedStatement(WORLD_LOAD_CREGROUP_DATA);
    PreparedQueryResult result_member = WorldDatabase.Query(stmt);

    if (!result_member)
    {
        sLog->outString(">> Loaded 0 creature groups. DB table `creature_group_data` is empty.");
        sLog->outString();
        return;
    }

    std::set<uint32> guidSet;

    stmt = WorldDatabase.GetPreparedStatement(WORLD_LOAD_CREATURE_GUIDS);
    PreparedQueryResult guidResult = WorldDatabase.Query(stmt);

    if (guidResult)
    {
        do
        {
            Field* fields = guidResult->Fetch();
            uint32 guid = fields[0].GetUInt32();

            guidSet.insert(guid);

        }
        while (guidResult->NextRow());
    }

    //Loading groups...
    uint32 group_count = 0;
    GroupInfo* group_member;

    do
    {
        Field* fields = result_data->Fetch();

        //Load group member data
        uint32 groupId = fields[0].GetUInt32();
        uint32 leaderGUID = fields[1].GetUInt32();
        uint8  groupType = fields[2].GetUInt8();

        group_member                        = new GroupInfo;
        group_member->leaderGUID            = leaderGUID;
        group_member->groupType             = groupType;

        // check data correctness
        if (guidSet.find(group_member->leaderGUID) == guidSet.end())
        {
            sLog->outErrorDb("creature_groups table leader guid %u incorrect (not exist)", group_member->leaderGUID);
            delete group_member;
            return;
        }

        CreatureGroupMap[groupId] = group_member;

        sLog->outDebug(LOG_FILTER_UNITS, "CreatureGroup::LoadCreatureGroups: Load Group %u with Leader %u and groupType %u.", groupId, leaderGUID, groupType);
        ++group_count;
    }
    while (result_data->NextRow()) ;

    //Loading member...
    uint32 member_count = 0;
    do
    {
        Field* fields = result_member->Fetch();

        //Load group member data
        uint32 groupId = fields[0].GetUInt32();
        uint32 memberGUID = fields[1].GetUInt32();

        // check data correctness
        if (guidSet.find(memberGUID) == guidSet.end())
        {
            sLog->outErrorDb("creature_group_data table member guid %u incorrect (not exist)", memberGUID);
            continue;
        }

        CreatureGroupDataMap[memberGUID] = groupId;

        sLog->outDebug(LOG_FILTER_UNITS, "CreatureGroup::LoadCreatureGroups: Load Member %u for Group with groupId %u.", memberGUID, groupId);
        ++member_count;
    }
    while (result->NextRow()) ;

    sLog->outString(">> Loaded %u creatures in %u groups in %u ms", member_count, group_count, GetMSTimeDiffToNow(oldMSTime));
    sLog->outString();
}
void CreatureGroupManager::LoadCreatureGroups()
{
    //Clear existing map
    for (CreatureGroupInfoType::iterator itr = CreatureGroupMap.begin(); itr != CreatureGroupMap.end(); ++itr)
       delete itr->second;
    CreatureGroupMap.clear();
    CreatureGroupDataMap.clear();

    //Check Integrity of the table
    QueryResult_AutoPtr result = WorldDatabase.Query("SELECT MAX(groupId) FROM creature_groups");

    if (!result)
    {
        sLog.outErrorDb(" ...an error occured while loading the table creature_groups (maybe it doesn't exist ?)\n");
        return;
    }

    //Get group data
    result = WorldDatabase.Query("SELECT MAX(groupId) FROM creature_group_data");

    if (!result)
    {
        sLog.outErrorDb(" ...an error occured while loading the table creature_group_data (maybe it doesn't exist ?)\n");
        return;
    }

    //Check if groups without member exist
    result = WorldDatabase.Query("SELECT COUNT(groupId) FROM creature_groups WHERE groupId NOT IN (SELECT groupId FROM creature_group_data)");

    if (result)
    {
        sLog.outDetail(">> %u Groups without member found, groups skipped.",result->Fetch()->GetInt32());
    }

    //Check if member without group exist
    result = WorldDatabase.Query("SELECT COUNT(groupId) FROM creature_group_data WHERE groupId NOT IN (SELECT groupId FROM creature_groups)");

    if (result)
    {
        sLog.outDetail(">> %u Member without group found, member skipped.",result->Fetch()->GetInt32());
    }

    //Get groups
    QueryResult_AutoPtr result_data = WorldDatabase.Query("SELECT groupId, leaderGUID, groupType FROM creature_groups WHERE groupId IN (SELECT groupId FROM creature_group_data) ORDER BY groupId");

    if (!result_data)
    {
        barGoLink bar(1);
        bar.step();
        sLog.outString();
        sLog.outString(">> Loaded 0 creature groups. DB table `creature_groups` is empty.");
        return;
    }

    //Get member
    QueryResult_AutoPtr result_member = WorldDatabase.Query("SELECT groupId, memberGUID FROM creature_group_data WHERE groupId IN (SELECT groupId FROM creature_groups) ORDER BY groupId");

    if (!result_member)
    {
        barGoLink bar(1);
        bar.step();
        sLog.outString();
        sLog.outString(">> Loaded 0 creature groups. DB table `creature_group_data` is empty.");
        return;
    }

    //Loading groups...
    uint64 total_groups = result_data->GetRowCount();
    uint64 total_member = result_member->GetRowCount();

    barGoLink bar(total_groups+total_member);
    Field *fields;
    std::set<uint32> guidSet;

    GroupInfo *group_member;
    do
    {
        fields = result_data->Fetch();
        bar.step();
        
        //Load group member data
        uint32 groupId = fields[0].GetUInt32();
        uint32 leaderGUID = fields[1].GetUInt32();
        uint8  groupType = fields[2].GetUInt8(); 

        group_member                        = new GroupInfo;
        group_member->leaderGUID            = leaderGUID;
        group_member->groupType             = groupType;        

        // check data correctness
        if (guidSet.find(group_member->leaderGUID) == guidSet.end())
        {
            sLog.outErrorDb("creature_groups table leader guid %u incorrect (not exist)", group_member->leaderGUID);
            delete group_member;
            return;
        }

        CreatureGroupMap[groupId] = group_member;

        sLog.outDebug("CreatureGroup::LoadCreatureGroups: Load Group %u with Leader %u and groupType %u.", groupId, leaderGUID, groupType);

    }
    while (result_data->NextRow()) ;

    //Loading member...
    do
    {
        fields = result_member->Fetch();
        bar.step();
        
        //Load group member data
        uint32 groupId = fields[0].GetUInt32();
        uint32 memberGUID = fields[1].GetUInt32();

        // check data correctness
        if (guidSet.find(memberGUID) == guidSet.end())
        {
            sLog.outErrorDb("creature_group_data table member guid %u incorrect (not exist)", memberGUID);
            continue;
        }

        CreatureGroupDataMap[memberGUID] = groupId;

        sLog.outDebug("CreatureGroup::LoadCreatureGroups: Load Member %u for Group with groupId %u.", memberGUID, groupId);

    }
    while (result_member->NextRow()) ;

    sLog.outString();
    sLog.outString(">> Loaded " UI64FMTD " groups", total_groups);
    sLog.outString(">> Loaded " UI64FMTD " creatures in groups", total_member);
    sLog.outString();
}