作者hmml (hmml)
看板mud_sanc
標題[心得] Mushclient 處理移位碼的plugin...
時間Wed Sep 11 00:59:43 2013
一樣還是試作,不過大部份都能顯示的很好。
利用的函數是 OnPluginPacketReceived ,抓封包用的。這個函數是無差別
抓封包,在 MushClient 開始處理封包前,它會先抓過來,使用者可以先
MushClient 處理內容,弄成自己需要的再給 MushClient 處理。所以才有
可能處理移位碼。這個一定要用 plugin 去掛。
不過處理封包的跟處理畫面中的行不太一樣,封包不是只有一行內容,它的
上限是 999 個字元,所以資料量大的指令,如:skill、list、score...
很容易超過 999 上限,這時就會切成好幾個封包送過來,切的地方往往不
太好,可以說...蠻糟的...
當它切在一行的正中央,後半行的移位碼會得不到前半行的長度,因而算錯
該推移的長度。切在移位碼的正中央,這個判斷就會丟失。資料量要分好幾
個封包的時候,也不保證它中間的封包一定就是 999 字元塞滿(根本它隨
意),只能無差別處理。
所以這個試作有很多時間都在處理這個問題。
目前沒處理的,就是移位碼指定的位置,是有字元佔位的,聖殿有很多這類
作法:sc的3P視圖,就是用這種方法寫的,目前只完成堆疊,並沒有寫截掉
和取代的部份,所以3P永遠不會動。compare 的紅字絕對會在最左...等等。
party 的 3p 視圖,寫法跟 sc 是不同的。之前有wiz說寫法一樣,是他看錯
。party 的移位碼是用來截斷角色名字的,後方3P視圖裡一個移位碼也沒有
。顯示的寫法根本是不一樣的。
大概還是要重弄...因為截掉和取代非常難...這部份可能也是程式作者不願
支援移位碼的原因吧...基於他顯示內容的方法,處理這兩種很煩人。
下面這個就將就著用,反正 zMUD 也只有5.55可以將移位碼顯示得很完美而
已...
--==-==--==-==--==-==--==-==--==-==--==-==--==-==--==-==--==-==--==-==--==-==--
<?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_trial"
id="69400abd9629952d36fbc92e"
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"/>
<!-- Script -->
<script>
<![CDATA[
-- 在被分析前,就抓到封包的函數
function OnPluginPacketReceived (sText)
--tend :前封包中無換行字元的行。
--sText:伺服器送來的封包。
if string.match(sText,'%*trigger%d+') == nil then --不到一行的略過
if tend ~= nil then --如果tend有內容
sText = tend..sText
--把它接到目前封包的前頭
tend = nil
--接著清空
end --tend nil?
end --不到一行的略過END
i,j =string.gsub(sText,'\n',"█")
--檢查換行
if j >= 2 then --兩行以上
if string.find(sText,"[^\n]+$") then --找封包的末行
--將末行存入tend。
tend = string.sub
(sText
,string.find
(sText
,"[^\n]+$"
))
end
--將封包的末行移除
sText = string.sub(sText,1,string.find(sText,"[^\n]+$"))
--將封包尾端一些奇怪的字元移除。
sText = string.sub(sText,1,-2)
--如果誤刪了換行,另行補上。
if string.find(sText,"[\n]",-1) == nil then
sText = sText..'\n'
end
end --兩行以上END
--到此為止是整頓封包,讓被腰斬的行恢復原狀。
--以下是移位碼處理。
if string.match(sText,'(%c%[24;)(%d+)H') ~= nil then --如果有移位碼
--把移位碼標記出來。
sText = string.gsub(sText,'(%c%[24;)(%d+)H',"∴%2∴")
--刪除所有色碼,存到sText準備對照用。
sText2 = string.gsub(sText,'(%c%[%d*m)',"")
sText2 = string.gsub(sText2,'(%c%[%d+;)(%d+)[m]',"")
sText2 = string.gsub(sText2,'(%c%[%d+;)(%d+;%d+)[m]',"")
--把sText2的內容一行一行讀出
for i in string.gmatch(sText2, "[^\n]+" ) do
--從行首開始一個個找出改過的移位碼
for di,di2 in string.gmatch(i, "(∴(%d+)∴)" ) do
--di = 移位碼全部格式
--di2 = 移位碼數值
i2,i3 = string.find(i,di)
--移位碼位置
--移位碼的數值減去移位碼的位置,就是空格該補上的數量
al_len = di2-i2
--把移位碼置換成應該補上的空格字段(sText2)
i = string.gsub(i,'∴(%d+)∴',string.rep(" ",al_len),1)
--同時也將sText的移位碼同sText2般置換
sText = string.gsub(sText,'∴(%d+)∴',string.rep(" ",al_len),1)
end --for match ∴(%d+)∴
end --for match \n
end
--不管封包尾端有沒有*[0m,無差別補上
sText = sText..string.char(0x1b)..'[0m'
--送到MushClient 接手處理
return sText
end
]]>
</script>
</muclient>
--==-==--==-==--==-==--==-==--==-==--==-==--==-==--==-==--==-==--==-==--==-==--
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 106.1.194.58
推 elvrael :看不懂....不過還是要來推一下 XD 09/11 08:52
→ laechan :你可以試試抓斷行碼(\n),將一段訊息先用斷行碼切成 n 09/11 09:54
→ laechan :斷訊息,再各別處理其移位碼 09/11 09:55
→ laechan :這樣要超過 999 應該很困難 09/11 09:55
→ laechan :唔你好像就是這樣處理的, 呵呵 09/11 09:57