diff --git a/Campofinale/Campofinale.csproj b/Campofinale/Campofinale.csproj
index c3242e2..5cc10f4 100644
--- a/Campofinale/Campofinale.csproj
+++ b/Campofinale/Campofinale.csproj
@@ -50,6 +50,9 @@
Always
+
+ Always
+
Always
diff --git a/Campofinale/Commands/Handlers/CommandAdd.cs b/Campofinale/Commands/Handlers/CommandAdd.cs
index fd88b2b..1082a7b 100644
--- a/Campofinale/Commands/Handlers/CommandAdd.cs
+++ b/Campofinale/Commands/Handlers/CommandAdd.cs
@@ -1,4 +1,4 @@
-using Campofinale.Game.Character;
+using Campofinale.Game.Char;
using Campofinale.Game.Inventory;
using Campofinale.Packets.Sc;
diff --git a/Campofinale/Commands/Handlers/CommandCharInfo.cs b/Campofinale/Commands/Handlers/CommandCharInfo.cs
index 6dc08ef..fa7bacb 100644
--- a/Campofinale/Commands/Handlers/CommandCharInfo.cs
+++ b/Campofinale/Commands/Handlers/CommandCharInfo.cs
@@ -1,5 +1,5 @@
using static Campofinale.Resource.ResourceManager;
-using Campofinale.Game.Character;
+using Campofinale.Game.Char;
using Campofinale.Database;
using Campofinale.Game.Inventory;
diff --git a/Campofinale/Commands/Handlers/CommandLevel.cs b/Campofinale/Commands/Handlers/CommandLevel.cs
index 757fe87..768bb67 100644
--- a/Campofinale/Commands/Handlers/CommandLevel.cs
+++ b/Campofinale/Commands/Handlers/CommandLevel.cs
@@ -2,7 +2,7 @@
using Campofinale.Packets.Sc;
using Campofinale.Resource;
-namespace Campofinale.Game.Character
+namespace Campofinale.Game.Char
{
public static class CharacterManager
{
diff --git a/Campofinale/Commands/Handlers/CommandRemove.cs b/Campofinale/Commands/Handlers/CommandRemove.cs
index fcec4a7..eca0184 100644
--- a/Campofinale/Commands/Handlers/CommandRemove.cs
+++ b/Campofinale/Commands/Handlers/CommandRemove.cs
@@ -1,5 +1,5 @@
using Campofinale.Database;
-using Campofinale.Game.Character;
+using Campofinale.Game.Char;
using Campofinale.Packets.Sc;
namespace Campofinale.Commands.Handlers;
diff --git a/Campofinale/Data/Conditions.json b/Campofinale/Data/Conditions.json
new file mode 100644
index 0000000..272d0c0
--- /dev/null
+++ b/Campofinale/Data/Conditions.json
@@ -0,0 +1,19 @@
+{
+ "cond_ab_01_01":
+ {
+ "args": [
+ "10"
+ ]
+ },
+ "cond_daily_001":{
+ "args":[
+ "DailyLogin"
+ ]
+ },
+ "cond_daily_005":
+ {
+ "args":[
+ "DailyCharLevelUp"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/Campofinale/Database/Database.cs b/Campofinale/Database/Database.cs
index 84af0ee..d174064 100644
--- a/Campofinale/Database/Database.cs
+++ b/Campofinale/Database/Database.cs
@@ -1,5 +1,6 @@
using Campofinale.Game;
-using Campofinale.Game.Character;
+using Campofinale.Game.Adventure;
+using Campofinale.Game.Char;
using Campofinale.Game.Gacha;
using Campofinale.Game.Inventory;
using Campofinale.Game.MissionSys;
@@ -9,6 +10,7 @@ using MongoDB.Bson.Serialization.Attributes;
using MongoDB.Driver;
using System.Security.Cryptography;
using System.Text;
+using static Campofinale.Game.Adventure.AdventureBookManager;
using static Campofinale.Resource.ResourceManager;
namespace Campofinale.Database
@@ -33,6 +35,7 @@ namespace Campofinale.Database
public long maxDashEnergy = 250;
public uint curStamina;
public long nextRecoverTime;
+ public long nextDailyReset;
public List scenes = new();
public Dictionary> bitsets = new();
public PlayerSafeZoneInfo savedSafeZone = new();
@@ -84,6 +87,10 @@ namespace Campofinale.Database
{
return _database.GetCollection("missionsData").Find(c => c.roleId == roleId).FirstOrDefault();
}
+ public AdventureBookData LoadAdventureBookData(ulong roleId)
+ {
+ return _database.GetCollection("adventureBookData").Find(c => c.roleId == roleId).FirstOrDefault();
+ }
public List LoadCharacters(ulong roleId)
{
return _database.GetCollection("avatars").Find(c=>c.owner== roleId).ToList();
@@ -152,7 +159,8 @@ namespace Campofinale.Database
bitsets=player.bitsetManager.bitsets,
savedSafeZone = player.savedSaveZone,
gender=player.gender,
- bag=player.inventoryManager.items.bag
+ bag=player.inventoryManager.items.bag,
+ nextDailyReset = player.nextDailyReset,
};
UpsertPlayerData(data);
}
@@ -256,6 +264,23 @@ namespace Campofinale.Database
new ReplaceOptions { IsUpsert = true }
);
}
+ public void UpsertAdventureBookData(AdventureBookManager.AdventureBookData data)
+ {
+ if (data._id == ObjectId.Empty)
+ {
+ data._id = ObjectId.GenerateNewId();
+ }
+ var collection = _database.GetCollection("adventureBookData");
+
+ var filter =
+ Builders.Filter.Eq(c => c.roleId, data.roleId);
+
+ var result = collection.ReplaceOne(
+ filter,
+ data,
+ new ReplaceOptions { IsUpsert = true }
+ );
+ }
public void UpsertCharacter(Character character)
{
if (character._id == ObjectId.Empty)
@@ -402,6 +427,6 @@ namespace Campofinale.Database
}
}
-
+
}
}
diff --git a/Campofinale/Game/Adventure/AdventureBookManager.cs b/Campofinale/Game/Adventure/AdventureBookManager.cs
new file mode 100644
index 0000000..719673f
--- /dev/null
+++ b/Campofinale/Game/Adventure/AdventureBookManager.cs
@@ -0,0 +1,252 @@
+using Campofinale.Database;
+using Campofinale.Game.Factory;
+using Campofinale.Game.Spaceship;
+using Campofinale.Resource;
+using MongoDB.Bson.Serialization.Attributes;
+using MongoDB.Bson;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Text;
+using System.Threading.Tasks;
+using static Campofinale.Resource.ResourceManager;
+using MongoDB.Bson.Serialization.IdGenerators;
+using Campofinale.Game.Char;
+using Campofinale.Resource.Json;
+using Campofinale.Protocol;
+
+namespace Campofinale.Game.Adventure
+{
+ public class AdventureBookManager
+ {
+ public Player player;
+ public AdventureBookData data = new();
+
+ public AdventureBookManager(Player player)
+ {
+ this.player = player;
+ }
+ public void Load()
+ {
+ AdventureBookData toLoad= DatabaseManager.db.LoadAdventureBookData(player.roleId);
+ if (toLoad != null)
+ {
+ data = toLoad;
+ }
+ else
+ {
+ data.roleId = player.roleId;
+ }
+ if (data.adventureBookStage == 0)
+ {
+ InitNextStage();
+ }
+ }
+
+ public void DailyReset()
+ {
+ data.tasks.RemoveAll(t => t.GetTaskTable().taskType == AdventureTaskType.Daily);
+ data.dailyActivation = 0;
+ data.dailyCharLevelUp = 0;
+ data.dailyLogin = 0;
+ ResourceManager.adventureTaskTable.Values.ToList().ForEach(task =>
+ {
+ if (task.taskType == AdventureTaskType.Daily)
+ {
+ data.tasks.Add(new GameAdventureTask()
+ {
+ adventureTaskId = task.adventureTaskId,
+ claimed = false
+ });
+ }
+ });
+ }
+ public void Save()
+ {
+ DatabaseManager.db.UpsertAdventureBookData(data);
+ }
+ public void TaskUpdate(ConditionType condType, object obj=null)
+ {
+ List toUpdate = new();
+ data.tasks.FindAll(t=>t.GetTaskTable().conditionType==condType).ForEach(task =>
+ {
+ if(task.TaskUpdate(this.player, obj))
+ {
+ toUpdate.Add(task);
+ }
+ });
+ if (toUpdate.Count > 0)
+ {
+ ScAdventureTaskModify modify = new ScAdventureTaskModify()
+ {
+
+ };
+ toUpdate.ForEach(t =>
+ {
+ modify.Tasks.Add(t.ToProto());
+ });
+ player.Send(ScMsgId.ScAdventureTaskModify, modify);
+ }
+ }
+ public void InitNextStage(bool notify=false)
+ {
+ data.adventureBookStage++;
+ data.tasks.RemoveAll(t => t.GetTaskTable().taskType == AdventureTaskType.AdventureBook);
+ ResourceManager.adventureTaskTable.Values.ToList().ForEach(task =>
+ {
+ if(task.adventureBookStage == data.adventureBookStage)
+ {
+ data.tasks.Add(new GameAdventureTask()
+ {
+ adventureTaskId = task.adventureTaskId,
+ claimed=false
+ });
+ }
+ });
+ //TODO Update everything
+ }
+
+ public void ClaimTask(string taskId)
+ {
+ data.tasks.ForEach(t =>
+ {
+ if (t.adventureTaskId == taskId && t.GetState() == AdventureTaskState.Completed)
+ {
+ t.ClaimRewards(player);
+ }
+ });
+ }
+
+ public void ClaimTasks(AdventureTaskType taskType)
+ {
+ data.tasks.ForEach(t =>
+ {
+ if (t.GetTaskTable().taskType==taskType && t.GetState() == AdventureTaskState.Completed)
+ {
+ t.ClaimRewards(player);
+ }
+ });
+ }
+
+ public class GameAdventureTask
+ {
+ public string adventureTaskId;
+ public int progress;
+ public bool claimed;
+
+ public void ClaimRewards(Player player)
+ {
+ player.inventoryManager.AddRewards(GetTaskTable().rewardId, player.position, 0);
+ claimed= true;
+ ScAdventureTaskModify modify = new()
+ {
+ Tasks =
+ {
+ ToProto()
+ }
+ };
+ player.Send(ScMsgId.ScAdventureTaskModify, modify);
+ }
+ public AdventureTaskState GetState()
+ {
+ if(progress < GetTaskTable().progressToCompare)
+ {
+ return AdventureTaskState.Processing;
+ }else if (!claimed)
+ {
+ return AdventureTaskState.Completed;
+ }
+ else
+ {
+ return AdventureTaskState.Rewarded;
+ }
+ }
+ public bool TaskUpdate(Player owner, object obj)
+ {
+ ConditionType condType = GetTaskTable().conditionType;
+ ConditionData cond;
+ if(ResourceManager.conditions.TryGetValue(GetTaskTable().conditionId, out cond))
+ {
+ int count = 0;
+ switch (condType)
+ {
+ case ConditionType.CheckStatisticVal:
+ switch (Enum.Parse(typeof(StatType), cond.Get(0)))
+ {
+ case StatType.DailyCharLevelUp:
+ count = owner.adventureBookManager.data.dailyCharLevelUp;
+ break;
+ case StatType.DailyLogin:
+ count = owner.adventureBookManager.data.dailyLogin;
+ break;
+ default:
+ break;
+ }
+ if (count > progress)
+ {
+ progress = count;
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ case ConditionType.CheckGreaterCharLevelNum:
+ count = 0;
+ owner.chars.ForEach(c =>
+ {
+ if(c.level >= cond.ToInt(0))
+ {
+ count++;
+ }
+ });
+ if (count > progress)
+ {
+ progress = count;
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ default:
+ return false;
+ }
+ }
+ else
+ {
+ return false;
+ }
+
+ }
+ public AdventureTaskTable GetTaskTable()
+ {
+ return ResourceManager.adventureTaskTable.Values.ToList().Find(a => a.adventureTaskId == adventureTaskId);
+ }
+
+ public AdventureTask ToProto()
+ {
+ return new AdventureTask()
+ {
+ Progress = progress,
+ State = (int)GetState(),
+ TaskId = adventureTaskId,
+ };
+ }
+ }
+ public class AdventureBookData
+ {
+ [BsonId(IdGenerator = typeof(ObjectIdGenerator))]
+ public ObjectId _id { get; set; }
+ public ulong roleId;
+ public int adventureBookStage = 0;
+ public int dailyActivation = 0;
+ public List tasks = new();
+ public int dailyCharLevelUp = 0;
+ public int dailyLogin = 0;
+
+ }
+ }
+
+}
diff --git a/Campofinale/Game/Character/Character.cs b/Campofinale/Game/Char/Character.cs
similarity index 97%
rename from Campofinale/Game/Character/Character.cs
rename to Campofinale/Game/Char/Character.cs
index 86b8414..7004c11 100644
--- a/Campofinale/Game/Character/Character.cs
+++ b/Campofinale/Game/Char/Character.cs
@@ -10,7 +10,7 @@ using static Campofinale.Resource.ResourceManager;
using static Campofinale.Resource.ResourceManager.CharGrowthTable;
using static Campofinale.Resource.ResourceManager.WeaponUpgradeTemplateTable;
-namespace Campofinale.Game.Character
+namespace Campofinale.Game.Char
{
public class Character
{
@@ -459,8 +459,6 @@ namespace Campofinale.Game.Character
ScCharLevelUp levelUp = new()
{
CharObjID = guid,
-
-
};
ScCharSyncLevelExp synclevel = new()
{
@@ -471,6 +469,10 @@ namespace Campofinale.Game.Character
GetOwner().Send(ScMsgId.ScCharSyncLevelExp, synclevel);
GetOwner().Send(ScMsgId.ScCharLevelUp, levelUp);
GetOwner().Send(new PacketScSyncWallet(GetOwner()));
+ GetOwner().adventureBookManager.TaskUpdate(ConditionType.CheckGreaterCharLevelNum);
+ GetOwner().adventureBookManager.TaskUpdate(ConditionType.CharMaxLevel);
+ GetOwner().adventureBookManager.data.dailyCharLevelUp++;
+ GetOwner().adventureBookManager.TaskUpdate(ConditionType.CheckStatisticVal);
}
}
}
diff --git a/Campofinale/Game/Entities/EntityCharacter.cs b/Campofinale/Game/Entities/EntityCharacter.cs
index 806f932..ffc9689 100644
--- a/Campofinale/Game/Entities/EntityCharacter.cs
+++ b/Campofinale/Game/Entities/EntityCharacter.cs
@@ -98,7 +98,7 @@ namespace Campofinale.Game.Entities
GetOwner().Send(ScMsgId.ScCharSyncStatus, state);
GetOwner().Send(ScMsgId.ScEntityPropertyChange, prop);
}
- public Character.Character GetChar()
+ public Char.Character GetChar()
{
return GetOwner().chars.Find(c => c.guid == guid);
}
diff --git a/Campofinale/Game/Inventory/InventoryManager.cs b/Campofinale/Game/Inventory/InventoryManager.cs
index fa7b733..fdf4620 100644
--- a/Campofinale/Game/Inventory/InventoryManager.cs
+++ b/Campofinale/Game/Inventory/InventoryManager.cs
@@ -63,8 +63,12 @@ namespace Campofinale.Game.Inventory
{
id=bundle.id
};
-
- if (!item.InstanceType())
+ if(bundle.id == "item_daily_activation")
+ {
+ owner.adventureBookManager.data.dailyActivation += bundle.count;
+ continue;
+ }
+ if (!item.InstanceType() || sourceType == 0)
{
item = AddItem(bundle.id, bundle.count);
end.RewardVirtualList.Add(new RewardItem()
diff --git a/Campofinale/Game/SceneManager.cs b/Campofinale/Game/SceneManager.cs
index ff9e569..3602800 100644
--- a/Campofinale/Game/SceneManager.cs
+++ b/Campofinale/Game/SceneManager.cs
@@ -46,7 +46,7 @@ namespace Campofinale.Game
public void LoadCurrentTeamEntities()
{
globalEntities.RemoveAll(e => e is EntityCharacter);
- foreach (Character.Character chara in player.GetCurTeam())
+ foreach (Char.Character chara in player.GetCurTeam())
{
EntityCharacter ch = new(chara.guid, player.roleId);
globalEntities.Add(ch);
diff --git a/Campofinale/Http/Dispatch.cs b/Campofinale/Http/Dispatch.cs
index 24d56be..17a271f 100644
--- a/Campofinale/Http/Dispatch.cs
+++ b/Campofinale/Http/Dispatch.cs
@@ -156,7 +156,7 @@ namespace Campofinale.Http
string appCode = ctx.Request.Query.Elements["appCode"];
- string resp = "{\"data\":{\"agreementUrl\":{\"register\":\"https://user.gryphline.com/{language}/protocol/plain/terms_of_service\",\"privacy\":\"https://user.gryphline.com/{language}/protocol/plain/privacy_policy\",\"unbind\":\"https://user.gryphline.com/{language}/protocol/plain/endfield/privacy_policy\",\"account\":\"https://user.gryphline.com/{language}/protocol/plain/terms_of_service\",\"game\":\"https://user.gryphline.com/{language}/protocol/plain/endfield/privacy_policy\"},\"app\":{\"googleAndroidClientId\":\"\",\"googleIosClientId\":\"\",\"enableAutoLogin\":true,\"enablePayment\":true,\"enableGuestRegister\":false,\"needShowName\":true,\"displayName\":{\"en-us\":\"Arknights: Endfield\",\"ja-jp\":\"アークナイツ:エンドフィールド\",\"ko-kr\":\"명일방주:엔드필드\",\"zh-cn\":\"明日方舟:终末地\",\"zh-tw\":\"明日方舟:終末地\"},\"unbindAgreement\":[],\"unbindLimitedDays\":30,\"unbindCoolDownDays\":14,\"customerServiceUrl\":\"https://gryphline.helpshift.com/hc/{language}/4-arknights-endfield\",\"enableUnbindGrant\":false},\"customerServiceUrl\":\"https://gryphline.helpshift.com/hc/{language}/4-arknights-endfield\",\"thirdPartyRedirectUrl\":\"https://web-api.gryphline.com/callback/thirdPartyAuth.html\",\"scanUrl\":{\"login\":\"yj://scan_login\"},\"loginChannels\":[],\"userCenterUrl\":\"https://user.gryphline.com/pcSdk/userInfo?language={language}\"},\"msg\":\"OK\",\"status\":0,\"type\":\"A\"}";
+ string resp = "{\"data\":{\"agreementUrl\":{\"register\":\"https://user.gryphline.com/{language}/protocol/plain/terms_of_service\",\"privacy\":\"https://user.gryphline.com/{language}/protocol/plain/privacy_policy\",\"unbind\":\"https://user.gryphline.com/{language}/protocol/plain/endfield/privacy_policy\",\"account\":\"https://user.gryphline.com/{language}/protocol/plain/terms_of_service\",\"game\":\"https://user.gryphline.com/{language}/protocol/plain/endfield/privacy_policy\"},\"app\":{\"googleAndroidClientId\":\"\",\"googleIosClientId\":\"\",\"enableAutoLogin\":true,\"enablePayment\":true,\"enableGuestRegister\":true,\"needShowName\":true,\"displayName\":{\"en-us\":\"Arknights: Endfield\",\"ja-jp\":\"アークナイツ:エンドフィールド\",\"ko-kr\":\"명일방주:엔드필드\",\"zh-cn\":\"明日方舟:终末地\",\"zh-tw\":\"明日方舟:終末地\"},\"unbindAgreement\":[],\"unbindLimitedDays\":30,\"unbindCoolDownDays\":14,\"customerServiceUrl\":\"https://gryphline.helpshift.com/hc/{language}/4-arknights-endfield\",\"enableUnbindGrant\":false},\"customerServiceUrl\":\"https://gryphline.helpshift.com/hc/{language}/4-arknights-endfield\",\"thirdPartyRedirectUrl\":\"https://web-api.gryphline.com/callback/thirdPartyAuth.html\",\"scanUrl\":{\"login\":\"yj://scan_login\"},\"loginChannels\":[],\"userCenterUrl\":\"https://user.gryphline.com/pcSdk/userInfo?language={language}\"},\"msg\":\"OK\",\"status\":0,\"type\":\"A\"}";
if(appCode == "a65356244d22261b")
{
diff --git a/Campofinale/Packets/Cs/HandleCsAdventureTakeRewardAll.cs b/Campofinale/Packets/Cs/HandleCsAdventureTakeRewardAll.cs
new file mode 100644
index 0000000..f7fabac
--- /dev/null
+++ b/Campofinale/Packets/Cs/HandleCsAdventureTakeRewardAll.cs
@@ -0,0 +1,19 @@
+using Campofinale.Network;
+using Campofinale.Protocol;
+using Campofinale.Resource;
+
+namespace Campofinale.Packets.Cs
+{
+ public class HandleCsAdventureTakeRewardAll
+ {
+
+ [Server.Handler(CsMsgId.CsAdventureTakeRewardAll)]
+ public static void Handle(Player session, CsMsgId cmdId, Packet packet)
+ {
+ CsAdventureTakeRewardAll req = packet.DecodeBody();
+ //TODO
+
+ }
+
+ }
+}
diff --git a/Campofinale/Packets/Cs/HandleCsBattleOp.cs b/Campofinale/Packets/Cs/HandleCsBattleOp.cs
index 8446e08..d68c292 100644
--- a/Campofinale/Packets/Cs/HandleCsBattleOp.cs
+++ b/Campofinale/Packets/Cs/HandleCsBattleOp.cs
@@ -1,4 +1,4 @@
-using Campofinale.Game.Character;
+using Campofinale.Game.Char;
using Campofinale.Game.Entities;
using Campofinale.Network;
using Campofinale.Protocol;
diff --git a/Campofinale/Packets/Cs/HandleCsCharLevelUp.cs b/Campofinale/Packets/Cs/HandleCsCharLevelUp.cs
index a4d0714..4010de0 100644
--- a/Campofinale/Packets/Cs/HandleCsCharLevelUp.cs
+++ b/Campofinale/Packets/Cs/HandleCsCharLevelUp.cs
@@ -1,4 +1,4 @@
-using Campofinale.Game.Character;
+using Campofinale.Game.Char;
using Campofinale.Network;
using Campofinale.Protocol;
diff --git a/Campofinale/Packets/Cs/HandleCsCharPotentialUnlock.cs b/Campofinale/Packets/Cs/HandleCsCharPotentialUnlock.cs
index bf2b64b..6ca8531 100644
--- a/Campofinale/Packets/Cs/HandleCsCharPotentialUnlock.cs
+++ b/Campofinale/Packets/Cs/HandleCsCharPotentialUnlock.cs
@@ -1,4 +1,4 @@
-using Campofinale.Game.Character;
+using Campofinale.Game.Char;
using Campofinale.Network;
using Campofinale.Protocol;
diff --git a/Campofinale/Packets/Cs/HandleCsCharUnlockTalentNode.cs b/Campofinale/Packets/Cs/HandleCsCharUnlockTalentNode.cs
index 0d2ea8a..6754d21 100644
--- a/Campofinale/Packets/Cs/HandleCsCharUnlockTalentNode.cs
+++ b/Campofinale/Packets/Cs/HandleCsCharUnlockTalentNode.cs
@@ -1,4 +1,4 @@
-using Campofinale.Game.Character;
+using Campofinale.Game.Char;
using Campofinale.Network;
using Campofinale.Protocol;
diff --git a/Campofinale/Packets/Cs/HandleCsEquipPutoff.cs b/Campofinale/Packets/Cs/HandleCsEquipPutoff.cs
index 3cbc030..037a180 100644
--- a/Campofinale/Packets/Cs/HandleCsEquipPutoff.cs
+++ b/Campofinale/Packets/Cs/HandleCsEquipPutoff.cs
@@ -1,4 +1,4 @@
-using Campofinale.Game.Character;
+using Campofinale.Game.Char;
using Campofinale.Network;
using Campofinale.Protocol;
diff --git a/Campofinale/Packets/Cs/HandleCsEquipPuton.cs b/Campofinale/Packets/Cs/HandleCsEquipPuton.cs
index 0c719b4..4d6c007 100644
--- a/Campofinale/Packets/Cs/HandleCsEquipPuton.cs
+++ b/Campofinale/Packets/Cs/HandleCsEquipPuton.cs
@@ -1,4 +1,4 @@
-using Campofinale.Game.Character;
+using Campofinale.Game.Char;
using Campofinale.Network;
using Campofinale.Protocol;
diff --git a/Campofinale/Packets/Cs/HandleCsLogin.cs b/Campofinale/Packets/Cs/HandleCsLogin.cs
index c79efbd..412ee09 100644
--- a/Campofinale/Packets/Cs/HandleCsLogin.cs
+++ b/Campofinale/Packets/Cs/HandleCsLogin.cs
@@ -1,7 +1,7 @@
using BeyondTools.VFS.Crypto;
using Campofinale.Database;
using Campofinale.Game;
-using Campofinale.Game.Character;
+using Campofinale.Game.Char;
using Campofinale.Network;
using Campofinale.Packets.Sc;
using Campofinale.Protocol;
@@ -211,8 +211,10 @@ namespace Campofinale.Packets.Cs
session.EnterScene();
session.Initialized = true;
session.Update();
-
-
+ session.adventureBookManager.data.dailyLogin++;
+ session.adventureBookManager.TaskUpdate(ConditionType.CheckStatisticVal, null);
+
+
}
static byte[] GenerateRandomBytes(int length)
{
diff --git a/Campofinale/Packets/Cs/HandleCsSceneSetLevelScriptActive.cs b/Campofinale/Packets/Cs/HandleCsSceneSetLevelScriptActive.cs
index 76ff9e7..851433f 100644
--- a/Campofinale/Packets/Cs/HandleCsSceneSetLevelScriptActive.cs
+++ b/Campofinale/Packets/Cs/HandleCsSceneSetLevelScriptActive.cs
@@ -1,4 +1,4 @@
-using Campofinale.Game.Character;
+using Campofinale.Game.Char;
using Campofinale.Game.Entities;
using Campofinale.Network;
using Campofinale.Protocol;
diff --git a/Campofinale/Packets/Cs/HandleCsTakeAdventureTaskReward.cs b/Campofinale/Packets/Cs/HandleCsTakeAdventureTaskReward.cs
new file mode 100644
index 0000000..a27dfe9
--- /dev/null
+++ b/Campofinale/Packets/Cs/HandleCsTakeAdventureTaskReward.cs
@@ -0,0 +1,19 @@
+using Campofinale.Network;
+using Campofinale.Packets.Sc;
+using Campofinale.Protocol;
+
+namespace Campofinale.Packets.Cs
+{
+ public class HandleCsTakeAdventureTaskReward
+ {
+
+ [Server.Handler(CsMsgId.CsTakeAdventureTaskReward)]
+ public static void Handle(Player session, CsMsgId cmdId, Packet packet)
+ {
+ CsTakeAdventureTaskReward req = packet.DecodeBody();
+ session.adventureBookManager.ClaimTask(req.TaskId);
+ session.Send(new PacketScAdventureBookSync(session), packet.csHead.UpSeqid);
+ }
+
+ }
+}
diff --git a/Campofinale/Packets/Cs/HandleCsTakeAllAdventureTaskReward.cs b/Campofinale/Packets/Cs/HandleCsTakeAllAdventureTaskReward.cs
new file mode 100644
index 0000000..c404d6a
--- /dev/null
+++ b/Campofinale/Packets/Cs/HandleCsTakeAllAdventureTaskReward.cs
@@ -0,0 +1,20 @@
+using Campofinale.Network;
+using Campofinale.Packets.Sc;
+using Campofinale.Protocol;
+using Campofinale.Resource;
+
+namespace Campofinale.Packets.Cs
+{
+ public class HandleCsTakeAllAdventureTaskReward
+ {
+
+ [Server.Handler(CsMsgId.CsTakeAllAdventureTaskReward)]
+ public static void Handle(Player session, CsMsgId cmdId, Packet packet)
+ {
+ CsTakeAllAdventureTaskReward req = packet.DecodeBody();
+ session.adventureBookManager.ClaimTasks((AdventureTaskType)req.TaskType);
+ session.Send(new PacketScAdventureBookSync(session), packet.csHead.UpSeqid);
+ }
+
+ }
+}
diff --git a/Campofinale/Packets/Cs/HandleCsWeaponPuton.cs b/Campofinale/Packets/Cs/HandleCsWeaponPuton.cs
index 6e2c56a..3f041ca 100644
--- a/Campofinale/Packets/Cs/HandleCsWeaponPuton.cs
+++ b/Campofinale/Packets/Cs/HandleCsWeaponPuton.cs
@@ -1,4 +1,4 @@
-using Campofinale.Game.Character;
+using Campofinale.Game.Char;
using Campofinale.Network;
using Campofinale.Protocol;
diff --git a/Campofinale/Packets/Sc/PacketScAdventureBookSync.cs b/Campofinale/Packets/Sc/PacketScAdventureBookSync.cs
index bf2a0b9..874120f 100644
--- a/Campofinale/Packets/Sc/PacketScAdventureBookSync.cs
+++ b/Campofinale/Packets/Sc/PacketScAdventureBookSync.cs
@@ -1,6 +1,7 @@
using Campofinale.Network;
using Campofinale.Protocol;
using Campofinale.Resource;
+using static Campofinale.Game.Adventure.AdventureBookManager;
namespace Campofinale.Packets.Sc
{
@@ -8,19 +9,13 @@ namespace Campofinale.Packets.Sc
{
public PacketScAdventureBookSync(Player player) {
ScAdventureBookSync proto = new ScAdventureBookSync() {
- AdventureBookStage=1,
- DailyActivation=100,
+ AdventureBookStage=player.adventureBookManager.data.adventureBookStage,
+ DailyActivation=player.adventureBookManager.data.dailyActivation,
+
};
- foreach(var i in ResourceManager.adventureTaskTable)
+ foreach (GameAdventureTask task in player.adventureBookManager.data.tasks)
{
- if (i.Value.adventureBookStage == 1)
- {
- proto.Tasks.Add(new AdventureTask()
- {
- TaskId = i.Value.adventureTaskId,
- State = 1
- });
- }
+ proto.Tasks.Add(task.ToProto());
}
SetData(ScMsgId.ScAdventureBookSync, proto);
}
diff --git a/Campofinale/Packets/Sc/PacketScCharBagAddChar.cs b/Campofinale/Packets/Sc/PacketScCharBagAddChar.cs
index 7c6617d..c41b53e 100644
--- a/Campofinale/Packets/Sc/PacketScCharBagAddChar.cs
+++ b/Campofinale/Packets/Sc/PacketScCharBagAddChar.cs
@@ -1,4 +1,4 @@
-using Campofinale.Game.Character;
+using Campofinale.Game.Char;
using Campofinale.Network;
using Campofinale.Protocol;
diff --git a/Campofinale/Packets/Sc/PacketScCharBagDelChar.cs b/Campofinale/Packets/Sc/PacketScCharBagDelChar.cs
index 9ba09d7..4ca11ce 100644
--- a/Campofinale/Packets/Sc/PacketScCharBagDelChar.cs
+++ b/Campofinale/Packets/Sc/PacketScCharBagDelChar.cs
@@ -1,4 +1,4 @@
-using Campofinale.Game.Character;
+using Campofinale.Game.Char;
using Campofinale.Network;
using Campofinale.Protocol;
diff --git a/Campofinale/Packets/Sc/PacketScCharUnlockTalentNode.cs b/Campofinale/Packets/Sc/PacketScCharUnlockTalentNode.cs
index 0a65011..c23e6ba 100644
--- a/Campofinale/Packets/Sc/PacketScCharUnlockTalentNode.cs
+++ b/Campofinale/Packets/Sc/PacketScCharUnlockTalentNode.cs
@@ -1,4 +1,4 @@
-using Campofinale.Game.Character;
+using Campofinale.Game.Char;
using Campofinale.Network;
using Campofinale.Protocol;
diff --git a/Campofinale/Player.cs b/Campofinale/Player.cs
index 4659602..a1e90f1 100644
--- a/Campofinale/Player.cs
+++ b/Campofinale/Player.cs
@@ -3,7 +3,7 @@ using Campofinale.Protocol;
using Google.Protobuf;
using System.Net.Sockets;
using Campofinale.Packets.Sc;
-using Campofinale.Game.Character;
+using Campofinale.Game.Char;
using Campofinale.Resource;
using Campofinale.Game.Inventory;
using static Campofinale.Resource.ResourceManager;
@@ -16,6 +16,7 @@ using Campofinale.Game.Factory;
using Campofinale.Game.MissionSys;
using Pastel;
using System.Drawing;
+using Campofinale.Game.Adventure;
namespace Campofinale
@@ -98,6 +99,7 @@ namespace Campofinale
public BitsetManager bitsetManager;
public FactoryManager factoryManager;
public MissionSystem missionSystem;
+ public AdventureBookManager adventureBookManager;
public int teamIndex = 0;
public List teams = new List();
public List mails = new List();
@@ -106,6 +108,7 @@ namespace Campofinale
public long maxDashEnergy = 250;
public uint curStamina = 10;
public long nextRecoverTime = 0;
+ public long nextDailyReset = 0;
public Dungeon currentDungeon;
public PlayerSafeZoneInfo savedSaveZone;
@@ -128,6 +131,7 @@ namespace Campofinale
spaceshipManager = new(this);
factoryManager = new(this);
missionSystem = new(this);
+ adventureBookManager = new(this);
receivorThread = new Thread(new ThreadStart(Receive));
}
@@ -168,6 +172,7 @@ namespace Campofinale
{
sceneManager.scenes = data.scenes;
}
+ nextDailyReset = data.nextDailyReset;
bitsetManager.Load(data.bitsets);
savedSaveZone = data.savedSafeZone;
if(Server.config.serverOptions.missionsEnabled) missionSystem.Load();
@@ -176,7 +181,7 @@ namespace Campofinale
{
Initialize(); //only if no account found
}
-
+ adventureBookManager.Load();
sceneManager.Load();
factoryManager.Load();
return (data != null);
@@ -572,6 +577,7 @@ namespace Campofinale
DatabaseManager.db.SavePlayerData(this);
inventoryManager.Save();
spaceshipManager.Save();
+ adventureBookManager.Save();
if(Server.config.serverOptions.missionsEnabled) missionSystem.Save();
SaveCharacters();
SaveMails();
@@ -579,6 +585,7 @@ namespace Campofinale
}
public void AddStamina(uint stamina)
{
+
curStamina += stamina;
if(curStamina > maxStamina)
{
@@ -595,6 +602,12 @@ namespace Campofinale
nextRecoverTime= DateTime.UtcNow.AddMinutes(7).ToUnixTimestampMilliseconds();
AddStamina(1);
}
+ if(curtimestamp >= nextDailyReset && adventureBookManager.data!=null)
+ {
+ nextDailyReset = DateTime.UtcNow.GetNextDailyReset().ToUnixTimestampMilliseconds();
+ adventureBookManager.DailyReset();
+ this.Send(new PacketScAdventureBookSync(this));
+ }
if(LoadFinish)
sceneManager.Update();
factoryManager.Update();
diff --git a/Campofinale/Program.cs b/Campofinale/Program.cs
index 8ae113c..1b4bf3d 100644
--- a/Campofinale/Program.cs
+++ b/Campofinale/Program.cs
@@ -21,7 +21,8 @@ class Program
}
private static void FakeClientTester()
{
- string serverIp = "beyond-ric.gryphline.com";
+ //
+ string serverIp = "beyond-tyo.gryphline.com";
int serverPort = 30000;
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
diff --git a/Campofinale/Resource/GameEnums.cs b/Campofinale/Resource/GameEnums.cs
index e74b912..463e0b1 100644
--- a/Campofinale/Resource/GameEnums.cs
+++ b/Campofinale/Resource/GameEnums.cs
@@ -17,6 +17,185 @@
Completed = 3,
Failed = 4,
}
+ public enum AdventureTaskState
+ {
+ None = 0,
+ Processing = 1,
+ Completed = 2,
+ Rewarded = 3
+ }
+ public enum ConditionType
+ {
+ Combined = 0,
+ NumberOfKills = 1,
+ TotalOfKills = 2,
+ MissionGroupComplete = 3,
+ MissionAvailable = 4,
+ MissionProcessing = 5,
+ MissionCompleted = 6,
+ MissionAction = 7,
+ ReachDestination = 8,
+ NumOfProduceItems = 9,
+ TotalOfProduceItems = 10,
+ GuideFinish = 11,
+ RepairBuilding = 12,
+ TotalOfOrder = 13,
+ BlocLevel = 14,
+ BlocExpFull = 15,
+ CanChangeGold = 16,
+ CharMaxLevel = 17,
+ QuestStateEqual = 18,
+ MissionStateEqual = 19,
+ CheckMissionSucceedId = 20,
+ ItemBagHasItem = 106,
+ PlayerHasItem = 107,
+ CastSkill = 108,
+ DepotHasItem = 109,
+ CheckGetEnoughItem = 110,
+ CheckGetEnoughItemInBag = 111,
+ CheckGetEnoughItemInDepot = 112,
+ FacBuildingConnected = 501,
+ FacBuildingUpgrade = 502,
+ FacBuildingAdded = 503,
+ FacBuildingWorking = 504,
+ FacRepairBuilding = 505,
+ FacProducePowerReach = 511,
+ FacProductivityReach = 512,
+ KillSpecificEnemy = 1000,
+ CheckBaseAndPoleConnected = 1001,
+ CheckBaseAndMinerRunning = 1002,
+ CheckTotalMinerRunning = 1003,
+ CheckInteract = 1004,
+ OnInteract = 1005,
+ CheckInteractiveBool = 1006,
+ CheckPlayerInMap = 1007,
+ CheckInteractiveInt = 1008,
+ SceneCollectionProgress = 2000,
+ CompareProperty = 4000,
+ PlusThenCompareTargetInteractiveProperty = 4001,
+ CheckTriggerSpecificInteractiveEvent = 4002,
+ CheckClientObjectiveCommon = 4003,
+ CompareTargetInteractiveProperty = 4004,
+ HasItemCount = 4501,
+ DungeonKeptTime = 4502,
+ CheckDoodadIsPickable = 5000,
+ CheckDoodadIsBreakable = 5001,
+ CheckInteractiveDestroyed = 5002,
+ CheckUnlockTech = 5003,
+ CheckRepairBuilding = 5004,
+ CheckStorageBoxHasEnoughItem = 5005,
+ CheckBuildingConnected = 5006,
+ CheckBuildingStateInArea = 5007,
+ CheckBuildingConnectedAsMA2SB = 5008,
+ CheckUnlockMultipleTech = 5009,
+ DoFacTradeCashAnyOrder = 5010,
+ CheckSceneAreaUnlocked = 5011,
+ CheckUnlockTechPackage = 5012,
+ CheckUnlockTechLayer = 5013,
+ FacBuildingCountInScene = 5014,
+ FacBuildingProducingCountInScene = 5015,
+ FacProducingFormulaCountInScene = 5016,
+ FacStatisticItemGenRate = 5017,
+ FacStatisticItemGen = 5018,
+ FacPowerCostSum = 5019,
+ FacBoxConveyorLengthSum = 5020,
+ FacStorageBoxHasItems = 5021,
+ CheckSpaceshipRoomLevel = 5022,
+ CheckAdventureLevel = 5023,
+ CheckShopNothingToBuy = 5024,
+ CheckLiquidInBag = 5025,
+ SettlementCheckExpEnoughToLevelup = 5026,
+ CheckBuildingConnectedSpecify = 5027,
+ CheckSpaceshipRoomUnlock = 5028,
+ CheckSpaceshipRoomBuilt = 5029,
+ CheckSpaceshipRoomStationCount = 5030,
+ CheckPassGameMechanicsId = 5031,
+ FacBuildingFluidContainerHasItem = 5032,
+ CheckFacSoilHarvest = 5033,
+ CheckFacBuildingState = 5034,
+ FacBattleBuildingCurEnergy = 5035,
+ CheckSpaceshipGrowCabinHarvest = 5036,
+ CheckGameInstCompletionStatus = 5037,
+ CheckItemGot = 5038,
+ CheckBuildingConnectedExist = 5039,
+ CheckFacSoilPlacedInPanel = 5040,
+ CheckWeaponGachaPoolIsOpen = 5041,
+ CheckShopGoodsIsSoldOut = 5042,
+ CheckPassedGameMechanicsNum = 5044,
+ CheckSettlementLevelSum = 5045,
+ CheckInteractiveLock = 5244,
+ CheckRichContentReadingDone = 5245,
+ CheckInteractiveSubmitSuccess = 5246,
+ CheckInteractiveNextAvailableTime = 5247,
+ CheckMonsterSpawnerComplete = 5248,
+ CheckItemBagCanPutIn = 5249,
+ CheckFluidVolume = 5250,
+ CheckGreaterWeapeonStageNum = 5251,
+ CheckRoleCreateTime = 5252,
+ CheckSceneGrade = 5253,
+ CheckUnlockGroupTechNum = 5254,
+ CheckCharSkillLevel = 5255,
+ CheckCharUnlockBreakTalentId = 5256,
+ CheckFactoryBlackBoxStateNum = 5257,
+ CheckDungeonTypePassNum = 5258,
+ CheckEquipTierLevelNumCharNum = 5259,
+ CheckInteractiveIsActivable = 5260,
+ CheckInteractiveIsActived = 5261,
+ CheckSceneScope = 5262,
+ CheckGameInstStartDuration = 5263,
+ CheckPlayerInDungeon = 5264,
+ CheckCharUnlock = 5265,
+ CheckCharFavorability = 5266,
+ CheckEtherSubmitCount = 5267,
+ CheckTDStart = 5600,
+ CheckTDSettlement = 5601,
+ CheckPanelOpen = 6000,
+ CheckQuestSubmitItem = 6001,
+ CheckLevelScriptProperty = 6002,
+ CheckRepeatableTalkFinish = 6003,
+ KillEnemyIdList = 6004,
+ CheckCompletedBlocMissionNum = 6005,
+ CheckSceneCollectionNum = 6006,
+ CheckPRTSCollectionUnlock = 6007,
+ CheckCostStamina = 6008,
+ CheckTmpShopAlreadyBuyCount = 6009,
+ CheckInPowerMinerCount = 6010,
+ CheckTimestamp = 6011,
+ CheckMissionProperty = 6012,
+ CheckProperty = 6015,
+ CheckClientGameVar = 6016,
+ CheckServerGameVar = 6017,
+ CheckPlayerHasEnoughItemList = 6018,
+ CheckMiniGameCompletedCount = 6019,
+ CheckMonsterKilledNum = 6020,
+ CheckTerminalReadingDone = 6021,
+ CheckScriptTaskStateEqual = 6022,
+ CheckFactoryBlackBoxState = 6023,
+ CheckTeamMemberNumberEven = 6024,
+ CheckDaysNumAfterMissionComplete = 6025,
+ CheckTimelineFinish = 6026,
+ CheckFmvFinish = 6027,
+ CheckRemoteCommFinish = 6028,
+ CheckTalkFinish = 6029,
+ CheckPrtsInvestigateFinish = 6030,
+ CheckSNSDialogComplete = 6500,
+ CheckSNSDialogContent = 6501,
+ CheckGreaterCharLevelNum = 6502,
+ CheckGreaterWeapeonLevelNum = 6503,
+ CheckGreaterCharStageNum = 6504,
+ CheckGreaterCharPotentialNum = 6505,
+ CheckGreaterSettlementLevelNum = 6506,
+ CheckStatisticVal = 6507,
+ ClientOnly = 9999,
+ SystemUnlocked = 10000,
+ None = 2147483647
+ }
+ public enum AdventureTaskType
+ {
+ None = 0,
+ Daily = 1,
+ AdventureBook = 2
+ }
public enum LevelScriptState
{
None = 0,
@@ -358,13 +537,6 @@
KeyStepFinish = 2,
Completed = 3
}
- public enum AdventureTaskState // TypeDefIndex: 33702
- {
- None = 0,
- Processing = 1,
- Completed = 2,
- Rewarded = 3
- }
public enum EntryState // TypeDefIndex: 24402
{
Empty = 0,
@@ -373,12 +545,6 @@
LevelLoaded = 3,
Invalid = 4
}
- public enum AdventureTaskType // TypeDefIndex: 33687
- {
- None = 0,
- Daily = 1,
- AdventureBook = 2
- }
public enum ItemStorageSpace // TypeDefIndex: 33575
{
None = 0,
diff --git a/Campofinale/Resource/Json/ConditionData.cs b/Campofinale/Resource/Json/ConditionData.cs
new file mode 100644
index 0000000..2664ca0
--- /dev/null
+++ b/Campofinale/Resource/Json/ConditionData.cs
@@ -0,0 +1,24 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Campofinale.Resource.Json
+{
+ [TableCfgType("Data/Conditions.json", LoadPriority.LOW)]
+ public class ConditionData
+ {
+ public List args = new();
+
+
+ public string Get(int index)
+ {
+ return args[index];
+ }
+ public int ToInt(int index)
+ {
+ return int.Parse(args[index]);
+ }
+ }
+}
diff --git a/Campofinale/Resource/ResourceManager.cs b/Campofinale/Resource/ResourceManager.cs
index 448d3a5..fe94da8 100644
--- a/Campofinale/Resource/ResourceManager.cs
+++ b/Campofinale/Resource/ResourceManager.cs
@@ -79,6 +79,7 @@ namespace Campofinale.Resource
public static List levelDatas = new();
public static List interactiveData = new();
public static List spawnerConfigs = new();
+ public static Dictionary conditions=new();
public static int GetSceneNumIdFromLevelData(string name)
{
if (levelDatas.Find(a => a.id == name) == null) return 0;
@@ -409,13 +410,13 @@ namespace Campofinale.Resource
public int adventureBookStage;
public string adventureTaskId;
public string conditionId;
- public int conditionType;
+ public ConditionType conditionType;
public string jumpSystemId;
public int progressToCompare;
public string rewardId;
public int sortId;
public TaskDescription taskDesc;
- public int taskType;
+ public AdventureTaskType taskType;
}
public class TaskDescription
{
diff --git a/Campofinale/Resource/ServerEnums.cs b/Campofinale/Resource/ServerEnums.cs
new file mode 100644
index 0000000..43cf3de
--- /dev/null
+++ b/Campofinale/Resource/ServerEnums.cs
@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Campofinale.Resource
+{
+ public enum ServerEventExec
+ {
+ UpdateTasks=0
+ }
+
+}
diff --git a/Campofinale/Server.cs b/Campofinale/Server.cs
index fc79073..94ea2f4 100644
--- a/Campofinale/Server.cs
+++ b/Campofinale/Server.cs
@@ -21,6 +21,17 @@ namespace Campofinale
{
return (long)(dateTime - UnixEpoch).TotalMilliseconds;
}
+ public static DateTime GetNextDailyReset(this DateTime dateTime)
+ {
+ DateTime now = DateTime.UtcNow;
+ DateTime todayReset = new DateTime(now.Year, now.Month, now.Day, 6, 0, 0, DateTimeKind.Utc);
+
+ // Se siamo già passati oltre le 6:00 AM di oggi, ritorna le 6:00 AM di domani
+ if (now >= todayReset)
+ return todayReset.AddDays(1);
+ else
+ return todayReset;
+ }
}
public class Server
{