mission system now save, characters at start only 1 if quests are enabled

This commit is contained in:
AlessandroCH
2025-05-26 22:23:03 +02:00
parent 8563aeb739
commit 4e280f18b5
22 changed files with 268 additions and 310 deletions

View File

@@ -12,19 +12,28 @@
{ {
public int defaultSceneNumId = 87; public int defaultSceneNumId = 87;
public int maxPlayers = 20; public int maxPlayers = 20;
public CharactersOptions defaultCharacters = new(); /// <summary>
/// Experimental, Mission System is still a work in progress.
/// </summary>
public bool missionsEnabled = false;
public bool giveAllItems = false;
/// <summary>
/// Not yet implemented
/// </summary>
public bool useEncryption = false;
//public CharactersOptions defaultCharacters = new();
public ServerOptions() public ServerOptions()
{ {
} }
public class CharactersOptions /*public class CharactersOptions
{ {
public int defaultLevel = 1; public int defaultLevel = 1;
public bool giveAllCharacters = true; public bool giveAllCharacters = true;
public List<string> characters = new List<string>(); //used if giveAllCharacters is false public List<string> characters = new List<string>(); //used if giveAllCharacters is false
public CharactersOptions() { } public CharactersOptions() { }
} }*/
/* public struct WelcomeMail /* public struct WelcomeMail
{ {
}*/ }*/

View File

@@ -2,6 +2,7 @@
using Campofinale.Game.Character; using Campofinale.Game.Character;
using Campofinale.Game.Gacha; using Campofinale.Game.Gacha;
using Campofinale.Game.Inventory; using Campofinale.Game.Inventory;
using Campofinale.Game.MissionSys;
using Campofinale.Game.Spaceship; using Campofinale.Game.Spaceship;
using MongoDB.Bson; using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes; using MongoDB.Bson.Serialization.Attributes;
@@ -38,6 +39,14 @@ namespace Campofinale.Database
public Gender gender = Gender.GenFemale; public Gender gender = Gender.GenFemale;
public Dictionary<int, Item> bag = new(); public Dictionary<int, Item> bag = new();
} }
public class MissionData
{
[BsonId]
public ulong roleId;
public List<GameMission> missions = new();
public List<GameQuest> quests = new();
public string curMission = "e0m0";
}
public class Account public class Account
{ {
public string id; public string id;
@@ -64,12 +73,17 @@ namespace Campofinale.Database
public Database(string connectionString, string dbName) public Database(string connectionString, string dbName)
{ {
var client = new MongoClient(connectionString); var client = new MongoClient(connectionString);
_database = client.GetDatabase(dbName); _database = client.GetDatabase(dbName);
} }
public List<Mail> LoadMails(ulong roleId) public List<Mail> LoadMails(ulong roleId)
{ {
return _database.GetCollection<Mail>("mails").Find(c => c.owner == roleId).ToList(); return _database.GetCollection<Mail>("mails").Find(c => c.owner == roleId).ToList();
} }
public MissionData LoadMissionData(ulong roleId)
{
return _database.GetCollection<MissionData>("missionsData").Find(c => c.roleId == roleId).FirstOrDefault();
}
public List<Character> LoadCharacters(ulong roleId) public List<Character> LoadCharacters(ulong roleId)
{ {
return _database.GetCollection<Character>("avatars").Find(c=>c.owner== roleId).ToList(); return _database.GetCollection<Character>("avatars").Find(c=>c.owner== roleId).ToList();
@@ -176,6 +190,19 @@ namespace Campofinale.Database
new ReplaceOptions { IsUpsert = true } new ReplaceOptions { IsUpsert = true }
); );
} }
public void UpsertMissionData(MissionData data)
{
var collection = _database.GetCollection<MissionData>("missionsData");
var filter =
Builders<MissionData>.Filter.Eq(p => p.roleId, data.roleId);
collection.ReplaceOne(
filter,
data,
new ReplaceOptions { IsUpsert = true }
);
}
public void UpsertAccount(Account player) public void UpsertAccount(Account player)
{ {
var collection = _database.GetCollection<Account>("accounts"); var collection = _database.GetCollection<Account>("accounts");

View File

@@ -42,7 +42,7 @@ namespace Campofinale.Game.Entities
{ {
CommonInfo = new() CommonInfo = new()
{ {
Hp = 100, Hp = 1,
Id = guid, Id = guid,
Templateid = templateId, Templateid = templateId,

View File

@@ -80,7 +80,7 @@ namespace Campofinale.Game.Entities
SceneNumId = sceneNumId, SceneNumId = sceneNumId,
Position = Position.ToProto(), Position = Position.ToProto(),
Rotation = Rotation.ToProto(), Rotation = Rotation.ToProto(),
Type =(int) ObjectTypeIndex.Enemy, Type =(int) ObjectTypeIndex.Enemy,
}, },

View File

@@ -19,6 +19,13 @@ namespace Campofinale.Game.MissionSys
} }
public ScSyncAllMission ToProto() public ScSyncAllMission ToProto()
{ {
if (!Server.config.serverOptions.missionsEnabled)
{
string json1 = File.ReadAllText("44_ScSyncAllMission.json");
ScSyncAllMission m = Newtonsoft.Json.JsonConvert.DeserializeObject<ScSyncAllMission>(json1);
m.TrackMissionId = "";
return m;
}
ScSyncAllMission sync = new ScSyncAllMission(); ScSyncAllMission sync = new ScSyncAllMission();
sync.TrackMissionId = curMission; sync.TrackMissionId = curMission;
missions.ForEach(m => missions.ForEach(m =>
@@ -71,18 +78,23 @@ namespace Campofinale.Game.MissionSys
} }
public void Save() public void Save()
{ {
DatabaseManager.db.UpsertMissionData(new MissionData()
{
roleId=owner.roleId,
curMission=curMission,
missions=missions,
quests=quests,
});
} }
public void Load() public void Load()
{ {
MissionData data= DatabaseManager.db.LoadMissionData(owner.roleId);
if (ResourceManager.missionDataTable.Count < 1) if (data != null)
{ {
//Disabling if no missions curMission = data.curMission;
return; 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) public void AddMission(string id,MissionState state = MissionState.Available, bool notify=false)
{ {

View File

@@ -215,7 +215,6 @@ namespace Campofinale.Game
{ {
return scenes.Find(s=>s.sceneNumId == sceneNumId).guid; return scenes.Find(s=>s.sceneNumId == sceneNumId).guid;
} }
//TODO Save and get
public void Load() public void Load()
{ {
foreach (var level in ResourceManager.levelDatas) foreach (var level in ResourceManager.levelDatas)
@@ -335,19 +334,20 @@ namespace Campofinale.Game
lv_scene.levelData.enemies.ForEach(en => lv_scene.levelData.enemies.ForEach(en =>
{ {
if(GetOwner().noSpawnAnymore.Contains(en.levelLogicId) && sceneNumId != 87) return; 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) EntityMonster entity = new(en.entityDataIdKey,en.level,ownerId,en.position,en.rotation, sceneNumId, en.levelLogicId)
{ {
type=en.entityType, type=en.entityType,
belongLevelScriptId=en.belongLevelScriptId, belongLevelScriptId=en.belongLevelScriptId,
levelLogicId = en.levelLogicId levelLogicId = en.levelLogicId,
}; };
entities.Add(entity); entities.Add(entity);
}); });
lv_scene.levelData.npcs.ForEach(en => 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) EntityNpc entity = new(en.entityDataIdKey,ownerId,en.position,en.rotation, sceneNumId, en.levelLogicId)
{ {
belongLevelScriptId = en.belongLevelScriptId, belongLevelScriptId = en.belongLevelScriptId,
@@ -359,8 +359,19 @@ namespace Campofinale.Game
}); });
GetEntityExcludingChar().ForEach(e => GetEntityExcludingChar().ForEach(e =>
{ {
// GetOwner().Send(new PacketScObjectEnterView(GetOwner(), new List<Entity>() { e})); if(e is EntityInteractive)
{
// e.spawned = true;
// GetOwner().Send(new PacketScObjectEnterView(GetOwner(), new List<Entity>() { e }));
}
});
GetEntityExcludingChar().FindAll(e=> e is not EntityInteractive).ForEach(e =>
{
// e.spawned = true;
// GetOwner().Send(new PacketScObjectEnterView(GetOwner(), new List<Entity>() { e }));
}); });
UpdateShowEntities(); UpdateShowEntities();
@@ -370,10 +381,16 @@ namespace Campofinale.Game
{ {
en.spawned = true; en.spawned = true;
List<Entity> toSpawn = new List<Entity>(); List<Entity> toSpawn = new List<Entity>();
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) 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; e.spawned = true;
toSpawn.Add(e); toSpawn.Add(e);
@@ -387,8 +404,8 @@ namespace Campofinale.Game
toSpawn.Add(e); toSpawn.Add(e);
} }
} }*/
toSpawn.Add(en);
toSpawn.ForEach(e => toSpawn.ForEach(e =>
{ {
GetOwner().Send(new PacketScObjectEnterView(GetOwner(), new List<Entity>() { e})); GetOwner().Send(new PacketScObjectEnterView(GetOwner(), new List<Entity>() { e}));
@@ -397,9 +414,12 @@ namespace Campofinale.Game
} }
public void UpdateShowEntities() public void UpdateShowEntities()
{ {
foreach(Entity en in GetEntityExcludingChar()) 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) if (!en.spawned)
{ {

View File

@@ -55,7 +55,7 @@
} }
else 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))})"); 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))})");
} }
} }

