gini aja bisa ga kk Rizzuh bimbing nya dari kecil kecil. maksudnya 1 by 1 ^^
aku binggung soal na >.<
I AM WOW LOVER
Zhirne : Shaman Lvl 80
Chirne : Druid Lvl 80
Mikelewis : Warrior Lvl 80
1 by 1 .. ??... ok gw mulai aja dari yang mudah
Gw ulang dari awal ya ...
Buat map 32x32.... 94x94 juga ngga masalah, itu semua terserah kamu setelah itu, buka Trigger Module ( Module > Trigger Editor atau pencet F4 ). Pilih Map Initialization, hapus semua isinya dan kemudian rename ke Tes JASS. Langkah selanjutnya
Ok ... semua sudah .... sekarang di dalam Trigger Editor masuk ke Edit > Convert To Custom TextCode:Tes JASS Events Player - Player 1 (Red) skips a cinematic sequence Conditions Actions Game - Display to (All players) the text: Saya Mr. X
sekarang trigger Tes JASS harusnya terlihat seperti ini
Seperti yang kamu lihat di sana ada "TRIGSTR_003" itu merupakan string dari war3map.wts, hal ini tidak usah dipedulikan, ganti saja TRIGSTR_003 menjadi "Saya Mr. X".Code:function Trig_Tes_JASS_Actions takes nothing returns nothing call DisplayTextToForce( GetPlayersAll(), "TRIGSTR_003" ) endfunction //=========================================================================== function InitTrig_Tes_JASS takes nothing returns nothing set gg_trg_Tes_JASS = CreateTrigger( ) call TriggerRegisterPlayerEventEndCinematic( gg_trg_Tes_JASS, Player(0) ) call TriggerAddAction( gg_trg_Tes_JASS, function Trig_Tes_JASS_Actions ) endfunction
Dan seharusnya sekarang menjadi
Ok sebelum mengetes saya akan jelaskanCode:function Trig_Tes_JASS_Actions takes nothing returns nothing call DisplayTextToForce( GetPlayersAll(), "Saya Mr.X" ) endfunction //=========================================================================== function InitTrig_Tes_JASS takes nothing returns nothing set gg_trg_Tes_JASS = CreateTrigger( ) call TriggerRegisterPlayerEventEndCinematic( gg_trg_Tes_JASS, Player(0) ) call TriggerAddAction( gg_trg_Tes_JASS, function Trig_Tes_JASS_Actions ) endfunction
function InitTrig_Tes_JASS takes nothing returns nothing
endfunction
merupakan fungsi untuk meng-setup trigger pada inisiasi map, tidak peduli trigger apa yang kamu buat, semua trigger harus memiliki ini ( sudah kewajiban dari world editor )
kemudian ....
call TriggerRegisterPlayerEventEndCinematic( gg_trg_Tes_JASS, Player(0) )
fungsi dari function ini adalah untuk me-regis event apa yang akan memicu trigger ini. karena tadi kita ambil Player Skipped Cinematic - Event maka line untuk event tadi adalah TriggerRegisterPlayerEventEndCinematic(<TRIGGERYANGMANA>, <DARIPLAYERBERAPA>)
lalu ....
call TriggerAddAction( gg_trg_Tes_JASS, function Trig_Tes_JASS_Actions )
Berguna untuk me-regis action yang akan dilakukan ketika event terjadi... ketika event terjadi, function Trig_Tes_JASS_Actions takes nothing returns nothing akan dieksekusi, apabila ada kondisi, maka kondisi akan dievaluasi terlebih dahulu .....
ok ... itu saja mengenai inisiasi trigger ... boleh diingat pada inisiasi bisa dibuat 2 trigger atau lebih, ( biasa disebut dynamic triggering ) dan triggernya biasanya dihancurkan call DestroyTrigger(<TRIGGERMANA>) karena menyebabkan leak, kecuali yang utama .... hal ini masih ruwet jelasinnya .. jadi ntar aja ::smoke::
yang terakhir
pada function Trig_Tes_JASS_Actions takes nothing returns
terdapat
call DisplayTextToForce( GetPlayersAll(), "Saya Mr.X" )
call DisplayTextToForce(<FORCEMANA>, "<PESAN>")
nah kegunaan dari fungsi ini adalah untuk menampilkan text pada semua player. apabila ingin ke player tertentu saja, bisa digunakan
call DisplayTextToPlayer(Player(0), 0, 0, "saya Mr.X")
call DisplayTextToPlayer(<PLAYERBERAPA>, <POSISIXDARIPESAN, <POSISIYDARIPESAN>, "<PESAN>")
ok balik ke yang awal .....
dengan trigger ini
jalankan map dan pencet escCode:function Trig_Tes_JASS_Actions takes nothing returns nothing call DisplayTextToForce( GetPlayersAll(), "Saya Mr.X" ) endfunction //=========================================================================== function InitTrig_Tes_JASS takes nothing returns nothing set gg_trg_Tes_JASS = CreateTrigger( ) call TriggerRegisterPlayerEventEndCinematic( gg_trg_Tes_JASS, Player(0) ) call TriggerAddAction( gg_trg_Tes_JASS, function Trig_Tes_JASS_Actions ) endfunction
seharusnya ketika mencet esc keluar pesan
saya Mr. X
Ok ... itu aja dl .... gmn ?
Local Variable
Fungsinya sama seperti Global Variable, perbedaannya bisa dilihat pada post ini
Yang harus diingat dari Local
1. Hanya bisa Dideclare diawal fungsi
2. Tidak bisa "diantar / dipindah" ke fungsi lain ( kecuali pada function yang mengambil argumen atau menggunakan local handle variable )
3. local tidak akan menimpa local lainnya
cara pendeklarasian local
Tipe Variable sama seperti pada Global .... contohCode:Local <TIPE VARIABEL> <NAMAVARIABEL> alternatif untuk menset value dari local Local <TIPE VARIABEL> <NAMAVARIABEL> = VALUE
String
Real
Integer
Unit
Location
Item
.
.
.
dll
Nama Variable merupakan ... ya nama dari variable ... kl yg ini terserah kamu apa aja .....
kemudian value bisa diset pada awal pendeklarasian, atau pada tengah2x line ....
Contoh Trigger
coba buat dan pencet escapeCode:function Trig_Tes_JASS_Actions takes nothing returns nothing local string dadu = "ini dadu" local string didi = "ini didi" call DisplayTextToForce( GetPlayersAll(), dadu ) call DisplayTextToForce( GetPlayersAll(), didi ) set dadu = "ini dadu didi" call DisplayTextToForce( GetPlayersAll(), dadu ) endfunction //=========================================================================== function InitTrig_Tes_JASS takes nothing returns nothing set gg_trg_Tes_JASS = CreateTrigger( ) call TriggerRegisterPlayerEventEndCinematic( gg_trg_Tes_JASS, Player(0) ) call TriggerAddAction( gg_trg_Tes_JASS, function Trig_Tes_JASS_Actions ) endfunction
pesan yang ditampilkan seharusnya seperti ini
ini dadu
ini didi
ini dadu didi
ok sampe sini dl .....
wihh wihh makasih banget lo kk rizzuh mo bantuin >.< tq tq. ntar ak coba lagi de
I AM WOW LOVER
Zhirne : Shaman Lvl 80
Chirne : Druid Lvl 80
Mikelewis : Warrior Lvl 80
Revisi dari yang sebelumnya
maksudnya .... kalau trigger dijalankan 2..3 atau berapa kalipun tidak akan mengoverwrite ... misalnya ketika menggunakan wait atau dalam jass TriggerSleepAction(<REALNUMBER>) ... ataupun ketika trigger dijalankan benar2x bersamaan .....3. local tidak akan menimpa local lainnya
btw ... dari yang gw tau .. ada 2 kan di GUI .... wait sama wait(in game time) ..... sekedar informasi ... wait - in game time punya presisi ( ketepatan ) pada game yang lag .... misal kalau kita pake wait ( yg biasa ) 30 detik, pada game yg ngelag ada kemungkinan desynchronize ( ga sinkron ) jadi countdown wait masih jalan pada saat waiting for player ataupun waiting for server bahkan ketika game sedang berjalan ( ga sampe 1 sec biasanya 0, tapi repetitif ) nah kalau menggunakan wait ( game time ) hal sebelumnya bisa dihindari .....
kl di Jass
Wait -> TriggerSleepAction()
Wait - in game time -> PolledWait()
tentang local ... ada 1 challenge ... bisakah kalian membuat item dengan cooldown seperti hand of midas ??... tidak bisa didrop ketika cooldown, tapi bisa didrop ketika tidak cooldown .... can you figure it out ?... ::hdbang::
ok ... onward then ....
Fungsi Dengan Argumen
Ok .... untuk singkatnya argumen merupakan value yang diambil ketika suatu fungsi dipanggil ... bingung ??... ini contoh ...
lihat pada fungsi ekstraCode:function message takes string pesan returns nothing call DisplayTextToPlayer(Player(0), 0, 0, pesan) endfunction function Trig_Tes_JASS_Actions takes nothing returns nothing local string dadu = "ini dadu" local string didi = "ini didi" call message(dadu) endfunction //=========================================================================== function InitTrig_Tes_JASS takes nothing returns nothing set gg_trg_Tes_JASS = CreateTrigger( ) call TriggerRegisterPlayerEventEndCinematic( gg_trg_Tes_JASS, Player(0) ) call TriggerAddAction( gg_trg_Tes_JASS, function Trig_Tes_JASS_Actions ) endfunction
fungsi ini mengambil argumen berupa string .... dan untuk pesan yah ini hanyalah sebuah "nama" kamu bisa memodif sesuka kamu ... mau wawa ... atau balon itu terserah tapi padaCode:function message takes string pesan returns nothing call DisplayTextToPlayer(Player(0), 0, 0, pesan) endfunction
pesan harus diganti menjadi "nama" yang kamu pakai .... dan argumen tadi itu bisa juga dimasukan ke local .... contohCode:call DisplayTextToPlayer(Player(0), 0, 0, pesan)
dan ingat .... pemanggilan fungsi dengan argumen ... harus disertai dengan argumen yang ingin disampaikanCode:function message takes string pesan returns nothing local string surat = pesan call DisplayTextToPlayer(Player(0), 0, 0, surat) endfunction function Trig_Tes_JASS_Actions takes nothing returns nothing local string dadu = "ini dadu" local string didi = "ini didi" call message(dadu) endfunction //=========================================================================== function InitTrig_Tes_JASS takes nothing returns nothing set gg_trg_Tes_JASS = CreateTrigger( ) call TriggerRegisterPlayerEventEndCinematic( gg_trg_Tes_JASS, Player(0) ) call TriggerAddAction( gg_trg_Tes_JASS, function Trig_Tes_JASS_Actions ) endfunction
ok sekian dl .....Code:function message takes string pesan returns nothing local string surat = pesan call DisplayTextToPlayer(Player(0), 0, 0, surat) endfunction function Trig_Tes_JASS_Actions takes nothing returns nothing local string dadu = "ini dadu" local string didi = "ini didi" call message(dadu) endfunction //=========================================================================== function InitTrig_Tes_JASS takes nothing returns nothing set gg_trg_Tes_JASS = CreateTrigger( ) call TriggerRegisterPlayerEventEndCinematic( gg_trg_Tes_JASS, Player(0) ) call TriggerAddAction( gg_trg_Tes_JASS, function Trig_Tes_JASS_Actions ) endfunction
btw lama ga online ... abis nge torrent ..... ::afro2::
Return Value
Sebelumnya kita sudah ngebahas fungsi dengan argumen, sekarang kita akan membicarakan fungsi dengan return value
Secara singkatnya, fungsi akan memberikan value ketika dipanggil. contoh fungsi yang biasa mengembalikan value adalah boolean untuk condition
contoh
Fungsi diatas akan mengambil angka integer random antara 1-5 melalui GetRandomInt(1, 5) kemudian pada return akan dilihat apakah integer random merupakan angka yang lebih kecil atau sama dengan 3 ..... value yang akan dikembalikan adalah True atau False, karena return value yang akan dikembalikan berupa boolean.Code:function randomized takes nothing returns boolean local integer random = GetRandomInt(1, 5) return random <= 3 endfunction
untuk fungsi tes lengkapnya
dari trigger diatas, ketika anda memencet escape, apabila integer acak berupa angka dibawah atau sama dgn 3, maka message dadu akan dipanggil, selain itu message didi akan diambil. cobalah sekarang ....Code:function randomized takes nothing returns boolean local integer random = GetRandomInt(1, 5) return random <= 3 endfunction function message takes string pesan returns nothing call DisplayTextToPlayer(Player(0), 0, 0, pesan) endfunction function Trig_Tes_JASS_Actions takes nothing returns nothing local string dadu = "ini dadu" local string didi = "ini didi" if randomized() == true then call message(dadu) else call message(didi) endif endfunction //=========================================================================== function InitTrig_Tes_JASS takes nothing returns nothing set gg_trg_Tes_JASS = CreateTrigger( ) call TriggerRegisterPlayerEventEndCinematic( gg_trg_Tes_JASS, Player(0) ) call TriggerAddAction( gg_trg_Tes_JASS, function Trig_Tes_JASS_Actions ) endfunction
contoh penggunaan return value yang lain
trigger diatas ketika memencet escape akan memngambil angka integer random antara 1-100, kemudian akan didisplay text angka berapa, dan kemudian pada fungsi.Code:function kuadrat takes integer angka returns integer local integer double = (angka*angka) return double endfunction function message takes string pesan returns nothing call DisplayTextToPlayer(Player(0), 0, 0, pesan) endfunction function Trig_Tes_JASS_Actions takes nothing returns nothing local integer angka = GetRandomInt(1, 100) call message( "angka =" + I2S(angka) ) call message( I2S ( kuadrat(angka) ) ) endfunction //=========================================================================== function InitTrig_Tes_JASS takes nothing returns nothing set gg_trg_Tes_JASS = CreateTrigger( ) call TriggerRegisterPlayerEventEndCinematic( gg_trg_Tes_JASS, Player(0) ) call TriggerAddAction( gg_trg_Tes_JASS, function Trig_Tes_JASS_Actions ) endfunction
akan memberikan argumen pada function kuadrat ( yaitu angka yang tadi ) kemudian akan diproses melaluiCode:function kuadrat takes integer angka returns integer local integer double = (angka*angka) return double endfunction melalui call message( I2S ( kuadrat(angka) ) )
dan akan dikembalikan valuenya, bisa dilihat padaCode:local integer double = (angka*angka)
dan akhirnya value dari double tersebut akan didisplay melalui fungsi call message ....Code:return double
Catatan :
digunakan I2S ( integer to string ) karena value yang dikembalikan berupa integer, dan karena fungsi message mengambil string sebagai argumen, maka integer tadi harus diconvert terlebih dahulu menjadi string.
ok skian dl ::shysmile::
setelah gw baca lagi ... desync kl waitnya makan waktu yang lama .. lebih dari 5 detik ... dibawah itu lebih baik make wait biasa kl diatas itu pake wait - in game timeOriginally Posted by myself
- pengen request jass tag buat di indogamers bisa ga ya ?...., soalnya kl pake code ga ada warnanya![]()
OK ... mulai Poin ini, sebaiknya sudah mengerti tutorial yg sebelumnya, kl ngga ntar bingung ::Jumpy::
Going Advance Now ... prepare some tea is a gud idea ......
Local Handle Variable
Sebelumnya kita sudah tau kalau local tidak bisa dipindahkan ke fungsi lainnya. Itu benar, namun ada cara untuk mentransfernya .... caranya ada 2;
1. Pakai fungsi dengan argumen
2. Local Handle Variable
sekarang kita akan berbicara yang nomor 2, karena untuk banyak trigger yang ini lebih flexibel dan ( kata orang2x smooth ).
Supaya bisa lebih demengerti terlebih dulu akan dijelaskan
Extend Handle
lihat gambar ini
kita ambil contoh fungsi
value argumennya bisa unit, destructible, atau item karena semua tipe itu adalah widgetCode:function DestroyWidget takes widget toDestroy returns nothing
sedangkan pada
value argumennya harus unit, karena widget bukanlah unit.Code:function DestroyUnit takes unit toDestroy returns nothing
sebetulnya semua extensi handle bukan hanya itu saja, gambar diatas hanyalah contoh ....
pohon yang diatas hanyalah untuk menjelaskan leluhur dan keturunan .... setelah baca lebih lanjut akan mengerti maksudnya
Return Bug / Type Casting
contoh klasik dari return bug
Return value dari fungsi adalah integer, line return yang terakhir value yang dikembalikan adalah 0, tapi sebenarnya vaule yang akan dikembalikan adalah h (mengembalikan argumen handle )Code:function H2I takes handle h returns integer return h return 0 endfunction
Fungsi ini akan memngambil Handle Argument dan mengembalikan value integer, yg merupakan pointer handle tadi.
Item merupakan turunan dari widget dan widget adalah "child" dari handle ( lihat atas ), nah dengan ini kita bisa mengambil item melalui integer ( yang fungsi H2I; secara kasarnya fungsi ini mengubah handle menjadi integer ).Code:function I2Item takes integer i returns item return i return null endfunction
Hubungannya dengan Local Handle
Untuk implementasinya, Local Handle harus menggunakan Game Cache. Game Cache berguna untuk mensave data-data di dalam game. Dalam campaign, ini digunakan untuk mensave level, item, xp, dll.
Trigger yang biasa saya gunakan untuk Inisiasi Game Cache
Catatan :Code:function Trig_AbilityCache_Init_Actions takes nothing returns nothing call FlushGameCache(InitGameCache("abilitycache.w3v")) set udg_AbilityCache = InitGameCache("abilitycache.w3v") endfunction //=========================================================================== function InitTrig_AbilityCache_Init takes nothing returns nothing set gg_trg_AbilityCache_Init = CreateTrigger( ) call TriggerAddAction( gg_trg_AbilityCache_Init, function Trig_AbilityCache_Init_Actions ) endfunction
sebelumnya saya sudah membuat global variable bernama AbilityCache (tipenya Game Cache ) dan .W3v merupakan filetype untuk gamecache.
Ok kita lanjut dengan contoh ... Pay Attention now
sebelumnya benda2x ini harus ada di custom script code section
kita coba implementasi dengan slide unitCode://Type Casting function H2I takes handle h returns integer return h return 0 endfunction function I2G takes integer i returns group return i return null endfunction //Copy Group //secara singkatnya di GUI Pick Every Unit in Grup and do Actions function Slide_CopyGroup takes group g returns group set bj_groupAddGroupDest = CreateGroup() call ForGroup(g, function GroupAddGroupEnum) return bj_groupAddGroupDest endfunction
-Trigger Explained-Code:function slide takes unit victim, real casterX, real casterY, integer ranges returns nothing local unit object = victim local real objectX = casterX local real objectY = casterY local integer i = ranges local group g = CreateGroup() local group n local gamecache gc = udg_AbilityCache local timer t = CreateTimer() local string s = I2S(H2I(t)) call GroupAddUnit(g, object) call StoreInteger(gc, s, "range", i) call StoreInteger(gc, s, "group", H2I(g)) call StoreReal(gc, s, "x", objectX) call StoreReal(gc, s, "y", objectY) call StoreReal(gc, s, "speed", 10*i) call TimerStart(t, 0.05, true, function Slide_Move) // Remove Memory Leak set object = null set g = null call DestroyGroup(g) set n = null call DestroyGroup(n) set gc = null set t = null endfunction
untuk yang berwarna merah seharusnya sudah mengerti maksudnya, saya jelaskan yang sisanya.Code:function slide takes unit victim, real casterX, real casterY, integer ranges returns nothing local unit object = victim local real objectX = casterX local real objectY = casterY local integer i = ranges local group g = CreateGroup() local gamecache gc = udg_AbilityCache local timer t = CreateTimer() local string s = I2S(H2I(t))
1. local gamecache gc digunakan sebagai variable untuk memasukan data kepada gamecache
2. local timer t, membuat timer ( timer langsung dibuat karena valuenya adalah CreateTimer(), tapi belum dijalankan )
3. local string s, saya jelaskan urutan dari valuenya .... Pertama kita ambil timer t, karena timer merupakan handle maka kita gunakan H2I dan kita dapatkan integernya, kemudian Integer itu kita convert ke string dengan I2S. Kenapa kita harus convert ke string ??
Lihat pada :
call StoreReal(<GAMECACHEMANA>,<MISIKUNCI>,<KUNCI>,<VAL UE>)Code:call StoreInteger(gc, s, "range", i) call StoreInteger(gc, s, "group", H2I(g)) call StoreReal(gc, s, "x", objectX) call StoreReal(gc, s, "y", objectY) call StoreReal(gc, s, "speed", 10*i)
Ingat!!; s merupakan timer yang kita ubah ke string !!!....
<MISIKUNCI> merupakan timer, mission key adalah unik anggaplah sebagai nama save-an ketika kamu meng-save suatu game. Secara singkat dan kasarnya, yang kita lakukan adalah meng-attach local dengan "menumpang" pada handle yang berupa timer. ( mission key harus berupa string )
<KUNCI> merupakan bagian data yang disetor, anggap kamu punya lemari ( timer tadi ) nah <KUNCI> ini merupakan laci-lacinya.
<VALUE> adalah merupakan value yang disimpan.
Untuk memasukan value pada game cache
ok sekarang kita sudah deklarasi local dan sudah mensave local ke gamecache.
sekarang saya akan jelaskan sisanya
digunakan untuk menambahkan unit pada grup ( Add unit to Group kl di GUI )Code:call GroupAddUnit(g, object)
Memulai timer t pada function slide move ( true disana berarti timer ini merupakan timer yang berulang ulang [ periodic ] )Code:call TimerStart(t, 0.05, true, function Slide_Move)
ok sekarang kita lanjut ke trigger kedua
Code:function Slide_Move takes nothing returns nothing local string s = I2S(H2I(GetExpiredTimer())) local gamecache gc = udg_AbilityCache local real x = GetStoredReal(gc, s, "x") local real y = GetStoredReal(gc, s, "y") local integer i = GetStoredInteger(gc, s, "range") local group g = Slide_CopyGroup(I2G(GetStoredInteger(gc, s, "group"))) local real dur = GetStoredReal(gc, s, "dur")+0.05 local real ux local real uy local real a local unit f local real p = GetStoredReal(gc, s, "speed")-0.5/(1+0.5*i) if dur < 0.2+0.1*i then loop set f = FirstOfGroup(g) exitwhen f == null set ux = GetUnitX(f) set uy = GetUnitY(f) set a = Atan2(uy-y, ux-x) call SetUnitPosition(f, ux+p*Cos(a), uy+p*Sin(a)) call GroupRemoveUnit(g, f) endloop call StoreReal(gc, s, "dur", dur) call StoreReal(gc, s, "speed", p) else call DestroyGroup(I2G(GetStoredInteger(gc, s, "group"))) call FlushStoredMission(gc, s) call DestroyTimer(GetExpiredTimer()) endif // Remove Memory Leak set gc = null call DestroyGroup(g) set g = null set f = null endfunctionuntuk bagian "eksekusinya"Code:local string s = I2S(H2I(GetExpiredTimer())) //sekarang kita akan menerjemahkan timer string tadi ( dari handle ke integer ke string local gamecache gc = udg_AbilityCache local real x = GetStoredReal(gc, s, "x") local real y = GetStoredReal(gc, s, "y") local integer i = GetStoredInteger(gc, s, "range") local group g = Slide_CopyGroup(I2G(GetStoredInteger(gc, s, "group"))) local real dur = GetStoredReal(gc, s, "dur")+0.05 //karena dur sebelumnya tidak ada/disave sebelumnya maka valuenya = 0 local real p = GetStoredReal(gc, s, "speed")-0.5/(1+0.5*i) //Mengambil Value dari Cache, caranya mirip ketika mensave local real ux local real uy local real a local unit f
patut diingat fungsi ini akan diulang terus menerus karena memakai timer
Huff selesai jg ..... boleh dicoba triggernya kl mau ....Code:if dur < 0.2+0.1*i then // dur ini dimulai dari 0.05 dan ingat karena fungsi ini diulang jadi trigger ini akan dieksekusi terus menerus baca bawah agar mengerti loop set f = FirstOfGroup(g) exitwhen f == null set ux = GetUnitX(f) set uy = GetUnitY(f) set a = Atan2(uy-y, ux-x) call SetUnitPosition(f, ux+p*Cos(a), uy+p*Sin(a)) // saya harap anda dapet nilai 9 untuk matematika di rapor : ) call GroupRemoveUnit(g, f) endloop call StoreReal(gc, s, "dur", dur) call StoreReal(gc, s, "speed", p) // nah value dari dur dan speed akan disave ingat karena trigger ini diulang2x // pada local real dur = GetStoredReal(gc, s, "dur")+0.05 // dur akan disave 0.05 + 0.05 dst sampai memenuhi boolean diatas // hal yang sama berlaku pada speed else call DestroyGroup(I2G(GetStoredInteger(gc, s, "group"))) call FlushStoredMission(gc, s) call DestroyTimer(GetExpiredTimer()) // ketika semua sudah selesai else akan dieksekusi, timer dihilangkan dan // cache diflush ( kecuali mau ngabisin memory cache ) // grup harus didestroy meski dalam gamecache endif
oh ya btw implementasi buat trigger diatas
GUI
Code:Single Target Spell Instant Events Unit - A unit Starts the effect of an ability Conditions (Ability being cast) Equal to Sleep Actions Custom script: call slide(GetSpellTargetUnit(), GetUnitX(GetTriggerUnit()), GetUnitY(GetTriggerUnit()) , 3)PS:Code:Group Target Spell Events Unit - A unit Starts the effect of an ability Conditions (Ability being cast) Equal to War Stomp Actions Custom script: set bj_wantDestroyGroup = true Unit Group - Pick every unit in (Units within 300.00 of (Position of (Casting unit)) matching (((Matching unit) belongs to an enemy of (Owner of (Casting unit))) Equal to True)) and do (Actions) Loop - Actions Custom script: call slide(GetEnumUnit(), GetUnitX(GetTriggerUnit()), GetUnitY(GetTriggerUnit()) , 3)
Semoga ga Terlalu bikin pusing
Complete Trigger Yang Atas
Masukan di Custom Script Section
Caranya :
1.Di Trigger Editor, klik gambar map ( yang ada nama map kamu )
2.Copy Paste Seluruh isinya kedalam Custom Script code Section di kanan
Masukan Inisiasi Game CacheCode://Type Casting function H2I takes handle h returns integer return h return 0 endfunction function I2G takes integer i returns group return i return null endfunction //Copy Group //secara singkatnya di GUI Pick Every Unit in Grup and do Actions function Slide_CopyGroup takes group g returns group set bj_groupAddGroupDest = CreateGroup() call ForGroup(g, function GroupAddGroupEnum) return bj_groupAddGroupDest endfunction function Slide_Move takes nothing returns nothing local string s = I2S(H2I(GetExpiredTimer())) local gamecache gc = udg_AbilityCache local real x = GetStoredReal(gc, s, "x") local real y = GetStoredReal(gc, s, "y") local integer i = GetStoredInteger(gc, s, "range") local group g = Slide_CopyGroup(I2G(GetStoredInteger(gc, s, "group"))) local real dur = GetStoredReal(gc, s, "dur")+0.05 local real ux local real uy local real a local unit f local real p = GetStoredReal(gc, s, "speed")-0.5/(1+0.5*i) if dur < 0.2+0.1*i then loop set f = FirstOfGroup(g) exitwhen f == null set ux = GetUnitX(f) set uy = GetUnitY(f) set a = Atan2(uy-y, ux-x) call SetUnitPosition(f, ux+p*Cos(a), uy+p*Sin(a)) call GroupRemoveUnit(g, f) endloop call StoreReal(gc, s, "dur", dur) call StoreReal(gc, s, "speed", p) else call DestroyGroup(I2G(GetStoredInteger(gc, s, "group"))) call FlushStoredMission(gc, s) call DestroyTimer(GetExpiredTimer()) endif // Remove Memory Leak set gc = null call DestroyGroup(g) set g = null set f = null endfunction function slide takes unit victim, real casterX, real casterY, integer ranges returns nothing local unit object = victim local real objectX = casterX local real objectY = casterY local integer i = ranges local group g = CreateGroup() local group n local gamecache gc = udg_AbilityCache local timer t = CreateTimer() local string s = I2S(H2I(t)) call GroupAddUnit(g, object) call StoreInteger(gc, s, "range", i) call StoreInteger(gc, s, "group", H2I(g)) call StoreReal(gc, s, "x", objectX) call StoreReal(gc, s, "y", objectY) call StoreReal(gc, s, "speed", 10*i) call TimerStart(t, 0.05, true, function Slide_Move) // Remove Memory Leak set object = null set g = null call DestroyGroup(g) set n = null call DestroyGroup(n) set gc = null set t = null endfunction
caranya :
1. Bikin Trigger dengan nama AbilityCache Init
2. masuk ke Edit > Conver to Custom Text
3. Copy paste yang dibawah ini
Cara ImplementasiCode:function Trig_AbilityCache_Init_Actions takes nothing returns nothing call FlushGameCache(InitGameCache("abilitycache.w3v")) set udg_AbilityCache = InitGameCache("abilitycache.w3v") endfunction //=========================================================================== function InitTrig_AbilityCache_Init takes nothing returns nothing set gg_trg_AbilityCache_Init = CreateTrigger( ) call TriggerAddAction( gg_trg_AbilityCache_Init, function Trig_AbilityCache_Init_Actions ) endfunction
call slide(<UNITSLIDE>,<POSISIXCASTER>,<POSISIYCASTER>, <INTEGERSTARTSPEED>)
Code:Single Target Spell Instant Events Unit - A unit Starts the effect of an ability Conditions (Ability being cast) Equal to Sleep Actions Custom script: call slide(GetSpellTargetUnit(), GetUnitX(GetTriggerUnit()), GetUnitY(GetTriggerUnit()) , 3)Code:Group Target Spell Events Unit - A unit Starts the effect of an ability Conditions (Ability being cast) Equal to War Stomp Actions Custom script: set bj_wantDestroyGroup = true Unit Group - Pick every unit in (Units within 300.00 of (Position of (Casting unit)) matching (((Matching unit) belongs to an enemy of (Owner of (Casting unit))) Equal to True)) and do (Actions) Loop - Actions Custom script: call slide(GetEnumUnit(), GetUnitX(GetTriggerUnit()), GetUnitY(GetTriggerUnit()) , 3)
Hmmm ... gw ga ada lagi yang perlu dikasi tau, sisanya tergantung ke-kreatifan masing2x ..... Mungkin nanti kl gw nemu hal baru / masalah baru nanti gw share .....
untuk sekarang kl ada yang mo nanya2x silahkan saja .....
btw ... untuk native list ky
GetTriggerUnit()
TriggerSleepAction()
GetSpellTargetUnit()
.
.
.
dll
bisa liat di jass manual atau di jass craft ( lihat di my resource file )
ok sekian dl .... ::biggrinangelA::
Native Function dan Non Native Function
Yang udah pernah nyoba, terutama pake jass craft pasti sadar kalau ada 2 fungsi yang sama tapi bedanya ada BJ di depan; contoh
IsUnitHiddenBJ(<unitmana>)
IsUnitHidden(<unitmana>)
keduanya memeiliki kegunaan yang sama, apakah unit ini di-hide atau tidak... nah perbedaan kedua fungsi ini adalah
IsUnitHiddenBJ() merupakan Fungsi
sedangkan IsUnitHidden() merupakan NativeCode:function IsUnitHiddenBJ takes unit whichUnit returns boolean return IsUnitHidden(whichUnit) endfunction
perbedaan antara keduanya adalah, dengan menggunakan native ekseskusi fungsi lebih cepat, sekitar 0,3 milisec dan mengurangi kerja yang harus dilakukan oleh komputer.Code:constant native IsUnitHidden takes unit whichUnit returns boolean
waw...JASS tutors in Indonesian language?
nice kk rizzuh! ^^
thx yah...coz gw capek bc pny vexorian...harus pake kamus
mm...sebenernya gak sulit2 amat koq blajar JASS
yg sulit....ngapalin Syntaxnya --"
im not good at it for sure...
Anyway,nice tutors ^^
Syntax library ada banyak .... kynya bakal susah buat diinget2x .... makanya gw pake jass craft ... soalnya ada panduan buat syntaxnya ....
Gw jg waktu pertama belajar jass emang mumet .... tapi yah kl dah ngerti enak sih ....
gw jg baca punya vexorian ... ampe gw print malah biar enak bacanya .... yah tapi sebanding lah ....
1 1/2 taun lalu sempet belajar jass ... tapi pusing ... dah gitu berenti ... baru 6-7 bulan lalu belajarin lg .....![]()
awal emang bisa bikin pusing ... tapi kl dah ngerti enak kok .... ::miaw::
Share This Thread