void LfgGroup::SendProposalUpdate(uint8 state) { Player *plr; for(member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr) { plr = sObjectMgr.GetPlayer(citr->guid); if (!plr || !plr->GetSession() || (IsInDungeon() && plr->GetMapId() == GetDungeonInfo()->map)) continue; //Correct - 3.3.3a WorldPacket data(SMSG_LFG_PROPOSAL_UPDATE); data << uint32(GetDungeonInfo(IsFromRnd(citr->guid))->Entry()); data << uint8(state); data << uint32(GetId()); data << uint32(GetKilledBosses()); data << uint8(0); //silent uint8 membersCount = 0; for(member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr) { Player *plr2 = sObjectMgr.GetPlayer(citr->guid); if (plr2 && plr2->GetSession()) ++membersCount; } data << uint8(membersCount); for(member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr) { if (Player *plr2 = sObjectMgr.GetPlayer(citr->guid)) { uint8 roles = GetPlayerRole(plr2->GetGUID()); //Something got wrong if (roles < 2) { sLog.outError("LfgMgr: Wrong role for player %s in SMSG_LFG_PROPOSAL_UPDATE", plr2->GetName()); m_answers.insert(std::pair<uint64, uint8>(plr2->GetGUID(), 0)); } data << uint32(roles); data << uint8(plr == plr2); // if its you, this is true data << uint8(IsInDungeon()); // InDungeon data << uint8(premadePlayers.find(plr2->GetGUID()) != premadePlayers.end()); // Same group //If player agrees with dungeon, these two are 1 if (m_answers.find(plr2->GetGUID()) != m_answers.end()) { data << uint8(1); data << uint8(m_answers.find(plr2->GetGUID())->second); } else { data << uint8(0); //Answer data << uint8(0); //Accept } } } plr->GetSession()->SendPacket(&data); } }
uint32 LfgGroup::RemoveMember(const uint64 &guid, const uint8 &method) { member_witerator slot = _getMemberWSlot(guid); if (slot != m_memberSlots.end()) { m_memberSlots.erase(slot); UpdateItemLevelValues(); } sLfgMgr.LfgLog("Remove member %u , guid %u", GetId(), guid); if (Player *player = sObjectMgr.GetPlayer(guid)) { player->m_lookingForGroup.groups.erase(GetDungeonInfo(true)->ID); if (method == 1) { WorldPacket data(SMSG_GROUP_UNINVITE, 0); player->GetSession()->SendPacket( &data ); player->SetGroup(NULL); _removeRolls(guid); _homebindIfInstance(player); } if(IsInDungeon() && IsMixed()) player->m_lookingForGroup.SetMixedDungeon(0, false); } //Remove from any role if (m_tank == guid) m_tank = 0; else if (m_heal == guid) m_heal = 0; else if (dps.find(guid) != dps.end()) dps.erase(guid); CharacterDatabase.PExecute("DELETE FROM group_member WHERE memberGuid='%u'", GUID_LOPART(guid)); return 0; }
uint32 LfgGroup::GetKilledBosses() { if(!IsInDungeon()) return 0; for(member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr) { Player *member = sObjectMgr.GetPlayer(citr->guid); if (!member || !member->IsInWorld() || member->GetMapId() != GetDungeonInfo()->map) continue; InstanceSave *save = member->GetMap()->GetInstanceSave(); if(save) return save->GetEncounterMask(); } return 0; }
WEATHER_TYPE CSector::GetWeatherCalc() const { ADDTOCALLSTACK("CSector::GetWeatherCalc"); // There is no weather in dungeons (or when the Sphere.ini setting prevents weather) if ( IsInDungeon() || g_Cfg.m_fNoWeather ) return( WEATHER_DRY ); // Rain chance also controls the chance of snow. If it isn't possible to rain then it cannot snow either int iPercentRoll = Calc_GetRandVal( 100 ); if ( iPercentRoll < GetRainChance() ) { // It is precipitating... but is it rain or snow? if ( GetColdChance() && Calc_GetRandVal(100) <= GetColdChance()) // Should it actually snow here? return WEATHER_SNOW; return WEATHER_RAIN; } // It is not precipitating, but is it cloudy or dry? if ( ( iPercentRoll / 2) < GetRainChance() ) return WEATHER_CLOUDY; return( WEATHER_DRY ); }
BYTE CSector::GetLightCalc( bool fQuickSet ) const { ADDTOCALLSTACK("CSector::GetLightCalc"); // What is the light level default here in this sector. if ( g_Cfg.m_bAllowLightOverride && IsLightOverriden() ) return m_Env.m_Light; if ( IsInDungeon() ) return static_cast<unsigned char>(g_Cfg.m_iLightDungeon); int localtime = GetLocalTime(); if ( !g_Cfg.m_bAllowLightOverride ) { // Normalize time: // convert 0=midnight .. (23*60)+59=midnight // to 0=day .. 12*60=night if ( localtime < 12*60 ) localtime = 12*60 - localtime; else localtime -= 12*60; // 0... y ...lightnight // 0... x ...12*60 int iTargLight = ((localtime * ( g_Cfg.m_iLightNight - g_Cfg.m_iLightDay ))/(12*60) + g_Cfg.m_iLightDay); if ( iTargLight < LIGHT_BRIGHT ) iTargLight = LIGHT_BRIGHT; if ( iTargLight > LIGHT_DARK ) iTargLight = LIGHT_DARK; return static_cast<unsigned char>(iTargLight); } int hour = ( localtime / ( 60)) % 24; bool fNight = ( hour < 6 || hour > 12+8 ); // Is it night or day ? int iTargLight = (fNight) ? g_Cfg.m_iLightNight : g_Cfg.m_iLightDay; // Target light level. // Check for clouds...if it is cloudy, then we don't even need to check for the effects of the moons... if ( GetWeather()) { // Clouds of some sort... if (fNight) iTargLight += ( Calc_GetRandVal( 2 ) + 1 ); // 1-2 light levels darker if cloudy at night else iTargLight += ( Calc_GetRandVal( 4 ) + 1 ); // 1-4 light levels darker if cloudy during the day. } if ( fNight ) { // Factor in the effects of the moons // Trammel unsigned int iTrammelPhase = g_World.GetMoonPhase( false ); // Check to see if Trammel is up here... if ( IsMoonVisible( iTrammelPhase, localtime )) { static const BYTE sm_TrammelPhaseBrightness[] = { 0, // New Moon TRAMMEL_FULL_BRIGHTNESS / 4, // Crescent Moon TRAMMEL_FULL_BRIGHTNESS / 2, // Quarter Moon ( TRAMMEL_FULL_BRIGHTNESS * 3) / 4, // Gibbous Moon TRAMMEL_FULL_BRIGHTNESS, // Full Moon ( TRAMMEL_FULL_BRIGHTNESS * 3) / 4, // Gibbous Moon TRAMMEL_FULL_BRIGHTNESS / 2, // Quarter Moon TRAMMEL_FULL_BRIGHTNESS / 4 // Crescent Moon }; ASSERT( iTrammelPhase < COUNTOF(sm_TrammelPhaseBrightness)); iTargLight -= sm_TrammelPhaseBrightness[iTrammelPhase]; } // Felucca unsigned int iFeluccaPhase = g_World.GetMoonPhase( true ); if ( IsMoonVisible( iFeluccaPhase, localtime )) { static const BYTE sm_FeluccaPhaseBrightness[] = { 0, // New Moon FELUCCA_FULL_BRIGHTNESS / 4, // Crescent Moon FELUCCA_FULL_BRIGHTNESS / 2, // Quarter Moon ( FELUCCA_FULL_BRIGHTNESS * 3) / 4, // Gibbous Moon FELUCCA_FULL_BRIGHTNESS, // Full Moon ( FELUCCA_FULL_BRIGHTNESS * 3) / 4, // Gibbous Moon FELUCCA_FULL_BRIGHTNESS / 2, // Quarter Moon FELUCCA_FULL_BRIGHTNESS / 4 // Crescent Moon }; ASSERT( iFeluccaPhase < COUNTOF(sm_FeluccaPhaseBrightness)); iTargLight -= sm_FeluccaPhaseBrightness[iFeluccaPhase]; } } if ( iTargLight < LIGHT_BRIGHT ) iTargLight = LIGHT_BRIGHT; if ( iTargLight > LIGHT_DARK ) iTargLight = LIGHT_DARK; if ( fQuickSet || m_Env.m_Light == iTargLight ) // Initializing the sector return static_cast<unsigned char>(iTargLight); // Gradual transition to global light level. if ( m_Env.m_Light > iTargLight ) return( m_Env.m_Light - 1 ); else return( m_Env.m_Light + 1 ); }
void LfgGroup::SendRoleCheckUpdate(uint8 state) { if (state == LFG_ROLECHECK_INITIALITING) { m_lfgFlags |= LFG_GRP_ROLECHECK; ResetGroup(); if (IsInDungeon()) premadePlayers.clear(); m_roleCheck.Reset(); m_roleCheck.m_beforeCheck = GetMembersCount(); } Player *leader = sObjectMgr.GetPlayer(GetLeaderGUID()); if (!leader) return; WorldPacket data(SMSG_LFG_ROLE_CHECK_UPDATE, 6 + leader->m_lookingForGroup.queuedDungeons.size() * 4 + 1 + GetMembersCount() * 14); data << uint32(state); data << uint8(state == LFG_ROLECHECK_INITIALITING); // begining data << uint8(leader->m_lookingForGroup.queuedDungeons.size()); for (LfgDungeonList::const_iterator it = leader->m_lookingForGroup.queuedDungeons.begin(); it != leader->m_lookingForGroup.queuedDungeons.end(); ++it) data << uint32((*it)->Entry()); data << uint8(GetMembersCount()); //leader first data << uint64(GetLeaderGUID()); ProposalAnswersMap::iterator itr = m_roleCheck.m_rolesProposal.find(GetLeaderGUID()); if (itr != m_roleCheck.m_rolesProposal.end()) { data << uint8(1); //ready data << uint32(itr->second); //roles } else { data << uint8(0); //ready data << uint32(0); //roles } data << uint8(leader->getLevel()); for(member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr) { Player *member = sObjectMgr.GetPlayer(citr->guid); if (!member || !member->GetSession() || member->GetGUID() == GetLeaderGUID()) continue; itr = m_roleCheck.m_rolesProposal.find(citr->guid); data << uint64(member->GetGUID()); if(itr != m_roleCheck.m_rolesProposal.end()) { data << uint8(1); data << uint32(itr->second); }else data << uint8(0) << uint32(0); data << uint8(member->getLevel()); } for(member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr) { Player *plr = sObjectMgr.GetPlayer(citr->guid); if (!plr || !plr->GetSession()) continue; if(state == LFG_ROLECHECK_INITIALITING) plr->m_lookingForGroup.roles = 0; plr->GetSession()->SendPacket(&data); } }
void LfgGroup::UpdateRoleCheck(uint32 diff) { sLfgMgr.LfgLog("Updaterolecheck %u, diff %u", GetId(), diff); if (diff != 0) { m_readycheckTimer += diff; if (m_readycheckTimer >= LFG_TIMER_READY_CHECK && m_roleCheck.m_beforeCheck != m_roleCheck.m_rolesProposal.size()) { SendRoleCheckFail(LFG_ROLECHECK_MISSING_ROLE); return; } } //offline check bool offline = false; for(member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr) { Player *player = sObjectMgr.GetPlayer(citr->guid); if (!player) { offline = true; break; } } if (GetMembersCount() != m_roleCheck.m_beforeCheck || offline) { SendRoleCheckFail(LFG_ROLECHECK_ABORTED); return; } // add answers for(member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr) { Player *player = sObjectMgr.GetPlayer(citr->guid); if (m_roleCheck.m_rolesProposal.find(citr->guid) != m_roleCheck.m_rolesProposal.end() || !player || !player->GetSession() || player->m_lookingForGroup.roles == 0) continue; m_roleCheck.m_rolesProposal[player->GetGUID()] = player->m_lookingForGroup.roles; WorldPacket data(SMSG_LFG_ROLE_CHOSEN, 13); data << uint64(player->GetGUID()); data << uint8(1); data << uint32(player->m_lookingForGroup.roles); BroadcastPacket(&data, false); } //Offline members checked at join //Check roles if (m_roleCheck.m_beforeCheck > m_roleCheck.m_rolesProposal.size()) return; Player *leader = sObjectMgr.GetPlayer(GetLeaderGUID()); if(!leader || !leader->IsInWorld() || !m_roleCheck.TryRoles(this)) { SendRoleCheckFail(LFG_ROLECHECK_WRONG_ROLES); return; } SetAsRole(TANK, m_roleCheck.tank); SetAsRole(HEALER, m_roleCheck.heal); dps.clear(); dps = m_roleCheck.dps; //Move group to queue SendRoleCheckUpdate(LFG_ROLECHECK_FINISHED); for(member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr) { Player *player = sObjectMgr.GetPlayer(citr->guid); if (!player || !player->GetSession()) continue; if (player->GetGUID() == GetLeaderGUID()) sLfgMgr.SendJoinResult(player, LFG_JOIN_OK); else { //player->m_lookingForGroup.roles = GetPlayerRole(player->GetGUID()); player->m_lookingForGroup.comment = ""; player->m_lookingForGroup.joinTime = getMSTime(); player->m_lookingForGroup.queuedDungeons = leader->m_lookingForGroup.queuedDungeons; } if (IsInDungeon()) premadePlayers.insert(player->GetGUID()); } m_lfgFlags &= ~LFG_GRP_ROLECHECK; SendUpdate(); sLfgMgr.RemoveRoleCheckGroup(this); if(GetMembersCount() == LFG_GROUP) TeleportToDungeon(); else sLfgMgr.AddCheckedGroup(this, true); }
void LfgGroup::TeleportPlayer(Player *plr, DungeonInfo *dungeonInfo, uint32 originalDungeonId, bool newPlr) { if(newPlr) { plr->m_lookingForGroup.queuedDungeons.clear(); // must be before remove grom group if (Group *group = plr->GetGroup()) { if (!group->isLfgGroup()) { group->RemoveMember(plr->GetGUID(), 0); if (group->GetMembersCount() == 0) group->Disband(true); } plr->SetGroup(NULL); } plr->UnbindInstance(dungeonInfo->start_map, m_dungeonInfo->isHeroic() ? DUNGEON_DIFFICULTY_HEROIC : DUNGEON_DIFFICULTY_NORMAL); plr->ResetInstances(INSTANCE_RESET_GROUP_JOIN,false); plr->ResetInstances(INSTANCE_RESET_GROUP_JOIN,true); plr->ResetInstances(INSTANCE_RESET_ALL, true); plr->ResetInstances(INSTANCE_RESET_ALL, false); if (plr->getLevel() >= LEVELREQUIREMENT_HEROIC) { if (plr->GetDungeonDifficulty() != GetDungeonDifficulty()) plr->SetDungeonDifficulty(GetDungeonDifficulty()); if (plr->GetRaidDifficulty() != GetRaidDifficulty()) plr->SetRaidDifficulty(GetRaidDifficulty()); } plr->SetGroup(this, 0); plr->SetGroupInvite(NULL); uint32 taxi_start = 0; uint32 taxi_end = 0; uint32 mount_spell = 0; WorldLocation joinLoc; if (!plr->m_taxi.empty()) { taxi_start = plr->m_taxi.GetTaxiSource(); taxi_end = plr->m_taxi.GetTaxiDestination(); joinLoc = WorldLocation(plr->GetMapId(), plr->GetPositionX(), plr->GetPositionY(), plr->GetPositionZ(), plr->GetOrientation()); } else { // Mount spell id storing if (plr->IsMounted()) { Unit::AuraList const& auras = plr->GetAurasByType(SPELL_AURA_MOUNTED); if (!auras.empty()) mount_spell = (*auras.begin())->GetId(); } if(!mount_spell && plr->getClass() == CLASS_DRUID) { Unit::AuraList const& auras = plr->GetAurasByType(SPELL_AURA_MOD_SHAPESHIFT); if (!auras.empty()) mount_spell = (*auras.begin())->GetId(); } //Nearest graveyard if in dungeon if (plr->GetMap()->IsDungeon()) { if (const WorldSafeLocsEntry* entry = sObjectMgr.GetClosestGraveYard(plr->GetPositionX(), plr->GetPositionY(), plr->GetPositionZ(), plr->GetMapId(), plr->GetTeam())) joinLoc = WorldLocation(entry->map_id, entry->x, entry->y, entry->z, 0.f); else joinLoc = plr->GetLocation(); } else joinLoc = plr->GetLocation(); } CharacterDatabase.PExecute("DELETE FROM group_member WHERE memberGuid='%u'", GUID_LOPART(plr->GetGUID())); CharacterDatabase.PExecute("INSERT INTO group_member(groupId,memberGuid,assistant,subgroup,lfg_join_x,lfg_join_y,lfg_join_z,lfg_join_o,lfg_join_map,taxi_start,taxi_end,mount_spell) " "VALUES('%u','%u','%u','%u','%f','%f','%f','%f','%u','%u','%u','%u')", m_Id, GUID_LOPART(plr->GetGUID()), 0, 1, joinLoc.x(), joinLoc.y(), joinLoc.z(), joinLoc.orientation, joinLoc.mapid, taxi_start, taxi_end, mount_spell); //Set info to player plr->m_lookingForGroup.joinLoc = joinLoc; plr->m_lookingForGroup.taxi_start = taxi_start; plr->m_lookingForGroup.taxi_end = taxi_end; plr->m_lookingForGroup.mount_spell = mount_spell; plr->m_lookingForGroup.roles = GetPlayerRole(plr->GetGUID()); if (IsRandom()) plr->CastSpell(plr, LFG_RANDOM_COOLDOWN, true); } // resurrect the player if (!plr->isAlive()) { plr->ResurrectPlayer(1.0f); plr->SpawnCorpseBones(); } // stop taxi flight at port if (plr->isInFlight()) { plr->GetMotionMaster()->MovementExpired(false); plr->GetMotionMaster()->Clear(false, true); plr->GetMotionMaster()->MoveIdle(); plr->m_taxi.ClearTaxiDestinations(); } plr->ScheduleDelayedOperation(DELAYED_LFG_ENTER_DUNGEON); plr->ScheduleDelayedOperation(DELAYED_SAVE_PLAYER); plr->ScheduleDelayedOperation(DELAYED_LFG_CLEAR_LOCKS); if(IsMixed()) { plr->m_lookingForGroup.SetMixedDungeon(dungeonInfo->start_map); if(newPlr) plr->setFaction(sWorld.getConfig(CONFIG_UINT32_TEAM_BG_FACTION_BLUE)); } if (IsInDungeon()) { if(newPlr) { for (GroupReference *itr = GetFirstMember(); itr != NULL; itr = itr->next()) { Player *player = itr->getSource(); if (!player || player->GetMapId() != GetDungeonInfo()->map) continue; plr->TeleportTo(player->GetLocation()); return; } } plr->TeleportTo(dungeonInfo->start_map, dungeonInfo->start_x, dungeonInfo->start_y, dungeonInfo->start_z, dungeonInfo->start_o); return; } //Must re-add player to reset id... Map *map = plr->GetMap(); if(map->GetId() == dungeonInfo->start_map) { map->Remove(plr, false); map->Add(plr); } plr->TeleportTo(dungeonInfo->start_map, dungeonInfo->start_x, dungeonInfo->start_y, dungeonInfo->start_z, dungeonInfo->start_o); }
void LfgGroup::TeleportToDungeon() { if (IsInDungeon()) { for(member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr) { Player *plr = sObjectMgr.GetPlayer(citr->guid); if (!plr || !plr->GetSession()) continue; plr->m_lookingForGroup.queuedDungeons.clear(); if (plr->GetMapId() == m_dungeonInfo->map) { sLfgMgr.SendLfgUpdatePlayer(plr, LFG_UPDATETYPE_REMOVED_FROM_QUEUE); sLfgMgr.SendLfgUpdateParty(plr, LFG_UPDATETYPE_REMOVED_FROM_QUEUE); continue; } DungeonInfo* dungeonInfo = sLfgMgr.GetDungeonInfo(m_dungeonInfo->ID); plr->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_USE_LFD_TO_GROUP_WITH_PLAYERS, GetMembersCount()-1); TeleportPlayer(plr, dungeonInfo, m_dungeonInfo->ID); } return; } //If random, then select here if (m_dungeonInfo->type == LFG_TYPE_RANDOM && !SelectRandomDungeon()) return; DungeonInfo* dungeonInfo = sLfgMgr.GetDungeonInfo(m_dungeonInfo->ID); //Set Leader m_leaderGuid = 0; for(member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr) { Player *plr = sObjectMgr.GetPlayer(citr->guid); if (!plr || !plr->GetSession()) continue; if (IsPremade() && plr->GetGroup()) { plr->GetGroup()->UnbindInstance(dungeonInfo->start_map, m_dungeonInfo->isHeroic() ? DUNGEON_DIFFICULTY_HEROIC : DUNGEON_DIFFICULTY_NORMAL); m_leaderGuid = plr->GetGroup()->GetLeaderGUID(); m_leaderName = plr->GetGroup()->GetLeaderName(); break; } else if (plr->m_lookingForGroup.roles & LEADER) { m_leaderGuid = plr->GetGUID(); m_leaderName = plr->GetName(); break; } } if (m_leaderGuid == 0) { m_leaderGuid = m_memberSlots.begin()->guid; m_leaderName = m_memberSlots.begin()->name; } m_lootMethod = GROUP_LOOT; m_lootThreshold = ITEM_QUALITY_UNCOMMON; m_looterGuid = m_leaderGuid; m_dungeonDifficulty = m_dungeonInfo->isHeroic() ? DUNGEON_DIFFICULTY_HEROIC : DUNGEON_DIFFICULTY_NORMAL; m_raidDifficulty = RAID_DIFFICULTY_10MAN_NORMAL; //sort group members... UnbindInstance(dungeonInfo->start_map, m_dungeonInfo->isHeroic() ? DUNGEON_DIFFICULTY_HEROIC : DUNGEON_DIFFICULTY_NORMAL); CharacterDatabase.PExecute("DELETE FROM group_member WHERE groupId ='%u'", m_Id); ResetInstances(INSTANCE_RESET_ALL, true, NULL); ResetInstances(INSTANCE_RESET_GROUP_DISBAND, true, NULL); for(member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr) { Player *plr = sObjectMgr.GetPlayer(citr->guid); if (!plr || !plr->GetSession()) continue; plr->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_USE_LFD_TO_GROUP_WITH_PLAYERS, GetMembersCount()-1); TeleportPlayer(plr, dungeonInfo, GetDungeonInfo(true)->ID); } m_lfgFlags |= LFG_GRP_IN_DUNGEON; //Save to DB CharacterDatabase.PExecute("DELETE FROM groups WHERE groupId ='%u' OR leaderGuid='%u'", m_Id, GUID_LOPART(m_leaderGuid)); CharacterDatabase.PExecute("INSERT INTO groups (groupId,leaderGuid,mainTank,mainAssistant,lootMethod,looterGuid,lootThreshold,icon1,icon2,icon3,icon4,icon5,icon6,icon7,icon8,groupType,difficulty,raiddifficulty,healGuid,LfgId,LfgRandomEntry,LfgInstanceStatus,LfgFlags) " "VALUES ('%u','%u','%u','%u','%u','%u','%u','" UI64FMTD "','" UI64FMTD "','" UI64FMTD "','" UI64FMTD "','" UI64FMTD "','" UI64FMTD "','" UI64FMTD "','" UI64FMTD "','%u','%u','%u','%u','%u','%u','%u','%u')", m_Id, GUID_LOPART(m_leaderGuid), GUID_LOPART(m_tank), GUID_LOPART(m_mainAssistant), uint32(m_lootMethod), GUID_LOPART(m_looterGuid), uint32(m_lootThreshold), m_targetIcons[0], m_targetIcons[1], m_targetIcons[2], m_targetIcons[3], m_targetIcons[4], m_targetIcons[5], m_targetIcons[6], m_targetIcons[7], uint8(m_groupType), uint32(m_dungeonDifficulty), uint32(m_raidDifficulty), GUID_LOPART(m_heal), m_dungeonInfo->ID, GetDungeonInfo(true)->ID, m_instanceStatus, uint8(m_lfgFlags)); }