mirror of
https://github.com/EggLinks/DanhengServer-OpenSource.git
synced 2026-01-02 20:26:03 +08:00
fix: the repeated battle mission
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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; } = [];
|
||||
}
|
||||
6
Common/Data/Config/Task/TriggerBattle.cs
Normal file
6
Common/Data/Config/Task/TriggerBattle.cs
Normal file
@@ -0,0 +1,6 @@
|
||||
namespace EggLink.DanhengServer.Data.Config.Task;
|
||||
|
||||
public class TriggerBattle : TaskConfigInfo
|
||||
{
|
||||
public DynamicFloat EventID { get; set; } = new();
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user