View File

@@ -16,7 +16,7 @@ namespace Campofinale.Packets.Cs
{ {
session.bitsetManager.AddValue((BitsetType)req.Type, (int)item); 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);
} }

View File

@@ -1,6 +1,7 @@
using BeyondTools.VFS.Crypto; using BeyondTools.VFS.Crypto;
using Campofinale.Database; using Campofinale.Database;
using Campofinale.Game; using Campofinale.Game;
using Campofinale.Game.Character;
using Campofinale.Network; using Campofinale.Network;
using Campofinale.Packets.Sc; using Campofinale.Packets.Sc;
using Campofinale.Protocol; using Campofinale.Protocol;
@@ -16,11 +17,42 @@ namespace Campofinale.Packets.Cs
public static void HandleCsSetGender(Player session, CsMsgId cmdId, Packet packet) public static void HandleCsSetGender(Player session, CsMsgId cmdId, Packet packet)
{ {
CsSetGender req = packet.DecodeBody<CsSetGender>(); CsSetGender req = packet.DecodeBody<CsSetGender>();
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() ScSetGender rsp = new()
{ {
Gender = req.Gender, Gender = req.Gender,
}; };
session.gender = rsp.Gender; session.gender = rsp.Gender;
session.Send(ScMsgId.ScSetGender, rsp); session.Send(ScMsgId.ScSetGender, rsp);
} }
@@ -95,29 +127,7 @@ namespace Campofinale.Packets.Cs
return; return;
} }
session.Send(new PacketScSyncBaseData(session)); 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.Weapon));
session.Send(new PacketScItemBagScopeSync(session, ItemValuableDepotType.WeaponGem)); session.Send(new PacketScItemBagScopeSync(session, ItemValuableDepotType.WeaponGem));
session.Send(new PacketScItemBagScopeSync(session, ItemValuableDepotType.Equip)); 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 PacketScItemBagScopeSync(session, ItemValuableDepotType.SpecialItem));
session.Send(new PacketScSyncAllMail(session)); session.Send(new PacketScSyncAllMail(session));
session.Send(new PacketScSceneCollectionSync(session)); session.Send(new PacketScSceneCollectionSync(session));
string json1 = File.ReadAllText("44_ScSyncAllMission.json"); session.Send(new PacketScSyncAllMission(session));
ScSyncAllMission m = Newtonsoft.Json.JsonConvert.DeserializeObject<ScSyncAllMission>(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 PacketScGachaSync(session)); session.Send(new PacketScGachaSync(session));
ScSettlementSyncAll settlements = new ScSettlementSyncAll() ScSettlementSyncAll settlements = new ScSettlementSyncAll()
{ {

View File

@@ -30,6 +30,7 @@ namespace Campofinale.Packets.Cs
ScSceneInteractSpInteractive rsp = new() ScSceneInteractSpInteractive rsp = new()
{ {
ObjId = req.ObjId, ObjId = req.ObjId,
}; };
session.Send(ScMsgId.ScSceneInteractSpInteractive, rsp); session.Send(ScMsgId.ScSceneInteractSpInteractive, rsp);
} }

