仙境傳說|RO私服

標題: 配合1/28,1/31系統異動,自己動手修改 openkore [打印本頁]

作者: sofax222    時間: 2011-2-1 10:36
標題: 配合1/28,1/31系統異動,自己動手修改 openkore
1/28、1/30 twRO 官方修改了系統,造成 openkore 無法掛網
小弟不才已經修改部分 table 檔以及程式檔就可以掛了....

因為我用的是 SVN r7572 版 (基本上在此版本上我己修改了許多程式碼,包括 XKore 功能)
和最新版 r7639 可能有些出入 (我尚未將我自行修改的程式碼反應到此一新版上)
所以不便打包上傳給各位大大

配合官方的變動,以下是我修改 openkore SVN r7572 的詳細步驟:

1. 修改 tables/servers.txt
將該檔案中凡是 Taiwan - twRO: 的區塊,將原 "charBlockSize 112" 都改成 "charBlockSize 116"

2. 修改 tables/twRO/recvpackets-twRO-free.txt
在該檔的最後面加上下列三行
0856 0
0857 0
0858 0

PS: 因為我只玩免服和全區,所以只改這個檔

3. 修改程式檔 src/Network/Receive/ServerType0.pm
這個對不會寫程式的大大可能會是個大工程... 其實也沒有很難

這次官方的變動影響 openkore 的資料封包,目前我測出有三類,其對應的修改如下:
(1). 角色資料封包 006B:
找到以下程式區塊
  1. sub received_characters_unpackString {
  2.         if ($masterServer && $masterServer->{charBlockSize} == 112) {
  3.                 return 'a4 V9 v V2 v14 Z24 C6 v2';
  4.         } else {
  5.                 return 'a4 V9 v17 Z24 C6 v2';
  6.         }
  7. }
複製代碼
修改成以下程式碼 (基本上是加入中間兩行):
  1. sub received_characters_unpackString {
  2.         if ($masterServer && $masterServer->{charBlockSize} == 112) {
  3.                 return 'a4 V9 v V2 v14 Z24 C6 v2';
  4.         } elsif ($masterServer && $masterServer->{charBlockSize} == 116) {
  5.                 return 'a4 V9 v V2 v14 Z24 C6 v4';
  6.         } else {
  7.                 return 'a4 V9 v17 Z24 C6 v2';
  8.         }
  9. }
複製代碼
(2). 角色身上物品資料封包 02D0 (這要改兩個地方):
先找到 "sub inventory_items_nonstackable"
(A).
往下再找到以下程式區塊
  1.         } elsif ($args->{switch} eq '02D0') {
  2.                 $psize = 26;
  3.         } else {
  4.                 warning "inventory_items_nonstackable: unsupported packet ($args->{switch})!\n";
  5.         }
複製代碼
修改成以下程式碼 (基本上是把 26 改成 28):
  1.         } elsif ($args->{switch} eq '02D0') {
  2.                 $psize = 28;
  3.         } else {
  4.                 warning "inventory_items_nonstackable: unsupported packet ($args->{switch})!\n";
  5.         }
複製代碼
(B)
往下再找到以下程式區塊
  1.                 if ($psize == 26) {
  2.                         my $expire =  unpack("a4", substr($msg, $i + 20, 4)); #a4 or V1 unpacking?
  3.                         $item->{expire} = $expire if (defined $expire);
  4.                         #$item->{unknown} = unpack("v1", substr($msg, $i + 26, 2));
  5.                 }
複製代碼
修改成以下程式碼 (基本上是把 26 改成 28,再把 "$i + 20" 改成 "$i + 22"):
  1.                 if ($psize == 28) {
  2.                         my $expire =  unpack("a4", substr($msg, $i + 22, 4)); #a4 or V1 unpacking?
  3.                         $item->{expire} = $expire if (defined $expire);
  4.                         #$item->{unknown} = unpack("v1", substr($msg, $i + 26, 2));
  5.                 }
