Added functionality to handle NPC LSes in quests. Linked the rest of the sequences up for Man0l1.

This commit is contained in:
Filip Maj 2022-03-05 01:02:41 -05:00
parent a618e69dbd
commit 49c6fdbd51
6 changed files with 166 additions and 76 deletions

View file

@ -1845,16 +1845,20 @@ namespace Meteor.Map.Actors
return quests;
}
public void HandleNpcLS(uint id)
public bool HandleNpcLs(uint id)
{
foreach (Quest quest in questScenario)
{
if (quest != null)
quest.OnNpcLS(this, id);
if (quest != null && quest.HasNpcLsMsgs(id))
{
quest.OnNpcLS(this);
return true;
}
}
return false;
}
public void SetNpcLS(uint npcLSId, uint state)
public void SetNpcLs(uint npcLSId, uint state)
{
bool isCalling, isExtra;
isCalling = isExtra = false;

View file

@ -35,6 +35,7 @@ namespace Meteor.Map.Actors.QuestNS
private QuestState questState = null;
private QuestData data = null;
// Creates a Static Quest for the StaticActors list.
public Quest(uint actorID, string className, string classPath)
: base(actorID)
@ -59,11 +60,11 @@ namespace Meteor.Map.Actors.QuestNS
}
// Creates a Instance Quest that has been started with data.
public Quest(Player owner, Quest staticQuest, ushort sequence, uint flags, ushort counter1, ushort counter2, ushort counter3, ushort counter4) : this(staticQuest)
public Quest(Player owner, Quest staticQuest, ushort sequence, uint flags, ushort counter1, ushort counter2, ushort counter3, ushort counter4, uint npcLsFrom, byte npcLsMsgStep) : this(staticQuest)
{
this.owner = owner;
currentSequence = sequence;
data = new QuestData(owner, this, flags, counter1, counter2, counter3, counter4);
data = new QuestData(owner, this, flags, counter1, counter2, counter3, counter4, npcLsFrom, npcLsMsgStep);
questState = new QuestState(owner, this);
questState.UpdateState();
}
@ -137,6 +138,35 @@ namespace Meteor.Map.Actors.QuestNS
}
}
public void NewNpcLsMsg(uint from)
{
data.SetNpcLsFrom(from);
owner.SetNpcLs(from, Player.NPCLS_ALERT);
owner.SendGameMessage(Server.GetWorldManager().GetActor(), 25119, 0x20, (object)from); // A glow emanates from the <NpcLs> linkpearl.
}
public void ReadNpcLsMsg()
{
data.IncrementNpcLsMsgStep();
owner.SetNpcLs(data.GetNpcLsFrom(), Player.NPCLS_ACTIVE);
}
public void EndOfNpcLsMsgs()
{
owner.SetNpcLs(data.GetNpcLsFrom(), Player.NPCLS_INACTIVE);
data.ClearNpcLs();
}
public bool HasNpcLsMsgs(uint from)
{
return data.GetNpcLsFrom() == from;
}
public int GetNpcLsMsgStep()
{
return data.GetMsgStep();
}
public QuestState GetQuestState()
{
return questState;
@ -164,9 +194,9 @@ namespace Meteor.Map.Actors.QuestNS
LuaEngine.GetInstance().CallLuaFunction(caller, this, "onNotice", true, triggerName);
}
public void OnNpcLS(Player caller, uint npcLSId)
public void OnNpcLS(Player caller)
{
LuaEngine.GetInstance().CallLuaFunction(caller, this, "onNpcLS", true, npcLSId);
LuaEngine.GetInstance().CallLuaFunction(caller, this, "onNpcLS", true, data.GetNpcLsFrom(), data.GetMsgStep());
}
public object[] GetJournalInformation()
@ -213,6 +243,12 @@ namespace Meteor.Map.Actors.QuestNS
questState.UpdateState();
}
public void StartSequenceForNpcLs(ushort sequence)
{
currentSequence = sequence;
questState.UpdateState();
}
public void OnAccept()
{
data = new QuestData(owner, this);
@ -237,6 +273,5 @@ namespace Meteor.Map.Actors.QuestNS
data = null;
questState.UpdateState();
}
}
}

View file

