mirror of
https://github.com/EggLinks/DanhengServer-OpenSource.git
synced 2026-01-02 20:26:03 +08:00
style: code format
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 =
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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"));
|
||||
}
|
||||
|
||||
@@ -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}");
|
||||
}
|
||||
}
|
||||
@@ -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 }
|
||||
];
|
||||
}
|
||||
|
||||
@@ -8,5 +8,6 @@ public class AdvModifyMaxMazeMP : TaskConfigInfo
|
||||
{
|
||||
[JsonConverter(typeof(StringEnumConverter))]
|
||||
public PropertyModifyFunctionEnum ModifyFunction { get; set; }
|
||||
|
||||
public DynamicFloat ModifyValue { get; set; }
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
using System.Text.Json.Serialization;
|
||||
using EggLink.DanhengServer.Database.Avatar;
|
||||
|
||||
namespace EggLink.DanhengServer.Data.Excel;
|
||||
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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; }
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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; }
|
||||
|
||||
|
||||
@@ -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; } = [];
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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; } = [];
|
||||
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -4,5 +4,5 @@ public enum GenderTypeEnum
|
||||
{
|
||||
GENDER_NONE = 0,
|
||||
GENDER_MAN = 1,
|
||||
GENDER_WOMAN = 2,
|
||||
GENDER_WOMAN = 2
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 () =>
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -422,4 +422,4 @@ public class EntryPoint
|
||||
DanhengConnection.LogMap.TryAdd(value, name);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user