View File

@@ -20,17 +20,14 @@ namespace Campofinale.Packets.Cs
{ {
} }
else ScSceneTriggerClientInteractiveEvent tr = new()
{ {
ScSceneTriggerClientInteractiveEvent tr = new() EventName = req.EventName,
{ Id = req.Id,
EventName = req.EventName, SceneNumId = req.SceneNumId,
Id = req.Id,
SceneNumId = req.SceneNumId, };
session.Send(ScMsgId.ScSceneTriggerClientInteractiveEvent, tr);
};
session.Send(ScMsgId.ScSceneTriggerClientInteractiveEvent, tr);
}
} }
} }

View File

@@ -11,16 +11,7 @@ namespace Campofinale.Packets.Cs
{ {
CsSceneSetLastSafeZone req = packet.DecodeBody<CsSceneSetLastSafeZone>(); CsSceneSetLastSafeZone req = packet.DecodeBody<CsSceneSetLastSafeZone>();
//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));
}
} }

View File

@@ -5,6 +5,7 @@ using Campofinale.Protocol;
using Campofinale.Resource; using Campofinale.Resource;
using Campofinale.Resource.Table; using Campofinale.Resource.Table;
using Pastel; using Pastel;
using static Campofinale.Resource.ResourceManager.LevelScene.LevelData;
namespace Campofinale.Packets.Cs namespace Campofinale.Packets.Cs
{ {
@@ -34,16 +35,18 @@ namespace Campofinale.Packets.Cs
public static void HandleCsSceneSetLevelScriptStart(Player session, CsMsgId cmdId, Packet packet) public static void HandleCsSceneSetLevelScriptStart(Player session, CsMsgId cmdId, Packet packet)
{ {
CsSceneSetLevelScriptStart req = packet.DecodeBody<CsSceneSetLevelScriptStart>(); CsSceneSetLevelScriptStart req = packet.DecodeBody<CsSceneSetLevelScriptStart>();
if (req.IsStart) if (req.IsStart)
{ {
ScSceneLevelScriptStateNotify rsp = new ScSceneLevelScriptStateNotify() ScSceneLevelScriptStateNotify rsp = new ScSceneLevelScriptStateNotify()
{ {
SceneNumId = req.SceneNumId, SceneNumId = req.SceneNumId,
ScriptId = req.ScriptId, ScriptId = req.ScriptId,
State = 4 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: case ScriptActionType.SpawnEnemy:
player.sceneManager.GetCurScene().SpawnEnemy(action.valueUlong[0]); player.sceneManager.GetCurScene().SpawnEnemy(action.valueUlong[0]);
break; break;
case ScriptActionType.UnlockSystem:
UnlockSystemType type = (UnlockSystemType)Enum.Parse(typeof(UnlockSystemType), action.valueStr[0]);
player.UnlockSystem(type);
break;
default: default:
Logger.PrintWarn("Script Action not implemented"); Logger.PrintWarn("Script Action not implemented");
break; break;
@@ -73,7 +80,7 @@ namespace Campofinale.Packets.Cs
CsSceneLevelScriptEventTrigger req = packet.DecodeBody<CsSceneLevelScriptEventTrigger>(); CsSceneLevelScriptEventTrigger req = packet.DecodeBody<CsSceneLevelScriptEventTrigger>();
Logger.Print(req.Properties.ToString()); Logger.Print(req.Properties.ToString());
if (ResourceManager.levelScriptsEvents.TryGetValue(req.EventName, out LevelScriptEvent levelScriptEvent)) if (ResourceManager.levelScriptsEvents.TryGetValue(req.EventName, out LevelScriptEvent levelScriptEvent))
{ {
Logger.Print($"Event {req.EventName.Pastel(ConsoleColor.Yellow)} Executed."); 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($" ScriptID: {req.ScriptId.ToString().Pastel(ConsoleColor.White)} ");
Logger.PrintWarn($"]"); 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() ScSceneUpdateLevelScriptProperty update1 = new()
{ {
@@ -175,8 +104,16 @@ namespace Campofinale.Packets.Cs
ScriptId = req.ScriptId, 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<int>());
update1.Properties.Add(key, item.Value);
}
}
session.Send(ScMsgId.ScSceneUpdateLevelScriptProperty, update1); session.Send(ScMsgId.ScSceneUpdateLevelScriptProperty, update1);
ScSceneTriggerClientLevelScriptEvent trigger = new() /*ScSceneTriggerClientLevelScriptEvent trigger = new()
{ {
EventName = req.EventName, EventName = req.EventName,
SceneNumId = req.SceneNumId, 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() ScSceneLevelScriptEventTrigger rsp = new ScSceneLevelScriptEventTrigger()
{ {

View File

@@ -10,11 +10,12 @@ namespace Campofinale.Packets.Cs
{ {
CsTrackMission req = packet.DecodeBody<CsTrackMission>(); CsTrackMission req = packet.DecodeBody<CsTrackMission>();
session.missionSystem.curMission = req.MissionId; session.missionSystem.curMission = req.MissionId;
ScTrackMissionChange rsp = new() ScTrackMissionChange rsp = new()
{ {
MissionId = req.MissionId MissionId = req.MissionId
}; };
session.Send(ScMsgId.ScTrackMissionChange, rsp); session.Send(ScMsgId.ScTrackMissionChange, rsp,packet.csHead.UpSeqid);
} }
} }
} }

View File

@@ -19,7 +19,7 @@ namespace Campofinale.Packets.Sc
SceneNumId = sceneNumId, SceneNumId = sceneNumId,
}; };
SetData(ScMsgId.ScEnterSceneNotify, proto); SetData(ScMsgId.ScEnterSceneNotify, proto);
} }

View File

@@ -60,6 +60,7 @@ namespace Campofinale.Packets.Sc
}); });
//Levelscripts here? //Levelscripts here?
if(infoReason!= SelfInfoReasonType.SlrChangeTeam)
ResourceManager.GetLevelData(session.curSceneNumId).levelData.levelScripts.ForEach(l => ResourceManager.GetLevelData(session.curSceneNumId).levelData.levelScripts.ForEach(l =>
{ {
LevelScriptInfo script = new LevelScriptInfo() LevelScriptInfo script = new LevelScriptInfo()

View File

@@ -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());
}
}
}

View File

@@ -170,12 +170,13 @@ namespace Campofinale
} }
bitsetManager.Load(data.bitsets); bitsetManager.Load(data.bitsets);
savedSaveZone = data.savedSafeZone; savedSaveZone = data.savedSafeZone;
if(Server.config.serverOptions.missionsEnabled) missionSystem.Load();
} }
else else
{ {
Initialize(); //only if no account found Initialize(); //only if no account found
} }
missionSystem.Load();
sceneManager.Load(); sceneManager.Load();
factoryManager.Load(); factoryManager.Load();
return (data != null); return (data != null);
@@ -202,39 +203,80 @@ namespace Campofinale
{ {
return chars.Find(c => c.id==templateId); return chars.Find(c => c.id==templateId);
} }
/// <summary>
/// Add a character with template id if not present in the chars list *Added in 1.1.6*
/// </summary>
/// <param name="id"></param>
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));
}
}
}
/// <summary>
/// Remove a character using template id *Added in 1.1.6*
/// </summary>
/// <param name="id"></param>
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() 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, "chr_0002_endminm", 1));
{ missionSystem.AddMission("e0m0", MissionState.Processing);
chars.Add(new Character(roleId, item.Key, Server.config.serverOptions.defaultCharacters.defaultLevel));
}
} }
else 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() teams.Add(new Team()
{ {
leader = chars[0].guid, leader = chars[0].guid,
@@ -262,8 +304,8 @@ namespace Campofinale
} }
});*/ });*/
UnlockImportantSystems();
spaceshipManager.Load(); spaceshipManager.Load();
} }
public void UnlockImportantSystems() public void UnlockImportantSystems()
@@ -511,6 +553,7 @@ namespace Campofinale
DatabaseManager.db.SavePlayerData(this); DatabaseManager.db.SavePlayerData(this);
inventoryManager.Save(); inventoryManager.Save();
spaceshipManager.Save(); spaceshipManager.Save();
if(Server.config.serverOptions.missionsEnabled) missionSystem.Save();
SaveCharacters(); SaveCharacters();
SaveMails(); SaveMails();
@@ -636,5 +679,17 @@ namespace Campofinale
} }
} }
/// <summary>
/// Unlock a system
/// </summary>
/// <param name="none"></param>
public void UnlockSystem(UnlockSystemType t)
{
unlockedSystems.Add((int)t);
Send(ScMsgId.ScUnlockSystem, new ScUnlockSystem()
{
UnlockSystemType = (int)t
});
}
} }
} }

