Snippet AutocastOrderEvent

Azlier

Old World Ghost
Reaction score
461
This detects when you turn on or off autocast. You know, by right clicking the ability icon. Yep.

Two functions available to you:
JASS:
TriggerRegisterAutocastOnEvent takes trigger whichTrigger returns nothing
//Readies a trigger to fire when autocast is turned on.

TriggerRegisterAutocastOffEvent takes trigger whichTrigger returns nothing
//Same as above, but for when autocast is turned off.


Requires Event (but of course).

There are no configurables.
JASS:
library AutocastOrderEvent requires Event

globals
    private constant integer OFFSET = 0xD0000
    private integer array Data
    private Event On
    private Event Off
    private integer i
endglobals

function TriggerRegisterAutocastOnEvent takes trigger whichTrigger returns nothing
    call On.register(whichTrigger)
endfunction

function TriggerRegisterAutocastOffEvent takes trigger whichTrigger returns nothing
    call Off.register(whichTrigger)
endfunction

private function Fire takes nothing returns boolean
    set i = Data[GetIssuedOrderId() - OFFSET]
    if i == 1 then
        call On.fire()
    elseif i == 2 then
        call Off.fire()
    endif
    return false
endfunction

private function RegisterOrder takes integer i returns nothing
    set Data<i> = 1
    set Data[i + 1] = 2
endfunction

private struct Hack extends array

    static method onInit takes nothing returns nothing
        local trigger t = CreateTrigger()
        local integer i = 15
        loop
            call TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_ISSUED_ORDER, null)
            exitwhen i == 0
            set i = i - 1
        endloop
        call TriggerAddCondition(t, Condition(function Fire))
    
        set On = Event.create()
        set Off = Event.create()
    
        //Register all autocast orders. Oh God.
        call RegisterOrder(0x060) //Heal
        call RegisterOrder(0x063) //Inner Fire
        call RegisterOrder(0x06C) //Slow
        call RegisterOrder(0x204) //Spell Steal
        call RegisterOrder(0x086) //Bloodlust
        call RegisterOrder(0x0F4) //Web
        call RegisterOrder(0x0DF) //Curse
        call RegisterOrder(0x0E6) //Raise Dead
        call RegisterOrder(0x242) //Essence of Blight
        call RegisterOrder(0x245) //Spirit Touch
        call RegisterOrder(0x1EA) //Frost Armor
        call RegisterOrder(0x0B6) //Faerie Fire
        call RegisterOrder(0x0A5) //Abolish Magic
        call RegisterOrder(0x0CE) //Searing Arrows
        call RegisterOrder(0x114) //Cold Arrows
        call RegisterOrder(0x27A) //Parasite
        call RegisterOrder(0x039) //Repair
        call RegisterOrder(0x0EB) //Restore
        call RegisterOrder(0x0C2) //Renew
        call RegisterOrder(0x0BE) //Recharge
        call RegisterOrder(0x248) //Carrion Beetles
        call RegisterOrder(0x262) //Black Arrow
        call RegisterOrder(0x23C) //Orb of Annihilation
        call RegisterOrder(0x053) //Get Corpse
        call RegisterOrder(0x049) //Kaboom!
        call RegisterOrder(0x11F) //Poison Arrows
        call RegisterOrder(0x2BF) //Incinerate Arrows...?
    endmethod
    
endstruct

endlibrary</i>


How to quickly fix an unresponsive autocast order:
1. Import the PrintOrders library into your map, and start then map.
2. Right-click the ability with the unresponsive Autocast order.
3. Some information should be printed on screen when you right-clicked the ability.
4. There should be a hexadecimal number that starts with 0xD0. Copy that number.
5. Paste the name of the unresponsive autocast order in this thread, and paste the number with it.
 

Romek

Super Moderator
Reaction score
963
Useful. :D

Maybe you could add a Register function which also takes the ID?
 

Azlier

Old World Ghost
Reaction score
461
That would pretty much defeat the purpose of it being generic and accepting any autocast order. If you need something specific, it's a very simple matter to craft the trigger yourself. With a single if block checking the order ID.
 

Kenny

Back for now.
Reaction score
202
I was just in the process of making one of these, seems you beat me too it. Nicely done. Seems pretty handy. :thup:
 

Romek

Super Moderator
Reaction score
963
> That would pretty much defeat the purpose of it being generic and accepting any autocast order.
Let me rephrase. In addition to the generic ones, adding a specific one would make things easier for the user.

> it's a very simple matter to craft the trigger yourself. With a single if block checking the order ID.
It's an even simpler matter to just register it specifically.

Well, it's your choice. I can't really force you to add a function like that. I'm just stating why it would be useful.
 

Azlier

Old World Ghost
Reaction score
461
I could do it if I create more triggers. However, I would need to spam Events if one needed to register more than one trigger to a single ID. Let me see what I can do.

EDIT: Hmm. This will be harder than I thought. The user could pull it off with a single if block using GetAutocastOrder, but I would need to attach to order ID's. Which means I need to wait for hashtables to become official :banghead:.
 

Romek

Super Moderator
Reaction score
963
> However, I would need to spam Events if one needed to register more than one trigger to a single ID. Let me see what I can do.
Then that person could just use the generic one.
Chances are, people using this even would need it for one specific ID.
 

Azlier

Old World Ghost
Reaction score
461
If I were to implement specific orders like that, I would need to attach to order ID's. Any ideas on how to do that?
 

Romek

Super Moderator
Reaction score
963
Hashtables?
You could probably just do a wrapper function you know. :p
 

Azlier

Old World Ghost
Reaction score
461
Yeah, and it would need to take a trigger. Then, I need to fire that trigger when the taken order is issued. Making me need to attach to that order. Looks like a bit much to lift a single if off of the user, and lose quite a bit of efficiency :nuts:.

>Hashtables?
Sure, once the patch becomes officially released and done.
 

Azlier

Old World Ghost
Reaction score
461
What actions and conditions? What are you talking about? This behaves exactly like a normal WC3 event, on the outside. Even the event response returns 0 when used somewhere incorrectly.
 

Azlier

Old World Ghost
Reaction score
461
You are free to make a wrapper for that, if you want. It's not my job to account for user laziness :p.

JASS:
function AutocastOrderOn takes code act, code cond returns nothing
    local trigger t = CreateTrigger()
    call TriggerRegisterAutocastOnEvent(t)
    if act != null then
        call TriggerAddAction(t, act)
    endif
    if cond != null then
        call TriggerAddCondition(t, Condition(cond))
    endif
endfunction


EDIT: Ouch, just noticed something. A few abilities (very few) use un(abilityname) and (abilityname) for turning autocast on and off. Unfortunately, there is no sane way to detect those. Must update first post.
 

Azlier

Old World Ghost
Reaction score
461
Order ID's are either 0, or some very high number (past 50,000 if I remember). I'll go ahead and try some modulo. But I don't want to spam Events, sorreh.
 

Renendaru

(Evol)ution is nothing without love.
Reaction score
309
I was like, "Ooo, yay", but when I saw spells like searing arrows and other attack modify autocasts don't work I was annoyed. I needed the exact thing for it.
 

Jesus4Lyf

Good Idea™
Reaction score
397
I'm sure he can find a way around that.

And it's not spamming, Azlier. There's a strict limit to the number of order IDs available. ;) Not that Event spamming matters. They're just structs... lol

And you can just do it for IDs that are actually used. Y'know, if == 0, set to Event.create()... o.o
 

Romek

Super Moderator
Reaction score
963
Approved.
This is useful. :)
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Members online

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top