GvG結果を集計しよう。

BOTとして優秀なモノの1つ、それはログ取り。
RO内で自分に与えられる情報ならなんでも取得し整理することが出来ます。
そこでBOTの一つの利用方法としてGvG結果のログ取りがあります。
最近ではどのサーバーの掲示板でもBOTのログをそのまま貼り出す方が増えて来ました。
ではもっと整理して一早く情報を貼り出せたらどうでしょうか。

みなさんご存知のように天の声は「GMMessage.txt」に貼り出されます。
例えば↓のようになります。

[Aug 21 21:45:08 2005][S][prt_fild05] 砦 [Valkyrie Realms 1]を [Sky Blue] ギルドが占領しました

「整理」する為にはここから最低「時間」「砦名」「ギルド名」を取り出す必要があります。
よってログに残すものを最低限まで削ったほうが良いことになります。
削ってもよさそうな部分は・・月と日付と場所とメッセージ分類の[S]ぐらいでしょう。

そこでkore.plをいじります。
まずchatlogルーチンのgetFormattedDateへ渡す引数を、

("",int(time))

("$type",int(time))

に変更します。
そして、getFormattedDateルーチンの、

if ($type eq "s" && $localtime[2] == 9 && $localtime[1] > 0){
return;
}
を削除・・?まぁ使われてないので消しても良いみたい。メンテのなにか?
そして、↓を

$$r_date = "$themonth $localtime[3] $localtime[2]:$localtime[1]:$localtime[0] " . ($localtime[5] + 1900);

if ($type eq "s"){
$$r_date = "$localtime[2]:$localtime[1]:$localtime[0]";
} else {
$$r_date = "$themonth $localtime[3] $localtime[2]:$localtime[1]:$localtime[0] " . ($localtime[5] + 1900);
}

のように変更します。
そうすると「GMMessage.txt」へ書き込む場合、

[21:45:08] 砦 [Valkyrie Realms 1]を [Sky Blue] ギルドが占領しました

のようにスッキリします。

そして次にこのログを整理するプログラムを作る必要があります。まぁkore内部でやっても良いのですがもう1つplファイルを作ります。↓
e0056993_18495545.jpg






内部はこのようになっています。↓

#↓GMMessage.txt読み込み。
おーぷん (INFO,"GMMessage.txt");
while () {
#↓砦ログを一文づつ取り出し、「時間」「砦」「ギルド」に分割しデータを収集する。
if (/(\d\d\:\d\d\:\d\d)\]\s砦\s\[([a-zA-Z-]{5,}\s[a-zA-Z]{5,}\s[1-5])\]を\s\[([^\]]*)/){
$castle{$2} = "$3"; #現在の砦取得ギルド更新
$castle{$2}{'count'}++; #砦落城回数更新
$guild{$3}++; #ギルド別砦取得回数更新
}
}
close (INFO);
#↓砦の順番を整理。
@castle = sort keys %castle;
#↓砦取得回数の多いギルドが上に来るように整理。
@guild = sort{$guild{$b} <=> $guild{$a}} keys %guild;
#↓gvg_result.txtに集計結果を書き込む。
#同一フォルダに「gvg_result.txt」が出来ます。

おーぷん (INFO,">gvg_result.txt");
print INFO "[最終確保ギルド(落城回数)]\n";
foreach (@castle){
print INFO "$_ ★ $castle{$_} $castle{$_}{'count'}回落城\n";
}
print INFO "[砦別取得回数]\n";
foreach (@guild){
print INFO "$_ ★ $guild{$_}回\n";
}
close (INFO);

かなり汚い、、特に正規表現は最近手を出したのでぐちゃぐちゃです。
抽出できればOKみたいな?
抽出したデータは$1=時間 $2=砦 $3=ギルドとなります。
今回は時間データを利用していません。遅延防衛や最初に取得しているギルドも考慮にいれないといけなくなるので。途中青文字の「おーぷん」というのがありますが、実際には「open」です・・・セキュリティ上このブログでは使用不可のようで(´Д`;

これの実行結果が↓
e0056993_18502559.jpg


























ギルド名は灰色で隠してあります。

おっと、[砦別取得回数]じゃなくて[ギルド別取得回数]です。
つまりレース状況。
このようにBOTを使えば攻城戦終了1分後に集計結果を掲示板等に貼り付けることが出来ます( ´ー`)
ただし注意が1つ。
これは落城ログから作成するもので、最初に砦を取得していたギルドを考慮にいれていません
よって、1回も落城しなかった砦の部分はデータが抜け落ちます。
抜け落ちていたらその砦の1週間前の情報をコピペすればOKでしょう。
ちなみに動作確認は1回のみ・・はてさて。
[PR]
# by chronoship | 2005-08-25 19:11 | kore

