- Back to Home »
- 楓之谷教學 »
- 【楓之谷教學】一次修復所有中文聊天、NPC顯示、ID顯示之問題
【說明】
關於中文顯示範圍太廣泛,但網路資源太過分散,導致許多問題明明有解答,卻無法被找出,以下為各位整理出完整的中文顯示修復教學,請注意,參考資料僅參考,本教學內容之方法會跟參考資料有出入,自行斟酌使用。
【準備】
此教學會動到的JAVA如下,請先使用您的編譯軟件開好以下JAVA
GenericLittleEndianWriter.JAVA
LittleEndianAccessor.JAVA
StringUtil.java
MaplePacketCreator.java
【解決問題】
1.中文顯示NPC、中文名稱、端口支援中文
2.中文聊天顯示 ( 非中文發話 )
【教學開始】
#中文顯示NPC、中文名稱、端口支援中文
打開 GenericLittleEndianWriter.JAVA
搜尋 private static Charset ASCII = Charset.forName("US-ASCII");
改成
public class GenericLittleEndianWriter implements LittleEndianWriter {
private static Charset ASCII = Charset.forName("BIG5");
private ByteOutputStream bos;
|
改成
riteShort((short)getlength(s));
|
打開 StringUtil.java
搜尋 public static String getRightPaddedStr(String in, char padchar, int length) {
改成
public static int getlength(String str){ int i,t=0; byte[] bt = str.getBytes(); for(i=1;i<=bt.length;i++){ if (bt[i-1]<0) {t=t+2;i++;} else t=t+1; } return t; } public static String getRightPaddedStr(String in, char padchar, int length) { StringBuilder builder = new StringBuilder(in); for (int x = getlength(in); x < length; x++) {
|
搜尋 private static void addCharStats(MaplePacketLittleEndianWriter mplew, MapleCharacter chr) {
在他上面加上
public static int getlength(String str){ int i,t=0; byte[] bt = str.getBytes(); for (i=1;i<=bt.length;i++){ if (bt[i-1]<0) {t=t+2;i++;} else t=t+1; } return t; }
|
改成
for (int x = getlength(chr.getName()); x < 13; x++) {
|
#中文聊天顯示 ( 非中文發話 )
打開 GenericLittleEndianWriter.JAVA
搜尋 writeAsciiString
改成
public final void writeAsciiString(final String s) {
write(s.getBytes(ASCII)); } public final void writeAsciiString(String s, final int max) { if (s.getBytes(ASCII).length > max) { s = s.substring(0, max); } write(s.getBytes(ASCII)); for (int i = s.getBytes(ASCII).length; i < max; i++) { write((byte) 0); } } public final void writeMapleAsciiString(final String s) { writeShort((short) s.getBytes(ASCII).length); writeAsciiString(s); } |
搜尋 readAsciiString
改成
public final String readAsciiString(final int n) {
try {
final byte ret[] = new byte[n];
for (int x = 0; x < n; x++) {
ret[x] = readByte();
}
return new String(ret, "big5");
} catch (UnsupportedEncodingException ex) {
System.err.println(ex);
}
return "";
}
|
【文章參考】
淺談中文顯示 作者 : 相信是一種賭注
中文亂碼問題 作者 : 冷霜孤月
中文名稱、中文顯示NPC 作者 : 薯餅
【最後整理】AICL集團卡納谷管理團隊
這getlength會有全形特殊符號無法處理問題
回覆刪除如果有更好的修正辦法,很歡迎分享喔!!!
刪除這是V62中文輸入嗎?
刪除這只能顯示,要能輸入要改主程序
刪除