// ====================================================================== // // GuildInterface.cpp // // Copyright 2002 Sony Online Entertainment // // ====================================================================== #include "serverGame/FirstServerGame.h" #include "serverGame/GuildInterface.h" #include "UnicodeUtils.h" #include "serverGame/Chat.h" #include "serverGame/ConfigServerGame.h" #include "serverGame/CreatureObject.h" #include "serverGame/GameServer.h" #include "serverGame/GuildObject.h" #include "serverGame/GuildStringParser.h" #include "serverGame/ServerUniverse.h" #include "serverScript/ScriptParameters.h" #include "serverUtility/ServerClock.h" #include "sharedFoundation/CalendarTime.h" #include "sharedFoundation/FormattedString.h" #include "sharedNetworkMessages/ChatRoomData.h" #include // ====================================================================== namespace GuildInterfaceNamespace { // ---------------------------------------------------------------------- const std::string s_empty; uint32 const s_guildChannelLimit = 400; int const s_maxInactiveGuildWarsTracked = 100; std::string const s_objvarInactiveGuildWarsPrefix("guildWarsEnded"); std::string const s_objvarInactiveGuildWarsMostRecentIndex = s_objvarInactiveGuildWarsPrefix + std::string(".mostRecentIndex"); std::map > s_guildEnemiesAToB; std::map > > s_guildEnemiesAToBKillInfo; std::map > s_guildEnemiesBToA; bool s_needEnemiesRebuild; // dictionary containing the table showing all active guild wars with at least 1 kill ScriptParams * s_activeGuildWars = NULL; bool s_activeGuildWarsNeedRebuild = true; // dictionary containing the table showing the 100 most recently ended guild wars with at least 1 kill ScriptParams * s_inactiveGuildWars = NULL; int s_inactiveGuildWarsMostRecentUpdateIndex = 0; typedef std::map PendingChannelAddList; //using a map to make it easier to prevent redundant entries typedef std::map PendingChannelAddMap; PendingChannelAddMap s_pendingChannelAdds; // ---------------------------------------------------------------------- std::string const &getChatRoomPrefix() { //lint !e1929 // returning a reference makes sense here. static std::string const prefix = std::string("SWG.") + GameServer::getInstance().getClusterName().c_str() + ".guild."; return prefix; } // ---------------------------------------------------------------------- std::string const &getChatRoomSuffix() { //lint !e1929 // returning a reference makes sense here. static std::string const suffix("." + ChatRoomTypes::ROOM_GUILD); return suffix; } // ---------------------------------------------------------------------- std::string getChatRoomPath(int guildId) { char buf[256]; snprintf(buf, 256, "%s%d%s", getChatRoomPrefix().c_str(), guildId, getChatRoomSuffix().c_str()); return std::string(buf); } // ---------------------------------------------------------------------- std::string getChatRoomTitle(int guildId) { char buf[32]; snprintf(buf, 32, "%d", guildId); return std::string(buf); } // ---------------------------------------------------------------------- std::string const & getVoiceChatDisplayName() { return ChatRoomTypes::ROOM_GUILD; } // ---------------------------------------------------------------------- const char * makeCopyOfString(const char * rhs) { char * lhs = NULL; if (rhs) { lhs = new char[strlen(rhs) + 1]; strcpy(lhs, rhs); } else { lhs = new char[1]; lhs[0] = '\0'; } return lhs; } } using namespace GuildInterfaceNamespace; // ====================================================================== void GuildInterface::update() { if (ServerUniverse::getInstance().isUniverseLoaded()) { GuildObject *masterGuildObject = ServerUniverse::getInstance().getMasterGuildObject(); if (masterGuildObject) { if (s_needEnemiesRebuild) buildEnemies(*masterGuildObject); } } } // ---------------------------------------------------------------------- void GuildInterface::touchEnemies() { s_needEnemiesRebuild = true; } // ---------------------------------------------------------------------- void GuildInterface::buildEnemies(GuildObject const &guildObject) { PROFILER_AUTO_BLOCK_DEFINE("GuildInterface::buildEnemies"); s_needEnemiesRebuild = false; s_activeGuildWarsNeedRebuild = true; // potential pvp updates for every guilded creature std::vector pvpUpdateObservers; { CreatureObject::AllCreaturesSet const &creatureList = CreatureObject::getAllCreatures(); for (CreatureObject::AllCreaturesSet::const_iterator i = creatureList.begin(); i != creatureList.end(); ++i) if ((*i)->getGuildId()) pvpUpdateObservers.push_back(new PvpUpdateObserver(*i, Archive::ADOO_generic)); } s_guildEnemiesAToB.clear(); s_guildEnemiesAToBKillInfo.clear(); s_guildEnemiesBToA.clear(); std::set const &enemies = guildObject.getGuildEnemies(); for (std::set::const_iterator i = enemies.begin(); i != enemies.end(); ++i) { int guildId, enemyId, killCount, lastUpdateTime; if (GuildStringParser::parseEnemyInfo(*i, guildId, enemyId, killCount, lastUpdateTime)) { s_guildEnemiesAToB[guildId].push_back(enemyId); std::pair >::iterator, bool> result = s_guildEnemiesAToBKillInfo[guildId].insert(std::make_pair(enemyId, std::make_pair(killCount, static_cast(lastUpdateTime)))); if (!result.second) { // multiple A->B guild enemy entries, so consolidate into one entry result.first->second.first += killCount; result.first->second.second = std::max(result.first->second.second, static_cast(lastUpdateTime)); } s_guildEnemiesBToA[enemyId].push_back(guildId); } } // destroy pvp update observers { for (std::vector::iterator i = pvpUpdateObservers.begin(); i != pvpUpdateObservers.end(); ++i) delete (*i); } } // ---------------------------------------------------------------------- int GuildInterface::getGuildId(NetworkId const &memberId) { return ServerUniverse::getInstance().getMasterGuildObject()->getGuildId(memberId); } // ---------------------------------------------------------------------- int GuildInterface::getGuildIdForSponsored(NetworkId const &memberId) { return ServerUniverse::getInstance().getMasterGuildObject()->getGuildIdForSponsored(memberId); } // ---------------------------------------------------------------------- int GuildInterface::getGuildIdForGuildLeader(NetworkId const &leaderId) { return ServerUniverse::getInstance().getMasterGuildObject()->getGuildIdForGuildLeader(leaderId); } // ---------------------------------------------------------------------- void GuildInterface::getAllGuildIds(std::vector &results) { ServerUniverse::getInstance().getMasterGuildObject()->getAllGuildIds(results); } // ---------------------------------------------------------------------- int GuildInterface::findGuild(std::string const &name) { return ServerUniverse::getInstance().getMasterGuildObject()->findGuild(name); } // ---------------------------------------------------------------------- bool GuildInterface::guildExists(int guildId) { return ServerUniverse::getInstance().getMasterGuildObject()->guildExists(guildId); } // ---------------------------------------------------------------------- std::pair const *GuildInterface::hasDeclaredWarAgainst(int actorGuildId, int targetGuildId) { if (actorGuildId && targetGuildId) { std::map > >::const_iterator const iterFindA = s_guildEnemiesAToBKillInfo.find(actorGuildId); if (iterFindA != s_guildEnemiesAToBKillInfo.end()) { std::map >::const_iterator const iterFindB = iterFindA->second.find(targetGuildId); if (iterFindB != iterFindA->second.end()) return &(iterFindB->second); } } return NULL; } // ---------------------------------------------------------------------- GuildInfo const * GuildInterface::getGuildInfo(int guildId) { return ServerUniverse::getInstance().getMasterGuildObject()->getGuildInfo(guildId); } // ---------------------------------------------------------------------- std::string const &GuildInterface::getGuildName(int guildId) { GuildInfo const * const gi = ServerUniverse::getInstance().getMasterGuildObject()->getGuildInfo(guildId); if (gi) return gi->m_name; return s_empty; } // ---------------------------------------------------------------------- std::string const &GuildInterface::getGuildAbbrev(int guildId) { GuildInfo const * const gi = ServerUniverse::getInstance().getMasterGuildObject()->getGuildInfo(guildId); if (gi) return gi->m_abbrev; return s_empty; } // ---------------------------------------------------------------------- NetworkId const &GuildInterface::getGuildLeaderId(int guildId) { GuildInfo const * const gi = ServerUniverse::getInstance().getMasterGuildObject()->getGuildInfo(guildId); if (gi) return gi->m_leaderId; return NetworkId::cms_invalid; } // ---------------------------------------------------------------------- int GuildInterface::getGuildElectionPreviousEndTime(int guildId) { GuildInfo const * const gi = ServerUniverse::getInstance().getMasterGuildObject()->getGuildInfo(guildId); if (gi) return gi->m_guildElectionPreviousEndTime; return 0; } // ---------------------------------------------------------------------- int GuildInterface::getGuildElectionNextEndTime(int guildId) { GuildInfo const * const gi = ServerUniverse::getInstance().getMasterGuildObject()->getGuildInfo(guildId); if (gi) return gi->m_guildElectionNextEndTime; return 0; } // ---------------------------------------------------------------------- uint32 GuildInterface::getGuildCurrentFaction(int guildId) { GuildInfo const * const gi = ServerUniverse::getInstance().getMasterGuildObject()->getGuildInfo(guildId); if (gi) return getGuildCurrentFaction(*gi); return 0; } // ---------------------------------------------------------------------- uint32 GuildInterface::getGuildCurrentFaction(GuildInfo const & gi) { if (gi.m_timeLeftGuildFaction <= 0) return gi.m_guildFaction; return 0; } // ---------------------------------------------------------------------- uint32 GuildInterface::getGuildPreviousFaction(int guildId) { GuildInfo const * const gi = ServerUniverse::getInstance().getMasterGuildObject()->getGuildInfo(guildId); if (gi) return getGuildPreviousFaction(*gi); return 0; } // ---------------------------------------------------------------------- uint32 GuildInterface::getGuildPreviousFaction(GuildInfo const & gi) { if (gi.m_timeLeftGuildFaction > 0) return gi.m_guildFaction; return 0; } // ---------------------------------------------------------------------- int GuildInterface::getTimeLeftGuildPreviousFaction(int guildId) { GuildInfo const * const gi = ServerUniverse::getInstance().getMasterGuildObject()->getGuildInfo(guildId); if (gi) return getTimeLeftGuildPreviousFaction(*gi); return 0; } // ---------------------------------------------------------------------- int GuildInterface::getTimeLeftGuildPreviousFaction(GuildInfo const & gi) { if (gi.m_timeLeftGuildFaction > 0) return gi.m_timeLeftGuildFaction; return 0; } // ---------------------------------------------------------------------- std::string const & GuildInterface::getGuildCurrentGcwDefenderRegion(int guildId) { GuildInfo const * const gi = ServerUniverse::getInstance().getMasterGuildObject()->getGuildInfo(guildId); if (gi) return getGuildCurrentGcwDefenderRegion(*gi); return s_empty; } // ---------------------------------------------------------------------- std::string const &GuildInterface::getGuildCurrentGcwDefenderRegion(GuildInfo const & gi) { if (gi.m_timeLeftGuildGcwDefenderRegion <= 0) return gi.m_guildGcwDefenderRegion; return s_empty; } // ---------------------------------------------------------------------- int GuildInterface::getTimeJoinedGuildCurrentGcwDefenderRegion(int guildId) { GuildInfo const * const gi = ServerUniverse::getInstance().getMasterGuildObject()->getGuildInfo(guildId); if (gi) return getTimeJoinedGuildCurrentGcwDefenderRegion(*gi); return 0; } // ---------------------------------------------------------------------- int GuildInterface::getTimeJoinedGuildCurrentGcwDefenderRegion(GuildInfo const & gi) { if (gi.m_timeLeftGuildGcwDefenderRegion <= 0) return gi.m_timeJoinedGuildGcwDefenderRegion; return 0; } // ---------------------------------------------------------------------- std::string const & GuildInterface::getGuildPreviousGcwDefenderRegion(int guildId) { GuildInfo const * const gi = ServerUniverse::getInstance().getMasterGuildObject()->getGuildInfo(guildId); if (gi) return getGuildPreviousGcwDefenderRegion(*gi); return s_empty; } // ---------------------------------------------------------------------- std::string const & GuildInterface::getGuildPreviousGcwDefenderRegion(GuildInfo const & gi) { if (gi.m_timeLeftGuildGcwDefenderRegion > 0) return gi.m_guildGcwDefenderRegion; return s_empty; } // ---------------------------------------------------------------------- int GuildInterface::getTimeLeftGuildPreviousGcwDefenderRegion(int guildId) { GuildInfo const * const gi = ServerUniverse::getInstance().getMasterGuildObject()->getGuildInfo(guildId); if (gi) return getTimeLeftGuildPreviousGcwDefenderRegion(*gi); return 0; } // ---------------------------------------------------------------------- int GuildInterface::getTimeLeftGuildPreviousGcwDefenderRegion(GuildInfo const & gi) { if (gi.m_timeLeftGuildGcwDefenderRegion > 0) return gi.m_timeLeftGuildGcwDefenderRegion; return 0; } // ---------------------------------------------------------------------- std::map, uint32> const & GuildInterface::getGcwRegionDefenderGuilds() { return ServerUniverse::getInstance().getMasterGuildObject()->getGcwRegionDefenderGuilds(); } // ---------------------------------------------------------------------- std::map > const & GuildInterface::getGcwRegionDefenderGuildsCount() { return ServerUniverse::getInstance().getMasterGuildObject()->getGcwRegionDefenderGuildsCount(); } // ---------------------------------------------------------------------- int GuildInterface::getGcwRegionDefenderGuildsVersion() { return ServerUniverse::getInstance().getMasterGuildObject()->getGcwRegionDefenderGuildsVersion(); } // ---------------------------------------------------------------------- void GuildInterface::getGuildMemberIds(int guildId, std::vector &results) { ServerUniverse::getInstance().getMasterGuildObject()->getGuildMemberIds(guildId, results); } // ---------------------------------------------------------------------- void GuildInterface::getGuildMemberIdsWithPermissions(int guildId, int permissions, std::vector &results) { ServerUniverse::getInstance().getMasterGuildObject()->getMemberIdsWithPermissions(guildId, permissions, results); } // ---------------------------------------------------------------------- int GuildInterface::getGuildCountMembersOnly(int guildId) { GuildInfo const * const gi = ServerUniverse::getInstance().getMasterGuildObject()->getGuildInfo(guildId); if (gi) return gi->getCountMembersOnly(); return 0; } // ---------------------------------------------------------------------- int GuildInterface::getGuildCountSponsoredOnly(int guildId) { GuildInfo const * const gi = ServerUniverse::getInstance().getMasterGuildObject()->getGuildInfo(guildId); if (gi) return gi->getCountSponsoredOnly(); return 0; } // ---------------------------------------------------------------------- int GuildInterface::getGuildCountMembersAndSponsored(int guildId) { GuildInfo const * const gi = ServerUniverse::getInstance().getMasterGuildObject()->getGuildInfo(guildId); if (gi) return gi->getCountMembersAndSponsored(); return 0; } // ---------------------------------------------------------------------- int GuildInterface::getGuildCountMembersGuildWarPvPEnabled(int guildId) { GuildInfo const * const gi = ServerUniverse::getInstance().getMasterGuildObject()->getGuildInfo(guildId); if (gi) return gi->getCountMembersGuildWarPvPEnabled(); return 0; } // ---------------------------------------------------------------------- GuildMemberInfo const * GuildInterface::getGuildMemberInfo(int guildId, NetworkId const &memberId) { return ServerUniverse::getInstance().getMasterGuildObject()->getGuildMemberInfo(guildId, memberId); } // ---------------------------------------------------------------------- bool GuildInterface::getGuildMemberGuildWarEnabled(int guildId, NetworkId const &memberId) { if (guildId == 0) return false; GuildInfo const * const gi = ServerUniverse::getInstance().getMasterGuildObject()->getGuildInfo(guildId); if (!gi) return false; GuildMemberInfo const * const gmi = ServerUniverse::getInstance().getMasterGuildObject()->getGuildMemberInfo(guildId, memberId); if (!gmi) return false; // if guild is using guild war inclusion list, only members // with GuildInterface::WarInclusion is enabled for guild war if (gi->m_guildWarInclusionCount) return (gmi->m_permissions & GuildInterface::WarInclusion); // if guild is not using guild war inclusion list, only members // with GuildInterface::WarExclusion is disabled for guild war return (!(gmi->m_permissions & GuildInterface::WarExclusion)); } // ---------------------------------------------------------------------- std::vector const &GuildInterface::getGuildEnemies(int guildId) { static std::vector empty; std::map >::const_iterator iterFind = s_guildEnemiesAToB.find(guildId); if (iterFind != s_guildEnemiesAToB.end()) return iterFind->second; return empty; } // ---------------------------------------------------------------------- std::map > const &GuildInterface::getGuildEnemiesKillInfo(int guildId) { static std::map > empty; std::map > >::const_iterator iterFind = s_guildEnemiesAToBKillInfo.find(guildId); if (iterFind != s_guildEnemiesAToBKillInfo.end()) return iterFind->second; return empty; } // ---------------------------------------------------------------------- std::pair const &GuildInterface::getGuildEnemyKillInfo(int guildIdA, int guildIdB) { static std::pair empty = std::make_pair(0, 0); std::map > >::const_iterator iterFindA = s_guildEnemiesAToBKillInfo.find(guildIdA); if (iterFindA != s_guildEnemiesAToBKillInfo.end()) { std::map >::const_iterator iterFindB = iterFindA->second.find(guildIdB); if (iterFindB != iterFindA->second.end()) return iterFindB->second; } return empty; } // ---------------------------------------------------------------------- std::vector const &GuildInterface::getGuildsAtWarWith(int guildId) { static std::vector empty; std::map >::const_iterator iterFind = s_guildEnemiesBToA.find(guildId); if (iterFind != s_guildEnemiesBToA.end()) return iterFind->second; return empty; } // ---------------------------------------------------------------------- ScriptParams const *GuildInterface::getMasterGuildWarTableDictionary() { if (s_activeGuildWarsNeedRebuild) { // build list of guild wars with at least 1 kill, ordered by most recent update time, with the guild with more kills appearing first std::multimap, std::pair > > guildMutuallyAtWarWithKillSummary; { for (std::map > >::const_iterator iter1 = s_guildEnemiesAToBKillInfo.begin(); iter1 != s_guildEnemiesAToBKillInfo.end(); ++iter1) { for (std::map >::const_iterator iter2 = iter1->second.upper_bound(iter1->first); iter2 != iter1->second.end(); ++iter2) { // we know A has declared war on B, so see if B has declared on A to make it a guild war std::pair const * killInfoBtoA = hasDeclaredWarAgainst(iter2->first, iter1->first); if (killInfoBtoA) { // we have a guild war, store it if there is at least one kill if ((iter2->second.first <= 0) && (killInfoBtoA->first <= 0)) continue; // guild with more kills appears first, and if guilds have the same // number of kills, guild with more recent kill appears first if (iter2->second.first > killInfoBtoA->first) guildMutuallyAtWarWithKillSummary.insert(std::make_pair(-std::max(iter2->second.second, killInfoBtoA->second), std::make_pair(std::make_pair(iter1->first, iter2->second.first), std::make_pair(iter2->first, killInfoBtoA->first)))); else if (killInfoBtoA->first > iter2->second.first) guildMutuallyAtWarWithKillSummary.insert(std::make_pair(-std::max(iter2->second.second, killInfoBtoA->second), std::make_pair(std::make_pair(iter2->first, killInfoBtoA->first), std::make_pair(iter1->first, iter2->second.first)))); else if (iter2->second.second > killInfoBtoA->second) guildMutuallyAtWarWithKillSummary.insert(std::make_pair(-std::max(iter2->second.second, killInfoBtoA->second), std::make_pair(std::make_pair(iter1->first, iter2->second.first), std::make_pair(iter2->first, killInfoBtoA->first)))); else guildMutuallyAtWarWithKillSummary.insert(std::make_pair(-std::max(iter2->second.second, killInfoBtoA->second), std::make_pair(std::make_pair(iter2->first, killInfoBtoA->first), std::make_pair(iter1->first, iter2->second.first)))); } } } } delete s_activeGuildWars; s_activeGuildWars = NULL; // build the table if (!guildMutuallyAtWarWithKillSummary.empty()) { // column header static const char * s_scriptParamsColumnHeadersText[9] = { "Name - Guild A", "Abbrev - Guild A", "Kill Count - Guild A", "Guild War PvP Enabled Count - Guild A", "Name - Guild B", "Abbrev - Guild B", "Kill Count - Guild B", "Guild War PvP Enabled Count - Guild B", "Last Updated" }; static std::vector s_scriptParamsColumnHeaders(s_scriptParamsColumnHeadersText, s_scriptParamsColumnHeadersText + (sizeof(s_scriptParamsColumnHeadersText) / sizeof(const char *))); // column type static const char * s_scriptParamsColumnTypeText[9] = { "text", "text", "integer", "integer", "text", "text", "integer", "integer", "text" }; static std::vector s_scriptParamsColumnType(s_scriptParamsColumnTypeText, s_scriptParamsColumnTypeText + (sizeof(s_scriptParamsColumnTypeText) / sizeof(const char *))); s_activeGuildWars = new ScriptParams(); std::vector * scriptParamsGuildAName = new std::vector; std::vector * scriptParamsGuildAAbbrev = new std::vector; std::vector * scriptParamsGuildAKillCount = new std::vector; std::vector * scriptParamsGuildAPvpEnabledCount = new std::vector; std::vector * scriptParamsGuildBName = new std::vector; std::vector * scriptParamsGuildBAbbrev = new std::vector; std::vector * scriptParamsGuildBKillCount = new std::vector; std::vector * scriptParamsGuildBPvpEnabledCount = new std::vector; std::vector * scriptParamsLastUpdated = new std::vector; size_t const size = guildMutuallyAtWarWithKillSummary.size(); scriptParamsGuildAName->reserve(size); scriptParamsGuildAAbbrev->reserve(size); scriptParamsGuildAKillCount->reserve(size); scriptParamsGuildAPvpEnabledCount->reserve(size); scriptParamsGuildBName->reserve(size); scriptParamsGuildBAbbrev->reserve(size); scriptParamsGuildBKillCount->reserve(size); scriptParamsGuildBPvpEnabledCount->reserve(size); scriptParamsLastUpdated->reserve(size); char buffer[128]; for (std::multimap, std::pair > >::const_iterator iter = guildMutuallyAtWarWithKillSummary.begin(); iter != guildMutuallyAtWarWithKillSummary.end(); ++iter) { GuildInfo const * gi = ServerUniverse::getInstance().getMasterGuildObject()->getGuildInfo(iter->second.first.first); if (!gi) continue; GuildInfo const & guildA = *gi; gi = ServerUniverse::getInstance().getMasterGuildObject()->getGuildInfo(iter->second.second.first); if (!gi) continue; GuildInfo const & guildB = *gi; scriptParamsGuildAName->push_back(makeCopyOfString(guildA.m_name.c_str())); scriptParamsGuildAAbbrev->push_back(makeCopyOfString(guildA.m_abbrev.c_str())); snprintf(buffer, sizeof(buffer), "%d", iter->second.first.second); scriptParamsGuildAKillCount->push_back(makeCopyOfString(buffer)); snprintf(buffer, sizeof(buffer), "%d", guildA.getCountMembersGuildWarPvPEnabled()); scriptParamsGuildAPvpEnabledCount->push_back(makeCopyOfString(buffer)); scriptParamsGuildBName->push_back(makeCopyOfString(guildB.m_name.c_str())); scriptParamsGuildBAbbrev->push_back(makeCopyOfString(guildB.m_abbrev.c_str())); snprintf(buffer, sizeof(buffer), "%d", iter->second.second.second); scriptParamsGuildBKillCount->push_back(makeCopyOfString(buffer)); snprintf(buffer, sizeof(buffer), "%d", guildB.getCountMembersGuildWarPvPEnabled()); scriptParamsGuildBPvpEnabledCount->push_back(makeCopyOfString(buffer)); scriptParamsLastUpdated->push_back(makeCopyOfString(CalendarTime::convertEpochToTimeStringLocal_YYYYMMDDHHMMSS(-iter->first).c_str())); } s_activeGuildWars->addParam(s_scriptParamsColumnHeaders, "column", false); s_activeGuildWars->addParam(s_scriptParamsColumnType, "columnType", false); s_activeGuildWars->addParam(*scriptParamsGuildAName, "column0", true); s_activeGuildWars->addParam(*scriptParamsGuildAAbbrev, "column1", true); s_activeGuildWars->addParam(*scriptParamsGuildAKillCount, "column2", true); s_activeGuildWars->addParam(*scriptParamsGuildAPvpEnabledCount, "column3", true); s_activeGuildWars->addParam(*scriptParamsGuildBName, "column4", true); s_activeGuildWars->addParam(*scriptParamsGuildBAbbrev, "column5", true); s_activeGuildWars->addParam(*scriptParamsGuildBKillCount, "column6", true); s_activeGuildWars->addParam(*scriptParamsGuildBPvpEnabledCount, "column7", true); s_activeGuildWars->addParam(*scriptParamsLastUpdated, "column8", true); } s_activeGuildWarsNeedRebuild = false; } return s_activeGuildWars; } // ---------------------------------------------------------------------- void GuildInterface::updateInactiveGuildWarTrackingInfo(GuildObject &masterGuildObject, int guildAId, int guildAKillCount, int guildBId, int guildBKillCount) { if (!masterGuildObject.isAuthoritative()) return; if ((guildAKillCount <= 0) && (guildBKillCount <= 0)) return; GuildInfo const * giA = ServerUniverse::getInstance().getMasterGuildObject()->getGuildInfo(guildAId); if (!giA) return; if (giA->m_name.empty() || giA->m_abbrev.empty()) return; GuildInfo const * giB = ServerUniverse::getInstance().getMasterGuildObject()->getGuildInfo(guildBId); if (!giB) return; if (giB->m_name.empty() || giB->m_abbrev.empty()) return; // the information is stored as objvars on the master guild object as a circular // list of the 100 most recently ended guild wars with at least 1 kill int nextIndex = 0; if (!masterGuildObject.getObjVars().getItem(s_objvarInactiveGuildWarsMostRecentIndex, nextIndex)) nextIndex = 0; ++nextIndex; if (nextIndex > s_maxInactiveGuildWarsTracked) nextIndex = 1; // guild with higher kill count appears first if (guildAKillCount > guildBKillCount) IGNORE_RETURN(masterGuildObject.setObjVarItem(FormattedString<32>().sprintf("%s.%d", s_objvarInactiveGuildWarsPrefix.c_str(), nextIndex), FormattedString<512>().sprintf("%s~%s~%d~%s~%s~%d~%ld", giA->m_name.c_str(), giA->m_abbrev.c_str(), guildAKillCount, giB->m_name.c_str(), giB->m_abbrev.c_str(), guildBKillCount, ::time(NULL)))); else IGNORE_RETURN(masterGuildObject.setObjVarItem(FormattedString<32>().sprintf("%s.%d", s_objvarInactiveGuildWarsPrefix.c_str(), nextIndex), FormattedString<512>().sprintf("%s~%s~%d~%s~%s~%d~%ld", giB->m_name.c_str(), giB->m_abbrev.c_str(), guildBKillCount, giA->m_name.c_str(), giA->m_abbrev.c_str(), guildAKillCount, ::time(NULL)))); IGNORE_RETURN(masterGuildObject.setObjVarItem(s_objvarInactiveGuildWarsMostRecentIndex, nextIndex)); } // ---------------------------------------------------------------------- ScriptParams const *GuildInterface::getInactiveGuildWarTableDictionary() { // update the table if necessary GuildObject const * const masterGuildObject = ServerUniverse::getInstance().getMasterGuildObject(); if (!masterGuildObject) return s_inactiveGuildWars; DynamicVariableList const & objVars = masterGuildObject->getObjVars(); int mostRecentIndex = 0; if (!objVars.getItem(s_objvarInactiveGuildWarsMostRecentIndex, mostRecentIndex)) return s_inactiveGuildWars; if ((mostRecentIndex <= 0) || (mostRecentIndex > s_maxInactiveGuildWarsTracked)) return s_inactiveGuildWars; // no new update since we last updated the table if (mostRecentIndex == s_inactiveGuildWarsMostRecentUpdateIndex) return s_inactiveGuildWars; // new update since we last updated the table, recreate the table s_inactiveGuildWarsMostRecentUpdateIndex = mostRecentIndex; std::vector * scriptParamsGuildAName = new std::vector; std::vector * scriptParamsGuildAAbbrev = new std::vector; std::vector * scriptParamsGuildAKillCount = new std::vector; std::vector * scriptParamsGuildBName = new std::vector; std::vector * scriptParamsGuildBAbbrev = new std::vector; std::vector * scriptParamsGuildBKillCount = new std::vector; std::vector * scriptParamsLastUpdated = new std::vector; scriptParamsGuildAName->reserve(s_maxInactiveGuildWarsTracked); scriptParamsGuildAAbbrev->reserve(s_maxInactiveGuildWarsTracked); scriptParamsGuildAKillCount->reserve(s_maxInactiveGuildWarsTracked); scriptParamsGuildBName->reserve(s_maxInactiveGuildWarsTracked); scriptParamsGuildBAbbrev->reserve(s_maxInactiveGuildWarsTracked); scriptParamsGuildBKillCount->reserve(s_maxInactiveGuildWarsTracked); scriptParamsLastUpdated->reserve(s_maxInactiveGuildWarsTracked); // the information is stored as objvars on the master guild object as a circular // list of the 100 most recently ended guild wars with at least 1 kill, so get // each one, ordered by the most recent one first static Unicode::String const delimiters(Unicode::narrowToWide("~")); Unicode::UnicodeStringVector tokens; Unicode::String guildWarData; int currentIndex = mostRecentIndex; while (true) { if (!objVars.getItem(FormattedString<32>().sprintf("%s.%d", s_objvarInactiveGuildWarsPrefix.c_str(), currentIndex), guildWarData)) break; if (!Unicode::tokenize(guildWarData, tokens, &delimiters, NULL) || (tokens.size() != 7)) break; scriptParamsGuildAName->push_back(new Unicode::String(tokens[0])); scriptParamsGuildAAbbrev->push_back(new Unicode::String(tokens[1])); scriptParamsGuildAKillCount->push_back(new Unicode::String(tokens[2])); scriptParamsGuildBName->push_back(new Unicode::String(tokens[3])); scriptParamsGuildBAbbrev->push_back(new Unicode::String(tokens[4])); scriptParamsGuildBKillCount->push_back(new Unicode::String(tokens[5])); scriptParamsLastUpdated->push_back(makeCopyOfString(CalendarTime::convertEpochToTimeStringLocal_YYYYMMDDHHMMSS(static_cast(::atol(Unicode::wideToNarrow(tokens[6]).c_str()))).c_str())); --currentIndex; if (currentIndex <= 0) currentIndex = s_maxInactiveGuildWarsTracked; if (currentIndex == mostRecentIndex) break; } delete s_inactiveGuildWars; s_inactiveGuildWars = NULL; if (!scriptParamsGuildAName->empty()) { // column header static const char * s_scriptParamsColumnHeadersText[7] = { "Name - Guild A", "Abbrev - Guild A", "Kill Count - Guild A", "Name - Guild B", "Abbrev - Guild B", "Kill Count - Guild B", "Time Ended" }; static std::vector s_scriptParamsColumnHeaders(s_scriptParamsColumnHeadersText, s_scriptParamsColumnHeadersText + (sizeof(s_scriptParamsColumnHeadersText) / sizeof(const char *))); // column type static const char * s_scriptParamsColumnTypeText[7] = { "text", "text", "integer", "text", "text", "integer", "text" }; static std::vector s_scriptParamsColumnType(s_scriptParamsColumnTypeText, s_scriptParamsColumnTypeText + (sizeof(s_scriptParamsColumnTypeText) / sizeof(const char *))); s_inactiveGuildWars = new ScriptParams(); s_inactiveGuildWars->addParam(s_scriptParamsColumnHeaders, "column", false); s_inactiveGuildWars->addParam(s_scriptParamsColumnType, "columnType", false); s_inactiveGuildWars->addParam(*scriptParamsGuildAName, "column0", true); s_inactiveGuildWars->addParam(*scriptParamsGuildAAbbrev, "column1", true); s_inactiveGuildWars->addParam(*scriptParamsGuildAKillCount, "column2", true); s_inactiveGuildWars->addParam(*scriptParamsGuildBName, "column3", true); s_inactiveGuildWars->addParam(*scriptParamsGuildBAbbrev, "column4", true); s_inactiveGuildWars->addParam(*scriptParamsGuildBKillCount, "column5", true); s_inactiveGuildWars->addParam(*scriptParamsLastUpdated, "column6", true); } else { delete scriptParamsGuildAName; delete scriptParamsGuildAAbbrev; delete scriptParamsGuildAKillCount; delete scriptParamsGuildBName; delete scriptParamsGuildBAbbrev; delete scriptParamsGuildBKillCount; delete scriptParamsLastUpdated; } return s_inactiveGuildWars; } // ---------------------------------------------------------------------- bool GuildInterface::isValidGuildName(std::string const &guildName) { if (guildName.empty() || guildName.length() > 25) return false; // TODO RAD: add obscenity checking here return true; } // ---------------------------------------------------------------------- bool GuildInterface::isValidGuildAbbrev(std::string const &guildAbbrev) { if (guildAbbrev.length() > 5) return false; return isValidGuildName(guildAbbrev); } // ---------------------------------------------------------------------- int GuildInterface::createGuild(std::string const &guildName, std::string const &guildAbbrev) { if (!isValidGuildName(guildName) || !isValidGuildAbbrev(guildAbbrev)) return 0; int guildId = ServerUniverse::getInstance().getMasterGuildObject()->createGuild(guildName, guildAbbrev); Chat::requestGetChannel(getChatRoomPath(guildId), false, true, s_guildChannelLimit); return guildId; } // ---------------------------------------------------------------------- void GuildInterface::disbandGuild(int guildId) { Chat::requestDestroyChannel(getChatRoomPath(guildId)); ServerUniverse::getInstance().getMasterGuildObject()->disbandGuild(guildId); } // ---------------------------------------------------------------------- void GuildInterface::removeGuildMember(int guildId, NetworkId const &memberId) { ServerUniverse::getInstance().getMasterGuildObject()->removeGuildMember(guildId, memberId); } // ---------------------------------------------------------------------- void GuildInterface::addGuildCreatorMember(int guildId, NetworkId const &memberId) { ServerUniverse::getInstance().getMasterGuildObject()->addGuildCreatorMember(guildId, memberId, std::string(), std::string(), 0); } // ---------------------------------------------------------------------- void GuildInterface::addGuildSponsorMember(int guildId, NetworkId const &memberId) { ServerUniverse::getInstance().getMasterGuildObject()->addGuildSponsorMember(guildId, memberId, std::string(), std::string(), 0); } // ---------------------------------------------------------------------- void GuildInterface::setGuildMemberPermission(int guildId, NetworkId const &memberId, int permissions) { ServerUniverse::getInstance().getMasterGuildObject()->setGuildMemberPermission(guildId, memberId, permissions); } // ---------------------------------------------------------------------- void GuildInterface::setGuildMemberTitle(int guildId, NetworkId const &memberId, std::string const &title) { ServerUniverse::getInstance().getMasterGuildObject()->setGuildMemberTitle(guildId, memberId, title); } // ---------------------------------------------------------------------- void GuildInterface::setGuildMemberAllegiance(int guildId, NetworkId const &memberId, NetworkId const &allegiance) { ServerUniverse::getInstance().getMasterGuildObject()->setGuildMemberAllegiance(guildId, memberId, allegiance); } // ---------------------------------------------------------------------- void GuildInterface::setGuildMemberPermissionAndAllegiance(int guildId, NetworkId const &memberId, int permissions, NetworkId const &allegiance) { ServerUniverse::getInstance().getMasterGuildObject()->setGuildMemberPermissionAndAllegiance(guildId, memberId, permissions, allegiance); } // ---------------------------------------------------------------------- void GuildInterface::setGuildMemberProfessionInfo(int guildId, NetworkId const &memberId, std::string const &memberProfessionSkillTemplate, int memberLevel) { ServerUniverse::getInstance().getMasterGuildObject()->setGuildMemberProfessionInfo(guildId, memberId, memberProfessionSkillTemplate, memberLevel); } // ---------------------------------------------------------------------- void GuildInterface::addGuildMemberRank(int guildId, NetworkId const &memberId, std::string const &rankName) { ServerUniverse::getInstance().getMasterGuildObject()->addGuildMemberRank(guildId, memberId, rankName); } // ---------------------------------------------------------------------- void GuildInterface::removeGuildMemberRank(int guildId, NetworkId const &memberId, std::string const &rankName) { ServerUniverse::getInstance().getMasterGuildObject()->removeGuildMemberRank(guildId, memberId, rankName); } // ---------------------------------------------------------------------- bool GuildInterface::hasGuildMemberRank(int guildId, NetworkId const &memberId, std::string const &rankName) { return ServerUniverse::getInstance().getMasterGuildObject()->hasGuildMemberRank(guildId, memberId, rankName); } // ---------------------------------------------------------------------- void GuildInterface::getGuildMemberRank(int guildId, NetworkId const &memberId, std::vector &ranks) { ServerUniverse::getInstance().getMasterGuildObject()->getGuildMemberRank(guildId, memberId, ranks); } // ---------------------------------------------------------------------- void GuildInterface::setGuildLeader(int guildId, NetworkId const &leaderId) { ServerUniverse::getInstance().getMasterGuildObject()->setGuildLeader(guildId, leaderId); } // ---------------------------------------------------------------------- void GuildInterface::setGuildElectionEndTime(int guildId, int electionPreviousEndTime, int electionNextEndTime) { ServerUniverse::getInstance().getMasterGuildObject()->setGuildElectionEndTime(guildId, electionPreviousEndTime, electionNextEndTime); } // ---------------------------------------------------------------------- void GuildInterface::setGuildFaction(int guildId, uint32 guildFaction) { ServerUniverse::getInstance().getMasterGuildObject()->setGuildFaction(guildId, guildFaction); } // ---------------------------------------------------------------------- void GuildInterface::setGuildGcwDefenderRegion(int guildId, std::string const &guildGcwDefenderRegion) { ServerUniverse::getInstance().getMasterGuildObject()->setGuildGcwDefenderRegion(guildId, guildGcwDefenderRegion); } // ---------------------------------------------------------------------- void GuildInterface::setGuildEnemy(int guildId, int enemyId) { ServerUniverse::getInstance().getMasterGuildObject()->setGuildEnemy(guildId, enemyId); } // ---------------------------------------------------------------------- void GuildInterface::removeGuildEnemy(int guildId, int enemyId) { ServerUniverse::getInstance().getMasterGuildObject()->removeGuildEnemy(guildId, enemyId); } // ---------------------------------------------------------------------- void GuildInterface::updateGuildWarKillTracking(CreatureObject const &killer, CreatureObject const &victim) { if (killer.getGuildId() && victim.getGuildId() && killer.getGuildWarEnabled() && victim.getGuildWarEnabled() && hasDeclaredWarAgainst(killer.getGuildId(), victim.getGuildId()) && hasDeclaredWarAgainst(victim.getGuildId(), killer.getGuildId())) { ServerUniverse::getInstance().getMasterGuildObject()->modifyGuildWarKillTracking(killer.getGuildId(), victim.getGuildId(), 1, static_cast(::time(NULL))); } } // ---------------------------------------------------------------------- void GuildInterface::setGuildName(int guildId, std::string const &newName) { ServerUniverse::getInstance().getMasterGuildObject()->setGuildName(guildId, newName); } // ---------------------------------------------------------------------- void GuildInterface::setGuildAbbrev(int guildId, std::string const &newAbbrev) { ServerUniverse::getInstance().getMasterGuildObject()->setGuildAbbrev(guildId, newAbbrev); } // ---------------------------------------------------------------------- void GuildInterface::onGuildIdSet(CreatureObject const &who) { int const guildId = who.getGuildId(); NetworkId const & whoId = who.getNetworkId(); std::string const objectName = Unicode::wideToNarrow(who.getAssignedObjectName()); GuildMemberInfo const * const memberInfo = ServerUniverse::getInstance().getMasterGuildObject()->getGuildMemberInfo(guildId, whoId); if (memberInfo) { bool const fixName = (!objectName.empty() && (memberInfo->m_name != objectName)); bool const fixGuildLeaderPermissions = ((getGuildLeaderId(guildId) == whoId) && ((memberInfo->m_permissions & GuildInterface::AllAdministrativePermissions) != GuildInterface::AllAdministrativePermissions)); WARNING(fixName, ("Fixing guild (%d) member (%s) name (%s) which doesn't match object name (%s)", guildId, whoId.getValueString().c_str(), memberInfo->m_name.c_str(), objectName.c_str())); WARNING(fixGuildLeaderPermissions, ("Fixing guild (%d) leader (%s) permission from (%d) to (%d)", guildId, whoId.getValueString().c_str(), memberInfo->m_permissions, (memberInfo->m_permissions | GuildInterface::AllAdministrativePermissions))); if (fixName || fixGuildLeaderPermissions) { ServerUniverse::getInstance().getMasterGuildObject()->setGuildMemberNameAndPermision( guildId, whoId, (fixName ? objectName : memberInfo->m_name), (fixGuildLeaderPermissions ? (memberInfo->m_permissions | GuildInterface::AllAdministrativePermissions) : memberInfo->m_permissions)); } } else if ((getGuildLeaderId(guildId) == whoId) && !objectName.empty()) { // handle the case where a guild leader somehow // is no longer a member of the guild WARNING(true, ("Guild (%d) leader (%s, %s) is currently not a guild member, so making the guild leader a guild member", guildId, whoId.getValueString().c_str(), objectName.c_str())); addGuildCreatorMember(guildId, whoId); } enterGuildChatRoom(who); enterGuildVoiceChatRoom(who); } // ---------------------------------------------------------------------- void GuildInterface::onAboutToClearGuildId(CreatureObject const &who) { leaveGuildChatRoom(who); } // ---------------------------------------------------------------------- void GuildInterface::verifyGuildMemberName(NetworkId const &memberId, std::string const &memberName) { int guildId = getGuildId(memberId); if (guildId <= 0) guildId = getGuildIdForSponsored(memberId); if (guildId <= 0) return; GuildMemberInfo const * const memberInfo = getGuildMemberInfo(guildId, memberId); if (!memberInfo) return; if (memberInfo->m_name == memberName) return; ServerUniverse::getInstance().getMasterGuildObject()->setGuildMemberNameAndPermision( guildId, memberId, memberName, memberInfo->m_permissions); } // ---------------------------------------------------------------------- void GuildInterface::enterGuildChatRoom(CreatureObject const &who) { int guildId = who.getGuildId(); if (guildId) { Chat::createRoom("System", false, getChatRoomPath(guildId), getChatRoomTitle(guildId)); std::string firstName; size_t pos = 0; IGNORE_RETURN(Unicode::getFirstToken(Unicode::wideToNarrow(who.getObjectName()), 0, pos, firstName)); Chat::invite(firstName, getChatRoomPath(guildId)); Chat::enterRoom(firstName, getChatRoomPath(guildId), false, false); } } // ---------------------------------------------------------------------- void GuildInterface::reenterGuildChatRoom(CreatureObject const &who) { int guildId = who.getGuildId(); if (guildId) { std::string firstName; size_t pos = 0; IGNORE_RETURN(Unicode::getFirstToken(Unicode::wideToNarrow(who.getObjectName()), 0, pos, firstName)); std::string const guildChatRoomPath = getChatRoomPath(guildId); Chat::exitRoom(firstName, guildChatRoomPath); Chat::uninvite(firstName, guildChatRoomPath); Chat::invite(firstName, guildChatRoomPath); Chat::enterRoom(firstName, guildChatRoomPath, false, false); } } // ---------------------------------------------------------------------- void GuildInterface::enterGuildVoiceChatRoom(CreatureObject const &who) { int guildId = who.getGuildId(); if (guildId) { std::string firstName; size_t pos = 0; IGNORE_RETURN(Unicode::getFirstToken(Unicode::wideToNarrow(who.getObjectName()), 0, pos, firstName)); std::string roomPath = getChatRoomPath(guildId); PendingChannelAddMap::iterator entryItr = s_pendingChannelAdds.find(roomPath); if(entryItr == s_pendingChannelAdds.end()) //not currently pending { Chat::requestGetChannel(roomPath, false, true, s_guildChannelLimit); s_pendingChannelAdds[roomPath].insert(std::make_pair(firstName, who.getNetworkId())); //DEBUG_WARNING(true,("Created channel and differed add for %s %s %s", roomPath.c_str(), who.getNetworkId().getValueString().c_str(), firstName.c_str())); } else //already have a request out { entryItr->second[firstName] = who.getNetworkId(); //DEBUG_WARNING(true,("added differed add for %s %s %s", roomPath.c_str(), who.getNetworkId().getValueString().c_str(), firstName.c_str())); } } } // ---------------------------------------------------------------------- void GuildInterface::leaveGuildChatRoom(CreatureObject const &who) { int guildId = who.getGuildId(); if (guildId) { std::string firstName; size_t pos = 0; IGNORE_RETURN(Unicode::getFirstToken(Unicode::wideToNarrow(who.getObjectName()), 0, pos, firstName)); Chat::exitRoom(firstName, getChatRoomPath(guildId)); Chat::uninvite(firstName, getChatRoomPath(guildId)); } } // ---------------------------------------------------------------------- void GuildInterface::leaveGuildVoiceChatRoom(NetworkId const & playerNetworkId, std::string const & firstName, int guildId) { PendingChannelAddMap::iterator channelAddList = s_pendingChannelAdds.find(getChatRoomPath(guildId)); if(channelAddList != s_pendingChannelAdds.end()) { PendingChannelAddList::iterator creatureEntry = channelAddList->second.find(firstName); if(creatureEntry != channelAddList->second.end()) { channelAddList->second.erase(creatureEntry); } } Chat::requestRemoveClientFromChannel(playerNetworkId, firstName, getChatRoomPath(guildId)); } // ---------------------------------------------------------------------- void GuildInterface::sendGuildChat(CreatureObject const &who, Unicode::String const &text) { int guildId = who.getGuildId(); if (guildId) { std::string firstName; size_t pos = 0; IGNORE_RETURN(Unicode::getFirstToken(Unicode::wideToNarrow(who.getObjectName()), 0, pos, firstName)); Chat::sendToRoom(firstName, getChatRoomPath(guildId), text, Unicode::String()); } } // --------------------------------------------------------------------- void GuildInterface::onChatRoomCreate(std::string const &path) { std::string const &prefix = getChatRoomPrefix(); if (!path.compare(0, prefix.length(), prefix)) { int guildId = atoi(path.c_str()+prefix.length()); if (guildId) { std::vector players; GameServer::getInstance().getObjectsWithClients(players); for (std::vector::const_iterator i = players.begin(); i != players.end(); ++i) { if ((*i)->isAuthoritative() && (*i)->isPlayerControlled()) { CreatureObject const *playerCreature = (*i)->asCreatureObject(); if (playerCreature && playerCreature->getGuildId() == guildId) enterGuildChatRoom(*playerCreature); } } } } } void GuildInterface::onVoiceChatRoomCreate(std::string const &roomPath) { //DEBUG_WARNING(true, ("onVoiceChatRoomCreate path %s", roomPath.c_str())); PendingChannelAddMap::iterator entry = s_pendingChannelAdds.find(roomPath); if(entry != s_pendingChannelAdds.end()) { std::string const & path = entry->first; PendingChannelAddList const & pendingAdds = entry->second; for(PendingChannelAddList::const_iterator i = pendingAdds.begin(); i != pendingAdds.end(); ++i) { //DEBUG_WARNING(true,("Requesting add for %s %s %s", path.c_str(), i->second.getValueString().c_str(), i->first.c_str())); Chat::requestAddClientToChannel(i->second, i->first, path, true); } s_pendingChannelAdds.erase(entry); } } // ---------------------------------------------------------------------- void GuildInterface::createAllGuildChatRooms() { std::set guildIds; std::vector players; GameServer::getInstance().getObjectsWithClients(players); for (std::vector::const_iterator i = players.begin(); i != players.end(); ++i) { if ((*i)->isAuthoritative() && (*i)->isPlayerControlled()) { CreatureObject const *playerCreature = (*i)->asCreatureObject(); if (playerCreature && playerCreature->getGuildId()) IGNORE_RETURN(guildIds.insert(playerCreature->getGuildId())); } } for (std::set::const_iterator j = guildIds.begin(); j != guildIds.end(); ++j) { Chat::createRoom("System", false, getChatRoomPath(*j), getChatRoomTitle(*j)); //TODO: temporary separation of voice and text, this should be rolled into the createRoom call above //We create the chat room when a guild member logs in, it will save us $$ to not //create it here. //Chat::requestGetChannel(getVoiceChatRoomPath(*j), false, false); } } // ---------------------------------------------------------------------- // returns the number of guild members, guild name, and guild abbrev that the // mail was sent to or -1 if insufficient permission to send mail to guild members std::pair > GuildInterface::mailToGuild(CreatureObject const &who, Unicode::String const &subject, Unicode::String const &message, Unicode::String const &oob) { int count = -1; std::string guildName, guildAbbrev; int const guildId = who.getGuildId(); GuildInfo const * const gi = ServerUniverse::getInstance().getMasterGuildObject()->getGuildInfo(guildId); if (gi) { GuildMemberInfo const * const mailerInfo = ServerUniverse::getInstance().getMasterGuildObject()->getGuildMemberInfo(guildId, who.getNetworkId()); if (mailerInfo && ((mailerInfo->m_permissions & GuildInterface::Mail) || (gi->m_leaderId == who.getNetworkId()))) { guildName = gi->m_name; guildAbbrev = gi->m_abbrev; count = 0; std::vector memberIds; ServerUniverse::getInstance().getMasterGuildObject()->getGuildMemberIds(guildId, memberIds); for (std::vector::const_iterator i = memberIds.begin(); i != memberIds.end(); ++i) { GuildMemberInfo const * const memberInfo = ServerUniverse::getInstance().getMasterGuildObject()->getGuildMemberInfo(guildId, *i); if (memberInfo && (memberInfo->m_permissions & GuildInterface::Member)) { Chat::sendPersistentMessage(Unicode::wideToNarrow(who.getEncodedObjectName()), memberInfo->m_name, subject, message, oob); ++count; } } } } return std::make_pair(count, std::make_pair(guildName, guildAbbrev)); } // ---------------------------------------------------------------------- // returns the number of guild members, guild name, and guild abbrev that the // mail was sent to or -1 if insufficient permission to send mail to guild members std::pair > GuildInterface::mailToGuild(int guildId, Unicode::String const &subject, Unicode::String const &message, Unicode::String const &oob) { int count = -1; std::string guildName, guildAbbrev; GuildInfo const * const gi = ServerUniverse::getInstance().getMasterGuildObject()->getGuildInfo(guildId); if (gi) { guildName = gi->m_name; guildAbbrev = gi->m_abbrev; count = 0; std::vector memberIds; ServerUniverse::getInstance().getMasterGuildObject()->getGuildMemberIds(guildId, memberIds); for (std::vector::const_iterator i = memberIds.begin(); i != memberIds.end(); ++i) { GuildMemberInfo const * const memberInfo = ServerUniverse::getInstance().getMasterGuildObject()->getGuildMemberInfo(guildId, *i); if (memberInfo && (memberInfo->m_permissions & GuildInterface::Member)) { Chat::sendPersistentMessage(guildName, memberInfo->m_name, subject, message, oob); ++count; } } } return std::make_pair(count, std::make_pair(guildName, guildAbbrev)); } // ---------------------------------------------------------------------- // returns the number of guild members, guild name, and guild abbrev that the // mail was sent to or -1 if insufficient permission to send mail to guild members std::pair > GuildInterface::mailToGuildRank(CreatureObject const &who, int guildRankSlotId, Unicode::String const &subject, Unicode::String const &message, Unicode::String const &oob) { int count = -1; std::string guildName, guildAbbrev; int const guildId = who.getGuildId(); GuildInfo const * const gi = ServerUniverse::getInstance().getMasterGuildObject()->getGuildInfo(guildId); if (gi) { GuildMemberInfo const * const mailerInfo = ServerUniverse::getInstance().getMasterGuildObject()->getGuildMemberInfo(guildId, who.getNetworkId()); if (mailerInfo && ((mailerInfo->m_permissions & GuildInterface::Mail) || (gi->m_leaderId == who.getNetworkId()))) { guildName = gi->m_name; guildAbbrev = gi->m_abbrev; count = 0; std::vector memberIds; ServerUniverse::getInstance().getMasterGuildObject()->getGuildMemberIds(guildId, memberIds); for (std::vector::const_iterator i = memberIds.begin(); i != memberIds.end(); ++i) { GuildMemberInfo const * const memberInfo = ServerUniverse::getInstance().getMasterGuildObject()->getGuildMemberInfo(guildId, *i); if (memberInfo && (memberInfo->m_permissions & GuildInterface::Member) && memberInfo->m_rank.testBit(guildRankSlotId)) { Chat::sendPersistentMessage(Unicode::wideToNarrow(who.getEncodedObjectName()), memberInfo->m_name, subject, message, oob); ++count; } } } } return std::make_pair(count, std::make_pair(guildName, guildAbbrev)); } // ======================================================================