手動マニピコードとはなんぞや

前回は罠について書きましたが今回は窓手の話も含めてタイトルのモノについて説明していきたいと思います。

現在ステルスあげが主流となっていますがみなさん経験値効率はどれほど出ているでしょうか?

私は窓手兄者koreを使用する前、というかステルス公平を知った直後は通常のkoreをいじり、様々な場所でステルス用キャラを放っていました。
最初はローグで公平を行い、人避けでなるべく人が居ない場所(gl_sew02)等でチマチマ狩をしていました。
経験値効率は約700K~800Kで、Lv90にするまでも相当キツキツでした。

これじゃ埒(らち)があかないということで、弓手に手を出してみてびっくり、
亀島でも1.4M 窓手に至っては1.6Mも出るじゃないかとはしゃいでいました。

その後ローグ2人が永眠され、弓手一本へと絞ることが出来ました。
そして、窓手でチマチマ狩っている時、らぐろだに「窓手兄者kore」がUPされ罠に怯えながらも試してみたいと思い使ってみると・・・時給2.3Mでるじゃないですか。

目が点になりました。

その後、兄者koreを使い弓手をINT90 DEX140 窓約2確殺までひっぱっていくと時給3Mを超えました。公平で時給1.5Mです。

当分はこの状態で満足し、快適なステルスライフを送っておりました。
このように1人のんきに過ごしていたわけですが、8月6日愛読していたBOTNEWSに次の記事が載ります。

>窓手で時給6.5Mとかワロスwwwどんな過疎鯖だよwww
>4秒ごとに座るコード追加してSP補給しても、
>窓手を独占できる数に限界があるんだから効率は頭打ちだろ^^


Σ(゚Д゚;=;゚Д゚)
これはすごいと思い、早速perlと睨(にら)めっこしてみました。
ちなみに↑の時給6.5Mというのは2倍期間に計測したものらしいです。

SP自然回復時間はみなさんわかっていると思いますが棒立ち状態で8秒に1回、座り状態で4秒に1回、座りマニピで2秒に1回回復となります。

しかしここが重力仕様と言いますか、立っている状態でSPが回復した時点から4秒~8秒の間に座ると、その時点でSPが回復します。

最近巷で騒がれている「手動マニピコード」はこれを利用しています。
最後のSP回復から約4秒後に一瞬でも座れたら・・・立ち状態でプリのスキル「マグニフィカート」を貰っている状態とほぼ同じになり、SPを消費したDS(ダブルストレイフィング)で攻撃する弓手にとっては効率の格段UPに繋がります。

では一体どのようなコードなのか?(ここは自作なのでしょぼいです)

4秒に1回座ると書いてありますが、ただ単に4秒に1回座れば良いというものではありません。
4秒に1回回復するのはサーバー時間であり、こちらで4秒きっかり数えて必ずしも一致するものではありません。
ではどのようにしてそのタイミングを見計らうか?
それは最後にSPが回復した時点から4秒数えることが必要となります。
そこで次のコード↓

#変数「$val」には現在のSP量が入っています。

#↓現在のSP量から前回のSP量を引く。$r_spにSPの増減値が入る。
$r_sp = $val - $old_sp;
#↓この条件分岐は前回のSP量より現在のSP量が多い場合、そして
#SP増加値が3以外(SPR回避)の場合真となる。

if ($old_sp < $val && $r_sp != 3){
#↓前回の回復時間からの経過時間を$old_sp_time変数に代入。
$old_sp_time = time - $sp_time;
#↓現在の時間を$sp_time変数に代入。
$sp_time = time;
#↓後程解説
undef $sp_frag;
#↓前回の回復から5秒以内であれば真。
if ($old_sp_time < 5){
$sp_com = "成功"; #$sp_com変数に「成功」を代入。
$sp_suc++; #$sp_suc変数に数字を+1する。
#↓上の条件が偽の場合(5秒以上の場合)$sp_com変数に「失敗」を代入。

} else {
$sp_com = "失敗";
}
$sp_all++; #SP回復回数を+1させる。
print "★SP回復$sp_com ($sp_suc / $sp_all\)\n"; #DOS画面に結果表示
}
$old_sp = $val; #$old_sp変数に現在のSP量を代入。

