diff --git a/Campofinale/ConfigFile.cs b/Campofinale/ConfigFile.cs
index 2f7d1b9..f1eef43 100644
--- a/Campofinale/ConfigFile.cs
+++ b/Campofinale/ConfigFile.cs
@@ -12,19 +12,28 @@
{
public int defaultSceneNumId = 87;
public int maxPlayers = 20;
- public CharactersOptions defaultCharacters = new();
+ ///
+ /// Experimental, Mission System is still a work in progress.
+ ///
+ public bool missionsEnabled = false;
+ public bool giveAllItems = false;
+ ///
+ /// Not yet implemented
+ ///
+ public bool useEncryption = false;
+ //public CharactersOptions defaultCharacters = new();
public ServerOptions()
{
}
- public class CharactersOptions
+ /*public class CharactersOptions
{
public int defaultLevel = 1;
public bool giveAllCharacters = true;
public List characters = new List(); //used if giveAllCharacters is false
public CharactersOptions() { }
- }
+ }*/
/* public struct WelcomeMail
{
}*/
diff --git a/Campofinale/Database/Database.cs b/Campofinale/Database/Database.cs
index 1f2af8c..5b591a6 100644
--- a/Campofinale/Database/Database.cs
+++ b/Campofinale/Database/Database.cs
@@ -2,6 +2,7 @@
using Campofinale.Game.Character;
using Campofinale.Game.Gacha;
using Campofinale.Game.Inventory;
+using Campofinale.Game.MissionSys;
using Campofinale.Game.Spaceship;
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
@@ -38,6 +39,14 @@ namespace Campofinale.Database
public Gender gender = Gender.GenFemale;
public Dictionary bag = new();
}
+ public class MissionData
+ {
+ [BsonId]
+ public ulong roleId;
+ public List missions = new();
+ public List quests = new();
+ public string curMission = "e0m0";
+ }
public class Account
{
public string id;
@@ -64,12 +73,17 @@ namespace Campofinale.Database
public Database(string connectionString, string dbName)
{
var client = new MongoClient(connectionString);
+
_database = client.GetDatabase(dbName);
}
public List LoadMails(ulong roleId)
{
return _database.GetCollection("mails").Find(c => c.owner == roleId).ToList();
}
+ public MissionData LoadMissionData(ulong roleId)
+ {
+ return _database.GetCollection("missionsData").Find(c => c.roleId == roleId).FirstOrDefault();
+ }
public List LoadCharacters(ulong roleId)
{
return _database.GetCollection("avatars").Find(c=>c.owner== roleId).ToList();
@@ -176,6 +190,19 @@ namespace Campofinale.Database
new ReplaceOptions { IsUpsert = true }
);
}
+ public void UpsertMissionData(MissionData data)
+ {
+ var collection = _database.GetCollection("missionsData");
+
+ var filter =
+ Builders.Filter.Eq(p => p.roleId, data.roleId);
+
+ collection.ReplaceOne(
+ filter,
+ data,
+ new ReplaceOptions { IsUpsert = true }
+ );
+ }
public void UpsertAccount(Account player)
{
var collection = _database.GetCollection("accounts");
diff --git a/Campofinale/Game/Entities/EntityInteractive.cs b/Campofinale/Game/Entities/EntityInteractive.cs
index f57fafe..c543430 100644
--- a/Campofinale/Game/Entities/EntityInteractive.cs
+++ b/Campofinale/Game/Entities/EntityInteractive.cs
@@ -42,7 +42,7 @@ namespace Campofinale.Game.Entities
{
CommonInfo = new()
{
- Hp = 100,
+ Hp = 1,
Id = guid,
Templateid = templateId,
diff --git a/Campofinale/Game/Entities/EntityMonster.cs b/Campofinale/Game/Entities/EntityMonster.cs
index 1f79384..d9b6363 100644
--- a/Campofinale/Game/Entities/EntityMonster.cs
+++ b/Campofinale/Game/Entities/EntityMonster.cs
@@ -80,7 +80,7 @@ namespace Campofinale.Game.Entities
SceneNumId = sceneNumId,
Position = Position.ToProto(),
Rotation = Rotation.ToProto(),
-
+
Type =(int) ObjectTypeIndex.Enemy,
},
diff --git a/Campofinale/Game/MissionSys/MissionSystem.cs b/Campofinale/Game/MissionSys/MissionSystem.cs
index 04ea850..898447e 100644
--- a/Campofinale/Game/MissionSys/MissionSystem.cs
+++ b/Campofinale/Game/MissionSys/MissionSystem.cs
@@ -19,6 +19,13 @@ namespace Campofinale.Game.MissionSys
}
public ScSyncAllMission ToProto()
{
+ if (!Server.config.serverOptions.missionsEnabled)
+ {
+ string json1 = File.ReadAllText("44_ScSyncAllMission.json");
+ ScSyncAllMission m = Newtonsoft.Json.JsonConvert.DeserializeObject(json1);
+ m.TrackMissionId = "";
+ return m;
+ }
ScSyncAllMission sync = new ScSyncAllMission();
sync.TrackMissionId = curMission;
missions.ForEach(m =>
@@ -71,18 +78,23 @@ namespace Campofinale.Game.MissionSys
}
public void Save()
{
-
+ DatabaseManager.db.UpsertMissionData(new MissionData()
+ {
+ roleId=owner.roleId,
+ curMission=curMission,
+ missions=missions,
+ quests=quests,
+ });
}
public void Load()
{
-
- if (ResourceManager.missionDataTable.Count < 1)
+ MissionData data= DatabaseManager.db.LoadMissionData(owner.roleId);
+ if (data != null)
{
- //Disabling if no missions
- return;
+ curMission = data.curMission;
+ missions = data.missions;
+ quests = data.quests;
}
- //TODO Saving and first initialization
- AddMission("e0m0",MissionState.Processing);
}
public void AddMission(string id,MissionState state = MissionState.Available, bool notify=false)
{
diff --git a/Campofinale/Game/SceneManager.cs b/Campofinale/Game/SceneManager.cs
index 220ac67..3e3ad7c 100644
--- a/Campofinale/Game/SceneManager.cs
+++ b/Campofinale/Game/SceneManager.cs
@@ -215,7 +215,6 @@ namespace Campofinale.Game
{
return scenes.Find(s=>s.sceneNumId == sceneNumId).guid;
}
- //TODO Save and get
public void Load()
{
foreach (var level in ResourceManager.levelDatas)
@@ -335,19 +334,20 @@ namespace Campofinale.Game
lv_scene.levelData.enemies.ForEach(en =>
{
if(GetOwner().noSpawnAnymore.Contains(en.levelLogicId) && sceneNumId != 87) return;
- if (en.defaultHide) return;
+
EntityMonster entity = new(en.entityDataIdKey,en.level,ownerId,en.position,en.rotation, sceneNumId, en.levelLogicId)
{
type=en.entityType,
belongLevelScriptId=en.belongLevelScriptId,
- levelLogicId = en.levelLogicId
+ levelLogicId = en.levelLogicId,
+
};
entities.Add(entity);
});
lv_scene.levelData.npcs.ForEach(en =>
{
- if (en.defaultHide) return;
- if (en.npcGroupId.Contains("chr")) return;
+
+ if (en.npcGroupId.Contains("chr") && sceneNumId== 99) return;
EntityNpc entity = new(en.entityDataIdKey,ownerId,en.position,en.rotation, sceneNumId, en.levelLogicId)
{
belongLevelScriptId = en.belongLevelScriptId,
@@ -359,8 +359,19 @@ namespace Campofinale.Game
});
GetEntityExcludingChar().ForEach(e =>
{
- // GetOwner().Send(new PacketScObjectEnterView(GetOwner(), new List() { e}));
+ if(e is EntityInteractive)
+ {
+ // e.spawned = true;
+ // GetOwner().Send(new PacketScObjectEnterView(GetOwner(), new List() { e }));
+ }
+
+ });
+ GetEntityExcludingChar().FindAll(e=> e is not EntityInteractive).ForEach(e =>
+ {
+
+ // e.spawned = true;
+ // GetOwner().Send(new PacketScObjectEnterView(GetOwner(), new List() { e }));
});
UpdateShowEntities();
@@ -370,10 +381,16 @@ namespace Campofinale.Game
{
en.spawned = true;
List toSpawn = new List();
- if(en.belongLevelScriptId != 0)
+ toSpawn.Add(en);
+ foreach (Entity e in GetEntityExcludingChar().FindAll(e => e.belongLevelScriptId == en.belongLevelScriptId && e.spawned == false))
+ {
+ e.spawned = true;
+ toSpawn.Add(e);
+ }
+ /*if(en.belongLevelScriptId != 0)
if (spawnedCheck)
{
- foreach (Entity e in GetEntityExcludingChar().FindAll(e => e.belongLevelScriptId == en.belongLevelScriptId && e.spawned == false))
+ foreach (Entity e in GetEntityExcludingChar().FindAll(e => e.belongLevelScriptId == en.belongLevelScriptId && e.spawned == false && e.Position.Distance(GetOwner().position) < 100))
{
e.spawned = true;
toSpawn.Add(e);
@@ -387,8 +404,8 @@ namespace Campofinale.Game
toSpawn.Add(e);
}
- }
- toSpawn.Add(en);
+ }*/
+
toSpawn.ForEach(e =>
{
GetOwner().Send(new PacketScObjectEnterView(GetOwner(), new List() { e}));
@@ -397,9 +414,12 @@ namespace Campofinale.Game
}
public void UpdateShowEntities()
{
+
foreach(Entity en in GetEntityExcludingChar())
{
- if (en.Position.Distance(GetOwner().position) < 100)
+ float minDis = en is EntityInteractive ? 180 : 50;
+ //todo new system
+ if (en.Position.DistanceXZ(GetOwner().position) < minDis)
{
if (!en.spawned)
{
diff --git a/Campofinale/NotifyManager.cs b/Campofinale/NotifyManager.cs
index c508d2d..ea93f05 100644
--- a/Campofinale/NotifyManager.cs
+++ b/Campofinale/NotifyManager.cs
@@ -55,7 +55,7 @@
}
else
{
- if (!Server.hideLog.Contains(cmdId) && Server.config.logOptions.packets)
+ if (!Server.csMessageToHide.Contains(cmdId) && Server.config.logOptions.packets)
Logger.PrintWarn($"Can't find handler for {(Enum.GetName(typeof(CsMsgId), cmdId)).ToString().Pastel(Color.FromArgb(165, 229, 250))} ({(cmdId).ToString().Pastel(Color.FromArgb(165, 229, 250))})");
}
}
diff --git a/Campofinale/Packets/Cs/HandleCsBitsetAdd.cs b/Campofinale/Packets/Cs/HandleCsBitsetAdd.cs
index 44f108d..c044771 100644
--- a/Campofinale/Packets/Cs/HandleCsBitsetAdd.cs
+++ b/Campofinale/Packets/Cs/HandleCsBitsetAdd.cs
@@ -16,7 +16,7 @@ namespace Campofinale.Packets.Cs
{
session.bitsetManager.AddValue((BitsetType)req.Type, (int)item);
}
- session.Send(new PacketScBitsetAdd(session,req.Type,req.Value.ToList()));
+ session.Send(new PacketScBitsetAdd(session,req.Type,req.Value.ToList()),packet.csHead.UpSeqid);
}
diff --git a/Campofinale/Packets/Cs/HandleCsLogin.cs b/Campofinale/Packets/Cs/HandleCsLogin.cs
index 78c475d..6d19e02 100644
--- a/Campofinale/Packets/Cs/HandleCsLogin.cs
+++ b/Campofinale/Packets/Cs/HandleCsLogin.cs
@@ -1,6 +1,7 @@
using BeyondTools.VFS.Crypto;
using Campofinale.Database;
using Campofinale.Game;
+using Campofinale.Game.Character;
using Campofinale.Network;
using Campofinale.Packets.Sc;
using Campofinale.Protocol;
@@ -16,11 +17,42 @@ namespace Campofinale.Packets.Cs
public static void HandleCsSetGender(Player session, CsMsgId cmdId, Packet packet)
{
CsSetGender req = packet.DecodeBody();
+ if(session.chars.Count < 2)
+ {
+ if (req.Gender == Gender.GenMale)
+ {
+ session.AddCharacter("chr_0002_endminm", true);
+ session.RemoveCharacter("chr_0003_endminf");
+ }
+ else
+ {
+ session.AddCharacter("chr_0003_endminf", true);
+ session.RemoveCharacter("chr_0002_endminm");
+ }
+ session.teamIndex = 0;
+ session.teams[0].leader = session.chars[0].guid;
+ session.teams[0].members = new() { session.chars[0].guid };
+ ScCharBagSetTeam setTeam = new()
+ {
+ CharTeam = { session.teams[0].members },
+ LeaderId = session.teams[0].leader,
+ ScopeName = 1,
+ TeamIndex = 0,
+ TeamType = CharBagTeamType.Main,
+ };
+
+ session.Send(ScMsgId.ScCharBagSetTeam, setTeam);
+ session.Send(new PacketScCharBagSetCurrTeamIndex(session));
+
+ session.Send(new PacketScSelfSceneInfo(session,SelfInfoReasonType.SlrChangeTeam));
+ }
+
ScSetGender rsp = new()
{
Gender = req.Gender,
};
session.gender = rsp.Gender;
+
session.Send(ScMsgId.ScSetGender, rsp);
}
@@ -95,29 +127,7 @@ namespace Campofinale.Packets.Cs
return;
}
session.Send(new PacketScSyncBaseData(session));
- ScItemBagCommonSync common = new()
- {
- LostAndFound = new()
- {
- InstList =
- {
- new ScdItemGrid()
- {
- GridIndex=0,
- Count=1,
- Id="item_port_power_pole_2",
- Inst = new()
- {
- InstId=300000000000,
-
- },
-
- }
- }
- },
-
- };
- session.Send(ScMsgId.ScItemBagCommonSync, common);
+
session.Send(new PacketScItemBagScopeSync(session, ItemValuableDepotType.Weapon));
session.Send(new PacketScItemBagScopeSync(session, ItemValuableDepotType.WeaponGem));
session.Send(new PacketScItemBagScopeSync(session, ItemValuableDepotType.Equip));
@@ -126,132 +136,7 @@ namespace Campofinale.Packets.Cs
session.Send(new PacketScItemBagScopeSync(session, ItemValuableDepotType.SpecialItem));
session.Send(new PacketScSyncAllMail(session));
session.Send(new PacketScSceneCollectionSync(session));
- string json1 = File.ReadAllText("44_ScSyncAllMission.json");
-
-
- ScSyncAllMission m = Newtonsoft.Json.JsonConvert.DeserializeObject(json1);
- m.TrackMissionId = "";
-
- //Disabled the hardcoded one and enable the missionSystem one
- //session.Send(ScMsgId.ScSyncAllMission, session.missionSystem.ToProto());
- session.Send(ScMsgId.ScSyncAllMission, m);
- /*ession.Send(ScMsgId.ScSyncAllMission, new ScSyncAllMission()
- {
- NewMissionTags =
- {
-
- },
-
- Missions =
- {
- {"e0m0", new Mission()
- {
- MissionId="e0m0",
- MissionState=(int)MissionState.Processing,
- SucceedId=-1,
- Properties =
- {
- {1,new DynamicParameter()
- {
- RealType=1,
- ValueType=1,
- ValueBoolList =
- {
- false
- }
- } }
- }
- } }
- },
- TrackMissionId = "e0m0",
-
- CurQuests =
- {
-
- {"e0m0_q#1", new Quest()
- {
- QuestId="e0m0_q#1",
- QuestState=(int)QuestState.Processing,
- QuestObjectives =
- {
- new QuestObjective()
- {
- ConditionId="f6415b84",
-
- IsComplete=false
- }
- }
- } },
- {"e0m0_q#2", new Quest()
- {
- QuestId="e0m0_q#2",
- QuestState=(int)QuestState.Available,
- QuestObjectives =
- {
- new QuestObjective()
- {
- ConditionId="81736ca7",
- IsComplete=false,
- }
- }
- } },
- {"e0m0_q#3", new Quest()
- {
- QuestId="e0m0_q#3",
- QuestState=(int)QuestState.Available,
- QuestObjectives =
- {
-
- }
- } },
- {"e0m0_q#4", new Quest()
- {
- QuestId="e0m0_q#4",
- QuestState=(int)QuestState.Available,
- QuestObjectives =
- {
-
- }
- } },
- {"e0m0_q#5", new Quest()
- {
- QuestId="e0m0_q#5",
- QuestState=(int)QuestState.Available,
- QuestObjectives =
- {
-
- }
- } },
- {"e0m0_q#6", new Quest()
- {
- QuestId="e0m0_q#6",
- QuestState=(int)QuestState.Available,
- QuestObjectives =
- {
-
- }
- } },
- {"e0m0_q#7", new Quest()
- {
- QuestId="e0m0_q#7",
- QuestState=(int)QuestState.Available,
- QuestObjectives =
- {
-
- }
- } },
- {"e0m0_q#8", new Quest()
- {
- QuestId="e0m0_q#8",
- QuestState=(int)QuestState.Available,
- QuestObjectives =
- {
-
- }
- } }
- }
- });*/
-
+ session.Send(new PacketScSyncAllMission(session));
session.Send(new PacketScGachaSync(session));
ScSettlementSyncAll settlements = new ScSettlementSyncAll()
{
diff --git a/Campofinale/Packets/Cs/HandleCsSceneInteractSpInteractive.cs b/Campofinale/Packets/Cs/HandleCsSceneInteractSpInteractive.cs
index eb39054..29effb9 100644
--- a/Campofinale/Packets/Cs/HandleCsSceneInteractSpInteractive.cs
+++ b/Campofinale/Packets/Cs/HandleCsSceneInteractSpInteractive.cs
@@ -30,6 +30,7 @@ namespace Campofinale.Packets.Cs
ScSceneInteractSpInteractive rsp = new()
{
ObjId = req.ObjId,
+
};
session.Send(ScMsgId.ScSceneInteractSpInteractive, rsp);
}
diff --git a/Campofinale/Packets/Cs/HandleCsSceneInteractiveEventTrigger.cs b/Campofinale/Packets/Cs/HandleCsSceneInteractiveEventTrigger.cs
index d4cbf2b..eec5fcd 100644
--- a/Campofinale/Packets/Cs/HandleCsSceneInteractiveEventTrigger.cs
+++ b/Campofinale/Packets/Cs/HandleCsSceneInteractiveEventTrigger.cs
@@ -20,17 +20,14 @@ namespace Campofinale.Packets.Cs
{
}
- else
+ ScSceneTriggerClientInteractiveEvent tr = new()
{
- ScSceneTriggerClientInteractiveEvent tr = new()
- {
- EventName = req.EventName,
- Id = req.Id,
- SceneNumId = req.SceneNumId,
-
- };
- session.Send(ScMsgId.ScSceneTriggerClientInteractiveEvent, tr);
- }
+ EventName = req.EventName,
+ Id = req.Id,
+ SceneNumId = req.SceneNumId,
+
+ };
+ session.Send(ScMsgId.ScSceneTriggerClientInteractiveEvent, tr);
}
}
diff --git a/Campofinale/Packets/Cs/HandleCsSceneSetLastSafeZone.cs b/Campofinale/Packets/Cs/HandleCsSceneSetLastSafeZone.cs
index 9a3e459..2095ed7 100644
--- a/Campofinale/Packets/Cs/HandleCsSceneSetLastSafeZone.cs
+++ b/Campofinale/Packets/Cs/HandleCsSceneSetLastSafeZone.cs
@@ -11,16 +11,7 @@ namespace Campofinale.Packets.Cs
{
CsSceneSetLastSafeZone req = packet.DecodeBody();
- //TODO understand how to work
- if (req.SceneNumId != session.curSceneNumId)
- {
- //session.sceneManager.UnloadCurrent(true);
- session.curSceneNumId = req.SceneNumId;
- Logger.Print("Cur Scene id changed by SetLastSafeZone");
-
- //session.sceneManager.LoadCurrent();
- //session.EnterScene(req.SceneNumId,new Vector3f(req.Position),new Vector3f(req.Rotation));
- }
+
}
diff --git a/Campofinale/Packets/Cs/HandleCsSceneSetLevelScriptActive.cs b/Campofinale/Packets/Cs/HandleCsSceneSetLevelScriptActive.cs
index 48e5f0b..fe8532c 100644
--- a/Campofinale/Packets/Cs/HandleCsSceneSetLevelScriptActive.cs
+++ b/Campofinale/Packets/Cs/HandleCsSceneSetLevelScriptActive.cs
@@ -5,6 +5,7 @@ using Campofinale.Protocol;
using Campofinale.Resource;
using Campofinale.Resource.Table;
using Pastel;
+using static Campofinale.Resource.ResourceManager.LevelScene.LevelData;
namespace Campofinale.Packets.Cs
{
@@ -34,16 +35,18 @@ namespace Campofinale.Packets.Cs
public static void HandleCsSceneSetLevelScriptStart(Player session, CsMsgId cmdId, Packet packet)
{
CsSceneSetLevelScriptStart req = packet.DecodeBody();
+
if (req.IsStart)
{
ScSceneLevelScriptStateNotify rsp = new ScSceneLevelScriptStateNotify()
{
SceneNumId = req.SceneNumId,
ScriptId = req.ScriptId,
-
+
State = 4
};
- session.Send(ScMsgId.ScSceneLevelScriptStateNotify, rsp);
+
+ session.Send(ScMsgId.ScSceneLevelScriptStateNotify, rsp,packet.csHead.UpSeqid);
}
@@ -62,6 +65,10 @@ namespace Campofinale.Packets.Cs
case ScriptActionType.SpawnEnemy:
player.sceneManager.GetCurScene().SpawnEnemy(action.valueUlong[0]);
break;
+ case ScriptActionType.UnlockSystem:
+ UnlockSystemType type = (UnlockSystemType)Enum.Parse(typeof(UnlockSystemType), action.valueStr[0]);
+ player.UnlockSystem(type);
+ break;
default:
Logger.PrintWarn("Script Action not implemented");
break;
@@ -73,7 +80,7 @@ namespace Campofinale.Packets.Cs
CsSceneLevelScriptEventTrigger req = packet.DecodeBody();
Logger.Print(req.Properties.ToString());
-
+
if (ResourceManager.levelScriptsEvents.TryGetValue(req.EventName, out LevelScriptEvent levelScriptEvent))
{
Logger.Print($"Event {req.EventName.Pastel(ConsoleColor.Yellow)} Executed.");
@@ -90,84 +97,6 @@ namespace Campofinale.Packets.Cs
Logger.PrintWarn($" ScriptID: {req.ScriptId.ToString().Pastel(ConsoleColor.White)} ");
Logger.PrintWarn($"]");
}
- /*if(req.EventName== "#8777e316")
- {
- session.Send(ScMsgId.ScQuestStateUpdate, new ScQuestStateUpdate()
- {
- QuestId = "e0m0_q#1",
- QuestState = (int)QuestState.Completed,
- });
- session.Send(ScMsgId.ScQuestStateUpdate, new ScQuestStateUpdate()
- {
- QuestId = "e0m0_q#2",
- QuestState = (int)QuestState.Processing,
- });
- }
- if(req.EventName== "#6ea2690d")
- {
- session.Send(ScMsgId.ScQuestStateUpdate, new ScQuestStateUpdate()
- {
- QuestId = "e0m0_q#2",
- QuestState = (int)QuestState.Completed,
- });
- session.Send(ScMsgId.ScQuestStateUpdate, new ScQuestStateUpdate()
- {
- QuestId = "e0m0_q#3",
- QuestState = (int)QuestState.Processing,
- });
- }
- if (req.EventName == "#bb79de30")
- {
- session.Send(ScMsgId.ScQuestStateUpdate, new ScQuestStateUpdate()
- {
- QuestId = "e0m0_q#3",
- QuestState = (int)QuestState.Completed,
- });
- session.Send(ScMsgId.ScQuestStateUpdate, new ScQuestStateUpdate()
- {
- QuestId = "e0m0_q#4",
- QuestState = (int)QuestState.Processing,
- });
- }
- if (req.EventName == "#4c76ec3c")
- {
- session.Send(ScMsgId.ScQuestStateUpdate, new ScQuestStateUpdate()
- {
- QuestId = "e0m0_q#4",
- QuestState = (int)QuestState.Completed,
- });
- session.Send(ScMsgId.ScQuestStateUpdate, new ScQuestStateUpdate()
- {
- QuestId = "e0m0_q#5",
- QuestState = (int)QuestState.Processing,
- });
- }
- if (req.EventName == "#251df3ad")
- {
- session.Send(ScMsgId.ScQuestStateUpdate, new ScQuestStateUpdate()
- {
- QuestId = "e0m0_q#5",
- QuestState = (int)QuestState.Completed,
- });
- session.Send(ScMsgId.ScQuestStateUpdate, new ScQuestStateUpdate()
- {
- QuestId = "e0m0_q#6",
- QuestState = (int)QuestState.Processing,
- });
- }
- if (req.EventName == "#e6ac322b")
- {
- session.Send(ScMsgId.ScQuestStateUpdate, new ScQuestStateUpdate()
- {
- QuestId = "e0m0_q#6",
- QuestState = (int)QuestState.Completed,
- });
- session.Send(ScMsgId.ScQuestStateUpdate, new ScQuestStateUpdate()
- {
- QuestId = "e0m0_q#7",
- QuestState = (int)QuestState.Processing,
- });
- }*/
ScSceneUpdateLevelScriptProperty update1 = new()
{
@@ -175,8 +104,16 @@ namespace Campofinale.Packets.Cs
ScriptId = req.ScriptId,
};
+ LevelScriptData levelscript= ResourceManager.GetLevelData(session.curSceneNumId).levelData.levelScripts.Find(l=>l.scriptId == req.ScriptId);
+ if (levelscript != null) {
+ foreach (var item in req.Properties)
+ {
+ int key = levelscript.GetPropertyId(item.Key, new List());
+ update1.Properties.Add(key, item.Value);
+ }
+ }
session.Send(ScMsgId.ScSceneUpdateLevelScriptProperty, update1);
- ScSceneTriggerClientLevelScriptEvent trigger = new()
+ /*ScSceneTriggerClientLevelScriptEvent trigger = new()
{
EventName = req.EventName,
SceneNumId = req.SceneNumId,
@@ -191,7 +128,7 @@ namespace Campofinale.Packets.Cs
};
- session.Send(ScMsgId.ScSceneUpdateLevelScriptProperty, update2);
+ session.Send(ScMsgId.ScSceneUpdateLevelScriptProperty, update2);*/
ScSceneLevelScriptEventTrigger rsp = new ScSceneLevelScriptEventTrigger()
{
diff --git a/Campofinale/Packets/Cs/HandleCsTrackMission.cs b/Campofinale/Packets/Cs/HandleCsTrackMission.cs
index b2b07f8..c00af56 100644
--- a/Campofinale/Packets/Cs/HandleCsTrackMission.cs
+++ b/Campofinale/Packets/Cs/HandleCsTrackMission.cs
@@ -10,11 +10,12 @@ namespace Campofinale.Packets.Cs
{
CsTrackMission req = packet.DecodeBody();
session.missionSystem.curMission = req.MissionId;
+
ScTrackMissionChange rsp = new()
{
MissionId = req.MissionId
};
- session.Send(ScMsgId.ScTrackMissionChange, rsp);
+ session.Send(ScMsgId.ScTrackMissionChange, rsp,packet.csHead.UpSeqid);
}
}
}
diff --git a/Campofinale/Packets/Sc/PacketScEnterSceneNotify.cs b/Campofinale/Packets/Sc/PacketScEnterSceneNotify.cs
index 8c851ed..17328e6 100644
--- a/Campofinale/Packets/Sc/PacketScEnterSceneNotify.cs
+++ b/Campofinale/Packets/Sc/PacketScEnterSceneNotify.cs
@@ -19,7 +19,7 @@ namespace Campofinale.Packets.Sc
SceneNumId = sceneNumId,
};
-
+
SetData(ScMsgId.ScEnterSceneNotify, proto);
}
diff --git a/Campofinale/Packets/Sc/PacketScSelfSceneInfo.cs b/Campofinale/Packets/Sc/PacketScSelfSceneInfo.cs
index cb08b06..9b9abc0 100644
--- a/Campofinale/Packets/Sc/PacketScSelfSceneInfo.cs
+++ b/Campofinale/Packets/Sc/PacketScSelfSceneInfo.cs
@@ -60,6 +60,7 @@ namespace Campofinale.Packets.Sc
});
//Levelscripts here?
+ if(infoReason!= SelfInfoReasonType.SlrChangeTeam)
ResourceManager.GetLevelData(session.curSceneNumId).levelData.levelScripts.ForEach(l =>
{
LevelScriptInfo script = new LevelScriptInfo()
diff --git a/Campofinale/Packets/Sc/PacketScSyncAllMission.cs b/Campofinale/Packets/Sc/PacketScSyncAllMission.cs
new file mode 100644
index 0000000..1c594f6
--- /dev/null
+++ b/Campofinale/Packets/Sc/PacketScSyncAllMission.cs
@@ -0,0 +1,16 @@
+using Campofinale.Network;
+using Campofinale.Protocol;
+
+namespace Campofinale.Packets.Sc
+{
+ public class PacketScSyncAllMission : Packet
+ {
+
+ public PacketScSyncAllMission(Player client) {
+
+
+ SetData(ScMsgId.ScSyncAllMission, client.missionSystem.ToProto());
+ }
+
+ }
+}
diff --git a/Campofinale/Player.cs b/Campofinale/Player.cs
index 78f1ddd..7b9faeb 100644
--- a/Campofinale/Player.cs
+++ b/Campofinale/Player.cs
@@ -170,12 +170,13 @@ namespace Campofinale
}
bitsetManager.Load(data.bitsets);
savedSaveZone = data.savedSafeZone;
+ if(Server.config.serverOptions.missionsEnabled) missionSystem.Load();
}
else
{
Initialize(); //only if no account found
}
- missionSystem.Load();
+
sceneManager.Load();
factoryManager.Load();
return (data != null);
@@ -202,39 +203,80 @@ namespace Campofinale
{
return chars.Find(c => c.id==templateId);
}
+ ///
+ /// Add a character with template id if not present in the chars list *Added in 1.1.6*
+ ///
+ ///
+ public void AddCharacter(string id, bool notify = false)
+ {
+ Character chara = GetCharacter(id);
+ if (chara == null)
+ {
+ Character c = new Character(roleId, id, 1);
+ chars.Add(c);
+ if (notify)
+ {
+ Send(new PacketScCharBagAddChar(this,c));
+ }
+ }
+ }
+ ///
+ /// Remove a character using template id *Added in 1.1.6*
+ ///
+ ///
+ public void RemoveCharacter(string id)
+ {
+ Character chara = GetCharacter(id);
+ if (chara == null)
+ {
+ return;
+ }
+ chars.Remove(chara);
+ Send(new PacketScCharBagDelChar(this,chara));
+ }
+ public void ReplaceCharacter(string id, string newId)
+ {
+ Character chara = GetCharacter(id);
+ if (chara == null)
+ {
+ return;
+ }
+ chara.id = newId;
+ Send(new PacketScSyncCharBagInfo(this));
+ }
public void Initialize()
{
- if (Server.config.serverOptions.defaultCharacters.giveAllCharacters)
+ if (Server.config.serverOptions.missionsEnabled)
{
- foreach (var item in ResourceManager.characterTable)
- {
- chars.Add(new Character(roleId, item.Key, Server.config.serverOptions.defaultCharacters.defaultLevel));
- }
+ chars.Add(new Character(roleId, "chr_0002_endminm", 1));
+ missionSystem.AddMission("e0m0", MissionState.Processing);
}
else
{
- foreach (var item in Server.config.serverOptions.defaultCharacters.characters)
+ foreach (var item in ResourceManager.characterTable)
{
- chars.Add(new Character(roleId, item, Server.config.serverOptions.defaultCharacters.defaultLevel));
+ chars.Add(new Character(roleId, item.Key, 1));
+ }
+ UnlockImportantSystems();
+ }
+ if (Server.config.serverOptions.giveAllItems)
+ {
+ foreach (var item in itemTable)
+ {
+ if (item.Value.GetStorage() != ItemStorageSpace.BagAndFactoryDepot)
+ {
+ if (item.Value.maxStackCount == -1)
+ {
+ inventoryManager.items.Add(new Item(roleId, item.Value.id, 10000000));
+ }
+ else
+ {
+ inventoryManager.items.Add(new Item(roleId, item.Value.id, item.Value.maxStackCount));
+ }
+ }
}
}
- foreach(var item in itemTable)
- {
- if(item.Value.GetStorage()!= ItemStorageSpace.BagAndFactoryDepot)
- {
- if (item.Value.maxStackCount == -1)
- {
- inventoryManager.items.Add(new Item(roleId, item.Value.id, 10000000));
- }
- else
- {
- inventoryManager.items.Add(new Item(roleId, item.Value.id, item.Value.maxStackCount));
- }
- }
-
-
- }
teams.Add(new Team()
{
leader = chars[0].guid,
@@ -262,8 +304,8 @@ namespace Campofinale
}
});*/
+
- UnlockImportantSystems();
spaceshipManager.Load();
}
public void UnlockImportantSystems()
@@ -511,6 +553,7 @@ namespace Campofinale
DatabaseManager.db.SavePlayerData(this);
inventoryManager.Save();
spaceshipManager.Save();
+ if(Server.config.serverOptions.missionsEnabled) missionSystem.Save();
SaveCharacters();
SaveMails();
@@ -636,5 +679,17 @@ namespace Campofinale
}
}
+ ///
+ /// Unlock a system
+ ///
+ ///
+ public void UnlockSystem(UnlockSystemType t)
+ {
+ unlockedSystems.Add((int)t);
+ Send(ScMsgId.ScUnlockSystem, new ScUnlockSystem()
+ {
+ UnlockSystemType = (int)t
+ });
+ }
}
}
diff --git a/Campofinale/Program.cs b/Campofinale/Program.cs
index 0d54c17..2663065 100644
--- a/Campofinale/Program.cs
+++ b/Campofinale/Program.cs
@@ -11,9 +11,6 @@ class Program
private static void StartServer(string[] args)
{
Console.Title = "Initializing...";
-
- //bool disableLogs = args.Length > 0 && args[0].ToLower() == "nologs";
-
ConfigFile config = new ConfigFile();
if (File.Exists("server_config.json"))
{
@@ -27,7 +24,7 @@ class Program
}).Start();
AppDomain.CurrentDomain.ProcessExit += (_, _) =>
{
- Console.WriteLine("Shutting down...");
+ Logger.Print("Shutting down...");
Server.Shutdown();
};
diff --git a/Campofinale/Resource/ResourceManager.cs b/Campofinale/Resource/ResourceManager.cs
index 16adb7a..109dbb5 100644
--- a/Campofinale/Resource/ResourceManager.cs
+++ b/Campofinale/Resource/ResourceManager.cs
@@ -480,6 +480,8 @@ namespace Campofinale.Resource
public List levelDataPaths;
[JsonIgnore]
public LevelData levelData;
+
+ //public List levelDataList;
public class LevelData
{
public string sceneId="";
@@ -757,6 +759,13 @@ namespace Campofinale.Resource
float dz = z - other.z;
return MathF.Sqrt(dx * dx + dy * dy + dz * dz);
}
+ public float DistanceXZ(Vector3f other)
+ {
+ float dx = x - other.x;
+ float dy = 0;
+ float dz = z - other.z;
+ return MathF.Sqrt(dx * dx + dy * dy + dz * dz);
+ }
public ScdVec3Int ToProtoScd()
{
return new ScdVec3Int()
diff --git a/Campofinale/Resource/Table/LevelScriptEvent.cs b/Campofinale/Resource/Table/LevelScriptEvent.cs
index ee6fbdc..3ba79db 100644
--- a/Campofinale/Resource/Table/LevelScriptEvent.cs
+++ b/Campofinale/Resource/Table/LevelScriptEvent.cs
@@ -24,7 +24,8 @@ namespace Campofinale.Resource.Table
None = 0,
CompleteQuest = 1,
ProcessQuest = 2,
- SpawnEnemy = 3
+ SpawnEnemy = 3,
+ UnlockSystem = 4,
}
}
diff --git a/Campofinale/Server.cs b/Campofinale/Server.cs
index 3ac301b..fc79073 100644
--- a/Campofinale/Server.cs
+++ b/Campofinale/Server.cs
@@ -174,7 +174,6 @@ namespace Campofinale
dispatch = new Dispatch();
dispatch.Start();
}
- public static CsMsgId[] hideLog = [];
public static string ColoredText(string text, string color)
{