Core/Scripts: Added new QuestScript hooks
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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>();
|
||||||
|
|||||||
@@ -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) { }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>();
|
||||||
|
|||||||
@@ -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)]
|
||||||
|
|||||||
Reference in New Issue
Block a user