diff --git a/Campofinale/Game/SceneManager.cs b/Campofinale/Game/SceneManager.cs index d1148f2..589a499 100644 --- a/Campofinale/Game/SceneManager.cs +++ b/Campofinale/Game/SceneManager.cs @@ -297,7 +297,7 @@ namespace Campofinale.Game public void Load() { if (info().isSeamless && alreadyLoaded) return; - alreadyLoaded = true; + //alreadyLoaded = true; Unload(); LevelScene lv_scene = ResourceManager.GetLevelData(sceneNumId); @@ -345,6 +345,7 @@ namespace Campofinale.Game levelLogicId = en.levelLogicId, }; + entity.defaultHide=en.defaultHide; entities.Add(entity); }); lv_scene.levelData.npcs.ForEach(en => @@ -381,6 +382,7 @@ namespace Campofinale.Game } + public void SpawnEntity(Entity en,bool spawnedCheck=true) { if (!activeScripts.Contains(en.belongLevelScriptId) && en.defaultHide && en.belongLevelScriptId != 0) @@ -404,8 +406,12 @@ namespace Campofinale.Game { if(e.spawned==false && (activeScripts.Contains(e.belongLevelScriptId) || e.belongLevelScriptId==0)) { - toSpawn.Add(e); - e.spawned= true; + if (!e.defaultHide) + { + toSpawn.Add(e); + e.spawned = true; + } + } } @@ -445,7 +451,14 @@ namespace Campofinale.Game { return Server.clients.Find(c => c.roleId == ownerId); } - + public void SpawnEnemyByScriptId(ulong id) + { + GetEntityExcludingChar().FindAll(e => e.belongLevelScriptId == id).ForEach(e => + { + e.spawned = true; + }); + GetOwner().Send(new PacketScObjectEnterView(GetOwner(), GetEntityExcludingChar().FindAll(e => e.belongLevelScriptId == id))); + } public void SpawnEnemy(ulong v) { LevelScene lv_scene = ResourceManager.GetLevelData(sceneNumId); @@ -462,5 +475,7 @@ namespace Campofinale.Game SpawnEntity(entity); } } + + } } diff --git a/Campofinale/Packets/Cs/HandleCsLogin.cs b/Campofinale/Packets/Cs/HandleCsLogin.cs index d21c0f2..7e08074 100644 --- a/Campofinale/Packets/Cs/HandleCsLogin.cs +++ b/Campofinale/Packets/Cs/HandleCsLogin.cs @@ -29,6 +29,7 @@ namespace Campofinale.Packets.Cs 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 }; @@ -129,7 +130,8 @@ namespace Campofinale.Packets.Cs session.Send(new PacketScSyncBaseData(session)); session.Send(ScMsgId.ScSceneClientIdInfo, new ScSceneClientIdInfo() { - + RoleIdx=6, + LastMaxIdx=session.random.v }); session.Send(new PacketScItemBagScopeSync(session, ItemValuableDepotType.Weapon)); session.Send(new PacketScItemBagScopeSync(session, ItemValuableDepotType.WeaponGem)); diff --git a/Campofinale/Packets/Cs/HandleCsSceneSetBattle.cs b/Campofinale/Packets/Cs/HandleCsSceneSetBattle.cs new file mode 100644 index 0000000..667197f --- /dev/null +++ b/Campofinale/Packets/Cs/HandleCsSceneSetBattle.cs @@ -0,0 +1,22 @@ +using Campofinale.Network; +using Campofinale.Protocol; + +namespace Campofinale.Packets.Cs +{ + public class HandleCsSceneSetBattle + { + + [Server.Handler(CsMsgId.CsSceneSetBattle)] + public static void Handle(Player session, CsMsgId cmdId, Packet packet) + { + CsSceneSetBattle req = packet.DecodeBody(); + + ScSceneSetBattle rsp = new() + { + InBattle = req.InBattle, + }; + session.Send(ScMsgId.ScSceneSetBattle, rsp); + } + + } +} diff --git a/Campofinale/Packets/Cs/HandleCsSceneSetLevelScriptActive.cs b/Campofinale/Packets/Cs/HandleCsSceneSetLevelScriptActive.cs index ce2ff2e..2229b04 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 System.Net.Sockets; using static Campofinale.Resource.ResourceManager.LevelScene.LevelData; namespace Campofinale.Packets.Cs @@ -26,13 +27,17 @@ namespace Campofinale.Packets.Cs State = 3 }; - - session.Send(ScMsgId.ScSceneLevelScriptStateNotify, rsp); if (!session.sceneManager.GetCurScene().activeScripts.Contains(req.ScriptId)) { session.sceneManager.GetCurScene().activeScripts.Add(req.ScriptId); session.sceneManager.GetCurScene().UpdateShowEntities(); } + session.Send(ScMsgId.ScSceneLevelScriptStateNotify, rsp); + + + } + else + { } @@ -50,17 +55,29 @@ namespace Campofinale.Packets.Cs { SceneNumId = req.SceneNumId, ScriptId = req.ScriptId, - + State = 4 }; - - session.Send(ScMsgId.ScSceneLevelScriptStateNotify, rsp,packet.csHead.UpSeqid); - } - + session.Send(ScMsgId.ScSceneLevelScriptStateNotify, rsp, packet.csHead.UpSeqid); + } + else + { + ScSceneLevelScriptStateNotify rsp = new ScSceneLevelScriptStateNotify() + { + SceneNumId = req.SceneNumId, + ScriptId = req.ScriptId, + + State = 4 + }; + + session.Send(ScMsgId.ScSceneLevelScriptStateNotify, rsp, packet.csHead.UpSeqid); + } + + } - public static void ExecuteEventAction(Player player, ScriptAction action) + public static void ExecuteEventAction(Player player, ScriptAction action, CsSceneLevelScriptEventTrigger req) { switch (action.action) { @@ -71,7 +88,17 @@ namespace Campofinale.Packets.Cs player.missionSystem.ProcessQuest(action.valueStr[0]); break; case ScriptActionType.SpawnEnemy: - player.sceneManager.GetCurScene().SpawnEnemy(action.valueUlong[0]); + foreach (ulong id in action.valueUlong) + { + player.sceneManager.GetCurScene().SpawnEnemy(id); + } + + break; + case ScriptActionType.SpawnEnemyByScriptId: + foreach(ulong id in action.valueUlong) + { + player.sceneManager.GetCurScene().SpawnEnemyByScriptId(id); + } break; case ScriptActionType.UnlockSystem: UnlockSystemType type = (UnlockSystemType)Enum.Parse(typeof(UnlockSystemType), action.valueStr[0]); @@ -83,6 +110,19 @@ namespace Campofinale.Packets.Cs case ScriptActionType.AddMission: player.missionSystem.AddMission(action.valueStr[0]); break; + case ScriptActionType.CallClientEvent: + foreach(string id in action.valueStr) + { + ScSceneTriggerClientLevelScriptEvent trigger = new() + { + EventName = id, + SceneNumId = req.SceneNumId, + ScriptId = req.ScriptId, + }; + + player.Send(ScMsgId.ScSceneTriggerClientLevelScriptEvent, trigger); + } + break; case ScriptActionType.CompleteMission: //player.missionSystem.C(action.valueStr[0]); break; @@ -104,7 +144,7 @@ namespace Campofinale.Packets.Cs Logger.Print($"{levelScriptEvent.comment}"); levelScriptEvent.actions.ForEach(a => { - ExecuteEventAction(session, a); + ExecuteEventAction(session, a,req); }); } else @@ -130,15 +170,8 @@ namespace Campofinale.Packets.Cs } } session.Send(ScMsgId.ScSceneUpdateLevelScriptProperty, update1); - /*ScSceneTriggerClientLevelScriptEvent trigger = new() - { - EventName = req.EventName, - SceneNumId = req.SceneNumId, - ScriptId = req.ScriptId, - - }; - session.Send(ScMsgId.ScSceneTriggerClientLevelScriptEvent, trigger); - ScSceneUpdateLevelScriptProperty update2 = new() + + /*ScSceneUpdateLevelScriptProperty update2 = new() { SceneNumId = req.SceneNumId, ScriptId = req.ScriptId, diff --git a/Campofinale/Resource/Table/LevelScriptEvent.cs b/Campofinale/Resource/Table/LevelScriptEvent.cs index e57fc4a..f5d2d2d 100644 --- a/Campofinale/Resource/Table/LevelScriptEvent.cs +++ b/Campofinale/Resource/Table/LevelScriptEvent.cs @@ -29,5 +29,7 @@ namespace Campofinale.Resource.Table EnterScene = 5, AddMission = 6, CompleteMission = 7, + SpawnEnemyByScriptId = 8, + CallClientEvent = 9 } }