1
Fork 0
mirror of https://bitbucket.org/Ioncannon/project-meteor-server.git synced 2025-04-24 05:37:46 +00:00

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

@ -4,13 +4,14 @@ require ("global")
NpcLinkshellChatCommand Script
Handler for when a player clicks a npc ls to talk to. If adding new linkshells to the handle, make sure to add
it to the handler table (with correct offset), and that your function is above the handler. If padding is needed
to hit some ID, add "nils".
Player class will go through all quests and see if there are active msgs for one. If there was, it will
return true and that quest must end the event (if needed). Otherwise if nothing caught the event, the
event is ended here.
--]]
function onEventStarted(player, command, eventType, eventName, npcLsId)
player:HandleNpcLS(npcLsId);
player:EndEvent();
if (player:HandleNpcLs(npcLsId) == false) then
player:EndEvent();
end
end

View file

@ -56,7 +56,7 @@ ISANDOREL = 1000152;
MERLZIRN = 1000472;
MSK_TRIGGER = 1090001;
-- Echo in Mrd Guild
-- Echo in MSK Guild
NERVOUS_BARRACUDA = 1000096;
INTIMIDATING_BARRACUDA = 1000097;
OVEREAGER_BARRACUDA = 1000107;
@ -97,10 +97,18 @@ ECHO_EXIT_TRIGGER2 = 1090001;
-- Quest Data
CNTR_SEQ7_CUL = 1;
CNTR_SEQ7_MRD = 2;
CNTR_SEQ7_MSK = 2;
CNTR_SEQ40_FSH = 3;
CNTR_LS_MSG = 4;
-- Msg packs for the Npc LS
NPCLS_MSGS = {
{339},
{80, 81, 82},
{248, 249},
{161, 162, 163, 164}
};
function onStart(player, quest)
quest:StartSequence(SEQ_000);
@ -138,18 +146,18 @@ function onStateChange(player, quest, sequence)
quest:SetENpc(BADERON, QFLAG_PLATE);
elseif (sequence == SEQ_007) then
local subseqCUL = data:GetCounter(CNTR_SEQ7_CUL);
local subseqMRD = data:GetCounter(CNTR_SEQ7_MRD);
local subseqMSK = data:GetCounter(CNTR_SEQ7_MSK);
-- Always active in this seqence
quest:SetENpc(BADERON);
quest:SetENpc(CHARLYS, subseqCUL == 0 and QFLAG_PLATE or QFLAG_NONE);
-- Down and Up the MSK guild
quest:SetENpc(ISANDOREL, (subseqMRD == 0 or subseqMRD == 2) and QFLAG_PLATE or QFLAG_NONE);
quest:SetENpc(ISANDOREL, (subseqMSK == 0 or subseqMSK == 2) and QFLAG_PLATE or QFLAG_NONE);
if (subseqMRD == 1) then
if (subseqMSK == 1) then
quest:SetENpc(MSK_TRIGGER, QFLAG_MAP, false, true);
elseif (subseqMRD == 2) then
elseif (subseqMSK == 2) then
quest:SetENpc(MERLZIRN);
end
@ -164,7 +172,7 @@ function onStateChange(player, quest, sequence)
quest:SetENpc(ADVENTURER1);
quest:SetENpc(ADVENTURER2);
quest:SetENpc(ADVENTURER3);
quest:SetENpc(ECHO_EXIT_TRIGGER, subseqMRD == 3 and QFLAG_MAP or QFLAG_NONE, false, subseqMRD == 3);
quest:SetENpc(ECHO_EXIT_TRIGGER, subseqMSK == 3 and QFLAG_MAP or QFLAG_NONE, false, subseqMSK == 3);
elseif (sequence == SEQ_035) then
quest:SetENpc(NNMULIKA, QFLAG_PLATE);
elseif (sequence == SEQ_040) then
@ -360,7 +368,7 @@ function seq000_onTalk(player, quest, npc, classId)
callClientFunction(player, "delegateEvent", player, quest, "processEvent010_8");
elseif (classId == BADERON) then
callClientFunction(player, "delegateEvent", player, quest, "processEvent020");
player:SetNpcLS(1, 3);
quest:NewNpcLsMsg(1);
quest:StartSequence(SEQ_003);
player:EndEvent();
@ -389,12 +397,12 @@ end
function seq007_onTalk(player, quest, npc, classId)
local data = quest:GetData();
local subseqCUL = data:GetCounter(CNTR_SEQ7_CUL);
local subseqMRD = data:GetCounter(CNTR_SEQ7_MRD);
local subseqMSK = data:GetCounter(CNTR_SEQ7_MSK);
if (classId == BADERON) then
if (subseqCUL == 1) then
callClientFunction(player, "delegateEvent", player, quest, "processEvent027_3");
elseif (subseqMRD == 4) then
elseif (subseqMSK == 4) then
callClientFunction(player, "delegateEvent", player, quest, "processEvent027_4");
else
callClientFunction(player, "delegateEvent", player, quest, "processEvent027_2");
@ -402,8 +410,8 @@ function seq007_onTalk(player, quest, npc, classId)
elseif (classId == CHARLYS) then
if (subseqCUL == 0) then
callClientFunction(player, "delegateEvent", player, quest, "processEvent030");
data:IncCounter(CNTR_SEQ7_CUL);
if (data:GetCounter(CNTR_SEQ7_CUL) == 1 and data:GetCounter(CNTR_SEQ7_MSK) = 4) then
data:IncCounter(CNTR_SEQ7_CUL);
if (data:GetCounter(CNTR_SEQ7_MSK) == 4) then
seq007_endSequence(player, quest);
end
--give 1000g
@ -411,14 +419,14 @@ function seq007_onTalk(player, quest, npc, classId)
callClientFunction(player, "delegateEvent", player, quest, "processEvent030_2");
end
elseif (classId == ISANDOREL) then
if (subseqMRD == 2) then
if (subseqMSK == 2) then
callClientFunction(player, "delegateEvent", player, quest, "processEvent050");
data:IncCounter(CNTR_SEQ7_MRD);
data:IncCounter(CNTR_SEQ7_MSK);
GetWorldManager():WarpToPrivateArea(player, "PrivateAreaMasterPast", 3);
elseif (subseqMRD == 0) then
elseif (subseqMSK == 0) then
callClientFunction(player, "delegateEvent", player, quest, "processEvent035");
data:IncCounter(CNTR_SEQ7_MRD);
elseif (subseqMRD == 1) then
data:IncCounter(CNTR_SEQ7_MSK);
elseif (subseqMSK == 1) then
callClientFunction(player, "delegateEvent", player, quest, "processEvent035_2");
end
elseif (classId == MERLZIRN) then
@ -450,7 +458,7 @@ end
function seq007_endSequence(player, quest)
callClientFunction(player, "delegateEvent", player, quest, "processEvent033");
player:SetNpcLS(1, 1);
quest:NewNpcLsMsg(1);
end
function seq080_085_onTalk(player, quest, npc, classId)
@ -482,14 +490,14 @@ function onPush(player, quest, npc)
if (sequence == SEQ_007) then
if (classId == MSK_TRIGGER) then
callClientFunction(player, "delegateEvent", player, quest, "processEvent040");
data:IncCounter(CNTR_SEQ7_MRD);
data:IncCounter(CNTR_SEQ7_MSK);
player:EndEvent();
quest:UpdateENPCs();
GetWorldManager():DoZoneChange(player, 230, nil, 0, 15, -620.0, 29.476, -70.050, 0.791);
elseif (classId == ECHO_EXIT_TRIGGER) then
callClientFunction(player, "delegateEvent", player, quest, "processEvent060");
data:IncCounter(CNTR_SEQ7_MRD);
if (data:GetCounter(CNTR_SEQ7_CUL) == 1 and data:GetCounter(CNTR_SEQ7_MSK) = 4) then
data:IncCounter(CNTR_SEQ7_MSK);
if (data:GetCounter(CNTR_SEQ7_CUL) == 1) then
seq007_endSequence(player, quest);
end
player:EndEvent();
@ -517,7 +525,7 @@ function onPush(player, quest, npc)
callClientFunction(player, "delegateEvent", player, quest, "processEvent620");
-- Give 3000 gil
player:EndEvent();
data:SetCounter(CNTR_LS_MSG, 0);
quest:NewNpcLsMsg(1);
quest:StartSequence(SEQ_070);
end
elseif (sequence == SEQ_085) then
@ -641,39 +649,43 @@ function onNotice(player, quest, target)
quest:UpdateENPCs();
end
function onNpcLS(player, quest, npcLSId)
function onNpcLS(player, quest, from, msgStep)
local sequence = quest:getSequence();
callClientFunction(player, "delegateEvent", player, quest, "processEvent625");
if (npcLSId == 1) then
player:SetNpcLS(1, 1);
if (sequence == SEQ_003) then
player:SendGameMessageLocalizedDisplayName(quest, 298, 39, 1000015, nil);
local msgPack;
if (from == 1) then
-- Get the right msg pack
if (sequence == SEQ_003) then
msgPack = 1;
elseif (sequence == SEQ_007 or sequence == SEQ_035) then
msgPack = 2;
elseif (sequence == SEQ_070 or sequence == SEQ_075) then
msgPack = 3;
elseif (sequence == SEQ_090 or sequence == SEQ_092) then
msgPack = 4;
end
-- Quick way to handle all msgs nicely.
player:SendGameMessageLocalizedDisplayName(quest, NPCLS_MSGS[msgPack][msgStep], MESSAGE_TYPE_NPC_LINKSHELL, 1000015);
if (msgStep >= #NPCLS_MSGS[msgPack]) then
quest:EndOfNpcLsMsgs();
else
quest:ReadNpcLsMsg();
end
-- Handle anything else
if (sequence == SEQ_003) then
endTutorialMode(player);
elseif (sequence == SEQ_007) then
player:SendGameMessageLocalizedDisplayName(quest, 80, 39, 1000015, nil);
player:SendGameMessageLocalizedDisplayName(quest, 81, 39, 1000015, nil);
player:SendGameMessageLocalizedDisplayName(quest, 82, 39, 1000015, nil);
quest:StartSequence(SEQ_035);
quest:StartSequenceForNpcLs(SEQ_035);
elseif (sequence == SEQ_070) then
local lsStep = data:IncCounter(CNTR_LS_MSG);
if (lsStep == 1) then
player:SendGameMessageLocalizedDisplayName(quest, 80, 39, 1000015, nil);
elseif (lsStep == 2) then
player:SendGameMessageLocalizedDisplayName(quest, 80, 39, 1000015, nil);
elseif (lsStep == 3) then
player:SendGameMessageLocalizedDisplayName(quest, 80, 39, 1000015, nil);
else
player:SendGameMessageLocalizedDisplayName(quest, 80, 39, 1000015, nil);
quest:StartSequence(SEQ_075);
end
player:EndEvent();
quest:StartSequenceForNpcLs(SEQ_075);
elseif (sequence == SEQ_090) then
callClientFunction(player, "delegateEvent", player, quest, "processEvent637");
player:EndEvent();
quest:StartSequence(SEQ_092);
quest:StartSequenceForNpcLs(SEQ_092);
end
end
player:EndEvent();
end
function startMan0l1Content(player, quest)
@ -694,7 +706,7 @@ function startMan0l1Content(player, quest)
end
function getJournalInformation(player, quest)
return 0, quest:GetData():GetCounter(CNTR_SEQ7_CUL) * 5, quest:GetData():GetCounter(CNTR_SEQ7_MRD) * 5;
return 0, quest:GetData():GetCounter(CNTR_SEQ7_CUL) * 5, quest:GetData():GetCounter(CNTR_SEQ7_MSK) * 5;
end
function getJournalMapMarkerList(player, quest)

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);
}
}