作者hmml (hmml)
看板mud_sanc
标题Re: [心得] MushClient 圣殿技能排还原度较好的写法
时间Fri Jun 21 00:24:58 2013
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.132.196.45
1F:→ laechan :这个 wiz 可协助排为上述模式但需用到 [24;XXH06/10 07:47
2F:→ laechan :所以我倾向不使用,玩家可透过hmml的方式自行为显示做06/10 07:47
3F:→ laechan :排版,这样一般玩家下list时可正常看到东西,mush玩家06/10 07:48
4F:→ laechan :下list时可看到自己想要的排版格式06/10 07:48
5F:→ laechan :而如果有难搞的显示时就说一下我们再配合修改06/10 07:48
Mushclient有一个函数,可以直接抓封包先修改内容再给程式处理
,利用这个先判断移位码的位置和内容,置换成相对应的空格,那麽就
不用对各式有移位码的行一一去做修改,这样就能让Mushclient的显示
和zMUD5.55非常接近(5.55根本是圣殿专用版本)。
不过,因为这个函数处理的是封包,所以内容会被封包的上限影响
,一个就是999个字的样子,一旦内容超过这个限制,就会被截断,分
成好几个封包送出去,它截断的位置几乎在行的中间,什麽地方都有机
会。导致这样的写法几乎不能成功,特别是它截断了移位码的时候...
让封包能刚好截断在一行的换行後方,不知可不可行?
不过我也不能保证那样就能解决问题,也许有些只是Mushclient来
不及处理,只是问一下...
目前写比较好的如下,分成两部份,一个先在封包里读出移位码,
并转成一般字串,另一个判读变成字串的移位码,来调整位置。原来用
ColourTell 也改成可做为触发句的 Simulate,基本上会排失败大概都
是移位码遭封包结尾截断。
如果要写成一个,只要封包截断行,都会排失败。
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE muclient>
<!-- Saved on 星期二, 六月 11, 2013, 10:42 下午 -->
<!-- MuClient version 4.84 -->
<!-- Plugin "newtest" generated by Plugin Wizard -->
<muclient>
<plugin
name="newtest_successful"
id="e9aa08a01c2ee15248ce4675"
language="Lua"
purpose="修订中"
date_written="2013-06-11 22:41:55"
requires="4.84"
version="1.0"
>
<description trim="y">
修订中
</description>
</plugin>
<!-- Get our standard constants -->
<include name="constants.lua"/>
<!-- Triggers -->
<triggers>
<trigger
enabled="y"
keep_evaluating="y"
match="^.*$"
regexp="y"
script="OnPluginPacketReceived"
send_to="12"
sequence="100"
>
</trigger>
</triggers>
<!-- Script -->
<script>
<![CDATA[
-- 原本匹配用的行,目前未使用。
Tab_start_reg = rex.new("\\e\\[24;\\d+H")
-- 在被分析前,就抓到封包的函数
function OnPluginPacketReceived (sText)
-- 移位码的格式:%c%[24;%d+H
-- %c 代表所有控制字元,如ESC。
-- [24;%d+ 座标,即Y轴和X轴,Y轴是固定数,X轴不是。
-- H 定义这个移位码的模式,游标的位置。
if string.match(sText,'(%c%[24;)(%d+)H') ~= nil then
sText =
string.gsub(sText
,'
(%c%[24;
)(%d+
)H'
,"∴%2∴"
)
end --if
return sText
end
]]>
</script>
<triggers>
<trigger
enabled="y"
keep_evaluating="y"
match="(∴(\d+)∴)"
omit_from_output="y"
script="ColorType"
regexp="y"
send_to="12"
sequence="100"
>
</trigger>
</triggers>
<!-- Script -->
<script>
<![CDATA[
local conversion = {
['black'] = ANSI(0)..ANSI (30),
['maroon'] = ANSI(0)..ANSI (31),
['green'] = ANSI(0)..ANSI (32),
['olive'] = ANSI(0)..ANSI (33),
['navy'] = ANSI(0)..ANSI (34),
['purple'] = ANSI(0)..ANSI (35),
['teal'] = ANSI(0)..ANSI (36),
['silver'] = ANSI(0)..ANSI (37),
--以下高亮
['gray'] = ANSI (30, 40,1),
['red'] = ANSI (31, 40,1),
['lime'] = ANSI (32, 40,1),
['yellow'] = ANSI (33, 40,1),
['blue'] = ANSI (34, 40,1),
['magenta'] = ANSI (35, 40,1),
['cyan'] = ANSI (36, 40,1),
['white'] = ANSI (37,40,1),
} -- end conversion table
function ColorType (name, line, wildcards, styles)
for _,v in ipairs (styles) do
if string.match(v.text,'∴(%d+)∴') ~= nil then
move_len =
string.match(v.text
,'∴(%d+)∴'
)
movelen_len =
string.len(string.match(v.text
,'(∴%d+∴)'
))
textr =
string.match(v.text
,'(.*)∴%d+∴'
)
textl =
string.match(v.text
,'∴%d+∴(.*)'
)
if v.column ~= 1 then
Simulate(conversion[RGBColourToName (v.textcolour)]
,
textr
,
string.rep(" "
,move_len-
(GetLineInfo
(
GetLinesInBufferCount(),2
)+1
)-string.len(textr)
),
textl
)
else
Simulate(conversion[RGBColourToName (v.textcolour)]
,
vtextr
,
string.rep(" "
,move_len-v.column-
string.len(textr
)),
textl
)
end -- v.column
else
Simulate(conversion[RGBColourToName (v.textcolour)]
,
v.text
)
end --if match
end --for
Simulate('\n'
)
end --function
]]>
</script>
</muclient>
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.233.202.51
※ 编辑: hmml 来自: 118.233.202.51 (06/21 00:25)