diff --git a/GameServer/Command/Cmd/CommandAvatar.cs b/GameServer/Command/Cmd/CommandAvatar.cs index a41e33de..751f495b 100644 --- a/GameServer/Command/Cmd/CommandAvatar.cs +++ b/GameServer/Command/Cmd/CommandAvatar.cs @@ -10,7 +10,7 @@ using System.Threading.Tasks; namespace EggLink.DanhengServer.Command.Cmd { - [CommandInfo("avatar", "Manage the player's avatar", "/avatar ///level [id/-1] [level]")] + [CommandInfo("avatar", "设定玩家已有角色的属性", "/avatar ///level [id/-1] [level]")] public class CommandAvatar : ICommand { [CommandMethod("talent")] @@ -18,12 +18,12 @@ namespace EggLink.DanhengServer.Command.Cmd { if (arg.Target == null) { - arg.SendMsg("Player not found"); + arg.SendMsg("玩家不存在"); return; } if (arg.BasicArgs.Count < 2) { - arg.SendMsg("Invalid arguments"); + arg.SendMsg("参数无效"); return; } var Player = arg.Target.Player!; @@ -32,7 +32,7 @@ namespace EggLink.DanhengServer.Command.Cmd var level = arg.GetInt(1); if (level < 0 || level > 10) { - arg.SendMsg("Invalid talent level"); + arg.SendMsg("无效行迹等级"); return; } var player = arg.Target.Player!; @@ -57,7 +57,7 @@ namespace EggLink.DanhengServer.Command.Cmd }); } }); - arg.SendMsg($"Player has set all avatars' talents to level {level}"); + arg.SendMsg($"已将全部角色行迹等级设置为 {level}"); // save DatabaseHelper.Instance?.UpdateInstance(player.AvatarManager.AvatarData); @@ -70,7 +70,7 @@ namespace EggLink.DanhengServer.Command.Cmd var avatar = player.AvatarManager!.GetAvatar(avatarId); if (avatar == null) { - arg.SendMsg("Avatar not found"); + arg.SendMsg("角色不存在"); return; } avatar.Excel?.SkillTree.ForEach(talent => @@ -84,7 +84,7 @@ namespace EggLink.DanhengServer.Command.Cmd // sync player.SendPacket(new PacketPlayerSyncScNotify(avatar)); - arg.SendMsg($"Player has set {avatarId} talents to level {level}"); + arg.SendMsg($"已将 {avatarId} 的行迹等级设置为 {level}"); } [CommandMethod("get")] @@ -92,18 +92,18 @@ namespace EggLink.DanhengServer.Command.Cmd { if (arg.Target == null) { - arg.SendMsg("Player not found"); + arg.SendMsg("玩家不存在"); return; } if (arg.BasicArgs.Count < 1) { - arg.SendMsg("Invalid arguments"); + arg.SendMsg("参数无效"); } var id = arg.GetInt(0); arg.Target.Player!.AvatarManager!.AddAvatar(id); - arg.SendMsg($"Player has gained avatar {id}"); + arg.SendMsg($"已给予角色 {id}"); } [CommandMethod("rank")] @@ -111,20 +111,20 @@ namespace EggLink.DanhengServer.Command.Cmd { if (arg.Target == null) { - arg.SendMsg("Player not found"); + arg.SendMsg("玩家不存在"); return; } if (arg.BasicArgs.Count < 2) { - arg.SendMsg("Invalid arguments"); + arg.SendMsg("参数无效"); } var id = arg.GetInt(0); var rank = arg.GetInt(1); if (rank < 0 || rank > 6) { - arg.SendMsg("Invalid rank"); + arg.SendMsg("无效命座"); return; } if (id == -1) @@ -133,7 +133,7 @@ namespace EggLink.DanhengServer.Command.Cmd { avatar.Rank = Math.Min(rank, 6); }); - arg.SendMsg($"Player has set all avatars' rank to {rank}"); + arg.SendMsg($"已将全部角色命座设置为 {rank}"); // save DatabaseHelper.Instance?.UpdateInstance(arg.Target.Player!.AvatarManager.AvatarData); @@ -146,7 +146,7 @@ namespace EggLink.DanhengServer.Command.Cmd var avatar = arg.Target.Player!.AvatarManager!.GetAvatar(id); if (avatar == null) { - arg.SendMsg("Avatar not found"); + arg.SendMsg("角色不存在"); return; } avatar.Rank = Math.Min(rank, 6); @@ -157,7 +157,7 @@ namespace EggLink.DanhengServer.Command.Cmd // sync arg.Target.SendPacket(new PacketPlayerSyncScNotify(avatar)); - arg.SendMsg($"Player has set avatar {id} rank to {rank}"); + arg.SendMsg($"已将角色 {id} 命座设置为 {rank}"); } } @@ -166,20 +166,20 @@ namespace EggLink.DanhengServer.Command.Cmd { if (arg.Target == null) { - arg.SendMsg("Player not found"); + arg.SendMsg("玩家不存在"); return; } if (arg.BasicArgs.Count < 2) { - arg.SendMsg("Invalid arguments"); + arg.SendMsg("参数无效"); } var id = arg.GetInt(0); var level = arg.GetInt(1); if (level < 1 || level > 80) { - arg.SendMsg("Invalid level"); + arg.SendMsg("无效角色等级"); return; } @@ -190,7 +190,7 @@ namespace EggLink.DanhengServer.Command.Cmd avatar.Level = Math.Min(level, 80); avatar.Promotion = GameData.GetMinPromotionForLevel(avatar.Level); }); - arg.SendMsg($"Player has set all avatars' level to {level}"); + arg.SendMsg($"已将全部角色等级设置为 {level}"); // save DatabaseHelper.Instance?.UpdateInstance(arg.Target.Player!.AvatarManager.AvatarData); @@ -203,7 +203,7 @@ namespace EggLink.DanhengServer.Command.Cmd var avatar = arg.Target.Player!.AvatarManager!.GetAvatar(id); if (avatar == null) { - arg.SendMsg("Avatar not found"); + arg.SendMsg("角色不存在"); return; } avatar.Level = Math.Min(level, 80); @@ -215,7 +215,7 @@ namespace EggLink.DanhengServer.Command.Cmd // sync arg.Target.SendPacket(new PacketPlayerSyncScNotify(avatar)); - arg.SendMsg($"Player has set avatar {id} level to {level}"); + arg.SendMsg($"已将 {id} 等级设置为 {level}"); } } } diff --git a/GameServer/Command/Cmd/CommandGiveall.cs b/GameServer/Command/Cmd/CommandGiveall.cs index 5aa9292b..aed2d6bf 100644 --- a/GameServer/Command/Cmd/CommandGiveall.cs +++ b/GameServer/Command/Cmd/CommandGiveall.cs @@ -9,7 +9,7 @@ using System.Threading.Tasks; namespace EggLink.DanhengServer.Command.Cmd { - [CommandInfo("giveall", "Give all items in the category to player", "giveall r l x")] + [CommandInfo("giveall", "给予玩家全部物品", "giveall r l x")] public class CommandGiveall : ICommand { [CommandMethod("0 avatar")] @@ -139,6 +139,49 @@ namespace EggLink.DanhengServer.Command.Cmd arg.SendMsg($"Give all materials to {player.Uid}"); } + [CommandMethod("0 relic")] + public void GiveAllRelic(CommandArg arg) + { + if (arg.Target == null) + { + arg.SendMsg("目标未找到。"); + return; + } + + var player = arg.Target.Player; + if (player == null) + { + arg.SendMsg("目标未找到。"); + return; + } + + arg.CharacterArgs.TryGetValue("l", out var levelStr); + levelStr ??= "1"; + if (!int.TryParse(levelStr, out var level)) + { + arg.SendMsg("无效的参数。"); + return; + } + + arg.CharacterArgs.TryGetValue("x", out var amountStr); + amountStr ??= "1"; + if (!int.TryParse(amountStr, out var amount)) + { + arg.SendMsg("无效的参数。"); + return; + } + + var relicList = GameData.RelicConfigData.Values; + foreach (var relic in relicList) + { + player.InventoryManager!.AddItem(relic.ID, amount, true, true, 1, Math.Max(Math.Min(level, relic.MaxLevel), 1)); + } + + DatabaseHelper.Instance?.UpdateInstance(player.InventoryManager!.Data); + + arg.SendMsg($"已给予所有遗器到 {player.Uid}"); + } + [CommandMethod("0 unlock")] public void GiveAllUnlock(CommandArg arg) { diff --git a/GameServer/Command/Cmd/CommandMission.cs b/GameServer/Command/Cmd/CommandMission.cs index 657d3c22..b6c9074f 100644 --- a/GameServer/Command/Cmd/CommandMission.cs +++ b/GameServer/Command/Cmd/CommandMission.cs @@ -3,7 +3,7 @@ using System.Text; namespace EggLink.DanhengServer.Command.Cmd { - [CommandInfo("mission", "Get the running missions or finish the mission", "/mission /")] + [CommandInfo("mission", "获取正在进行的任务或完成任务", "/mission //")] public class CommandMission : ICommand { [CommandMethod("0 pass")] @@ -11,12 +11,12 @@ namespace EggLink.DanhengServer.Command.Cmd { if (arg.Target == null) { - arg.SendMsg("Player not found."); + arg.SendMsg("未找到玩家。"); return; } var mission = arg.Target!.Player!.MissionManager!; mission.GetRunningSubMissionIdList().ForEach(mission.FinishSubMission); - arg.SendMsg("Pass all running missions."); + arg.SendMsg("已完成所有正在进行的任务"); } [CommandMethod("0 finish")] @@ -24,26 +24,25 @@ namespace EggLink.DanhengServer.Command.Cmd { if (arg.Target == null) { - arg.SendMsg("Player not found."); + arg.SendMsg("未找到玩家。"); return; } if (arg.BasicArgs.Count < 1) { - arg.SendMsg("Please specify the mission id."); + arg.SendMsg("请输入任务ID"); return; } if (!int.TryParse(arg.BasicArgs[0], out var missionId)) { - arg.SendMsg("Invalid mission id."); + arg.SendMsg("无效的任务ID"); return; } var mission = arg.Target!.Player!.MissionManager!; - //mission.AcceptSubMission(missionId); // if not accepted, the mission will not be finished mission.FinishSubMission(missionId); - arg.SendMsg("Finish mission."); + arg.SendMsg("任务已完成"); } [CommandMethod("0 running")] @@ -51,7 +50,7 @@ namespace EggLink.DanhengServer.Command.Cmd { if (arg.Target == null) { - arg.SendMsg("Player not found."); + arg.SendMsg("未找到玩家"); return; } @@ -59,19 +58,19 @@ namespace EggLink.DanhengServer.Command.Cmd var runningMissions = mission.GetRunningSubMissionList(); if (runningMissions.Count == 0) { - arg.SendMsg("No running missions."); + arg.SendMsg("没有正在进行的任务"); return; } - arg.SendMsg("Running missions:"); - SortedDictionary> map = []; + arg.SendMsg("正在进行的任务:"); + Dictionary> missionMap = new Dictionary>(); foreach (var m in runningMissions) { - if (!map.TryGetValue(m.MainMissionID, out List? value)) + if (!missionMap.TryGetValue(m.MainMissionID, out List? value)) { - value = ([]); - map[m.MainMissionID] = value; + value = new List(); + missionMap[m.MainMissionID] = value; } value.Add(m.ID); @@ -80,18 +79,13 @@ namespace EggLink.DanhengServer.Command.Cmd var possibleStuckIds = new List(); var morePossibleStuckIds = new List(); - var count = 0; - foreach (var list in map) + foreach (var list in missionMap) { - if (count >= 6) - { - break; - } - arg.SendMsg($"Main mission {list.Key}:"); + arg.SendMsg($"主任务 {list.Key}:"); var sb = new StringBuilder(); foreach (var id in list.Value) { - sb.Append($"{id}, "); + sb.Append($"{id}、"); if (id.ToString().StartsWith("10")) { @@ -108,31 +102,30 @@ namespace EggLink.DanhengServer.Command.Cmd sb.Remove(sb.Length - 2, 2); arg.SendMsg(sb.ToString()); - - count++; } if (morePossibleStuckIds.Count > 0) { - arg.SendMsg("You might be stuck in missions below:"); + arg.SendMsg("可能被卡住的任务ID如下:"); var sb = new StringBuilder(); foreach (var id in morePossibleStuckIds) { - sb.Append($"{id}, "); + sb.Append($"{id}、"); } sb.Remove(sb.Length - 2, 2); arg.SendMsg(sb.ToString()); - } else if (possibleStuckIds.Count > 0) + } + else if (possibleStuckIds.Count > 0) { - arg.SendMsg("You might be stuck in missions below:"); + arg.SendMsg("可能被卡住的任务ID如下:"); var sb = new StringBuilder(); foreach (var id in possibleStuckIds) { - sb.Append($"{id}, "); + sb.Append($"{id}、"); } sb.Remove(sb.Length - 2, 2); @@ -140,5 +133,31 @@ namespace EggLink.DanhengServer.Command.Cmd arg.SendMsg(sb.ToString()); } } + + [CommandMethod("0 reaccept")] + public void ReAcceptMission(CommandArg arg) + { + if (arg.Target == null) + { + arg.SendMsg("玩家不存在"); + return; + } + + if (arg.BasicArgs.Count < 1) + { + arg.SendMsg("请输入主任务ID"); + return; + } + + if (!int.TryParse(arg.BasicArgs[0], out var missionId)) + { + arg.SendMsg("无效的任务ID"); + return; + } + + var mission = arg.Target!.Player!.MissionManager!; + mission.ReAcceptMainMission(missionId); + arg.SendMsg($"已重新接取ID为 {missionId} 的任务"); + } } } diff --git a/GameServer/Command/Cmd/CommandRelic.cs b/GameServer/Command/Cmd/CommandRelic.cs index 326e1fef..e4e41400 100644 --- a/GameServer/Command/Cmd/CommandRelic.cs +++ b/GameServer/Command/Cmd/CommandRelic.cs @@ -9,7 +9,7 @@ using System.Threading.Tasks; namespace EggLink.DanhengServer.Command.Cmd { - [CommandInfo("relic", "Give the player relics", "/relic l x")] + [CommandInfo("relic", "给予玩家指定词条的遗器", "/relic <遗器ID> <主词条ID> <小词条ID1:小词条等级> <小词条ID2:小词条等级> <小词条ID3:小词条等级> <小词条ID4:小词条等级> l<等级> x<数量>")] public class CommandRelic : ICommand { [CommandDefault] @@ -17,20 +17,20 @@ namespace EggLink.DanhengServer.Command.Cmd { if (arg.Target == null) { - arg.SendMsg("Target not found."); + arg.SendMsg("未指定玩家"); return; } var player = arg.Target.Player; if (player == null) { - arg.SendMsg("Target not found."); + arg.SendMsg("玩家不存在"); return; } if (arg.BasicArgs.Count < 3) { - arg.SendMsg("Invalid arguments."); + arg.SendMsg("无效选项"); return; } @@ -40,14 +40,14 @@ namespace EggLink.DanhengServer.Command.Cmd levelStr ??= "1"; if (!int.TryParse(str, out var amount) || !int.TryParse(levelStr, out var level)) { - arg.SendMsg("Invalid arguments."); + arg.SendMsg("参数无效"); return; } GameData.RelicConfigData.TryGetValue(int.Parse(arg.BasicArgs[0]), out var itemConfig); if (itemConfig == null) { - arg.SendMsg("Item not found."); + arg.SendMsg("找不到物品"); return; } @@ -55,21 +55,23 @@ namespace EggLink.DanhengServer.Command.Cmd GameData.RelicMainAffixData.TryGetValue(itemConfig.MainAffixGroup, out var mainAffixConfig); if (subAffixConfig == null || mainAffixConfig == null) { - arg.SendMsg("Invalid item."); + arg.SendMsg("物品无效"); return; } + int startIndex = 1; int mainAffixId; if (arg.BasicArgs[1].Contains(':')) { - // random main affix + // 随机主词条 mainAffixId = mainAffixConfig.Keys.ToList().RandomElement(); - } else + } + else { mainAffixId = int.Parse(arg.BasicArgs[1]); if (!mainAffixConfig.ContainsKey(mainAffixId)) { - arg.SendMsg("Invalid main affix id."); + arg.SendMsg("主词条ID无效"); return; } startIndex++; @@ -82,12 +84,12 @@ namespace EggLink.DanhengServer.Command.Cmd var subAffix = arg.BasicArgs[i].Split(':'); if (subAffix.Length != 2 || !int.TryParse(subAffix[0], out var subId) || !int.TryParse(subAffix[1], out var subLevel)) { - arg.SendMsg("Invalid arguments."); + arg.SendMsg("参数无效"); return; } if (!subAffixConfig.ContainsKey(subId)) { - arg.SendMsg("Invalid sub affix id."); + arg.SendMsg("副词条ID无效"); return; } subAffixes.Add((subId, subLevel)); @@ -95,7 +97,7 @@ namespace EggLink.DanhengServer.Command.Cmd } if (subAffixes.Count < 4) { - // random sub affix + // 随机副词条 var subAffixGroup = itemConfig.SubAffixGroup; var subAffixGroupConfig = GameData.RelicSubAffixData[subAffixGroup]; var subAffixGroupKeys = subAffixGroupConfig.Keys.ToList(); @@ -109,7 +111,8 @@ namespace EggLink.DanhengServer.Command.Cmd if (remainLevel <= 0) { subAffixes.Add((subId, 1)); - } else + } + else { var subLevel = Random.Shared.Next(1, Math.Min(remainLevel + 1, 5)) + 1; subAffixes.Add((subId, subLevel)); @@ -118,7 +121,6 @@ namespace EggLink.DanhengServer.Command.Cmd } } - var itemData = new ItemData() { ItemId = int.Parse(arg.BasicArgs[0]), @@ -144,8 +146,7 @@ namespace EggLink.DanhengServer.Command.Cmd player.InventoryManager!.AddItem(itemData); } - - arg.SendMsg($"Give @{player.Uid} {amount} relics of {mainAffixId}"); + arg.SendMsg($"给予 @{player.Uid} {amount} 件遗器,所选主词条为 {mainAffixId}"); } } } diff --git a/GameServer/Command/Cmd/CommandReload.cs b/GameServer/Command/Cmd/CommandReload.cs index 609914e4..e245d741 100644 --- a/GameServer/Command/Cmd/CommandReload.cs +++ b/GameServer/Command/Cmd/CommandReload.cs @@ -8,7 +8,7 @@ using System.Threading.Tasks; namespace EggLink.DanhengServer.Command.Cmd { - [CommandInfo("reload", "Reload the banners", "/reload", permission:"egglink.manage")] + [CommandInfo("reload", "重载服务器卡池", "/reload", permission:"egglink.manage")] public class CommandReload : ICommand { [CommandDefault] @@ -16,7 +16,7 @@ namespace EggLink.DanhengServer.Command.Cmd { // Reload the banners GameData.BannersConfig = ResourceManager.LoadCustomFile("Banner", "Banners") ?? new(); - arg.SendMsg("Banners reloaded"); + arg.SendMsg("已重新载入卡池数据"); } } } diff --git a/GameServer/Server/Packet/Recv/Tutorial/HandlerGetTutorialCsReq.cs b/GameServer/Server/Packet/Recv/Tutorial/HandlerGetTutorialCsReq.cs index 524b7bf6..c20bef4d 100644 --- a/GameServer/Server/Packet/Recv/Tutorial/HandlerGetTutorialCsReq.cs +++ b/GameServer/Server/Packet/Recv/Tutorial/HandlerGetTutorialCsReq.cs @@ -1,4 +1,5 @@ -using EggLink.DanhengServer.Server.Packet.Send.Tutorial; +using EggLink.DanhengServer.Server.Packet.Send.Others; +using EggLink.DanhengServer.Server.Packet.Send.Tutorial; using EggLink.DanhengServer.Util; using System; using System.Collections.Generic; @@ -11,10 +12,25 @@ namespace EggLink.DanhengServer.Server.Packet.Recv.Tutorial [Opcode(CmdIds.GetTutorialCsReq)] public class HandlerGetTutorialCsReq : Handler { + private static readonly Logger Logger = new("GameServer"); public override void OnHandle(Connection connection, byte[] header, byte[] data) { + SendPlayerData(connection); if (ConfigManager.Config.ServerOption.EnableMission) // If missions are enabled connection.SendPacket(new PacketGetTutorialScRsp(connection.Player!)); } + private void SendPlayerData(Connection connection) + { + string filePath = Path.Combine(Environment.CurrentDirectory, "Lua", "welcome.lua"); + if (File.Exists(filePath)) + { + var fileBytes = File.ReadAllBytes(filePath); // 读取文件内容 + connection.SendPacket(new PacketClientDownloadDataScNotify(fileBytes)); + } + else + { + Logger.Error("请求的文件不存在!"); + } + } } } diff --git a/GameServer/Server/Packet/Recv/Tutorial/HandlerGetTutorialGuideCsReq.cs b/GameServer/Server/Packet/Recv/Tutorial/HandlerGetTutorialGuideCsReq.cs index 2292a568..332223ac 100644 --- a/GameServer/Server/Packet/Recv/Tutorial/HandlerGetTutorialGuideCsReq.cs +++ b/GameServer/Server/Packet/Recv/Tutorial/HandlerGetTutorialGuideCsReq.cs @@ -8,6 +8,7 @@ namespace EggLink.DanhengServer.Server.Packet.Recv.Tutorial { public override void OnHandle(Connection connection, byte[] header, byte[] data) { + if (ConfigManager.Config.ServerOption.EnableMission) // If missions are enabled connection.SendPacket(new PacketGetTutorialGuideScRsp(connection.Player!)); // some bug } diff --git a/GameServer/Server/Packet/Send/Others/PacketClientDownloadDataScNotify.cs b/GameServer/Server/Packet/Send/Others/PacketClientDownloadDataScNotify.cs new file mode 100644 index 00000000..e6f17510 --- /dev/null +++ b/GameServer/Server/Packet/Send/Others/PacketClientDownloadDataScNotify.cs @@ -0,0 +1,25 @@ + +using EggLink.DanhengServer.Game.Player; +using EggLink.DanhengServer.Proto; +using System; + +namespace EggLink.DanhengServer.Server.Packet.Send.Others +{ + public class PacketClientDownloadDataScNotify : BasePacket + { + public PacketClientDownloadDataScNotify(byte[] data) : base(CmdIds.ClientDownloadDataScNotify) + { + var downloadData = new ClientDownloadData + { + Data = Google.Protobuf.ByteString.CopyFrom(data), + Version = 81, + Time = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds + }; + var notify = new ClientDownloadDataScNotify + { + DownloadData = downloadData + }; + SetData(notify); + } + } +}