Enhancement: Better Help Desc (only CHS)

This commit is contained in:
Somebody
2024-07-21 15:10:25 +08:00
parent c7779ad005
commit 683129b5ea
9 changed files with 112 additions and 42 deletions

View File

@@ -8,7 +8,7 @@ using Org.BouncyCastle.Ocsp;
namespace EggLink.DanhengServer.Command.Cmd
{
[CommandInfo("give", "Give item to player", "give <item> l<level> x<amount> r<rank>")]
[CommandInfo("give", "Game.Command.Give.Desc", "Game.Command.Give.Usage")]
public class CommandGive : ICommand
{
[CommandDefault]

View File

@@ -19,9 +19,15 @@ namespace EggLink.DanhengServer.Command.Cmd
{
return;
}
foreach (var command in commands)
{
arg.SendMsg($"/{command.Name} - {I18nManager.Translate(command.Description)}\n{I18nManager.Translate("Game.Command.Help.CommandUsage")} {I18nManager.Translate(command.Usage)}");
var msg = $"/{command.Name} - {I18nManager.Translate(command.Description)}\n\n{I18nManager.Translate(command.Usage)}";
if (command.Permission != "")
{
msg += $"\n\n{I18nManager.Translate("Game.Command.Help.CommandPermission")} {command.Permission}";
}
arg.SendMsg(msg);
}
}
}

View File

@@ -59,7 +59,7 @@ namespace EggLink.DanhengServer.Command.Cmd
int mainAffixId;
if (arg.BasicArgs[1].Contains(':'))
{
// 随机主词条
// random main affix
mainAffixId = mainAffixConfig.Keys.ToList().RandomElement();
}
else
@@ -91,9 +91,10 @@ namespace EggLink.DanhengServer.Command.Cmd
subAffixes.Add((subId, subLevel));
remainLevel -= subLevel - 1;
}
if (subAffixes.Count < 4)
{
// 随机副词条
// random sub affix
var subAffixGroup = itemConfig.SubAffixGroup;
var subAffixGroupConfig = GameData.RelicSubAffixData[subAffixGroup];
var subAffixGroupKeys = subAffixGroupConfig.Keys.ToList();

View File

@@ -89,7 +89,7 @@ namespace EggLink.DanhengServer.Command
}
} else
{
// player
// player
tempTarget = Listener.GetActiveConnection(sender.GetSender());
if (tempTarget == null)
{
@@ -110,6 +110,13 @@ namespace EggLink.DanhengServer.Command
split.RemoveAt(0);
var arg = new CommandArg(split.JoinFormat(" ", ""), sender, tempTarget);
// judge permission
if (arg.Target?.Player?.Uid != sender.GetSender() && !sender.HasPermission("command.others"))
{
sender.SendMsg(I18nManager.Translate("Game.Command.Notice.NoPermission"));
return;
}
// find the proper method with attribute CommandMethod
var isFound = false;
CommandInfo info = CommandInfo[cmd];
@@ -164,7 +171,7 @@ namespace EggLink.DanhengServer.Command
{
if (info != null)
{
sender.SendMsg(I18nManager.Translate("Game.Command.Help.CommandUsage") + I18nManager.Translate(info.Usage));
sender.SendMsg(I18nManager.Translate(info.Usage));
}
else
{

View File

@@ -183,8 +183,8 @@ namespace EggLink.DanhengServer.Internationalization.Message
/// </summary>
public class HeroTextCHS
{
public string Desc { get; } = "切换主角的性别/形态";
public string Usage { get; } = "/hero <gender [1/2 - 1为男性,2为女性]>/<type [8001/8003/8005 - 分别为 毁灭 存护 同谐]>";
public string Desc { get; } = "切换主角的性别/形态\n当切换性别时genderId为1代表男性2代表女性\n当切换形态时8001代表毁灭命途8003代表存护命途8005代表同谐命途。\n注意切换性别时会清空所有可选命途以及行迹为不可逆操作";
public string Usage { get; } = "用法:/hero gender [genderId]\n\n用法/hero type [typeId]";
public string GenderNotSpecified { get; } = "性别不存在!";
public string HeroTypeNotSpecified { get; } = "主角类型不存在!";
public string GenderChanged { get; } = "性别已更改!";
@@ -196,8 +196,9 @@ namespace EggLink.DanhengServer.Internationalization.Message
/// </summary>
public class UnlockAllTextCHS
{
public string Desc { get; } = "解锁所有在类别内的对象";
public string Usage { get; } = "/unlockall <mission - mission为任务>";
public string Desc { get; } = "解锁所有在类别内的对象\n" +
"使用 /unlockall mission 以完成所有任务,使用后会被踢出,重新登录后可能会被教程卡住,请谨慎使用";
public string Usage { get; } = "用法:/unlockall mission";
public string AllMissionsUnlocked { get; } = "所有任务已解锁!";
}
@@ -206,9 +207,9 @@ namespace EggLink.DanhengServer.Internationalization.Message
/// </summary>
public class AvatarTextCHS
{
public string Desc { get; } = "设定玩家已有角色的属性";
public string Usage { get; } = "/avatar <talent [角色ID/-1] [行迹等级] - 设置行迹等级 角色ID为-1意为所有拥有角色>/<get [角色ID] - 获取角色>/<rank [角色ID/-1] [星魂]>/<level [角色ID/-1] [角色等级]>";
public string InvalidLevel { get; } = "无效 {0}等级";
public string Desc { get; } = "设定玩家已有角色的属性\n设置行迹等级时设置X级即设置所有行迹节点至X级若大于此节点允许的最高等级设置为最高等级\n注意-1意为所有已拥有角色";
public string Usage { get; } = "用法:/avatar talent [角色ID/-1] [行迹等级]\n\n用法/avatar get [角色ID]\n\n用法/avatar rank [角色ID/-1] [星魂]\n\n用法/avatar level [角色ID/-1] [角色等级]";
public string InvalidLevel { get; } = "{0}等级无效";
public string AllAvatarsLevelSet { get; } = "已将全部角色 {0}等级设置为 {1}";
public string AvatarLevelSet { get; } = "已将 {0} 角色 {1}等级设置为 {2}";
public string AvatarNotFound { get; } = "角色不存在!";
@@ -221,8 +222,8 @@ namespace EggLink.DanhengServer.Internationalization.Message
/// </summary>
public class GiveTextCHS
{
public string Desc { get; } = "给予玩家物品";
public string Usage { get; } = "/give <物品ID> l<等级> x<数量> r<叠影>";
public string Desc { get; } = "给予玩家物品此处可输入角色ID但无法设置行迹、等级及星魂";
public string Usage { get; } = "用法:/give <物品ID> l<等级> x<数量> r<叠影>";
public string ItemNotFound { get; } = "未找到物品!";
public string GiveItem { get; } = "给予 @{0} {1} 个物品 {2}";
}
@@ -232,8 +233,8 @@ namespace EggLink.DanhengServer.Internationalization.Message
/// </summary>
public class GiveAllTextCHS
{
public string Desc { get; } = "给予玩家全部指定类型的物品";
public string Usage { get; } = "/giveall <avatar - 角色/equipment - 光锥/relic - 遗器/unlock - 气泡等奢侈品> r<叠影> l<等级> x<数量>";
public string Desc { get; } = "给予玩家全部指定类型的物品\navatar意为角色equipment意为光锥relic意为遗器unlock意为气泡、手机壁纸、头像";
public string Usage { get; } = "用法:/giveall avatar r<星魂> l<等级>\n\n用法/giveall equipment r<叠影> l<等级> x<数量>\n\n用法/giveall relic l<等级> x<数量>\n\n用法/giveall unlock";
public string GiveAllItems { get; } = "已给予所有 {0}, 各 {1} 个";
}
@@ -242,8 +243,8 @@ namespace EggLink.DanhengServer.Internationalization.Message
/// </summary>
public class LineupTextCHS
{
public string Desc { get; } = "管理玩家的队伍";
public string Usage { get; } = "/lineup <mp [秘技点数量 - 最高两个]>/<heal - 治愈>";
public string Desc { get; } = "管理玩家的队伍\n秘技点一次性只能获得两个";
public string Usage { get; } = "用法:/lineup mp [秘技点数量]\n\n用法/lineup heal";
public string PlayerGainedMp { get; } = "玩家已获得 {0} 秘技点";
public string HealedAllAvatars { get; } = "成功治愈当前队伍中的所有角色";
}
@@ -254,9 +255,9 @@ namespace EggLink.DanhengServer.Internationalization.Message
public class HelpTextCHS
{
public string Desc { get; } = "显示帮助信息";
public string Usage { get; } = "/help";
public string Usage { get; } = "用法:/help";
public string Commands { get; } = "命令:";
public string CommandUsage { get; } = "用法: ";
public string CommandPermission { get; } = "所需权限: ";
}
/// <summary>
@@ -265,7 +266,7 @@ namespace EggLink.DanhengServer.Internationalization.Message
public class KickTextCHS
{
public string Desc { get; } = "踢出玩家";
public string Usage { get; } = "/kick";
public string Usage { get; } = "用法:/kick";
public string PlayerKicked { get; } = "玩家 {0} 已被踢出!";
}
@@ -274,8 +275,11 @@ namespace EggLink.DanhengServer.Internationalization.Message
/// </summary>
public class MissionTextCHS
{
public string Desc { get; } = "管理玩家的任务";
public string Usage { get; } = "/mission <unlockall - 完成所有任务>/<pass - 完成所有正在进行的任务>/<finish [副任务ID] - 完成指定任务>/<running - 获取正在进行的任务以及可能卡住的任务>/<reaccept [主任务ID] - 重新进行指定主任务>";
public string Desc { get; } = "管理玩家的任务\n" +
"使用 pass 完成当前正在进行的所有任务,此命令易造成严重卡顿,请尽量使用 /mission finish 替代\n" +
"使用 running 获取正在进行的任务以及可能卡住的任务,使用后可能会出现较长任务列表,请注意甄别\n" +
"使用 reaccept 可重新进行指定主任务,请浏览 handbook 来获取主任务ID";
public string Usage { get; } = "用法:/mission pass\n\n用法/mission finish [子任务ID]\n\n用法/mission running\n\n用法/mission reaccept [主任务ID]";
public string AllMissionsFinished { get; } = "所有任务已完成!";
public string AllRunningMissionsFinished { get; } = "共 {0} 个进行中的任务已完成!";
public string MissionFinished { get; } = "任务 {0} 已完成!";
@@ -294,8 +298,8 @@ namespace EggLink.DanhengServer.Internationalization.Message
/// </summary>
public class RelicTextCHS
{
public string Desc { get; } = "管理玩家的遗器";
public string Usage { get; } = "/relic <遗器ID> <主词条ID> <小词条ID1:小词条等级> <小词条ID2:小词条等级> <小词条ID3:小词条等级> <小词条ID4:小词条等级> l<等级> x<数量>";
public string Desc { get; } = "管理玩家的遗器\n主词条可选副词条可选但至少存在其中之一\n等级限制1≤等级≤9999";
public string Usage { get; } = "用法:/relic <遗器ID> <主词条ID> <小词条ID1:小词条等级> <小词条ID2:小词条等级> <小词条ID3:小词条等级> <小词条ID4:小词条等级> l<等级> x<数量>";
public string RelicNotFound { get; } = "遗器不存在!";
public string InvalidMainAffixId { get; } = "主词条ID无效";
public string InvalidSubAffixId { get; } = "副词条ID无效";
@@ -307,8 +311,8 @@ namespace EggLink.DanhengServer.Internationalization.Message
/// </summary>
public class ReloadTextCHS
{
public string Desc { get; } = "重新加载指定的配置";
public string Usage { get; } = "/reload <配置名>(banner - 卡池, activity - 活动)";
public string Desc { get; } = "重新加载指定的配置\n配置名banner - 卡池, activity - 活动";
public string Usage { get; } = "用法:/reload <配置名>";
public string ConfigReloaded { get; } = "配置 {0} 已重新加载!";
}
@@ -317,8 +321,8 @@ namespace EggLink.DanhengServer.Internationalization.Message
/// </summary>
public class RogueTextCHS
{
public string Desc { get; } = "管理玩家模拟宇宙中的数据";
public string Usage { get; } = "/rogue <money [宇宙碎片数量]>/<buff [祝福ID/-1 (-1 - 全部祝福)]>/<miracle [奇物ID]>/<enhance [祝福ID/-1]>/<unstuck - 脱离事件>";
public string Desc { get; } = "管理玩家模拟宇宙中的数据\n-1意为所有祝福已拥有祝福\n使用 buff 来获取祝福\n使用 enhance 来强化祝福";
public string Usage { get; } = "用法:/rogue money [宇宙碎片数量]\n\n用法/rogue buff [祝福ID/-1]\n\n用法/rogue miracle [奇物ID]\n\n用法/rogue enhance [祝福ID/-1]\n\n用法/rogue unstuck - 脱离事件";
public string PlayerGainedMoney { get; } = "玩家已获得 {0} 宇宙碎片";
public string PlayerGainedAllItems { get; } = "玩家已获得所有{0}";
public string PlayerGainedItem { get; } = "玩家已获得{0} {1}";
@@ -333,8 +337,14 @@ namespace EggLink.DanhengServer.Internationalization.Message
/// </summary>
public class SceneTextCHS
{
public string Desc { get; } = "管理玩家场景";
public string Usage { get; } = "/scene <prop [组ID] [道具ID] [状态] - 设置道具状态>/<remove [实体ID] - 移除实体>/<unlockall - 解锁所有道具>/<change [场景entranceId] - 进入指定场景>/<reload - 重新进入场景>";
public string Desc { get; } = "管理玩家场景\n" +
"提示:此组大多为调试使用,使用命令前,请确保你清楚你在做什么!\n" +
"使用 prop 来设置道具状态在Common/Enums/Scene/PropStateEnum.cs获取状态列表\n" +
"使用 unlockall 来解锁场景内所有道具即将所有能设置为open状态的道具设置为open状态此命令有较大可能会导致游戏加载卡条约90%,使用 /scene reset <floorId> 来解决问题\n" +
"使用 change 来进入指定场景要获取EntryId请访问 Resources/MapEntrance.json\n" +
"使用 reload 来重新加载当前场景,并回到初始位置\n" +
"使用 reset 来重置指定场景所有道具状态要获取当前FloorId请访问数据库 Player 表";
public string Usage { get; } = "用法:/scene prop [组ID] [道具ID] [状态]\n\n用法/scene remove [实体ID]\n\n用法/scene unlockall\n\n用法/scene change [entryId]\n\n用法/scene reload\n\n用法/scene reset <floorId>";
public string LoadedGroups { get; } = "已加载组: {0}";
public string PropStateChanged { get; } = "道具: {0} 的状态已设置为 {1}";
public string PropNotFound { get; } = "未找到道具!";
@@ -352,7 +362,7 @@ namespace EggLink.DanhengServer.Internationalization.Message
public class MailTextCHS
{
public string Desc { get; } = "管理玩家的邮件";
public string Usage { get; } = "/mail <send [发送名称] [标题] [内容] [模板ID] [过期天数] - 发送邮件>/<send [发送者] [标题] [内容] [模板ID] [过期天数] [附件] - 发送带附件的邮件>";
public string Usage { get; } = "用法:/mail send [发送名称] [标题] [内容] [模板ID] [过期天数]";
public string MailSent { get; } = "邮件已发送!";
public string MailSentWithAttachment { get; } = "带附件的邮件已发送!";
}
@@ -363,7 +373,7 @@ namespace EggLink.DanhengServer.Internationalization.Message
public class RaidTextCHS
{
public string Desc { get; } = "管理玩家的任务临时场景";
public string Usage { get; } = "/raid <leave - 离开临时场景>";
public string Usage { get; } = "用法:/raid leave - 离开临时场景";
public string Leaved { get; } = "已离开临时场景!";
}
/// <summary>
@@ -371,9 +381,9 @@ namespace EggLink.DanhengServer.Internationalization.Message
/// </summary>
public class AccountTextCHS
{
public string Desc { get; } = "创建账号";
public string Usage { get; } = "/account create <用户名>";
public string InvalidUid { get; } = "无效UID参数 ";
public string Desc { get; } = "创建账号\n注意此命令未经测试请谨慎使用";
public string Usage { get; } = "用法:/account create <用户名>";
public string InvalidUid { get; } = "无效UID参数";
public string CreateError { get; } = "出现内部错误 {0} ";
public string CreateSuccess { get; } = "新账号 {0} 创建成功!";
public string DuplicateAccount { get; } = "账号 {0} 已存在!";

View File

@@ -18,7 +18,7 @@ namespace EggLink.DanhengServer.GameServer.Command
public void SendMsg(string msg)
{
Player.SendPacket(new PacketRevcMsgScNotify(toUid: (uint)Player.Uid, fromUid: (uint)ConfigManager.Config.ServerOption.ServerProfile.Uid, msg));
Player.SendPacket(new PacketRevcMsgScNotify(toUid: (uint)Player.Uid, fromUid: (uint)ConfigManager.Config.ServerOption.ServerProfile.Uid, msg.Replace("\n", " ")));
}
public bool HasPermission(string permission)

View File

@@ -4,6 +4,7 @@ using EggLink.DanhengServer.Database.Avatar;
using EggLink.DanhengServer.Database.Inventory;
using EggLink.DanhengServer.Enums.Item;
using EggLink.DanhengServer.Game.Player;
using EggLink.DanhengServer.GameServer.Server.Packet.Send.Others;
using EggLink.DanhengServer.Proto;
using EggLink.DanhengServer.Server.Packet.Send.Avatar;
using EggLink.DanhengServer.Server.Packet.Send.Player;
@@ -64,6 +65,11 @@ namespace EggLink.DanhengServer.Game.Inventory
switch (itemConfig.ItemMainType)
{
case ItemMainTypeEnum.Equipment:
if (Data.RelicItems.Count + 1 > GameConstants.INVENTORY_MAX_EQUIPMENT) // get the max equipment
{
Player.SendPacket(new PacketRetcodeNotify(Retcode.RetEquipmentExceedLimit));
break;
}
itemData = PutItem(itemId, 1, rank: rank, level: level, uniqueId: ++Data.NextUniqueId);
break;
case ItemMainTypeEnum.Usable:
@@ -90,6 +96,11 @@ namespace EggLink.DanhengServer.Game.Inventory
};
break;
case ItemMainTypeEnum.Relic:
if (Data.RelicItems.Count + 1 > GameConstants.INVENTORY_MAX_RELIC) // get the max relic, i dont think one player can have more than max count of relic until i see a player get 50000 relic and the client crashed :(
{
Player.SendPacket(new PacketRetcodeNotify(Retcode.RetRelicExceedLimit));
break;
}
var item = PutItem(itemId, 1, rank: 1, level: 0, uniqueId: ++Data.NextUniqueId);
item.AddRandomRelicMainAffix();
item.AddRandomRelicSubAffix(3);
@@ -217,9 +228,19 @@ namespace EggLink.DanhengServer.Game.Inventory
Data.MaterialItems.Add(item);
break;
case ItemMainTypeEnum.Equipment:
if (Data.RelicItems.Count + 1 > GameConstants.INVENTORY_MAX_EQUIPMENT)
{
Player.SendPacket(new PacketRetcodeNotify(Retcode.RetEquipmentExceedLimit));
return item;
}
Data.EquipmentItems.Add(item);
break;
case ItemMainTypeEnum.Relic:
if (Data.RelicItems.Count + 1 > GameConstants.INVENTORY_MAX_RELIC)
{
Player.SendPacket(new PacketRetcodeNotify(Retcode.RetRelicExceedLimit));
return item;
}
Data.RelicItems.Add(item);
break;
}

View File

@@ -0,0 +1,23 @@
using EggLink.DanhengServer.Proto;
using EggLink.DanhengServer.Server.Packet;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.Others
{
public class PacketRetcodeNotify : BasePacket
{
public PacketRetcodeNotify(Retcode retcode) : base(CmdIds.RetcodeNotify)
{
var proto = new RetcodeNotify
{
Retcode = retcode // original proto is uint, i modify it to Retcode enum
};
SetData(proto);
}
}
}

View File

@@ -34,6 +34,9 @@ namespace EggLink.DanhengServer.Handbook
var builder = new StringBuilder();
builder.AppendLine("Handbook generated in " + DateTime.Now.ToString("yyyy/MM/dd HH:mm"));
builder.AppendLine();
builder.AppendLine("#Command");
builder.AppendLine();
GenerateCmd(builder);
builder.AppendLine();
@@ -83,10 +86,9 @@ namespace EggLink.DanhengServer.Handbook
{
foreach (var cmd in EntryPoint.CommandManager.CommandInfo)
{
builder.Append("Command: " + cmd.Key);
builder.Append(" --- Description: " + I18nManager.Translate(cmd.Value.Description));
builder.Append(" --- Usage: " + I18nManager.Translate(cmd.Value.Usage));
builder.AppendLine();
builder.Append("\t" + cmd.Key);
var desc = I18nManager.Translate(cmd.Value.Description).Replace("\n", "\n\t\t");
builder.AppendLine(": " + desc);
}
}