style: code format

This commit is contained in:
StopWuyu
2025-05-30 20:54:02 +08:00
parent 97218886f6
commit ba8bbbb313
70 changed files with 353 additions and 439 deletions

View File

@@ -4,7 +4,6 @@ using EggLink.DanhengServer.GameServer.Server.Packet.Send.Player;
using EggLink.DanhengServer.GameServer.Server.Packet.Send.PlayerSync;
using EggLink.DanhengServer.Internationalization;
using EggLink.DanhengServer.Proto;
using System.Numerics;
namespace EggLink.DanhengServer.Command.Command.Cmd;
@@ -44,9 +43,7 @@ public class CommandAvatar : ICommand
{
if (!GameData.AvatarConfigData.TryGetValue(path.Key, out var pathExcel)) continue;
foreach (var talent in pathExcel.SkillTree)
{
path.Value.SkillTree[talent.PointID] = Math.Min(level, talent.MaxLevel);
}
}
await arg.SendMsg(I18NManager.Translate("Game.Command.Avatar.AllAvatarsLevelSet",
@@ -59,9 +56,7 @@ public class CommandAvatar : ICommand
}
if (GameData.MultiplePathAvatarConfigData.TryGetValue(avatarId, out var multiple))
{
avatarId = multiple.BaseAvatarID;
}
var avatar = player.AvatarManager!.GetFormalAvatar(avatarId);
if (avatar == null)
@@ -85,9 +80,7 @@ public class CommandAvatar : ICommand
}
foreach (var talent in excel.SkillTree)
{
avatarPathInfo.Value.SkillTree[talent.PointID] = Math.Min(level, talent.MaxLevel);
}
// sync
await player.SendPacket(new PacketPlayerSyncScNotify(avatar));
@@ -155,10 +148,7 @@ public class CommandAvatar : ICommand
}
else
{
if (GameData.MultiplePathAvatarConfigData.TryGetValue(id, out var multiple))
{
id = multiple.BaseAvatarID;
}
if (GameData.MultiplePathAvatarConfigData.TryGetValue(id, out var multiple)) id = multiple.BaseAvatarID;
var avatar = arg.Target.Player!.AvatarManager!.GetFormalAvatar(id);
if (avatar == null)

View File

@@ -14,7 +14,8 @@ public class CommandClear : ICommand
return;
}
var removeList = arg.Target.Player!.InventoryManager!.Data.EquipmentItems.Where(x => x.EquipAvatar == 0).ToList();
var removeList = arg.Target.Player!.InventoryManager!.Data.EquipmentItems.Where(x => x.EquipAvatar == 0)
.ToList();
await arg.Target.Player!.InventoryManager!.RemoveItems(removeList.Select(x => (x.ItemId, x.Count, x.UniqueId))
.ToList());

View File

@@ -1,6 +1,4 @@
using EggLink.DanhengServer.Data;
using EggLink.DanhengServer.GameServer.Game.Avatar;
using EggLink.DanhengServer.GameServer.Game.Lineup;
using EggLink.DanhengServer.Internationalization;
namespace EggLink.DanhengServer.Command.Command.Cmd;

View File

@@ -306,7 +306,8 @@ public class CommandGiveall : ICommand
if (player.AvatarManager!.GetFormalAvatar(multiPathAvatar.BaseAvatarID) == null)
{
await player.InventoryManager!.AddItem(multiPathAvatar.BaseAvatarID, 1, false, sync: false);
player.AvatarManager!.GetFormalAvatar(multiPathAvatar.BaseAvatarID)!.Level = Math.Max(Math.Min(1, 80), 0);
player.AvatarManager!.GetFormalAvatar(multiPathAvatar.BaseAvatarID)!.Level =
Math.Max(Math.Min(1, 80), 0);
player.AvatarManager!.GetFormalAvatar(multiPathAvatar.BaseAvatarID)!.Promotion =
GameData.GetMinPromotionForLevel(Math.Max(Math.Min(1, 80), 0));
player.AvatarManager!.GetFormalAvatar(multiPathAvatar.BaseAvatarID)!.GetCurPathInfo().Rank =

View File

@@ -1,5 +1,4 @@
using EggLink.DanhengServer.Enums.Avatar;
using EggLink.DanhengServer.GameServer.Server.Packet.Send.Player;
using EggLink.DanhengServer.Internationalization;
using EggLink.DanhengServer.Proto;

View File

@@ -30,7 +30,8 @@ public class CommandLineup : ICommand
}
var player = arg.Target.Player!;
foreach (var avatar in player.LineupManager!.GetCurLineup()!.AvatarData!.FormalAvatars) avatar.CurrentHp = 10000;
foreach (var avatar in player.LineupManager!.GetCurLineup()!.AvatarData!.FormalAvatars)
avatar.CurrentHp = 10000;
await player.SendPacket(new PacketSyncLineupNotify(player.LineupManager.GetCurLineup()!));
await arg.SendMsg(I18NManager.Translate("Game.Command.Lineup.HealedAllAvatars"));
}

View File

@@ -187,7 +187,9 @@ public class CommandScene : ICommand
curDistance = distance;
}
}
if (nearest != null)
await arg.SendMsg($"Nearest Prop {nearest.EntityId}: PropId {nearest.PropInfo.ID}, GroupId {nearest.GroupID}, State {nearest.State}");
await arg.SendMsg(
$"Nearest Prop {nearest.EntityId}: PropId {nearest.PropInfo.ID}, GroupId {nearest.GroupID}, State {nearest.State}");
}
}

View File

@@ -108,7 +108,9 @@ public class ServerProfile
public int HeadIcon { get; set; } = 200105;
public int ChatBubbleId { get; set; } = 220001;
public int PersonalCardId { get; set; } = 253001;
public List<ServerAssistInfo> AssistInfo { get; set; } = [
public List<ServerAssistInfo> AssistInfo { get; set; } =
[
new() { AvatarId = 1213, Level = 80 }
];
}

View File

@@ -8,5 +8,6 @@ public class AdvModifyMaxMazeMP : TaskConfigInfo
{
[JsonConverter(typeof(StringEnumConverter))]
public PropertyModifyFunctionEnum ModifyFunction { get; set; }
public DynamicFloat ModifyValue { get; set; }
}

View File

