Got aetheryte map and completed quest work values... working.

This commit is contained in:
Filip Maj 2022-02-19 01:17:50 -05:00
parent a2c4d077e9
commit 306f4ef346
11 changed files with 546 additions and 382 deletions

View file

@ -47,6 +47,7 @@ using Meteor.Map.packets.send.actor.battle;
using Meteor.Map.packets.receive.events;
using static Meteor.Map.LuaUtils;
using Meteor.Map.packets.send.actor.events;
using System.Text;
namespace Meteor.Map.Actors
{
@ -243,8 +244,7 @@ namespace Meteor.Map.Actors
charaWork.command[15] = 0xA0F00000 | 22015;
charaWork.commandAcquired[27150 - 26000] = true;
playerWork.questScenarioComplete[110001 - 110001] = true;
playerWork.questGuildleveComplete[120050 - 120001] = true;
for (int i = 0; i < charaWork.additionalCommandAcquired.Length; i++ )
@ -278,7 +278,7 @@ namespace Meteor.Map.Actors
CalculateBaseStats();
questStateManager = new QuestStateManager(this);
questStateManager.Init(questScenario);
questStateManager.Init(questScenario, playerWork.questScenarioComplete);
}
public List<SubPacket> Create0x132Packets()
@ -1157,6 +1157,44 @@ namespace Meteor.Map.Actors
}
private void SendAchievedAetheryte(ushort from, ushort to)
{
Bitstream fakeAetheryte = new Bitstream(512, true);
SetActorPropetyPacket completedQuestWorkUpdate = new SetActorPropetyPacket(from, to, "work/achieveAetheryte");
completedQuestWorkUpdate.AddBitfield(Utils.MurmurHash2("work.event_achieve_aetheryte", 0), fakeAetheryte.GetSlice(from, to));
completedQuestWorkUpdate.AddTarget();
QueuePacket(completedQuestWorkUpdate.BuildPacket(Id));
}
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");
completedQuestWorkUpdate.AddBitfield(Utils.MurmurHash2("playerWork.questScenarioComplete", 0), data);
completedQuestWorkUpdate.AddTarget();
QueuePacket(completedQuestWorkUpdate.BuildPacket(Id));
}
public void OnWorkSyncRequest(string propertyName, ushort from = 0, ushort to = 0)
{
switch (propertyName)
{
case "charaWork/exp":
SendCharaExpInfo();
break;
case "work/achieveAetheryte":
SendAchievedAetheryte(from, to);
break;
case "playerWork/questCompleteS":
SendCompletedQuests(from, to);
break;
}
}
public int GetHighestLevel()
{
int max = 0;
@ -1436,7 +1474,6 @@ namespace Meteor.Map.Actors
playerWork.questScenario[freeSlot] = instance.Id;
questScenario[freeSlot] = instance;
Database.SaveQuest(this, questScenario[freeSlot], freeSlot);
SendQuestClientUpdate(freeSlot);
if (!isSilent)
@ -1446,6 +1483,8 @@ namespace Meteor.Map.Actors
instance.OnAccept();
Database.SaveQuest(this, questScenario[freeSlot], freeSlot);
return true;
}
@ -1458,8 +1497,11 @@ namespace Meteor.Map.Actors
{
questScenario[i] = newQuestInstance;
playerWork.questScenario[i] = questScenario[i].Id;
Database.SaveQuest(this, questScenario[i], i);
SendQuestClientUpdate(i);
oldQuestInstance.OnComplete();
questStateManager.UpdateQuestCompleted(oldQuestInstance);
newQuestInstance.OnAccept();
Database.SaveQuest(this, questScenario[i], i);
break;
}
}
@ -1472,14 +1514,14 @@ namespace Meteor.Map.Actors
{
// Remove the quest from the DB and update client work values
playerWork.questScenarioComplete[completed.GetQuestId() - 110001] = true;
Database.CompleteQuest(playerSession.GetActor(), completed.Id);
Database.RemoveQuest(this, completed.Id);
questScenario[slot] = null;
playerWork.questScenario[slot] = 0;
SendQuestClientUpdate(slot);
// Reset active quest and quest state
completed.OnComplete();
Database.SaveCompletedQuests(playerSession.GetActor());
Database.RemoveQuest(this, completed.Id);
questStateManager.UpdateQuestCompleted(completed);
// Msg Player
@ -1512,13 +1554,13 @@ namespace Meteor.Map.Actors
}
// Remove the quest from the DB and update client work values
Database.RemoveQuest(this, abandoned.Id);
questScenario[slot] = null;
playerWork.questScenario[slot] = 0;
SendQuestClientUpdate(slot);
// Reset active quest and quest state
abandoned.OnAbandon();
Database.RemoveQuest(this, abandoned.Id);
questStateManager.UpdateQuestAbandoned();
// Msg Player