複製代碼
(3). 怪物/NPC 資料封包 0856 / 0857 / 0858
先找到以下程式區塊
  1. sub new {
  2.         my ($class) = @_;
  3.         my $self = $class->SUPER::new();
  4.        
  5.         $self->{packet_list} = {
複製代碼
原程式區塊是
  1. sub new {
  2.         my ($class) = @_;
  3.         my $self = $class->SUPER::new();
  4.        
  5.         $self->{packet_list} = {
  6.                 ........
  7.                 ........
  8.         };
複製代碼
在此區塊的最後 ("};" 之前) 加入三行,成以下程式區塊:
  1. sub new {
  2.         my ($class) = @_;
  3.         my $self = $class->SUPER::new();
  4.        
  5.         $self->{packet_list} = {
  6.                 ........
  7.                 ........
  8.                 '0856' => ['actor_display', 'v C a4 v3 V v5 a4 v5 a4 a2 v V v C2 a6 C2 v2 Z*', [qw(len object_type ID walk_speed opt1 opt2 option type hair_style weapon shield lowhead tick tophead midhead hair_color clothes_color head_dir guildID emblemID manner opt3 opt4 karma sex coords xSize ySize lv font name)]], # -1 # walking
  9.                 '0858' => ['actor_display', 'v C a4 v3 V v10 a4 a2 v V v C2 a3 C2 v2 Z*', [qw(len object_type ID walk_speed opt1 opt2 option type hair_style weapon shield lowhead tophead midhead hair_color clothes_color head_dir guildID emblemID manner opt3 opt4 karma sex coords xSize ySize lv font name)]], # -1 # spawning
  10.                 '0857' => ['actor_display', 'v C a4 v3 V v10 a4 a2 v V v C2 a3 C3 v2 Z*', [qw(len object_type ID walk_speed opt1 opt2 option type hair_style weapon shield lowhead tophead midhead hair_color clothes_color head_dir guildID emblemID manner opt3 opt4 karma sex coords xSize ySize act lv font name)]], # -1 # standing
  11.         };
複製代碼
如果你的 Bot 因為 1/28、1/31 官方的異動而不能正常工作的話,可試試以上的方法
作者: sofax222    時間: 2011-2-1 16:33
目前又發現一個問題...
就下 "eq" 裝備指令時會出現異常...
我想這和新增的 "服裝裝備" 有關...
正在研究問題所在....
作者: sofax222    時間: 2011-2-8 08:30
存取倉庫時也會有資料亂掉的問題,修改如下:
角色倉庫物品資料封包 02D1,也要要改兩個地方(和身上物品資料封包 02D0 類似):
先找到 "sub storage_items_nonstackable",
(A).
往下再找到以下程式區塊
  1.         } elsif ($args->{switch} eq '02D1') {
  2.                 $psize = 26;
  3.         } else {
  4.                 warning "storage_items_nonstackable: unsupported packet ($args->{switch})!\n";
  5.         }
複製代碼
複製代碼修改成以下程式碼 (基本上是把 26 改成 28):
  1.         } elsif ($args->{switch} eq '02D1') {
  2.                 $psize = 28;
  3.         } else {
  4.                 warning "storage_items_nonstackable: unsupported packet ($args->{switch})!\n";
  5.         }
複製代碼
複製代碼(B)
往下再找到以下程式區塊
  1.                 if ($psize == 28) {
  2.                         my $expire =  unpack("a4", substr($msg, $i + 20, 4)); #a4 or V1 unpacking?
  3.                         $item->{expire} = $expire if (defined $expire);
  4.                         #$item->{unknown} = unpack("v1", substr($msg, $i + 24, 2));
  5.                 }
複製代碼
複製代碼修改成以下程式碼 (基本上是把 26 改成 28,再把 "$i + 20" 改成 "$i + 22"):
  1.                 if ($psize == 28) {
  2.                         my $expire =  unpack("a4", substr($msg, $i + 22, 4)); #a4 or V1 unpacking?
  3.                         $item->{expire} = $expire if (defined $expire);
  4.                         #$item->{unknown} = unpack("v1", substr($msg, $i + 24, 2));
  5.                 }
複製代碼

作者: Robert    時間: 2011-2-8 10:55
幾乎沒什麼問題了, 感謝大大分享
作者: sofax222    時間: 2011-2-16 10:35
又發現一個小問題:
在更換裝備時會發生錯誤....
修改如下:

修改 tables/twRO/recvpackets-twRO-free.txt
將原 00AA 7 改成 00AA 9

修改程式檔 src/Network/Receive/ServerType0.pm
裝備封包:
將原
  1. '00AA' => ['equip_item', 'v2 C', [qw(index type success)]],
複製代碼
改成
  1. '00AA' => ['equip_item', 'v3 C', [qw(index type opt success)]],
複製代碼





歡迎光臨 仙境傳說|RO私服 (http://ro.private-servers-game.com/) Powered by Discuz! X3.2