diff options
Diffstat (limited to 'src/game/GroupHandler.cpp')
| -rw-r--r-- | src/game/GroupHandler.cpp | 125 | 
1 files changed, 63 insertions, 62 deletions
diff --git a/src/game/GroupHandler.cpp b/src/game/GroupHandler.cpp index f63505ae24a..cd7004f5a07 100644 --- a/src/game/GroupHandler.cpp +++ b/src/game/GroupHandler.cpp @@ -28,10 +28,11 @@  #include "ObjectMgr.h"  #include "Player.h"  #include "Group.h" -#include "ObjectAccessor.h" -#include "MapManager.h"  #include "SocialMgr.h"  #include "Util.h" +#include "SpellAuras.h" + +class Aura;  /* differeces from off:      -you can uninvite yourself - is is useful @@ -59,12 +60,6 @@ void WorldSession::HandleGroupInviteOpcode( WorldPacket & recv_data )      std::string membername;      recv_data >> membername; -    if(_player->InBattleGround()) -    { -        SendPartyResult(PARTY_OP_INVITE, membername, PARTY_RESULT_INVITE_RESTRICTED); -        return; -    } -      // attempt add selected player      // cheating @@ -83,6 +78,12 @@ void WorldSession::HandleGroupInviteOpcode( WorldPacket & recv_data )          return;      } +    // restrict invite to GMs +    if (!sWorld.getConfig(CONFIG_ALLOW_GM_GROUP) && !GetPlayer()->isGameMaster() && player->isGameMaster()) +    { +        SendPartyResult(PARTY_OP_INVITE, membername, PARTY_RESULT_CANT_FIND_TARGET); +        return; +    }      // can't group with      if(!sWorld.getConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP) && GetPlayer()->GetTeam() != player->GetTeam())      { @@ -107,15 +108,20 @@ void WorldSession::HandleGroupInviteOpcode( WorldPacket & recv_data )          return;      } +    Group *group = GetPlayer()->GetGroup(); +    if( group && group->isBGGroup() ) +        group = GetPlayer()->GetOriginalGroup(); + +    Group *group2 = player->GetGroup(); +    if( group2 && group2->isBGGroup() ) +        group2 = player->GetOriginalGroup();      // player already in another group or invited -    if(player->GetGroup() || player->GetGroupInvite() ) +    if( group2 || player->GetGroupInvite() )      {          SendPartyResult(PARTY_OP_INVITE, membername, PARTY_RESULT_ALREADY_IN_GROUP);          return;      } -    Group *group = GetPlayer()->GetGroup(); -      if(group)      {          // not have permissions for invite @@ -161,6 +167,7 @@ void WorldSession::HandleGroupInviteOpcode( WorldPacket & recv_data )      // ok, we do it      WorldPacket data(SMSG_GROUP_INVITE, 10);                // guess size +    data << uint8(1);                                       // ok      data << GetPlayer()->GetName();      player->GetSession()->SendPacket(&data); @@ -193,12 +200,6 @@ void WorldSession::HandleGroupAcceptOpcode( WorldPacket & /*recv_data*/ )      Player* leader = objmgr.GetPlayer(group->GetLeaderGUID()); -    if(leader && leader->InBattleGround()) -    { -        SendPartyResult(PARTY_OP_INVITE, "", PARTY_RESULT_INVITE_RESTRICTED); -        return; -    } -      // forming a new group, create it      if(!group->IsCreated())      { @@ -208,14 +209,10 @@ void WorldSession::HandleGroupAcceptOpcode( WorldPacket & /*recv_data*/ )          objmgr.AddGroup(group);      } -    // everything's fine, do it +    // everything's fine, do it, PLAYER'S GROUP IS SET IN ADDMEMBER!!!      if(!group->AddMember(GetPlayer()->GetGUID(), GetPlayer()->GetName()))          return; -    uint8 subgroup = group->GetMemberGroup(GetPlayer()->GetGUID()); - -    GetPlayer()->SetGroup(group, subgroup); -      group->BroadcastGroupUpdate();  } @@ -224,26 +221,16 @@ void WorldSession::HandleGroupDeclineOpcode( WorldPacket & /*recv_data*/ )      Group  *group  = GetPlayer()->GetGroupInvite();      if (!group) return; +    // remember leader if online      Player *leader = objmgr.GetPlayer(group->GetLeaderGUID()); -    /** error handling **/ +    // uninvite, group can be deleted +    GetPlayer()->UninviteFromGroup(); +      if(!leader || !leader->GetSession())          return; -    /********************/ - -    // everything's fine, do it -    if(!group->IsCreated()) -    { -        // note: this means that if you invite more than one person -        // and one of them declines before the first one accepts -        // all invites will be cleared -        // fixme: is that ok ? -        group->RemoveAllInvites(); -        delete group; -    } - -    GetPlayer()->SetGroupInvite(NULL); +    // report      WorldPacket data( SMSG_GROUP_DECLINE, 10 );             // guess size      data << GetPlayer()->GetName();      leader->GetSession()->SendPacket( &data ); @@ -445,7 +432,7 @@ void WorldSession::HandleMinimapPingOpcode(WorldPacket& recv_data)      data << GetPlayer()->GetGUID();      data << x;      data << y; -    GetPlayer()->GetGroup()->BroadcastPacket(&data, -1, GetPlayer()->GetGUID()); +    GetPlayer()->GetGroup()->BroadcastPacket(&data, true, -1, GetPlayer()->GetGUID());  }  void WorldSession::HandleRandomRollOpcode(WorldPacket& recv_data) @@ -472,7 +459,7 @@ void WorldSession::HandleRandomRollOpcode(WorldPacket& recv_data)      data << roll;      data << GetPlayer()->GetGUID();      if(GetPlayer()->GetGroup()) -        GetPlayer()->GetGroup()->BroadcastPacket(&data); +        GetPlayer()->GetGroup()->BroadcastPacket(&data, false);      else          SendPacket(&data);  } @@ -555,8 +542,20 @@ void WorldSession::HandleGroupChangeSubGroupOpcode( WorldPacket & recv_data )          return;      /********************/ +    Player *movedPlayer=objmgr.GetPlayer(name.c_str()); +    if(!movedPlayer) +        return; + +    //Do not allow leader to change group of player in combat +    if (movedPlayer->isInCombat()) +    { +        WorldPacket data(SMSG_GROUP_SWAP_FAILED, (0)); +        SendPacket(&data); +        return; +    } +      // everything's fine, do it -    group->ChangeMembersGroup(objmgr.GetPlayer(name.c_str()), groupNr); +    group->ChangeMembersGroup(movedPlayer, groupNr);  }  void WorldSession::HandleGroupAssistantOpcode( WorldPacket & recv_data ) @@ -626,7 +625,7 @@ void WorldSession::HandleRaidReadyCheckOpcode( WorldPacket & recv_data )          // everything's fine, do it          WorldPacket data(MSG_RAID_READY_CHECK, 8);          data << GetPlayer()->GetGUID(); -        group->BroadcastPacket(&data, -1); +        group->BroadcastPacket(&data, false, -1);          group->OfflineReadyCheck();      } @@ -691,10 +690,10 @@ void WorldSession::BuildPartyMemberStatsChangedPacket(Player *player, WorldPacke      }      if (mask & GROUP_UPDATE_FLAG_CUR_HP) -        *data << (uint16) player->GetHealth(); +        *data << (uint32) player->GetHealth();      if (mask & GROUP_UPDATE_FLAG_MAX_HP) -        *data << (uint16) player->GetMaxHealth(); +        *data << (uint32) player->GetMaxHealth();      Powers powerType = player->getPowerType();      if (mask & GROUP_UPDATE_FLAG_POWER_TYPE) @@ -717,14 +716,14 @@ void WorldSession::BuildPartyMemberStatsChangedPacket(Player *player, WorldPacke      if (mask & GROUP_UPDATE_FLAG_AURAS)      { -        uint64 auramask = player->GetAuraUpdateMask(); +        const uint64& auramask = player->GetAuraUpdateMaskForRaid();          *data << uint64(auramask);          for(uint32 i = 0; i < MAX_AURAS; ++i)          {              if(auramask & (uint64(1) << i))              { -                uint32 updatedAura=player->GetUInt32Value(uint16(UNIT_FIELD_AURA + i)); -                *data << uint16(updatedAura); +                Aura * pAura = player->GetVisibleAura(i); +                *data << uint32(pAura ? pAura->GetId() : 0);                  *data << uint8(1);              }          } @@ -758,17 +757,17 @@ void WorldSession::BuildPartyMemberStatsChangedPacket(Player *player, WorldPacke      if (mask & GROUP_UPDATE_FLAG_PET_CUR_HP)      {          if(pet) -            *data << (uint16) pet->GetHealth(); +            *data << (uint32) pet->GetHealth();          else -            *data << (uint16) 0; +            *data << (uint32) 0;      }      if (mask & GROUP_UPDATE_FLAG_PET_MAX_HP)      {          if(pet) -            *data << (uint16) pet->GetMaxHealth(); +            *data << (uint32) pet->GetMaxHealth();          else -            *data << (uint16) 0; +            *data << (uint32) 0;      }      if (mask & GROUP_UPDATE_FLAG_PET_POWER_TYPE) @@ -799,14 +798,14 @@ void WorldSession::BuildPartyMemberStatsChangedPacket(Player *player, WorldPacke      {          if(pet)          { -            uint64 auramask = pet->GetAuraUpdateMask(); +            const uint64& auramask = pet->GetAuraUpdateMaskForRaid();              *data << uint64(auramask);              for(uint32 i = 0; i < MAX_AURAS; ++i)              {                  if(auramask & (uint64(1) << i))                  { -                    uint32 updatedAura=pet->GetUInt32Value(uint16(UNIT_FIELD_AURA + i)); -                    *data << uint16(updatedAura); +                    Aura * pAura = pet->GetVisibleAura(i); +                    *data << uint32(pAura ? pAura->GetId() : 0);                      *data << uint8(1);                  }              } @@ -829,6 +828,7 @@ void WorldSession::HandleRequestPartyMemberStatsOpcode( WorldPacket &recv_data )      if(!player)      {          WorldPacket data(SMSG_PARTY_MEMBER_STATS_FULL, 3+4+2); +        data << uint8(0);                                   // only for SMSG_PARTY_MEMBER_STATS_FULL, probably arena/bg related          data.appendPackGUID(Guid);          data << (uint32) GROUP_UPDATE_FLAG_STATUS;          data << (uint16) MEMBER_STATUS_OFFLINE; @@ -839,6 +839,7 @@ void WorldSession::HandleRequestPartyMemberStatsOpcode( WorldPacket &recv_data )      Pet *pet = player->GetPet();      WorldPacket data(SMSG_PARTY_MEMBER_STATS_FULL, 4+2+2+2+1+2*6+8+1+8); +    data << uint8(0);                                       // only for SMSG_PARTY_MEMBER_STATS_FULL, probably arena/bg related      data.append(player->GetPackGUID());      uint32 mask1 = 0x00040BFF;                              // common mask, real flags used 0x000040BFF @@ -848,8 +849,8 @@ void WorldSession::HandleRequestPartyMemberStatsOpcode( WorldPacket &recv_data )      Powers powerType = player->getPowerType();      data << (uint32) mask1;                                 // group update mask      data << (uint16) MEMBER_STATUS_ONLINE;                  // member's online status -    data << (uint16) player->GetHealth();                   // GROUP_UPDATE_FLAG_CUR_HP -    data << (uint16) player->GetMaxHealth();                // GROUP_UPDATE_FLAG_MAX_HP +    data << (uint32) player->GetHealth();                   // GROUP_UPDATE_FLAG_CUR_HP +    data << (uint32) player->GetMaxHealth();                // GROUP_UPDATE_FLAG_MAX_HP      data << (uint8)  powerType;                             // GROUP_UPDATE_FLAG_POWER_TYPE      data << (uint16) player->GetPower(powerType);           // GROUP_UPDATE_FLAG_CUR_POWER      data << (uint16) player->GetMaxPower(powerType);        // GROUP_UPDATE_FLAG_MAX_POWER @@ -863,11 +864,11 @@ void WorldSession::HandleRequestPartyMemberStatsOpcode( WorldPacket &recv_data )      data << (uint64) auramask;                              // placeholder      for(uint8 i = 0; i < MAX_AURAS; ++i)      { -        if(uint32 aura = player->GetUInt32Value(UNIT_FIELD_AURA + i)) +        if(Aura * pAura = player->GetVisibleAura(i))          {              auramask |= (uint64(1) << i); -            data << uint16(aura); -            data << uint8(1); +            data << (uint32) pAura->GetId(); +            data << (uint8)  1;          }      }      data.put<uint64>(maskPos,auramask);                     // GROUP_UPDATE_FLAG_AURAS @@ -878,8 +879,8 @@ void WorldSession::HandleRequestPartyMemberStatsOpcode( WorldPacket &recv_data )          data << (uint64) pet->GetGUID();                    // GROUP_UPDATE_FLAG_PET_GUID          data << pet->GetName();                             // GROUP_UPDATE_FLAG_PET_NAME          data << (uint16) pet->GetDisplayId();               // GROUP_UPDATE_FLAG_PET_MODEL_ID -        data << (uint16) pet->GetHealth();                  // GROUP_UPDATE_FLAG_PET_CUR_HP -        data << (uint16) pet->GetMaxHealth();               // GROUP_UPDATE_FLAG_PET_MAX_HP +        data << (uint32) pet->GetHealth();                  // GROUP_UPDATE_FLAG_PET_CUR_HP +        data << (uint32) pet->GetMaxHealth();               // GROUP_UPDATE_FLAG_PET_MAX_HP          data << (uint8)  petpowertype;                      // GROUP_UPDATE_FLAG_PET_POWER_TYPE          data << (uint16) pet->GetPower(petpowertype);       // GROUP_UPDATE_FLAG_PET_CUR_POWER          data << (uint16) pet->GetMaxPower(petpowertype);    // GROUP_UPDATE_FLAG_PET_MAX_POWER @@ -889,10 +890,10 @@ void WorldSession::HandleRequestPartyMemberStatsOpcode( WorldPacket &recv_data )          data << (uint64) petauramask;                       // placeholder          for(uint8 i = 0; i < MAX_AURAS; ++i)          { -            if(uint32 petaura = pet->GetUInt32Value(UNIT_FIELD_AURA + i)) +            if(Aura * pAura = pet->GetVisibleAura(i))              {                  petauramask |= (uint64(1) << i); -                data << (uint16) petaura; +                data << (uint32) pAura->GetId();                  data << (uint8)  1;              }          }  | 