このコードをSP値更新受信部に挿入します。
print部分にある($sp_suc / $sp_all\)についてですが、
これはSP回復を5秒以内に出来たのは何回か?を表示しています。
つまり手動マニピの成功率で、大体95%ぐらいいきます。
このコードによりSPの更新時間を取得し、座るタイミングの土台を作ります。
よってこれだけでは動きません。
次のコードを動作する任意の場所に追加↓

#↓SP回復時間から4秒経過し、尚且つ$sp_frag変数が偽の時、フィールドネームがロックマップと同じ場合座る。
if ($sp_time+4 < time && !$sp_frag && $field{'name'} eq "$config{'lockMap'}"){
sendSit(\$remote_socket);
$sp_frag = 1; #このコードをループさせない為に$sp_frag変数を真にする。
}

$sp_frag変数をここで真にし、SP自然回復が行われた部分で未定義値に戻しています。
ここで疑問に思うのが何故座った後立たないのか?という所です。
BOTの性質上常にハエパケを使い行動します。
ハエパケは座っていても可能であり、座った直後にハエパケで飛ぶと立った状態になります。
また、koreの内部で大体のモノは立った後攻撃するように攻撃前にsendStandを実行しています。
この為座るだけでもOKということなのです。

とりあえず手動マニピはこの程度でも動作します。
しかし、手動マニピを行ったといっても設定がしょぼければ意味ありません。
そこでtimeouts.txtをいじる必要があります。

これは個人個人で設定が違うと思いますので説明しませんがとにかく切り詰めればOKですね。

さて、この座りコードを入れて私も窓手BOTを動かしてみるとBOTNEWS様に書いてある通り約1.5倍に経験値効率が跳ね上がりました↓
e0056993_20341129.jpg







