回字的四种解法--说说mush的机制两个细节
本帖最后由 jarlyyn 于 2024-5-3 10:51 PM 编辑陪娃玩了一天,终于等娃睡了把昨天测试的时候发现的遗留问题解决了,被mush/mudlet的兼容性问题和lua蛋疼的于法折腾的欲生欲死,停手透口气, 顺便来水一帖解决的方向。
1.GetStyleInfo与换行的兼容。
众所周知,北侠的任务系统非常考验GetStyleInfo的使用(对应mudlet就是那个满是bug的GetTextFormat)。
但是,GetStyleInfo依赖于Buffer里的行数,而如果开启了Mush的换行,同时使用了默认设置(80字符)换行的话,很多内容,比如score后的表格,会导致显示分行。
这时候使用GetStyleInfo就会由于不知道想要处理几行被困扰了。
这时最简单粗暴的方案应该是设置更长的换行或者取消换行。
那我们如果不想改换行设置(低侵入性)的话应该怎么办?
可以使用另一个函数配合,GetLineInfo。
GetLineInfo有三个重要参数
[*]3 newline.结尾是否有换行符号(这个居然不是开头)
[*]4 是否是Note
[*]5 是否是回显
从当前行上一行开始不停向上查询信息,直到有任何一个3,4,5是true,之间的就是被换行的同一行内容(Note和Echo也很可能没有换行)
把同一行的内容做一个for循环处理
大概的代码是
local offset=0
-- 被wrap的行,上一行的newline是false
-- 还需要排除Note和echo的用户输出
while offset + linescount > 0 do
if GetLineInfo(offset + linescount - 1, 3) or GetLineInfo(offset + linescount - 1, 4) or GetLineInfo(offset + linescount - 1, 5) then
break
end
offset = offset - 1
end
for lineno = linescount+offset,linescount, 1 do
local styles = GetStyleInfo(lineno)
for index, value in ipairs(styles) do
2.指定scriptname和sendto 12有什么区别
执行顺序不同,是否能终止触发继续匹配不同。
具体说明在
https://www.gammon.com.au/script ... pEvaluatingTriggers
具体来说是先执行所有触发的sentto 12,再执行scriptname中的脚本。这个优先级是高于Sequence的设置的。
如果非常强调脚本之间的执行顺序,需要注意到这一点。
页:
[1]