死体を捜して棺おけを開く。
さて、今日は羽むしりスクリプトなので
死体に刃物を当てるという動作をどのようにやるのか順を追って説明していきます。
刃物はどうやって探せばいいのかといいますと、
前回までのZzFindでも探すことはもちろん可能です。
ですが、ダガーからブッチャーナイフまで
アイテムの種類がごまんとあり、modelを一つ一つ調べるのは大変な作業になるので
今回はスクリプト使用者に指定してもらう方法で行きます。
これも個人でちょっと遊んだりする場合にはよく使うメソッドなので
覚えておくといいでしょう。
ZzCommand().getTarget()
です、これはターゲットカーソルをだしてアイテムをターゲットすると
ターゲットしたアイテムのIDを持ってきてくれる大変便利なものです。
ZzCommand()は前回既にcmdという名前をつけたので
今回のスクリプトで使う場合は
cmd.getTarget();
となります。
もちろんあたりまえのことですがこのようにcmd.と入力できるのは
cmd = new ZzCommand();より下の行だけです。
そして、その刃物を使うので(死体を開くのと同じにダブルクリックするので)
ターゲットした刃物にも名前を付けてあげましょう。
cutter = cmd.getTarget(); (ターゲットしたアイテムのIDがcutterという入れ物の中に入る)
これで始めに一度だけ刃物ターゲットしたら後は
刃物を使いたいときには
cutter をダブルクリックするだけで何度でも使えるようになります。
ダブルクリックのやり方は覚えていますか?
cmd.doubleClick()です。そしてカッコの中にダブルクリックしたいアイテムの
IDが入っていればいいわけですから
cmd.doubleClick(cutter);
これで刃物をダブルクリックすることができるわけです。
さて、刃物をダブルクリックするだけでは意味がありませんね。
死体に刃物を当てなければいけません。
もちろんこれも操作系ですからZzCommandクラスに
そういう機能をもっているメソッドがあります。
ZzCommand().targetObject();
です。
cmd.targetObject()のカッコの中にターゲットしたいアイテムのIDを入れて使います。
そのカッコの中に前回まで散々やってきた「死体のID」をいれればいいだけですね
ということで、今回付け足すものは
cutter = cmd.getTarget(); //刃物を選択してIDをcutterという入れ物に入れる。
cmd.doubleClick(cutter); //刃物をダブルクリックする(使用する)
cmd.targetObject(死体のID); //刃物を死体にあてる
以上です。これらをUOでの操作の順番に問題がないように
間に入れていけばいいわけです。
以下にそのスクリプトを掲載しますが
まず、自分で上のそれぞれの行を自分でここだと思われる場所に
入れてみてください。
find = new ZzFind();
cmd = new ZzCommand();
cutter = cmd.getTarget();
find.find('m8198,np2');
fRes = find.result;
for ( i = 0; i < fRes.length ; i++){
&nbs;cmd.doubleClick(cutter);
&nbs;cmd.targetObject(fRes[i]);
&nbs;cmd.doubleClick(fRes[i]);
&nbs;sleep(500);
}
cmd = new ZzCommand();
cutter = cmd.getTarget();
find.find('m8198,np2');
fRes = find.result;
for ( i = 0; i < fRes.length ; i++){
&nbs;cmd.doubleClick(cutter);
&nbs;cmd.targetObject(fRes[i]);
&nbs;cmd.doubleClick(fRes[i]);
&nbs;sleep(500);
}
どうでしょうか?cutter = cmd.getTarget();は
下に2行までずれ込んでも問題ないですが
後の2行はこの場所にしか入りませんのでほぼ上のようになったかと思います。
さて、上のようにやりましたが実際に動かしてみると
ちゃんと動かない時があると思います。
以前にも説明したとおりスクリプトというのは高速で動作するのですが
高速さ故にUO上での操作が追いつかずにちゃんと動かなくなってしまう
という奴です。
今回問題なのは「刃物をダブルクリックする」のと「死体に刃物を当てる」
という所に問題があるのですがその場合はどうすればいいでしょうか?
前回同様に
sleep() で少しだけ間を空けるという方法でも全然問題ありません。
ただ、それだとラグがあった場合にちゃんと動くでしょうか?
多めに時間を取ればいいといえばそれまでですが
スクリプトの目的が
「面倒な作業を楽にしたい」のと同時に「できるだけ速く」というのも
求められている場合もあるはずです。
今回の場合はZeazyUOの最も特徴的な機能の
「刃物をダブルクリックする」と「死体に刃物を当てる」
の間に「ターゲットカーソルが出るまで待つ」という方法をとります。
この方法の利点は1秒ほどのラグがあったとしても
それまで待ってくれるのと同時に
ラグがない場合でも最も短い時間で動作してくれるという点です。
ではやってみましょう。
このようにあることができるようになるまで待つ、というのは
ZzPacketWait()
というクラスです。
さて、このクラスをオブジェクト化しましょう。
pktw = new ZzPacketWait();
そしてターゲットカーソルが出るまで待つ。というメソッドは
.waitForTarget
です。
find = new ZzFind();
cmd = new ZzCommand();
pktw = new ZzPacketWait();
cutter = cmd.getTarget();
find.find('m8198,np2');
fRes = find.result;
for ( i = 0; i < fRes.length ; i++){
&nbs;cmd.doubleClick(cutter);
&nbs;pktw.waitForTarget();
&nbs;cmd.targetObject(fRes[i]);
&nbs;cmd.doubleClick(fRes[i]);
&nbs;sleep(500);
}
cmd = new ZzCommand();
pktw = new ZzPacketWait();
cutter = cmd.getTarget();
find.find('m8198,np2');
fRes = find.result;
for ( i = 0; i < fRes.length ; i++){
&nbs;cmd.doubleClick(cutter);
&nbs;pktw.waitForTarget();
&nbs;cmd.targetObject(fRes[i]);
&nbs;cmd.doubleClick(fRes[i]);
&nbs;sleep(500);
}
これで始めに刃物を指定させてから死体を捜して
死体を見つけたら刃物をダブルクリック、して死体に当てて
棺おけを開く。というすくりぷとができました。
だんだんと行が長く読みづらくなってきたので行を空けて
少し読みやすくしてみました。
さて、4回目までやってきてどのようなものがどのような役割をしてクラスとはなにか?
構文とは何か?そもそもスクリプトを書くこととはどういうことなのか?
というようなことがだいたい感じとして分かってきたかと思います。
次回からはスクリプトの書き方に関する講釈を少しずつ減らしていきます
分からないことがあったらwikiを調べるという癖をつけていけば
今後自分で思い通りのスクリプトを書いていけるようになると思います
では
ノシ