// adding a member void Guild::AddGuildMember(PlayerInfo* pMember, WorldSession* pClient, int32 ForcedRank /* = -1 */) { //we don't need useless paranoia checks. if(pMember->guild != NULL) return; m_lock.Acquire(); GuildRank* r; if(m_members.size()) { if(ForcedRank > 0) r = m_ranks[ForcedRank]; else if(ForcedRank == -2) r = FindHighestRank(); else r = FindLowestRank(); } else { if(ForcedRank >= 0) r = m_ranks[ForcedRank]; else if(ForcedRank == -2) r = FindHighestRank(); else r = FindLowestRank(); } if(r == NULL) r = FindLowestRank(); if(r == NULL) { // shouldn't happen m_lock.Release(); return; } GuildMember* pm = new GuildMember; memset(pm, 0, sizeof(GuildMember)); pm->pPlayer = pMember; pm->pRank = r; pm->szOfficerNote = pm->szPublicNote = NULL; m_members.insert(make_pair(pMember, pm)); pMember->guild = this; pMember->guildRank = r; pMember->guildMember = pm; if(pMember->m_loggedInPlayer) { pMember->m_loggedInPlayer->SetGuildId(m_guildId); pMember->m_loggedInPlayer->SetGuildRank(r->iId); pMember->m_loggedInPlayer->SendGuildMOTD(); } CharacterDatabase.Execute("INSERT INTO guild_data VALUES(%u, %u, %u, '', '', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)", m_guildId, pMember->guid, r->iId); LogGuildEvent(GUILD_EVENT_JOINED, 1, pMember->name); AddGuildLogEntry(GUILD_LOG_EVENT_JOIN, 1, pMember->guid); m_lock.Release(); }
// adding a member void Guild::AddGuildMember(PlayerInfo * pMember, WorldSession * pClient, int32 ForcedRank /* = -1 */) { if(pMember->guild != NULL) return; if(pClient && pClient->GetPlayer()->m_playerInfo->guild != this) return; if(pClient && !pClient->GetPlayer()->m_playerInfo->guildRank->CanPerformCommand(GR_RIGHT_INVITE)) return; m_lock.Acquire(); GuildRank * r; if(m_members.size()) r = (ForcedRank<=0) ? FindLowestRank() : m_ranks[ForcedRank]; else r = (ForcedRank<0) ? FindLowestRank() : m_ranks[ForcedRank]; if(r==NULL) r=FindLowestRank(); if(r==NULL) { // shouldnt happen m_lock.Release(); return; } GuildMember * pm = new GuildMember; memset(pm, 0, sizeof(GuildMember)); pm->pPlayer = pMember; pm->pRank = r; pm->szOfficerNote = pm->szPublicNote = NULL; m_members.insert(make_pair(pMember, pm)); pMember->guild=this; pMember->guildRank=r; pMember->guildMember=pm; if(pMember->m_loggedInPlayer) { pMember->m_loggedInPlayer->SetGuildId(m_guildId); pMember->m_loggedInPlayer->SetGuildRank(r->iId); } CharacterDatabase.Execute("INSERT INTO guild_data VALUES(%u, %u, %u, '', '', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)", m_guildId, pMember->guid, r->iId); LogGuildEvent(GUILD_EVENT_JOINED, 1, pMember->name); AddGuildLogEntry(GUILD_LOG_EVENT_JOIN, 1, pMember->guid); m_lock.Release(); }
void Guild::RemoveGuildRank(WorldSession * pClient) { m_lock.Acquire(); GuildRank * pLowestRank = FindLowestRank(); if(pLowestRank == NULL || pLowestRank->iId < 5) // cannot delete default ranks. { pClient->SystemMessage("Cannot find a rank to delete."); m_lock.Release(); return; } // check for players that need to be promoted GuildMemberMap::iterator itr = m_members.begin(); for(; itr != m_members.end(); ++itr) { if(itr->second->pRank == pLowestRank) { pClient->SystemMessage("There are still members using this rank. You cannot delete it yet!"); m_lock.Release(); return; } } CharacterDatabase.Execute("DELETE FROM guild_ranks WHERE guildId = %u AND rankId = %u", m_guildId, pLowestRank->iId); m_ranks[pLowestRank->iId] = NULL; delete pLowestRank; m_lock.Release(); }
bool Guild::LoadFromDB(Field * f) { m_guildId = f[0].GetUInt32(); m_guildName = strdup(f[1].GetString()); m_guildLeader = f[2].GetUInt32(); m_emblemStyle = f[3].GetUInt32(); m_emblemColor = f[4].GetUInt32(); m_borderStyle = f[5].GetUInt32(); m_borderColor = f[6].GetUInt32(); m_backgroundColor = f[7].GetUInt32(); m_guildInfo = strlen(f[8].GetString()) ? strdup(f[8].GetString()) : NULL; m_motd = strlen(f[9].GetString()) ? strdup(f[9].GetString()) : NULL; m_creationTimeStamp = f[10].GetUInt32(); m_bankTabCount = f[11].GetUInt32(); m_bankBalance = f[12].GetUInt32(); // load ranks uint32 j; QueryResult * result = CharacterDatabase.Query("SELECT * FROM guild_ranks WHERE guildId = %u ORDER BY rankId ASC", m_guildId); if(result==NULL) return false; uint32 sid = 0; do { GuildRank * r = new GuildRank; Field * f2 = result->Fetch(); r->iId = f2[1].GetUInt32(); if(r->iId!=sid) { Log.Notice("Guild", "Renaming rank %u of guild %s to %u.", r->iId, m_guildName, sid); CharacterDatabase.Execute("UPDATE guild_ranks SET rankId = %u WHERE guildId = %u AND rankName = \"%s\"", r->iId, m_guildId, CharacterDatabase.EscapeString(string(f2[2].GetString())).c_str()); r->iId=sid; } sid++; r->szRankName = strdup(f2[2].GetString()); r->iRights = f2[3].GetUInt32(); r->iGoldLimitPerDay = f2[4].GetUInt32(); for(j = 0; j < MAX_GUILD_BANK_TABS; ++j) { r->iTabPermissions[j].iFlags = f2[5+(j*2)].GetUInt32(); r->iTabPermissions[j].iStacksPerDay = f2[6+(j*2)].GetUInt32(); } //m_ranks.push_back(r); ASSERT(m_ranks[r->iId] == NULL); m_ranks[r->iId] = r; } while(result->NextRow()); delete result; // load members result = CharacterDatabase.Query("SELECT * FROM guild_data WHERE guildid = %u", m_guildId); if(result==NULL) return false; do { Field * f3 = result->Fetch(); GuildMember * gm = new GuildMember; gm->pPlayer = objmgr.GetPlayerInfo(f3[1].GetUInt32()); if(gm->pPlayer == NULL) { delete gm; continue; } if(f3[2].GetUInt32() >= MAX_GUILD_RANKS || m_ranks[f3[2].GetUInt32()] == NULL) { delete gm; continue; } gm->pRank = m_ranks[f3[2].GetUInt32()]; if(gm->pRank==NULL) gm->pRank=FindLowestRank(); gm->pPlayer->guild=this; gm->pPlayer->guildRank=gm->pRank; gm->pPlayer->guildMember=gm; if(strlen(f3[3].GetString())) gm->szPublicNote = strdup(f3[3].GetString()); else gm->szPublicNote = NULL; if(strlen(f3[4].GetString())) gm->szOfficerNote = strdup(f3[4].GetString()); else gm->szOfficerNote = NULL; gm->uLastWithdrawReset = f3[5].GetUInt32(); gm->uWithdrawlsSinceLastReset = f3[6].GetUInt32(); for(j = 0; j < MAX_GUILD_BANK_TABS; ++j) { gm->uLastItemWithdrawReset[j] = f3[7+(j*2)].GetUInt32(); gm->uItemWithdrawlsSinceLastReset[j] = f3[8+(j*2)].GetUInt32(); } m_members.insert(make_pair(gm->pPlayer, gm)); } while(result->NextRow()); delete result; result = CharacterDatabase.Query("SELECT MAX(log_id) FROM guild_logs WHERE guildid = %u", m_guildId); m_hiLogId = 1; if(result != NULL) { m_hiLogId = result->Fetch()[0].GetUInt32() + 1; delete result; } result = CharacterDatabase.Query("SELECT MAX(log_id) FROM guild_banklogs WHERE guildid = %u", m_guildId); if(result) { if((result->Fetch()[0].GetUInt32() + 1) > m_hiLogId) m_hiLogId = result->Fetch()[0].GetUInt32() + 1; delete result; } // load log result = CharacterDatabase.Query("SELECT * FROM guild_logs WHERE guildid = %u ORDER BY timestamp ASC", m_guildId); if(result) { do { GuildLogEvent * li = new GuildLogEvent; li->iLogId = result->Fetch()[0].GetUInt32(); li->iEvent = result->Fetch()[3].GetUInt32(); li->iTimeStamp = result->Fetch()[2].GetUInt32(); li->iEventData[0] = result->Fetch()[4].GetUInt32(); li->iEventData[1] = result->Fetch()[5].GetUInt32(); li->iEventData[2] = result->Fetch()[6].GetUInt32(); m_log.push_back(li); } while(result->NextRow()); delete result; } result = CharacterDatabase.Query("SELECT * FROM guild_banktabs WHERE guildId = %u ORDER BY tabId ASC", m_guildId); sid = 0; if(result) { do { if((sid++) != result->Fetch()[1].GetUInt32()) { #ifdef WIN32 MessageBox(0, "Guild bank tabs are out of order!", "Internal error", MB_OK); TerminateProcess(GetCurrentProcess(), 0); return false; #else printf("Guild bank tabs are out of order!\n"); exit(0); #endif } QueryResult * res2 = CharacterDatabase.Query("SELECT * FROM guild_bankitems WHERE guildId = %u AND tabId = %u", m_guildId, result->Fetch()[1].GetUInt32()); GuildBankTab * pTab = new GuildBankTab; pTab->iTabId = (uint8)result->Fetch()[1].GetUInt32(); pTab->szTabName = (strlen(result->Fetch()[2].GetString()) > 0) ? strdup(result->Fetch()[2].GetString()) : NULL; pTab->szTabIcon = (strlen(result->Fetch()[3].GetString()) > 0) ? strdup(result->Fetch()[3].GetString()) : NULL; memset(pTab->pSlots, 0, sizeof(Item*) * MAX_GUILD_BANK_SLOTS); if(res2) { do { //Field *itemfields = objmgr.GetCachedItem(res2->Fetch()[3].GetUInt32()); //Item * pItem = (itemfields == NULL) ? NULL : objmgr.LoadItem(itemfields); Item * pItem = objmgr.LoadItem(res2->Fetch()[3].GetUInt64()); if(pItem == NULL) { printf("Deleting guildbank item for invalid item %u (%u)\n", GetGuildId(), res2->Fetch()[3].GetUInt32()); CharacterDatabase.Execute("DELETE FROM guild_bankitems WHERE itemGuid = %u AND guildId = %u AND tabId = %u", res2->Fetch()[3].GetUInt32(), m_guildId, (uint32)pTab->iTabId); continue; } pTab->pSlots[res2->Fetch()[2].GetUInt32()] = pItem; } while (res2->NextRow()); delete res2; } res2 = CharacterDatabase.Query("SELECT * FROM guild_banklogs WHERE guildid = %u AND tabid = %u ORDER BY timestamp ASC", m_guildId, result->Fetch()[1].GetUInt32()); if(res2 != NULL) { do { GuildBankEvent * ev= new GuildBankEvent; ev->iLogId=res2->Fetch()[0].GetUInt32(); ev->iAction=res2->Fetch()[3].GetUInt8(); ev->uPlayer=res2->Fetch()[4].GetUInt32(); ev->uEntry=res2->Fetch()[5].GetUInt32(); ev->iStack=res2->Fetch()[6].GetUInt8(); ev->uTimeStamp=res2->Fetch()[7].GetUInt32(); pTab->lLog.push_back(ev); } while (res2->NextRow()); delete res2; } m_bankTabs.push_back(pTab); } while (result->NextRow()); delete result; } result = CharacterDatabase.Query("SELECT * FROM guild_banklogs WHERE guildid = %u AND tabid = 6 ORDER BY timestamp ASC", m_guildId); if(result != NULL) { do { GuildBankEvent * ev= new GuildBankEvent; ev->iLogId=result->Fetch()[0].GetUInt32(); ev->iAction=result->Fetch()[3].GetUInt8(); ev->uPlayer=result->Fetch()[4].GetUInt32(); ev->uEntry=result->Fetch()[5].GetUInt32(); ev->iStack=result->Fetch()[6].GetUInt8(); ev->uTimeStamp=result->Fetch()[7].GetUInt32(); m_moneyLog.push_back(ev); } while (result->NextRow()); delete result; } Log.Debug("Guild", "Loaded guild %s, %u members.", m_guildName, m_members.size()); return true; }