@ -17,9 +17,12 @@ namespace Meteor.Map.Actors.QuestNS
private ushort counter3;
private ushort counter4;
private uint npcLsFrom = 0;
private byte npcLsMessageStep = 0;
public bool Dirty { get; private set; } = false;
public QuestData(Player owner, Quest parent, uint flags, ushort counter1, ushort counter2, ushort counter3, ushort counter4)
public QuestData(Player owner, Quest parent, uint flags, ushort counter1, ushort counter2, ushort counter3, ushort counter4, uint npcLsFrom, byte npcLsMessageStep)
{
this.owner = owner;
this.parent = parent;
@ -28,6 +31,8 @@ namespace Meteor.Map.Actors.QuestNS
this.counter2 = counter2;
this.counter3 = counter3;
this.counter4 = counter4;
this.npcLsFrom = npcLsFrom;
this.npcLsMessageStep = npcLsMessageStep;
}
public QuestData(Player owner, Quest parent)
@ -160,6 +165,34 @@ namespace Meteor.Map.Actors.QuestNS
return 0;
}
public void SetNpcLsFrom(uint from)
{
npcLsFrom = from;
npcLsMessageStep = 1;
Dirty = true;
}
public void IncrementNpcLsMsgStep()
{
npcLsMessageStep++;
Dirty = true;
}
public uint GetNpcLsFrom()
{
return npcLsFrom;
}
public byte GetMsgStep()
{
return npcLsMessageStep;
}
public void ClearNpcLs()
{
npcLsFrom = 0;
}
public void ClearDirty()
{
Dirty = false;

View file

@ -591,7 +591,7 @@ namespace Meteor.Map
query = @"
UPDATE characters_quest_scenario
SET sequence = @sequence, flags = @flags, counter1 = @counter1, counter2 = @counter2, counter3 = @counter3
SET sequence = @sequence, flags = @flags, counter1 = @counter1, counter2 = @counter2, counter3 = @counter3, counter4 = @counter4, npcLsFrom = @npcLsFrom, npcLsMsgStep = @npcLsMsgStep
WHERE characterId = @charaId and questId = @questId
";
@ -600,14 +600,14 @@ namespace Meteor.Map
cmd.Parameters.AddWithValue("@questId", 0xFFFFF & quest.Id);
cmd.Parameters.AddWithValue("@sequence", quest.GetSequence());
if (qData != null)
{
cmd.Parameters.AddWithValue("@flags", qData.GetFlags());
cmd.Parameters.AddWithValue("@counter1", qData.GetCounter(1));
cmd.Parameters.AddWithValue("@counter2", qData.GetCounter(2));
cmd.Parameters.AddWithValue("@counter3", qData.GetCounter(3));
}
cmd.Parameters.AddWithValue("@flags", qData.GetFlags());
cmd.Parameters.AddWithValue("@counter1", qData.GetCounter(1));
cmd.Parameters.AddWithValue("@counter2", qData.GetCounter(2));
cmd.Parameters.AddWithValue("@counter3", qData.GetCounter(3));
cmd.Parameters.AddWithValue("@counter4", qData.GetCounter(4));
cmd.Parameters.AddWithValue("@npcLsFrom", qData.GetNpcLsFrom());
cmd.Parameters.AddWithValue("@npcLsMsgStep", qData.GetMsgStep());
cmd.ExecuteNonQuery();
}
catch (MySqlException e)
@ -1216,7 +1216,10 @@ namespace Meteor.Map
flags,
counter1,
counter2,
counter3
counter3,
counter4,
npcLsFrom,
npcLsMsgStep
FROM characters_quest_scenario WHERE characterId = @charId";
cmd = new MySqlCommand(query, conn);
@ -1232,11 +1235,13 @@ namespace Meteor.Map
ushort counter1 = reader.GetUInt16("counter1");
ushort counter2 = reader.GetUInt16("counter2");
ushort counter3 = reader.GetUInt16("counter3");
//ushort counter4 = reader.GetUInt16("counter4");
ushort counter4 = reader.GetUInt16("counter4");
ushort npsLsFrom = reader.GetUInt16("npcLsFrom");
byte npcLsMsgStep = reader.GetByte("npcLsMsgStep");
Quest baseQuest = (Quest) Server.GetStaticActors(questId);
player.playerWork.questScenario[index] = questId;
player.questScenario[index] = new Quest(player, baseQuest, sequence, flags, counter1, counter2, counter3, 0);
player.questScenario[index] = new Quest(player, baseQuest, sequence, flags, counter1, counter2, counter3, counter4, npsLsFrom, npcLsMsgStep);
}
}