Show
Ignore:
Timestamp:
11/19/08 13:39:06 (17 years ago)
Author:
yumileroy
Message:

[svn] * Added npc follow, waterwalk, repairitems commands. Patch by dythzer
* Prevent adding more than 5 people to raid - Apoc
* fixed typo from one of our previous commits.
* Fixed two strings in core, thanx to warhead for patch.

Original author: KingPin?
Date: 2008-10-29 17:09:32-05:00

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/src/game/Group.cpp

    r111 r132  
    4545    m_looterGuid        = 0; 
    4646    m_lootThreshold     = ITEM_QUALITY_UNCOMMON; 
     47        m_subGroupsCounts   = NULL; 
    4748 
    4849    for(int i=0; i<TARGETICONCOUNT; i++) 
     
    7475        for(BoundInstancesMap::iterator itr = m_boundInstances[i].begin(); itr != m_boundInstances[i].end(); ++itr) 
    7576            itr->second.save->RemoveGroup(this); 
     77        if (m_subGroupsCounts) 
     78                delete[] m_subGroupsCounts; 
    7679} 
    7780 
     
    8285 
    8386    m_groupType  = isBGGroup() ? GROUPTYPE_RAID : GROUPTYPE_NORMAL; 
     87         
     88        if (m_groupType == GROUPTYPE_RAID) 
     89                _initRaidSubGroupsCounter(); 
     90                 
    8491    m_lootMethod = GROUP_LOOT; 
    8592    m_lootThreshold = ITEM_QUALITY_UNCOMMON; 
     
    137144 
    138145    m_groupType  = (*result)[13].GetBool() ? GROUPTYPE_RAID : GROUPTYPE_NORMAL; 
     146         
     147        if (m_groupType == GROUPTYPE_RAID) 
     148                _initRaidSubGroupsCounter(); 
     149                 
    139150    m_difficulty = (*result)[14].GetUInt8(); 
    140151    m_mainTank = (*result)[0].GetUInt64(); 
     
    179190    member.assistant = assistant; 
    180191    m_memberSlots.push_back(member); 
     192         
     193        SubGroupCounterIncrease(subgroup); 
     194         
    181195    return true; 
     196} 
     197 
     198void Group::ConvertToRaid() 
     199{ 
     200        m_groupType = GROUPTYPE_RAID; 
     201         
     202        _initRaidSubGroupsCounter(); 
     203         
     204        if(!isBGGroup()) CharacterDatabase.PExecute("UPDATE groups SET isRaid = 1 WHERE leaderGuid='%u'", GUID_LOPART(m_leaderGuid)); 
     205        SendUpdate(); 
    182206} 
    183207 
     
    387411} 
    388412 
    389 void Group::SendLootRoll(uint64 SourceGuid, uint64 TargetGuid, uint8 RollNumber, uint8 RollType, const Roll &r) 
     413void Group::SendLootRoll(const uint64& SourceGuid, const uint64& TargetGuid, uint8 RollNumber, uint8 RollType, const Roll &r) 
    390414{ 
    391415    WorldPacket data(SMSG_LOOT_ROLL, (8+4+8+4+4+4+1+1)); 
     
    411435} 
    412436 
    413 void Group::SendLootRollWon(uint64 SourceGuid, uint64 TargetGuid, uint8 RollNumber, uint8 RollType, const Roll &r) 
     437void Group::SendLootRollWon(const uint64& SourceGuid, const uint64& TargetGuid, uint8 RollNumber, uint8 RollType, const Roll &r) 
    414438{ 
    415439    WorldPacket data(SMSG_LOOT_ROLL_WON, (8+4+4+4+4+8+1+1)); 
     
    454478} 
    455479 
    456 void Group::GroupLoot(uint64 playerGUID, Loot *loot, Creature *creature) 
     480void Group::GroupLoot(const uint64& playerGUID, Loot *loot, Creature *creature) 
    457481{ 
    458482    std::vector<LootItem>::iterator i; 
     
    510534} 
    511535 
    512 void Group::NeedBeforeGreed(uint64 playerGUID, Loot *loot, Creature *creature) 
     536void Group::NeedBeforeGreed(const uint64& playerGUID, Loot *loot, Creature *creature) 
    513537{ 
    514538    ItemPrototype const *item; 
     
    564588} 
    565589 
    566 void Group::MasterLoot(uint64 playerGUID, Loot* /*loot*/, Creature *creature) 
     590void Group::MasterLoot(const uint64& playerGUID, Loot* /*loot*/, Creature *creature) 
    567591{ 
    568592    Player *player = objmgr.GetPlayer(playerGUID); 
     
    600624} 
    601625 
    602 void Group::CountRollVote(uint64 playerGUID, uint64 Guid, uint32 NumberOfPlayers, uint8 Choise) 
     626void Group::CountRollVote(const uint64& playerGUID, const uint64& Guid, uint32 NumberOfPlayers, uint8 Choise) 
    603627{ 
    604628    Rolls::iterator rollI = GetRoll(Guid); 
     
    936960    // get first not-full group 
    937961    uint8 groupid = 0; 
    938     std::vector<uint8> temp(MAXRAIDSIZE/MAXGROUPSIZE); 
    939     for(member_citerator itr = m_memberSlots.begin(); itr != m_memberSlots.end(); ++itr) 
    940     { 
    941         if (itr->group >= temp.size()) continue; 
    942         ++temp[itr->group]; 
    943         if(temp[groupid] >= MAXGROUPSIZE) 
    944             ++groupid; 
     962    if (m_subGroupsCounts) 
     963    { 
     964        bool groupFound = false; 
     965                for (; groupid < MAXRAIDSIZE/MAXGROUPSIZE; ++groupid) 
     966                { 
     967                        if (m_subGroupsCounts[groupid] < MAXGROUPSIZE) 
     968                        { 
     969                                groupFound = true; 
     970                                break; 
     971                        } 
     972                } 
     973                // We are raid group and no one slot is free 
     974                if (!groupFound) 
     975                                return false; 
    945976    } 
    946977 
     
    964995    member.assistant = isAssistant; 
    965996    m_memberSlots.push_back(member); 
     997         
     998        SubGroupCounterIncrease(group); 
    966999 
    9671000    if(player) 
     
    10021035    member_witerator slot = _getMemberWSlot(guid); 
    10031036    if (slot != m_memberSlots.end()) 
     1037        { 
     1038                SubGroupCounterDecrease(slot->group); 
    10041039        m_memberSlots.erase(slot); 
     1040        } 
    10051041 
    10061042    if(!isBGGroup()) 
     
    10951131} 
    10961132 
    1097 void Group::_convertToRaid() 
    1098 { 
    1099     m_groupType = GROUPTYPE_RAID; 
    1100  
    1101     if(!isBGGroup()) CharacterDatabase.PExecute("UPDATE groups SET isRaid = 1 WHERE leaderGuid='%u'", GUID_LOPART(m_leaderGuid)); 
    1102 } 
    1103  
    11041133bool Group::_setMembersGroup(const uint64 &guid, const uint8 &group) 
    11051134{ 
     
    11091138 
    11101139    slot->group = group; 
     1140         
     1141        SubGroupCounterIncrease(group); 
     1142         
    11111143    if(!isBGGroup()) CharacterDatabase.PExecute("UPDATE group_member SET subgroup='%u' WHERE memberGuid='%u'", group, GUID_LOPART(guid)); 
     1144         
    11121145    return true; 
    11131146} 
     
    11651198    if (!player) 
    11661199    { 
     1200                uint8 prevSubGroup; 
     1201                prevSubGroup = GetMemberGroup(guid); 
     1202                 
     1203                SubGroupCounterDecrease(prevSubGroup); 
     1204                 
    11671205        if(_setMembersGroup(guid, group)) 
    11681206            SendUpdate(); 
    11691207    } 
    1170     else ChangeMembersGroup(player, group); 
     1208    else 
     1209                ChangeMembersGroup(player, group); 
    11711210} 
    11721211 
     
    11781217    if(_setMembersGroup(player->GetGUID(), group)) 
    11791218    { 
     1219                uint8 prevSubGroup; 
     1220                prevSubGroup = player->GetSubGroup(); 
     1221                 
     1222                SubGroupCounterDecrease(prevSubGroup); 
     1223                 
    11801224        player->GetGroupRef().setSubGroup(group); 
    11811225        SendUpdate();