@@ -5,6 +5,7 @@ namespace EggLink.DanhengServer.Data.Config.Task;
public class ByAnd : PredicateConfigInfo
{
public List<PredicateConfigInfo> PredicateList { get; set; } = [];
public new static PredicateConfigInfo LoadFromJsonObject(JObject obj)
{
var info = new ByAnd

View File

@@ -1,5 +1,4 @@
using System.Text.Json.Serialization;
using EggLink.DanhengServer.Database.Avatar;
namespace EggLink.DanhengServer.Data.Excel;

View File

@@ -1,6 +1,6 @@
namespace EggLink.DanhengServer.Data.Excel;
[ResourceEntity("MazeSkill.json,MazeSkillLD.json",isMultifile:true)]
[ResourceEntity("MazeSkill.json,MazeSkillLD.json", true)]
public class MazeSkillExcel : ExcelResource
{
public int MazeSkillId { get; set; }

View File

@@ -13,6 +13,7 @@ public class MultiplePathAvatarConfigExcel : ExcelResource
[JsonConverter(typeof(StringEnumConverter))]
public GenderTypeEnum Gender { get; set; }
public int AvatarID { get; set; }
public int BaseAvatarID { get; set; }

View File

@@ -5,7 +5,7 @@ public class RogueTalkNameConfigExcel : ExcelResource
{
public int TalkNameID { get; set; }
public HashName Name { get; set; } = new();
public override int GetId()
{
return TalkNameID;

View File

@@ -1,8 +1,4 @@
using EggLink.DanhengServer.Database;
using EggLink.DanhengServer.Database.Avatar;
using EggLink.DanhengServer.Database.Inventory;
using EggLink.DanhengServer.Database.Player;
using EggLink.DanhengServer.Enums.Avatar;
using EggLink.DanhengServer.Enums.Avatar;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;

View File

@@ -13,6 +13,7 @@ public class SummonUnitDataExcel : ExcelResource
[JsonConverter(typeof(StringEnumConverter))]
public SummonUnitUniqueGroupEnum UniqueGroup { get; set; }
public bool DestroyOnEnterBattle { get; set; }
public bool RemoveMazeBuffOnDestroy { get; set; }

View File

@@ -14,19 +14,6 @@ namespace EggLink.DanhengServer.Data;
public static class GameData
{
#region Activity
public static ActivityConfig ActivityConfig { get; set; } = new();
#region Marble
public static Dictionary<int, MarbleMatchInfoExcel> MarbleMatchInfoData { get; private set; } = [];
public static Dictionary<int, MarbleSealExcel> MarbleSealData { get; private set; } = [];
#endregion
#endregion
#region Banners
public static BannersConfig BannersConfig { get; set; } = new();
@@ -45,6 +32,19 @@ public static class GameData
#endregion
#region Activity
public static ActivityConfig ActivityConfig { get; set; } = new();
#region Marble
public static Dictionary<int, MarbleMatchInfoExcel> MarbleMatchInfoData { get; private set; } = [];
public static Dictionary<int, MarbleSealExcel> MarbleSealData { get; private set; } = [];
#endregion
#endregion
#region Avatar
public static Dictionary<int, AvatarConfigExcel> AvatarConfigData { get; private set; } = [];
@@ -269,8 +269,16 @@ public static class GameData
public static Dictionary<int, BaseRogueBuffExcel> RogueBuffData { get; private set; } = [];
public static Dictionary<int, BaseRogueBuffGroupExcel> RogueBuffGroupData { get; private set; } = [];
public static Dictionary<int, RogueHandBookEventExcel> RogueHandBookEventData { get; private set; } = [];
public static Dictionary<int, RogueDialogueOptionDisplayExcel> RogueDialogueOptionDisplayData { get; private set; } = [];
public static Dictionary<int, RogueDialogueDynamicDisplayExcel> RogueDialogueDynamicDisplayData { get; private set; } = [];
public static Dictionary<int, RogueDialogueOptionDisplayExcel>
RogueDialogueOptionDisplayData { get; private set; } = [];
public static Dictionary<int, RogueDialogueDynamicDisplayExcel> RogueDialogueDynamicDisplayData
{
get;
private set;
} = [];
public static Dictionary<int, RogueHandbookMiracleExcel> RogueHandbookMiracleData { get; private set; } = [];
public static Dictionary<int, RogueManagerExcel> RogueManagerData { get; private set; } = [];
public static Dictionary<int, Dictionary<int, RogueMapExcel>> RogueMapData { get; private set; } = [];

View File

@@ -2,11 +2,9 @@
using EggLink.DanhengServer.Data.Excel;
using EggLink.DanhengServer.Database.Inventory;
using EggLink.DanhengServer.Database.Player;
using EggLink.DanhengServer.Proto;
using Newtonsoft.Json;
using SqlSugar;
using System.IO;
using EggLink.DanhengServer.Enums.Avatar;
using EggLink.DanhengServer.Proto;
using SqlSugar;
using LineupInfo = EggLink.DanhengServer.Database.Lineup.LineupInfo;
namespace EggLink.DanhengServer.Database.Avatar;
@@ -28,7 +26,7 @@ public class AvatarData : BaseDatabaseDataHelper
public abstract class BaseAvatarInfo
{
public int BaseAvatarId { get; set; }
public int AvatarId { get; set; } // special avatar id / base avatar id
public int AvatarId { get; set; } // special avatar id / base avatar id
public int Promotion { get; set; }
public int Level { get; set; }
public int CurrentHp { get; set; } = 10000;
@@ -80,7 +78,8 @@ public abstract class BaseAvatarInfo
public abstract BattleAvatar ToBattleProto(PlayerDataCollection collection,
AvatarType avatarType = AvatarType.AvatarFormalType);
public abstract LineupAvatar ToLineupInfo(int slot, LineupInfo info, AvatarType avatarType = AvatarType.AvatarFormalType);
public abstract LineupAvatar ToLineupInfo(int slot, LineupInfo info,
AvatarType avatarType = AvatarType.AvatarFormalType);
public abstract Proto.Avatar ToProto();
}
@@ -97,10 +96,7 @@ public class FormalAvatarInfo : BaseAvatarInfo
// TODO add skills
BaseAvatarId = baseAvatarId;
AvatarId = avatarId;
if (addSkills)
{
CheckPathSkillTree();
}
if (addSkills) CheckPathSkillTree();
}
public int Exp { get; set; }
@@ -181,7 +177,8 @@ public class FormalAvatarInfo : BaseAvatarInfo
return proto;
}
public override LineupAvatar ToLineupInfo(int slot, LineupInfo info, AvatarType avatarType = AvatarType.AvatarFormalType)
public override LineupAvatar ToLineupInfo(int slot, LineupInfo info,
AvatarType avatarType = AvatarType.AvatarFormalType)
{
return new LineupAvatar
{
@@ -352,9 +349,8 @@ public class SpecialAvatarInfo : BaseAvatarInfo
public void CheckLevel(int worldLevel)
{
if (!GameData.SpecialAvatarData.TryGetValue(AvatarId * 10 + worldLevel, out var specialAvatar))
{
if (!GameData.SpecialAvatarData.TryGetValue(AvatarId * 10 + 1, out specialAvatar)) return;
}
if (!GameData.SpecialAvatarData.TryGetValue(AvatarId * 10 + 1, out specialAvatar))
return;
Level = specialAvatar.Level;
Promotion = specialAvatar.Promotion;
@@ -398,7 +394,8 @@ public class SpecialAvatarInfo : BaseAvatarInfo
return proto;
}
public override LineupAvatar ToLineupInfo(int slot, LineupInfo info, AvatarType avatarType = AvatarType.AvatarFormalType)
public override LineupAvatar ToLineupInfo(int slot, LineupInfo info,
AvatarType avatarType = AvatarType.AvatarFormalType)
{
return new LineupAvatar
{

View File

@@ -5,13 +5,12 @@ namespace EggLink.DanhengServer.Database.Friend;
[SugarTable("Friend")]
public class FriendData : BaseDatabaseDataHelper
{
[SugarColumn(IsJson = true, ColumnDataType = "TEXT")]
public Dictionary<int, FriendDetailData> FriendDetailList { get; set; } = [];
[SugarColumn(IsJson = true, ColumnDataType = "TEXT")]
public List<FriendDetailData> FriendList { get; set; } = []; // leave for compatibility
public List<FriendDetailData> FriendList { get; set; } = []; // leave for compatibility
[SugarColumn(IsJson = true)] public List<int> BlackList { get; set; } = [];

View File

@@ -1,5 +1,4 @@
using System.ComponentModel;
using EggLink.DanhengServer.Data;
using EggLink.DanhengServer.Database.Avatar;
using EggLink.DanhengServer.Database.Quests;
using EggLink.DanhengServer.Proto;
@@ -43,18 +42,13 @@ public class LineupInfo
{
var result = false;
if (BaseAvatars != null && AvatarData != null)
{
foreach (var avatar in BaseAvatars)
{
BaseAvatarInfo? avatarInfo;
if (avatar.SpecialAvatarId > 0)
{
avatarInfo = AvatarData?.TrialAvatars?.Find(item => item.SpecialAvatarId == avatar.SpecialAvatarId);
}
else
{
avatarInfo = AvatarData?.FormalAvatars?.Find(item => item.BaseAvatarId == avatar.BaseAvatarId);
}
if (avatarInfo != null)
{
@@ -66,7 +60,6 @@ public class LineupInfo
result = true;
}
}
}
return result;
}
@@ -79,13 +72,9 @@ public class LineupInfo
{
BaseAvatarInfo? avatarInfo;
if (avatar.SpecialAvatarId > 0)
{
avatarInfo = AvatarData?.TrialAvatars?.Find(item => item.SpecialAvatarId == avatar.SpecialAvatarId);
}
else
{
avatarInfo = AvatarData?.FormalAvatars?.Find(item => item.BaseAvatarId == avatar.BaseAvatarId);
}
if (avatarInfo != null)
{
@@ -107,13 +96,9 @@ public class LineupInfo
{
BaseAvatarInfo? avatarInfo;
if (avatar.SpecialAvatarId > 0)
{
avatarInfo = AvatarData?.TrialAvatars?.Find(item => item.SpecialAvatarId == avatar.SpecialAvatarId);
}
else
{
avatarInfo = AvatarData?.FormalAvatars?.Find(item => item.BaseAvatarId == avatar.BaseAvatarId);
}
if (avatarInfo != null)
{
@@ -165,12 +150,14 @@ public class LineupInfo
}
else if (avatar.SpecialAvatarId != 0) // special avatar
{
info.AvatarList.Add(AvatarData?.TrialAvatars?.Find(item => item.SpecialAvatarId == avatar.SpecialAvatarId)
info.AvatarList.Add(AvatarData?.TrialAvatars
?.Find(item => item.SpecialAvatarId == avatar.SpecialAvatarId)
?.ToLineupInfo(BaseAvatars.IndexOf(avatar), this, AvatarType.AvatarTrialType));
}
else // normal avatar
{
info.AvatarList.Add(AvatarData?.FormalAvatars?.Find(item => item.BaseAvatarId == avatar.BaseAvatarId)
info.AvatarList.Add(AvatarData?.FormalAvatars
?.Find(item => item.BaseAvatarId == avatar.BaseAvatarId)
?.ToLineupInfo(BaseAvatars.IndexOf(avatar), this));
}

View File

@@ -131,7 +131,7 @@ public class PlayerData : BaseDatabaseDataHelper
}
foreach (var avatar in instance.AssistAvatars.Select(
assist => instance.FormalAvatars.Find(x => x.AvatarId == assist)!))
assist => instance.FormalAvatars.Find(x => x.AvatarId == assist)!))
if (avatar != null)
info.AssistSimpleInfoList.Add(new AssistSimpleInfo
{
@@ -184,17 +184,17 @@ public class PlayerData : BaseDatabaseDataHelper
var pos = 0;
foreach (var avatar in avatarInfo.AssistAvatars.Select(assist =>
avatarInfo.FormalAvatars.Find(x => x.AvatarId == assist)))
avatarInfo.FormalAvatars.Find(x => x.AvatarId == assist)))
if (avatar != null)
info.AssistAvatarList.Add(avatar.ToDetailProto(pos++,
new PlayerDataCollection(this, inventoryInfo, new())));
new PlayerDataCollection(this, inventoryInfo, new LineupInfo())));
pos = 0;
foreach (var avatar in avatarInfo.DisplayAvatars.Select(display =>
avatarInfo.FormalAvatars.Find(x => x.AvatarId == display)))
avatarInfo.FormalAvatars.Find(x => x.AvatarId == display)))
if (avatar != null)
info.DisplayAvatarList.Add(avatar.ToDetailProto(pos++,
new PlayerDataCollection(this, inventoryInfo, new())));
new PlayerDataCollection(this, inventoryInfo, new LineupInfo())));
return info;
}

View File

@@ -4,5 +4,5 @@ public enum GenderTypeEnum
{
GENDER_NONE = 0,
GENDER_MAN = 1,
GENDER_WOMAN = 2,
GENDER_WOMAN = 2
}

View File

@@ -18,7 +18,8 @@ public class DanhengConnection
public static readonly ConcurrentBag<int> IgnoreLog =
[
CmdIds.PlayerHeartBeatCsReq, CmdIds.PlayerHeartBeatScRsp, CmdIds.SceneEntityMoveCsReq,
CmdIds.SceneEntityMoveScRsp, CmdIds.GetShopListCsReq, CmdIds.GetShopListScRsp, CmdIds.FightHeartBeatCsReq, CmdIds.FightHeartBeatScRsp
CmdIds.SceneEntityMoveScRsp, CmdIds.GetShopListCsReq, CmdIds.GetShopListScRsp, CmdIds.FightHeartBeatCsReq,
CmdIds.FightHeartBeatScRsp
];
protected readonly CancellationTokenSource CancelToken;

View File

@@ -73,7 +73,7 @@ public class AvatarManager(PlayerInstance player) : BasePlayerManager(player)
AvatarId = excel.AvatarID,
BaseAvatarId = excel.AvatarID,
Level = excel.Level,
Promotion = excel.Promotion,
Promotion = excel.Promotion
};
avatar.PathInfos.Add(excel.AvatarID, new PathInfo(excel.AvatarID)

View File

@@ -222,7 +222,8 @@ public class BattleInstance(PlayerInstance player, LineupInfo lineup, List<Stage
var avatars = GetBattleAvatars();
foreach (var avatar in avatars)
proto.BattleAvatarList.Add(avatar.Key.ToBattleProto(new PlayerDataCollection(Player.Data, Player.InventoryManager!.Data, Lineup), avatar.Value));
proto.BattleAvatarList.Add(avatar.Key.ToBattleProto(
new PlayerDataCollection(Player.Data, Player.InventoryManager!.Data, Lineup), avatar.Value));
System.Threading.Tasks.Task.Run(async () =>
{

View File

@@ -10,9 +10,7 @@ public class MazeBuff(int buffID, int buffLevel, int owner)
Duration = buff.Duration;
OwnerAvatarId = buff.OwnerAvatarId;
foreach (var buffDynamicValue in buff.DynamicValues)
{
DynamicValues.Add(buffDynamicValue.Key, buffDynamicValue.Value);
}
}
public int BuffID { get; } = buffID;

View File

@@ -55,10 +55,7 @@ public class SceneSkillManager(PlayerInstance player) : BasePlayerManager(player
attackEntity, targetEntities, req);
// check if avatar execute
if (attackEntity is AvatarSceneInfo)
{
await Player.SceneInstance!.OnUseSkill(req);
}
if (attackEntity is AvatarSceneInfo) await Player.SceneInstance!.OnUseSkill(req);
return new SkillResultData(Retcode.RetSucc, res.Instance, res.BattleInfos);
}

View File

@@ -53,9 +53,9 @@ public class FriendManager(PlayerInstance player) : BasePlayerManager(player)
if (target.BlackList.Contains(Player.Uid)) return null;
FriendData.ReceiveApplyList.Remove(targetUid);
FriendData.FriendDetailList.Add(targetUid, new());
FriendData.FriendDetailList.Add(targetUid, new FriendDetailData());
target.SendApplyList.Remove(Player.Uid);
target.FriendDetailList.Add(Player.Uid, new());
target.FriendDetailList.Add(Player.Uid, new FriendDetailData());
var targetPlayer = Listener.GetActiveConnection(targetUid);
if (targetPlayer != null)
@@ -183,13 +183,10 @@ public class FriendManager(PlayerInstance player) : BasePlayerManager(player)
{
var proto = new PacketRevcMsgScNotify((uint)recvUid, (uint)sendUid, info);
await Player.SendPacket(proto);
// receive message
var recvPlayer = Listener.GetActiveConnection(recvUid)?.Player;
if (recvPlayer != null)
{
await recvPlayer.FriendManager!.ReceiveInviteMessage(sendUid, recvUid, info);
}
if (recvPlayer != null) await recvPlayer.FriendManager!.ReceiveInviteMessage(sendUid, recvUid, info);
}
public async ValueTask ReceiveMessage(int sendUid, int recvUid, string? message = null, int? extraId = null)
@@ -365,7 +362,7 @@ public class FriendManager(PlayerInstance player) : BasePlayerManager(player)
var status = Listener.GetActiveConnection(player.Uid) == null
? FriendOnlineStatus.Offline
: FriendOnlineStatus.Online;
var friend = GetFriendDetailData(player.Uid) ?? new();
var friend = GetFriendDetailData(player.Uid) ?? new FriendDetailData();
proto.FriendList.Add(new FriendSimpleInfo
{

View File

@@ -3,7 +3,6 @@ using EggLink.DanhengServer.Database;
using EggLink.DanhengServer.Database.Avatar;
using EggLink.DanhengServer.Database.Lineup;
using EggLink.DanhengServer.GameServer.Game.Player;
using EggLink.DanhengServer.GameServer.Game.Scene;
using EggLink.DanhengServer.GameServer.Server.Packet.Send.Lineup;
using EggLink.DanhengServer.GameServer.Server.Packet.Send.Scene;
using EggLink.DanhengServer.Proto;
@@ -172,7 +171,9 @@ public class LineupManager : BasePlayerManager
{ BaseAvatarId = trial.BaseAvatarId, SpecialAvatarId = trial.SpecialAvatarId });
}
else
{
lineup.BaseAvatars!.Add(new LineupAvatarInfo { BaseAvatarId = avatarId });
}
}
LineupData.Lineups.Add(index, lineup);
@@ -203,7 +204,11 @@ public class LineupManager : BasePlayerManager
{
Name = "",
LineupType = 0,
BaseAvatars = [new LineupAvatarInfo { BaseAvatarId = baseAvatarId, SpecialAvatarId = specialAvatar?.SpecialAvatarID ?? 0 }],
BaseAvatars =
[
new LineupAvatarInfo
{ BaseAvatarId = baseAvatarId, SpecialAvatarId = specialAvatar?.SpecialAvatarID ?? 0 }
],
LineupData = LineupData,
AvatarData = Player.AvatarManager!.AvatarData
};
@@ -257,7 +262,10 @@ public class LineupManager : BasePlayerManager
Name = "",
LineupType = 0,
BaseAvatars =
[new LineupAvatarInfo { BaseAvatarId = specialAvatar.AvatarID, SpecialAvatarId = specialAvatar.SpecialAvatarID }],
[
new LineupAvatarInfo
{ BaseAvatarId = specialAvatar.AvatarID, SpecialAvatarId = specialAvatar.SpecialAvatarID }
],
LineupData = LineupData,
AvatarData = Player.AvatarManager!.AvatarData
};

View File

@@ -18,10 +18,7 @@ public class LobbyRoomInstance(PlayerInstance owner, long roomId, FightGameMode
public async ValueTask BroadCastToRoom(BasePacket packet)
{
foreach (var player in Players)
{
await player.Player.SendPacket(packet);
}
foreach (var player in Players) await player.Player.SendPacket(packet);
}
public async ValueTask AddPlayer(PlayerInstance player, List<int> sealList, LobbyCharacterType characterType)
@@ -46,10 +43,8 @@ public class LobbyRoomInstance(PlayerInstance owner, long roomId, FightGameMode
await BroadCastToRoom(new PacketLobbySyncInfoScNotify(uid, this, LobbyModifyType.QuitLobby));
if (Players.Count == 0)
{
// remove from manager
ServerUtils.LobbyServerManager.RemoveLobbyRoom(RoomId);
}
}
public async ValueTask<Retcode> LobbyStartFight()
@@ -60,7 +55,7 @@ public class LobbyRoomInstance(PlayerInstance owner, long roomId, FightGameMode
if (Players.Count(x => x.CharacterType != LobbyCharacterType.LobbyCharacterWatcher) != 2)
return Retcode.RetLobbyRoomPalyerNotReady;
if (Players.Any(x =>
x.CharacterType == LobbyCharacterType.LobbyCharacterMember &&
x.CharacterStatus != LobbyCharacterStatus.Ready)) return Retcode.RetLobbyRoomPalyerNotReady;
@@ -73,12 +68,10 @@ public class LobbyRoomInstance(PlayerInstance owner, long roomId, FightGameMode
if (leader == null) return Retcode.RetLobbyRoomPalyerFighting;
// start fight
foreach (var instance in Players)
{
instance.CharacterStatus = LobbyCharacterStatus.LobbyStartFight;
}
foreach (var instance in Players) instance.CharacterStatus = LobbyCharacterStatus.LobbyStartFight;
await BroadCastToRoom(new PacketLobbySyncInfoScNotify(leader.Player.Uid, this, LobbyModifyType.LobbyStartFight));
await BroadCastToRoom(new PacketLobbySyncInfoScNotify(leader.Player.Uid, this,
LobbyModifyType.LobbyStartFight));
return Retcode.RetSucc;
}
@@ -96,10 +89,7 @@ public class LobbyRoomInstance(PlayerInstance owner, long roomId, FightGameMode
await BroadCastToRoom(new PacketMultiplayerFightGameStartScNotify(fightRoom));
// start fight
foreach (var instance in Players)
{
instance.CharacterStatus = LobbyCharacterStatus.Fighting;
}
foreach (var instance in Players) instance.CharacterStatus = LobbyCharacterStatus.Fighting;
await BroadCastToRoom(new PacketLobbySyncInfoScNotify(0, this, LobbyModifyType.FightStart));
return Retcode.RetSucc;

View File

@@ -1,19 +1,19 @@
using EggLink.DanhengServer.GameServer.Game.Player;
using EggLink.DanhengServer.GameServer.Server.Packet.Send.Lobby;
using EggLink.DanhengServer.Proto;
namespace EggLink.DanhengServer.GameServer.Game.Lobby;
/// <summary>
/// Server Manager:
/// a manager would be only initialized when the server is started
/// Server Manager:
/// a manager would be only initialized when the server is started
/// </summary>
public class LobbyServerManager
{
public long CurLobbyRoomId { get; set; }
public Dictionary<long, LobbyRoomInstance> LobbyRoomInstances { get; set; } = [];
public async ValueTask<LobbyRoomInstance> CreateLobbyRoom(PlayerInstance ownerPlayer, int lobbyMode, List<int> sealList)
public async ValueTask<LobbyRoomInstance> CreateLobbyRoom(PlayerInstance ownerPlayer, int lobbyMode,
List<int> sealList)
{
var roomId = ++CurLobbyRoomId;
var room = new LobbyRoomInstance(ownerPlayer, roomId, FightGameMode.Marble, lobbyMode);
@@ -31,12 +31,9 @@ public class LobbyServerManager
public LobbyRoomInstance? GetPlayerJoinedRoom(int uid)
{
foreach (var room in LobbyRoomInstances.Values)
{
if (room.Players.Any(x => x.Player.Uid == uid))
{
return room;
}
}
return null;
}
}

View File

@@ -8,13 +8,6 @@ namespace EggLink.DanhengServer.GameServer.Game.MultiPlayer.MarbleGame;
public class MarbleGamePlayerInstance : BaseGamePlayerInstance
{
public Dictionary<int, MarbleGameSealInstance> SealList { get; set; } = [];
public MarbleTeamType TeamType { get; set; }
public MarblePlayerPhaseEnum Phase { get; set; } = MarblePlayerPhaseEnum.NotEnter;
public int CurItemId { get; set; }
public int Score { get; set; }
public HashSet<int> AllowMoveSealList { get; set; } = [];
public MarbleGamePlayerInstance(LobbyPlayerInstance lobby, MarbleTeamType type) : base(lobby)
{
TeamType = type;
@@ -54,11 +47,15 @@ public class MarbleGamePlayerInstance : BaseGamePlayerInstance
}
}
public Dictionary<int, MarbleGameSealInstance> SealList { get; set; } = [];
public MarbleTeamType TeamType { get; set; }
public MarblePlayerPhaseEnum Phase { get; set; } = MarblePlayerPhaseEnum.NotEnter;
public int CurItemId { get; set; }
public int Score { get; set; }
public HashSet<int> AllowMoveSealList { get; set; } = [];
public void ChangeRound()
{
foreach (var instance in SealList.Values)
{
AllowMoveSealList.Add(instance.Id);
}
foreach (var instance in SealList.Values) AllowMoveSealList.Add(instance.Id);
}
}

View File

@@ -16,12 +16,6 @@ namespace EggLink.DanhengServer.GameServer.Game.MultiPlayer.MarbleGame;
public class MarbleGameRoomInstance : BaseMultiPlayerGameRoomInstance
{
public MarbleTeamType CurMoveTeamType { get; set; }
public MarbleTeamType FirstMoveTeamType { get; set; }
public int CurRound { get; set; }
public int TurnCount { get; set; }
public long WaitingOperationEndTime { get; set; }
public MarbleGameRoomInstance(long roomId, LobbyRoomInstance parentLobby) : base(roomId, parentLobby)
{
// random move team type
@@ -29,10 +23,33 @@ public class MarbleGameRoomInstance : BaseMultiPlayerGameRoomInstance
FirstMoveTeamType = CurMoveTeamType;
// set player
foreach (var player in parentLobby.Players)
{
Players.Add(new MarbleGamePlayerInstance(player, (MarbleTeamType)(parentLobby.Players.IndexOf(
player) + 1)));
}
}
public MarbleTeamType CurMoveTeamType { get; set; }
public MarbleTeamType FirstMoveTeamType { get; set; }
public int CurRound { get; set; }
public int TurnCount { get; set; }
public long WaitingOperationEndTime { get; set; }
public MarbleGameInfo ToProto()
{
return new MarbleGameInfo
{
LobbyBasicInfo = { ParentLobby.Players.Select(x => x.ToProto()) },
CurActionTeamType = CurMoveTeamType,
LevelId = 100,
TeamAPlayer = (uint)Players[0].LobbyPlayer.Player.Uid,
TeamBPlayer = (uint)Players[1].LobbyPlayer.Player.Uid,
TeamARank = 1,
TeamBRank = 1,
TeamASealList = { (Players[0] as MarbleGamePlayerInstance)!.SealList.Select(x => (uint)x.Value.SealId) },
TeamBSealList = { (Players[1] as MarbleGamePlayerInstance)!.SealList.Select(x => (uint)x.Value.SealId) },
PlayerAScore = (uint)(Players[0] as MarbleGamePlayerInstance)!.Score,
PlayerBScore = (uint)(Players[1] as MarbleGamePlayerInstance)!.Score,
ControlByServer = true
};
}
@@ -40,18 +57,12 @@ public class MarbleGameRoomInstance : BaseMultiPlayerGameRoomInstance
public async ValueTask BroadCastToRoom(BasePacket packet)
{
foreach (var player in Players)
{
await player.SendPacket(packet);
}
foreach (var player in Players) await player.SendPacket(packet);
}
public async ValueTask BroadCastToRoomPlayer(BasePacket packet)
{
foreach (var player in Players.Where(x => !x.LeaveGame))
{
await player.LobbyPlayer.Player.SendPacket(packet);
}
foreach (var player in Players.Where(x => !x.LeaveGame)) await player.LobbyPlayer.Player.SendPacket(packet);
}
public async ValueTask EnterGame(int uid)
@@ -60,27 +71,20 @@ public class MarbleGameRoomInstance : BaseMultiPlayerGameRoomInstance
if (player == null) return;
player.EnterGame = true;
if (player is MarbleGamePlayerInstance marblePlayer)
{
marblePlayer.Phase = MarblePlayerPhaseEnum.EnterGame;
}
if (player is MarbleGamePlayerInstance marblePlayer) marblePlayer.Phase = MarblePlayerPhaseEnum.EnterGame;
if (Players.All(x => x.EnterGame))
{
// send basic info
await BroadCastToRoom(new PacketFightGeneralScNotify(MarbleNetWorkMsgEnum.SyncBatch,
MarbleNetWorkMsgEnum.GameStart, this));
}
}
public async ValueTask OnPlayerHeartBeat()
{
var curTime = Extensions.GetUnixMs();
if (WaitingOperationEndTime > 0 && curTime >= WaitingOperationEndTime)
{
// timeout
await SwitchTurn();
}
}
public List<MarbleGameBaseSyncData> CheckPlayerWin()
@@ -91,9 +95,7 @@ public class MarbleGameRoomInstance : BaseMultiPlayerGameRoomInstance
List<MarbleGameBaseSyncData> syncData = [];
// win
foreach (var player in Players.OfType<MarbleGamePlayerInstance>())
{
syncData.Add(new MarbleGameFinishSyncData(player, player == winPlayer));
}
return syncData;
}
@@ -148,32 +150,29 @@ public class MarbleGameRoomInstance : BaseMultiPlayerGameRoomInstance
public async ValueTask LoadFinish(MarbleGamePlayerInstance player)
{
player.Phase = MarblePlayerPhaseEnum.LoadFinish;
if (Players.OfType<MarbleGamePlayerInstance>().ToList().Where(x => !x.LeaveGame).All(x => x.Phase == MarblePlayerPhaseEnum.LoadFinish))
{
if (Players.OfType<MarbleGamePlayerInstance>().ToList().Where(x => !x.LeaveGame)
.All(x => x.Phase == MarblePlayerPhaseEnum.LoadFinish))
// next phase (performance)
await BroadCastToRoom(new PacketFightGeneralScNotify(MarbleNetWorkMsgEnum.SyncBatch,
[new MarblePerformanceSyncData(MarbleNetWorkMsgEnum.SyncNotify)]));
}
}
public async ValueTask PerformanceFinish(MarbleGamePlayerInstance player)
{
player.Phase = MarblePlayerPhaseEnum.PerformanceFinish;
if (Players.OfType<MarbleGamePlayerInstance>().ToList().Where(x => !x.LeaveGame).All(x => x.Phase == MarblePlayerPhaseEnum.PerformanceFinish))
{
if (Players.OfType<MarbleGamePlayerInstance>().ToList().Where(x => !x.LeaveGame)
.All(x => x.Phase == MarblePlayerPhaseEnum.PerformanceFinish))
// next phase (round start)
await RoundStart();
}
}
public async ValueTask HandleSimulateFinish(MarbleGamePlayerInstance player)
{
player.Phase = MarblePlayerPhaseEnum.SimulateFinish;
if (Players.OfType<MarbleGamePlayerInstance>().ToList().Where(x => !x.LeaveGame).All(x => x.Phase == MarblePlayerPhaseEnum.SimulateFinish))
{
if (Players.OfType<MarbleGamePlayerInstance>().ToList().Where(x => !x.LeaveGame)
.All(x => x.Phase == MarblePlayerPhaseEnum.SimulateFinish))
// switch turn
await SwitchTurn();
}
}
#endregion
@@ -185,10 +184,7 @@ public class MarbleGameRoomInstance : BaseMultiPlayerGameRoomInstance
CurRound++;
TurnCount = 0;
CurMoveTeamType = FirstMoveTeamType;
foreach (var player in Players.OfType<MarbleGamePlayerInstance>())
{
player.ChangeRound();
}
foreach (var player in Players.OfType<MarbleGamePlayerInstance>()) player.ChangeRound();
await BroadCastToRoom(new PacketFightGeneralScNotify(MarbleNetWorkMsgEnum.SyncBatch,
[
@@ -214,10 +210,7 @@ public class MarbleGameRoomInstance : BaseMultiPlayerGameRoomInstance
CurMoveTeamType = CurMoveTeamType == MarbleTeamType.TeamA ? MarbleTeamType.TeamB : MarbleTeamType.TeamA;
foreach (var player in Players.OfType<MarbleGamePlayerInstance>())
{
player.Phase = MarblePlayerPhaseEnum.Gaming;
}
foreach (var player in Players.OfType<MarbleGamePlayerInstance>()) player.Phase = MarblePlayerPhaseEnum.Gaming;
await BroadCastToRoom(new PacketFightGeneralScNotify(MarbleNetWorkMsgEnum.SyncBatch,
[
@@ -234,10 +227,7 @@ public class MarbleGameRoomInstance : BaseMultiPlayerGameRoomInstance
{
FirstMoveTeamType = FirstMoveTeamType == MarbleTeamType.TeamA ? MarbleTeamType.TeamB : MarbleTeamType.TeamA;
foreach (var player in Players.OfType<MarbleGamePlayerInstance>())
{
player.Phase = MarblePlayerPhaseEnum.Gaming;
}
foreach (var player in Players.OfType<MarbleGamePlayerInstance>()) player.Phase = MarblePlayerPhaseEnum.Gaming;
await BroadCastToRoom(new PacketFightGeneralScNotify(MarbleNetWorkMsgEnum.SyncBatch,
[
@@ -268,10 +258,10 @@ public class MarbleGameRoomInstance : BaseMultiPlayerGameRoomInstance
var speed = sealExcel.MaxSpeed * rotation;
var simulator = new CollisionSimulator(
leftBound: -5.25f,
rightBound: 5.25f,
topBound: 3f,
bottomBound: -3f
-5.25f,
5.25f,
3f,
-3f
)
{
LaunchTeam = itemId / 100
@@ -290,10 +280,9 @@ public class MarbleGameRoomInstance : BaseMultiPlayerGameRoomInstance
foreach (var sealInst in Players.OfType<MarbleGamePlayerInstance>().SelectMany(x => x.SealList.Values)
.Where(x => x.OnStage))
{
simulator.AddBall(sealInst.Id, new Vector2(sealInst.Position.X, sealInst.Position.Y), sealInst.Mass,
sealInst.Size, new Vector2(sealInst.Velocity.X, sealInst.Velocity.Y), hp:sealInst.CurHp, atk:sealInst.Attack);
}
sealInst.Size, new Vector2(sealInst.Velocity.X, sealInst.Velocity.Y), hp: sealInst.CurHp,
atk: sealInst.Attack);
syncData.AddRange(Players.OfType<MarbleGamePlayerInstance>().SelectMany(x => x.SealList.Values)
.Select(sealInst => new MarbleGameSealActionSyncData(sealInst, MarbleFrameType.ActionStart)));
@@ -301,8 +290,7 @@ public class MarbleGameRoomInstance : BaseMultiPlayerGameRoomInstance
syncData.Add(new MarbleGameSealLaunchStopSyncData(seal, MarbleFrameType.Launch));
simulator.Simulate();
foreach (var recordRaw in simulator.Records) // process record
{
foreach (var recordRaw in simulator.Records) // process record
switch (recordRaw)
{
case CollisionRecord record:
@@ -339,13 +327,11 @@ public class MarbleGameRoomInstance : BaseMultiPlayerGameRoomInstance
{
var velocityBNormal = Vector2.Normalize(record.BallB.Velocity);
if (record.BallB.Velocity != Vector2.Zero)
{
sealInstB.Rotation = new MarbleSealVector
{
X = velocityBNormal.X,
Y = velocityBNormal.Y
};
}
sealInstB.Velocity = new MarbleSealVector
{
@@ -360,24 +346,20 @@ public class MarbleGameRoomInstance : BaseMultiPlayerGameRoomInstance
};
if (sealInstB.Id / 100 != sealInst.Id / 100)
{
// different teams
// do damage to b
syncData.AddRange(sealInst.Id / 100 == itemId / 100
? DoDamage(sealInst, sealInstB, record.Time)
// do damage to a
: DoDamage(sealInstB, sealInst, record.Time));
}
}
syncData.Add(new MarbleGameSealCollisionSyncData(sealInst, record.BallA.Id, record.BallB?.Id ?? 1,
record.Time, record.CollisionPos, sealInstB?.Velocity));
if (sealInstB != null)
{
syncData.Add(new MarbleGameSealCollisionSyncData(sealInstB, record.BallA.Id,
record.BallB?.Id ?? 1,
record.Time, record.CollisionPos, sealInst.Velocity));
}
break;
}
@@ -433,7 +415,6 @@ public class MarbleGameRoomInstance : BaseMultiPlayerGameRoomInstance
break;
}
}
}
foreach (var ball in simulator.Balls)
{
@@ -464,21 +445,17 @@ public class MarbleGameRoomInstance : BaseMultiPlayerGameRoomInstance
await BroadCastToRoom(new PacketFightGeneralScNotify(MarbleNetWorkMsgEnum.SyncBatch,
[
new MarbleGameInfoLaunchingSyncData(MarbleNetWorkMsgEnum.SyncNotify, MarbleSyncType.SimulateStart,
simulator.CurTime, itemId, this, syncData), ..winData
simulator.CurTime, itemId, this, syncData),
..winData
]));
foreach (var p in Players.OfType<MarbleGamePlayerInstance>())
{
p.Phase = MarblePlayerPhaseEnum.Launching;
}
foreach (var p in Players.OfType<MarbleGamePlayerInstance>()) p.Phase = MarblePlayerPhaseEnum.Launching;
if (winData.Count > 0)
{
await EndGame();
}
if (winData.Count > 0) await EndGame();
}
public List<BaseMarbleGameSyncData> DoDamage(MarbleGameSealInstance attacker, MarbleGameSealInstance target, float time)
public List<BaseMarbleGameSyncData> DoDamage(MarbleGameSealInstance attacker, MarbleGameSealInstance target,
float time)
{
List<BaseMarbleGameSyncData> syncData = [];
var attackerPlayer = Players.OfType<MarbleGamePlayerInstance>().FirstOrDefault(x =>
@@ -537,7 +514,7 @@ public class MarbleGameRoomInstance : BaseMultiPlayerGameRoomInstance
seal.Rotation = new MarbleSealVector
{
X = posXBaseValue * -1f,
X = posXBaseValue * -1f
};
syncData.RemoveAll(x => x.ToProto().Id == seal.Id);
@@ -550,30 +527,28 @@ public class MarbleGameRoomInstance : BaseMultiPlayerGameRoomInstance
// detect collision with seals
anyMove = false;
for (var i = 0; i < seals.Count; i++)
for (var j = i + 1; j < seals.Count; j++)
{
for (var j = i + 1; j < seals.Count; j++)
var sealA = seals[i];
var sealB = seals[j];
var sealAPos = new Vector2(sealA.Position.X, sealA.Position.Y);
var sealBPos = new Vector2(sealB.Position.X, sealB.Position.Y);
if (!(Vector2.Distance(sealBPos, sealAPos) <= sealA.Size + sealB.Size)) continue;
anyMove = true;
// move sealB away
var normalVec = Vector2.Normalize(sealBPos - sealAPos);
var moveDistance = sealA.Size + sealB.Size - Vector2.Distance(sealBPos, sealAPos) + 0.1f;
var moveVec = normalVec * moveDistance;
sealB.Position = new MarbleSealVector
{
var sealA = seals[i];
var sealB = seals[j];
X = sealB.Position.X + moveVec.X,
Y = sealB.Position.Y + moveVec.Y
};
var sealAPos = new Vector2(sealA.Position.X, sealA.Position.Y);
var sealBPos = new Vector2(sealB.Position.X, sealB.Position.Y);
if (!(Vector2.Distance(sealBPos, sealAPos) <= sealA.Size + sealB.Size)) continue;
anyMove = true;
// move sealB away
var normalVec = Vector2.Normalize(sealBPos - sealAPos);
var moveDistance = sealA.Size + sealB.Size - Vector2.Distance(sealBPos, sealAPos) + 0.1f;
var moveVec = normalVec * moveDistance;
sealB.Position = new MarbleSealVector
{
X = sealB.Position.X + moveVec.X,
Y = sealB.Position.Y + moveVec.Y
};
syncData.RemoveAll(x => x.ToProto().Id == sealB.Id);
syncData.Add(new MarbleGameSealActionSyncData(sealB, MarbleFrameType.Revive, time));
}
syncData.RemoveAll(x => x.ToProto().Id == sealB.Id);
syncData.Add(new MarbleGameSealActionSyncData(sealB, MarbleFrameType.Revive, time));
}
} while (anyMove);
@@ -581,23 +556,4 @@ public class MarbleGameRoomInstance : BaseMultiPlayerGameRoomInstance
}
#endregion
public MarbleGameInfo ToProto()
{
return new MarbleGameInfo
{
LobbyBasicInfo = { ParentLobby.Players.Select(x => x.ToProto()) },
CurActionTeamType = CurMoveTeamType,
LevelId = 100,
TeamAPlayer = (uint)Players[0].LobbyPlayer.Player.Uid,
TeamBPlayer = (uint)Players[1].LobbyPlayer.Player.Uid,
TeamARank = 1,
TeamBRank = 1,
TeamASealList = { (Players[0] as MarbleGamePlayerInstance)!.SealList.Select(x => (uint)x.Value.SealId) },
TeamBSealList = { (Players[1] as MarbleGamePlayerInstance)!.SealList.Select(x => (uint)x.Value.SealId) },
PlayerAScore = (uint)(Players[0] as MarbleGamePlayerInstance)!.Score,
PlayerBScore = (uint)(Players[1] as MarbleGamePlayerInstance)!.Score,
ControlByServer = true
};
}
}

View File

@@ -2,7 +2,15 @@
namespace EggLink.DanhengServer.GameServer.Game.MultiPlayer.MarbleGame.Physics;
public class Ball(int id, Vector2 position, float mass, float radius, Vector2? velocity = null, bool isStatic = false, int hp = 100, int atk = 0)
public class Ball(
int id,
Vector2 position,
float mass,
float radius,
Vector2? velocity = null,
bool isStatic = false,
int hp = 100,
int atk = 0)
{
public int Id { get; } = id;
public Vector2 Position { get; set; } = position;

View File

@@ -2,10 +2,15 @@
namespace EggLink.DanhengServer.GameServer.Game.MultiPlayer.MarbleGame.Physics;
public class CollisionSimulator(float leftBound, float rightBound, float topBound, float bottomBound, float deceleration = 15f)
public class CollisionSimulator(
float leftBound,
float rightBound,
float topBound,
float bottomBound,
float deceleration = 15f)
{
public float Deceleration = deceleration;
public const float StepTime = 0.001f;
public float Deceleration = deceleration;
public List<Ball> Balls { get; } = [];
public int LaunchTeam { get; set; } = 0;
public List<object> Records { get; } = [];
@@ -15,7 +20,8 @@ public class CollisionSimulator(float leftBound, float rightBound, float topBoun
private float TopBound { get; } = topBound;
private float BottomBound { get; } = bottomBound;
public void AddBall(int id, Vector2 position, float mass, float radius, Vector2? velocity = null, bool isStatic = false, int hp = 100, int atk = 0)
public void AddBall(int id, Vector2 position, float mass, float radius, Vector2? velocity = null,
bool isStatic = false, int hp = 100, int atk = 0)
{
Balls.Add(new Ball(id, position, mass, radius, velocity, isStatic, hp, atk));
}
@@ -33,6 +39,7 @@ public class CollisionSimulator(float leftBound, float rightBound, float topBoun
ball.Velocity = Vector2.Zero;
Records.Add(new StopRecord(CurTime, ball.GetSnapshot()));
}
continue;
}
@@ -79,19 +86,14 @@ public class CollisionSimulator(float leftBound, float rightBound, float topBoun
public void CheckBallCollision()
{
for (var i = 0; i < Balls.Count; i++)
for (var j = i + 1; j < Balls.Count; j++)
{
for (var j = i + 1; j < Balls.Count; j++)
{
var ballA = Balls[i];
var ballB = Balls[j];
if (ballA.IsStatic || ballB.IsStatic) continue; // skip static balls
var ballA = Balls[i];
var ballB = Balls[j];
if (ballA.IsStatic || ballB.IsStatic) continue; // skip static balls
var distance = Vector2.Distance(ballA.Position, ballB.Position);
if (distance <= ballA.Radius + ballB.Radius)
{
HandleBallCollision(ballA, ballB);
}
}
var distance = Vector2.Distance(ballA.Position, ballB.Position);
if (distance <= ballA.Radius + ballB.Radius) HandleBallCollision(ballA, ballB);
}
}
@@ -170,12 +172,13 @@ public class CollisionSimulator(float leftBound, float rightBound, float topBoun
while (!AllObjectStopped())
{
AdvanceTime(StepTime);
foreach (var ball in Balls.Where(x => x.StageInitialVelocity != Vector2.Zero && x.Velocity.Length() > 0.01f))
foreach (var ball in Balls.Where(x =>
x.StageInitialVelocity != Vector2.Zero && x.Velocity.Length() > 0.01f))
{
var speed = ball.Velocity.Length();
if (ball.StageInitialVelocity.Length() / 2 > speed)
{
ball.StageInitialVelocity = Vector2.Zero; // avoid infinite loop
ball.StageInitialVelocity = Vector2.Zero; // avoid infinite loop
Records.Add(new ChangeSpeedRecord(CurTime, ball.GetSnapshot()));
}
}

View File

@@ -3,5 +3,7 @@
namespace EggLink.DanhengServer.GameServer.Game.MultiPlayer.MarbleGame.Physics;
public record CollisionRecord(float Time, BallSnapshot BallA, BallSnapshot? BallB, Vector2 CollisionPos);
public record StopRecord(float Time, BallSnapshot Ball);
public record ChangeSpeedRecord(float Time, BallSnapshot Ball);

View File

@@ -8,7 +8,8 @@ public abstract class BaseMarbleGameSyncData
public abstract MarbleGameSyncData ToProto();
}
public class MarbleGameScoreSyncData(int playerAScore, int playerBScore, MarbleFrameType frameType) : BaseMarbleGameSyncData
public class MarbleGameScoreSyncData(int playerAScore, int playerBScore, MarbleFrameType frameType)
: BaseMarbleGameSyncData
{
public override MarbleGameSyncData ToProto()
{
@@ -21,7 +22,11 @@ public class MarbleGameScoreSyncData(int playerAScore, int playerBScore, MarbleF
}
}
public class MarbleGameHpChangeSyncData(MarbleGameSealInstance inst, MarbleFrameType frameType, int changeValue, float time = 0f) : MarbleGameSealSyncData(inst, frameType)
public class MarbleGameHpChangeSyncData(
MarbleGameSealInstance inst,
MarbleFrameType frameType,
int changeValue,
float time = 0f) : MarbleGameSealSyncData(inst, frameType)
{
public override MarbleGameSyncData ToProto()
{
@@ -38,7 +43,11 @@ public class MarbleGameHpChangeSyncData(MarbleGameSealInstance inst, MarbleFrame
}
}
public class MarbleGameEffectSyncData(MarbleGameSealInstance inst, MarbleFrameType frameType, int skillId, float time = 0f) : MarbleGameSealSyncData(inst, frameType)
public class MarbleGameEffectSyncData(
MarbleGameSealInstance inst,
MarbleFrameType frameType,
int skillId,
float time = 0f) : MarbleGameSealSyncData(inst, frameType)
{
public override MarbleGameSyncData ToProto()
{
@@ -75,7 +84,8 @@ public class MarbleGameSealSyncData(MarbleGameSealInstance inst, MarbleFrameType
}
}
public class MarbleGameSealActionSyncData(MarbleGameSealInstance inst, MarbleFrameType frameType, float time = 0) : MarbleGameSealSyncData(inst, frameType)
public class MarbleGameSealActionSyncData(MarbleGameSealInstance inst, MarbleFrameType frameType, float time = 0)
: MarbleGameSealSyncData(inst, frameType)
{
public override MarbleGameSyncData ToProto()
{
@@ -95,8 +105,8 @@ public class MarbleGameSealActionSyncData(MarbleGameSealInstance inst, MarbleFra
}
}
public class MarbleGameSealLaunchStopSyncData(MarbleGameSealInstance inst, MarbleFrameType frameType, float time = 0) : MarbleGameSealSyncData(inst, frameType)
public class MarbleGameSealLaunchStopSyncData(MarbleGameSealInstance inst, MarbleFrameType frameType, float time = 0)
: MarbleGameSealSyncData(inst, frameType)
{
public override MarbleGameSyncData ToProto()
{
@@ -115,7 +125,13 @@ public class MarbleGameSealLaunchStopSyncData(MarbleGameSealInstance inst, Marbl
}
}
public class MarbleGameSealCollisionSyncData(MarbleGameSealInstance inst, int collideOwnerId, int collideTargetId, float time, Vector2 collidePos, MarbleSealVector? targetVelocity) : MarbleGameSealSyncData(inst, MarbleFrameType.Collide)
public class MarbleGameSealCollisionSyncData(
MarbleGameSealInstance inst,
int collideOwnerId,
int collideTargetId,
float time,
Vector2 collidePos,
MarbleSealVector? targetVelocity) : MarbleGameSealSyncData(inst, MarbleFrameType.Collide)
{
public override MarbleGameSyncData ToProto()
{
@@ -128,7 +144,8 @@ public class MarbleGameSealCollisionSyncData(MarbleGameSealInstance inst, int co
SealPosition = Instance.Position,
SealRotation = Instance.Rotation,
FrameType = MarbleFrameType.Collide,
CollideType = collideTargetId == 1 ? MarbleFactionType.Field : collideTargetId / 100 == collideOwnerId / 100 ? MarbleFactionType.Ally : MarbleFactionType.Enemy,
CollideType = collideTargetId == 1 ? MarbleFactionType.Field :
collideTargetId / 100 == collideOwnerId / 100 ? MarbleFactionType.Ally : MarbleFactionType.Enemy,
CollideOwnerId = (uint)collideOwnerId,
CollideTargetId = (uint)collideTargetId,
CollisionPosition = new MarbleSealVector

View File

@@ -3,7 +3,8 @@ using EggLink.DanhengServer.Proto;
namespace EggLink.DanhengServer.GameServer.Game.MultiPlayer.MarbleGame.Sync;
public class MarbleGameFinishSyncData(MarbleGamePlayerInstance player, bool isWin) : MarbleGameBaseSyncData(MarbleNetWorkMsgEnum.GameFinish)
public class MarbleGameFinishSyncData(MarbleGamePlayerInstance player, bool isWin)
: MarbleGameBaseSyncData(MarbleNetWorkMsgEnum.GameFinish)
{
public override FightGameInfo ToProto()
{

View File

@@ -27,12 +27,8 @@ public class MultiPlayerGameServerManager
public BaseMultiPlayerGameRoomInstance? GetPlayerJoinedRoom(int uid)
{
foreach (var room in Rooms.Values)
{
if (room.Players.Any(x => !x.LeaveGame && x.LobbyPlayer.Player.Uid == uid))
{
return room;
}
}
return null;
}

View File

@@ -1,5 +1,4 @@
using EggLink.DanhengServer.Data;
using EggLink.DanhengServer.Data.Excel;
using EggLink.DanhengServer.Database;
using EggLink.DanhengServer.Database.Avatar;
using EggLink.DanhengServer.Database.Player;
@@ -270,9 +269,7 @@ public class PlayerInstance(PlayerData data)
if (info.SpecialAvatarId > 0 &&
GameData.SpecialAvatarData.TryGetValue(info.SpecialAvatarId * 10 + 0, out var e))
{
AvatarManager!.GetTrialAvatar(e.SpecialAvatarID)?.CheckLevel(Data.WorldLevel);
}
}
await LoadScene(Data.PlaneId, Data.FloorId, Data.EntryId, Data.Pos!, Data.Rot!, false);
@@ -358,7 +355,8 @@ public class PlayerInstance(PlayerData data)
// check if avatar is in scene
if (SceneInstance != null)
{
var avatarScene = SceneInstance.AvatarInfo.Values.FirstOrDefault(x => x.AvatarInfo.BaseAvatarId == baseAvatarId);
var avatarScene =
SceneInstance.AvatarInfo.Values.FirstOrDefault(x => x.AvatarInfo.BaseAvatarId == baseAvatarId);
if (avatarScene == null) return;
await avatarScene.ClearAllBuff();

View File

@@ -191,7 +191,8 @@ public class RogueTournInstance : BaseRogueInstance
{
RogueTitanBlessInstance.BlessTypeExcel.Add(bless);
TitanType =
GameData.RogueTournTitanTypeData.GetValueOrDefault(bless.TitanType)?.RogueTitanType ?? RogueTitanTypeEnum.None;
GameData.RogueTournTitanTypeData.GetValueOrDefault(bless.TitanType)?.RogueTitanType ??
RogueTitanTypeEnum.None;
}
else
{

View File

@@ -27,11 +27,13 @@ public class RogueTitanBlessSelectMenu(RogueTournInstance rogue)
// random 2 types
var night = GameData.RogueTournTitanBlessData.Values.Where(x =>
GameData.RogueTournTitanTypeData.GetValueOrDefault(x.TitanType)?.RogueTitanCategory ==
RogueTitanCategoryEnum.Night && x.TitanBlessLevel == 1 && !rogue.RogueTitanBlessInstance.BlessTypeExcel.Contains(x)).ToList().RandomElement();
RogueTitanCategoryEnum.Night && x.TitanBlessLevel == 1 &&
!rogue.RogueTitanBlessInstance.BlessTypeExcel.Contains(x)).ToList().RandomElement();
var day = GameData.RogueTournTitanBlessData.Values.Where(x =>
GameData.RogueTournTitanTypeData.GetValueOrDefault(x.TitanType)?.RogueTitanCategory ==
RogueTitanCategoryEnum.Day && x.TitanBlessLevel == 1 && !rogue.RogueTitanBlessInstance.BlessTypeExcel.Contains(x)).ToList().RandomElement();
RogueTitanCategoryEnum.Day && x.TitanBlessLevel == 1 &&
!rogue.RogueTitanBlessInstance.BlessTypeExcel.Contains(x)).ToList().RandomElement();
list.Add(day);
list.Add(night);

View File

@@ -26,7 +26,6 @@ public class EntityMonster(
public SceneInstance Scene { get; set; } = scene;
public NPCMonsterDataExcel MonsterData { get; set; } = excel;
public MonsterInfo Info { get; set; } = info;
public List<SceneBuff> BuffList { get; set; } = [];
public SceneBuff? TempBuff { get; set; }
public bool IsAlive { get; private set; } = true;
@@ -35,6 +34,7 @@ public class EntityMonster(
public int RogueMonsterId { get; set; } = 0;
public int CustomLevel { get; set; } = 0;
public List<SceneBuff> BuffList { get; set; } = [];
public int EntityId { get; set; } = 0;
public int GroupID { get; set; } = GroupID;

View File

@@ -16,10 +16,10 @@ public class EntitySummonUnit : IGameEntity
public MotionInfo Motion { get; set; } = new();
public List<UnitCustomTriggerConfigInfo> TriggerList { get; set; } = [];
public HashSet<int> CaughtEntityIds { get; set; } = [];
public int EntityId { get; set; }
public int GroupID { get; set; } = 0;
public List<SceneBuff> BuffList { get; set; } = [];
public HashSet<int> CaughtEntityIds { get; set; } = [];
public async ValueTask AddBuff(SceneBuff buff)
{

View File

@@ -252,7 +252,7 @@ public class SceneEntityLoader(SceneInstance scene)
if (info.IsClientOnly || info.IsDelete || !info.LoadOnInitial) return null;
GameData.MazePropData.TryGetValue(info.PropID, out var excel);
if (excel == null) return null;
if (excel == null) return null;
var prop = new EntityProp(Scene, excel, group, info);
@@ -295,11 +295,8 @@ public class SceneEntityLoader(SceneInstance scene)
if (prop.PropInfo.MappingInfoID != 2220) return prop;
await prop.SetState(PropStateEnum.Open);
}
if (prop.PropInfo.PropID == 104006)
{
await prop.SetState(PropStateEnum.Open);
}
if (prop.PropInfo.PropID == 104006) await prop.SetState(PropStateEnum.Open);
await Scene.AddEntity(prop, sendPacket);

View File

@@ -2,7 +2,6 @@
using EggLink.DanhengServer.Data.Config.Scene;
using EggLink.DanhengServer.Data.Excel;
using EggLink.DanhengServer.Database.Avatar;
using EggLink.DanhengServer.Database.Player;
using EggLink.DanhengServer.Enums.Avatar;
using EggLink.DanhengServer.Enums.Scene;
using EggLink.DanhengServer.GameServer.Game.Activity.Loaders;
@@ -69,18 +68,12 @@ public class SceneInstance
playerGroupInfo.EntityList.Add(avatar.Value.ToProto());
if (playerGroupInfo.EntityList.Count > 0)
{
if (LeaderEntityId == 0)
{
LeaderEntityId = AvatarInfo.Values.First().EntityId;
}
if (LeaderEntityId == 0) LeaderEntityId = AvatarInfo.Values.First().EntityId;
sceneInfo.LeaderEntityId = (uint)LeaderEntityId;
}
foreach (var summonUnit in SummonUnit.Values)
{
playerGroupInfo.EntityList.Add(summonUnit.ToProto());
}
foreach (var summonUnit in SummonUnit.Values) playerGroupInfo.EntityList.Add(summonUnit.ToProto());
sceneInfo.EntityGroupList.Add(playerGroupInfo);
@@ -247,21 +240,21 @@ public class SceneInstance
var removeAvatar = new List<IGameEntity>();
var avatars = Player.LineupManager?.GetAvatarsFromCurTeam() ?? [];
foreach (var sceneInfo in oldAvatarInfo)
{
if (avatars.FindIndex(x => x.AvatarInfo.BaseAvatarId == sceneInfo.AvatarInfo.BaseAvatarId) != -1) // avatar still in team
if (avatars.FindIndex(x => x.AvatarInfo.BaseAvatarId == sceneInfo.AvatarInfo.BaseAvatarId) !=
-1) // avatar still in team
{
AvatarInfo.Add(sceneInfo.EntityId, sceneInfo);
}
else // avatar leave
else // avatar leave
{
removeAvatar.Add(sceneInfo);
sendPacket = true;
}
}
foreach (var avatar in avatars) // check team avatar
foreach (var avatar in avatars) // check team avatar
{
if (AvatarInfo.Any(x => x.Value.AvatarInfo.BaseAvatarId == avatar.AvatarInfo.BaseAvatarId)) continue; // avatar already in team
if (AvatarInfo.Any(x => x.Value.AvatarInfo.BaseAvatarId == avatar.AvatarInfo.BaseAvatarId))
continue; // avatar already in team
var avatarInfo = new AvatarSceneInfo(avatar.AvatarInfo, avatar.AvatarType, Player)
{
// assign entity id
@@ -277,10 +270,7 @@ public class SceneInstance
{
Entities.Remove(avatar.EntityId);
if (avatar is AvatarSceneInfo info)
{
await info.OnDestroyInstance();
}
if (avatar is AvatarSceneInfo info) await info.OnDestroyInstance();
}
foreach (var avatar in addAvatar) Entities.Add(avatar.EntityId, avatar);
@@ -317,10 +307,8 @@ public class SceneInstance
// get modifier info
if (!GameData.AdventureModifierData.TryGetValue(modifier, out var config)) continue;
if (config.OnAfterLocalPlayerUseSkill.Count > 0)
{
await Player.TaskManager!.AbilityLevelTask.TriggerTasks(avatarAbility,
config.OnAfterLocalPlayerUseSkill, entity, [], req, modifier);
}
}
}
}
@@ -340,23 +328,18 @@ public class SceneInstance
// get modifier info
if (!GameData.AdventureModifierData.TryGetValue(modifier, out var config)) continue;
if (config.OnUnstage.Count > 0)
{
await Player.TaskManager!.AbilityLevelTask.TriggerTasks(avatarAbility,
config.OnUnstage, entity, [], new SceneCastSkillCsReq
{
CastEntityId = (uint)entity.EntityId,
CastEntityId = (uint)entity.EntityId
}, modifier);
}
}
}
}
public async ValueTask OnDestroy()
{
foreach (var value in AvatarInfo.Values)
{
await value.OnDestroyInstance();
}
foreach (var value in AvatarInfo.Values) await value.OnDestroyInstance();
}
#endregion
@@ -382,7 +365,8 @@ public class SceneInstance
if (entity.EntityId != 0) return Retcode.RetServerInternalError;
entity.EntityId = ++LastEntityId;
// get summon unit excel
if (!GameData.SummonUnitDataData.TryGetValue(entity.SummonUnitId, out var summonUnitExcel)) return Retcode.RetMonsterConfigNotExist;
if (!GameData.SummonUnitDataData.TryGetValue(entity.SummonUnitId, out var summonUnitExcel))
return Retcode.RetMonsterConfigNotExist;
IGameEntity? removeEntity = null;
// get old summon unit
@@ -581,6 +565,10 @@ public class SceneInstance
public class AvatarSceneInfo : IGameEntity, IGameModifier
{
public BaseAvatarInfo AvatarInfo;
public AvatarType AvatarType;
public PlayerInstance Player;
public AvatarSceneInfo(BaseAvatarInfo avatarInfo, AvatarType avatarType, PlayerInstance player)
{
AvatarInfo = avatarInfo;
@@ -605,10 +593,6 @@ public class AvatarSceneInfo : IGameEntity, IGameModifier
}
}
public BaseAvatarInfo AvatarInfo;
public AvatarType AvatarType;
public PlayerInstance Player;
public List<SceneBuff> BuffList { get; set; } = [];
public int EntityId { get; set; }
@@ -745,17 +729,10 @@ public class AvatarSceneInfo : IGameEntity, IGameModifier
public async ValueTask OnDestroyInstance()
{
foreach (var modifier in Modifiers.ToArray())
{
await RemoveModifier(modifier);
}
foreach (var modifier in Modifiers.ToArray()) await RemoveModifier(modifier);
foreach (var monsterInfo in Player.SceneInstance!.Entities.OfType<EntityMonster>().ToArray())
{
foreach (var buff in monsterInfo.BuffList.Where(x => x.OwnerAvatarId == AvatarInfo.BaseAvatarId).ToArray())
{
await monsterInfo.RemoveBuff(buff.BuffId);
}
}
foreach (var buff in monsterInfo.BuffList.Where(x => x.OwnerAvatarId == AvatarInfo.BaseAvatarId).ToArray())
await monsterInfo.RemoveBuff(buff.BuffId);
}
}

View File

@@ -1,6 +1,7 @@
using EggLink.DanhengServer.Data;
using EggLink.DanhengServer.Data.Config;
using EggLink.DanhengServer.Data.Config.Task;
using EggLink.DanhengServer.Enums.Avatar;
using EggLink.DanhengServer.Enums.RogueMagic;
using EggLink.DanhengServer.Enums.Scene;
using EggLink.DanhengServer.GameServer.Game.Battle;
@@ -12,8 +13,6 @@ using EggLink.DanhengServer.GameServer.Game.Scene.Entity;
using EggLink.DanhengServer.GameServer.Server.Packet.Send.Scene;
using EggLink.DanhengServer.Proto;
using EggLink.DanhengServer.Util;
using System.Threading;
using EggLink.DanhengServer.Enums.Avatar;
namespace EggLink.DanhengServer.GameServer.Game.Task.AvatarTask;
@@ -27,14 +26,12 @@ public class AbilityLevelTask(PlayerInstance player)
List<IGameEntity> targetEntities)
{
if (selector is TargetAlias target)
{
return target.Alias switch
{
"Caster" or "ModifierOwnerEntity" => [casterEntity],
"ParamEntity" or "AllEnemy" or "AbilityTargetEntity" => targetEntities,
_ => targetEntities,
_ => targetEntities
};
}
return [];
}
@@ -44,14 +41,16 @@ public class AbilityLevelTask(PlayerInstance player)
#region Manage
public async ValueTask<AbilityLevelResult> TriggerTasks(AdventureAbilityConfigListInfo abilities,
List<TaskConfigInfo> tasks, IGameEntity casterEntity, List<IGameEntity> targetEntities, SceneCastSkillCsReq req, string? modifierName = null)
List<TaskConfigInfo> tasks, IGameEntity casterEntity, List<IGameEntity> targetEntities, SceneCastSkillCsReq req,
string? modifierName = null)
{
BattleInstance? instance = null;
List<HitMonsterInstance> battleInfos = [];
foreach (var task in tasks)
try
{
var res = await TriggerTask(new AbilityLevelParam(abilities, task, casterEntity, targetEntities, req, modifierName));
var res = await TriggerTask(new AbilityLevelParam(abilities, task, casterEntity, targetEntities, req,
modifierName));
if (res.BattleInfos != null) battleInfos.AddRange(res.BattleInfos);
if (res.Instance != null) instance = res.Instance;
@@ -104,10 +103,7 @@ public class AbilityLevelTask(PlayerInstance player)
if (method != null)
{
var resp = method.Invoke(this, [param with { Act = predicateTaskList.Predicate }]);
if (resp is not bool res)
{
return new AbilityLevelResult(instance, battleInfos);
}
if (resp is not bool res) return new AbilityLevelResult(instance, battleInfos);
res = predicateTaskList.Predicate.Inverse ? !res : res;
if (res)
@@ -206,9 +202,7 @@ public class AbilityLevelTask(PlayerInstance player)
Dictionary<string, float> dynamic = [];
foreach (var dynamicValue in addMazeBuff.DynamicValues)
{
dynamic.Add(dynamicValue.Key, dynamicValue.Value.GetValue());
}
if (resp is not List<IGameEntity> target) return new AbilityLevelResult(instance, battleInfos);
@@ -312,7 +306,8 @@ public class AbilityLevelTask(PlayerInstance player)
public async ValueTask<AbilityLevelResult> DestroySummonUnit(AbilityLevelParam param)
{
if (param.Act is DestroySummonUnit destroySummonUnit) await Player.SceneInstance!.RemoveSummonUnitById(destroySummonUnit.SummonUnit.SummonUnitID); // TODO
if (param.Act is DestroySummonUnit destroySummonUnit)
await Player.SceneInstance!.RemoveSummonUnitById(destroySummonUnit.SummonUnit.SummonUnitID); // TODO
return new AbilityLevelResult();
}
@@ -346,9 +341,8 @@ public class AbilityLevelTask(PlayerInstance player)
public async ValueTask<AbilityLevelResult> RemoveSelfModifier(AbilityLevelParam param)
{
if (param.ModifierName != null)
{
if (param.CasterEntity is IGameModifier mod) await mod.RemoveModifier(param.ModifierName);
}
if (param.CasterEntity is IGameModifier mod)
await mod.RemoveModifier(param.ModifierName);
return new AbilityLevelResult();
}
@@ -370,7 +364,6 @@ public class AbilityLevelTask(PlayerInstance player)
public async ValueTask<AbilityLevelResult> AdvModifyMaxMazeMP(AbilityLevelParam param)
{
if (param.Act is AdvModifyMaxMazeMP advModifyMaxMazeMp)
{
switch (advModifyMaxMazeMp.ModifyFunction)
{
case PropertyModifyFunctionEnum.Add:
@@ -380,7 +373,6 @@ public class AbilityLevelTask(PlayerInstance player)
Player.LineupManager!.LineupData.ExtraMpCount = advModifyMaxMazeMp.ModifyValue.GetValue() - 5;
break;
}
}
return new AbilityLevelResult();
}
@@ -479,9 +471,7 @@ public class AbilityLevelTask(PlayerInstance player)
public bool AdventureByPlayerCurrentSkillType(AbilityLevelParam param)
{
if (param.Act is AdventureByPlayerCurrentSkillType byPlayerCurrentSkillType)
{
return param.Request.SkillIndex == (uint)byPlayerCurrentSkillType.SkillType;
}
return false;
}
@@ -489,9 +479,7 @@ public class AbilityLevelTask(PlayerInstance player)
public bool ByCompareCarryMazebuff(AbilityLevelParam param)
{
if (param.Act is ByCompareCarryMazebuff byCompareCarryMazebuff)
{
return param.CasterEntity.BuffList.Any(x => x.BuffId == byCompareCarryMazebuff.BuffID);
}
return false;
}
@@ -529,4 +517,5 @@ public record AbilityLevelParam(
TaskConfigInfo Act,
IGameEntity CasterEntity,
List<IGameEntity> TargetEntities,
SceneCastSkillCsReq Request, string? ModifierName);
SceneCastSkillCsReq Request,
string? ModifierName);

View File

@@ -1,5 +1,4 @@
using EggLink.DanhengServer.GameServer.Server.Packet.Send.Avatar;
using EggLink.DanhengServer.GameServer.Server.Packet.Send.PlayerSync;
using EggLink.DanhengServer.Kcp;
using EggLink.DanhengServer.Proto;

View File

@@ -30,7 +30,8 @@ public class HandlerLeaveChallengeCsReq : Handler
// Leave scene
await player.LineupManager.SetCurLineup(0);
// Heal avatars (temproary solution)
foreach (var avatar in player.LineupManager.GetCurLineup()!.AvatarData!.FormalAvatars) avatar.CurrentHp = 10000;
foreach (var avatar in player.LineupManager.GetCurLineup()!.AvatarData!.FormalAvatars)
avatar.CurrentHp = 10000;
var leaveEntryId = GameConstants.CHALLENGE_ENTRANCE;
if (player.SceneInstance.LeaveEntryId != 0) leaveEntryId = player.SceneInstance.LeaveEntryId;

View File

@@ -19,6 +19,7 @@ public class HandlerSendMsgCsReq : Handler
await connection.Player!.FriendManager!.SendMessage(connection.Player!.Uid, (int)req.TargetList[0], null,
(int)req.ExtraId);
else if (req.MessageType == MsgType.Invite)
await connection.Player!.FriendManager!.SendInviteMessage(connection.Player!.Uid, (int)req.TargetList[0], req.InviteInfo);
await connection.Player!.FriendManager!.SendInviteMessage(connection.Player!.Uid, (int)req.TargetList[0],
req.InviteInfo);
}
}

View File

@@ -1,13 +1,8 @@
using EggLink.DanhengServer.Database.Scene;
using EggLink.DanhengServer.Enums.Mission;
using EggLink.DanhengServer.GameServer.Game.Mission;
using EggLink.DanhengServer.GameServer.Game.Scene;
using EggLink.DanhengServer.GameServer.Game.Task;
using EggLink.DanhengServer.Enums.Mission;
using EggLink.DanhengServer.GameServer.Server.Packet.Send.EraFlipper;
using EggLink.DanhengServer.GameServer.Server.Packet.Send.Scene;
using EggLink.DanhengServer.Kcp;
using EggLink.DanhengServer.Proto;
using Microsoft.EntityFrameworkCore.Metadata.Internal;
namespace EggLink.DanhengServer.GameServer.Server.Packet.Recv.EraFlipper;
@@ -20,7 +15,8 @@ public class HandlerChangeEraFlipperDataCsReq : Handler
var floorId = connection.Player!.SceneInstance!.FloorId;
if (connection.Player.SceneInstance.FloorInfo?.FloorSavedValue.Find(x => x.Name == "FSV_FlashBackCount") != null)
if (connection.Player.SceneInstance.FloorInfo?.FloorSavedValue.Find(x => x.Name == "FSV_FlashBackCount") !=
null)
{
// should save
var plane = connection.Player.SceneInstance.PlaneId;
@@ -33,8 +29,10 @@ public class HandlerChangeEraFlipperDataCsReq : Handler
}
value["FSV_FlashBackCount"] = 0;
value["FSV_FlashBackCount"] = value.GetValueOrDefault("FSV_FlashBackCount", 0) + 1; // ParamString[2] is the key
await connection.SendPacket(new PacketUpdateFloorSavedValueNotify("FSV_FlashBackCount", value["FSV_FlashBackCount"], connection.Player));
value["FSV_FlashBackCount"] =
value.GetValueOrDefault("FSV_FlashBackCount", 0) + 1; // ParamString[2] is the key
await connection.SendPacket(new PacketUpdateFloorSavedValueNotify("FSV_FlashBackCount",
value["FSV_FlashBackCount"], connection.Player));
connection.Player.TaskManager?.SceneTaskTrigger.TriggerFloor(plane, floor);
connection.Player.MissionManager?.HandleFinishType(MissionFinishTypeEnum.FloorSavedValue);

View File

@@ -1,11 +1,9 @@
using EggLink.DanhengServer.GameServer.Game.MultiPlayer;
using EggLink.DanhengServer.GameServer.Game.MultiPlayer.MarbleGame;
using EggLink.DanhengServer.GameServer.Server.Packet.Send.Fight;
using EggLink.DanhengServer.Kcp;
using EggLink.DanhengServer.Proto;
using EggLink.DanhengServer.Util.Security;
using EggLink.DanhengServer.Util;
using System.Security.Cryptography;
using EggLink.DanhengServer.GameServer.Game.MultiPlayer.MarbleGame;
using EggLink.DanhengServer.Util.Security;
namespace EggLink.DanhengServer.GameServer.Server.Packet.Recv.Fight;
@@ -54,9 +52,7 @@ public class HandlerFightEnterCsReq : Handler
await connection.SendPacket(new PacketFightEnterScRsp(connection.ClientSecretKeySeed));
if (ConfigManager.Config.GameServer.UsePacketEncryption)
{
connection.XorKey = Crypto.GenerateXorKey(connection.ClientSecretKeySeed);
}
await marbleGame.EnterGame(player.LobbyPlayer.Player.Uid);
}

View File

@@ -11,10 +11,7 @@ public class HandlerFightHeartBeatCsReq : Handler
{
var req = FightHeartBeatCsReq.Parser.ParseFrom(data);
if (connection.MarbleRoom != null)
{
await connection.MarbleRoom.OnPlayerHeartBeat();
}
if (connection.MarbleRoom != null) await connection.MarbleRoom.OnPlayerHeartBeat();
await connection.SendPacket(new PacketFightHeartBeatScRsp(req.ClientTimeMs));
}

View File

@@ -1,5 +1,4 @@
using EggLink.DanhengServer.GameServer.Game.Lobby;
using EggLink.DanhengServer.GameServer.Server.Packet.Send.Lobby;
using EggLink.DanhengServer.GameServer.Server.Packet.Send.Lobby;
using EggLink.DanhengServer.Kcp;
using EggLink.DanhengServer.Proto;

View File

@@ -32,7 +32,8 @@ public class HandlerLobbyJoinCsReq : Handler
return;
}
await room.AddPlayer(connection.Player!, req.LobbyGameInfo.LobbyMarbleInfo.LobbySealList.Select(x => (int)x).ToList(),
await room.AddPlayer(connection.Player!,
req.LobbyGameInfo.LobbyMarbleInfo.LobbySealList.Select(x => (int)x).ToList(),
LobbyCharacterType.LobbyCharacterMember);
await connection.SendPacket(new PacketLobbyJoinScRsp(room));

View File

@@ -7,7 +7,7 @@ namespace EggLink.DanhengServer.GameServer.Server.Packet.Recv.Match;
public class HandlerGetCrossInfoCsReq : Handler
{
public override async Task OnHandle(Connection connection, byte[] header, byte[] data)
{
{
await connection.SendPacket(new PacketGetCrossInfoScRsp());
}
}

View File

@@ -8,10 +8,7 @@ public class HandlerPlayerLogoutCsReq : Handler
public override async Task OnHandle(Connection connection, byte[] header, byte[] data)
{
var room = ServerUtils.LobbyServerManager.GetPlayerJoinedRoom(connection.Player!.Uid);
if (room != null)
{
await room.RemovePlayer(connection.Player.Uid);
}
if (room != null) await room.RemovePlayer(connection.Player.Uid);
await connection.SendPacket(CmdIds.PlayerLogoutScRsp);
connection.Stop();

View File

@@ -12,7 +12,8 @@ public class HandlerRefreshTriggerByClientCsReq : Handler
var req = RefreshTriggerByClientCsReq.Parser.ParseFrom(data);
var player = connection.Player!;
var ret = await player.SceneInstance!.TriggerSummonUnit((int)req.TriggerEntityId, req.TriggerName, req.TriggerTargetIdList.ToList());
var ret = await player.SceneInstance!.TriggerSummonUnit((int)req.TriggerEntityId, req.TriggerName,
req.TriggerTargetIdList.ToList());
await connection.SendPacket(new PacketRefreshTriggerByClientScRsp(ret, req.TriggerName, req.TriggerEntityId));
}

View File

@@ -17,10 +17,7 @@ public class PacketGetAvatarDataScRsp : BasePacket
player.PlayerUnlockData!.Skins.Values.ToList().ForEach(skin =>
proto.SkinList.AddRange(skin.Select(x => (uint)x)));
player.AvatarManager?.AvatarData?.FormalAvatars?.ForEach(avatar =>
{
proto.AvatarList.Add(avatar.ToProto());
});
player.AvatarManager?.AvatarData?.FormalAvatars?.ForEach(avatar => { proto.AvatarList.Add(avatar.ToProto()); });
foreach (var baseAvatarId in GameData.MultiplePathAvatarConfigData.Values.Select(x => x.BaseAvatarID)
.ToHashSet())
@@ -31,10 +28,7 @@ public class PacketGetAvatarDataScRsp : BasePacket
proto.CurAvatarPath.Add((uint)avatar.BaseAvatarId, (MultiPathAvatarType)avatar.AvatarId);
proto.MultiPathAvatarInfoList.AddRange(avatar.ToAvatarPathProto());
if (baseAvatarId == 8001)
{
proto.BasicTypeIdList.Add((uint)avatar.AvatarId);
}
if (baseAvatarId == 8001) proto.BasicTypeIdList.Add((uint)avatar.AvatarId);
}
SetData(proto);

View File

@@ -7,18 +7,16 @@ namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.Chat;
public class PacketGetChatFriendHistoryScRsp : BasePacket
{
public PacketGetChatFriendHistoryScRsp(Dictionary<int, FriendChatHistory> history)
: base(CmdIds.GetChatFriendHistoryScRsp)
: base(CmdIds.GetChatFriendHistoryScRsp)
{
var proto = new GetChatFriendHistoryScRsp();
foreach (var item in history)
{
proto.FriendHistoryInfo.Add(new FriendHistoryInfo
{
ContactSide = (uint)item.Key,
LastSendTime = item.Value.MessageList.Last().SendTime
});
}
SetData(proto);
}

View File

@@ -8,43 +8,52 @@ namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.Fight;
public class PacketFightGeneralScNotify : BasePacket
{
public PacketFightGeneralScNotify(MarbleNetWorkMsgEnum msgType, MarbleNetWorkMsgEnum syncType, MarbleGameRoomInstance game) : base(CmdIds.FightGeneralScNotify)
public PacketFightGeneralScNotify(MarbleNetWorkMsgEnum msgType, MarbleNetWorkMsgEnum syncType,
MarbleGameRoomInstance game) : base(CmdIds.FightGeneralScNotify)
{
var proto = new FightGeneralScNotify
{
NetworkMsgType = (uint)msgType,
FightGeneralInfo = new FightGeneralServerInfo
{
FightGameInfo = { new FightGameInfo
FightGameInfo =
{
MarbleGameInfo = game.ToProto(),
GameMessageType = (uint)syncType
} }
new FightGameInfo
{
MarbleGameInfo = game.ToProto(),
GameMessageType = (uint)syncType
}
}
}
};
SetData(proto);
}
public PacketFightGeneralScNotify(MarbleNetWorkMsgEnum msgType, MarbleNetWorkMsgEnum syncType, FightMarbleSealInfo sealInfo) : base(CmdIds.FightGeneralScNotify)
public PacketFightGeneralScNotify(MarbleNetWorkMsgEnum msgType, MarbleNetWorkMsgEnum syncType,
FightMarbleSealInfo sealInfo) : base(CmdIds.FightGeneralScNotify)
{
var proto = new FightGeneralScNotify
{
NetworkMsgType = (uint)msgType,
FightGeneralInfo = new FightGeneralServerInfo
{
FightGameInfo = { new FightGameInfo
FightGameInfo =
{
FightMarbleSealInfo = sealInfo,
GameMessageType = (uint)syncType
} }
new FightGameInfo
{
FightMarbleSealInfo = sealInfo,
GameMessageType = (uint)syncType
}
}
}
};
SetData(proto);
}
public PacketFightGeneralScNotify(MarbleNetWorkMsgEnum msgType, List<MarbleGameBaseSyncData> sync) : base(CmdIds.FightGeneralScNotify)
public PacketFightGeneralScNotify(MarbleNetWorkMsgEnum msgType, List<MarbleGameBaseSyncData> sync) : base(
CmdIds.FightGeneralScNotify)
{
var proto = new FightGeneralScNotify
{

View File

@@ -7,14 +7,17 @@ namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.Friend;
public class PacketGetFriendRecommendListInfoScRsp : BasePacket
{
public PacketGetFriendRecommendListInfoScRsp(List<PlayerData> friends)
: base(CmdIds.GetFriendRecommendListInfoScRsp)
: base(CmdIds.GetFriendRecommendListInfoScRsp)
{
var proto = new GetFriendRecommendListInfoScRsp
{
PlayerInfoList = { friends.Select(x => new FriendRecommendInfo
PlayerInfoList =
{
PlayerInfo = x.ToSimpleProto(FriendOnlineStatus.Online)
})}
friends.Select(x => new FriendRecommendInfo
{
PlayerInfo = x.ToSimpleProto(FriendOnlineStatus.Online)
})
}
};
SetData(proto);

View File

@@ -6,7 +6,7 @@ namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.Friend;
public class PacketSetFriendRemarkNameScRsp : BasePacket
{
public PacketSetFriendRemarkNameScRsp(uint uid, string remarkName)
: base(CmdIds.SetFriendRemarkNameScRsp)
: base(CmdIds.SetFriendRemarkNameScRsp)
{
var proto = new SetFriendRemarkNameScRsp
{

View File

@@ -6,7 +6,7 @@ namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.Friend;
public class PacketSyncAddBlacklistScNotify : BasePacket
{
public PacketSyncAddBlacklistScNotify(int uid)
: base(CmdIds.SyncAddBlacklistScNotify)
: base(CmdIds.SyncAddBlacklistScNotify)
{
var proto = new SyncAddBlacklistScNotify
{

View File

@@ -6,7 +6,7 @@ namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.Friend;
public class PacketSyncDeleteFriendScNotify : BasePacket
{
public PacketSyncDeleteFriendScNotify(int uid)
: base(CmdIds.SyncDeleteFriendScNotify)
: base(CmdIds.SyncDeleteFriendScNotify)
{
var proto = new SyncDeleteFriendScNotify
{

View File

@@ -6,7 +6,8 @@ namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.Multiplayer;
public class PacketMultiplayerFightGameFinishScNotify : BasePacket
{
public PacketMultiplayerFightGameFinishScNotify(BaseMultiPlayerGameRoomInstance room) : base(CmdIds.MultiplayerFightGameFinishScNotify)
public PacketMultiplayerFightGameFinishScNotify(BaseMultiPlayerGameRoomInstance room) : base(
CmdIds.MultiplayerFightGameFinishScNotify)
{
var proto = new MultiplayerFightGameFinishScNotify
{

View File

@@ -6,7 +6,8 @@ namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.Multiplayer;
public class PacketMultiplayerFightGameStartScNotify : BasePacket
{
public PacketMultiplayerFightGameStartScNotify(BaseMultiPlayerGameRoomInstance room) : base(CmdIds.MultiplayerFightGameStartScNotify)
public PacketMultiplayerFightGameStartScNotify(BaseMultiPlayerGameRoomInstance room) : base(
CmdIds.MultiplayerFightGameStartScNotify)
{
var proto = new MultiplayerFightGameStartScNotify
{

View File

@@ -17,7 +17,8 @@ public class PacketMultiplayerGetFightGateScRsp : BasePacket
SetData(proto);
}
public PacketMultiplayerGetFightGateScRsp(BaseMultiPlayerGameRoomInstance room) : base(CmdIds.MultiplayerGetFightGateScRsp)
public PacketMultiplayerGetFightGateScRsp(BaseMultiPlayerGameRoomInstance room) : base(
CmdIds.MultiplayerGetFightGateScRsp)
{
var proto = new MultiplayerGetFightGateScRsp
{

View File

@@ -230,6 +230,18 @@ public static class HandbookGenerator
}
}
public static string GetNameFromTextMap(long key, Dictionary<long, string> map, Dictionary<long, string> fallback)
{
if (map.TryGetValue(key, out var value)) return value;
if (fallback.TryGetValue(key, out value)) return value;
return $"[{key}]";
}
public static void WriteToFile(string lang, string content)
{
File.WriteAllText($"GM Handbook/GM Handbook {lang}.txt", content);
}
#if DEBUG
public static void GenerateRogueDiceSurfaceDisplay(StringBuilder builder, Dictionary<long, string> map,
Dictionary<long, string> fallback)
@@ -288,16 +300,4 @@ public static class HandbookGenerator
}
}
#endif
public static string GetNameFromTextMap(long key, Dictionary<long, string> map, Dictionary<long, string> fallback)
{
if (map.TryGetValue(key, out var value)) return value;
if (fallback.TryGetValue(key, out value)) return value;
return $"[{key}]";
}
public static void WriteToFile(string lang, string content)
{
File.WriteAllText($"GM Handbook/GM Handbook {lang}.txt", content);
}
}

View File

@@ -422,4 +422,4 @@ public class EntryPoint
DanhengConnection.LogMap.TryAdd(value, name);
}
}
}
}