Core/Scripts: Added new QuestScript hooks

This commit is contained in:
hondacrx
2017-12-04 14:30:01 -05:00
parent c788e45b6f
commit b017ef8e84
9 changed files with 67 additions and 6 deletions
@@ -142,6 +142,7 @@ namespace Framework.Constants
ArtifactPowerRespec = 0x8000000, ArtifactPowerRespec = 0x8000000,
Transmogrifier = 0x10000000, Transmogrifier = 0x10000000,
VaultKeeper = 0x20000000, VaultKeeper = 0x20000000,
WildBattlePet = 0x0040000000,
BlackMarket = 0x80000000, BlackMarket = 0x80000000,
ItemUpgradeMaster = 0x100000000, ItemUpgradeMaster = 0x100000000,
GarrisonArchitect = 0x200000000, GarrisonArchitect = 0x200000000,
@@ -182,6 +182,8 @@ namespace Game.Chat
return false; return false;
} }
QuestStatus oldStatus = player.GetQuestStatus(entry);
// remove all quest entries for 'entry' from quest log // remove all quest entries for 'entry' from quest log
for (byte slot = 0; slot < SharedConst.MaxQuestLogSize; ++slot) for (byte slot = 0; slot < SharedConst.MaxQuestLogSize; ++slot)
{ {
@@ -205,6 +207,7 @@ namespace Game.Chat
player.RemoveRewardedQuest(entry); player.RemoveRewardedQuest(entry);
Global.ScriptMgr.OnQuestStatusChange(player, entry); Global.ScriptMgr.OnQuestStatusChange(player, entry);
Global.ScriptMgr.OnQuestStatusChange(player, quest, oldStatus, QuestStatus.None);
handler.SendSysMessage(CypherStrings.CommandQuestRemoved); handler.SendSysMessage(CypherStrings.CommandQuestRemoved);
return true; return true;
+14 -3
View File
@@ -693,6 +693,7 @@ namespace Game.Entities
m_QuestStatus[quest_id] = new QuestStatusData(); m_QuestStatus[quest_id] = new QuestStatusData();
QuestStatusData questStatusData = m_QuestStatus.LookupByKey(quest_id); QuestStatusData questStatusData = m_QuestStatus.LookupByKey(quest_id);
QuestStatus oldStatus = questStatusData.Status;
// check for repeatable quests status reset // check for repeatable quests status reset
questStatusData.Status = QuestStatus.Incomplete; questStatusData.Status = QuestStatus.Incomplete;
@@ -757,6 +758,7 @@ namespace Game.Entities
SendQuestUpdate(quest_id); SendQuestUpdate(quest_id);
Global.ScriptMgr.OnQuestStatusChange(this, quest_id); Global.ScriptMgr.OnQuestStatusChange(this, quest_id);
Global.ScriptMgr.OnQuestStatusChange(this, quest, oldStatus, questStatusData.Status);
} }
public void CompleteQuest(uint quest_id) public void CompleteQuest(uint quest_id)
@@ -843,6 +845,7 @@ namespace Game.Entities
SetCanDelayTeleport(true); SetCanDelayTeleport(true);
uint quest_id = quest.Id; uint quest_id = quest.Id;
QuestStatus oldStatus = GetQuestStatus(quest_id);
foreach (QuestObjective obj in quest.Objectives) foreach (QuestObjective obj in quest.Objectives)
{ {
@@ -1101,6 +1104,7 @@ namespace Game.Entities
SetCanDelayTeleport(false); SetCanDelayTeleport(false);
Global.ScriptMgr.OnQuestStatusChange(this, quest_id); Global.ScriptMgr.OnQuestStatusChange(this, quest_id);
Global.ScriptMgr.OnQuestStatusChange(this, quest, oldStatus, QuestStatus.Rewarded);
} }
public void SetRewardedQuest(uint quest_id) public void SetRewardedQuest(uint quest_id)
@@ -1741,18 +1745,20 @@ namespace Game.Entities
Quest quest = Global.ObjectMgr.GetQuestTemplate(questId); Quest quest = Global.ObjectMgr.GetQuestTemplate(questId);
if (quest != null) if (quest != null)
{ {
QuestStatus oldStatus = m_QuestStatus[questId].Status;
if (!m_QuestStatus.ContainsKey(questId)) if (!m_QuestStatus.ContainsKey(questId))
m_QuestStatus[questId] = new QuestStatusData(); m_QuestStatus[questId] = new QuestStatusData();
m_QuestStatus[questId].Status = status; m_QuestStatus[questId].Status = status;
if (!quest.IsAutoComplete()) if (!quest.IsAutoComplete())
m_QuestStatusSave[questId] = QuestSaveType.Default; m_QuestStatusSave[questId] = QuestSaveType.Default;
Global.ScriptMgr.OnQuestStatusChange(this, questId);
Global.ScriptMgr.OnQuestStatusChange(this, quest, oldStatus, status);
} }
if (update) if (update)
SendQuestUpdate(questId); SendQuestUpdate(questId);
Global.ScriptMgr.OnQuestStatusChange(this, questId);
} }
public void RemoveActiveQuest(uint quest_id, bool update = true) public void RemoveActiveQuest(uint quest_id, bool update = true)
@@ -2663,9 +2669,14 @@ namespace Game.Entities
} }
// No change // No change
if (status.ObjectiveData[objective.StorageIndex] == data) int oldData = status.ObjectiveData[objective.StorageIndex];
if (oldData == data)
return; return;
Quest quest = Global.ObjectMgr.GetQuestTemplate(objective.QuestID);
if (quest != null)
Global.ScriptMgr.OnQuestObjectiveChange(this, quest, objective, oldData, data);
// Set data // Set data
status.ObjectiveData[objective.StorageIndex] = data; status.ObjectiveData[objective.StorageIndex] = data;
+5 -2
View File
@@ -1046,6 +1046,7 @@ namespace Game
"UNION SELECT DISTINCT(ScriptName) FROM conditions WHERE ScriptName <> '' " + "UNION SELECT DISTINCT(ScriptName) FROM conditions WHERE ScriptName <> '' " +
"UNION SELECT DISTINCT(ScriptName) FROM outdoorpvp_template WHERE ScriptName <> '' " + "UNION SELECT DISTINCT(ScriptName) FROM outdoorpvp_template WHERE ScriptName <> '' " +
"UNION SELECT DISTINCT(ScriptName) FROM scene_template WHERE ScriptName <> '' " + "UNION SELECT DISTINCT(ScriptName) FROM scene_template WHERE ScriptName <> '' " +
"UNION SELECT DISTINCT(ScriptName) FROM quest_template_addon WHERE ScriptName <> '' " +
"UNION SELECT DISTINCT(script) FROM instance_template WHERE script <> ''"); "UNION SELECT DISTINCT(script) FROM instance_template WHERE script <> ''");
if (result.IsEmpty()) if (result.IsEmpty())
@@ -6298,8 +6299,10 @@ namespace Game
// Load `quest_template_addon` // Load `quest_template_addon`
// 0 1 2 3 4 5 6 7 8 // 0 1 2 3 4 5 6 7 8
result = DB.World.Query("SELECT ID, MaxLevel, AllowableClasses, SourceSpellID, PrevQuestID, NextQuestID, ExclusiveGroup, RewardMailTemplateID, RewardMailDelay, " + result = DB.World.Query("SELECT ID, MaxLevel, AllowableClasses, SourceSpellID, PrevQuestID, NextQuestID, ExclusiveGroup, RewardMailTemplateID, RewardMailDelay, " +
//9 10 11 12 13 14 15 16 17 //9 10 11 12 13 14 15 16
"RequiredSkillID, RequiredSkillPoints, RequiredMinRepFaction, RequiredMaxRepFaction, RequiredMinRepValue, RequiredMaxRepValue, ProvidedItemCount, RewardMailSenderEntry, SpecialFlags FROM quest_template_addon LEFT JOIN quest_mail_sender ON Id=QuestId"); "RequiredSkillID, RequiredSkillPoints, RequiredMinRepFaction, RequiredMaxRepFaction, RequiredMinRepValue, RequiredMaxRepValue, ProvidedItemCount, RewardMailSenderEntry, " +
//17 18
"SpecialFlags, ScriptName FROM quest_template_addon LEFT JOIN quest_mail_sender ON Id=QuestId");
if (result.IsEmpty()) if (result.IsEmpty())
{ {
+5
View File
@@ -419,6 +419,8 @@ namespace Game
return; // can't un-equip some items, reject quest cancel return; // can't un-equip some items, reject quest cancel
Quest quest = Global.ObjectMgr.GetQuestTemplate(questId); Quest quest = Global.ObjectMgr.GetQuestTemplate(questId);
QuestStatus oldStatus = _player.GetQuestStatus(questId);
if (quest != null) if (quest != null)
{ {
if (quest.HasSpecialFlag(QuestSpecialFlags.Timed)) if (quest.HasSpecialFlag(QuestSpecialFlags.Timed))
@@ -439,6 +441,9 @@ namespace Game
Log.outInfo(LogFilter.Network, "Player {0} abandoned quest {1}", GetPlayer().GetGUID().ToString(), questId); Log.outInfo(LogFilter.Network, "Player {0} abandoned quest {1}", GetPlayer().GetGUID().ToString(), questId);
Global.ScriptMgr.OnQuestStatusChange(_player, questId); Global.ScriptMgr.OnQuestStatusChange(_player, questId);
if (quest != null)
Global.ScriptMgr.OnQuestStatusChange(_player, quest, oldStatus, QuestStatus.None);
} }
GetPlayer().SetQuestSlot(packet.Entry, 0); GetPlayer().SetQuestSlot(packet.Entry, 0);
+2
View File
@@ -202,6 +202,7 @@ namespace Game
SourceItemIdCount = fields.Read<byte>(15); SourceItemIdCount = fields.Read<byte>(15);
RewardMailSenderEntry = fields.Read<uint>(16); RewardMailSenderEntry = fields.Read<uint>(16);
SpecialFlags = (QuestSpecialFlags)fields.Read<byte>(17); SpecialFlags = (QuestSpecialFlags)fields.Read<byte>(17);
ScriptId = Global.ObjectMgr.GetScriptId(fields.Read<string>(18));
if (SpecialFlags.HasAnyFlag(QuestSpecialFlags.AutoAccept)) if (SpecialFlags.HasAnyFlag(QuestSpecialFlags.AutoAccept))
Flags |= QuestFlags.AutoAccept; Flags |= QuestFlags.AutoAccept;
@@ -524,6 +525,7 @@ namespace Game
public uint SourceItemIdCount; public uint SourceItemIdCount;
public uint RewardMailSenderEntry; public uint RewardMailSenderEntry;
public QuestSpecialFlags SpecialFlags; // custom flags, not sniffed/WDB public QuestSpecialFlags SpecialFlags; // custom flags, not sniffed/WDB
public uint ScriptId;
public List<int> prevQuests = new List<int>(); public List<int> prevQuests = new List<int>();
public List<uint> prevChainQuests = new List<uint>(); public List<uint> prevChainQuests = new List<uint>();
+16
View File
@@ -770,4 +770,20 @@ namespace Game.Scripting
// Called when a scene is completed // Called when a scene is completed
public virtual void OnSceneComplete(Player player, uint sceneInstanceID, SceneTemplate sceneTemplate) { } public virtual void OnSceneComplete(Player player, uint sceneInstanceID, SceneTemplate sceneTemplate) { }
} }
class QuestScript : ScriptObject
{
public QuestScript(string name) : base(name)
{
Global.ScriptMgr.AddScript(this);
}
public override bool IsDatabaseBound() { return true; }
// Called when a quest status change
public virtual void OnQuestStatusChange(Player player, Quest quest, QuestStatus oldStatus, QuestStatus newStatus) { }
// Called when a quest objective data change
public virtual void OnQuestObjectiveChange(Player player, Quest quest, QuestObjective objective, int oldAmount, int newAmount) { }
}
} }
+17
View File
@@ -1327,6 +1327,23 @@ namespace Game.Scripting
RunScript<SceneScript>(script => script.OnSceneComplete(player, sceneInstanceID, sceneTemplate), sceneTemplate.ScriptId); RunScript<SceneScript>(script => script.OnSceneComplete(player, sceneInstanceID, sceneTemplate), sceneTemplate.ScriptId);
} }
//QuestScript
public void OnQuestStatusChange(Player player, Quest quest, QuestStatus oldStatus, QuestStatus newStatus)
{
Contract.Assert(player);
Contract.Assert(quest != null);
RunScript<QuestScript>(script => script.OnQuestStatusChange(player, quest, oldStatus, newStatus), quest.ScriptId);
}
public void OnQuestObjectiveChange(Player player, Quest quest, QuestObjective objective, int oldAmount, int newAmount)
{
Contract.Assert(player);
Contract.Assert(quest != null);
RunScript<QuestScript>(script => script.OnQuestObjectiveChange(player, quest, objective, oldAmount, newAmount), quest.ScriptId);
}
public void ForEach<T>(Action<T> a) where T : ScriptObject public void ForEach<T>(Action<T> a) where T : ScriptObject
{ {
var reg = GetScriptRegistry<T>(); var reg = GetScriptRegistry<T>();
+4 -1
View File
@@ -4264,8 +4264,10 @@ namespace Game.Spells
if (quest == null) if (quest == null)
return; return;
QuestStatus oldStatus = player.GetQuestStatus(quest_id);
// Player has never done this quest // Player has never done this quest
if (player.GetQuestStatus(quest_id) == QuestStatus.None) if (oldStatus == QuestStatus.None)
return; return;
// remove all quest entries for 'entry' from quest log // remove all quest entries for 'entry' from quest log
@@ -4291,6 +4293,7 @@ namespace Game.Spells
player.RemoveRewardedQuest(quest_id); player.RemoveRewardedQuest(quest_id);
Global.ScriptMgr.OnQuestStatusChange(player, quest_id); Global.ScriptMgr.OnQuestStatusChange(player, quest_id);
Global.ScriptMgr.OnQuestStatusChange(player, quest, oldStatus, QuestStatus.None);
} }
[SpellEffectHandler(SpellEffectName.SendTaxi)] [SpellEffectHandler(SpellEffectName.SendTaxi)]