Results 1 to 12 of 12
http://idgs.in/552652
  1. #1

    Join Date
    Apr 2012
    Posts
    33
    Points
    11.30
    Thanks: 1 / 0 / 0

    Default [SHARE]Code Share (bagi laah)

    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
    Last edited by rotflow; 12-07-12 at 13:52.

  2. Hot Ad
  3. #2
    Section's Avatar
    Join Date
    Nov 2006
    Location
    about.me/SECTION
    Posts
    2,095
    Points
    11,041.04
    Thanks: 45 / 112 / 98

    Default Moving Unit API | aka Slide API

    Yey... sudah bisa lagi... Alhamdulillah

    Oke dimulai dari saya ya... (sori rotflow ane duluan XD)

    Moving Unit API
    Type : JASS (pure aka vanilla)

    Interface yang dipakai :
    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
    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
    void StopMovingUnitXY( trigger t )

    Core!
    Menghentikan proses bergerak.

    t = Trigger proses MoveUnitXY()
    void UpdateMoveUnitSpeed( trigger t, real newSpeed )

    Core!
    Mengupdate kecepatan gerak suatu proses bergerak.
    t = Trigger proses MoveUnitXY()
    newSpeed = kecepatan yang baru.
    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
    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
    
        call SaveReal(udg_SkillTable, GetHandleId(t), StringHash("X"), X)
        call SaveReal(udg_SkillTable, GetHandleId(t), StringHash("Y"), Y)
        call SaveReal(udg_SkillTable, GetHandleId(t), StringHash("speed"), speed)
        call SaveUnitHandle(udg_SkillTable, GetHandleId(t), StringHash("wUnit"), wUnit)
        call SaveTriggerHandle( udg_SkillTable, GetHandleId(t), StringHash("Exec"), exec )
        //call SaveTimerHandle(udg_SkillTable, GetHandleId(t), StringHash("timer"), tim) //Completely useless 
        
        //Trigger Session
        call TriggerRegisterTimerEvent(t, udg_updateSpeed, true)
        call TriggerAddAction(t,function MoveProc)
        
        //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.

    Download Sample Map (buat tes aja) : http://www.mediafire.com/?m0h6i1138ddr7pb
    Last edited by Section; 19-07-12 at 08:21. Reason: add some "cleaning"

  4. The Following User Says Thank You to Section For This Useful Post:
  5. #3
    NodiX's Avatar
    Join Date
    Dec 2010
    Location
    The Dark Side of the Moon
    Posts
    459
    Points
    897.80
    Thanks: 22 / 21 / 20

    Default

    akhirnya sesepuh section kembali

    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?

    INFP / Enneagram 4w5
    What exactly is a dream? And what exactly is a joke?

  6. #4
    chukky-jr's Avatar
    Join Date
    Jan 2010
    Posts
    453
    Points
    965.60
    Thanks: 20 / 19 / 17

    Default

    kalo bikin trigger baru, effectnya gimana sih? kurang ngerti sama returns trigger, masih jarang pake jass

  7. #5

    Join Date
    Apr 2012
    Posts
    33
    Points
    11.30
    Thanks: 1 / 0 / 0

    Default

    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).
    Last edited by rotflow; 13-07-12 at 12:52.

  8. #6
    chukky-jr's Avatar
    Join Date
    Jan 2010
    Posts
    453
    Points
    965.60
    Thanks: 20 / 19 / 17

    Default

    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?

  9. #7

    Join Date
    Apr 2012
    Posts
    33
    Points
    11.30
    Thanks: 1 / 0 / 0

    Default

    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.

  10. #8
    chukky-jr's Avatar
    Join Date
    Jan 2010
    Posts
    453
    Points
    965.60
    Thanks: 20 / 19 / 17

    Default

    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

  11. #9
    Section's Avatar
    Join Date
    Nov 2006
    Location
    about.me/SECTION
    Posts
    2,095
    Points
    11,041.04
    Thanks: 45 / 112 / 98

    Default

    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...

  12. #10
    Section's Avatar
    Join Date
    Nov 2006
    Location
    about.me/SECTION
    Posts
    2,095
    Points
    11,041.04
    Thanks: 45 / 112 / 98

    Default

    dafuq dopost

  13. #11
    chukky-jr's Avatar
    Join Date
    Jan 2010
    Posts
    453
    Points
    965.60
    Thanks: 20 / 19 / 17

    Default

    btw sect, itu di moving unit API, nggak perlu nge null local unit sama local trigger ya? (local unit wUnit, local trigger t)

  14. #12
    Section's Avatar
    Join Date
    Nov 2006
    Location
    about.me/SECTION
    Posts
    2,095
    Points
    11,041.04
    Thanks: 45 / 112 / 98

    Default

    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.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •