From 4e280f18b5d4eeb9ee7fd5c128d84e4e3a934dda Mon Sep 17 00:00:00 2001 From: AlessandroCH Date: Mon, 26 May 2025 22:23:03 +0200 Subject: [PATCH] mission system now save, characters at start only 1 if quests are enabled --- Campofinale/ConfigFile.cs | 15 +- Campofinale/Database/Database.cs | 27 +++ .../Game/Entities/EntityInteractive.cs | 2 +- Campofinale/Game/Entities/EntityMonster.cs | 2 +- Campofinale/Game/MissionSys/MissionSystem.cs | 26 ++- Campofinale/Game/SceneManager.cs | 42 ++-- Campofinale/NotifyManager.cs | 2 +- Campofinale/Packets/Cs/HandleCsBitsetAdd.cs | 2 +- Campofinale/Packets/Cs/HandleCsLogin.cs | 183 ++++-------------- .../Cs/HandleCsSceneInteractSpInteractive.cs | 1 + .../HandleCsSceneInteractiveEventTrigger.cs | 17 +- .../Cs/HandleCsSceneSetLastSafeZone.cs | 11 +- .../Cs/HandleCsSceneSetLevelScriptActive.cs | 103 ++-------- .../Packets/Cs/HandleCsTrackMission.cs | 3 +- .../Packets/Sc/PacketScEnterSceneNotify.cs | 2 +- .../Packets/Sc/PacketScSelfSceneInfo.cs | 1 + .../Packets/Sc/PacketScSyncAllMission.cs | 16 ++ Campofinale/Player.cs | 105 +++++++--- Campofinale/Program.cs | 5 +- Campofinale/Resource/ResourceManager.cs | 9 + .../Resource/Table/LevelScriptEvent.cs | 3 +- Campofinale/Server.cs | 1 - 22 files changed, 268 insertions(+), 310 deletions(-) create mode 100644 Campofinale/Packets/Sc/PacketScSyncAllMission.cs 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) {