Setelah membuat Ragnarok Online mu sendiri, dan selesai implementasi beberapa NPC, kamu biasanya akan merasa kurang puas, apalagi jika pernah bermain PSRO buatan orang lain. Kamu ingin meniru fitur yang ada pada private server lain, atau ingin membuat fitur sendiri.
Script NPC pada Ragnarok private server biasanya menggunakan bahasa pemrograman C. dan variable nya dapat kamu cek folder doc di dalam file script_commands.txt pada masing-masing emulator. Atau kamu bisa mencontek dari script yang sudah ada dan memofikasi sendiri script tersebut. Seperti misalnya NPC healer di Inn, biasanya hanya memberikan HP full setelah kamu membayar sejumlah zeny, kamu bisa menambah efeknya, selain membuat HP karakter penuh, karakter akan mendapatkan buff seperti Increase AGI dan Blessing.
Membuat NPC tergantung pada kebutuhan kamu, untuk membuat npc seperti Warper kamu bisa mencontek NPC Kafra dan mengcopy paste untuk area tambahan yang kamu inginkan, namun untuk membuat NPC Buffer, kamu harus melihat command script skill yang akan digunakan. Intinya membuat NPC itu bisa saja sederhana, tapi bisa jadi sulit, tergantung dari basic pemrograman yang kamu pelajari.
Dalam membuat NPC, yang biasanya kita cari pertama kali adalah kordinat lokasi NPC nya akan dipasang dengan menggunakan /where pada kotak chat, lalu kemudian mencari Sprite nya. Lalu menggunakan format seperti diberikut :
mapname,x,y,z[tab]script[tab]NPCname[tab]NPC_ID,{
Note:
Mapname = nama map
x,y = koordinat x dan y npc
z = arah npc menghadap, menggunakan angka dari 0 - 8 tidak searah jam
[tab] = tabulasi/break, harus menggunakan tombol Tab pada keyboard.
script = variable yang menunjukan kalau ini adalah script
NPCname = nama NPC (Bebas)
NPC_ID = ID Sprite NPC yang akan digunakan, tidak bisa menggunakan sprite Job, dan tidak disarankan menggunakan ID Sprite monster.
tanda } dan { digunakan sebagai pembuka dan penutup script (maaf saya tidak tahu istilah bener nya di pemrograman)
Untuk mencari sprite NPC yang kamu ingin pakai, kamu bisa melihat web http://nn.ai4rei.net/dev/npclist/?qq=8.
NOTE: jika NPC yang kamu mau tidak muncul pada saat reloadscript, artinya GRF yang kamu pakai tidak support NPC tersebut.
Berikut akan saya ajakarkan membuat beberapa NPC sederhana, yaitu NPC Warper, NPC Buffer, dan NPC Quest. Untuk mempermudah pekerjaan mu. Gunakan Notepad++ dan rubah Languages menjadi C.
A) NPC Warper
Kebanyakan Ragnarok private server di Indonesia, membuat ruang khusus seperti Vending Room atau Zeny Room untuk memudahkan playernya bermain. berikut kita akan buat npc yang mirip dengan situasi tersebut. yang pertama kali kamu butuhkan adalah
1. Catat kordinat NPC Warper
2. Tentukan NPC yang akan dipakai
3. Tentukan Nama NPC
4. Catat kordinat target map yang dituju saat karakter diwarp.
Disini saya akan menggunakan map prontera untuk lokasi NPC, map morroc sebagai map tujuan warp, dan menggunakan npc Kafra (117).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | prontera,162,191,5 script NPC Warper 117,{ mes "[Warper NPC]"; mes "Halo, Apakah kamu mau pindah ke ruang khusus?" next; menu "Pindah",pindahmap,"Tidak, terima kasih",Notmove; pindahmap: warp "morocc",159,91; end; Notmove: mes "[Warper NPC]"; mes "Silahkan kembali lagi jika kamu ingin menggunakan service kami"; close; } |
NOTE : Urutan angka disebelah kiri hanya berfungsi sebagai urutan, tidak perlu diketik!
Pada contoh script diatas, saat kamu mengklik NPC tersebut, maka akan keluar dialog box yang menanyakan apakah kamu akan menggunakan fitur NPC ini. Penggunaan next berfungsi agar dialog NPC tidak memanjang kebawah, sehingga mudah untuk dibaca. Next didalam game berupa tombol bertuliskan next (atau lanjut di idRO) yang dapat player klik.
Menu berfungsi untuk memunculkan opsi yang dapat di pilih oleh player. Pada bahasa pemrograman ini merupakan suatu logic yang biasa, dimana setelah kamu mengklik salah satu opsi, biasanya akan jump atau lompat ke tag option tersebut, pada case diatas, jika kamu memilih Pindah, maka script akan mencari tag pindahmap kemudian memproses script selanjutnya yaitu warp ke map morroc. Menu adalah bentuk sederhana untuk membuat opsi pilihan, selain menggunakan menu, biasanya bisa menggunakan switch, akan saya beri contoh pada script selanjutnya.
Untuk menutup dialog NPC, biasanya kita akan mengklik tombol close, untuk itu diperlukan perintah close. namun jika kamu menggunakannya pada saat warp, tentu akan tidak nyaman jika player yang berpindah tempat harus mengklik tombol close terlebih dahulu, maka itu digunakan perintah end. Perintah end akan otomatis menutup/mengakhiri percakapan dengan NPC.
Simpan dengan nama file misalnya testwarper.txt
B) NPC Buffer
Tidak lengkap rasanya jika sebuah private server tidak ada NPC Buffer yang memudahkan player dalam bermain, walau banyak juga server yang meniadakan fitur ini dengan alasan membunuh job Healer/Buffer seperti Priest.
Berbeda dengan NPC Warper yang bisa kamu contek dari Portal dan Kafra, Buffer tidak dapat ditemukan di official server, tapi mari kita lihat NPC healer di dalam Inn pada folder npc/merchants.txt, karena prontera agak ribet pake function, kita ambil contoh Lighthalzen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | lhz_in02,230,284,4 script Hotel Employee#01 4_M_04,{ mes "[Hotel Employee]"; mes "Welcome to"; mes "the Royal Dragon,"; mes "where you can find the"; mes "finest accomodations"; mes "and the best service."; next; switch(select("Save Point", "Rest - 5,000 zeny", "Cancel")) { case 1: savepoint "lhz_in02",209,275; mes "[Hotel Employee]"; mes "Thank you, your"; mes "Respawn Point has"; mes "been saved here in"; mes "the Royal Dragon."; close; case 2: if(Zeny < 5000) { mes "[Hotel Employee]"; mes "I'm sorry, but"; mes "you need 5,000 zeny"; mes "in order to check in."; close; } Zeny -= 5000; mes "[Hotel Employee]"; mes "Thank you~"; mes "I hope you enjoy"; mes "your stay in the"; mes "Royal Dragon."; close2; warp "lhz_in02",219,150; percentheal 100,100; npcskill "AL_BLESSING",10,99,99; end; case 3: mes "[Hotel Employee]"; mes "Thank you and"; mes "have a nice day."; close; } } |
Pada baris 34, terdapat fungsi percentheal 100,100 yang berarti memulihkan HP dan SP player sebanyak 100%, lalu pada baris 35, ada perintah npcskill AL_BLESSING, walau hanya berfungsi sebagai efek, tapi dari sini kita tahu kalau skill karakter bisa di aplikasikan ke script. Ada dua perintah yang biasa digunakan pada NPC buffer selain percentheal yaitu sc_start dan sc_end. sc_start digunakan untuk buff seperti Increase Agi dan Blessing, sc_end digunakan untuk debuff seperti poison dan silence.
Sebagai acuan untuk mencari nama skill yang ingin digunakan, kamu bisa membuka constants.conf pada folder db. Perintah yang bisa digunakan menggunakan awalan SC_.
Disini saya menggunakan map prontera dan kode NPC 919, dan membuat NPC buffer yang memberikan Increase AGI dan Blessing, dan menghilangkan efek poison, silence, dan hallucination.
efek buff dari Increase AGI dan Blessing akan aktif selama 10 menit.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | prontera,159,191,5 script Healer 919,{ mes "[Healer]"; mes "Halo, apakah kamu ingin menggunakan fasilitas ini ?"; next; switch(select("Berikan Buff!","Tidak jadi.")) { case 1: mes "[Healer]"; mes "Terima kasih sudah menggunakan fasilitas ini"; next; percentheal 100,100; sc_end SC_Poison; sc_end SC_Silence; sc_end SC_Hallucination; sc_start SC_BLESSING,600000,10; sc_start SC_INCREASEAGI,600000,10; //sc_start SC_IMPOSITIO,360000,5; skilleffect 34,0; end; case 2: mes "[Healer]"; mes "Baik, sampai jumpa lagi"; close; } } |
Disini saya menggunakan perintah switch sebagai pengganti menu, dimana cara ini lebih simpel, namun terkadang jika optionnya terlalu banyak, kamu akan sedikit kesulitan saat mencari masing-masing relasi antar opsi. Tapi tidak ada salah nya dipelajari, karena perintah switch banyak ditemui di bahasa pemrograman lain.
1 2 3 4 5 6 7 8 9 10 11 | switch(select("opsi1","opsi2","opsi3") { case 1: mes "Hello World !"; close; case 2: mes "Hello World !"; close; case 3: mes "Hello World !"; close; } |
Cara menggunakan switch, perhatikan contoh diatas, setelah masuk perintah switch, terdapat perintah select untuk membuat opsi, lalu didalam kurung sebelah kanan adalah pilihan opsi nya. Berbeda dengan menggunakan menu, kita tidak perlu lagi mengetik jump tag nya. Sebagai pengganti jump tag, digunakan case sebagai cabang dari switch select yang digunakan, urutan case bedasarkan urutan opsi yang ada didalam kurung. seperti pada contoh diatas saya menggunakan dua opsi, jadi saya menggunakan dua case. Perhatikan tag }{, jangan lupa ditutup.
Oke kembali pada script buff, saya menggunakan sc_end untuk menghapus negative status poison, silence, dan hallucination. dan menggunakan sc_start untuk memberikan positif buff yaitu Blessing dan Increase AGI, dan tentu saja HP dan SP penuh kembali.
Pada sc_start, value ke dua setelah skill, adalah durasi efek dari status yang diberikan (dalam milisekon) karena saya ingin mengaktifkannya selama 10 menit, maka value yang saya masukan adalah 600.000 milisekon, dan value terakhir adalah LV skill. Klo ga salah inget, level skill yang melebihi level yang seharusnya, nanti akan muncul error di map-server. Biasanya sering terjadi ketika kita mengcopy paste perintah yang sama, namun hanya merubah nama skillnya, jadi lebih baik masukan level yang sesuai agar tidak repot bolak balik merevisi script tersebut.
Perhatikan pula baris 16, saya menggunakan tanda garis miring 2x, tanda ini digunakan, agar sistem mengabaikan perintah tersebut (disable). Pada baris tersebut saya menambahkan skill Imposito Magnus, namun, saya tidak ingin menggunakannya, jadi saya disable. tanda garis miring 2x berguna agar kita bisa mengedit dengan mudah tanpa harus bolak balik mengetik dan menghapus perintah.
NOTE : Perintah ini juga ditemukan pada configurasi script custom.
Simpan file ini dengan nama misalnya testbuffer.txt
Pada Ragnarok Online, terdapat NPC Quest untuk membuat headgear. Biasanya pada private server, quest nya dibuat lebih mudah, atau headgear yang digunakan tidak ada di official server (custom headgear). Untuk membuat headgear, biasanya player diharuskan membawa beberapa item, kadang zeny, dan setelah terkumpul, NPC akan memberikan headgear tersebut.
Pada script quest seperti ini, biasanya akan menggunakan perintah countitem yang dibutuhkan dan deleteitem untuk menghapus item yang dikumpulkan agar tidak terjadi looping/abuse.
Disini saya akan membuat contoh untuk membuat sebuah Pipe dengan menggunakan 10 Jellopy, 20 Scell, dan zeny sejumlah 10.000.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | geffen,40,125,6 script Pipe Maker 951,{ mes "[Maker]"; mes "Halo, saya bisa membuatkan kamu Pipe, apakah kamu tertarik ?"; next; switch(select("Bahan yang diperlukan?","Sudah punya bahannya","Lain kali.")){ case 1: mes "[Maker]"; mes "Bawakan barang-barang ini :"; mes "10 Jellopy"; mes "20 Scell"; mes "dan 10.000 Zeny"; close; case 2: mes "[Maker]"; mes "Sebentar, dicek terlebih dahulu"; next; if (countitem(909)<10 || countitem(911)<20 || zeny<10000) { mes "[Maker]"; mes "Maaf, kamu belum memenuhi syarat"; next; mes "[Maker]"; mes "Bawakan barang-barang ini :"; mes "10 Jellopy"; mes "20 Scell"; mes "dan 10.000 Zeny"; close; } delitem 909,10; //Jellopy delitem 911,20; //Scell set zeny,zeny-10000; mes "[Maker]"; mes "Sudah kuperiksa, kamu memenuhi syarat."; next; mes "[Maker]"; mes "Silahkan datang kembali jika kamu ingin membuatnya lagi."; getitem 2268,1; // Pipe close; case 3: mes "[Maker]"; mes "Oke, bicaralah kepadaku lagi jika kamu berubah pikiran"; close; } } |
NOTE : Tanda || pada pembatas countitem (mirip huruf I besar) berada diatas tombol enter sambil menekan tombol SHIFT.
Agar quest ini tidak bolak balik, kita buat menjadi tiga opsi/case, yaitu :
Pada option 1, kamu cukup membuat percakapan untuk menjelaskan bahan-bahan yang diperlukan untuk membuat item yang diinginkan.
Pada option 2, NPC memproses bahan yang dibawa player, dimulai dengan pengecekan menggunakan perintah if dan countitem(kodeitem) dan memberikan statement jikalau barang yang diperlukan kurang. Setelah bahan yang dikumpulkan sesuai, maka NPC harus menghapus bahan-bahan tersebut dengan menggunakan delitem, jumlahitem.
Untuk pengecekan zeny cukup gunakan zeny < jumlahzeny, dan untuk mengurangi zeny pada player, gunakan perintah set zeny, zeny -jumlahzeny (jangan lupa tanda minus/kurang). Setelah itu, NPC harus memberikan Item yang dijanjikan, dengan menggunakan perintah getitem (kodeitem),jumlah item.
NOTE : tanda garis miring 2x digunakan sebagai reminder dan pengecekan, karena jumlah item sangat banyak. Kamu bisa menggunakan nama item, tapi lebih baik menggunakan kode ID nya saja.
Pada option 3, digunakan untuk opsi player yang ingin menghentikan dialog dengan NPC.
Sampai disini, simpan dengan file misalnya testquest.txt
Sekarang kamu punya tiga file npc yaitu, testwarper, testbuffer, dan testquest, jangan lupa untuk menambahkannya kedalam config script mu. Buka folder npc dan buka file script_custom.conf dengan Notepad++. Formatnya adalah npc: folder/tempat/file/namafile seperti contoh dibawah, saya menyimpan file nya pada folder npc/custom/
1 2 3 | npc: npc/custom/testwarper.txt npc: npc/custom/testbuffer.txt npc: npc/custom/testquest.txt |
Setelah disimpan, ketiga script tersebut akan diload setiap kali map-server distart. Untuk memunculkan langsung npc tersebut, kamu bisa menggunakan perintah @loadnpc, misalnya :
@loadnpc npc/custom/testwarper.txt
untuk mematikannya, kamu harus mendisable script tersebut dengan menggunakan garis miring 2x pada script_custom.conf dan kemudian gunakan @reloadscript. atau kamu bisa langsung menuju NPC tersebut, Klik kanan lalu Kill NPC (harus menggunakan ID GM yang tersimpan di clientinfo.xml didalam folder data). atau kamu juga bisa menggunakan perintah @unloadnpcfile, misalnya :
@unloadnpcfile npc/custom/testwarper.txt
NOTE : Command bisa berbeda pada masing-masing emulator.
Sampai disini, selesai tutorial membuat NPC sederhana, jika kamu ingin mencoba untuk membuat script lain, kamu bisa melihat-lihat script yang sudah ada dan mempelajari cara kerjanya. Semoga Berhasil !
1 komentar:
kak, cara menjelaskan sangat baik, saya suka, apa ada cara untuk menghubungi kakak, berhubungan dengan tutorial ragnarok semacam ini
Posting Komentar