View file

@ -15,6 +15,7 @@ namespace Meteor.Map.Actors.QuestNS
private const int SCENARIO_MAX = 2048;
private readonly Player player;
private readonly Bitstream CompletedQuestsBitfield = new Bitstream(SCENARIO_MAX);
private readonly Bitstream AvailableQuestsBitfield = new Bitstream(SCENARIO_MAX);
private readonly Bitstream MinLevelBitfield = new Bitstream(SCENARIO_MAX);
private readonly Bitstream PrereqBitfield = new Bitstream(SCENARIO_MAX, true);
@ -28,12 +29,12 @@ namespace Meteor.Map.Actors.QuestNS
this.player = player;
}
public void Init(Quest[] questScenario)
public void Init(Quest[] journalQuests, bool[] completedQuests)
{
// Preload any quests that the player loaded
if (questScenario != null)
if (journalQuests != null)
{
foreach (var quest in questScenario)
foreach (var quest in journalQuests)
{
if (quest != null)
{
@ -49,10 +50,10 @@ namespace Meteor.Map.Actors.QuestNS
MinLevelBitfield.Set(questData.Id - SCENARIO_START);
// Init Prereq
Bitstream completed = new Bitstream(player.playerWork.questScenarioComplete);
CompletedQuestsBitfield.SetTo(completedQuests);
foreach (var questData in Server.GetQuestGamedataAllPrerequisite())
{
if (completed.Get(((Quest)Server.GetStaticActors(0xA0F00000 | questData.PrerequisiteQuest)).GetQuestId() - SCENARIO_START))
if (CompletedQuestsBitfield.Get(((Quest)Server.GetStaticActors(0xA0F00000 | questData.PrerequisiteQuest)).GetQuestId() - SCENARIO_START))
PrereqBitfield.Set(questData.Id - SCENARIO_START);
else
PrereqBitfield.Clear(questData.Id - SCENARIO_START);
@ -71,6 +72,7 @@ namespace Meteor.Map.Actors.QuestNS
public void UpdateQuestCompleted(Quest quest)
{
CompletedQuestsBitfield.Set(quest.Id - SCENARIO_START);
QuestGameData[] updated = Server.GetQuestGamedataByPrerequisite(quest.GetQuestId());
foreach (var questData in updated)
PrereqBitfield.Set(questData.Id - SCENARIO_START);
@ -84,7 +86,8 @@ namespace Meteor.Map.Actors.QuestNS
private void ComputeAvailable()
{
Bitstream result = new Bitstream(player.playerWork.questScenarioComplete);
Bitstream result = new Bitstream(SCENARIO_MAX);
result.OR(CompletedQuestsBitfield);
result.NOT();
result.AND(MinLevelBitfield);
result.AND(PrereqBitfield);
@ -152,5 +155,10 @@ namespace Meteor.Map.Actors.QuestNS
{
return ActiveQuests.FindAll(quest => quest.IsQuestENPC(player, npc)).ToArray();
}
public Bitstream GetCompletedBitstream()
{
return CompletedQuestsBitfield;
}
}
}