• 🏆 Texturing Contest #33 is OPEN! Contestants must re-texture a SD unit model found in-game (Warcraft 3 Classic), recreating the unit into a peaceful NPC version. 🔗Click here to enter!
  • It's time for the first HD Modeling Contest of 2024. Join the theme discussion for Hive's HD Modeling Contest #6! Click here to post your idea!

GUI CLASS & TUTORIAL

Status
Not open for further replies.
Level 13
Joined
Jan 30, 2012
Messages
1,298

:infl_thumbs_up:SELAMAT DATANG DI GUI CLASS & TUTORIAL:infl_thumbs_up:


Baiklah saya mulai dengan perkenalan dulu:
Nickname: DivineLight
Umur: 14 Tahun
Kota Asal: Pontianak

Baiklah Saya akan mulai dengan GUI Tingkat Beginner (Pemula)

Table of Contents:
Incomplete


I. Beginner

Saya akan mulai dari Basic
apa itu GUI? semua pasti bertanya tanya kalo baru ketemu dengan trigger editor.
GUI adalah "Graphical User Interface", yaitu kita bisa memanipulasi setiap aspek yang telah ada di trigger editor. Berbeda dengan Jass yang kita tulis sendiri dengan bahasa Warcraft 3, tapi GUI jga bisa diubah ke Jass secara efisien akan dibahas nanti. Sampai di sini ada yang bingung?
ayo kita baru mulai lo..

1. Fungsi Trigger

Note: Setiap Trigger bisa dibuat dengan metode yg berbeda
kamu akan mengetahuinya kalo sudah berpngalaman
ada 3 Fungsi kategori (Events, Conditions & Actions):
  • Trigger Functions
    • Events
    • Conditions
    • Actions
yang dimaksudkan adalah saat ada penyebab ada efek
penyebab = events
efek = Actions
dengan conditions sebagai pilihan, setiap kondisi bertemu efek muncul

4494d1175635322-basics-triggers-events.gif
Events
Trigger akan dimulai saat event bertemu.
Note: Kamu bisa memulai Trigger dri Trigger lain tnpa event bertemu. "run"

4493d1175635322-basics-triggers-condition.gif
Conditions
Condition adalah keperluan yg hrus Trigger prhatikan
actions tidak akan dimulai kecuali syarat condition terpenuhi

4491d1175635322-basics-triggers-actions.gif
Actions
jika event berlgsung, condition bertemu, maka action ini akan dimulai

Contoh Trigger
Menghidupkan Hero #1
4494d1175635322-basics-triggers-events.gif
4491d1175635322-basics-triggers-actions.gif

ini contoh saya akan mendemonstrasikan cara Menghidupkan Hero tnpa condition
  • Reive #1
    • Events
      • Unit - A unit Dies
    • Conditions
    • Actions
      • Hero - Instantly revive (Triggering unit) at (Position of (Triggering unit)), Show revival graphics
Menghidupkan Hero #2
Menghidupkan Hero #2
4494d1175635322-basics-triggers-events.gif
4493d1175635322-basics-triggers-condition.gif
4491d1175635322-basics-triggers-actions.gif

ini contoh saya akan mendemonstrasikan cara Menghidupkan Hero dengan condition
  • Revive #2
    • Events
      • Unit - A unit Dies
    • Conditions
      • (Owner of (Triggering unit)) Equal to Player 1 (Red)
    • Actions
      • Hero - Instantly revive (Triggering unit) at (Position of (Triggering unit)), Show revival graphics

2. Variable Editor


Variable

4507d1181684515t-basics-triggers-triggermodules.jpg

