35 : m_services(nullptr),
61 sLog.Blue(
" FleetService",
"Fleet Service Initialized.");
67 if (pClient ==
nullptr)
83 fData.
name +=
"'s Fleet";
84 fData.
motd =
"default motd";
93 wData.
name =
"Wing 1";
107 sData.
name =
"Squad 1";
132 sLog.Cyan(
"CreateFleet",
"bData -- leader: %i, armored: %i, info: %i, siege: %i, skirmish: %i, mining: %i", \
135 if (
sConfig.chat.EnableFleetChat)
137 if (
sConfig.chat.EnableWingChat)
139 if (
sConfig.chat.EnableSquadChat)
158 wData.
name =
"Wing ";
159 wData.
name += std::to_string(count + 1);
165 _log(FLEET__INFO,
"FleetService::CreateWing() - fleetID: %u, wingID: %u", fleetID,
m_wingID);
171 if (
sConfig.chat.EnableWingChat)
196 sData.
name =
"Squad ";
206 _log(FLEET__INFO,
"FleetService::CreateSquad() - fleetID: %u, wingID: %u, squadID: %u", fleetID, wingID,
m_squadID);
213 if (
sConfig.chat.EnableSquadChat)
218 wing.emplace(wing.end(), wingID);
229 std::map<uint32, FleetAdvert>::iterator itr =
m_fleetAdvertMap.find(fleetID);
232 _log(FLEET__INFO,
"CreateFleetAdvert() Updating Advert for FleetID: %u, Scope: %u", fleetID, data.
inviteScope);
234 _log(FLEET__INFO,
"CreateFleetAdvert() Creating Advert for FleetID: %u, Scope: %u", fleetID, data.
inviteScope);
238 std::map<uint32, FleetData>::iterator fItr =
m_fleetDataMap.find(fleetID);
240 UpdateOptions(fleetID, fItr->second.isFreeMove,
true, fItr->second.isVoiceEnabled);
248 if (pChar ==
nullptr)
251 _log(FLEET__TRACE,
"AddMember - CharID: %u, FleetID: %u, WingID: %i, Squad: %i, Job: %s, Role: %s, Booster: %s", \
276 std::map<uint32, FleetData>::iterator fItr =
m_fleetDataMap.find(fleetID);
278 _log(FLEET__ERROR,
"Fleet Data for fleetID: %u not foune.", fleetID);
281 if (fItr->second.booster ==
nullptr) {
282 fItr->second.booster = pClient;
285 if (fItr->second.leader ==
nullptr) {
286 fItr->second.leader = pClient;
289 _log(FLEET__ERROR,
"FC is already filled.");
303 std::map<uint32, WingData>::iterator itr =
m_wingDataMap.find(wingID);
305 _log(FLEET__ERROR,
"Wing Data for wingID: %u not foune.", wingID);
309 if (itr->second.booster ==
nullptr) {
310 itr->second.booster = pClient;
311 wing.emplace(wing.end(), wingID);
313 if (itr->second.leader ==
nullptr) {
314 itr->second.leader = pClient;
316 _log(FLEET__ERROR,
"WC is already filled.");
326 wing.emplace(wing.end(), wingID);
330 std::map<uint32, SquadData>::iterator itr =
m_squadDataMap.find(squadID);
332 _log(FLEET__ERROR,
"Squad Data for squadID: %u not foune.", squadID);
336 if (itr->second.booster ==
nullptr) {
337 itr->second.booster = pClient;
338 squad.emplace(squad.end(), squadID);
340 if (itr->second.leader ==
nullptr) {
341 itr->second.leader = pClient;
343 _log(FLEET__ERROR,
"SC is already filled.");
347 itr->second.members.emplace(pChar->
itemID(), pClient);
353 squad.emplace(squad.end(), squadID);
366 join.squadID = pChar->
squadID();
369 join.wingID = pChar->
wingID();
372 res->
SetItem(0, join.Encode());
385 int8 oldRole(0), oldJob(0), oldBooster(0);
386 int32 oldWingID(0), oldSquadID(0);
389 if (pClient ==
nullptr)
392 if (pChar ==
nullptr)
397 oldWingID = pChar->
wingID();
402 if (oldBooster != newBooster) {
404 std::map<uint32, FleetData>::iterator fItr =
m_fleetDataMap.find(fleetID);
407 fItr->second.booster =
nullptr;
412 std::map<uint32, FleetData>::iterator fItr =
m_fleetDataMap.find(fleetID);
415 fItr->second.booster = pClient;
420 if (oldRole != newRole) {
422 std::map<uint32, FleetData>::iterator fItr =
m_fleetDataMap.find(fleetID);
425 fItr->second.leader =
nullptr;
429 std::map<uint32, FleetData>::iterator fItr =
m_fleetDataMap.find(fleetID);
432 fItr->second.leader = pClient;
433 if (fItr->second.booster ==
nullptr) {
434 fItr->second.booster = pClient;
442 std::map<uint32, WingData>::iterator wItr =
m_wingDataMap.find(oldWingID);
446 wItr->second.leader =
nullptr;
449 wItr->second.booster =
nullptr;
450 wing.emplace(wing.end(), oldWingID);
454 if (newWingID == 0) {
455 newWingID = oldWingID;
457 std::map<uint32, WingData>::iterator wItr =
m_wingDataMap.find(newWingID);
461 wItr->second.booster = pClient;
462 wing.emplace(wing.end(), newWingID);
465 wItr->second.leader = pClient;
466 if (wItr->second.booster ==
nullptr) {
467 wItr->second.booster = pClient;
469 wing.emplace(wing.end(), newWingID);
476 std::map<uint32, SquadData>::iterator sItr =
m_squadDataMap.find(oldSquadID);
480 sItr->second.leader =
nullptr;
482 sItr->second.booster =
nullptr;
483 squad.emplace(squad.end(), oldSquadID);
485 if (oldSquadID != newSquadID) {
486 sItr->second.members.erase(charID);
492 if (newSquadID == 0) {
493 newSquadID = oldSquadID;
495 std::map<uint32, SquadData>::iterator sItr =
m_squadDataMap.find(newSquadID);
499 sItr->second.booster = pClient;
500 squad.emplace(squad.end(), newSquadID);
503 sItr->second.leader = pClient;
504 if (sItr->second.booster ==
nullptr) {
505 sItr->second.booster = pClient;
507 squad.emplace(squad.end(), newSquadID);
510 if (newSquadID != oldSquadID) {
511 sItr->second.members.emplace(charID, pClient);
516 _log(FLEET__TRACE,
"UpdateMember - CharID: %u, FleetID: %u, oldWingID: %i, newWingID: %i, oldSquad: %i, newSquadID: %i, oldJob: %s, newJob: %s, oldRole: %s, newRole: %s, oldBooster: %s, newBooster: %s", \
517 charID, fleetID, oldWingID, newWingID, oldSquadID, newSquadID, \
527 fData.
role = newRole;
533 MemberChangedRSP res;
535 res.fleetID = fleetID;
536 res.oldWingID = oldWingID;
537 res.oldSquadID = oldSquadID;
538 res.oldRole = oldRole;
540 res.oldBooster = oldBooster;
541 res.newWingID = newWingID;
542 res.newSquadID = newSquadID;
543 res.newRole = newRole;
545 res.newBooster = newBooster;
546 res.isOnlyMember = (
m_fleetMembers.count(fleetID) > 1 ?
false :
true);
562 std::vector< uint32 > wingIDs, squadIDs;
563 std::map<ShipSE*, BoostData> memberUpdateMap;
566 int8 armored(0), info(0), leader(0),
mining(0), siege(0), skirmish(0);
571 std::map<uint32, FleetData>::iterator fItr =
m_fleetDataMap.find(fleetID);
574 if ((fItr->second.leader !=
nullptr) and (fItr->second.leader->IsInSpace()))
576 if ((fItr->second.booster !=
nullptr) and (fItr->second.booster->IsInSpace()))
577 if (fItr->second.leader->GetSystemID() == fItr->second.booster->GetSystemID()) {
578 Character* pChar = fItr->second.booster->GetChar().get();
579 if (pChar !=
nullptr) {
596 if (fItr->second.leader->IsInSpace())
597 fItr->second.leader->GetShipSE()->ApplyBoost(fData);
601 _log( FLEET__TRACE,
"UpdateBoost - FB: %s, leader: %i, armored: %i, info: %i, siege: %i, skirmish: %i, mining: %i", \
609 for (
auto wingID : wingIDs) {
624 for (
auto squadID : squadIDs) {
633 memberUpdateMap.emplace(cur.second->GetShipSE(), sData.
boost);
636 }
else if (!wing.empty()) {
639 for (
auto wingID : wing) {
654 for (
auto squadID : squadIDs) {
663 memberUpdateMap.emplace(cur.second->GetShipSE(), sData.
boost);
666 }
else if (!squad.empty()) {
669 for (
auto squadID : squad) {
687 memberUpdateMap.emplace(cur.second->GetShipSE(), sData.
boost);
693 for (
auto cur : memberUpdateMap)
694 cur.first->ApplyBoost(cur.second);
696 _log( FLEET__TRACE,
"FleetService::UpdateBoost() - Updated %u members of fleetID: %u in %.2fus. fleet: %s, wing: %s, squad: %s", \
697 memberUpdateMap.size(), fleetID,
GetTimeUSeconds() - start, (fleet ?
"true" :
"false"), (wing.empty() ?
"false" :
"true"), (squad.empty() ?
"false" :
"true"));
703 int8 leader(0), armored(0), info(0),
mining(0), siege(0), skirmish(0);
704 std::map<uint32, WingData>::iterator wItr =
m_wingDataMap.find(wingID);
707 if ((wItr->second.leader !=
nullptr) and (wItr->second.leader->IsInSpace()))
709 if ((wItr->second.booster !=
nullptr) and (wItr->second.booster->IsInSpace()))
710 if (wItr->second.leader->GetSystemID() == wItr->second.booster->GetSystemID()) {
711 Character* pChar = wItr->second.booster->GetChar().get();
712 if (pChar !=
nullptr) {
726 wItr->second.boost.armored = ((armored < bData.
armored) ? bData.
armored : armored);
727 wItr->second.boost.info = ((info < bData.
info) ? bData.
info : info);
729 wItr->second.boost.siege = ((siege < bData.
siege) ? bData.
siege : siege);
730 wItr->second.boost.skirmish = ((skirmish < bData.
skirmish) ? bData.
skirmish : skirmish);
735 wItr->second.boost.leader = leader;
736 wItr->second.leader->GetShipSE()->ApplyBoost(wItr->second.boost);
742 _log( FLEET__TRACE,
"BoostData - WB: %s, wingID: %u - leader: %i, armored: %i, info: %i, siege: %i, skirmish: %i, mining: %i", \
743 (boost ?
"true" :
"false"), wingID, wItr->second.boost.leader, wItr->second.boost.armored, wItr->second.boost.info, \
744 wItr->second.boost.siege, wItr->second.boost.skirmish, wItr->second.boost.mining);
749 int8 leader(0), armored(0), info(0),
mining(0), siege(0), skirmish(0);
750 std::map<uint32, SquadData>::iterator sItr =
m_squadDataMap.find(squadID);
753 if ((sItr->second.leader !=
nullptr) and (sItr->second.leader->IsInSpace()))
754 if (sItr->second.members.size() <= (sItr->second.leader->GetChar()->GetSkillLevel(
EvESkill::Leadership) * 2)) {
755 if ((sItr->second.booster !=
nullptr) and (sItr->second.booster->IsInSpace()))
756 if (sItr->second.leader->GetSystemID() == sItr->second.booster->GetSystemID()) {
757 Character* pChar = sItr->second.booster->GetChar().get();
758 if (pChar !=
nullptr) {
771 sItr->second.boost.armored = ((armored < bData.
armored) ? bData.
armored : armored);
772 sItr->second.boost.info = ((info < bData.
info) ? bData.
info : info);
774 sItr->second.boost.siege = ((siege < bData.
siege) ? bData.
siege : siege);
775 sItr->second.boost.skirmish = ((skirmish < bData.
skirmish) ? bData.
skirmish : skirmish);
781 sItr->second.boost.leader = leader;
787 _log( FLEET__TRACE,
"BoostData - SB: %s, squadID: %u - leader: %i, armored: %i, info: %i, siege: %i, skirmish: %i, mining: %i", \
788 (sboost ?
"true" :
"false"), squadID, sItr->second.boost.leader, sItr->second.boost.armored, sItr->second.boost.info, \
789 sItr->second.boost.siege, sItr->second.boost.skirmish, sItr->second.boost.mining);
794 std::map<uint32, FleetData>::iterator itr =
m_fleetDataMap.find(fleetID);
798 if ((itr->second.isFreeMove == isFreeMove) and (itr->second.isRegistered == isRegistered) and (itr->second.isVoiceEnabled == isVoiceEnabled))
814 _log(FLEET__TRACE,
"FleetService::UpdateOptions() - fleetID: %u FreeMove: %s, Registered: %s, Voice: %s", \
815 fleetID, isFreeMove ?
"true" :
"false", isRegistered ?
"true" :
"false", isVoiceEnabled ?
"true" :
"false");
816 itr->second.isFreeMove = isFreeMove;
817 itr->second.isRegistered = isRegistered;
818 itr->second.isVoiceEnabled = isVoiceEnabled;
824 std::map<uint32, FleetData>::iterator itr =
m_fleetDataMap.find(fleetID);
835 std::map<uint32, FleetData>::iterator itr =
m_fleetDataMap.find(fleetID);
837 itr->second.motd = motd;
848 std::map<uint32, WingData>::iterator itr =
m_wingDataMap.find(wingID);
852 itr->second.name = name;
859 _log(FLEET__TRACE,
"FleetService::RenameWing() %u to %s", wingID, name.c_str());
864 std::map<uint32, SquadData>::iterator itr =
m_squadDataMap.find(squadID);
868 itr->second.name = name;
873 SendFleetUpdate(itr->second.fleetID,
"OnFleetSquadNameChanged", tuple);
875 _log(FLEET__TRACE,
"FleetService::RenameSquad() %u to %s", squadID, name.c_str());
881 for (
auto itr = range.first; itr != range.second; ++itr) {
882 std::map<uint32, SquadData>::iterator sItr =
m_squadDataMap.find(itr->second);
884 if (sItr->second.members.size() > 0)
893 for (
auto itr = range.first; itr != range.second; ++itr)
894 squadIDs.push_back(itr->second);
900 for (
auto itr = range.first; itr != range.second; ++itr)
901 wingIDs.push_back(itr->second);
906 std::map<uint32, FleetData>::iterator itr =
m_fleetDataMap.find(fleetID);
913 std::map<uint32, WingData>::iterator itr =
m_wingDataMap.find(wingID);
920 std::map<uint32, SquadData>::iterator itr =
m_squadDataMap.find(squadID);
928 for (
auto itr = range.first; itr != range.second; ++itr)
929 data.push_back(itr->second);
935 std::map<uint32, FleetAdvert>::iterator itr =
m_fleetAdvertMap.find(fleetID);
939 pClient = itr->second.leader;
940 if (pClient ==
nullptr)
942 AvalibleFleetsRSP fleetRSP;
943 fleetRSP.fleetID = itr->first;
944 fleetRSP.local_minSecurity = itr->second.local_minSecurity;
945 fleetRSP.description = itr->second.description;
946 fleetRSP.public_minStanding = itr->second.public_minStanding;
947 fleetRSP.fleetName = itr->second.fleetName;
948 fleetRSP.advertTime = itr->second.advertTime;
949 fleetRSP.dateCreated = itr->second.dateCreated;
950 fleetRSP.joinNeedsApproval = itr->second.joinNeedsApproval;
954 for (
auto cur1 : itr->second.local_allowedEntities)
956 localTuple->
SetItem(0, localList);
959 localTuple2->
SetItem(0, token);
960 localTuple2->
SetItem(1, localTuple);
961 fleetRSP.local_allowedEntities =
new PyObjectEx(
false, localTuple2);
965 for (
auto cur2 : itr->second.public_allowedEntities)
967 publicTuple->
SetItem(0, publicList);
970 publicTuple2->
SetItem(0, token);
971 publicTuple2->
SetItem(1, publicTuple);
972 fleetRSP.public_allowedEntities =
new PyObjectEx(
false, publicTuple2);
974 fleetRSP.local_minStanding = itr->second.local_minStanding;
976 fleetRSP.hideInfo = itr->second.hideInfo;
977 fleetRSP.public_minSecurity = itr->second.public_minSecurity;
978 fleetRSP.inviteScope = itr->second.inviteScope;
979 fleetRSP.solarSystemID = itr->second.solarSystemID;
986 fleetRSP.Dump(FLEET__DEBUG);
987 return fleetRSP.Encode();
992 _log(FLEET__TRACE,
"RemoveFleetAdvert for FleetID: %u", fleetID);
995 std::map<uint32, FleetData>::iterator fItr =
m_fleetDataMap.find(fleetID);
997 UpdateOptions(fleetID, fItr->second.isFreeMove,
false, fItr->second.isVoiceEnabled);
1002 std::vector<uint32> wings, squads;
1004 for (
auto wing : wings) {
1008 for (
auto squad : squads)
1017 std::map<uint32, WingData>::iterator wItr =
m_wingDataMap.find(wingID);
1023 std::vector<uint32> squads;
1025 std::map<uint32, SquadData>::iterator sItr;
1026 for (
auto cur : squads) {
1042 std::map<uint32, SquadData>::iterator itr =
m_squadDataMap.find(squadID);
1057 std::map<uint32, FleetData>::iterator fItr =
m_fleetDataMap.find(fleetID);
1060 ++(fItr->second.squads);
1065 std::map<uint32, FleetData>::iterator fItr =
m_fleetDataMap.find(fleetID);
1068 --(fItr->second.squads);
1073 std::map<uint32, FleetData>::iterator itr =
m_fleetDataMap.find(fleetID);
1076 return itr->second.leader;
1081 std::map<uint32, FleetData>::iterator itr =
m_fleetDataMap.find(fleetID);
1084 return itr->second.leader->GetCharacterID();
1089 std::map<uint32, WingData>::iterator itr =
m_wingDataMap.find(wingID);
1092 return itr->second.leader;
1097 std::map<uint32, WingData>::iterator itr =
m_wingDataMap.find(wingID);
1100 return itr->second.leader->GetCharacterID();
1105 std::map<uint32, SquadData>::iterator itr =
m_squadDataMap.find(squadID);
1108 return itr->second.leader;
1113 std::map<uint32, SquadData>::iterator itr =
m_squadDataMap.find(squadID);
1116 return itr->second.leader->GetCharacterID();
1121 std::map<uint32, FleetData>::iterator itr =
m_fleetDataMap.find(fleetID);
1124 return itr->second.name;
1129 std::map<uint32, WingData>::iterator itr =
m_wingDataMap.find(wingID);
1132 return itr->second.name;
1137 std::map<uint32, SquadData>::iterator itr =
m_squadDataMap.find(squadID);
1140 return itr->second.name;
1145 std::map<uint32, FleetAdvert>::iterator itr =
m_fleetAdvertMap.find(fleetID);
1148 return itr->second.description;
1153 std::vector<uint32> wings, squads;
1155 for (
auto itr = range.first; itr != range.second; ++itr)
1156 wings.push_back(itr->second);
1161 for (
auto itr = range.first; itr != range.second; ++itr)
1162 squads.push_back(itr->second);
1171 if (pChar ==
nullptr)
1188 if (pChar ==
nullptr)
1195 std::map<uint32, FleetData>::iterator fItr =
m_fleetDataMap.find(fleetID);
1198 fItr->second.booster =
nullptr;
1200 fItr->second.leader =
nullptr;
1209 itr->second.booster =
nullptr;
1211 itr->second.leader =
nullptr;
1219 itr->second.members.erase(pChar->
itemID());
1221 itr->second.booster =
nullptr;
1223 itr->second.leader =
nullptr;
1228 for (
auto itr = range.first; itr != range.second; ++itr)
1229 if (itr->second == pClient) {
1237 std::vector< uint32 > wingIDs, squadIDs;
1241 for (
auto wingID : wingIDs) {
1246 wing.name = wData.
name;
1247 wing.wingID = wingID;
1250 for (
auto squadID : squadIDs) {
1254 squad.name = sData.
name;
1255 squad.squadID = squadID;
1258 wing.squads = dict2;
1262 dict->
Dump(FLEET__DEBUG,
" ");
1267 Client* pClient(
nullptr);
1271 pClient = cur.second.leader;
1272 if (pClient ==
nullptr)
1274 AvalibleFleetsRSP fleetRSP;
1275 fleetRSP.fleetID = cur.first;
1276 fleetRSP.local_minSecurity = cur.second.local_minSecurity;
1277 fleetRSP.description = cur.second.description;
1278 fleetRSP.public_minStanding = cur.second.public_minStanding;
1279 fleetRSP.fleetName = cur.second.fleetName;
1280 fleetRSP.advertTime = cur.second.advertTime;
1281 fleetRSP.dateCreated = cur.second.dateCreated;
1282 fleetRSP.joinNeedsApproval = cur.second.joinNeedsApproval;
1286 for (
auto cur1 : cur.second.local_allowedEntities)
1288 localTuple->
SetItem(0, localList);
1291 localTuple2->
SetItem(0, token);
1292 localTuple2->
SetItem(1, localTuple);
1293 fleetRSP.local_allowedEntities =
new PyObjectEx(
false, localTuple2);
1297 for (
auto cur2 : cur.second.public_allowedEntities)
1299 publicTuple->
SetItem(0, publicList);
1302 publicTuple2->
SetItem(0, token);
1303 publicTuple2->
SetItem(1, publicTuple);
1304 fleetRSP.public_allowedEntities =
new PyObjectEx(
false, publicTuple2);
1306 fleetRSP.local_minStanding = cur.second.local_minStanding;
1308 fleetRSP.hideInfo = cur.second.hideInfo;
1309 fleetRSP.public_minSecurity = cur.second.public_minSecurity;
1310 fleetRSP.inviteScope = cur.second.inviteScope;
1311 fleetRSP.solarSystemID = cur.second.solarSystemID;
1317 fleetDict->
SetItem(
new PyLong(cur.first), fleetRSP.Encode() );
1320 fleetDict->
Dump(FLEET__DEBUG,
" ");
1328 _log(FLEET__WARNING,
"%s called FleetBroadcast with invalid fleetID %u.", pFrom->
GetName(), fleetID);
1332 _log(FLEET__WARNING,
"%s called FleetBroadcast with group = None for fleet %u.", pFrom->
GetName(), fleetID);
1337 if ((wingID > 0) and !
IsWingID(wingID)) {
1338 _log(FLEET__WARNING,
"%s called FleetBroadcast with invalid wing %i for fleet %u.", pFrom->
GetName(), wingID, fleetID);
1342 if ((squadID > 0) and !
IsSquadID(squadID)) {
1343 _log(FLEET__WARNING,
"%s called FleetBroadcast with invalid squad %i for fleet %u.", pFrom->
GetName(), squadID, fleetID);
1348 std::vector<Client*> members;
1360 for (
auto fItr = range.first; fItr != range.second; ++fItr) {
1362 members.push_back(fItr->second);
1364 if (fItr->second->GetSystemID() == scopeID)
1365 members.push_back(fItr->second);
1367 if (fItr->second->GetShipSE()->SysBubble()->GetID() == scopeID)
1368 members.push_back(fItr->second);
1376 for (
auto fItr = range.first; fItr != range.second; ++fItr) {
1378 members.push_back(fItr->second);
1380 if (fItr->second->GetSystemID() == scopeID)
1381 members.push_back(fItr->second);
1383 if (fItr->second->GetShipSE()->SysBubble()->GetID() == scopeID)
1384 members.push_back(fItr->second);
1388 if (squadID == -1) {
1389 std::vector<uint32> squads;
1391 std::map<uint32, SquadData>::iterator itr;
1392 for (
auto cur : squads) {
1396 for (
auto member : itr->second.members)
1398 members.push_back(member.second);
1400 if (member.second->GetSystemID() == scopeID)
1401 members.push_back(member.second);
1403 if (member.second->GetShipSE()->SysBubble()->GetID() == scopeID)
1404 members.push_back(member.second);
1408 std::map<uint32, SquadData>::iterator itr =
m_squadDataMap.find(squadID);
1411 for (
auto member : itr->second.members)
1413 members.push_back(member.second);
1415 if (member.second->GetSystemID() == scopeID)
1416 members.push_back(member.second);
1418 if (member.second->GetShipSE()->SysBubble()->GetID() == scopeID)
1419 members.push_back(member.second);
1427 _log(FLEET__WARNING,
"FC %s called FleetBroadcast with group == Up for fleet %u.", pFrom->
GetName(), fleetID);
1428 pFrom->
SendErrorMsg(
"You cannot broadcast to Superiors as FC.");
1430 if (squadID == -1) {
1456 for (
auto cur : members) {
1460 cur->SendNotification(
"OnFleetBroadcast",
"clientID", payload,
true);
1465 std::ostringstream grp;
1468 grp <<
"All " << std::to_string(count);
1472 grp << std::to_string(count);
1477 _log(FLEET__BCAST_DUMP,
"%s FleetBroadcast '%s' to %s members of fleet %u.",
GetBCastScopeName(scope).c_str(), msg.c_str(), grp.str().c_str() , fleetID);
1478 payload->
Dump(FLEET__BCAST_DUMP,
" ");
1485 _log(FLEET__UPDATE_DUMP,
"SendFleetUpdate '%s' to members of fleet %u.", notifyType, fleetID);
1486 payload->
Dump(FLEET__UPDATE_DUMP,
" ");
1489 std::vector<Client*> members;
1491 for (
auto fItr = range.first; fItr != range.second; ++fItr)
1492 members.push_back(fItr->second);
1494 for (
auto cur : members) {
1498 cur->SendNotification(notifyType,
"*fleetid", payload,
true);
1504 std::vector<Client*> members;
1507 for (
auto fItr = range.first; fItr != range.second; ++fItr)
1508 members.push_back(fItr->second);
1510 for (
auto cur : members) {
1513 if (cur->GetShipSE()->SysBubble()->GetID() == scopeID)
1514 data.push_back(cur->GetCharacterID());
1520 std::vector<Client*> members;
1523 for (
auto fItr = range.first; fItr != range.second; ++fItr)
1524 members.push_back(fItr->second);
1526 for (
auto cur : members) {
1529 if (cur->GetShipSE()->SystemMgr()->GetID() == scopeID)
1530 data.push_back(cur->GetCharacterID());
1536 std::vector<Client*> members;
1539 for (
auto fItr = range.first; fItr != range.second; ++fItr)
1540 members.push_back(fItr->second);
1542 for (
auto cur : members) {
1545 if (cur->GetShipSE()->SystemMgr()->GetID() == scopeID)
1546 data.push_back(cur);
1551 std::vector<Client*> members;
1553 for (
auto fItr = range.first; fItr != range.second; ++fItr)
1554 members.push_back(fItr->second);
1586 std::map<uint32, InviteData>::iterator itr =
m_inviteData.find(charID);
1596 std::map<uint32, InviteData>::iterator itr =
m_inviteData.find(charID);
1612 auto range =
m_joinReq.equal_range(fleetID);
1613 for (
auto itr = range.first; itr != range.second; ++itr)
1614 if (itr->second == pClient)
1622 auto range =
m_joinReq.equal_range(fleetID);
1623 for (
auto itr = range.first; itr != range.second; ++itr)
1624 data.push_back(itr->second);
1629 auto range =
m_joinReq.equal_range(fleetID);
1630 for (
auto itr = range.first; itr != range.second; ++itr)
1631 if (itr->second == pClient) {
1640 case 0:
return "None";
1641 case 1:
return "Scout";
1642 case 2:
return "Creator";
1643 default:
return "Invalid Job";
1650 case 1:
return "FleetLeader";
1651 case 2:
return "WingLeader";
1652 case 3:
return "SquadLeader";
1653 case 4:
return "Member";
1654 default:
return "Invalid Role";
1661 case 0:
return "No";
1662 case 1:
return "Fleet";
1663 case 2:
return "Wing";
1664 case 3:
return "Squad";
1665 default:
return "Invalid Booster";
1672 case 0:
return "Universe";
1673 case 1:
return "System";
1674 case 2:
return "Bubble";
1675 default:
return "Invalid Scope";
1683 case 0:
return "No";
1684 case 1:
return "Subordinate";
1685 case 2:
return "Superior";
1686 case 3:
return "All";
1687 default:
return "Invalid Group";
1695 return "Invalid Data";
1699 std::ostringstream str;
1706 str <<
" Members: " << std::to_string(
m_fleetMembers.count(fleetID)) <<
"</color><br>";
1708 length += fData.
name.size();
1713 str <<
"<color=red>";
1716 str <<
"<color=green>";
1720 str <<
"Fleet Cmdr: " << pChar->
itemName();
1721 length += pChar->
itemName().size();
1727 str <<
"<color=red>No Fleet Cmdr</color><br>";
1737 str <<
"<color=green>";
1739 str <<
"<color=yellow>";
1743 str <<
"<color=yellow>";
1745 str <<
"<color=red>";
1751 str <<
"<color=red> (Not In System)";
1755 str <<
"Fleet Booster: " << pChar->
itemName();
1756 length += pChar->
itemName().size();
1762 str <<
"<color=red>No Fleet Booster</color><br>";
1767 std::vector< uint32 > wingIDs, squadIDs;
1770 for (
auto wingID : wingIDs) {
1778 str <<
"<color=red>";
1781 str <<
"<color=green>";
1783 str <<
"<color=yellow>";
1788 str <<
" " << wData.
name.c_str() <<
" Cmdr: " << pChar->
itemName();
1789 length += wData.
name.size();
1790 length += pChar->
itemName().size();
1795 str <<
" <color=red>" << wData.
name.c_str() <<
" No Cmdr</color><br>";
1796 length += wData.
name.size();
1805 str <<
"<color=green>";
1807 str <<
"<color=yellow>";
1811 str <<
"<color=yellow>";
1813 str <<
"<color=red>";
1819 str <<
"<color=red> (Not In System)";
1823 str <<
" " <<
"Booster: " << pChar->
itemName();
1824 length += pChar->
itemName().size();
1830 str <<
" <color=red>" << wData.
name.c_str() <<
" No Booster</color><br>";
1831 length += wData.
name.size();
1838 for (
auto squadID : squadIDs) {
1846 str <<
"<color=red>";
1849 str <<
"<color=green>";
1851 str <<
"<color=yellow>";
1856 str <<
" " << sData.
name.c_str() <<
" Cmdr: " << pChar->
itemName();
1857 length += sData.
name.size();
1858 length += pChar->
itemName().size();
1863 str <<
" <color=red>" << sData.
name.c_str() <<
" No Cmdr</color><br>";
1864 length += sData.
name.size();
1873 str <<
"<color=green>";
1875 str <<
"<color=yellow>";
1879 str <<
"<color=yellow>";
1881 str <<
"<color=red>";
1887 str <<
"<color=red> (Not In System)";
1891 str <<
" Booster: " << pChar->
itemName();
1892 length += pChar->
itemName().size();
1898 str <<
" <color=red>" << sData.
name.c_str() <<
" No Booster</color><br>";
1899 length += sData.
name.size();
1904 str <<
" <color=green>";
1906 str <<
" <color=red>";
1908 str <<
"Members: " << std::to_string(sData.
members.size()) <<
" Effective: ";
1916 bdata += std::to_string(sData.
boost.
info);
1925 bdata =
"0/0/0/0/0/0 (";
1930 bdata += std::to_string(sData.
boost.
info);
1940 str << bdata.c_str();
1941 str <<
"</color><br>";
1944 if (squadIDs.empty()) {
1945 str <<
" <color=fuchsia>No Squads</color><br><br>";
1949 if (wingIDs.empty()) {
1950 str <<
" <color=fuchsia>No Wings</color><br><br>";
std::multimap< uint32, Client * > m_fleetMembers
#define sConfig
A macro for easier access to the singleton.
void GetSquadData(uint32 squadID, SquadData &data)
uint32 CreateFleet(Client *pClient)
void SendNotification(const PyAddress &dest, EVENotificationStream ¬i, bool seq=true)
void SendFleetUpdate(uint32 fleetID, const char *notifyType, PyTuple *payload)
void FleetBroadcast(Client *pFrom, uint32 itemID, int8 scope, int8 group, std::string msg)
std::map< uint32, InviteData > m_inviteData
bool SaveInviteData(uint32 charID, InviteData &data)
void GetRandUnitIDs(uint32 fleetID, int32 &wingID, int32 &squadID)
void SendErrorMsg(const char *fmt,...)
uint32 GetSystemID() const
#define _log(type, fmt,...)
float GetSecurityRating() const
std::multimap< uint32, uint32 > m_wingSquads
std::multimap< uint32, uint32 > isExcludedFromMuting
std::multimap< uint32, uint32 > m_fleetWings
void SetWingBoostData(uint32 wingID, BoostData &bData)
SystemBubble * SysBubble()
void RemoveJoinRequest(uint32 fleetID, Client *pClient)
uint32 GetFleetLeaderID(uint32 fleetID)
void SetSquadBoostData(uint32 squadID, BoostData bData, bool &sboost)
void UpdateBoost(uint32 fleetID, bool fleet, std::list< int32 > &wing, std::list< int32 > &squad)
bool AddJoinRequest(uint32 fleetID, Client *pClient)
void DeleteFleet(uint32 fleetID)
PyRep * GetAvailableFleets()
std::vector< Client * > GetFleetClients(uint32 fleetID)
int32 GetCharacterID() const
void GetWingData(uint32 wingID, WingData &data)
int32 GetWarFactionID() const
PyRep * GetMOTD(uint32 fleetID)
int32 GetCorporationID() const
int64 GetClientID() const
bool IsWingActive(int32 wingID)
CharacterRef GetChar() const
std::multimap< uint32, Client * > m_joinReq
void Dump(FILE *into, const char *pfx) const
Dumps object to file.
void CreateFleetAdvert(uint32 fleetID, FleetAdvert data)
int32 GetAllianceID() const
std::map< uint32, FleetData > m_fleetDataMap
Client * GetSquadLeader(uint32 squadID)
std::string GetBoosterName(int8 booster)
void GetFleetData(uint32 fleetID, FleetData &data)
void GetMemeberVec(uint32 fleetID, std::vector< Client * > &data)
#define is_log_enabled(type)
#define sLog
Evaluates to a NewLog instance.
std::string GetWingName(uint32 wingID)
bool GetInviteData(uint32 charID, InviteData &data)
void CreateSystemChannel(int32 channelID)
void RemoveInviteData(uint32 charID)
SystemManager * SystemMgr()
PyRep * GetFleetAdvert(uint32 fleetID)
PyRep * CreateWing(uint32 fleetID)
void SetFleetData(CharFleetData &fleet)
PyServiceMgr * m_services
bool UpdateMember(uint32 charID, uint32 fleetID, int32 newWingID, int32 newSquadID, int8 newJob, int8 newRole, int8 newBooster)
void SendActiveStatus(uint32 fleetID, int32 wingID, int32 squadID)
void DecFleetSquads(uint32 fleetID, uint32 wingID)
void SetItem(size_t index, PyRep *object)
Stores Python object.
Client * GetFleetLeader(uint32 fleetID)
std::map< uint32, FleetAdvert > m_fleetAdvertMap
std::string GetJobName(int8 job)
int8 fleetBooster() const
void LeaveFleet(Client *pClient)
void GetFleetClientsInSystem(Client *pClient, std::vector< Client * > &data)
uint32 GetFleetID() const
void AddItemInt(int32 intval)
ShipItemRef GetShip() const
std::string GetBCastScopeName(int8 scope)
const char * GetName() const
std::string GetFleetDescription(uint32 fleetID)
Client * GetWingLeader(uint32 wingID)
std::string GetRoleName(int8 role)
void Initialize(PyServiceMgr *svc)
void RenameWing(uint32 wingID, std::string name)
#define IsSquadID(itemID)
if(sConfig.world.saveOnMove)
void RemoveMember(Client *pClient)
void UpdateOptions(uint32 fleetID, bool isFreeMove, bool isRegistered, bool isVoiceEnabled)
void CreateSquad(uint32 fleetID, uint32 wingID)
void RemoveFleetAdvert(uint32 fleetID)
std::map< uint32, SquadData > m_squadDataMap
void GetFleetMembersInSystem(Client *pClient, std::vector< uint32 > &data)
Python token (eg. class name).
bool HasSkillTrainedToLevel(uint16 skillTypeID, uint8 skillLevel) const
void DeleteWing(uint32 wingID)
int64 MakeRandomInt(int64 low, int64 high)
Generates random integer from interval [low; high].
const std::string & itemName() const
std::string GetBoosterData(uint32 fleetID, uint16 &length)
void GetFleetMembersOnGrid(Client *pClient, std::vector< uint32 > &data)
#define IsFleetID(itemID)
void GetSquadIDs(uint32 wingID, std::vector< uint32 > &squadIDs)
void IncFleetSquads(uint32 fleetID, uint32 wingID)
typeID Spawn an NPC with the specified type text Search for items matching the specified query() type()() itemID() copy() materialLevel()() itemID(attributeID)-Retrieves attribute value." ) COMMAND( setattr
std::map< uint32, Client * > members
std::multimap< uint32, uint32 > isMutedByLeader
int8 GetSkillLevel(uint16 skillTypeID, bool zeroForNotInjected=true) const
std::string GetFleetName(uint32 fleetID)
void DeleteSquad(uint32 squadID)
uint32 GetWingLeaderID(uint32 wingID)
uint32 GetSquadLeaderID(uint32 squadID)
PyRep * GetWings(uint32 fleetID)
void GetJoinRequests(uint32 fleetID, std::vector< Client * > &data)
void SetMOTD(uint32 fleetID, std::string motd)
std::string GetBCastGroupName(int8 group)
std::map< uint32, WingData > m_wingDataMap
void SetItem(PyRep *key, PyRep *value)
SetItem adds or sets a database entry.
bool AddMember(Client *pClient, uint32 fleetID, int32 wingID, int32 squadID, int8 job, int8 role, int8 booster)
std::string GetSquadName(uint32 squadID)
void SetItemString(const char *key, PyRep *value)
SetItemString adds or sets a database entry.
void RenameSquad(uint32 squadID, std::string name)
void GetWingIDs(uint32 fleetID, std::vector< uint32 > &wingIDs)