2016-06-12 20:12:59 +01:00
|
|
|
|
using FFXIVClassic.Common;
|
2017-04-04 01:10:26 -04:00
|
|
|
|
using FFXIVClassic_Map_Server.lua;
|
2016-04-10 13:11:12 -04:00
|
|
|
|
using Newtonsoft.Json;
|
2016-03-21 11:42:27 -04:00
|
|
|
|
using System;
|
2016-01-25 01:10:43 -05:00
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
|
|
|
|
namespace FFXIVClassic_Map_Server.Actors
|
|
|
|
|
{
|
|
|
|
|
class Quest : Actor
|
|
|
|
|
{
|
2016-04-10 13:11:12 -04:00
|
|
|
|
private Player owner;
|
2017-04-04 01:42:34 -04:00
|
|
|
|
private uint currentPhase = 0;
|
2016-03-21 11:42:27 -04:00
|
|
|
|
private uint questFlags = 0;
|
|
|
|
|
private Dictionary<string, Object> questData = new Dictionary<string, object>();
|
2016-01-25 01:10:43 -05:00
|
|
|
|
|
|
|
|
|
public Quest(uint actorID, string name)
|
|
|
|
|
: base(actorID)
|
|
|
|
|
{
|
2016-04-10 13:11:12 -04:00
|
|
|
|
actorName = name;
|
2016-01-25 01:10:43 -05:00
|
|
|
|
}
|
|
|
|
|
|
2017-04-04 01:42:34 -04:00
|
|
|
|
public Quest(Player owner, uint actorID, string name, string questDataJson, uint questFlags, uint currentPhase)
|
2016-04-10 13:11:12 -04:00
|
|
|
|
: base(actorID)
|
2016-03-21 11:42:27 -04:00
|
|
|
|
{
|
2016-04-10 13:11:12 -04:00
|
|
|
|
this.owner = owner;
|
|
|
|
|
actorName = name;
|
|
|
|
|
this.questFlags = questFlags;
|
2016-04-17 19:09:01 -04:00
|
|
|
|
|
|
|
|
|
if (questDataJson != null)
|
|
|
|
|
this.questData = JsonConvert.DeserializeObject<Dictionary<string, Object>>(questDataJson);
|
|
|
|
|
else
|
|
|
|
|
questData = null;
|
|
|
|
|
|
2016-04-10 13:11:12 -04:00
|
|
|
|
if (questData == null)
|
|
|
|
|
questData = new Dictionary<string, object>();
|
2017-04-04 01:42:34 -04:00
|
|
|
|
|
|
|
|
|
this.currentPhase = currentPhase;
|
2016-03-21 11:42:27 -04:00
|
|
|
|
}
|
2016-04-10 13:11:12 -04:00
|
|
|
|
|
|
|
|
|
public void SetQuestData(string dataName, object data)
|
|
|
|
|
{
|
2016-03-21 11:42:27 -04:00
|
|
|
|
questData[dataName] = data;
|
|
|
|
|
|
|
|
|
|
//Inform update
|
|
|
|
|
}
|
|
|
|
|
|
2017-03-07 00:09:37 -05:00
|
|
|
|
public uint GetQuestId()
|
|
|
|
|
{
|
|
|
|
|
return actorId & 0xFFFFF;
|
|
|
|
|
}
|
|
|
|
|
|
2016-03-21 11:42:27 -04:00
|
|
|
|
public object GetQuestData(string dataName)
|
|
|
|
|
{
|
|
|
|
|
if (questData.ContainsKey(dataName))
|
|
|
|
|
return questData[dataName];
|
|
|
|
|
else
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
2016-04-14 08:30:21 -04:00
|
|
|
|
public void ClearQuestData()
|
|
|
|
|
{
|
|
|
|
|
questData.Clear();
|
2017-03-07 00:09:37 -05:00
|
|
|
|
}
|
2016-03-21 11:42:27 -04:00
|
|
|
|
|
2016-04-14 08:30:21 -04:00
|
|
|
|
public void ClearQuestFlags()
|
|
|
|
|
{
|
|
|
|
|
questFlags = 0;
|
|
|
|
|
}
|
|
|
|
|
|
2016-03-21 11:42:27 -04:00
|
|
|
|
public void SetQuestFlag(int bitIndex, bool value)
|
|
|
|
|
{
|
|
|
|
|
if (bitIndex >= 32)
|
|
|
|
|
{
|
2016-06-14 05:09:30 +01:00
|
|
|
|
Program.Log.Error("Tried to access bit flag >= 32 for questId: {0}", actorId);
|
2016-03-21 11:42:27 -04:00
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int mask = 1 << bitIndex;
|
|
|
|
|
|
|
|
|
|
if (value)
|
|
|
|
|
questFlags |= (uint)(1 << bitIndex);
|
|
|
|
|
else
|
|
|
|
|
questFlags &= (uint)~(1 << bitIndex);
|
|
|
|
|
|
2017-04-04 01:10:26 -04:00
|
|
|
|
DoCompletionCheck();
|
2016-03-21 11:42:27 -04:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public bool GetQuestFlag(int bitIndex)
|
|
|
|
|
{
|
|
|
|
|
if (bitIndex >= 32)
|
|
|
|
|
{
|
2016-06-14 05:09:30 +01:00
|
|
|
|
Program.Log.Error("Tried to access bit flag >= 32 for questId: {0}", actorId);
|
2016-03-21 11:42:27 -04:00
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
else
|
2016-04-07 22:34:10 -04:00
|
|
|
|
return (questFlags & (1 << bitIndex)) == (1 << bitIndex);
|
2016-03-21 11:42:27 -04:00
|
|
|
|
}
|
|
|
|
|
|
2017-04-04 01:42:34 -04:00
|
|
|
|
public uint GetPhase()
|
2016-03-21 11:42:27 -04:00
|
|
|
|
{
|
|
|
|
|
return currentPhase;
|
|
|
|
|
}
|
|
|
|
|
|
2017-04-04 01:42:34 -04:00
|
|
|
|
public void NextPhase(uint phaseNumber)
|
2016-03-21 11:42:27 -04:00
|
|
|
|
{
|
2017-03-07 00:09:37 -05:00
|
|
|
|
currentPhase = phaseNumber;
|
|
|
|
|
owner.SendGameMessage(Server.GetWorldManager().GetActor(), 25116, 0x20, (object)GetQuestId());
|
|
|
|
|
SaveData();
|
2017-04-04 01:10:26 -04:00
|
|
|
|
|
|
|
|
|
DoCompletionCheck();
|
2016-03-21 11:42:27 -04:00
|
|
|
|
}
|
|
|
|
|
|
2016-04-10 13:11:12 -04:00
|
|
|
|
public uint GetQuestFlags()
|
|
|
|
|
{
|
|
|
|
|
return questFlags;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public string GetSerializedQuestData()
|
|
|
|
|
{
|
|
|
|
|
return JsonConvert.SerializeObject(questData, Formatting.Indented);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void SaveData()
|
|
|
|
|
{
|
2016-06-14 21:29:10 +01:00
|
|
|
|
Database.SaveQuest(owner, this);
|
2016-04-10 13:11:12 -04:00
|
|
|
|
}
|
|
|
|
|
|
2017-04-04 01:10:26 -04:00
|
|
|
|
public void DoCompletionCheck()
|
|
|
|
|
{
|
2017-04-29 20:30:54 -04:00
|
|
|
|
List<LuaParam> returned = LuaEngine.GetInstance().CallLuaFunctionForReturn(owner, this, "isObjectivesComplete", true);
|
2017-04-04 01:25:08 -04:00
|
|
|
|
if (returned != null && returned.Count >= 1 && returned[0].typeID == 3)
|
2017-04-04 01:10:26 -04:00
|
|
|
|
{
|
2017-04-04 01:21:06 -04:00
|
|
|
|
owner.SendDataPacket("attention", Server.GetWorldManager().GetActor(), "", 25225, (object)GetQuestId());
|
|
|
|
|
owner.SendGameMessage(Server.GetWorldManager().GetActor(), 25225, 0x20, (object)GetQuestId());
|
2017-04-04 01:10:26 -04:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void DoAbandon()
|
|
|
|
|
{
|
2017-04-29 20:30:54 -04:00
|
|
|
|
LuaEngine.GetInstance().CallLuaFunctionForReturn(owner, this, "onAbandonQuest", true);
|
2017-04-04 01:10:26 -04:00
|
|
|
|
owner.SendGameMessage(owner, Server.GetWorldManager().GetActor(), 25236, 0x20, (object)GetQuestId());
|
|
|
|
|
}
|
|
|
|
|
|
2016-01-25 01:10:43 -05:00
|
|
|
|
}
|
|
|
|
|
}
|