fix: the repeated battle mission

This commit is contained in:
StopWuyu
2025-06-01 14:38:11 +08:00
parent 20e030fbc0
commit 9073cac5c6
9 changed files with 96 additions and 30 deletions

View File

@@ -114,12 +114,16 @@ public class FloorDimensionInfo
public void OnLoad(FloorInfo floor)
{
foreach (var data in SavedValues)
{
if (floor.FloorSavedValue.Any(x => x.Name == data.Name)) continue;
floor.FloorSavedValue.Add(new FloorSavedValueInfo
{
ID = data.ID,
Name = data.Name,
DefaultValue = data.MaxValue
});
}
foreach (var index in GroupIndexList) GroupIDList.Add(floor.GroupInstanceList[index].ID);
}

View File

@@ -1,4 +1,5 @@
using EggLink.DanhengServer.Database.Quests;
using EggLink.DanhengServer.Data.Config.Task;
using EggLink.DanhengServer.Database.Quests;
using EggLink.DanhengServer.Enums;
using EggLink.DanhengServer.Enums.Mission;
using EggLink.DanhengServer.Enums.Scene;
@@ -37,14 +38,51 @@ public class GroupInfo
public List<PropInfo> PropList { get; set; } = [];
public List<NpcInfo> NPCList { get; set; } = [];
public Dictionary<int, GroupPropertyConfigInfo> GroupPropertyMap { get; set; } = [];
public ValueSourceInfo? ValueSource { get; set; }
[JsonIgnore] public LevelGraphConfigInfo? LevelGraphConfig { get; set; }
[JsonIgnore] public Dictionary<string, List<int>> PropTriggerCustomString { get; set; } = [];
[JsonIgnore] public List<string> ControlFloorSavedValue { get; set; } = [];
[JsonIgnore] public List<int> RelatedBattleId { get; set; } = [];
public void Load()
{
foreach (var prop in PropList) prop.Load(this);
foreach (var source in ValueSource?.Values ?? [])
{
if (source["Key"]?.ToString() == "FSV")
{
var value = source["Value"];
if (value != null)
ControlFloorSavedValue.Add(value.ToString());
}
}
foreach (var info in LevelGraphConfig?.OnInitSequece ?? [])
{
foreach (var configInfo in info.TaskList)
{
if (configInfo is TriggerBattle battle)
{
if (battle.EventID.GetValue() > 0)
RelatedBattleId.Add(battle.EventID.GetValue());
}
}
}
foreach (var info in LevelGraphConfig?.OnStartSequece ?? [])
{
foreach (var configInfo in info.TaskList)
{
if (configInfo is TriggerBattle battle)
{
if (battle.EventID.GetValue() > 0)
RelatedBattleId.Add(battle.EventID.GetValue());
}
}
}
}
}

View File

@@ -19,7 +19,7 @@ public class PropInfo : PositionInfo
public bool IsClientOnly { get; set; }
public bool LoadOnInitial { get; set; }
public PropValueSource? ValueSource { get; set; }
public ValueSourceInfo? ValueSource { get; set; }
public string? InitLevelGraph { get; set; }
[JsonConverter(typeof(StringEnumConverter))]
@@ -87,7 +87,7 @@ public class PropInfo : PositionInfo
}
}
public class PropValueSource
public class ValueSourceInfo
{
public List<JObject> Values { get; set; } = [];
}

View File

@@ -0,0 +1,6 @@
namespace EggLink.DanhengServer.Data.Config.Task;
public class TriggerBattle : TaskConfigInfo
{
public DynamicFloat EventID { get; set; } = new();
}

View File

@@ -246,7 +246,6 @@ public class ResourceManager
group.Id = groupInfo.ID;
// Use a sorted collection or maintain order manually
info.Groups[groupInfo.ID] = group;
group.Load();
// Load graph
var graphPath = ConfigManager.Config.Path.ResourcePath + "/" + group.LevelGraph;
@@ -260,6 +259,8 @@ public class ResourceManager
var graphInfo = LevelGraphConfigInfo.LoadFromJsonObject(graphObj);
group.LevelGraphConfig = graphInfo;
}
group.Load();
}
}
catch (Exception ex)

View File