(Dari kiri ke kanan: Variables... (Ctrl+B), New Category (Ctrl+G), New Trigger (Ctrl+T), New Trigger Comment (Ctrl+M), New Event (Ctrl+E), New Condition (Ctrl+D), New Action (Ctrl+R).

Apa itu Variable?
Variable itu seperti ruang kecil untuk menyimpan sesuatu, seperti flash disk gitu lo.. kamu bisa menyimpan sesuatu yg ingin kamu gunakan nanti

Membuat Variable
Waktunya Membuat Variable! prtama buka menu Variable
lalu buat Variable

ayo kita buat Variable yang memantau Kills
-di Variable Name ketik Kills
-di Variable Type pilih Integer
-Klik ok
variables31cy.png


ok ini Variable prtamamu, selamat!

Menggunakan Variable
karena kamu sudah membuat Variable prtamamu kita lanjut ke tahap kedua
kita akan membuat trigger yang memantau Kills milik Player 1 dan Player 1 dapat mengecek Kills yang dimilikiny
kita melakukan ini:
  • Kills
    • Events
      • Unit - A unit Dies
    • Conditions
      • (Owner of (Killing unit)) Equal to Player 1 (Red)
    • Actions
      • Set Kills = (Kills + 1)
  • Kills Check
    • Events
      • Player - Player 1 (Red) types a chat message containing -Kills as An exact match
    • Conditions
    • Actions
      • Game - Display to (All players) the text: (String(Kills))
      • -------- (string(kills)) yaitu kita mengubah Variable Integer ke Variable string --------
      • -------- yang berupa teks --------
yay berhasil! mudah kan?

Menggunakan Array
sekarang kita Menggunakan ini hanya untuk Player 1 kan?
gimana kalo semua Player?
apa terdengar sulit? sebenarnya mudah banget
kamu hanya harus Menggunakan Array Variable
Array Variables seperti kumpulan Variable yg memiliki type yang sama, cara kerjanya dengan cara memasukkan nomor
misalnya:
Variables[1] akan sangat berbeda dengan Variables[2], [3] dan seterusnya

sebenarnya ini digunakan hanya jika dibutuhkan karena akan lebih lamban dibandingkan tanpa array. kamu harus kembali ke menu Variable, kemudian edit Kills Variable yang baru kamu buat lalu check kotak array yg tdiny kosong ini dia, sekarang Variablemu array
variables56nh.png

tip: Array SIZE hanya untuk berpa banyak Variable yang kamu inginkan saat prtama digunakan
Contoh:
  • All Kills
    • Events
      • Unit - A unit Dies
    • Conditions
    • Actions
      • Set Kills[(Player number of (Owner of (Killing unit)))] = (Kills[(Player number of (Owner of (Triggering unit)))] + 1)
  • All Kills Check
    • Events
      • Player - Player 1 (Red) types a chat message containing -kills as An exact match
      • Player - Player 2 (Blue) types a chat message containing -kills as An exact match
      • Player - Player 3 (Teal) types a chat message containing -kills as An exact match
      • Player - Player 4 (Purple) types a chat message containing -kills as An exact match
      • Player - Player 5 (Yellow) types a chat message containing -kills as An exact match
      • Player - Player 6 (Orange) types a chat message containing -kills as An exact match
      • Player - Player 7 (Green) types a chat message containing -kills as An exact match
      • Player - Player 8 (Pink) types a chat message containing -kills as An exact match
      • Player - Player 9 (Gray) types a chat message containing -kills as An exact match
      • Player - Player 10 (Light Blue) types a chat message containing -kills as An exact match
      • Player - Player 11 (Dark Green) types a chat message containing -kills as An exact match
      • Player - Player 12 (Brown) types a chat message containing -kills as An exact match
    • Conditions
    • Actions
      • Game - Display to (All players) the text: ((Name of (Triggering player)) + ( + (String(Kills[(Player number of (Triggering player))]))))
kamu telah sukses dengan Variable, sekarang tinggal praktek
Tugas
Buat satu trigger yang mengecek uang/gold kita untuk semua Player

Catatan
Kalo ada kesulitan jgan malu bertanya.. VM/PM saya atau Daffa
Tolong jgan berdiskusi disini, thread ini khusus Tutorial dan GUI CLASS melainkan diskusi disini.
Terima Kasih

~DivineLight
 
Level 13
Joined
Jan 30, 2012
Messages
1,298

II. Trigger Editor


1. Local Variables

Tidak harus dipelajari sebagai GUIer tp ini juga dpat berguna
Local Variables sgat berguna dan mereka Lokal untuk setiap fungsi. Ini artinya mereka dapat membantumu mencapai MUI
mereka hanya dapat digunakan melalui Custom Script. tpi kmu dpat menggunakan metode shadowing akan dijelaskan nanti
  • -------- pertama beri kata kunci Local kemudian type variable kemudian nama yang kamu inginkan --------
  • -------- local <variable type> <name> --------
  • -------- Seperti diatas --------
  • Custom script: local unit u = GetTriggerUnit()
GetTriggerUnit() dimaksudkan kepada (Triggering Unit) di GUI, untuk daftar persamaan GUI event response. Lihat daftar dibawah ini:
persamaan GUI - Jass
Unit Event response:
  • (Last created unit) = bj_lastCreatedUnit
  • (Last restored unit) = bj_lastLoadedUnit
  • (Last replaced unit) = bj_lastReplacedUnit
  • (Last Haunted Gold Mine) = bj_lastHauntedGoldMine
  • (Picked unit) = GetEnumUnit()
  • (Matching unit) = GetFilterUnit()
  • (Attacked unit) = GetTriggerUnit()
  • (Attacking unit) = GetAttacker()
  • (Buying unit) = GetBuyingUnit()
  • (Cancelled structure) = GetCancelledStructure()
  • (Casting unit) = GetSpellAbilityUnit()
  • (Constructing structure) = GetConstructingStructure()
  • (Constructed structure) = GetConstructedStructure()
  • (Damage source) = GetEventDamageSource()
  • (Decaying unit) = GetDecayingUnit()
  • (Dying unit) = GetTriggerUnit()
  • (Entering unit) = GetTriggerUnit()
  • (Hero manipulating item) = GetManipulatingUnit()
  • (Killing unit) = GetKillingUnit()
  • (Learning Hero) = GetLearningUnit()
  • (Leaving unit) = GetLeavingUnit()
  • (Leveling Hero) = GetLevelingUnit()
  • (Loading unit) = GetLoadedUnit()
  • (Ordered unit) = GetOrderedUnit()
  • (Ownership-changed unit) = GetChangingUnit()
  • (Researching unit) = GetResearchingUnit()
  • (Revivable Hero) = GetRevivableUnit()
  • (Reviving Hero) = GetRevivingUnit()
  • (Selling unit) = GetSellingUnit()
  • (Sold unit) = GetSoldUnit()
  • (Summoned unit) = GetSummonedUnit()
  • (Summoning unit) = GetSummoningUnit()
  • (Target unit of issued order) = GetOrderTargetUnit()
  • (Target unit of ability being cast) = GetSpellTargetUnit()
  • (Targeted unit) = GetEventTargetUnit()
  • (Trained unit) = GetTrainedUnit()
  • (Transporting unit) = GetTransportUnit()
  • (Triggering unit) = GetTriggerUnit()
  • (Rally-Point of (.....) as a unit) = GetUnitRallyUnit( replace with one above)

Item Event response:
  • (Last created item) = GetLastCreatedItem()
  • (Last dropped item) = GetLastRemovedItem()
  • (Picked item) = GetEnumItem()
  • (Matching item) = GetFilterItem()
  • (Item being manipulated) = GetManipulatedItem()
  • (Sold Item) = GetSoldItem()
  • (Target item of issued order) = GetOrderTargetItem()
  • (Target item of ability being cast) = GetSpellTargetItem()

Shadowing Global Variables
saat kamu membuat global variable di editor, kamu harus menggunakan prefix udg_ di JASS atau Custom Script
udg_ maksudnya user defined global contoh:
Variable TempUnit menjadi udg_TempUnit di custom script
Shadowing Global Variables mengijinkan kita untuk menggunakan local sebagai masukan untuk fungsi GUI
saya akan menggunakan Variable unit TempUnit
untuk Shadow buat local seperti ini:

shadowed global variable
  • Custom script: local unit udg_tempUnit = GetTriggerUnit()
tanpa shadowed global variable
  • Custom script: local unit u = GetTriggerUnit()
  • Custom script: set udg_tempUnit = u
Perbedaanya sedikit tapi berguna. saat kamu membuat action kamu tidak akan menemukan local variable sebagai pilihan, kalo kamu memiih global dan local variable menggunakan nama yang sama. itu justru mengijinkanmu menggunakan local untuk action.

Contoh Shadowing Global:
  • Dying unit
  • Events
    • Unit - A unit Dies
  • Conditions
    • ((Triggering unit) is A Hero) Equal to True
  • Actions
    • Custom script: local unit udg_tempUnit = GetTriggerUnit()
    • Custom script: local location udg_tempPoint = Location( GetUnitX( udg_tempUnit), GetUnitY( udg_tempUnit))
    • Wait 10.00 seconds
    • Hero - Instantly revive tempUnit at tempPoint, Hide revival graphics
    • Custom script: set udg_tempUnit = null
    • Custom script: call RemoveLocation( udg_tempPoint)
    • Custom script: set udg_tempPoint = null
 
baiklah, saya akan ambil bagian di Tutorial ini juga, sebelumnya saya perkenalkan diri :
Nickname : Daffa the Mage
Umur : 13 Tahun
Asal : Banjarmasin

2. Memory Leaks
ini wajib dipelajari bagi setiap GUIer, bahkan Jasser [sebutan untuk ahli Jass] saja masih memakainya, tapi dengan cara yang berbeda.

para newbie sering bilang "yang penting triggernya kerja", padahal itu tidak boleh.
dari pengalaman saya dalam triggering, hampir semua Handle (data unit, unit group, point/posisi tempat dan efek khusus) seperti Position of (Triggering Unit) itu leak.

berdasarkan info dari para ahli Triggering di Hive, Leaks bisa mengakibatkan isu performa dan berbagai hal lainnya seperti desync (disconnected saat main online), maka dalam triggering, aspek ini wajib diperhatikan.

oke, mari kita mulai :
  • Ini Leak
    • Events
      • Unit - A unit Dies
    • Conditions
    • Actions
      • Unit - Create 1 Mr Hello for Player 1 (Red) at (Position of (Triggering unit)) facing Default building facing (270.0) degrees
      • Unit - Create 1 Mr Boom! for Player 1 (Red) at (Position of (Triggering unit)) facing Default building facing (270.0) degrees
      • -------- diatas ada 1 Point (Posisi) yang Leak 2 Kali --------
trigger penuh leak diatas mungkin tidak lag saat 5 atau 6 unit mati, tapi kalo 1000 unit mati? lagnya akan sangat terasa bahkan terkadang desync ato hang.

solusi biar aman? buat sebuah Variable (ada di Post 1 dalam Tutorial ini) dengan tipe point, lalu kita gunakan Set NamaVariable = Position of Triggering Unit, lalu gunakan Variable itu untuk menggantikan Point2 pada actions diatas, di akhir kita gunakan custom script ini : Call RemoveLocation (udg_NamaVariable).
ganti NamaVariable dengan Variable pointmu.

Variable Point ane akan ane namakan TempPoint, Hasil yang bebas leak :
  • Ini Bebas Leak
    • Events
      • Unit - A unit Dies
    • Conditions
    • Actions
      • Set TempPoint = (Position of (Triggering unit))
      • Unit - Create 1 Mr Hello for Player 1 (Red) at (Position of (Triggering unit)) facing Default building facing (270.0) degrees
      • Unit - Create 1 Mr Boom! for Player 1 (Red) at (Position of (Triggering unit)) facing Default building facing (270.0) degrees
      • Custom script: call RemoveLocation (udg_TempPoint)

daftar action untuk menghapus leaks :
  • Daftar Fungsi
    • Events
    • Conditions
    • Actions
      • -------- Untuk Posisi --------
      • -------- Type Variable yang diperlukan : Point --------
      • Custom script: call RemoveLocation (udg_NamaVariable)
      • -------- Untuk Unit Grup --------
      • -------- Type Variable yang diperlukan : Unit Group --------
      • Custom script: call DestroyGroup (udg_NamaVariable)
      • -------- Untuk Special Effect --------
      • Special Effect - Destroy (NamaVariable)
      • -------- Untuk Player Grup --------
      • -------- Type Variable yang diperlukan : Player Group --------
      • -------- Peringatan : All Players tidak leak dan akan mengakibatkan masalah menghapusnya --------
      • Custom script: call DestroyForce (udg_NamaVariable)
ganti NamaVariable dengan Variable yang kamu gunakan, jangan menghapus prefiks udg nya.

jika masih penasaran soal leaks, baca Thread ini

Catatan :
1. Jass itu Case Sensitive, maka hati hati menulis fungsinya, karena WE langsung memberi error jika salah kapital hurufnya.
2. Jass menggunakan _ sebagai pemisah, contoh : Hello All akan menjadi Hello_All
 
Status
Not open for further replies.
Top