subroutine melalui macro
kali ini kita akan membuat subroutine mengecek hiding melalui macro. anggap saja kita ingin subroutine untuk mengecek hiding 1 layar dan memberitahu nick dan koordinat orang yang hiding. maka yang pertama kita lakukan adalah, mencaritahu apakah openkore bisa membaca informasi hiding di sekitar player?
sebelum menuju lebih jauh, ada baiknya kita untuk mengetahui dasar2 cara kerja sebagian game online. game online selalu dijalankan melalui 2 alat, yaitu server dan client. apa fungsi ke dua alat tersebut? server berfungsi sebagai pusat smua informasi dari game yang sedang berjalan. sedangkan client adalah komputer yang kita gunakan untuk bermain. server akan mengirim data berupa koordinat, nick, dan lainnya kepada kita, namun hanya sebatas itu, sehingga data yang dikirim dan masuk ke server merupakan data yg kecil dan cepat pengirimannya. lalu setelah client menerima data tersebut, anggap saja koordinat, nomer rambut, job, maka client akan memproses gambarnya yang sudah disediakan di gamenya. jika server memberitahu ada swordman berambut merah di koordinat 100, 100. maka client akan membuat gambar swordman berambut merah di koordinat 100, 100 berdasarkan data dari game yang ada di komputer kita untuk di keluarkan di layar. lalu apasaja data yang dikirim melalui server ke komputer kita selama game berjalan? diantaranya adalah :
-nama player di layar kita : output berupa nama player
-job player di layar kita : untuk output berupa bentuk baju player
-level player di layar kita : untuk client memberi output berupa player aura jika lvl 99, atau 150
-senjata player di layar kita : untuk client memberi output bentuk senjata jika player sedang beraksi
-perisai player dilayar kita : untuk client memberi output bentuk perisai jika player sedang beraksi
-status player di layar kita : untuk client memunculkan efek status
-koordinat player di layar kita : untuk client menempatkan player di koordinat tertentu
dan lainnya.
data2 ini pun juga dikirim oleh server ke client openkore kita karena server menganggap openkore adalah client game juga. jadi kita dapat mengeksploitasi data2 gratis yang dikirimkan server secara cuma2 kepada openkore untuk keperluan bot. lalu sekarang kembali ke permasalahan utama, apakah server mengirim data hiding?
jawaban pertanyaan diatas adalah "iya" kenapa demikian? karena status hiding nantinya akan dipakai oleh client untuk menyembunyikan player di layar kita, namun tetap terlihat jika kita menggunakan maya purple, atau terkena status semacam oratio. jadi sekarang kita ke pertanyaan lanjutan, bagaimana cara memakai data hiding untuk mengecek hiding dengan macro?
jika kita sering menggunakan openkore dengan console command, maka kita pasti ingat, jika kita mngetik pl di console maka kita dapat melihat info 1 layar bukan? koordinat, status, job dll. karena hiding merupakan status, maka kita tinggal mencari cara membaca status player melalui openkore. karena tadi kita menggunakan command pl untuk melihat status, maka kita harus membuka folder src di openkore, dan membuka Commands.pm menggunakan wordpad, karena Commands.pm merupakan module untuk smua console command.
setelah kita membuka Commands.pm sekarang kita harus mencari subroutine yang mengurus command pl. jika kita mencari dengan teliti dibagian awal, maka kita akan menemukan baris seperti ini :
pl => \&cmdPlayerList,
yang berada di dalam hash bernama %handlers, itu menunjukan bahwa commands pl akan dilempar ke sub bernama cmdPlayeList, sekarang kita akan mengecek apa yang di lakukan di sub cmdPlayerList.
ternyata di cmdPlayerList, yang memang cukup rumit untuk membacanya, dapat kita simpulkan bahwa smua data tentang player disimpan di dalam hash, dan untuk memanggilnya menggunakan command semacam ini :
$player->{pos_to}{x} untuk melihat koordinat x
$player->{guild} untuk melihat guild
dan yang pasti kita butuhkan adalah $player->statusesString untuk melihat status player. namun disini kita harus mencari dahulu, bagaimana cara membuka $player satu persatu? ternyata $player adalah sebuah variable temporer yang digunakan sebagai penyimpan data hash dari $playersList->getItems() yang dibuka satu persatu melalui foreach. karena hampir smua module dasar berada pada Misc.pm, maka kita akan memulai sub dengan menggunakan use Misc sebagai module yang digunakan untuk membaca hash dari $playersList->getItems(), dan untuk berjaga2 selalu gunakan use strict agar jika terjadi lupa mendeclare akan di ingatkan setiap kita meload console. sehingga kita dapat menulis sub kita seperti ini sebagai permulaan.
sub cekhide{
use Misc;
use strict;
}
lalu karena kita akan mengecek player 1 layar yang disimpan di $playersList->getItems(), maka kita akan menggunakan foreach untuk membacanya baris perbaris, sehingga sub akan menjadi seperti ini
sub cekhide{
use Misc;
use strict;
foreach my $player (@{$playersList->getItems()}){
}
}
pada sub diatas dia akan menganggap $playersList->getItems() sebagai array karena kita menambahkan tanda @ didepannya sehingga dapat dibaca baris perbaris melalui variable temporer yang diberi nama $player
lalu kita akan mengecek status player yang dibaca tersebut apakah hide atau tidak? tadi diatas kita menggunakan hash $player->statusesString untuk membaca status player yang diperiksa. maka kita dapat menuliskannya seperti ini
sub cekhide{
use Misc;
use strict;
foreach my $player (@{$playersList->getItems()}){
if ($player->statusesString =~ /(Hiding|Cloaking|Chase Walk)/i){
}
}
}
lalu tinggal memberi perintah chat pada kolom if yang jika kita mengecek di Commands.pm commandnya adalah sendMessage($messageSender, $command, $arg1) yang merupakan module yang berada di Misc.pm dengan $command merupakan c untuk chat publik, g untuk guild, dll. dan $arg1 merupakan kata2nya. dan jangan lupa untuk mendeclare variable yang akan kita pakai. jadi kita bisa menuliskan sub menjadi seperti ini.
sub cekhide{
use Misc;
use strict;
my ($name, $x, $y, $arg);
foreach my $player (@{$playersList->getItems()}){
if ($player->statusesString =~ /(Hiding|Cloaking|Chase Walk)/i){
$name = $player->name;
$x = $player->{pos_to}{x};
$y = $player->{pos_to}{y};
$arg = "$name $x $y";
sendMessage($messageSender,'c', "$arg")
}
}
}
jika kita ingin subroutine mengembalikan data ke pemanggilnya berupa "no one is hiding" jika tidak ada yang hiding, dan "complete jika ada yang hide kita dapat menambahkan perintah return di akhir sehingga menjadi seperti ini.
sub cekhide{
use Misc;
use strict;
my $result = "no one is hiding";
my ($name, $x, $y, $arg);
foreach my $player (@{$playersList->getItems()}){
if ($player->statusesString =~ /(Hiding|Cloaking|Chase Walk)/i){
$result = "complete";
$name = $player->name;
$x = $player->{pos_to}{x};
$y = $player->{pos_to}{y};
$arg = "$name $x $y";
sendMessage($messageSender,'c', "$arg")
}
}
return $result;
}
selamat subroutine kita telah jadi!
subroutine sebagai trigger
untuk membuat subroutine sebagai trigger, dapat dilakukan cara2 yang sama seperti diatas, namun harus selalu me return 1 jika ingin automacro menerima trigger, dan 0 agar automacro tidak menerima trigger. kita coba jika kita ingin membuat subroutine yang memberi return 1 jika ada yang hiding. caranya sama seperti diatas. mari kita mulai dari awal sampai if statement
sub triggerhide{
use Misc;
use strict;
foreach my $player (@{$playersList->getItems()}){
if ($player->statusesString =~ /(Hiding|Cloaking|Chase Walk)/i){
}
}
}
lalu kita bisa memberikan perintah return 1 di if dan return 0 di akhir pencarian sehingga menjadi seperti ini.
sub triggerhide{
use Misc;
use strict;
foreach my $player (@{$playersList->getItems()}){
if ($player->statusesString =~ /(Hiding|Cloaking|Chase Walk)/i){
return 1;
}
}
return 0;
}
maka dia akan memberikan return 1 sebagai tanda bahwa kondisi hide telah terpenuhi, dan 0 jika tdak ada yang hiding.
menyusun macro dengan subroutine
kita sudah selesai membuat subroutine mengecek hiding sebagai trigger dan sebagai module. sekarang bagaimana menggunakannya pada macro openkore? pertama2 kita harus menulis automacro dengan trigger subroutine yang tadi sudah kita buat. yaitu dengan eval.
automacro hide {
eval main::triggerhide()
run-once 1
timeout 10
call {
}
setelah itu tinggal menulis perintah memanggil sub cekhide untuk menunjukan informasi player yang hiding. kita mungkin juga bisa memberikan kata2 sebelum mengecek untuk tanda bahwa seseorang sedang hiding.
automacro hide {
eval main::triggerhide()
run-once 1
timeout 10
call {
do c beware someone is hiding
$result = cekhide()
do c $result
}
}
maka macro mengecek hiding secara lengkap bersama dengan subroutinenya adalah seperti ini
automacro hide {
eval main::triggerhide()
run-once 1
timeout 10
call {
do c beware someone is hiding
$result = cekhide()
do c $result
}
}
sub triggerhide{
use Misc;
use strict;
foreach my $player (@{$playersList->getItems()}){
if ($player->statusesString =~ /(Hiding|Cloaking|Chase Walk)/i){
return 1;
}
}
return 0;
}
sub cekhide{
use Misc;
use strict;
my $result = "no one is hiding";
my ($name, $x, $y, $arg);
foreach my $player (@{$playersList->getItems()}){
if ($player->statusesString =~ /(Hiding|Cloaking|Chase Walk)/i){
$result = "complete";
$name = $player->name;
$x = $player->{pos_to}{x};
$y = $player->{pos_to}{y};
$arg = "$name $x $y";
sendMessage($messageSender,'c', "$arg")
}
}
return $result;
}
selamat, macro mengecek hiding anda sudah selesai!
No comments:
Post a Comment