MasamuneDate

[CS 1.6] COD:MW Extended Scripting Basic, Guide & Tips by TYR / MasamuneDate

Mar 31st, 2022 (edited)
383
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 51.27 KB | None | 0 0
  1. 101 Basic, HOW TO CODE COD CLASS / PERK - By TYR also known as MasamuneDate
  2. Steam : https://steamcommunity.com/id/MasamuneDate901/
  3. Github : https://github.com/MasamuneDate99/Cs-1.6-COD-MW-Mod ( Your toy box )
  4. Discord : TYR#1759
  5.  
  6. *Disclaimer : Guide ini dibuat berdasarkan pengalaman pribadi dari author ( TYR ) bekerja dengan AMXX Studio dan PAWN Language untuk mod COD : MW Extended. Guide ini dibuat untuk yang membantu yang tidak mengerti pemrograman sama sekali dan membantu mereka yang ingin mencoba membuat Class / Perk baru untuk mod COD : MW Extended.
  7.  
  8. **Disclaimer : Waktu gua pertama kali jadi Dev di COD:MW, gua bener2 zero clue dan ga ngerti sama sekali sama pemrograman. Gua belajar semua secara otoditak, dari ngecek code orang lain, dan bertanya di forum. Thank you untuk para sepuh di forum amxx.pl dan Eki yang ngebantu gua waktu gua masi tanya2 dan bingung ama bug / error dimana dari code gua.
  9.  
  10. ***Disclaimer : All plugin yang ada di Github gua diatas semua FREE PLUGIN, yang bisa lu dapetin di amxx.pl.
  11.  
  12. ****Disclaimer : Guide Inggris lebih bagus kontennya, gara2 gua pake guide ini buat nge revisi kata2 / konten yang kurang bagus / gua permak lagi. Guide inggris : https://pastebin.com/0BrWeXeC
  13.  
  14. //////////////////////////////////////////////////////////////////////////////////////////
  15. Update List ( Last Update : 5/18/2022 ) :
  16. - Fixed some note on the guide
  17. - Add explanation di section Function ( Apa itu parameter )
  18. - Fixed some mispelled, cleaning ( dikit )
  19. - Add readmme note
  20.  
  21. Update List ( Last Update : 5/15/2022 ) :
  22. - Editted I.D Compiler Section
  23.  
  24. Update List ( Last Update : 4/6/2022 ) :
  25. - Finish the Guide
  26.  
  27. Update List ( Last Update : 4/5/2022 ) :
  28. - Add Translator Readme
  29. - Fix mis-guide tentang Cod Documentation
  30. - Updated Advanced Lesson ( 9 / 11 ) ( Lupa update kemarin )
  31.  
  32. Update List ( Last update : 4/4/2022 ) :
  33. - Merge Stat & Get Stat jadi 1 sub-topic
  34. - Merge Give & Take Weapon + Get Weapon jadi 1 sub topic
  35. - Update Title
  36.  
  37. Update List ( Last update : 4/3/2022 ) :
  38. - Done rework Chapter I - III
  39. - Update Readme
  40. - Update Advanced Lesson ( 5 / 13 Finished )
  41. - Delete Side Noted
  42. - Delete Referensi, Compiler & AMXX Studio
  43. - Deleted Scripting Material ( Pindah ke Github )
  44. //////////////////////////////////////////////////////////////////////////////////////////
  45.  
  46. Sebelum membaca guide, BACA README DULU WOI !!!!!!!!!!!
  47.  
  48. //////////////////////////////////////////////////////////////////////////////////////////
  49. README
  50. Sebelum memulai membaca Guide / Tutorial berikut, terdapat beberapa link yang mungkin berguna buat di baca / di lihat - lihat nantinya.
  51. ** AMX Mod X Documentation              : https://www.amxmodx.org/doc/
  52. ** AMX Mod X Plugin API Documentation   : https://www.amxmodx.org/api/
  53. ** CoD Mod Documentation                : https://codmod_ozone.amxx.pl/cod ( Note, ini cod.inc bukan codmod.inc, agak beda, tapi bisa di pake untuk referensi karena codmod cuma kayak "Improvement" dari cod.inc mod yang lama )
  54. ** CoD MW Github by TYR                 : https://github.com/MasamuneDate99/Cs-1.6-COD-MW-Mod
  55. ** AMXX Compiler.rar                    : https://drive.google.com/file/d/1tTk1vbOfLnrB6IE8IKUKrY8L_5WU4bxN/view?usp=sharing  ( Uda ada di Github gua juga si )
  56. ** AMXX Studio                          : https://drive.google.com/file/d/12E1Lhu2UReVOiX8kp1eMFBpOmV8qwYAn/view?usp=sharing
  57. ** Class Generator ( Kadang Guna )      : https://amxx.pl/generator-klas/
  58. ** Translator ( Drpd Google Translate ) : https://www.deepl.com/
  59. ** CS 1.6 Weapon Code                   : https://forums.alliedmods.net/archive/index.php/t-59003.html
  60. ** English Guide                        : https://pastebin.com/0BrWeXeC
  61.  
  62. ** NOTE : Kalo masi bingung setelah liat documentation, buka aja file include di folder compilernya. Liat aja di codmod ama amxx .inc nya, ada penjelasan lagi disana. Untuk codmod.inc, jangan lupa pake google translate untuk bahasa Polish.
  63. //////////////////////////////////////////////////////////////////////////////////////////
  64.  
  65. ** Table of Content
  66.     * Search aja keyword dan sub-bab yang ada di Table Of Content untuk navigasi.
  67.     1. Basic Knowledge Scripting ( Very Basic )
  68.         I.A - Public Knowledge
  69.         I.B - Library & Dependency
  70.         I.C - Include
  71.         I.D - Compiler
  72.         I.E - Integrated Development Environment
  73.     2. Class Parameter
  74.         II.A - Data Types ( Number, Char, Boolean )
  75.         II.B - COD "Required" Parameter
  76.         II.C - Parameter Explanation
  77.     3. Initializing Fuction & Enabling Task / Function
  78.         III.A - Function
  79.         III.B - Custom Task / Function
  80.         III.C - Initializing Function ( "Main" Function )
  81.         III.D - Enabling / Disabling Class & Perk
  82.     4. Advanced Lesson
  83.         IV.A - Random Number Generator
  84.         IV.B - Define
  85.         IV.C - Logical Statement ( If, Else, And, Or )
  86.         IV.D - Loading Bar & Class Skill Function ( For Skill )
  87.         IV.E - Access Restriction
  88.         IV.F - Importing Custom Model & Sound ( W/ Precaching )
  89.         IV.G - Stat on Class & Perk + Get Stat Function     // Part of "Cod Function"
  90.         IV.H - Giving & Taking Weapon + Get User Wpn        // Part of "Cod Function"
  91.         IV.I - "Porting" Plugin
  92.         IV.J - Native CS Include & Function ( only the one i use on Cod ) ( Color Chat, Visibility )
  93.         IV.K - Debugging
  94.         IV.L - More ?
  95. ** End of Table of Content
  96.  
  97. I. Chapter I : Include
  98.     Selamat datang ke Chapter Pertama dari guide COD : MW yang gua buat ! Pertama - tama, mari kita lihat note dibawah berikut ini ya, kemudian mari langsung aja kita masuk ke sub-bab pertama kita.
  99.  
  100. *Note : Jika anda sudah pernah Scripting di CS 1.6 dan pernah belajar Pemrograman, Chapter 1 dapat di skip
  101.  
  102. I.A Public Knowledge
  103.     CS 1.6 Modding di dasarkan pada IDE ( Integrated Development Environment ) AMXX Studio. Dimana, CS 1.6 menggunakan bahasa PAWN Language untuk menjalankan Scripting yang telah dibuat. Script yang dibuat menggunakan bahasa PAWN ini mirip sekali dengan bahasa C Programming Language, yang dapat dijadikan dasar ketika kalian ingin mencoba.
  104.  
  105.     Oh iya, sebelum memulai coding ada beberapa hal yang pengen gua ingetin. Karena ada beberapa, gua jadiin list poin - poin aja sebagai berikut :
  106. * Ketika namain Variable / Function, pastikan nama jelas, misal : public bonus_Damage(){}. Tujuan dari penamaan yang jelas ini membuat kita lebih mudah me-maintanance code sewaktu - waktu butuh di update, dan memudahkan pencarian. Jangan ikutin kesalahan gua waktu gua Scripting, dulu gua blom tau Code Smell, kerjain masih berantakan dan ga rapih.
  107. * Selalu akhiri line dengan semi kolon ; < sebuah syarat WAJIB untuk bahasa PAWN, kalo ga ada semi kolon, nanti bakal error ketika di compile.
  108. * Jangan berikan spasi di nama. Ketika memberikan nama baik untuk function atapun variable, jangan pernah memberikan spasi karena bakal error. Entah gabung kalimatnya atau pisahkan dengan tanda _ atau apapun selain spasi. Contoh : new bool: classId[], new const hp_bonus, dan sebagainya
  109. * JANGAN PERNAH, MENGAMBIL KERJAAN ORANG LAIN, DAN CUMA RENAME DI PLUGIN NAME, AMA NAMA AUTHOR, LU ORANG PALING BAJINGAN KALO LU LAKUIN KAYAK GITU, KALO PAKE CLASS / PLUGIN ORANG, JANGAN DI GANTI, BIARIN CREDIT NYA TETEP KE ORANG YANG NGE BUAT
  110. * PAWN Language menggunakan sistem Prosedural dalam menjalankan Code nya, yang berarti Code akan dibaca dari Atas ke Bawah
  111.    
  112. I.B Library & Dependency
  113.     Apa itu Library dan apa itu Dependency ? Mengapa itu penting dengan kegiatan Scripting dan modding kita ? Library adalah kumpulan dari fungsi - fungsi atau kumpulan dari action yang dapat atau perlu kita gunakan didalam kegiatan scripting kita ( Yang dibuat sedemikian rupa sehingga menjadi seperti kamus / kumpulan dari fungsi yang dapat dipanggil langsung untuk membantu kita ). Nah sementara Dependency adalah Library yang telah kita masukan ke project kita, dan kemudian kita gunakan, barulah library yang ada disebut dependancy.
  114.  
  115. I.C Include
  116.     Nah, kita telah belajar mengenai Library dan Dependancy pada sub-bab di atas, sekarang waktunya kita belajar apa itu include. Include disini berhubungan erat dengan Library dan Dependancy yang telah kita bahas di atas. Bagaimana cara kita meng-import external Library untuk kita gunakan pada Script code kita ? Kita harus meng-INCLUDE terlebih dahulu pada kode Script kita.
  117.  
  118.     Format dari Include
  119. #include <nama library>
  120.  
  121.     Nah, terus bagaimana cara kita mau tau, nama dari Library yang ada ? Bagaimana cara kita mau tau kalo kita perlu library apa aja ? Terus apa konsekuensi kalo kita import library tapi ga kepake ? Yang pertama, untuk kita tau perlu ato nganya library yang ada, dapat dengan cara membaca documentation dari library yang ada, kedua dapat kita langsung aja coba apabila kita misalkan memanggil fungsi A, ada tidak di project kita ? Ada cacing merah atau bisa kita panggil ? Library yang telah di import terus tau-tau tidak jadi terpakai tidak akan menimbukkan bug atau error. Hanya akan menjadi code Smell saja pada Scripting. Terakhir, kalian dapat mengecek folder Compiler kalian, dan mencari kedalam folder "include" untuk melihat library apa saja yang ada dan kalian dapat pakai. Apabila kalian membutuhkan library lain, kalian dapat mendownload filenya ( .inc extension ), dan tinggal di taruh saja di folder include.
  122.  
  123. I.D Compiler
  124.     Sebelum akhir dari chapter Include, mari kita membahas sedikit soal Compiler. Pada folder github ( yang ada di atas ), compiler kita harus tau, library apa aja yang ingin kita gunakan ketika akan mengcompile source code Scripting kita menjadi sebuah plugin. Ketika kalian masuk ke folder Compiler, akan terdapat sebuah folder yang bernama include. Nah, kalian harus menaruh library ( .inc ) file yang kalian butuh kan pada folder Include tersebut. Untuk memanggilnya, kalian tinggal melihat nama includenya dan taruh saja di file Scripting kalian, perhatikan penulisan lower dan upper case ya.
  125.  
  126. I.E Integrated Development Environment
  127.     IDE Default dari AMX MOD X adalah AMXX Studio. Tapi jujur aja, mungkin dulu gua masi pake AMXX Studio gara2 blom tau IDE lain ( gara2 mager nyari sih ). Sekarang, kalo gua lu suruh ngoding COD lagi, mungkin gua bakal saranin buat lu pake Visual Studio Code ( BUKAN VISUAL STUDIO ), dengan grafis yang bagus dan performa yang bagus, IDE nya cocok kok buat kerja. Kalo mau yang lebih ringan ato size kecil, masih ada Dev C++, dan masih ada Notepad++.
  128.  
  129. II  Chapter II : Class Parameter
  130.     Mari kita membahas Parameter yang diperlukan pada sebuah Class ( Bukan Class coding, tapi "Class" pada Mod COD : MW ), sebelum mulai, mari kita ke sub-bab pertama kita terlebih dahulu.
  131.  
  132. II.A Data Type ( Tipe - tipe Data )
  133.     II.A-1 Number
  134.     Tipe data berikut ini simple kok. Angka terdiri dari 2 jenis, yaitu angka bilangan bulat dan satu lagi angka yang memiliki desimal di belakang. Nah jadi Number pada Coding juga sama ada 2, yaitu :
  135.  
  136. Integer : Yaitu angka bulat seperti 1, 2, 3, 4, 5, dan seterusnya.
  137. Float : Yaitu angka yang memiliki desimal di belakangnya seperti : 1.1, 1.95, 4.20, da seterusnya.
  138.  
  139.     II.A-2 Char / Character
  140.     Tipe data ini juga simple seperti Number, tipe data Char adalah untuk karakter. Satu huruf kita sebut sebagai 1 Char / 1 Karakter, sementara kumpulan huruf atau kata seperti yang tulisan guide ini kita sebut sebagai String. Walau terlihat sama, tipe data Char dan String sedikit berbeda. Perbedaannya hanya terletak pada jumlah kata. Character hanya terdiri dari 1 huruf saja, sementara String terdiri dari kumpulan karakter. Maka String sering kali juga disebut sebagai ARRAY of character.
  141.  
  142. Char : Yaitu satu buah huruf / karakter seperti : A, b, C, c, #, !, ?, etc
  143. String : Kumpulan dari karakter atau huruf seperti : "Ini adalah string", "177013", "69420 Angka sakral", etc
  144.  
  145. *Note : Array tidak hanya untuk tipe data String saja, Array bisa berbentuk Integer atau Float.
  146.  
  147.     II.A-3 Boolean
  148.     Mungkin Boolean akan terdengar familiar bagi kalian yang deman matematika atau mungkin asing bagi kalian. Tipe data boolean cuma memiliki 2 value saja, yaitu TRUE / FALSE.
  149.  
  150. Boolean : Yaitu tipe data yang hanya memiliki 2 value, yaitu TRUE / FALSE
  151.  
  152. II.B Cod Required Parameter
  153.     Untuk sebuah Class COD berfungsing dengan semestinya, maka class tersebut butuh pre-defined variabel yang diperlukan. Berikut list nya :
  154.  
  155. ** Start of Required Parameter
  156.     1. Variabel ( Class Name, Description, Weapon, Stat ( HP, Speed, Int, Strength )
  157.     2. Main & Required Function ( Plugin initialization, Class Enable / Disable )
  158.     4. Custom Function / Task
  159. ** End of Required Parameter
  160.  
  161.     Penjelasan dari apa saja variable di atas, apa fungsinya, apa yang harus di-isi pada variable di atas dapat kita lihat pada penjelasan di bawah, pada sub-bab Required Parameter Explanation.
  162.  
  163. II.C Required Parameter Explanation
  164.     Di atas, sudah di-list apa saja parameter yang kita butuhkan untuk sebuah class, nah sekarang akan dijelaskan apa saja yang harus kita isi / buat dari parameter tersebut. Kita lihat dari nomor satu, untuk variabel, di perlukan nama, deskripi, weapon yang dipakai class, dan juga stats dari kelas. Untuk formatnya :
  165.    
  166. ** Start of Code Format
  167.     // Include udah ada di atas
  168.  
  169.     new const "Nama dari Variable" < Seperti ini, tapi tanpa tanda petik
  170.    
  171.     Maka, untuk format lengkap dari class misalkan :
  172.     new const name[] = "Testing Class TYR";
  173.     new const desc[] = "Ini adalah sebuah class dummy untuk testing";
  174.     new const weapon = 1<<CSW_M249 | 1<<CSW_USP | 1<<CSW_M4A1;
  175.     new const hp = 100;
  176.     new const spd = 50;
  177.     new const int = 20;
  178.     new const str = 50;
  179.    
  180.     // Item ga perlu stat Weapon, Hp, Spd, Int, dan Str
  181.  
  182.     new bool:class_id[33]; ATAU
  183.     new bool:perk_id[33];
  184.     // Bool nya ga ada beda, cuma beda penamaan doang biar gampang di baca 
  185.     // bool = Boolean  
  186.  
  187.     public plugin_init(){
  188.         register_plugin(name, "1.0", "MasamuneDate);
  189.         cod_register_class(name, desc, weapon, hp, spd, int, str);
  190.     }
  191.  
  192.     public cod_class_enabled(id){ // Atau cod_perk_enabled(id){}
  193.         class_id[id] = true;
  194.         // ATAU
  195.         perk_id[id] = true;
  196.         // Selain perk / class enable, bisa ditaro task lain yang kalian ingin jalankan ketika class di pakai atau ketika class di enable.
  197.     }
  198.  
  199.     public cod_class_disabled(id){ // Atau cod_perk_disabled(id){}
  200.         class_id[id] = false;
  201.         // ATAU
  202.         perk_id[id] = false;
  203.         // Jangan lupa untuk disable semua benefit dari class ketika player ganti class / semacamnya. Karena jika tidak di-disable nantinya bakal membuat bug dimana player masi dapet benefit dari class padahal udah ga dipake.
  204.     }
  205. ** End of Code Format
  206.  
  207.     Nah, lu mungkin agak sedikit bingung melihat format di atas. Mari kita bedah sedikit untuk membuat kalian mengerti. Pertama, dalam coding bahasa PAWN, setiap line harus ditutup dengan tanda semi kolon ; atau akan terjadi error. Kedua, ketika kalian men-declare sebuah string atau karakter, harus di mulai dengan tanda petik ", sementara untuk angka, dapat langsung saja di deklarasikan.
  208.  
  209.     Yang kedua, untuk weapon, terdapat list yang dapat kalian lihat pada link :
  210.     https://forums.alliedmods.net/archive/index.php/t-59003.html
  211.     Untuk weapon, tinggal copy paste saja sama persis dan tambahkan seperti format di atas. Format di atas berguna ketika misalkan kalian ingin satu class memiliki lebih dari satu senjata, tinggal tambahkan simbol | saja.
  212.  
  213.     Kemudian, kalian mungkin bertanya apa sih gunanya tanda [] pada const nama deskripsi dan class id ? Nah kalian ingat tentang ARRAY di penjelasan String ? Variable tersebut menggunakan array. Untuk nama dan deskripsi, kita langsung saja mengetik dan membiarkan program yang menentukan seberapa banyak array yang kita butuhkan ( Varchar ), sementara untuk class dapat kita deklarasikan karena untuk CS sendiri, hanya maksimal 32 player pada satu server. Tetapi, kenapa angka yang ada 33 ? Karena Array dimulai dari 0, simple.
  214.  
  215.     Note terakhir, mungkin kalian jika browsing di forum amxx.pl akan melihat, kok nama nya beda dari nama yang diketik disini ? Kenapa bisa kayak gitu sih ? Nah Variable ini adalah sebuah Parameter yang kita, sebagai Programmer buat. Walaupun berbeda nama, asalkan Variable yang kita buat tersebut dimasukan ke fungsi yang memiliki parameter yang sesuai, hal tersebut tidak akan jadi masalah. Contoh :
  216.  
  217. ** Start of Parameter Example
  218.     Misalkan gua ada function : pertambahan(int x, int y) return x+y;
  219.     * Function diatas berfungsi dengan mengambil 2 nilai integer X dan Y, kemudia mengembalikan hasil dari X ditambah Y.
  220.    
  221.     Misalkan ada variable :
  222.     int num1 = 10;
  223.     int num2 = 20;
  224.     Dan ada variable lainnya yang bernama :
  225.     int angka1 = 10;
  226.     int angka2 = 20;
  227.    
  228.     Apabila kita memasukan num1 dan num2 ke fungsi di atas, dan kita juga melakukan hal yang sama untuk angka1 dan angka2, maka akan didapat hasil yang sama yaitu 30. Nah, jadi berbeda nama variable asal kan dimasukan ke fungsi yang memiliki parameter yang sesuai maka tidak akan ada masalah.
  229. ** End of Parameter Example
  230.  
  231.     *Note : Untuk Perk ( Item ), perbedaan yang signifikan cuma pada total variable saja. Item hanya memerlukan nama dan deskripsi, Variable Stats tidak diperlukan ( Beda cara ). Untuk item atau perk, apabila ingin memberikan stat tambahan ke player, kalian beri commandnya pada public cod_perk_enabled, dan jangan me-remove stat yang diberikan ke player pada function cod_perk_disabled.
  232.  
  233.     *VERY IMPORTANT NOTE : Apabila kalian bingung ingin mencari fungsi apa saja yang ada di COD, seperti ingin melihat function core apa saja, atau cara menambahkan atau mengurangi stat, kalian ke folder Compiler di github, masuk ke folder Include, carilah codmod.inc dan kalian tinggal open as notepad. *NOTE : Mod ini original dalam bahasa Polish, jadi penjelasan yang ada di sana dalam bahasa Polish.
  234.  
  235.     *Note : Untuk lebih jelasnnya mengenai "Class Enabled / Disabled" dan "Perk Enabled / Disabled" silahkan melihat ke bagian Chapter 3 di bawah ini. Navigation : Enabling / Disabling Class & Perk
  236.  
  237. III Chapter III : Initializing Plugin & Enabling Task / Function
  238.     Kita telah melihat bentuk format dari sebuah class dan perk pada chapter II di atas. Nah sekarang, gua bakal menjelaskan apa saja beberapa maksud dari codingan yang ada di atas, yang belum di bahas pada "Class Variable"
  239.  
  240. III.A Function
  241.     Apa itu Function ? Function pada Coding berarti sebuah fungsi, fungsi yang nantinya dapat kita isi dengan tugas / task, atau bahkan memanggil fungsi lain untuk melakukan suatu tugas atau melakukan sesuatu. Nah, pada COD kita menggunakan beberapa Function eksternal yang didapatkan dari library yang telah kita include. Contohnya seperti cod_register_class, cod_perk_enabled, dan sebagainya.
  242.  
  243. *Note : Kita dapat membuat function kita sendiri, penamaan function sendiri bebas asalkan jangan pake spasi ya, dan nama usahakan jelas agar gampang di baca, dan agar code gampang di wariskan ke Dev selanjutnya.
  244.  
  245.     Fungsi dapat memiliki PARAMETER yang wajib di-isi apabila akan dipanggil, atau bahkan terdapat fungsi yang dapat langsung dipanggil begitu saja tanpa perlu ada parameter. Parameter ini sendiri dapat dikatakan sebuah persyaratan khusus yang diperlukan agar fungsi yang memiliki parameter tersebut dapat dipanggil. Biasanya, parameter sendiri mengandung data atau variable yang diperlukan, agar fungsi tersebut dapat menjalankan code / tugas yang diberikan.
  246.  
  247. III.B Custom Task / Function
  248.     Sebelum anda membaca sub-bab ini, sedikit note, pada sub-bab ini kita cuma akan membahas secara singkat mengenai apa itu custom task / function, bagaimana cara membuatnya, dan apa yang harus ktia isi di-sini.
  249.  
  250.     Nah, kalian telah belajar mengenai Function pada sub-bab Function. Nah sekarang, akan dijelaskan sedikit mengenai yang tadi saya bilang tentang Fungsi kita sendiri.
  251.     *NOTE : Sebelum membuat function sendiri, lu harus tau dulu alur dari code pada PAWN. PAWN bekerja secara Prosedural, yang berarti Program yang di compile akan berjalan DARI ATAS KE BAWAH. Maka, terdapat beberapa aturan yang harus di penuhi. Apabila lu liat di Code Format, gua nulis codenya dari new const ( include di atas ), secara rapih ke plugin_init, dan enabled / disabled class. Itu, urutan WAJIB yang harus dikutin.
  252.  
  253.     Balik ke Custom Function. Setelah kita menuliskan Code Format di atas ke dalam code, kita, barulah kita bisa menambahkan fungsi kita sendiri setelahnya. Jadi uruntannya,
  254. ** Start of Urutan Code
  255.     include <amxmodx>
  256.     include <codmod>
  257.  
  258.     new const // Masukin Variable
  259.  
  260.     public plugin_init(){
  261.     }
  262.     public cod_class_enabled(id){
  263.     }
  264.     public cod_class_disabled(id){
  265.     }
  266.     // Baru nge code setelah dibawah ini
  267.     public taskBaru(){
  268.     }
  269.     public new_task_baru_ke2(){
  270.     }
  271. ** End of Urutan Code
  272.  
  273.     Dari contoh di atas, misalkan gua mau manggil taskBaru di function new_task_baru_ke2, maka taskBaru harus berada di line atas dan tidak boleh ada dibawah new_task_baru_ke2. Nah, apabila lu menggunakan library external, atau menggunakan dependancy yang berada di include library, apabila misalkan kita belum meng-inisialisasi includenya, tetapi kita memanggil fungsi yang ada, maka akan terjadi error ketika di compile karena compiler tidak tau apa maksud dari fungsi ini. Jadi apabila kita ingin membuat sebuah fungsi baru dan ingin memanggil fungsi dari library lain, maka harus dimasukan terlebih dahulu di include.
  274.  
  275. III.C Initializing Function ( "Main" Function )
  276.     Pada bahasa C, sebuah class baru bisa dijalankan apabila terdapat "Main" function. Hal yang sama juga berlaku pada Scripting kita kali ini, dengan beberapa pengecualian yang berbeda. Pada AMX Mod X, function "Main" kita berada pada :
  277. ** Start of Main Function
  278.     public plugin_init(){
  279.         // Declare Cvar / Function lain disini.
  280.     }
  281. ** End of Main Function
  282.  
  283.     Apa fungsi dari Main Function ini ? Fungsi dari Main function ini berguna untuk memanggil function. Contohnya :
  284. ** Link Contoh
  285. https://github.com/MasamuneDate99/Cs-1.6-COD-MW-Mod/blob/main/Original%20Work/Class%20Rebalance/21%20April%202020/Source/codclass_fearlessmind.sma
  286. ** End of Link Contoh
  287.     Di atas adalah contoh class bikinan gua, dapat dilihat di plugin_init nya, gua masukin 3 required function. Yang pertama dan wajib sudah pasti kita harus "Register Plugin" kita agar terbaca di server. Dan yang kedua, kita WAJIB "Register Class" atau "Register Perk" agar perk kita terbaca di sistem COD. Nah pada plugin init di atas, gua juga masukin "Register Event" karena ada function yang memerlukannya, yaitu function TakeDamage.
  288.  
  289.     Jadi intinya, plugin_init digunakan untuk pre-set value Cvar yang ada di function lu ( kalo ga ada ya ga usa isi ), bisa juga untuk register plugin, untuk memanggil fungsi lain, dan lain sebagainya. Fungsi utamanya adalah memanggil atau me-initialize function baik yang ada di class Code mu ataupun di Library lain. Untuk COD, yang WAJIB ada di plugin_init adalah cod_register_class function dengan format :
  290.  
  291. ** Start of cod_register_class
  292.     cod_register_class(nama, description, senjata, hp, spd, int, str);
  293.     // Sesuaikan penamaan di atas dengan nama Variable mu, misalkan HP mu dinamain bonusHitPoint, maka ganti hp di atas jadi bonusHitPoint, dan seterusnya.
  294. ** End of cod_register_class
  295.  
  296.     Dan function WAJIB terakhir adalah register_plugin, dengan format :
  297. ** Start of register_plugin
  298.     register_plugin(pluginName, version, authorName);
  299.     // Register plugin bisa langsung aja disana, ga perlu buat variable kalo mau jadi begini :
  300.     register_plugin("Contoh Nama Plugin", 1.0, "TYR");
  301.     // JANGAN LUPA ! Untuk STRING selalu awali dengan " dan akhiri dengan ", untuk angka ga perlu
  302. ** End of register_plugin
  303.  
  304. III.D Enabling / Disabling Class & Perk
  305.     Melanjutkan penjelasan dari Chapter II sub-bab Required Parameter.
  306.  
  307.     Bagi player COD, kalian tentunya tau bahwa kalian bisa ganti - ganti class ketika selesai login di game. Nah kalian tentunya bertanya, bagaimana caranya Sistem COD bisa tau kita lagi pake Class apa, dan kenapa misalkan kita ganti class, efek dari class sebelumnya yang kita pake ga kebawa ke class baru ? Itulah gunanya Enabling / Disabling Class / Perk pada kasus kita kali ini. Nah mari kita mulai membahasnya.
  308.  
  309.     Terdapat 3 Function WAJIB di COD. Yang pertama sudah pastinya plugin_init, kemudian cod_class_enabled ( atau cod_perk_enabled ), dan cod_class_disabled ( atau cod_perk_disabled ). Apa yang harus kita isi di cod_class_enabled dan di cod_class_disabled ? Kenapa harus kita enable / disable ? Apa untungnya bagi kita ? Mari kita bahas satu persatu. Sebelum kita membahasnya, mari kita lihat terlebih dahulu bentuk functionnya.
  310.  
  311. ** Start of Contoh Class / Perk Enabled / Disabled
  312.     public cod_class_enabled(id){
  313.         class_id[id] = true; // WAJIB ADA !
  314.     }
  315.  
  316.     public cod_class_disabled(id){
  317.         class_id[id] = false; // WAJIB ADA !
  318.     }
  319. ** End of Contoh Class / Perk Enabled / Disabled
  320.  
  321.     Pada code diatas, lu mungkin bertanya - tanya, kenapa ada (id) disini ? Nah, masih inget tentang pembahasan di chapter II tentang function ? Function bisa saja memiliki requirement "Parameter" agar fungsi tersebut bisa jalan. Nah, untuk cod_class_enabled atau disabled ini, kita memerlukan PLAYER ID. Untuk apa player ID ini ? Player ID ini digunakan untuk meng-identifikasikan tiap player yang sedang menggunakan class ini. Tiap ID player unik dan berbeda satu sama lain, sehingga Sistem Game dapat membedakan player mana yang sedang memakai class ini dan yang tidak memakainya. Data yang kita ambil tadi (id) dimasukan ke dalam Array Boolean yang telah kita buat ( new bool: class_id[33] ).
  322.  
  323.     Balik kembali ke Enabled / Disabled. Ketika sesoorang memakai class, maka kita akan me-register sebagai cod_class_enabled = class_id == true. Ketika player meng-ganti class lain, maka class lama mereka akan di register sebagai cod_class_disabled = class_id == false. Hal ini yang membuat ketika sesoorang menggunakan class A, dan mengganti ke class B, maka skill dari Class A tidak terbawa ke class B. Selain itu, apabila lu pengen kayak ngasih Weapon tertentu kalo class ini nyala ( ex. weapon spesial, dan bukan weapon Vanila ), bisa di-inisialisasi kan di class enabled, akan di bahas di advance lesson untuk lebih lanjutnya. Contoh :
  324.  
  325. ** Start of Class_Enabled Content
  326.     public cod_class_enabled(id){
  327.         ma_klase[id] = true;
  328.         set_task(5.0, "WyszkolenieSanitarne", id+TASK_WYSZKOLENIE_SANITARNE);
  329.         ColorChat(id, GREEN, "Created by MasamuneDate", nazwa);
  330.     }
  331. ** End of Class_Enabled Content
  332.  
  333.     Pada contoh Code Snippet di atas, ketika class di enabled, dia akan melakukan task yang di setting untuk terus berjalan setiap 5 detik sekali, dan ketika class di enabled, dia akan memanggil sebuah fungsi ColorChat, yang digunakan untuk mengirimkan pesan. Nah, semua fungsi tersebut hanya akan berjalan, hanya dan hanya jika class tersebut di enabled, class lain belum tentu memiliki task atau function color chat yang harus dijalankan.
  334.  
  335.     Setelah selesai di enabled, jangan lupa untuk MENGHAPUS, atau MEN-CANCEL SEGALA SESUATU YANG KALIAN TELAH LAKUKAN DI CLASS ENABLED. Kalau pada contoh di atas, untuk class disabled tinggal menuliskan ma_klaes[id] = false; saja, karena ColorChat dan set_task bukan sesuatu yang berjalan terus - terusan dan harus di remove secara manual. Contoh yang HARUS di remove secara manual :
  336.  
  337. ** Start of Code Example
  338. https://pastebin.com/s6ELTLK1 // Liat di cod_class_enabled dan cod_class_disabled
  339. https://pastebin.com/0169by11 // Liat di cod_class_enabled dan cod_class_disabled
  340. ** End of Code Example
  341.  
  342.     Untuk code pertama mungkin kalian akan agak bingung, kita bahas saja di code ke 2 ( Yang ZP-Skull 3 ). Mari Pertama, kita melihat ada g_laser, Get_Weapon(id);, dan cod_give_weapon(id, CSW_P90); . Nah, ketika class tersebut di enabled, Class tersebut akan memberikan senjata "P90" Spesial ( Bukan Vanila ) kepada player, dia akan memberikan Laser Sight (g_laser), dan Weapon Spesial diberikan dari fungsi Get_Weapon(id); juga. Apabila ketika player ganti class dan tidak kita disabled, makan "KEMUNGKINAN" yang akan terjadi ( ga tau ga pernah coba gua ), player akan tetap memiliki laser sight, player akan tetap memiliki P90, dan kemungkinan P90 yang didapat juga akan menjadi Skull-3 dari Zombie Plague. Maka, selalu dan JANGAN lupa untuk merapikan Class Enabled dan Disabled dengan tepat.
  343.  
  344. IV  Chapter IV : Advanced Lesson
  345. IV.A Randon Number Generator
  346.     Ah yes, "Klasik" RNG luck. RNG atau Random Number Generator adalah sebuah mekanisme me-randomisasi angka, yang kita pakai di CoD untuk % chance skill / perk. Langsung aja kita liat penggalan code untuk RNG di bawah ini :
  347.  
  348. ** Start of RNG Code Example
  349.     - Example A
  350.         if(random_num(1,10) == 1)
  351.             cod_inflict_damage(idattacker, this, float(get_user_health(this))-damage+1.0, 0.0, idinflictor, damagebits);
  352.     - Example B
  353.         new const perk_desc[] = "LW damage you ask for more and for every frag you get 50 hp";
  354.  
  355.         // plugin_init
  356.         cod_register_perk(perk_name, perk_desc, 18, 35);
  357.        
  358.         // Perk Enabled
  359.         wartosc_perku[id] = wartosc;
  360.        
  361.         // TakeDamage
  362.         cod_inflict_damage(idattacker, this, float(wartosc_perku[idattacker]), 0.0, idinflictor, damagebits);
  363. ** End of RNG Code Example
  364.  
  365.     Nah, mari kita ke Example A. Di atas, if( angka random dari 1-10 ) dapet sama dengan 1, maka fungsi di bawah akan dijalankan. function random_num membutuhkan 2 parameter, parameter pertama untuk integer minimal, dan parameter kedua untuk integer nilai maksimal. Sehingga, apabila fungsi tersebut dijalankan, maka Class akan me-return angka dalam range 1 sampai 10, dan fungsi cod_inflict_damage akan membuat player tersebut menerima X damage, pada kasus ini akan diberikan sebanyak X damage berdasarkan CURRENT user health ( Diamond Cartridges ), sehingga, user 1 hit kill apabila chance dari 1/10 tersebut nyala.
  366.  
  367.     Contoh kedua, random number dengan function native dari CoD. LW disana digunakan untuk show Value dari Random Number untuk perk. function cod_register_perk memiliki 4 parameter, yang wajib terdapat perk_name dan perk_desc yang harus kita isi. Nah, sisanya terdapat 2 parameter extra, yaitu valueMin dan valueMax untuk perk yang memiliki nilai Chance atau Value untuk sesuatu. Random yang dilakukan didasarkan dari fungsi cod_register_perk. Apabila kita tidak memakai Value untuk perk kita, maka value Default dari min dan max sudah disetting 0 di include native Cod.
  368.  
  369.     Tambahan untuk contoh kedua, terdapat wartosc_perku[id] = wartosc;, tetapi "wartosc" tidak ada di Class kita ??? Nah, wartosc itu variable yang ada dan sudah di pre-define di native cod untuk perk. Value dari wartosc didapat dari valueMin dan valueMax dari perk. Parameter aslinya didapat dari serangkaian function dimana, pertama - tama minValue dan maxValue di Random untuk mendapatkna value RNG, kemudia value tersebut disimpan di new const bernama "wartosc", dan wartosc tersebut di passing ketika perk_enabled. TLDR, jangan ganti nama wartosc, biarin aja karena native dari pluginnya.
  370.  
  371. IV.B Define
  372.     Kita bisa sedikit men-setting Variable dengan cara kita men-deklarasikan Value dari Variable tersebut. PAWN sedikit sama dengan phyton, dimana kita bisa secara langsung membuat Variable, tanpa men-assign tipe data dari variable tersebut terlebih dahulu. Apa guna dari Define ? Hanya mempermudah sedikit saja. Contoh :
  373.  
  374. ** Start of Define Example
  375.     define PLUGIN "Test Define"
  376.     define VERSION  1.0
  377.     define AUTHOR "TYR / MasamuneDate"
  378.    
  379.     // plugin_init
  380.     register_plugin(PLUGIN, VERSION, AUTHOR);
  381. ** End of Define Example
  382.  
  383. IV.C Logical Statement
  384.     Bagi kalian yang pernah mempelajari Matematika pada bagian Logika & Tabel kebenaran tentunya akan merasa Logical Statement menjadi hal yang tidak asing. Nah, sebelum kita mempelajari Logical Statement yang ada, mari kita melihat dulu Simbol - Simbol yang digunakan.
  385.  
  386. ** Start of Used Symbol on Logical Statement
  387.     !   : Tidak sama
  388.     >   : Lebih besar dari
  389.     <   : Lebih kecil dari
  390.     !=  : Tidak sama dengan
  391.     >=  : Lebih kecil dari sama dengan
  392.     <=  : Lebih besar dari sama dengan
  393.     &&  : Dan
  394.     ||  : Atau
  395.     ==  : Sama dengan
  396.    
  397.     *Note : Simbol - simbol biasa seperti Modulo(%), pertambahan, perkalian, dan sebagainya bisa dipake juga
  398. ** End of Used Symbol on Logical Statement
  399.  
  400.     Nah, mari kita sedikit membahas contoh penggunaan dari Logical Statement
  401. ** Start of Example of Logical Statement
  402.     new const numA = 10;
  403.     new const numB = 20;
  404.     new const numC = 10;
  405.  
  406.     if((numA && numC) == 10){ return ColorChat(id, GREEN, "numA dan numC adalah 10", "Example A"); }
  407.     if((numA || numB) == 10){ return ColorChat(id, GREEN, "Salah satu dari numA atau numB bernilai 10", "Example B"); }
  408.     if(numA >> numB){ return ColorChat(id, GREEN, "Return ini ga bakal mungkin karena A lebih kecil dari B", "Example C"); }
  409.     if(!is_user_connected){ return ColorChat(id, GREEN, "User tidak connect !", "Example D"); }
  410.     if(is_user_connected && (numA == 10)) { ColorChat(id, GREEN, "User connect dan A adalah 10", "Example E"); }
  411. ** End of Example of Logical Statement
  412.  
  413. IV.D Loading Bar & Class Skill Function
  414.     Sekarang, kita akan masuk ke materi Advanced berikutnya. Kali ini, kita akan membahas mengenai class Skill. Sebagaimana lu tau, di CoD beberapa Class ada bisa menggunakan Skill. Entah skillnya itu instant kayak Elektryk, ataupun memiliki durasi kayak Rusher, dan sebagainya. Kita bakal membahas class skill yang berdurasi, lebih tepatnya kita akan belajar bagaimana cara men-set Loading Bar, dan juga Task ketika skill nyala.
  415.  
  416.     Ok, langsung aja kita lihat ke contoh code biar lebih gua bisa jelasin. Tetapi sebelum masuk ke Code Snippet, CoD udah ada inbuilt function untuk class skill. Kita tinggal memanggil fungsi public cod_class_skill_used(id) { } , nah untuk contoh snippet nya :
  417.  
  418. ** Start of cod_class_skill_used(id)
  419.     public cod_class_skill_used(id){
  420.  
  421.         if(task_exists(id+43)){
  422.             return PLUGIN_CONTINUE;
  423.             // Jika Task sudah ada / sedang berjalan exist = return PLUGIN_CONTINUE;
  424.         }
  425.    
  426.         if(!uzycia_skilla[id]){
  427.             ColorChat(id, RED, "Active skill can only be used once per round !");
  428.             return PLUGIN_CONTINUE
  429.             // Jika Skill False = Send Error message "Skill cuma bisa dipake 1x / round !"
  430.         }
  431.        
  432.         uzycia_skilla[id]--
  433.         // Skill == False
  434.  
  435.         czas = 10// Duration
  436.         dmg_multi = 1.0;
  437.    
  438.         set_task(1.0, "QuadDamage", id+43, _, _, "a",czas); // Set Task yang harus dilakukan
  439.         set_task(10, "Wylacz", id);                         // Set Task yang harus dilakukan
  440.         message_begin(MSG_ONE,108,{0,0,0},id)               // Loading Bar
  441.         write_short(czas)                                   // Display loading bar nya
  442.         message_end()                                       // Delete loading bar dari player view
  443.  
  444.         return PLUGIN_CONTINUE
  445.     }
  446. ** End of cod_class_skill_used(id)
  447.  
  448.     Nah mari masuk ke penjelasannya. Ini code dari class Claes Of Dawn, yang memiliki skill 15% bonus dmg all weapon, dan memiliki skill aktif no recoil dan dmg bonus menjadi 100% atau 2 kali lipat damage ketika skill nyala. Nah, kita lihat di paling atas, set task bisa lebih 1 dan dapat berjalan secara bersama - sama. Untuk code di atas, yang dia mengecek task_exist, sebenarnya kayaknya itu di apus harusnya ga bermasalah, karena kita telah ada Validator ke 2, liat paragraf dibawah untuk penjelasannya, code dari Double Damage itu gua ambil dari code Quad Damage QTM_Peyote.
  449.  
  450.     Yang kedua, if(Skill dipake == False), maka dia akan me-return Error message Skill Hanya dapat digunakan satu kali saja, karena ketika skill telah dipakai, ada code dibawah yang merubah nilai Skill dipake menjadi false. Sehingga, walaupun E dari CoD bisa digunakan berkali - kali, tetapi Validatornya telah dirubah False sehingga skill tidak akan terpakai lagi. Sehingga, ketika player menekan skill lagi, dan ternyata Validator liat, oh skill lu udah dipake, jadinya gua tampilih error message, dan lanjutin tugas gua tanpa liat code dibawahnya ya. Nah, jadi nanti functionnya bakal return PLUGIN_CONTINUE, anggepannya kayak break(); jadi proses yang ada dibawah ga dijalankan, langsung di return value PLUGIN_CONTINUE.
  451.  
  452.     Terus, kita lihat task dibawahnnya ada uzycia_skilla == false ( Skill Used, gua waktu itu ga ganti namanya karena mager ), dan dibawahnnya lagi ada skill variabel czas / duration, dan variabel Float dmg_multi. Nah, dibawah terdapat function set_task yang berfungsi menjalankan tugas yang diberikan, yaitu task Quad Damage dan task Wylacz. Ketika task tersebut dijalankan, Loading Bar akan muncul. Terdapat beberapa parameter, yang dapat kalian lihat lebih jelasnnya disini : https://www.amxmodx.org/api/amxmodx/set_task. Jujur, ini class setelah gua re-visit pas gua uda ngerti coding, gua baru sadar keknya ini class masi nge bug AOWKOAWKOKAWOKAWO. Ok, mari kita bedah parameternya. Parameternya adalah set_task(Durasi, function_yang_mau_dijalankan, id_task, parameter_yang_mau_di_pass_ke_callback_task, size_data(Kosongin aja), flag(liat API Documentation), repeat(liat API Documentation));
  453.  
  454.     Kalo perbaikan gua bener, harusnya yang bener jadi :
  455. ** Start of Fix
  456.     set_task(czas, "QuadDamage", id+43);
  457.     set_task(czas, "Wylacz", id);
  458. ** End of Fix
  459.  
  460.     Nah, set task ini akan meng-eksekusi tugasnya ketika Durasi telah habis. Jadi, ketika 10 detik telah habis, function dari QuadDamage dan Wylacz akan dijalankan, yang kerjannya cuma membuat Skill_used jadi false ( Terdapat 2 skill used berbeda atau variable untuk Validator untuk masing - masing no recoil dan bonus damage ).
  461.  
  462.     Satu lagi, gua keknya bikin kesalahan goblok di TakeDamagenya OAWKOAWKOAWKOKWAO. Jadi harusnya itu if(flag[id] != false) ga perlu itu, harusnya di apus aja akwkwkkwkw.
  463.  
  464. IV.E Access Restriction
  465.     Access restriction bisa dibagi jadi 2, ada dari "Access" player, dan dari Nickname player ( karena COD ada password jadi bisa pake Name Restriction ). Kita bahas dari Admin Level Restriction :
  466.  
  467. ** Start of Admin Level Restriction
  468.     public cod_class_enabled(id){
  469.     if(!(get_user_flags(id) & ADMIN_LEVEL_B))
  470.     {
  471.         client_print(id, print_chat, "[Required Admin Level B Authorization]")
  472.         return COD_STOP;
  473.     }
  474.    
  475.     return COD_CONTINUE;
  476.     }
  477. ** End of Admin Level Restriction
  478.  
  479.     Jika user_flag dan akses admin dia ga ada ( false ), maka return COD_STOP, ga bisa akses class. Jika user_flag dan akses admin B dia ada ( true ), maka COD_CONTINUE. Done, simple kan ? Lu tinggal pelajarin aja akses admin apa yang di perluin ( gua ga apal soalnya ea ). Nah, lanjut ke restriction pake nama,
  480.  
  481. ** Start of Name Validator Restriction
  482.     new identyfikator[33];
  483.  
  484.     public cod_class_enabled(id)
  485.     {
  486.     get_user_name(id, identyfikator, 32);
  487.     if(!equal(identyfikator, "The Magician") && !equal(identyfikator, "Whistle*") && !equal(identyfikator, "Electronic_Arts.-"))
  488.     {
  489.         client_print(id, print_chat, "[ELITE] Do not have permission to use this class.")
  490.         return COD_STOP;
  491.     }
  492.     ma_klase[id] = true;
  493.     return COD_CONTINUE;
  494. }
  495. ** End of Name Validator Restriction
  496.  
  497.     New identyfikator[33]; di atas adalah Array list. Kita membuat sebuah array list, untuk menampung data dari function get_user_name(id, identyfikator, 32); < ini. Nah, ketika sudah didapat name yang ada, masuk ke validator, jika nama yang ada di array aktif sekarang ( tau dari id ), ada di salah satu equals yang ada, maka dia akan return COD_CONTINUE, kalo ga ada, bakal langsung di break ke COD_STOP; .
  498.  
  499. IV.F Importing Custom Model & Sould ( With Precaching )
  500.     Importing Custom Model dan Sound di lakukan didalam satu function. Pertama - tama, kita memerlukan sebuah function public plugin_precache. Function ini berfungsi agar ketika player masuk ke server, mereka di haruskan untuk men-download model atau pun file sound atau sprite, dan lainnya yang bersangkutan, sebelum bisa main di server. Nah, function ini tidak memerlukan return value, sehingga kita tidak perlu menuliskan return value. Yang kedua, fungsi ini adalah sebuah "forward" ( Browsing di AMXX Api Documentation tentanng plugin_precache & register_forward ). Setelah kita membuat plugin_precache function, kita juga harus me-register forward tersebut dengan function register_forward(); . Untuk parameternya :
  501.  
  502. ** Start of Importing & Precaching + Register Forward Example
  503.     public plugin_precache(){
  504.         precache_model("models/rgcod/v_assasin_E.mdl");
  505.         // Isi dari function precache_model adalah path ke file modelnya. Jika model ada lebih dari 1, isi semua satu - satu.
  506.         precache_sound(const name[]);
  507.         // Sama kayak dari precache model, bedanya harus ke folder sound. Pake emit_sound untuk menggunakan sound yang telah di pre-cache. Format file hanya bisa .wav untuk .mp3 bakal beda lagi ( Kita skip mp3 karena jarang dan hampir ga dipake di cod ).
  508.         register_forward(FM_PrecacheEvent, "fw_PrecacheEvent_Post", 1);
  509.         // Register forward digunakan hanya jika perlu memanggil sebuah function untuk meng-handle precache yang ada dan di forward ke function yang ingin di panggil. Biasanya, untuk COD ketika kalian mau import custom model ga perlu ada register_forward.
  510.     }
  511. ** End of Importing & Precaching + Register Forward Example
  512.  
  513.     Setelah kalian selesai import custom model dan sound, selanjutnya kalian tinggal menggunakan custom model / sound tersebut, sesuai kebutuhan. Contoh dari ketika kita menggunakan import dari custom model :
  514.  
  515. ** Start of Custom Model Use Example
  516.     public CurWeapon(id){
  517.         new weapon = read_data(2);
  518.  
  519.         if(ma_klase[id])
  520.         {
  521.             if(weapon == CSW_KNIFE)
  522.             {
  523.                 set_pev(id, pev_viewmodel2, "models/rgcod/v_assasin_E.mdl")
  524.                 // Set preview jadi model ini
  525.             }
  526.         }
  527.     }
  528. ** End of Custom Model Use Example
  529.  
  530.     *Note : CurWeapon cuma function custom. Ga ada di documentation. Untuk register_forward dan register_event mengenai dari custom model atau sound, bisa coba cek plugin lain yang menggunakan custom model karena gua jarang pake dan masih kurang ngerti.
  531.  
  532.     *Note : Biasanya, kalau kalian nge port custom model dari plugin lain, kalian tinggal copy paste aja precache dan fungsi - fungsi yang ada. Ga perlu di edit lagi kok harusnya.
  533.  
  534. IV.G Stat Bonus on Class & Perk
  535.     Stat pada CoD ada 4, yaitu Health / Darah, Condition ( gatau kenapa pada ngomong kek gitu ) / Speed, Inteligence ( Buat damage Skill kayak E Elektryk, FS, Titanium Cartridge, etc ), dan Strength / Resilence ( Ngurangin total dmg ke diri lu, 300 ? ato berapa gitu immune di tusuk ama piso ). Nah, sekarang, mari kita lihat dulu beberapa list function mengenai stat, dan penjelasannya.
  536.  
  537. ** Start of CoD Stat Function
  538.     cod_get_user_health(id, 0, 0);
  539.     // Return User Health Point
  540.     // Mending pake ini aja :
  541.     get_user_health(id);
  542.     // Return current user health point
  543.     set_user_health(id, health);
  544.     // Set user current health to X number
  545.     // Cod ada set health function, tapi lebih ke bonus health, jadi kita pake native AMXX aja.
  546.    
  547.     // Nah yang bakal sering dipake mungkin :
  548.     cod_get_user_intelligence(id, 0, 0);
  549.     // Return User Intelligence Point
  550.     set_user_bonus_intelligence(id, int);
  551.     // Set user current int to X number
  552.     cod_get_user_trim(id, 0, 0);
  553.     // Return User Speed Point
  554.     set_user_bonus_trim(id, spd);
  555.     // Set user current speed to X number
  556.     cod_get_user_stamina(id, 0, 0);
  557.     // Return User Strength Point
  558.     set_user_bonus_stamina(id, str);
  559.     // Set user current strength to X number
  560.  
  561.     // Intinya, fungsi dari get_user_x adalah untuk mendapatkan jumlah stat saat ini yang user punya. Hal ini dapat berguna misalkan, ketika contohnya untuk menghitung damage dari based Inteligence stat skill, atau menghitung speed berdasarkan Cond, atau dmg resistance dari user Str, dan lain sebagainya.
  562.     // Fungsi di atas contoh parameternya. Kalian bisa aja bikin lebih ribet contohnya kayak gini : set_user_trim(id, cod_get_user_trim(id, 0, 0)+50); < Bisa aja kayak gini, ga ter limit, intinya sesuai dari parameternya aja.
  563. ** End of CoD Stat Function
  564.  
  565.     Nah, di atas udah dibahas sedikit mengenai fungsi - fungsi get stat dan set user stat. Sekarang, mari kita lihat contoh function tersebut di perk dan class, yang pertama kita lihat perk yang paling mainstream di cod, Arcana.
  566.  
  567. ** Start of Perk Code Snippet
  568.     public cod_perk_enabled(id)
  569. {
  570.     cod_set_user_bonus_trim(id, cod_get_user_trim(id, 0, 0)+50);
  571.     cod_set_user_bonus_intelligence(id, cod_get_user_intelligence(id, 0, 0)+50);
  572.     cod_set_user_bonus_health(id, cod_get_user_health(id, 0, 0)+50);
  573.     cod_set_user_bonus_stamina(id, cod_get_user_stamina(id, 0, 0)+50);
  574.     ma_perk[id] = true;
  575. }
  576.  
  577. public cod_perk_disabled(id)
  578. {
  579.     cod_set_user_bonus_trim(id, cod_get_user_trim(id, 0, 0)-50);
  580.     cod_set_user_bonus_intelligence(id, cod_get_user_intelligence(id, 0, 0)-50);
  581.     cod_set_user_bonus_health(id, cod_get_user_health(id, 0, 0)-50);
  582.     cod_set_user_bonus_stamina(id, cod_get_user_stamina(id, 0, 0)-50);
  583.     ma_perk[id] = false;
  584. }
  585. ** End of Stat Base Damage
  586.  
  587.     Harusnya code di atas sudah jelas ya kalo di baca penjelasan dan notenya :) . Sekarang, kita lihat contoh class yang memakai stat inteligence Elektryk ( Note ini agak beda karena native CoD ada damage with Inteligence Factor, jadi tidak perlu pake cod_get_user_inteligence.
  588.  
  589. ** Start of Elektryk Damage Part
  590.     cod_inflict_damage(id, ofiara, fObrazenia, 0.4, ent, DMG_SHOCK);
  591.     // Id, Target, Base Damage / Float Damage Number, Inteligence Bonus Damage, Entity Damage, Extra Flag
  592.     // Jadi total kalkulasi dari damage di atas 55 Base damage + ( Total Inteligence*0.4 ) = Dmg ke Musuh
  593.    
  594.     // Kalian juga bisa pake fungsi CoD Inflict damage kayak gini :
  595.     cod_inflict_damage(idattacker, this, damage*(cod_get_user_health(id, 0, 0)), 0.0, idinflictor, damagebits);
  596.  
  597.     // Atau, misalkan kalian ingin bikin damage based dari % max hp musuh :
  598.     cod_inflict_damage(idattacker, this, damage*(cod_get_user_health(this, 0, 0)/10), 0.0, idinflictor, damagebits);
  599.     // Nah yang di atas ini kita nge deal damage ke musuh total damage weapon biasa ditambah 10% dari maximun darah musuh.
  600. ** End of Stat Base Damage
  601.  
  602. IV.H Giving / Taking Weapon + Get User Weapon
  603.     Yak, yang ini ga perlu intro penjelasan yang banyak ya. Intinya, CoD ada function buat Give Weapon ke Player, dan Take Weapon. Untuk melihat weapon yang user sedang pegang, kita akan menggunakan function Native AMXX Get User Weapon yang lagi di pegang saat ini. Langsung aja kita lihat ada function apa saja dan penjelasannya.
  604.  
  605. ** Start of Weapon Function
  606.     cod_give_weapon(id_player, weapon_name);
  607.     // Kasi senjata X ke player dengan id tertentu
  608.     cod_take_weapon(id_player, weapon_name);
  609.     // Nge-ambil / remove senjata dari id player tertentu untuk weapon X
  610.     get_user_weapon(id);
  611.     // Return nama senjata yang SAAT ini user PEGANG DI TANGAN.
  612. ** End of Weapon Function
  613.  
  614.     Sip ga banyak kan ? Cuma ada 3 function kok yang di pelajarin. Sekarang, ayo kita lihat ke contoh dari get_user_weapon, dan contoh dari give & take weapon.
  615.  
  616. ** Start of Weapon Code Example
  617.     new weapon = get_user_weapon(idattacker);
  618.     if(weapon == CSW_MAC10){
  619.         cod_inflict_damage(idattacker, this, 4.0, 0.0, idinflictor, damagebits);
  620.     }
  621.     // Jika weapon == Mac10, deal bonus 4 Damage
  622.  
  623.     public cod_perk_enabled(id){
  624.     cod_give_weapon(id, CSW_P90);
  625.     }
  626.  
  627.     public cod_perk_disabled(id){
  628.     cod_take_weapon(id, CSW_P90);
  629.     }
  630. ** End of Weapon Code Example
  631.  
  632. IV.I "Porting" Plugin
  633.     Kalian mungkin pernah mendengar tentang game yang di Port dari satu platform ke platform lain. Nah, yang ini juga sama, jadi kita akan mem-port sebuah plugin dari satu mod, ke base plugin normal tanpa mod, dan merubahnya untuk mod cod dengan codmod.inc dimasukan.
  634.  
  635.     1. Pertama - tama Cek dulu segala function "Asing" yang seharusnya ga ada di normal CS 1.6, termasuk di Include. Misalkan kalian ambil plugin Zombie Plague. Hapus semua yang berhubungan dengan Zombie Plague, dapat dengan cara gampang Ctrl + F. Tinggal cari aja keyword "Zombie" dan "ZP".
  636.     2. Sebelum menghapus, PERHATIKAN BAIK - BAIK APAKAH ARGUMENT CODE YANG INGIN KALIAN HAPUS SAFE TO DELETE. Misal, ga semua keyword ZP bisa di apus, bisa aja keyword nya dipake di Cvar nya. Untuk Cvar biarin aja, ga usah di rename / di remove, tinggalin aja kayak gitu ga usah di otak atik.
  637.     3. Untuk ZP, brati kalian harus hapus semua kata2 zombie, zp_team atau semacamnya, dan function kayak zp_register_item. Jika ada if yang argument untuk condition-nya dua - dua nya ada zp / zombie, udah apus aja langsung.
  638.     4. Selalu buat backup misalkan pengen nge port sebuah plugin jaga2 untuk backup apabila gagal.
  639.  
  640.     Nah, kita selesai membersihkan Code dari include <zombie_plague> . Sekarang, waktunya kita merubah plugin normal ini ke plugin untuk mod CoD.
  641.     1. Pertama - tama, tentunya kita harus memasukan include <codmod> . Setelah itu, kita harus memasukan function utama Cod, yaitu class_enabled atau perk_enabled, dan class_disabled atau perk_disabled.
  642.     2. Kedua, kita harus cari function "Give Weapon" dari plugin yang tersebut. Seharusnya, semua weapon plugin akan ada semacam function untuk give player weapon yang bersangkutan.
  643.     3. Setelah kalian menemukan function give weapon tersebut, tinggal kalian panggil function tersebut di cod_class_enabled, untuk jaga - jaga aja berikan function cod_give_weapon sebelum memanggil function give weapon yang ada.
  644.     4. Setelah itu, jangan lupa untuk cod_take_weapon di cod_class/perk_disabled, dan "BIASANYA" di setiap plugin weapon custom harusnya akan ada function untuk remove weapon. Jangan lupa function tersebut dipanggil ketika class akan di-disabled.
  645.  
  646.     Harusnya itu aja si kalo ga ada masalah kekw.
  647.  
  648. IV.J Native CS Include & Function
  649.     Untuk lebih detail dan lebih jelasnya lagi, ada baiknya kalian liat sendiri di Documentation Native AMX Mod X yang ada di README di atas. Native CS yang bakal mungkin sering kalian pake untuk code Class dan semacamnya :
  650.  
  651. ** Start of Regular Native Function
  652.     client_print(id, printType, "Message String", variableA, variableB, dan_seterusnya);
  653.     // Nge print "Message" kita ke Client, dengan id untuk Id dari target client kita, print type adalah jenis pesan yang akan kita print ke client, terdapat console, chat, dan center. Pake aja yang print chat dan center ( print_chat, print_center ).
  654.     ColorChat(id, color, "Message", messageId);
  655.     // Nge print "Message" kita ke Client, dengan tambahan warna text. ColorChat memiliki nama lain : client_print_color. Sama persis kayak ColorChat kok
  656.     // Id untuk id penerima, color untuk warna dari message, message yaitu message string, dan messageId cuma nama internal dari ColorChat. Misal untuk messageId, taruh aja new const class_name yang ada di class / perk cod.
  657.     // Gua tambahin lagi dah nanti
  658. ** End of Regular Native Function
  659.  
  660. IV.K Debugging
  661.     Ga kerasa, akhirnya sesi terakhir dari tutorial yang gua bikin setelah gua pensi dari Scripting CoD. Nah, ketika lu debugging, yang harus lu lakukan adalah tenang, kalem, dan pecahkan dengan kepala dingin. Debugging dilakukan dengan 3 cara, yang pertama kita debugging dari console compiler, dari console server ketika plugin di nyalakan, dan yang terakhir IDE kita debugging secara manual, mencari line yang error ada dimana.
  662.  
  663.     Debugging yang bakal pertama kali kita lakukan adalah dari console compiler. Console Compiler akan menampilkan warning dan error apabila terdapat fatal error yang membuat compiler tidak bisa men-compile code yang ada. Yang harus lu lakukan ketika melihat error tersebut pertama - tama lu cek error message di compiler, baca baik - baik error apa, error di line apa, dan perbaiki sebisa mu. Jika terdapat error message tetapi program mu sudah ter-compile, harusnya sudah aman dan tidak ada bug yang sampai fatal error, tetapi harus di-waspadai juga mengenai error message tersebut. Jika cuma "Warning : Loose Identation", warning tersebut dapat di ignore karena cuma permasalahan spasi dan format dari code.
  664.  
  665.     Yang kedua, debugging dari Server. Ketika lu jalanin plugin yang udah ke compile tersebut, jika terdapat error yang tidak menyebabkan fatal error ketika di compile, maka akan dimunculkan error message ketika plugin di load. Misal seperti nanti tiba - tiba muncul kayak "Error : Missing Model test.mdl", atau "Error : Run Time Error", atau bahkan server sampai crash ketika me-load plugin lu. Nah, yang bisa kalian lakukan disable dulu pluginnya, dan cek kembali ada salah dimana, dan kira - kira apa penyebab dari crash tersebut. Dari sini, kita langsung ke debugging ke 3, yaitu debugging manual.
  666.  
  667.     Debugging manual ber-arti kita melakukan debug secara manual dengan cara melihat code yang telah kita tulis. Kita perhatikan baik - baik logic yang telah kita tulis, apakah ada kesalahan atau tidak, karena sering kali masalah yang kelihatan besar padahal cuma salah sedikit di logic gate yang ada, atau bahkan typo sedikit dari nama variable.
  668.  
  669.     Oh iya, satu lagi, jika kalian melakukan update atau memasukan atau meng-edit class yang ada atau semacamnya, JANGAN LUPA UNTUK DI TEST TERLEBIH DULU SEBELUM DIMASUKIN ! Cek terlebih dahulu apakah Perk / Class yang kalian telah buat / edit bekerja dan tidak ada bug / error yang terjadi.
  670.  
  671. IV.L More ?
  672.     // More things to write ?!?!
Add Comment
Please, Sign In to add comment