mirror of
https://bitbucket.org/Ioncannon/project-meteor-server.git
synced 2025-06-11 06:54:43 +02:00
Got aetheryte map and completed quest work values... working.
This commit is contained in:
parent
a2c4d077e9
commit
306f4ef346
11 changed files with 546 additions and 382 deletions
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue