2021-11-17 客户端在 mes 指令上的变化

最近我们留意到有些使用 2021-11-17 客户端的朋友在反馈: 以前工作的很好的一些脚本开始出现一些视觉呈现上不符合预期的变化。为此进行了一些跟踪,并分享一些结论和潜在的解决方案

问题表现

先来看看大家都遇到什么样的问题。假定有以下么这一段脚本,使用 mes 指令对内容进行逐行输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
prontera,150,150,4	script	tester	123,{
mes "[Tester]";
mes "I need some thing:";
mes " - Apple x 1 eg";
mes " - Egg x 1 eg";
mes "Could you bring them for me?";
mes "-------------------------";
mes "PACKETVER = ^ff0000" + PACKETVER + "^000000";
next;
mes " ____ __ _____ ";
mes " |___ \ / /| ____| ";
mes " __) |/ /_| |__ ";
mes " |__ <| '_ \___ \ ";
mes " ___) | (_) |__) | ";
mes " |____/ \___/____/ ";
mes " ";
close;
}

这段脚本在 2021-11-17 以前的客户端,将会显示出我们期望的信息:

正常情况

而如果您使用 2021-11-17 客户端同样执行这段脚本,将会看到:

异常情况

很明显,这个“追加到上一行末尾”的效果并不符合以往预期,这将导致很多历史脚本精心微调的展现效果出现偏差。

分析

  • 2021-11-17 客户端没有调整 mes 封包的编号
  • 服务端没有进行任何数据调整的情况下客户端改变了呈现的结果, 因此排除与服务端的关联性
  • 猜测: kRO 可能是为了和其他客户端工程 (比如: ZERO 客户端) 的文本输出逻辑进行对齐, 合并了代码而引进了此问题

规律

只要 mes 的内容以空格开头, 并且上一行有足够的位置可以放下本次 mes 要输出的内容, 那么本次 mes 的内容就会被拼在上一行末尾

解决方案

好在经过一些尝试,我终于找到了一个临时解决方案!可以在尽可能少改动脚本的情况下来让客户端尽可能回到原先的换行逻辑。

  • 如果希望 mes 输出不“追尾”上一行,那么空格开头的行可以前置补个\n
1
2
3
4
5
6
7
8
9
10
prontera,150,150,4	script	tester	123,{
mes "[Tester]";
mes "I need some thing:";
mes "\n - Apple x 1 eg"; // ADD \n
mes "\n - Egg x 1 eg"; // ADD \n
mes "Could you bring them for me?";
mes "-------------------------";
mes "PACKETVER = ^ff0000" + PACKETVER + "^000000";
close;
}
  • 在 rAthena 项目中,可以封装一个 mes2 指令用来进行这些特殊处理,然后将这个 mes2 处理函数放在 npc\other\Global_Functions.txt 中以便其他脚本可以随时使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function	script	mes2	{
if (getargcount() == 0) {
return;
}

for (.@i = 0; .@i < getargcount(); .@i++) {
.@mes$ = getarg(.@i, "");
if (PACKETVER < 20211117) {
mes .@mes$;
continue;
}

if (getstrlen(.@mes$) == 0) {
mes .@mes$;
continue;
}

if (charat(.@mes$, 0) == " ") {
.@mes$ = "\n" + .@mes$;
}
mes .@mes$;
}
return;
}
  • 对于使用熊猫模拟器的用户,若您使用的是 v1.1.10 版本,源代码中已经自动进行了上述的处理,无需再额外使用 mes2 方式进行封装
  • 若想关闭这部分修正逻辑,可以将 conf/battle/pandas.conf 中的 restore_mes_logic 选项设置为 off

修正之后的表现

2022-02-10 更新

根据最新的测试结论,上面的修改方法在 langtype = 4 也就是繁体中文的情况下,虽然能解决换行问题,但是但是会有一个空格错位。应该是字体或者是客户端中针对繁体中文有其他加工逻辑导致。

繁体中文下存在的问题

因此,很遗憾这个方法在繁体中文下并不完美(简体中文下表现很好),等待 NEMO 等 DIFF 工具看下是否有办法进行更好的调整。