パケット受信部?

koreのDOS画面には様々な情報が表示されますね。
ではどうやってそのような情報を認識しているのでしょうか?

ROはクライアントとサーバーで情報のやりとりをしています。
たとえば座るという動作は・・・

ROクライアントでinseatボタンを押す

サーバーに「座る」という情報を渡す

サーバーがROクライアントに「座れ」という情報を渡す

kore

サーバーから「座れ」という情報がクライアントに伝わり、キャラが座る

まぁこのような流れになっています。
koreは青文字の部分にちょっとお邪魔しています。
そこで、koreはパケットの情報を解析しDOS画面にどのような情報だったのかを表示しようとします。

ではどこでそのような処理をしているのか?
kore.plは「sub parseMsg」というセッションでパケットを解析しています。

たとえばこれ↓
e0056993_22135060.jpg



アイテムを使用したというサーバーからの応答情報です。
隠してある部分は使用キャラのIDです。
サーバーからの情報はすべてバイナリ構造体(16進数)で表されています。
下の数字はわかり易いように番号を振りました。
「アイテムを使った」というのは画像を見てわかるように01C8パケでkore.pl内部↓にあたります。

} elsif ($switch eq "01C8") {
# アイテム使用
$index = unpack("S1",substr($msg, 2, 2)); #使用したアイテムの位置みたいなもの
$ID = unpack("S1", substr($msg, 4, 2)); #使用したアイテムのID
$sourceID = substr($msg, 6, 4); #使用キャラのID
$amountleft = unpack("S1",substr($msg, 10, 2)); #使用したアイテムの残り個数
この部分でこのパケを解析しています。

「substr」関数は部分文字列を取り出す時に使い、「unpack」関数はバイナリ構造体をリスト値に展開します。
たとえば使用したアイテムのIDの場合、4行目から2つ情報を取り出します。
つまり上の画像の「07 02」を取り出します。
そしてこれを型指定子「S1」に従ってリスト値に展開します。
「07 02」は16進数で「207」であり、これを10進数に直すと「519」になります。
「519」とはどんなアイテムなのか・・そこでkore.plではこのようなIDを識別するために「table」フォルダに情報を入れています。
koreは「table」フォルダにある「item.txt」を参照し一体なんのアイテムなのかを識別します。
e0056993_2274224.jpg






「519」は「ミルク」ですね。

画像の12番目はたぶん使用個数を表しているのでこれの解析結果は、

$sourceIDのキャラがミルクを1個使用した。

というようになります。
kore.plでは、

print "アイテムを使用しました: $display x $amount\n";

となり、DOS画面には

アイテムを使用しました: ミルク x 1

と表示されます。
koreはこのように情報を其のつど解析していますが、まれにkoreがわからないパケットを受信してしまうこともあります。
このようなパケはみなさんよく見るアレ「未解析パケを受信しました」と言われ、dumpデータを吐きます。

とりあえずこのような感じですね。
たぶんあってるとは思いますが間違ってたら指摘よろです。はい。
[PR]
by chronoship | 2005-08-26 22:18 | kore


<< 窓手へ放つまで・・・ GvG結果を集計しよう。 >>