diff --git a/Common Class Lib/Bitstream.cs b/Common Class Lib/Bitstream.cs index 1e3df17c..7e225eef 100644 --- a/Common Class Lib/Bitstream.cs +++ b/Common Class Lib/Bitstream.cs @@ -176,11 +176,17 @@ namespace Meteor.Common srcShiftIndx = 0; destByteIndx++; i += 8; + continue; } - bool val = (Data[srcByteIndx] & (1 << srcShiftIndx)) != 0; + bool val = (Data[srcByteIndx] & (1 << srcShiftIndx++)) != 0; curByte |= (byte)((val ? 1 : 0) << destShiftIndx++); + if (srcShiftIndx == 8) + { + srcShiftIndx = 0; + srcByteIndx++; + } if (destShiftIndx == 8) { toReturn[destByteIndx++] = curByte; diff --git a/Common Class Lib/Utils.cs b/Common Class Lib/Utils.cs index 9556e8c5..b8d9a214 100644 --- a/Common Class Lib/Utils.cs +++ b/Common Class Lib/Utils.cs @@ -245,7 +245,7 @@ namespace Meteor.Common { for (var bitCount = 0; bitCount < 8; bitCount++) { - if (i + bitCount >= array.Length) + if (i + bitCount >= array.Length - 1) break; data[dataCounter] = (byte)(((array[i + bitCount] ? 1 : 0) << 7 - bitCount) | data[dataCounter]); } diff --git a/Data/scripts/commands/gm/quest.lua b/Data/scripts/commands/gm/quest.lua index 29946fdf..3f227706 100644 --- a/Data/scripts/commands/gm/quest.lua +++ b/Data/scripts/commands/gm/quest.lua @@ -66,7 +66,7 @@ function onTrigger(player, argc, command, var1, var2, var3) local flagStr = ""; for i=0,31,1 do - if (quest:GetFlag(i)) then + if (quest:GetData():GetFlag(i)) then flagStr = flagStr .. "O"; else flagStr = flagStr .. "X"; @@ -76,10 +76,12 @@ function onTrigger(player, argc, command, var1, var2, var3) end end + local data = quest:GetData(); + message = string.format("\nInfo for quest %s [%d]\n", quest.Name, quest:GetQuestId()); message = message .. string.format("Current Sequence: %d\n", quest:getSequence()); message = message .. string.format("Flags: \n%s\n", flagStr) - message = message .. string.format("Counters: %d,%d,%d,%d", quest:getCounter(0), quest:getCounter(1), quest:getCounter(2), quest:getCounter(3)); + message = message .. string.format("Counters: %d,%d,%d,%d", data:getCounter(0), data:getCounter(1), data:getCounter(2), data:getCounter(3)); else message = ("Quest not active: "..var1); end @@ -118,7 +120,7 @@ function onTrigger(player, argc, command, var1, var2, var3) boolvar = false; elseif var3 == "flip" or var3 == "toggle" then if player:HasQuest(questvar) == true then - boolvar = not player:GetQuest(questvar):GetFlag(flagvar); + boolvar = not player:GetQuest(questvar):GetData():GetFlag(flagvar); end else message = ("error: flag: boolean not recognized"); @@ -126,13 +128,13 @@ function onTrigger(player, argc, command, var1, var2, var3) return; end - var4 = player:GetQuest(questvar):GetFlag(flagvar); + var4 = player:GetQuest(questvar):GetData():GetFlag(flagvar); if var4 ~= boolvar then if (boolvar == true) then - player:GetQuest(questvar):SetFlag(flagvar); + player:GetQuest(questvar):GetData():SetFlag(flagvar); else - player:GetQuest(questvar):ClearFlag(flagvar); + player:GetQuest(questvar):GetData():ClearFlag(flagvar); end player:GetQuest(questvar):UpdateENPCs(); player:GetQuest(questvar):SaveData(); @@ -152,7 +154,7 @@ function onTrigger(player, argc, command, var1, var2, var3) questvar = tonumber(var1); index = (tonumber(var2)); - player:GetQuest(questvar):SetCounter(index, tonumber(var3)); + player:GetQuest(questvar):GetData():SetCounter(index, tonumber(var3)); player:GetQuest(questvar):UpdateENPCs(); player:GetQuest(questvar):SaveData(); message = ("changing counter "..tonumber(var2).." to "..var3); diff --git a/Map Server/Actors/Chara/Player/Player.cs b/Map Server/Actors/Chara/Player/Player.cs index e67e1379..814c3607 100644 --- a/Map Server/Actors/Chara/Player/Player.cs +++ b/Map Server/Actors/Chara/Player/Player.cs @@ -1170,7 +1170,6 @@ namespace Meteor.Map.Actors private void SendCompletedQuests(ushort from, ushort to) { Bitstream completed = questStateManager.GetCompletedBitstream(); - completed.SetAll(true); byte[] data = completed.GetSlice(from, to); SetActorPropetyPacket completedQuestWorkUpdate = new SetActorPropetyPacket(from, to, "playerWork/journal"); diff --git a/Map Server/Actors/Quest/Quest.cs b/Map Server/Actors/Quest/Quest.cs index ee594f85..387f7572 100644 --- a/Map Server/Actors/Quest/Quest.cs +++ b/Map Server/Actors/Quest/Quest.cs @@ -34,7 +34,6 @@ namespace Meteor.Map.Actors.QuestNS private ushort currentSequence; private QuestState questState = null; private QuestData data = null; - private bool dataDirty = false; // Creates a Static Quest for the StaticActors list. public Quest(uint actorID, string className, string classPath) @@ -124,11 +123,11 @@ namespace Meteor.Map.Actors.QuestNS public void UpdateENPCs() { - if (dataDirty) + if (data.Dirty) { if (questState != null) questState.UpdateState(); - dataDirty = false; + data.ClearDirty(); } } @@ -199,8 +198,7 @@ namespace Meteor.Map.Actors.QuestNS if (currentSequence != SEQ_NOT_STARTED) owner.SendGameMessage(Server.GetWorldManager().GetActor(), 25116, 0x20, (object)GetQuestId()); - currentSequence = sequence; - dataDirty = true; + currentSequence = sequence; questState.UpdateState(); } diff --git a/Map Server/Actors/Quest/QuestData.cs b/Map Server/Actors/Quest/QuestData.cs index 4707a03a..02d6800b 100644 --- a/Map Server/Actors/Quest/QuestData.cs +++ b/Map Server/Actors/Quest/QuestData.cs @@ -16,7 +16,8 @@ namespace Meteor.Map.Actors.QuestNS private ushort counter2; private ushort counter3; private ushort counter4; - private bool dataDirty = false; + + public bool Dirty { get; private set; } = false; public QuestData(Player owner, Quest parent, uint flags, ushort counter1, ushort counter2, ushort counter3, ushort counter4) { @@ -46,7 +47,7 @@ namespace Meteor.Map.Actors.QuestNS if (index >= 0 && index < 32) { flags |= (uint)(1 << index); - dataDirty = true; + Dirty = true; } } @@ -55,13 +56,13 @@ namespace Meteor.Map.Actors.QuestNS if (index >= 0 && index < 32) { flags &= (uint)~(1 << index); - dataDirty = true; + Dirty = true; } } public ushort IncCounter(int num) { - dataDirty = true; + Dirty = true; switch (num) { @@ -79,13 +80,13 @@ namespace Meteor.Map.Actors.QuestNS return counter4; } - dataDirty = false; + Dirty = false; return 0; } public ushort DecCounter(int num) { - dataDirty = true; + Dirty = true; switch (num) { @@ -103,13 +104,13 @@ namespace Meteor.Map.Actors.QuestNS return counter4; } - dataDirty = false; + Dirty = false; return 0; } public void SetCounter(int num, ushort value) { - dataDirty = true; + Dirty = true; switch (num) { @@ -127,7 +128,7 @@ namespace Meteor.Map.Actors.QuestNS return; } - dataDirty = false; + Dirty = false; } public bool GetFlag(int index) @@ -159,6 +160,11 @@ namespace Meteor.Map.Actors.QuestNS return 0; } + public void ClearDirty() + { + Dirty = false; + } + public void Save() { Database.UpdateQuest(owner, parent);