Ported .Net Core commits:

hondacrx:
- Initial commit: Switch to .Net Core 2.0
- Fix build and removed not needed files
Fabi:
- Updated solution platforms.
- Changed folder structure.
- Change library target framework to netstandard2.0.
- Updated solution platforms again...
- Removed windows specific kernel32 function usage (Ctrl-C handler).
This commit is contained in:
Fabian
2017-10-26 17:23:44 +02:00
parent 227702e19c
commit a3dc7b3f48
844 changed files with 26064 additions and 1824 deletions
File diff suppressed because it is too large Load Diff
+512
View File
@@ -0,0 +1,512 @@
/*
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using Framework.Constants;
using Framework.Database;
using Game.DataStorage;
using Game.Entities;
using Game.Network.Packets;
using System;
using System.Collections.Generic;
namespace Game.Guilds
{
public class GuildFinderManager : Singleton<GuildFinderManager>
{
GuildFinderManager() { }
public void LoadFromDB()
{
LoadGuildSettings();
LoadMembershipRequests();
}
void LoadGuildSettings()
{
Log.outInfo(LogFilter.ServerLoading, "Loading guild finder guild-related settings...");
// 0 1 2 3 4 5 6 7
SQLResult result = DB.Characters.Query("SELECT gfgs.guildId, gfgs.availability, gfgs.classRoles, gfgs.interests, gfgs.level, gfgs.listed, gfgs.comment, c.race " +
"FROM guild_finder_guild_settings gfgs LEFT JOIN guild_member gm ON gm.guildid=gfgs.guildId LEFT JOIN characters c ON c.guid = gm.guid LIMIT 1");
if (result.IsEmpty())
{
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 guild finder guild-related settings. Table `guild_finder_guild_settings` is empty.");
return;
}
uint count = 0;
uint oldMSTime = Time.GetMSTime();
do
{
ObjectGuid guildId = ObjectGuid.Create(HighGuid.Guild, result.Read<ulong>(0));
byte availability = result.Read<byte>(1);
byte classRoles = result.Read<byte>(2);
byte interests = result.Read<byte>(3);
byte level = result.Read<byte>(4);
bool listed = (result.Read<byte>(5) != 0);
string comment = result.Read<string>(6);
uint guildTeam = TeamId.Alliance;
ChrRacesRecord raceEntry = CliDB.ChrRacesStorage.LookupByKey(result.Read<byte>(7));
if (raceEntry != null)
if (raceEntry.TeamID == 1)
guildTeam = TeamId.Horde;
LFGuildSettings settings = new LFGuildSettings(listed, guildTeam, guildId, classRoles, availability, interests, level, comment);
_guildSettings[guildId] = settings;
++count;
} while (result.NextRow());
Log.outInfo(LogFilter.ServerLoading, "Loaded {0} guild finder guild-related settings in {1} ms.", count, Time.GetMSTimeDiffToNow(oldMSTime));
}
void LoadMembershipRequests()
{
Log.outInfo(LogFilter.ServerLoading, "Loading guild finder membership requests...");
// 0 1 2 3 4 5 6
SQLResult result = DB.Characters.Query("SELECT guildId, playerGuid, availability, classRole, interests, comment, submitTime FROM guild_finder_applicant");
if (result.IsEmpty())
{
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 guild finder membership requests. Table `guild_finder_applicant` is empty.");
return;
}
uint count = 0;
uint oldMSTime = Time.GetMSTime();
do
{
ObjectGuid guildId = ObjectGuid.Create(HighGuid.Guild, result.Read<ulong>(0));
ObjectGuid playerId = ObjectGuid.Create(HighGuid.Player, result.Read<ulong>(1));
byte availability = result.Read<byte>(2);
byte classRoles = result.Read<byte>(3);
byte interests = result.Read<byte>(4);
string comment = result.Read<string>(5);
uint submitTime = result.Read<uint>(6);
MembershipRequest request = new MembershipRequest(playerId, guildId, availability, classRoles, interests, comment, submitTime);
if (!_membershipRequestsByGuild.ContainsKey(guildId))
_membershipRequestsByGuild[guildId] = new Dictionary<ObjectGuid, MembershipRequest>();
if (!_membershipRequestsByPlayer.ContainsKey(playerId))
_membershipRequestsByPlayer[playerId] = new Dictionary<ObjectGuid, MembershipRequest>();
_membershipRequestsByGuild[guildId][playerId] = request;
_membershipRequestsByPlayer[playerId][guildId] = request;
++count;
} while (result.NextRow());
Log.outInfo(LogFilter.ServerLoading, "Loaded {0} guild finder membership requests in {1} ms.", count, Time.GetMSTimeDiffToNow(oldMSTime));
}
public void AddMembershipRequest(ObjectGuid guildGuid, MembershipRequest request)
{
_membershipRequestsByGuild[guildGuid][request.GetPlayerGUID()] = request;
_membershipRequestsByPlayer[request.GetPlayerGUID()][guildGuid] = request;
SQLTransaction trans = new SQLTransaction();
PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.REP_GUILD_FINDER_APPLICANT);
stmt.AddValue(0, request.GetGuildGuid());
stmt.AddValue(1, request.GetPlayerGUID());
stmt.AddValue(2, request.GetAvailability());
stmt.AddValue(3, request.GetClassRoles());
stmt.AddValue(4, request.GetInterests());
stmt.AddValue(5, request.GetComment());
stmt.AddValue(6, request.GetSubmitTime());
trans.Append(stmt);
DB.Characters.CommitTransaction(trans);
// Notify the applicant his submittion has been added
Player player = Global.ObjAccessor.FindPlayer(request.GetPlayerGUID());
if (player)
SendMembershipRequestListUpdate(player);
// Notify the guild master and officers the list changed
Guild guild = Global.GuildMgr.GetGuildById(guildGuid.GetCounter());
if (guild)
SendApplicantListUpdate(guild);
}
public void RemoveAllMembershipRequestsFromPlayer(ObjectGuid playerId)
{
var playerDic = _membershipRequestsByPlayer.LookupByKey(playerId);
if (playerDic == null)
return;
SQLTransaction trans = new SQLTransaction();
foreach (var guid in playerDic.Keys)
{
PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.DEL_GUILD_FINDER_APPLICANT);
stmt.AddValue(0, guid.GetCounter());
stmt.AddValue(1, playerId.GetCounter());
trans.Append(stmt);
// Notify the guild master and officers the list changed
Guild guild = Global.GuildMgr.GetGuildByGuid(guid);
if (guild)
SendApplicantListUpdate(guild);
if (!_membershipRequestsByGuild.ContainsKey(guid))
continue;
var guildDic = _membershipRequestsByGuild[guid];
guildDic.Remove(playerId);
if (guildDic.Empty())
_membershipRequestsByGuild.Remove(guid);
}
DB.Characters.CommitTransaction(trans);
_membershipRequestsByPlayer.Remove(playerId);
}
public void RemoveMembershipRequest(ObjectGuid playerId, ObjectGuid guildId)
{
if (_membershipRequestsByGuild.ContainsKey(guildId))
{
var guildDic = _membershipRequestsByGuild[guildId];
guildDic.Remove(playerId);
if (guildDic.Empty())
_membershipRequestsByGuild.Remove(guildId);
}
var playerDic = _membershipRequestsByPlayer.LookupByKey(playerId);
if (playerDic != null)
{
playerDic.Remove(guildId);
if (playerDic.Empty())
_membershipRequestsByPlayer.Remove(playerId);
}
SQLTransaction trans = new SQLTransaction();
PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.DEL_GUILD_FINDER_APPLICANT);
stmt.AddValue(0, guildId.GetCounter());
stmt.AddValue(1, playerId.GetCounter());
trans.Append(stmt);
DB.Characters.CommitTransaction(trans);
// Notify the applicant his submittion has been removed
Player player = Global.ObjAccessor.FindPlayer(playerId);
if (player)
SendMembershipRequestListUpdate(player);
// Notify the guild master and officers the list changed
Guild guild = Global.GuildMgr.GetGuildByGuid(guildId);
if (guild)
SendApplicantListUpdate(guild);
}
public List<MembershipRequest> GetAllMembershipRequestsForPlayer(ObjectGuid playerGuid)
{
List<MembershipRequest> resultSet = new List<MembershipRequest>();
var playerDic = _membershipRequestsByPlayer.LookupByKey(playerGuid);
if (playerDic == null)
return resultSet;
foreach (var guildRequestPair in playerDic)
resultSet.Add(guildRequestPair.Value);
return resultSet;
}
public byte CountRequestsFromPlayer(ObjectGuid playerId)
{
return (byte)(_membershipRequestsByPlayer.ContainsKey(playerId) ? _membershipRequestsByPlayer[playerId].Count : 0);
}
public List<LFGuildSettings> GetGuildsMatchingSetting(LFGuildPlayer settings, uint faction)
{
List<LFGuildSettings> resultSet = new List<LFGuildSettings>();
foreach (var guildSettings in _guildSettings.Values)
{
if (!guildSettings.IsListed())
continue;
if (guildSettings.GetTeam() != faction)
continue;
if (!Convert.ToBoolean(guildSettings.GetAvailability() & settings.GetAvailability()))
continue;
if (!Convert.ToBoolean(guildSettings.GetClassRoles() & settings.GetClassRoles()))
continue;
if (!Convert.ToBoolean(guildSettings.GetInterests() & settings.GetInterests()))
continue;
if (!Convert.ToBoolean(guildSettings.GetLevel() & settings.GetLevel()))
continue;
resultSet.Add(guildSettings);
}
return resultSet;
}
public bool HasRequest(ObjectGuid playerId, ObjectGuid guildId)
{
var guildDic = _membershipRequestsByGuild.LookupByKey(guildId);
if (guildDic == null)
return false;
return guildDic.ContainsKey(playerId);
}
public void SetGuildSettings(ObjectGuid guildGuid, LFGuildSettings settings)
{
_guildSettings[guildGuid] = settings;
SQLTransaction trans = new SQLTransaction();
PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.REP_GUILD_FINDER_GUILD_SETTINGS);
stmt.AddValue(0, settings.GetGUID());
stmt.AddValue(1, settings.GetAvailability());
stmt.AddValue(2, settings.GetClassRoles());
stmt.AddValue(3, settings.GetInterests());
stmt.AddValue(4, settings.GetLevel());
stmt.AddValue(5, settings.IsListed());
stmt.AddValue(6, settings.GetComment());
trans.Append(stmt);
DB.Characters.CommitTransaction(trans);
}
public void DeleteGuild(ObjectGuid guildId)
{
SQLTransaction trans = new SQLTransaction();
PreparedStatement stmt;
var guildDic = _membershipRequestsByGuild.LookupByKey(guildId);
if (guildDic != null)
{
foreach (var guid in guildDic.Keys)
{
stmt = DB.Characters.GetPreparedStatement(CharStatements.DEL_GUILD_FINDER_APPLICANT);
stmt.AddValue(0, guildId.GetCounter());
stmt.AddValue(1, guid.GetCounter());
trans.Append(stmt);
if (_membershipRequestsByPlayer.ContainsKey(guid))
{
var playerDic = _membershipRequestsByPlayer.LookupByKey(guid);
playerDic.Remove(guildId);
if (playerDic.Empty())
_membershipRequestsByPlayer.Remove(guid);
}
// Notify the applicant his submition has been removed
Player player = Global.ObjAccessor.FindPlayer(guid);
if (player)
SendMembershipRequestListUpdate(player);
}
}
stmt = DB.Characters.GetPreparedStatement(CharStatements.DEL_GUILD_FINDER_GUILD_SETTINGS);
stmt.AddValue(0, guildId.GetCounter());
trans.Append(stmt);
DB.Characters.CommitTransaction(trans);
_membershipRequestsByGuild.Remove(guildId);
_guildSettings.Remove(guildId);
// Notify the guild master the list changed (even if he's not a GM any more, not sure if needed)
Guild guild = Global.GuildMgr.GetGuildById(guildId.GetCounter());
if (guild)
SendApplicantListUpdate(guild);
}
void SendApplicantListUpdate(Guild guild)
{
LFGuildApplicantListChanged applicantListChanged = new LFGuildApplicantListChanged();
guild.BroadcastPacketToRank(applicantListChanged, GuildDefaultRanks.Officer);
Player player = Global.ObjAccessor.FindPlayer(guild.GetLeaderGUID());
if (player)
player.SendPacket(applicantListChanged);
}
void SendMembershipRequestListUpdate(Player player)
{
player.SendPacket(new LFGuildApplicationsListChanged());
}
public Dictionary<ObjectGuid, MembershipRequest> GetAllMembershipRequestsForGuild(ObjectGuid guildGuid) { return _membershipRequestsByGuild.LookupByKey(guildGuid); }
public LFGuildSettings GetGuildSettings(ObjectGuid guildGuid) { return _guildSettings.LookupByKey(guildGuid); }
Dictionary<ObjectGuid, LFGuildSettings> _guildSettings = new Dictionary<ObjectGuid, LFGuildSettings>();
Dictionary<ObjectGuid, Dictionary<ObjectGuid, MembershipRequest>> _membershipRequestsByGuild = new Dictionary<ObjectGuid, Dictionary<ObjectGuid, MembershipRequest>>();
Dictionary<ObjectGuid, Dictionary<ObjectGuid, MembershipRequest>> _membershipRequestsByPlayer = new Dictionary<ObjectGuid, Dictionary<ObjectGuid, MembershipRequest>>();
}
public class MembershipRequest
{
public MembershipRequest(MembershipRequest settings)
{
_comment = settings.GetComment();
_availability = settings.GetAvailability();
_classRoles = settings.GetClassRoles();
_interests = settings.GetInterests();
_guildId = settings.GetGuildGuid();
_playerGUID = settings.GetPlayerGUID();
_time = settings.GetSubmitTime();
}
public MembershipRequest(ObjectGuid playerGUID, ObjectGuid guildId, uint availability, uint classRoles, uint interests, string comment, long submitTime)
{
_comment = comment;
_guildId = guildId;
_playerGUID = playerGUID;
_availability = (byte)availability;
_classRoles = (byte)classRoles;
_interests = (byte)interests;
_time = submitTime;
}
public MembershipRequest()
{
_time = Time.UnixTime;
}
public ObjectGuid GetGuildGuid() { return _guildId; }
public ObjectGuid GetPlayerGUID() { return _playerGUID; }
public byte GetAvailability() { return _availability; }
public byte GetClassRoles() { return _classRoles; }
public byte GetInterests() { return _interests; }
public long GetSubmitTime() { return _time; }
public long GetExpiryTime() { return _time + 30 * 24 * 3600; } // Adding 30 days
public string GetComment() { return _comment; }
string _comment = "";
ObjectGuid _guildId;
ObjectGuid _playerGUID;
byte _availability;
byte _classRoles;
byte _interests;
long _time;
}
public class LFGuildPlayer
{
public LFGuildPlayer()
{
_guid = ObjectGuid.Empty;
_roles = 0;
_availability = 0;
_interests = 0;
_level = 0;
}
public LFGuildPlayer(ObjectGuid guid, uint role, uint availability, uint interests, uint level)
{
_guid = guid;
_roles = (byte)role;
_availability = (byte)availability;
_interests = (byte)interests;
_level = (byte)level;
}
public LFGuildPlayer(ObjectGuid guid, uint role, uint availability, uint interests, uint level, string comment)
{
_comment = comment;
_guid = guid;
_roles = (byte)role;
_availability = (byte)availability;
_interests = (byte)interests;
_level = (byte)level;
}
public LFGuildPlayer(LFGuildPlayer settings)
{
_comment = settings.GetComment();
_guid = settings.GetGUID();
_roles = settings.GetClassRoles();
_availability = settings.GetAvailability();
_interests = settings.GetInterests();
_level = settings.GetLevel();
}
public ObjectGuid GetGUID() { return _guid; }
public byte GetClassRoles() { return _roles; }
public byte GetAvailability() { return _availability; }
public byte GetInterests() { return _interests; }
public byte GetLevel() { return _level; }
public string GetComment() { return _comment; }
string _comment = "";
ObjectGuid _guid;
byte _roles;
byte _availability;
byte _interests;
byte _level;
}
public class LFGuildSettings : LFGuildPlayer
{
public LFGuildSettings()
{
_listed = false;
_team = TeamId.Alliance;
}
public LFGuildSettings(bool listed, uint team)
{
_listed = listed;
_team = team;
}
public LFGuildSettings(bool listed, uint team, ObjectGuid guid, uint role, uint availability, uint interests, uint level)
: base(guid, role, availability, interests, level)
{
_listed = listed;
_team = team;
}
public LFGuildSettings(bool listed, uint team, ObjectGuid guid, uint role, uint availability, uint interests, uint level, string comment)
: base(guid, role, availability, interests, level, comment)
{
_listed = listed;
_team = team;
}
public LFGuildSettings(LFGuildSettings settings)
: base(settings)
{
_listed = settings.IsListed();
_team = settings.GetTeam();
}
public bool IsListed() { return _listed; }
void SetListed(bool state) { _listed = state; }
public uint GetTeam() { return _team; }
bool _listed;
uint _team;
}
}
+531
View File
@@ -0,0 +1,531 @@
/*
* Copyright (C) 2012-2017 CypherCore <http://github.com/CypherCore>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using Framework.Constants;
using Framework.Database;
using Game.DataStorage;
using Game.Entities;
using Game.Guilds;
using System.Collections.Generic;
using System.Linq;
namespace Game
{
public sealed class GuildManager : Singleton<GuildManager>
{
GuildManager() { }
public void AddGuild(Guild guild)
{
GuildStore[guild.GetId()] = guild;
}
public void RemoveGuild(ulong guildId)
{
GuildStore.Remove(guildId);
}
public void SaveGuilds()
{
foreach (var guild in GuildStore.Values)
guild.SaveToDB();
}
public uint GenerateGuildId()
{
if (NextGuildId >= 0xFFFFFFFE)
{
Log.outError(LogFilter.Guild, "Guild ids overflow!! Can't continue, shutting down server. ");
Global.WorldMgr.StopNow();
}
return NextGuildId++;
}
public Guild GetGuildById(ulong guildId)
{
return GuildStore.LookupByKey(guildId);
}
public Guild GetGuildByGuid(ObjectGuid guid)
{
// Full guids are only used when receiving/sending data to client
// everywhere else guild id is used
if (guid.IsGuild())
{
ulong guildId = guid.GetCounter();
if (guildId != 0)
return GetGuildById(guildId);
}
return null;
}
public Guild GetGuildByName(string guildName)
{
foreach (var guild in GuildStore.Values)
{
if (guildName == guild.GetName())
return guild;
}
return null;
}
public string GetGuildNameById(uint guildId)
{
Guild guild = GetGuildById(guildId);
if (guild != null)
return guild.GetName();
return "";
}
public Guild GetGuildByLeader(ObjectGuid guid)
{
foreach (var guild in GuildStore.Values)
if (guild.GetLeaderGUID() == guid)
return guild;
return null;
}
public void LoadGuilds()
{
Log.outInfo(LogFilter.ServerLoading, "Loading Guilds Definitions...");
{
uint oldMSTime = Time.GetMSTime();
// 0 1 2 3 4 5 6
SQLResult result = DB.Characters.Query("SELECT g.guildid, g.name, g.leaderguid, g.EmblemStyle, g.EmblemColor, g.BorderStyle, g.BorderColor, " +
// 7 8 9 10 11 12
"g.BackgroundColor, g.info, g.motd, g.createdate, g.BankMoney, COUNT(gbt.guildid) " +
"FROM guild g LEFT JOIN guild_bank_tab gbt ON g.guildid = gbt.guildid GROUP BY g.guildid ORDER BY g.guildid ASC");
if (result.IsEmpty())
{
Log.outError(LogFilter.Guild, "Loaded 0 guild definitions. DB table `guild` is empty.");
return;
}
uint count = 0;
do
{
Guild guild = new Guild();
if (!guild.LoadFromDB(result.GetFields()))
continue;
AddGuild(guild);
count++;
} while (result.NextRow());
Log.outInfo(LogFilter.ServerLoading, "Loaded {0} guild definitions in {1} ms", count, Time.GetMSTimeDiffToNow(oldMSTime));
}
Log.outInfo(LogFilter.ServerLoading, "Loading guild ranks...");
{
uint oldMSTime = Time.GetMSTime();
// Delete orphaned guild rank entries before loading the valid ones
DB.Characters.Execute("DELETE gr FROM guild_rank gr LEFT JOIN guild g ON gr.guildId = g.guildId WHERE g.guildId IS NULL");
// 0 1 2 3 4
SQLResult result = DB.Characters.Query("SELECT guildid, rid, rname, rights, BankMoneyPerDay FROM guild_rank ORDER BY guildid ASC, rid ASC");
if (result.IsEmpty())
{
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 guild ranks. DB table `guild_rank` is empty.");
}
else
{
uint count = 0;
do
{
uint guildId = result.Read<uint>(0);
Guild guild = GetGuildById(guildId);
if (guild)
guild.LoadRankFromDB(result.GetFields());
++count;
}
while (result.NextRow());
Log.outInfo(LogFilter.ServerLoading, "Loaded {0} guild ranks in {1} ms", count, Time.GetMSTimeDiffToNow(oldMSTime));
}
}
// 3. Load all guild members
Log.outInfo(LogFilter.ServerLoading, "Loading guild members...");
{
uint oldMSTime = Time.GetMSTime();
// Delete orphaned guild member entries before loading the valid ones
DB.Characters.Execute("DELETE gm FROM guild_member gm LEFT JOIN guild g ON gm.guildId = g.guildId WHERE g.guildId IS NULL");
DB.Characters.Execute("DELETE gm FROM guild_member_withdraw gm LEFT JOIN guild_member g ON gm.guid = g.guid WHERE g.guid IS NULL");
// 0 1 2 3 4 5 6 7 8 9 10
SQLResult result = DB.Characters.Query("SELECT gm.guildid, gm.guid, rank, pnote, offnote, w.tab0, w.tab1, w.tab2, w.tab3, w.tab4, w.tab5, " +
// 11 12 13 14 15 16 17 18 19 20
"w.tab6, w.tab7, w.money, c.name, c.level, c.class, c.gender, c.zone, c.account, c.logout_time " +
"FROM guild_member gm LEFT JOIN guild_member_withdraw w ON gm.guid = w.guid " +
"LEFT JOIN characters c ON c.guid = gm.guid ORDER BY gm.guildid ASC");
if (result.IsEmpty())
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 guild members. DB table `guild_member` is empty.");
else
{
uint count = 0;
do
{
uint guildId = result.Read<uint>(0);
Guild guild = GetGuildById(guildId);
if (guild)
guild.LoadMemberFromDB(result.GetFields());
++count;
}
while (result.NextRow());
Log.outInfo(LogFilter.ServerLoading, "Loaded {0} guild members in {1} ms", count, Time.GetMSTimeDiffToNow(oldMSTime));
}
}
// 4. Load all guild bank tab rights
Log.outInfo(LogFilter.ServerLoading, "Loading bank tab rights...");
{
uint oldMSTime = Time.GetMSTime();
// Delete orphaned guild bank right entries before loading the valid ones
DB.Characters.Execute("DELETE gbr FROM guild_bank_right gbr LEFT JOIN guild g ON gbr.guildId = g.guildId WHERE g.guildId IS NULL");
// 0 1 2 3 4
SQLResult result = DB.Characters.Query("SELECT guildid, TabId, rid, gbright, SlotPerDay FROM guild_bank_right ORDER BY guildid ASC, TabId ASC");
if (result.IsEmpty())
{
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 guild bank tab rights. DB table `guild_bank_right` is empty.");
}
else
{
uint count = 0;
do
{
uint guildId = result.Read<uint>(0);
Guild guild = GetGuildById(guildId);
if (guild)
guild.LoadBankRightFromDB(result.GetFields());
++count;
}
while (result.NextRow());
Log.outInfo(LogFilter.ServerLoading, "Loaded {0} bank tab rights in {1} ms", count, Time.GetMSTimeDiffToNow(oldMSTime));
}
}
// 5. Load all event logs
Log.outInfo(LogFilter.ServerLoading, "Loading guild event logs...");
{
uint oldMSTime = Time.GetMSTime();
DB.Characters.Execute("DELETE FROM guild_eventlog WHERE LogGuid > {0}", GuildConst.EventLogMaxRecords);
// 0 1 2 3 4 5 6
SQLResult result = DB.Characters.Query("SELECT guildid, LogGuid, EventType, PlayerGuid1, PlayerGuid2, NewRank, TimeStamp FROM guild_eventlog ORDER BY TimeStamp DESC, LogGuid DESC");
if (result.IsEmpty())
{
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 guild event logs. DB table `guild_eventlog` is empty.");
}
else
{
uint count = 0;
do
{
uint guildId = result.Read<uint>(0);
Guild guild = GetGuildById(guildId);
if (guild)
guild.LoadEventLogFromDB(result.GetFields());
++count;
}
while (result.NextRow());
Log.outInfo(LogFilter.ServerLoading, "Loaded {0} guild event logs in {1} ms", count, Time.GetMSTimeDiffToNow(oldMSTime));
}
}
// 6. Load all bank event logs
Log.outInfo(LogFilter.ServerLoading, "Loading guild bank event logs...");
{
uint oldMSTime = Time.GetMSTime();
// Remove log entries that exceed the number of allowed entries per guild
DB.Characters.Execute("DELETE FROM guild_bank_eventlog WHERE LogGuid > {0}", GuildConst.BankLogMaxRecords);
// 0 1 2 3 4 5 6 7 8
SQLResult result = DB.Characters.Query("SELECT guildid, TabId, LogGuid, EventType, PlayerGuid, ItemOrMoney, ItemStackCount, DestTabId, TimeStamp FROM guild_bank_eventlog ORDER BY TimeStamp DESC, LogGuid DESC");
if (result.IsEmpty())
{
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 guild bank event logs. DB table `guild_bank_eventlog` is empty.");
}
else
{
uint count = 0;
do
{
uint guildId = result.Read<uint>(0);
Guild guild = GetGuildById(guildId);
if (guild)
guild.LoadBankEventLogFromDB(result.GetFields());
++count;
}
while (result.NextRow());
Log.outInfo(LogFilter.ServerLoading, "Loaded {0} guild bank event logs in {1} ms", count, Time.GetMSTimeDiffToNow(oldMSTime));
}
}
// 7. Load all news event logs
Log.outInfo(LogFilter.ServerLoading, "Loading Guild News...");
{
uint oldMSTime = Time.GetMSTime();
DB.Characters.Execute("DELETE FROM guild_newslog WHERE LogGuid > {0}", GuildConst.NewsLogMaxRecords);
// 0 1 2 3 4 5 6
SQLResult result = DB.Characters.Query("SELECT guildid, LogGuid, EventType, PlayerGuid, Flags, Value, Timestamp FROM guild_newslog ORDER BY TimeStamp DESC, LogGuid DESC");
if (result.IsEmpty())
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 guild event logs. DB table `guild_newslog` is empty.");
else
{
uint count = 0;
do
{
uint guildId = result.Read<uint>(0);
Guild guild = GetGuildById(guildId);
if (guild)
guild.LoadGuildNewsLogFromDB(result.GetFields());
++count;
}
while (result.NextRow());
Log.outInfo(LogFilter.ServerLoading, "Loaded {0} guild new logs in {1} ms", count, Time.GetMSTimeDiffToNow(oldMSTime));
}
}
// 8. Load all guild bank tabs
Log.outInfo(LogFilter.ServerLoading, "Loading guild bank tabs...");
{
uint oldMSTime = Time.GetMSTime();
// Delete orphaned guild bank tab entries before loading the valid ones
DB.Characters.Execute("DELETE gbt FROM guild_bank_tab gbt LEFT JOIN guild g ON gbt.guildId = g.guildId WHERE g.guildId IS NULL");
// 0 1 2 3 4
SQLResult result = DB.Characters.Query("SELECT guildid, TabId, TabName, TabIcon, TabText FROM guild_bank_tab ORDER BY guildid ASC, TabId ASC");
if (result.IsEmpty())
{
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 guild bank tabs. DB table `guild_bank_tab` is empty.");
}
else
{
uint count = 0;
do
{
uint guildId = result.Read<uint>(0);
Guild guild = GetGuildById(guildId);
if (guild)
guild.LoadBankTabFromDB(result.GetFields());
++count;
}
while (result.NextRow());
Log.outInfo(LogFilter.ServerLoading, "Loaded {0} guild bank tabs in {1} ms", count, Time.GetMSTimeDiffToNow(oldMSTime));
}
}
// 9. Fill all guild bank tabs
Log.outInfo(LogFilter.ServerLoading, "Filling bank tabs with items...");
{
uint oldMSTime = Time.GetMSTime();
// Delete orphan guild bank items
DB.Characters.Execute("DELETE gbi FROM guild_bank_item gbi LEFT JOIN guild g ON gbi.guildId = g.guildId WHERE g.guildId IS NULL");
SQLResult result = DB.Characters.Query(DB.Characters.GetPreparedStatement(CharStatements.SEL_GUILD_BANK_ITEMS));
if (result.IsEmpty())
{
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 guild bank tab items. DB table `guild_bank_item` or `item_instance` is empty.");
}
else
{
uint count = 0;
do
{
ulong guildId = result.Read<ulong>(45);
Guild guild = GetGuildById(guildId);
if (guild)
guild.LoadBankItemFromDB(result.GetFields());
++count;
}
while (result.NextRow());
Log.outInfo(LogFilter.ServerLoading, "Loaded {0} guild bank tab items in {1} ms", count, Time.GetMSTimeDiffToNow(oldMSTime));
}
}
// 10. Load guild achievements
Log.outInfo(LogFilter.ServerLoading, "Loading guild achievements...");
{
uint oldMSTime = Time.GetMSTime();
long achievementCount = 0;
long criteriaCount = 0;
SQLResult achievementResult;
SQLResult criteriaResult;
foreach (var pair in GuildStore)
{
PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.SEL_GUILD_ACHIEVEMENT);
stmt.AddValue(0, pair.Key);
achievementResult = DB.Characters.Query(stmt);
stmt = DB.Characters.GetPreparedStatement(CharStatements.SEL_GUILD_ACHIEVEMENT_CRITERIA);
stmt.AddValue(0, pair.Key);
criteriaResult = DB.Characters.Query(stmt);
if (!achievementResult.IsEmpty())
achievementCount += achievementResult.GetRowCount();
if (!criteriaResult.IsEmpty())
criteriaCount += criteriaResult.GetRowCount();
pair.Value.GetAchievementMgr().LoadFromDB(achievementResult, criteriaResult);
}
Log.outInfo(LogFilter.ServerLoading, "Loaded {0} guild achievements and {1} criterias in {2} ms", achievementCount, criteriaCount, Time.GetMSTimeDiffToNow(oldMSTime));
}
// 11. Validate loaded guild data
Log.outInfo(LogFilter.Server, "Validating data of loaded guilds...");
{
uint oldMSTime = Time.GetMSTime();
foreach (var guild in GuildStore.ToList())
{
if (!guild.Value.Validate())
GuildStore.Remove(guild.Key);
}
Log.outInfo(LogFilter.ServerLoading, "Validated data of loaded guilds in {0} ms", Time.GetMSTimeDiffToNow(oldMSTime));
}
}
public void LoadGuildRewards()
{
uint oldMSTime = Time.GetMSTime();
// 0 1 2 3
SQLResult result = DB.World.Query("SELECT ItemID, MinGuildRep, RaceMask, Cost FROM guild_rewards");
if (result.IsEmpty())
{
Log.outError(LogFilter.ServerLoading, "Loaded 0 guild reward definitions. DB table `guild_rewards` is empty.");
return;
}
uint count = 0;
do
{
GuildReward reward = new GuildReward();
reward.ItemID = result.Read<uint>(0);
reward.MinGuildRep = result.Read<byte>(1);
reward.RaceMask = result.Read<int>(2);
reward.Cost = result.Read<ulong>(3);
if (Global.ObjectMgr.GetItemTemplate(reward.ItemID) == null)
{
Log.outError(LogFilter.ServerLoading, "Guild rewards constains not existing item entry {0}", reward.ItemID);
continue;
}
if (reward.MinGuildRep >= (int)ReputationRank.Max)
{
Log.outError(LogFilter.ServerLoading, "Guild rewards contains wrong reputation standing {0}, max is {1}", reward.MinGuildRep, (int)ReputationRank.Max - 1);
continue;
}
PreparedStatement stmt = DB.World.GetPreparedStatement(WorldStatements.SEL_GUILD_REWARDS_REQ_ACHIEVEMENTS);
stmt.AddValue(0, reward.ItemID);
SQLResult reqAchievementResult = DB.World.Query(stmt);
if (!reqAchievementResult.IsEmpty())
{
do
{
uint requiredAchievementId = reqAchievementResult.Read<uint>(0);
if (!CliDB.AchievementStorage.ContainsKey(requiredAchievementId))
{
Log.outError(LogFilter.ServerLoading, "Guild rewards constains not existing achievement entry {0}", requiredAchievementId);
continue;
}
reward.AchievementsRequired.Add(requiredAchievementId);
} while (reqAchievementResult.NextRow());
}
guildRewards.Add(reward);
++count;
} while (result.NextRow());
Log.outInfo(LogFilter.ServerLoading, "Loaded {0} guild reward definitions in {1} ms", count, Time.GetMSTimeDiffToNow(oldMSTime));
}
public void ResetTimes(bool week)
{
DB.Characters.Execute(DB.Characters.GetPreparedStatement(CharStatements.DEL_GUILD_MEMBER_WITHDRAW));
foreach (var guild in GuildStore.Values)
guild.ResetTimes(week);
}
public void SetNextGuildId(uint Id) { NextGuildId = Id; }
public List<GuildReward> GetGuildRewards() { return guildRewards; }
uint NextGuildId;
Dictionary<ulong, Guild> GuildStore = new Dictionary<ulong, Guild>();
List<GuildReward> guildRewards = new List<GuildReward>();
}
public class GuildReward
{
public uint ItemID;
public byte MinGuildRep;
public int RaceMask;
public ulong Cost;
public List<uint> AchievementsRequired = new List<uint>();
}
}