View File

@@ -11,9 +11,6 @@ class Program
private static void StartServer(string[] args) private static void StartServer(string[] args)
{ {
Console.Title = "Initializing..."; Console.Title = "Initializing...";
//bool disableLogs = args.Length > 0 && args[0].ToLower() == "nologs";
ConfigFile config = new ConfigFile(); ConfigFile config = new ConfigFile();
if (File.Exists("server_config.json")) if (File.Exists("server_config.json"))
{ {
@@ -27,7 +24,7 @@ class Program
}).Start(); }).Start();
AppDomain.CurrentDomain.ProcessExit += (_, _) => AppDomain.CurrentDomain.ProcessExit += (_, _) =>
{ {
Console.WriteLine("Shutting down..."); Logger.Print("Shutting down...");
Server.Shutdown(); Server.Shutdown();
}; };

View File

@@ -480,6 +480,8 @@ namespace Campofinale.Resource
public List<string> levelDataPaths; public List<string> levelDataPaths;
[JsonIgnore] [JsonIgnore]
public LevelData levelData; public LevelData levelData;
//public List<LevelData> levelDataList;
public class LevelData public class LevelData
{ {
public string sceneId=""; public string sceneId="";
@@ -757,6 +759,13 @@ namespace Campofinale.Resource
float dz = z - other.z; float dz = z - other.z;
return MathF.Sqrt(dx * dx + dy * dy + dz * dz); 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() public ScdVec3Int ToProtoScd()
{ {
return new ScdVec3Int() return new ScdVec3Int()

View File

@@ -24,7 +24,8 @@ namespace Campofinale.Resource.Table
None = 0, None = 0,
CompleteQuest = 1, CompleteQuest = 1,
ProcessQuest = 2, ProcessQuest = 2,
SpawnEnemy = 3 SpawnEnemy = 3,
UnlockSystem = 4,
} }
} }

View File

@@ -174,7 +174,6 @@ namespace Campofinale
dispatch = new Dispatch(); dispatch = new Dispatch();
dispatch.Start(); dispatch.Start();
} }
public static CsMsgId[] hideLog = [];
public static string ColoredText(string text, string color) public static string ColoredText(string text, string color)
{ {