Core/PacketIO: Implemented UIMap questlines

Port From (https://github.com/TrinityCore/TrinityCore/commit/efa76de54011d40d69412d2af23cb071ed352688)
This commit is contained in:
Hondacrx
2024-10-10 10:08:02 -04:00
parent 6e2fc20fb8
commit 1ceaa24432
5 changed files with 179 additions and 4 deletions
+3
View File
@@ -478,6 +478,9 @@ namespace Game.DataStorage
foreach (QuestLineXQuestRecord questLineQuest in QuestLineXQuestStorage.Values) foreach (QuestLineXQuestRecord questLineQuest in QuestLineXQuestStorage.Values)
_questsByQuestLine.Add(questLineQuest.QuestLineID, questLineQuest); _questsByQuestLine.Add(questLineQuest.QuestLineID, questLineQuest);
foreach (var questLineId in _questsByQuestLine.Keys)
_questsByQuestLine[questLineId].OrderByDescending(p => p.OrderIndex);
foreach (QuestPackageItemRecord questPackageItem in QuestPackageItemStorage.Values) foreach (QuestPackageItemRecord questPackageItem in QuestPackageItemStorage.Values)
{ {
if (!_questPackages.ContainsKey(questPackageItem.PackageID)) if (!_questPackages.ContainsKey(questPackageItem.PackageID))
+99 -3
View File
@@ -9772,7 +9772,6 @@ namespace Game
return; return;
} }
uint count = 0;
do do
{ {
uint sceneId = result.Read<uint>(0); uint sceneId = result.Read<uint>(0);
@@ -9787,7 +9786,7 @@ namespace Game
} while (result.NextRow()); } while (result.NextRow());
Log.outInfo(LogFilter.ServerLoading, "Loaded {0} scene templates in {1} ms.", count, Time.GetMSTimeDiffToNow(oldMSTime)); Log.outInfo(LogFilter.ServerLoading, "Loaded {0} scene templates in {1} ms.", _sceneTemplateStorage.Count, Time.GetMSTimeDiffToNow(oldMSTime));
} }
public void LoadPlayerChoices() public void LoadPlayerChoices()
{ {
@@ -10150,6 +10149,7 @@ namespace Game
Log.outInfo(LogFilter.ServerLoading, $"Loaded {_playerChoices.Count} player choices, {responseCount} responses, {rewardCount} rewards, {itemRewardCount} item rewards, " + Log.outInfo(LogFilter.ServerLoading, $"Loaded {_playerChoices.Count} player choices, {responseCount} responses, {rewardCount} rewards, {itemRewardCount} item rewards, " +
$"{currencyRewardCount} currency rewards, {factionRewardCount} faction rewards, {itemChoiceRewardCount} item choice rewards and {mawPowersCount} maw powers in {Time.GetMSTimeDiffToNow(oldMSTime)} ms."); $"{currencyRewardCount} currency rewards, {factionRewardCount} faction rewards, {itemChoiceRewardCount} item choice rewards and {mawPowersCount} maw powers in {Time.GetMSTimeDiffToNow(oldMSTime)} ms.");
} }
public void LoadPlayerChoicesLocale() public void LoadPlayerChoicesLocale()
{ {
uint oldMSTime = Time.GetMSTime(); uint oldMSTime = Time.GetMSTime();
@@ -10463,6 +10463,90 @@ namespace Game
Log.outInfo(LogFilter.ServerLoading, $"Loaded {count} phase names in {Time.GetMSTimeDiffToNow(oldMSTime)} ms."); Log.outInfo(LogFilter.ServerLoading, $"Loaded {count} phase names in {Time.GetMSTimeDiffToNow(oldMSTime)} ms.");
} }
public void LoadUiMapQuestLines()
{
uint oldMSTime = Time.GetMSTime();
// need for reload case
_uiMapQuestLinesStorage.Clear();
// 0 1
SQLResult result = DB.World.Query("SELECT UiMapId, QuestLineId FROM ui_map_quest_line");
if (result.IsEmpty())
{
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 questlines for UIMaps. DB table `ui_map_quest_line` is empty!");
return;
}
uint count = 0;
do
{
uint uiMapId = result.Read<uint>(0);
uint questLineId = result.Read<uint>(1);
if (!CliDB.UiMapStorage.HasRecord(uiMapId))
{
Log.outError(LogFilter.Sql, $"Table `ui_map_quest_line` references non-existing UIMap {uiMapId}, skipped");
continue;
}
if (Global.DB2Mgr.GetQuestsForQuestLine(questLineId) == null)
{
Log.outError(LogFilter.Sql, $"Table `ui_map_quest_line` references empty or non-existing questline {questLineId}, skipped");
continue;
}
_uiMapQuestLinesStorage.Add(uiMapId, questLineId);
++count;
} while (result.NextRow());
Log.outInfo(LogFilter.ServerLoading, $"Loaded {count} UiMap questlines definitions in {Time.GetMSTimeDiffToNow(oldMSTime)} ms");
}
public void LoadUiMapQuests()
{
uint oldMSTime = Time.GetMSTime();
// need for reload case
_uiMapQuestsStorage.Clear();
// 0 1
SQLResult result = DB.World.Query("SELECT UiMapId, QuestId FROM ui_map_quest");
if (result.IsEmpty())
{
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 quests for UIMaps. DB table `ui_map_quest` is empty!");
return;
}
uint count = 0;
do
{
uint uiMapId = result.Read<uint>(0);
uint questId = result.Read<uint>(1);
if (!CliDB.UiMapStorage.HasRecord(uiMapId))
{
Log.outError(LogFilter.Sql, $"Table `ui_map_quest` references non-existing UIMap {uiMapId}, skipped");
continue;
}
if (GetQuestTemplate(questId) == null)
{
Log.outError(LogFilter.Sql, $"Table `ui_map_quest` references non-existing quest {questId}, skipped");
continue;
}
_uiMapQuestsStorage.Add(uiMapId, questId);
++count;
} while (result.NextRow());
Log.outInfo(LogFilter.ServerLoading, $"Loaded {count} UiMap quests definitions in {Time.GetMSTimeDiffToNow(oldMSTime)} ms");
}
public MailLevelReward GetMailLevelReward(uint level, Race race) public MailLevelReward GetMailLevelReward(uint level, Race race)
{ {
var mailList = _mailLevelRewardStorage.LookupByKey((byte)level); var mailList = _mailLevelRewardStorage.LookupByKey((byte)level);
@@ -10913,6 +10997,16 @@ namespace Game
return _phaseNameStorage.TryGetValue(phaseId, out string value) ? value : "Unknown Name"; return _phaseNameStorage.TryGetValue(phaseId, out string value) ? value : "Unknown Name";
} }
public List<uint> GetUiMapQuestLinesList(uint uiMapId)
{
return _uiMapQuestLinesStorage.LookupByKey(uiMapId);
}
public List<uint> GetUiMapQuestsList(uint uiMapId)
{
return _uiMapQuestsStorage.LookupByKey(uiMapId);
}
//Vehicles //Vehicles
public void LoadVehicleTemplate() public void LoadVehicleTemplate()
{ {
@@ -11010,7 +11104,7 @@ namespace Game
if (result.IsEmpty()) if (result.IsEmpty())
{ {
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 Vehicle Accessories in {0} ms", Time.GetMSTimeDiffToNow(oldMSTime)); Log.outInfo(LogFilter.ServerLoading, "Loaded 0 vehicle Accessories. DB table `vehicle_accessory` is empty");
return; return;
} }
@@ -11126,6 +11220,8 @@ namespace Game
Dictionary<uint, SceneTemplate> _sceneTemplateStorage = new(); Dictionary<uint, SceneTemplate> _sceneTemplateStorage = new();
Dictionary<int, JumpChargeParams> _jumpChargeParams = new(); Dictionary<int, JumpChargeParams> _jumpChargeParams = new();
Dictionary<uint, string> _phaseNameStorage = new(); Dictionary<uint, string> _phaseNameStorage = new();
MultiMap<uint, uint> _uiMapQuestLinesStorage = new();
MultiMap<uint, uint> _uiMapQuestsStorage = new();
Dictionary<(ulong, Difficulty), CreatureStaticFlagsOverride> _creatureStaticFlagsOverrideStorage = new(); Dictionary<(ulong, Difficulty), CreatureStaticFlagsOverride> _creatureStaticFlagsOverrideStorage = new();
Dictionary<byte, RaceUnlockRequirement> _raceUnlockRequirementStorage = new(); Dictionary<byte, RaceUnlockRequirement> _raceUnlockRequirementStorage = new();
+36
View File
@@ -792,5 +792,41 @@ namespace Game
_player.GetReputationMgr().ModifyReputation(CliDB.FactionStorage.LookupByKey(faction.Id), faction.Quantity); _player.GetReputationMgr().ModifyReputation(CliDB.FactionStorage.LookupByKey(faction.Id), faction.Quantity);
} }
} }
[WorldPacketHandler(ClientOpcodes.UiMapQuestLinesRequest)]
void HandleUiMapQuestLinesRequest(UiMapQuestLinesRequest uiMapQuestLinesRequest)
{
var uiMap = CliDB.UiMapStorage.LookupByKey(uiMapQuestLinesRequest.UiMapID);
if (uiMap == null)
return;
UiMapQuestLinesResponse response = new();
response.UiMapID = uiMap.Id;
var questLines = Global.ObjectMgr.GetUiMapQuestLinesList(uiMap.Id);
foreach (uint questLineId in questLines)
{
var questLineQuests = Global.DB2Mgr.GetQuestsForQuestLine(questLineId);
if (questLineQuests.Empty())
continue;
foreach (var questLineQuest in questLineQuests)
{
Quest quest = Global.ObjectMgr.GetQuestTemplate(questLineQuest.QuestID);
if (quest != null && _player.CanTakeQuest(quest, false))
response.QuestLineXQuestIDs.Add(questLineQuest.Id);
}
}
var quests = Global.ObjectMgr.GetUiMapQuestsList(uiMap.Id);
foreach (uint questId in quests)
{
Quest quest = Global.ObjectMgr.GetQuestTemplate(questId);
if (quest != null && _player.CanTakeQuest(quest, false))
response.QuestIDs.Add(questId);
}
SendPacket(response);
}
} }
} }
@@ -953,6 +953,40 @@ namespace Game.Networking.Packets
public bool IsReroll; public bool IsReroll;
} }
class UiMapQuestLinesResponse : ServerPacket
{
public uint UiMapID;
public List<uint> QuestLineXQuestIDs = new();
public List<uint> QuestIDs = new();
public UiMapQuestLinesResponse() : base(ServerOpcodes.UiMapQuestLinesResponse, ConnectionType.Instance) { }
public override void Write()
{
_worldPacket.WriteUInt32(UiMapID);
_worldPacket.WriteInt32(QuestLineXQuestIDs.Count);
_worldPacket.WriteInt32(QuestIDs.Count);
foreach (var questLineQuestID in QuestLineXQuestIDs)
_worldPacket.WriteUInt32(questLineQuestID);
foreach (var questID in QuestIDs)
_worldPacket.WriteUInt32(questID);
}
}
class UiMapQuestLinesRequest : ClientPacket
{
public int UiMapID;
public UiMapQuestLinesRequest(WorldPacket packet) : base(packet) { }
public override void Read()
{
UiMapID = _worldPacket.ReadInt32();
}
}
//Structs //Structs
public class QuestGiverInfo public class QuestGiverInfo
{ {
+6
View File
@@ -806,6 +806,12 @@ namespace Game
Global.ObjectMgr.LoadPlayerChoicesLocale(); Global.ObjectMgr.LoadPlayerChoicesLocale();
} }
Log.outInfo(LogFilter.ServerLoading, "Loading UIMap questlines...");
Global.ObjectMgr.LoadUiMapQuestLines();
Log.outInfo(LogFilter.ServerLoading, "Loading UIMap quests...");
Global.ObjectMgr.LoadUiMapQuests();
Log.outInfo(LogFilter.ServerLoading, "Loading Jump Charge Params..."); Log.outInfo(LogFilter.ServerLoading, "Loading Jump Charge Params...");
Global.ObjectMgr.LoadJumpChargeParams(); Global.ObjectMgr.LoadJumpChargeParams();