bool Guild::Create(Player* leader, std::string gname) { if (sGuildMgr.GetGuildByName(gname)) { return false; } WorldSession* lSession = leader->GetSession(); if (!lSession) { return false; } m_LeaderGuid = leader->GetObjectGuid(); m_Name = gname; GINFO.clear(); MOTD = "No message set."; m_Id = sObjectMgr.GenerateGuildId(); // creating data time_t now = time(0); tm local = *(localtime(&now)); // dereference and assign m_CreatedDay = local.tm_mday; m_CreatedMonth = local.tm_mon + 1; m_CreatedYear = local.tm_year + 1900; DEBUG_LOG("GUILD: creating guild %s to leader: %s", gname.c_str(), m_LeaderGuid.GetString().c_str()); // gname already assigned to Guild::name, use it to encode string for DB CharacterDatabase.escape_string(gname); std::string dbGINFO = GINFO; std::string dbMOTD = MOTD; CharacterDatabase.escape_string(dbGINFO); CharacterDatabase.escape_string(dbMOTD); CharacterDatabase.BeginTransaction(); // CharacterDatabase.PExecute("DELETE FROM guild WHERE guildid='%u'", Id); - MAX(guildid)+1 not exist CharacterDatabase.PExecute("DELETE FROM guild_member WHERE guildid='%u'", m_Id); CharacterDatabase.PExecute("INSERT INTO guild (guildid,name,leaderguid,info,motd,createdate,EmblemStyle,EmblemColor,BorderStyle,BorderColor,BackgroundColor) " "VALUES('%u','%s','%u', '%s', '%s','" UI64FMTD "','%u','%u','%u','%u','%u')", m_Id, gname.c_str(), m_LeaderGuid.GetCounter(), dbGINFO.c_str(), dbMOTD.c_str(), uint64(now), m_EmblemStyle, m_EmblemColor, m_BorderStyle, m_BorderColor, m_BackgroundColor); CharacterDatabase.CommitTransaction(); CreateDefaultGuildRanks(lSession->GetSessionDbLocaleIndex()); // Used by Eluna #ifdef ENABLE_ELUNA sEluna->OnCreate(this, leader, gname.c_str()); #endif /* ENABLE_ELUNA */ return AddMember(m_LeaderGuid, (uint32)GR_GUILDMASTER); }
bool Guild::Create(Player* leader, std::string gname) { if (sGuildMgr.GetGuildByName(gname)) return false; WorldSession* lSession = leader->GetSession(); if (!lSession) return false; m_LeaderGuid = leader->GetObjectGuid(); m_Name = gname; GINFO = ""; MOTD = "No message set."; m_Id = sObjectMgr.GenerateGuildId(); m_CreatedDate = time(0); DEBUG_LOG("GUILD: creating guild %s to leader: %s", gname.c_str(), m_LeaderGuid.GetString().c_str()); // gname already assigned to Guild::name, use it to encode string for DB CharacterDatabase.escape_string(gname); std::string dbGINFO = GINFO; std::string dbMOTD = MOTD; CharacterDatabase.escape_string(dbGINFO); CharacterDatabase.escape_string(dbMOTD); CharacterDatabase.BeginTransaction(); // CharacterDatabase.PExecute("DELETE FROM guild WHERE guildid='%u'", Id); - MAX(guildid)+1 not exist CharacterDatabase.PExecute("DELETE FROM guild_member WHERE guildid='%u'", m_Id); CharacterDatabase.PExecute("INSERT INTO guild (guildid,name,leaderguid,info,motd,createdate,EmblemStyle,EmblemColor,BorderStyle,BorderColor,BackgroundColor) " "VALUES('%u','%s','%u', '%s', '%s','" UI64FMTD "','%u','%u','%u','%u','%u')", m_Id, gname.c_str(), m_LeaderGuid.GetCounter(), dbGINFO.c_str(), dbMOTD.c_str(), uint64(m_CreatedDate), m_EmblemStyle, m_EmblemColor, m_BorderStyle, m_BorderColor, m_BackgroundColor); CharacterDatabase.CommitTransaction(); CreateDefaultGuildRanks(lSession->GetSessionDbLocaleIndex()); return AddMember(m_LeaderGuid, (uint32)GR_GUILDMASTER); }
bool Guild::LoadRanksFromDB(QueryResult* guildRanksResult) { if (!guildRanksResult) { sLog.outError("Guild %u has broken `guild_rank` data, creating new...", m_Id); CreateDefaultGuildRanks(0); return true; } Field* fields; bool broken_ranks = false; // GUILD RANKS are sequence starting from 0 = GUILD_MASTER (ALL PRIVILEGES) to max 9 (lowest privileges) // the lower rank id is considered higher rank - so promotion does rank-- and demotion does rank++ // between ranks in sequence can not be gaps - so 0,1,2,4 can not be // min ranks count is 5 and max is 10. do { fields = guildRanksResult->Fetch(); // condition that would be true when all ranks in QueryResult will be processed and guild without ranks is being processed if (!fields) { break; } uint32 guildId = fields[0].GetUInt32(); if (guildId < m_Id) { // there is in table guild_rank record which doesn't have guildid in guild table, report error sLog.outErrorDb("Guild %u does not exist but it has a record in guild_rank table, deleting it!", guildId); CharacterDatabase.PExecute("DELETE FROM guild_rank WHERE guildid = '%u'", guildId); continue; } if (guildId > m_Id) // we loaded all ranks for this guild already, break cycle { break; } uint32 rankID = fields[1].GetUInt32(); std::string rankName = fields[2].GetCppString(); uint32 rankRights = fields[3].GetUInt32(); if (rankID != m_Ranks.size()) // guild_rank.ids are sequence 0,1,2,3.. { broken_ranks = true; } // first rank is guildmaster, prevent loss leader rights if (m_Ranks.empty()) { rankRights |= GR_RIGHT_ALL; } AddRank(rankName, rankRights); } while (guildRanksResult->NextRow()); if (m_Ranks.size() < GUILD_RANKS_MIN_COUNT) // if too few ranks, renew them { m_Ranks.clear(); sLog.outError("Guild %u has broken `guild_rank` data, creating new...", m_Id); CreateDefaultGuildRanks(0); // 0 is default locale_idx broken_ranks = false; } // guild_rank have wrong numbered ranks, repair if (broken_ranks) { sLog.outError("Guild %u has broken `guild_rank` data, repairing...", m_Id); CharacterDatabase.BeginTransaction(); CharacterDatabase.PExecute("DELETE FROM guild_rank WHERE guildid='%u'", m_Id); for (size_t i = 0; i < m_Ranks.size(); ++i) { std::string name = m_Ranks[i].Name; uint32 rights = m_Ranks[i].Rights; CharacterDatabase.escape_string(name); CharacterDatabase.PExecute("INSERT INTO guild_rank (guildid,rid,rname,rights) VALUES ('%u', '%u', '%s', '%u')", m_Id, uint32(i), name.c_str(), rights); } CharacterDatabase.CommitTransaction(); } return true; }
bool Guild::LoadRanksFromDB(uint32 GuildId) { Field *fields; // 0 1 2 QueryResult *result = CharacterDatabase.PQuery("SELECT rid,rname,rights FROM guild_rank WHERE guildid = '%u' ORDER BY rid ASC", GuildId); if (!result) { sLog.outError("Guild %u has broken `guild_rank` data, creating new...",GuildId); CreateDefaultGuildRanks(0); return true; } bool broken_ranks = false; // GUILD RANKS are sequence starting from 0 = GUILD_MASTER (ALL PRIVILEGES) to max 9 (lowest privileges) // the lower rank id is considered higher rank - so promotion does rank-- and demotion does rank++ // between ranks in sequence cannot be gaps - so 0,1,2,4 cannot be // min ranks count is 5 and max is 10. do { fields = result->Fetch(); uint32 rankID = fields[0].GetUInt32(); std::string rankName = fields[1].GetCppString(); uint32 rankRights = fields[2].GetUInt32(); if (rankID != m_Ranks.size()) // guild_rank.ids are sequence 0,1,2,3.. broken_ranks = true; //first rank is guildmaster, prevent loss leader rights if (m_Ranks.empty()) rankRights |= GR_RIGHT_ALL; AddRank(rankName,rankRights); }while( result->NextRow() ); delete result; if (m_Ranks.size() < GUILD_RANKS_MIN_COUNT) // if too few ranks, renew them { m_Ranks.clear(); sLog.outError("Guild %u has broken `guild_rank` data, creating new...",GuildId); CreateDefaultGuildRanks(0); // 0 is default locale_idx broken_ranks = false; } // guild_rank have wrong numbered ranks, repair if (broken_ranks) { sLog.outError("Guild %u has broken `guild_rank` data, repairing...",GuildId); CharacterDatabase.BeginTransaction(); CharacterDatabase.PExecute("DELETE FROM guild_rank WHERE guildid='%u'", GuildId); for(size_t i = 0; i < m_Ranks.size(); ++i) { std::string name = m_Ranks[i].Name; uint32 rights = m_Ranks[i].Rights; CharacterDatabase.escape_string(name); CharacterDatabase.PExecute( "INSERT INTO guild_rank (guildid,rid,rname,rights) VALUES ('%u', '%u', '%s', '%u')", GuildId, uint32(i), name.c_str(), rights); } CharacterDatabase.CommitTransaction(); } return true; }