Mengingat dan menimbang... sekaligus meramaikan dan merapikan, sekaligus membuat SF ini lebih berguna dan lebih "sharable".
Mari kita share System, API, function, template atau apapun disini... Mau? mau laah...
Nanti gw index di sini ya... (ato Rain mungkin yang bisa juga?)
================================================== ================== FUNCTION LIST
================================================== ================== Moving Unit API
by Section
12-07-12, 13:48
Section
Moving Unit API | aka Slide API
Yey... sudah bisa lagi... Alhamdulillah :pgrin:
Oke dimulai dari saya ya... (sori rotflow ane duluan XD)
Moving Unit API Type : JASS (pure aka vanilla)
Interface yang dipakai :
Quote:
real XYDist(real X1, real Y1, real X2, real Y2)
Serupa dengan DistanceBetweenPoints(), namun parameternya X dan Y. X1 = Koordinat X asal Y1 = Koordinat Y asal X2 = Koordinat X tujuan Y2 = Koordinat Y tujuan
Quote:
void SetUnitPosEx( unit wUnit, real moveSize, real tgtX, real tgtY )
Memindahkan wUnit sejauh moveSize menuju arah lokasi Target X,Y wUnit = Unit yang ingin dipindah moveSize = Jarak perpindahan tgtX = Koordinat X acuan tujuan tgtY = Koordinat Y acuan tujuan
Quote:
void StopMovingUnitXY( trigger t )
Core!
Menghentikan proses bergerak.
t = Trigger proses MoveUnitXY()
Quote:
void UpdateMoveUnitSpeed( trigger t, real newSpeed )
Core!
Mengupdate kecepatan gerak suatu proses bergerak. t = Trigger proses MoveUnitXY() newSpeed = kecepatan yang baru.
Quote:
void UpdateMoveUnitXY( trigger t , real newX, real newY)
Core!
Mengupdate lokasi pindah suatu proses bergerak. t = Trigger proses MoveUnitXY() newX = Koordinat X tujuan baru newY = Koordinat Y tujuan baru
Quote:
trigger MoveUnitXY( unit wUnit, real speed, real X, real Y, trigger exec )
Main Core!
Membuat wUnit bergerak dengan kecepatan speed ke koordinat X Y tujuan, apabila sampai tujuan, maka trigger exec dijalankan. wUnit = Unit yang ingin digerakkan speed = Kecepatan gerak ny. X = Koordinat X tujuan. Y = Koordinat Y tujuan. exec = Trigger yang akan dijalankan (Run) ketika Unit sampai di tujuan.
Perhatian! Fungsi ini mengembalikan value "trigger". Tujuannya adalah untuk kontrol seperti Update dan Stop.
Spoiler untuk code nya :
Code:
function XYDist takes real X1, real Y1, real X2, real Y2 returns real
local real dx = X2 - X1
local real dy = Y2 - Y1
return SquareRoot(dx * dx + dy * dy)
endfunction
function SetUnitPosEx takes unit wUnit, real moveSize, real tgtX, real tgtY returns nothing
local real getAngle = bj_RADTODEG * Atan2(tgtY - GetUnitY(wUnit), tgtX - GetUnitX(wUnit))
local real x = GetUnitX(wUnit) + moveSize * Cos(getAngle * bj_DEGTORAD)
local real y = GetUnitY(wUnit) + moveSize * Sin(getAngle * bj_DEGTORAD)
call SetUnitPosition(wUnit, x,y)
call SetUnitFacing(wUnit, getAngle)
endfunction
function StopMovingUnitXY takes trigger t returns nothing
call FlushChildHashtable(udg_SkillTable, GetHandleId(t) )
call DestroyTrigger(t)
endfunction
function MoveProc takes nothing returns nothing
//Unpack the load
local unit wUnit = LoadUnitHandle (udg_SkillTable, GetHandleId(GetTriggeringTrigger()), StringHash("wUnit") )
local real speed = LoadReal (udg_SkillTable, GetHandleId(GetTriggeringTrigger()), StringHash("speed") )
local real X = LoadReal (udg_SkillTable, GetHandleId(GetTriggeringTrigger()), StringHash("X") )
local real Y = LoadReal (udg_SkillTable, GetHandleId(GetTriggeringTrigger()), StringHash("Y") )
local trigger exec= LoadTriggerHandle(udg_SkillTable, GetHandleId(GetTriggeringTrigger()), StringHash("Exec") )
//Let's process the movement
//First, check if UnitX is bigger than target X (also Y), to determine the upside/downside.
//Oh, we can use XYDist!
call SetUnitPosEx( wUnit, speed * udg_updateSpeed, X, Y )
//Check!
if XYDist(GetUnitX(wUnit), GetUnitY(wUnit), X, Y ) <= speed * udg_updateSpeed then
//Finish touch here!
//Note that we can't create new listener. Therefore, we use Trigger!
//call ExecuteFunc(exec)
call TriggerExecute(exec)
//Clean this mess and let it tingle
call StopMovingUnitXY(GetTriggeringTrigger())
endif
//Trying to Nullify the allocated pointer
//Because even pointer takes 4 byte for declaration, right?
set wUnit = null
set exec = null //don't destroy! it won't work...
endfunction
function UpdateMoveUnitSpeed takes trigger t, real newSpeed returns nothing
call SaveReal(udg_SkillTable, GetHandleId(t), StringHash("speed"), newSpeed)
endfunction
function UpdateMoveUnitXY takes trigger t, real newX, real newY returns nothing
call SaveReal(udg_SkillTable, GetHandleId(t), StringHash("X"), newX)
call SaveReal(udg_SkillTable, GetHandleId(t), StringHash("Y"), newY)
endfunction
function MoveUnitXY takes unit wUnit, real speed, real X, real Y, trigger exec returns trigger
local trigger t = CreateTrigger()
//local timer tim = CreateTimer() //A bit useless, and unknown usage. But we will find out! OH useless... >_<
//Packing before expanding
//Return huff... w00t with return trigger? ooo...
return t
endfunction
Global var Requirement :
Spoiler untuk globals :
Code:
globals
hashtable udg_SkillTable
real udg_updateSpeed = 0.04 //Put it
endglobals
Perhatian!
- Update Framerate untuk pergerakkan bisa diganti di global udg_updateSpeed. Default 0.04, rekomendasinya 0.02 untuk AoS dan Adventure.
- Function di atas bisa diaplikasikan untuk segala jenis unit. Maka bisa dipakai juga untuk dummy Missile atau knockback. (hanya Advancing dari SetUnitPosition)
- Kenapa saya menggunakan return trigger? Alasannya adalah karena JASS tidak mengenal adanya 'Class'. Sedangkan update speed, update lokasi atau stop pergerakkan yang sifatnya "Interrupt" sepertinya diperlukan, dan itu membutuhkan pointer. Maka dari itu saya mendefinisikan trigger untuk indikator fisik pointernya. Hal ini dibantu dengan global hashtable udg_SkillTable.
saya belum coba tes mapnya (karena jarang buka WE seih)
btw, liat-liat di postnya triggernya di create - destroy, apa mending gak di recycle aja?
13-07-12, 11:59
chukky-jr
kalo bikin trigger baru, effectnya gimana sih? kurang ngerti sama returns trigger, masih jarang pake jass
13-07-12, 12:49
rotflow
Yep... Section's back...
aaaaand... it's gone...
meh... apaan coba cuman bisa post sekali...
===========================
Ya... gw ga kepikiran buat di recycle, soalnya lebih risky...
lagian Create Destroy itu aman kok... harusnya... di C++, Java dan semua Framework begitu... kalo udah di Destroy ya ancur... terus pointer sudah di null kan ya sudah aman... toh di JASS ga mengenal Inner Class, Inheritance dkk... jadi kalo gw liat-liat segini udah aman lah...
=======
@chukky :
oh itu return trigger sebenernya buat akal-akalan aja... soalnya di JASS belum ada Class... jadi ibarat itu return trigger kayak sebuah setir di fungsi mobil bergerak. kita bisa komando pergerakkan mobilnya lewat return trigger itu (dalam hal in unit yang sedang digerak-gerakkan).
14-07-12, 02:55
chukky-jr
Code:
Item Once Classes
Events
Unit - A unit Acquires an item
Conditions
(Item-class of (Item being manipulated)) Equal to Artifact
Actions
For each (Integer A) from 1 to 6, do (Actions)
Loop - Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
(Item-class of (Item carried by (Hero manipulating item) in slot (Integer A))) Equal to (Item-class of (Item being manipulated))
(Item carried by (Hero manipulating item) in slot (Integer A)) Not equal to (Item being manipulated)
Then - Actions
Item - Remove (Item being manipulated)
Game - Display to (Player group((Owner of (Hero manipulating item)))) the text: Sorry.
Else - Actions
biasanya di pake buat Item-class system (armor, helmet, weapon, accessory, 1 slot untuk 1 type)
code nya sih jalan, tapi kok agak bingung sama bagian ini ya
Code:
If - Conditions
(Item-class of (Item carried by (Hero manipulating item) in slot (Integer A))) Equal to (Item-class of (Item being manipulated))
(Item carried by (Hero manipulating item) in slot (Integer A)) Not equal to (Item being manipulated)
coba penjabarannya bener nggak nih
Code:
(Item-class of (Item carried by (Hero manipulating item) in slot (Integer A))) Equal to (Item-class of (Item being manipulated))
ini sekarang lagi di cek, di inventory 123456 ada item yang class nya sama nggak dengan item yang lagi di ambil, kalau ada kemungkinan akan di remove tergantung kondisi ke 2 (true/false)
Code:
(Item carried by (Hero manipulating item) in slot (Integer A)) Not equal to (Item being manipulated)
ini di cek, item yang sudah ada di inventory 123456 ada nggak yang sama dengan item yang di ambil, kalau nggak ada yang sama, bisa di ambil tapi tergantung kondisi ke 1 (true/false)
nah yang aku bingung, misalnya ada 2 Sword, class nya sama, coba aku ambil Sword ke 1, kondisi 1 dan 2 return false, inventory kan masih kosong
nah berikutnya aku ambil Sword yang ke 2, kondisi 1 returnnya true (class sama, weapon), nah kondisi ke 2 bukannya harusnya returnnya false ya? kan Sword = Sword, atau setiap instance item yang udah masuk di WC3 punya identitas sendiri gitu ya?
14-07-12, 11:51
rotflow
I see...
dan iya harusnya return false... dunno what happened...
kalo advice gw sih rata-rata system Class Inventory kayak gini pada pake Fixed Slot. semisal slot satu buat helmet, slot dua buat armor, slot tiga buat weapon. begitu... biar ga loop juga dan lebih rapi...
*Tapi gw ga pernah kepikiran loh triggernya ternyata semudah itu... padahal dulu gw mikirnya sampe index-index ga jelas... >_<*
Rapihin, sama kasi contoh test Map nya yo... nanti gw index di depan.
14-07-12, 12:01
chukky-jr
oh okeee, kira2 ntar sorean ya dirapiin
nah itu, gw juga bingung soalnya ini jalan, bener2 jalan 100%, gw sendiri bingung, emang dibantu sama orang di thehelper.net sih condiition ke 2 nya
yg ini mengklasifikasikan item berdasarkan artifact, consumable etc, jadi mungkin class nya agak dikit, kalo aku sendiri pakai item-level supaya class nya bisa lebih banyak
14-07-12, 12:29
Section
Oke akhirnya bisa buka ini lagi... let's see how long this will be...
Sip dah...
btw berhubung di sini ga ada tag trigger (kyk di THW) mending GUI trigger di screenshot aja... soalnya kadang suka pusing kalo di tag code,quote atau polos... :p
14-07-12, 12:29
Section
dafuq dopost
16-07-12, 14:59
chukky-jr
btw sect, itu di moving unit API, nggak perlu nge null local unit sama local trigger ya? (local unit wUnit, local trigger t)
18-07-12, 08:44
Section
waahaa... iya... lupa gw flush sama gw null-in... waduh... kepikirannya kemaren OOP terus... kalo objek Class nya di destroy otomatis peranakannya kena destroy juga... tapi ini kan JASS... wahhaa.... nanti gw update lagi XD.