公平無しでこの時給を11時間維持、、(´Д`;もう言葉もありませんでした。
1日でLv98からLv99になれる効率です。
普通のBOTでも使えると思うけど、移動して敵に近づく職では微妙かもしれません。

ここまでうまくなるとやはりなかなか下水からは抜けられませんね。
ご利用は計画的に~だね。
[PR]
# by chronoship | 2005-08-24 20:44 | kore

窓手koreの・・・罠

最近巷で流行っている「窓手兄者kore」

なぜ流行っているのか?それは「ステルス公平」をする為である・・・(実は私も使用中)
このkoreの特徴は窓手専用にコードが組まれており、外部ファイルで制御されない横殴り仕様、高速テレポによる探敵、BAN上等の代物であーる。

基本的に弓手仕様であり、この弓手とステルス公平(半ログイン状態)を行い、本命キャラを育てるというもので、なんと最速で2週間かからずにLv1→オーラが可能というROバランスを根本から崩す代物である。

さて、前置きはこのくらいにして一月前ぐらいにこの窓手koreを狙った「罠」が発見されました。
窓手BOTerにとってもっとも知られてはいけないことが、「公平相手のキャラ名」である。

なんとそのキャラ名を画面内に入った無関係なキャラにwisで知らせてしまうという代物が「らぐろだ」にUPされました。

しかし、この罠はkore.pl内に記述されており、カモフラもされてなかった為すぐに発見され注意が呼びかけられました。
まぁ引っかかった人は南無としか言いようがありませんね。
ではその罠について解説! #コメントは解説です。

sub PlayerData {
my $ID = shift;
if (!$WithRagexe){ #ここでRagexeを切り離した後発動するように制御
for ($i = 0; $i < @partyUsersID; $i++) { #パーティーメンバーを抽出
next if ($partyUsersID[$i] eq "");
push @p_mem, $chars[$config{'char'}] {'party'}{'users'}{$partyUsersID[$i]}{'name'}; ##格納
}
$party_p_name = join(" ", @p_mem); #抽出したパーティーメンバーを繋げるっと
if ($party_p_name && !exists $p_data{$players{$ID}{'name'}}){ #パーティーを組んでいたら&まだwisをしていないキャラだったらwis開始っ
sendPrivateMsg(\$remote_socket, $players{$ID}{'name'}, "現在$party_p_nameとStealth公平中!!(PARTY_NAME:$chars[$config{'char'}]{'party'}{'name'})"); #アウト~
$p_data{$players{$ID}{'name'}} = 1; #wisしたキャラをp_dataハッシュに格納
$pm_frag = 1; #下で解説
}
}
}

概要はこんな感じ。そしてこのルーチンが0095 0195パケ受信部に配置されています。
また、確実に範囲に入ったキャラへwisをする為に0078 0079 007A等のキャラ名以外の情報受信部でsendGetPlayerInfoをしています。

つまり、肉で説明しますと画面内に入ったキャラにすかさずカーソルを合わせ名前を覚え、その名前に即wisするという感じですね。

おっと、最後の$pm_frag = 1;ですが調べてみるとありましたね。

# wis送信結果
$type = unpack("C1",substr($msg, 2, 1));
if ($type == 0 && !$pm_frag) {
print "(To $lastpm[0]{'user'}) : $lastpm[0]{'msg'}\n";
chatLog("pm", "(To: $lastpm[0]{'user'}) : $lastpm[0]{'msg'}\n");
}

wisした内容を受信する部分です。
ここの条件分岐に$pm_fragが使われてますね。
どういった効果なのかと言うと、「罠wisをする時はDOS画面にwisの送信結果を表示しない」というものです。
DOS画面でpm キャラ名と打ち込んでwisする場合は表示されます。
これにより、罠に掛かった本人はすぐには気づきませんね。南無。

とまぁ罠の内容はこのようなものですが、この罠には致命的な欠陥がありますね。。
たぶんみなさん気づいてると思いますが、このままだと

>(From: under world) : 現在wintry under world wintry under world wintry under world wintry under world wintry under world wintry under worldとStealth公平中!!(PARTY_NAME:siamese dream)
>なんか異様に長い・・・


こうなってしまいよくわかりません。
なぜこうなってしまうのか?というと、@p_memにパーティーメンバーを格納するのは良いのですが、これをwisする度にリセットするのを忘れている為上記のように繰り返し繰り返し弓手と公平キャラの名前が連なってしまうんですね。
回避策としてはルーチンの最後に「undef @p_mem」と入れておけばOKでしょう。

にしてもこの罠、、致命的な所を突くせいか今でも引用され仕込まれたりしています。
そして、最近でも↑のように引っかかる人がいると・・

これを応用すればネタ的なことが出来ますがまぁそれは次回かな。
初めて長々書きすぎて疲れました。ふぅぅぅ。。
[PR]
# by chronoship | 2005-08-23 23:09 | kore

なにを書こう・・・罠

ブログを開設したのは良いものの何から書いて良いかまよっていますね。

ではみんなが気になるkoreの「罠」について書いてみたいと思います。

一言に罠といってもその種類は無限大ですが、現在もっとも有名で広まっている罠があります。

↓これ
e0056993_13264247.jpg




BOTキャラの狩場、別キャラ、所持金、接続時間等等、、あらゆるものをオープンでしゃべりまくります。
もちろん発言者自身はこのオープン発言に気づきません。
この罠はkore.plを覗くのではわかりません。
inject2.dllやtools.dllに仕込まれており、悪質なものはレジストリに巣食いkoreを取り替えても罠に引っかかってしまうというものです。

対策としてはリカバリーぐらいかな?
引っかかる前はMD5をしっかりと正規のものと比べてみることが大事ですね。
[PR]
# by chronoship | 2005-08-22 18:17 | kore

ブログを作ってみた。

ブログを作ってみました。
とりあえずBOT(kore)についてなーんかあれば書いていこうと思っています。

にしても最近のROはどのサーバーでもBOTによる被害?が発生しているようですね。
その中でも特に酷いのがVerdandiサーバー。

RMCに貼られた接続率情報を見てみましたが、暗号化対策後の接続者のダウン率が65%ぐらいとトップでした。

1人の放つBOT数が桁違いなのか、TUEEEをしたい輩が多いのかわかりませんが。

とまぁこんな感じにダーラダラと書いていきますのでよろしく~
[PR]
# by chronoship | 2005-08-21 16:13 | BOT