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,
Transmogrifier = 0x10000000,
VaultKeeper = 0x20000000,
WildBattlePet = 0x0040000000,
BlackMarket = 0x80000000,
ItemUpgradeMaster = 0x100000000,
GarrisonArchitect = 0x200000000,
@@ -182,6 +182,8 @@ namespace Game.Chat
return false;
}
QuestStatus oldStatus = player.GetQuestStatus(entry);
// remove all quest entries for 'entry' from quest log
for (byte slot = 0; slot < SharedConst.MaxQuestLogSize; ++slot)
{
@@ -205,6 +207,7 @@ namespace Game.Chat
player.RemoveRewardedQuest(entry);
Global.ScriptMgr.OnQuestStatusChange(player, entry);
Global.ScriptMgr.OnQuestStatusChange(player, quest, oldStatus, QuestStatus.None);
handler.SendSysMessage(CypherStrings.CommandQuestRemoved);
return true;
+14 -3
View File
@@ -693,6 +693,7 @@ namespace Game.Entities
m_QuestStatus[quest_id] = new QuestStatusData();
QuestStatusData questStatusData = m_QuestStatus.LookupByKey(quest_id);
QuestStatus oldStatus = questStatusData.Status;
// check for repeatable quests status reset
questStatusData.Status = QuestStatus.Incomplete;
@@ -757,6 +758,7 @@ namespace Game.Entities
SendQuestUpdate(quest_id);
Global.ScriptMgr.OnQuestStatusChange(this, quest_id);
Global.ScriptMgr.OnQuestStatusChange(this, quest, oldStatus, questStatusData.Status);
}
public void CompleteQuest(uint quest_id)
@@ -843,6 +845,7 @@ namespace Game.Entities
SetCanDelayTeleport(true);
uint quest_id = quest.Id;
QuestStatus oldStatus = GetQuestStatus(quest_id);
foreach (QuestObjective obj in quest.Objectives)
{
@@ -1101,6 +1104,7 @@ namespace Game.Entities
SetCanDelayTeleport(false);
Global.ScriptMgr.OnQuestStatusChange(this, quest_id);
Global.ScriptMgr.OnQuestStatusChange(this, quest, oldStatus, QuestStatus.Rewarded);
}
public void SetRewardedQuest(uint quest_id)
@@ -1741,18 +1745,20 @@ namespace Game.Entities
Quest quest = Global.ObjectMgr.GetQuestTemplate(questId);
if (quest != null)
{
QuestStatus oldStatus = m_QuestStatus[questId].Status;
if (!m_QuestStatus.ContainsKey(questId))
m_QuestStatus[questId] = new QuestStatusData();
m_QuestStatus[questId].Status = status;
if (!quest.IsAutoComplete())
m_QuestStatusSave[questId] = QuestSaveType.Default;
Global.ScriptMgr.OnQuestStatusChange(this, questId);
Global.ScriptMgr.OnQuestStatusChange(this, quest, oldStatus, status);
}
if (update)
SendQuestUpdate(questId);
Global.ScriptMgr.OnQuestStatusChange(this, questId);
}
public void RemoveActiveQuest(uint quest_id, bool update = true)
@@ -2663,9 +2669,14 @@ namespace Game.Entities
}
// No change
if (status.ObjectiveData[objective.StorageIndex] == data)
int oldData = status.ObjectiveData[objective.StorageIndex];
if (oldData == data)
return;
Quest quest = Global.ObjectMgr.GetQuestTemplate(objective.QuestID);
if (quest != null)
Global.ScriptMgr.OnQuestObjectiveChange(this, quest, objective, oldData, data);
// Set 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 outdoorpvp_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 <> ''");
if (result.IsEmpty())
@@ -6298,8 +6299,10 @@ namespace Game
// Load `quest_template_addon`
// 0 1 2 3 4 5 6 7 8
result = DB.World.Query("SELECT ID, MaxLevel, AllowableClasses, SourceSpellID, PrevQuestID, NextQuestID, ExclusiveGroup, RewardMailTemplateID, RewardMailDelay, " +
//9 10 11 12 13 14 15 16 17
"RequiredSkillID, RequiredSkillPoints, RequiredMinRepFaction, RequiredMaxRepFaction, RequiredMinRepValue, RequiredMaxRepValue, ProvidedItemCount, RewardMailSenderEntry, SpecialFlags FROM quest_template_addon LEFT JOIN quest_mail_sender ON Id=QuestId");
//9 10 11 12 13 14 15 16
"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())
{
+5
View File
@@ -419,6 +419,8 @@ namespace Game
return; // can't un-equip some items, reject quest cancel
Quest quest = Global.ObjectMgr.GetQuestTemplate(questId);
QuestStatus oldStatus = _player.GetQuestStatus(questId);
if (quest != null)
{
if (quest.HasSpecialFlag(QuestSpecialFlags.Timed))
@@ -439,6 +441,9 @@ namespace Game
Log.outInfo(LogFilter.Network, "Player {0} abandoned quest {1}", GetPlayer().GetGUID().ToString(), questId);
Global.ScriptMgr.OnQuestStatusChange(_player, questId);
if (quest != null)
Global.ScriptMgr.OnQuestStatusChange(_player, quest, oldStatus, QuestStatus.None);
}
GetPlayer().SetQuestSlot(packet.Entry, 0);
+2
View File
@@ -202,6 +202,7 @@ namespace Game
SourceItemIdCount = fields.Read<byte>(15);
RewardMailSenderEntry = fields.Read<uint>(16);
SpecialFlags = (QuestSpecialFlags)fields.Read<byte>(17);
ScriptId = Global.ObjectMgr.GetScriptId(fields.Read<string>(18));
if (SpecialFlags.HasAnyFlag(QuestSpecialFlags.AutoAccept))
Flags |= QuestFlags.AutoAccept;
@@ -524,6 +525,7 @@ namespace Game
public uint SourceItemIdCount;
public uint RewardMailSenderEntry;
public QuestSpecialFlags SpecialFlags; // custom flags, not sniffed/WDB
public uint ScriptId;
public List<int> prevQuests = new List<int>();
public List<uint> prevChainQuests = new List<uint>();
+16
View File
@@ -770,4 +770,20 @@ namespace Game.Scripting
// Called when a scene is completed
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);
}
//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
{
var reg = GetScriptRegistry<T>();
+4 -1
View File
@@ -4264,8 +4264,10 @@ namespace Game.Spells
if (quest == null)
return;
QuestStatus oldStatus = player.GetQuestStatus(quest_id);
// Player has never done this quest
if (player.GetQuestStatus(quest_id) == QuestStatus.None)
if (oldStatus == QuestStatus.None)
return;
// remove all quest entries for 'entry' from quest log
@@ -4291,6 +4293,7 @@ namespace Game.Spells
player.RemoveRewardedQuest(quest_id);
Global.ScriptMgr.OnQuestStatusChange(player, quest_id);
Global.ScriptMgr.OnQuestStatusChange(player, quest, oldStatus, QuestStatus.None);
}
[SpellEffectHandler(SpellEffectName.SendTaxi)]