• 🏆 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!
  • 🏆 Hive's 6th HD Modeling Contest: Mechanical is now open! Design and model a mechanical creature, mechanized animal, a futuristic robotic being, or anything else your imagination can tinker with! 📅 Submissions close on June 30, 2024. Don't miss this opportunity to let your creativity shine! Enter now and show us your mechanical masterpiece! 🔗 Click here to enter!

[Wurst] InventoryEvent

Level 26
Joined
Mar 19, 2008
Messages
3,140
Wurst inventory event package, equivalent of my vJass InventoryEvent.

Exposes two inventory events for public use:
- EVENT_ITEM_INVENTORY.MOVE
- EVENT_ITEM_INVENTORY.USE

Wurst:
/*
*  InventoryEvent v1.0.1.5
*     by Bannar
*
*  For intuitive inventory event handling.
*/
package InventoryEvent
import RegisterEvents
import Orders

tuple eventInfo(unit u, item itm, int slotFrom, int slotTo)

var eventState = eventInfo(null, null, -1, -1)
constant eventMovedTrigger = CreateTrigger()
constant eventUsedTrigger = CreateTrigger()

public enum EVENT_ITEM_INVENTORY
    MOVE
    USE

/** Returns unit which manipulated event item. */
public function getInventoryManipulatingUnit() returns unit
    return eventState.u

/** Returns manupilated event item. */
public function getInventoryManipulatedItem() returns item
    return eventState.itm

/** Returns slot index of manipulated item from which it was moved or used. */
public function getInventorySlotFrom() returns int
    return eventState.slotFrom

/** Returns slot index of manipulated item to which it was moved. */
public function getInventorySlotTo() returns int
    return eventState.slotTo

/** Returns item which manipulated item switched position with if any. */
public function getInventorySwappedItem() returns item
    return eventState.u.itemInSlot(eventState.slotTo)

public function getInventoryEventTrigger(EVENT_ITEM_INVENTORY whichEvent) returns trigger
    trigger result = null

    switch whichEvent
        case EVENT_ITEM_INVENTORY.MOVE
            result = eventMovedTrigger
        case EVENT_ITEM_INVENTORY.USE
            result = eventUsedTrigger
    return result

public function registerInventoryEvent(EVENT_ITEM_INVENTORY whichEvent, code func)
    switch whichEvent
        case EVENT_ITEM_INVENTORY.MOVE
            eventMovedTrigger.addCondition(Condition(func))
        case EVENT_ITEM_INVENTORY.USE
            eventUsedTrigger.addCondition(Condition(func))

function fireEvent(trigger evt, eventInfo currState)
    var prevState = eventState
    eventState = currState
    evt.evaluate()
    eventState = prevState

function onItemOrder()
    var order = GetIssuedOrderId()
    var u = GetTriggerUnit()

    if order >= SpecialOrders.itemdrag00 and order <= SpecialOrders.itemdrag05
        var itm = GetOrderTargetItem()
        var slotFrom = u.getItemSlot(itm)
        var slotTo = order - SpecialOrders.itemdrag00
        fireEvent(eventMovedTrigger, eventInfo(u, itm, slotFrom, slotTo))
    else
        var slotFrom = order - SpecialOrders.itemuse00
        var itm = u.itemInSlot(slotFrom)
        fireEvent(eventUsedTrigger, eventInfo(u, itm, slotFrom, -1))

function onAnyOrder()
    var order = GetIssuedOrderId()
    if order >= SpecialOrders.itemdrag00 and order <= SpecialOrders.itemuse05
        onItemOrder()

init
    // MOVED is order of type TARGET_ORDER yet USED can be anyone of them
    registerPlayerUnitEvent(EVENT_PLAYER_UNIT_ISSUED_ORDER, () -> onAnyOrder())
    registerPlayerUnitEvent(EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER, () -> onAnyOrder())
    registerPlayerUnitEvent(EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER, () -> onAnyOrder())
Demo code:
Wurst:
package InventoryEventDemo
import InventoryEvent
import ClosureTimers

function onInventoryMove()
    var u = getInventoryManipulatingUnit()
    var itm = getInventoryManipulatedItem()
    var itmSwapped = getInventorySwappedItem()
    var slotFrom = getInventorySlotFrom()
    var slotTo = getInventorySlotTo()
    string s

    if itmSwapped != null
        s = u.getName() + " swapped " + itm.getName() + "[" + slotFrom.toString() + "] with "
        s += itmSwapped.getName() + "[" + slotTo.toString() + "]"
    else
        s = u.getName() + " moved " + itm.getName() + "[" + slotFrom.toString() + "] to slot " + slotTo.toString()
    print(s)

function onInventoryUse()
    var u = getInventoryManipulatingUnit()
    var itm = getInventoryManipulatedItem()
    var slotFrom = getInventorySlotFrom()
    var s = u.getName() + " used " + itm.getName() + "[" + slotFrom.toString() + "]"

    print(s)

public function initInventoryEventDemo()
    registerInventoryEvent(EVENT_ITEM_INVENTORY.MOVE, () -> onInventoryMove())
    registerInventoryEvent(EVENT_ITEM_INVENTORY.USE, () -> onInventoryUse())

    doAfter(1.) ->
        real x = -200
        real y = -200
        CreateItem('bspd', x, y) // Boots
        CreateItem('crys', x, y) // Crystall Ball
        CreateItem('infs', x, y) // Inferno
        CreateItem('ratc', x, y) // Claws of Attack
 
Last edited:
Level 23
Joined
Jan 1, 2009
Messages
1,610
Review based on
crojewsk/wurstExtLibs

Some globals constant, some not, for seemingly no reason. Make those triggers constant, use type inference. Don't use int constants for arguments, enums were added for this purpose. So move EVENT_ITEM_INVENTORY_MOVE into an enum.

fireEvent() - already doesn't look good from first viewing. Put this state data into a class or tuple. If it is a constant and never destroyed, wurst will optimize away all the allocation logic. Make this into 4-5 nice lines. Also use type inference.
I personally prefer "int", you can choose "integer", however you shouldn#t mix the two in the same file.

onItemOrder() - don't define uninitialized, typed variables at the top, Jass style. Use infered locals in-place.
 
Last edited:
Top