@@ -162,8 +162,13 @@ public class PlayerInstance(PlayerData data)
{
Uid = Data.Uid;
ActivityManager = new ActivityManager(this);
AvatarManager = new AvatarManager(this);
AvatarManager.AvatarData.DatabaseVersion = GameConstants.AvatarDbVersion;
AvatarManager = new AvatarManager(this)
{
AvatarData =
{
DatabaseVersion = GameConstants.AvatarDbVersion
}
};
LineupManager = new LineupManager(this);
InventoryManager = new InventoryManager(this);

View File

@@ -130,20 +130,7 @@ public class RainbowSceneComponent(SceneInstance scene) : BaseSceneComponent(sce
if (string.IsNullOrEmpty(savedValueName)) return;
// update floor saved data
if (SceneInst.Player.SceneData!.FloorSavedData.TryGetValue(SceneInst.FloorId, out var savedData))
{
savedData[savedValueName] = savedValue;
}
else
{
SceneInst.Player.SceneData!.FloorSavedData[SceneInst.FloorId] = new Dictionary<string, int>
{
{ savedValueName, savedValue }
};
}
// send packet to client
await SceneInst.Player.SendPacket(new PacketUpdateFloorSavedValueNotify(savedValueName, savedValue, SceneInst.Player));
await SceneInst.UpdateFloorSavedValue(savedValueName, savedValue);
}
private async ValueTask CallCurrentTargetPuzzlePropertyAction(Dictionary<string, object> param)

View File

@@ -130,26 +130,25 @@ public class SceneEntityLoader(SceneInstance scene)
Scene.Player.MissionManager!.GetMainMissionStatus(info.OwnerMainMissionID) ==
MissionPhaseEnum.Accept)) return null; // check if main mission is accepted
if (Scene.FloorId == 20332001 && info.Id == 109) // certain group id
if (Scene.Player.SceneData?.FloorSavedData.GetValueOrDefault(20332001, [])
.GetValueOrDefault("ShowFeather", 0) != 1)
return null; // a temp solution for Sunday
if ((!info.LoadCondition.IsTrue(missionData) ||
info.UnloadCondition.IsTrue(missionData,
false) || // condition: Load Condition, Unload Condition, Force Unload Condition
info.ForceUnloadCondition.IsTrue(missionData, false)) &&
!forceLoad) return null; // check if group should be loaded forcefully
// if (!info.SavedValueCondition.IsTrue(
// Scene.Player.SceneData!.FloorSavedData.GetValueOrDefault(Scene.FloorId, [])) &&
// !forceLoad) // condition: Saved Value Condition
// return null;
if (!info.SavedValueCondition.IsTrue(
Scene.Player.SceneData!.FloorSavedData.GetValueOrDefault(Scene.FloorId, [])) &&
!forceLoad) // condition: Saved Value Condition
return null;
if (Scene.Entities.Values.ToList().FindIndex(x => x.GroupId == info.Id) !=
-1) // check if group is already loaded
return null;
if (!Scene.Player.MissionManager!.GetRunningSubMissionList().Any(x =>
x.FinishType == MissionFinishTypeEnum.StageWin && info.RelatedBattleId.Contains(x.ParamInt1)))
return null; // mission not activated
// load
Scene.Groups.Add(info.Id); // add group to loaded groups

View File

@@ -295,7 +295,9 @@ public class SceneInstance
Player.SceneData.GroupPropertyData[FloorId] = groupData;
}
var property = FloorInfo?.Groups.GetValueOrDefault(groupId)?.GroupPropertyMap.Values
var group = FloorInfo?.Groups.GetValueOrDefault(groupId);
if (group == null) return new GroupPropertyRefreshData(groupId, name, 0, value);
var property = group.GroupPropertyMap.Values
.FirstOrDefault(x => x.Name == name);
if (property == null) return new GroupPropertyRefreshData(groupId, name, 0, value);
@@ -314,9 +316,33 @@ public class SceneInstance
if (callEvent && GroupPropertyUpdated != null) await GroupPropertyUpdated(res);
if (name == "SGP_PuzzleState" && group.ControlFloorSavedValue.Count > 0)
{
// set fsv
foreach (var key in group.ControlFloorSavedValue)
{
await UpdateFloorSavedValue(key, value);
}
}
return res;
}
public async ValueTask UpdateFloorSavedValue(string name, int value)
{
if (!Player.SceneData!.FloorSavedData.TryGetValue(FloorId, out var floorSavedData))
{
floorSavedData = [];
Player.SceneData.FloorSavedData[FloorId] = floorSavedData;
}
if (FloorInfo?.FloorSavedValue.All(x => x.Name != name) == true) return; // not exist
floorSavedData[name] = value;
await Player.SendPacket(new PacketUpdateFloorSavedValueNotify(name, value, Player));
}
public int GetGroupProperty(int groupId, string name)
{
if (!Player.SceneData!.GroupPropertyData.TryGetValue(FloorId, out var groupData))