精華區beta mud_sanc 關於我們 聯絡資訊
一樣還是試作,不過大部份都能顯示的很好。 利用的函數是 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