• 🏆 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!
  • It's time for the first HD Modeling Contest of 2024. Join the theme discussion for Hive's HD Modeling Contest #6! Click here to post your idea!

MUI Advanced Equipment System (+Save/Load +Event)

This is my Advanced Equipment System

It is based on the same idea like many others: click on an item and it gets equipped, click on it in the equipment screen to unequip it.

It is advanced because it has many special options available!
Prevent unit types from equipping certain items.
Items may change animations.
Save/load code integration
and many more...

For explaination of the included functions check the documentations included in the map

Features:
  • decide whether a weapon is one or twohanded
  • give a unit a special animation tag, depending on the equiped item
  • an offhand tag will overwrite all mainhand tags (a shield will always cause defend animation)
  • functions for forcing equip/unequip
  • functions for getting information
  • functions for prohibiting a unit from equipping an item (for example for race-only items)
  • Save/load code generator included
  • Register Events to your triggers, firing on item equip and unequip
  • items can give countless abilities



my system is MUI, so every unit can have its own equipment, and easy to customize.
full documentation included.

New improved "How to import" and "How to Use" included, too!!

YOU NEED JNGP AND JASS KNOWLEDGE TO GET THIS WORKING! WITHOUT JNGP AND JASS KNOWLEDGE IT IS IMPOSSIBLE!

I importet some files!!!
the icons and models don't violate any rules, because they are necessary to show what this system can do!! credits ingame.

comment and if you like it maybe +rep^^
give credits when used

have fun

IMPORTANT:
For all who ask me to make the system in a spellbook:
That would be much more work for the users of this system and highly inefficient!!
I will not change that so don't ask me to do that anymore!




UPDATE v.1.5:
I read vercas suggestions and improved my scripting.
Adding an item is now much more simple^^
thx to vercas for his review

UPDATE v.2.0:
Tige_R found a bug, reseting the shield animation when another item got unequipped
fixed that!!

UPDATE v.3.0: BIG thx to teldrassil who found a huge bug which was settled in all my systems!!! i managed to fix it and updated ALL my newer systems!!!

UPDATE v.4.0: now there is no need anymore that the equipable items are of one itemclass! added system code to the description here

UPDATE v.5.0: it's possible now, to make items give up to 3 abilities when equipped instead of 1 in the previous versions...

UPDATE v.6.0: The bug fixed in v.2.0 was still there... now its really gone AND the script is 1.24 compatible

UPDATE v.6.5: added a new function (IsEquipmentClassEmpty) to check whether a specific unit has something from class x equipped
more information in the code

UPDATE v.7.0: added a new function (GetEquipItemID) to get an items rawcode which is equipped
more information in the code

UPDATE v.8.0: added 3 new functions (GetEquipItemIndex, EquipItemByIndex and EquipItemByID) to get an items index which is equipped (not the same as rawcode) and to equip a item by this index, which helps with the usage of Save/Load Systems
the last function makes you able to equip an item by its rawcode.
more information in the code

UPDATE v.9.0: again 2 new functions for prohibiting a unit from equipping an item or allowing it again for it(EnableItemEquipByID and EnableItemEquipByIndex) and a new function for getting the index of an item (not of its rawcode) --> GetItemIndex
Also much better performance because of the use of hastables!

UPDATE v.10.0: all O(n) searches are now replaced by hashtables!! also there is a new function (TransferEquipment) to move the equipment from unit a to unit b

UPDATE v.11.0: made the item registeration useable outside the library, improved documentation

Update v.12.0: created a how to import and structured the code a little more. also improved the empty-slot-icons

Update v.13.0: New code for equipping items and a new workaround for twohanded items

Update v.14.0: Reworked the beginning of the code, changed variable names, and removed a last rest of german i left in the testmap...


NEW versions:
Update v.2.0: At first I'd like to thank you for your great support!!
As so many of you love it I decided to refresh this a little!
Well i got a lot more experience since i first uploaded this and decided to remake the code... now takes advantage of much more efficient struct usage, doesn't need any hashtable anymore, runs smoother, more ways to work with (if you understand vJass), and many more new things...
Whole new documentation and new methods to work with!
Of course I kept the old names for most of the functions to make it easier for you to apply the new update!
SO: Have fun :D

Update v.2.1: Added Save/Load system, fixed the unequip function, added unequipAll function

Update v.2.2: Added Events and updated the "how to use"

UPDATE v.2.3: Thanks to creativeRPG for finding a very bad bug! i fixed it and suggest everyone to only use the new code!! the one from 2.2 may not work and freeze your game!

Update v.2.4: creativeRPG found more deadly bugs: you could equip items with all units you wanted to the unit owning the inventory and when equipping a one handed weapon while a two handed weapon was equipped the "offhand slot not available" button didn't vanish... fixed now! redownload is necessary!!!!!

Update v.2.5: aaaand again creativeRPG found a bug when you have too many items in your map the index gets too high for the system and it stops working

Update v.3.0: I chagned the whole code for equipping and unequipping and improved the ability handling:
its possible to get up to 50 abilitites from each item
added disbtns for my icons

Update v.3.1: Fixed bugs with syncing the inventories causing mass item creation on the map, made items in the dummys inventory undropable

Update v.4.0: Reduced Abilities per item to 20, fixed a bug for multiplayer usage preventing a second player from using the system, fixed an animation bug where the shield animation didn't disappear

Update v.5.0: New code cause the old one was buggy as hell :D works like a charm now

Update v.5.1: Fixed a bug regarding set Equipment[].owner=

Update v.5.2: Fixed a bug causing standard items to unequip registered equipment



JASS:
library AdvancedEquipmentSystem requires LinkedListModule, RegisterPlayerUnitEvent

    // The_Witcher's Equipment System
    //
    // This is my easy to use equipment system, which adds an equipment screen to any unit you want.
    //  equipped items can give up abilities to the owner and can change the animations of him...
    //
    //
    //       To learn how to use this system please read the "How To Use" delivered in the demo map
    //
    //
    // Requirements:
    //    JASS knowledge
    //    LinkedList (http://www.hiveworkshop.com/forums/jass-resources-412/snippet-linkedlistmodule-206552/)
    //    RegisterPlayerUnitEvent (http://www.hiveworkshop.com/forums/jass-resources-412/snippet-registerplayerunitevent-203338/)
    //
    // have fun^^

    //**************************************************
    //********************SETUP PART********************
    //**************************************************

    globals
        // this is the rawcode of the unit which works as inventory
        public constant integer INVENTORY_DUMMY = 'h007'
     
        // this is the class you selected as mainhand class
        public constant integer MAINHAND_CLASS = 0
     
        // this is the class you selected as offhand class
        public constant integer OFFHAND_CLASS = 1
        
        // this is the amount of total classes you have
        public constant integer CLASSES = 9
     
        // this is the ability to close the inventory
        public constant integer EXIT_ABILITY = 'A00G'
     
        // this is the ability to open the inventory
        public constant integer OPEN_ABILITY = 'A003'
        
        // this is the ability which gives the dummy the same inventory as your hero has
        public constant integer INVENTORY_ABILITY = 'AInv'
     
        // this is the icon ability shown in the offhand slot when a twhoanded weapon is equipeed
        public constant integer TWOHAND_ABILITY = 'A00Z'
        public constant boolean SHOW_TWOHAND_ABILITY = true
     
        // this is the text shown when a unit is trying to equip an item which it isnt allowed to
        // example: " can't equip " becomes ingame something like   Soldier can't equip Giant Sword
        public constant string UNABLE_TO_EQUIP_STRING = " can't equip "
    endglobals

    //************************************************************
    //********************SETUP PART ENDS HERE********************
    //************************************************************
    //*****************Don't edit anything below******************
    //************************************************************

    globals
        private trigger OnEquip
        private trigger OnUnequip
        private integer TriggeringItem
        private unit EquippingUnit
        private hashtable table
    endglobals
    
    private struct AbilityList extends array
        integer abi
        implement LinkedList
        
        static method create takes nothing returns thistype
            return .createNode()
        endmethod
        
        method remove takes nothing returns nothing
            call .removeNode()
            call .deallocate()
        endmethod
        
        method add takes integer abi returns nothing
            local thistype new = .allocate()
            set new.abi = abi
            call .insertNode(new)
        endmethod
    endstruct


    // **** struct EquipmentItem ****
    private struct EquipmentItem extends array
        readonly integer id
        readonly integer class
        readonly AbilityList abilities
        readonly integer icon
        readonly boolean twohanded
        readonly string tag

        static method operator [] takes integer itemid returns EquipmentItem
            return itemid - 'I000' + CLASSES + 1
        endmethod
    
        static method create takes integer id, integer icon, integer class, boolean twohanded, string animation returns EquipmentItem
            local EquipmentItem this = id - 'I000' + CLASSES + 1
            if id - 'I000' >= 0 then
                call SaveBoolean(table, id - 'I000', 0, true)
            endif
            set .id = id
            set .class = class
            set .icon = icon
            if id >= CLASSES + 1 then
                set .abilities = AbilityList.create()
                if class == MAINHAND_CLASS then
                    set .twohanded = twohanded
                else
                    set .twohanded = false
                endif
                if (class == MAINHAND_CLASS or class == OFFHAND_CLASS) and id != 0 then
                    set .tag = animation
                else
                    set .tag = ""
                endif
            endif
            return this
        endmethod
        
        method addAbility takes integer abi returns nothing
            call .abilities.add( abi)
        endmethod
        
        method applyAbilities takes unit u, boolean add returns nothing
            local AbilityList node = .abilities.next
            loop
                exitwhen node.head
                if add then
                    call UnitAddAbility(u, node.abi)
                else
                    call UnitRemoveAbility(u, node.abi)
                endif
                set node = node.next
            endloop
        endmethod
    endstruct

    public function RegisterNewClass takes integer emptyicon, integer class returns nothing
        call EquipmentItem.create('I000' - CLASSES - 1 + class, emptyicon, class, false, "")
    endfunction

    // **** struct Equipment ****    
    struct Equipment
        private static EquipmentItem twohandIcon
    
        private unit u
        private unit dummy
        readonly string animtag = ""
        readonly EquipmentItem array Item [12]
    
        static method operator [] takes unit u returns Equipment
            return LoadInteger(table, GetHandleId(u), 0)
        endmethod
    
        method operator owner takes nothing returns unit
            return .u
        endmethod
    
        method operator owner= takes unit new returns nothing
            local integer i = 0
            loop
                exitwhen i >= CLASSES
                if .Item[i] != 0 then
                    call .Item[i].applyAbilities(.u, false)
                    call .Item[i].applyAbilities(new, true)
                endif
                set i = i + 1
            endloop
            call AddUnitAnimationProperties(.u, .animtag, false)
            call UnitRemoveAbility(.u, OPEN_ABILITY)
            call AddUnitAnimationProperties(new, .animtag, true)
            call UnitAddAbility(new, OPEN_ABILITY)
            set .u = new
            call SaveInteger(table, GetHandleId(.u), 0, this)
            call SaveInteger(table, GetHandleId(.dummy), 0, this)
        endmethod
        
        method syncInventories takes nothing returns nothing
            local integer i = 0
            loop
                exitwhen i >= 6
                call RemoveItem(UnitItemInSlot(.dummy, i))
                call UnitAddItemToSlotById(.dummy, GetItemTypeId(UnitItemInSlot(.u, i)), i)
                call SetItemDroppable(UnitItemInSlot(.dummy, i), false)
                set i = i + 1
            endloop
        endmethod
    
        private method refreshAnimation takes nothing returns nothing
            local string a = .Item[MAINHAND_CLASS].tag
            if .Item[OFFHAND_CLASS] != 0 and .Item[OFFHAND_CLASS] != twohandIcon then
                set a = .Item[OFFHAND_CLASS].tag
            endif
            call AddUnitAnimationProperties(.u, .animtag, false)
            call AddUnitAnimationProperties(.u, a, true)
            set .animtag = a
        endmethod
        
        method equipEmptyClass takes integer class returns nothing
            call UnitAddAbility(.dummy, EquipmentItem(class).icon)
            set .Item[class] = 0
        endmethod
        
        method equipTwohandIcon takes nothing returns nothing
            call UnitAddAbility(.dummy, twohandIcon.icon)
            set .Item[OFFHAND_CLASS] = twohandIcon
        endmethod
    
        method unequip takes integer class returns nothing
            local integer i = 0
            local EquipmentItem toRemove = .Item[class]
            if toRemove != 0 then
                if toRemove.twohanded then
                    call UnitRemoveAbility(.dummy, TWOHAND_ABILITY)
                    call .equipEmptyClass(OFFHAND_CLASS)
                endif
                call toRemove.applyAbilities(.u, false)
                call UnitAddItemById(.u, toRemove.id)
                set TriggeringItem = toRemove.id
                set EquippingUnit = .u
                call TriggerEvaluate(OnUnequip)
                call UnitRemoveAbility(.dummy, toRemove.icon)
            else
                call UnitRemoveAbility(.dummy, EquipmentItem(class).icon)
            endif
            set .Item[class] = 0
            call .refreshAnimation()
        endmethod
        
        method equip takes integer id returns nothing
            local EquipmentItem toEquip = EquipmentItem[id]
            local EquipmentItem mainEquip = .Item[MAINHAND_CLASS]
            // remove existing
            if mainEquip != 0 then
                if toEquip.twohanded or (mainEquip.twohanded and (toEquip.class == OFFHAND_CLASS or toEquip.class == MAINHAND_CLASS)) then
                    call .unequip(MAINHAND_CLASS)
                    call .unequip(OFFHAND_CLASS)
                    if toEquip.class == MAINHAND_CLASS and not toEquip.twohanded then
                        call .equipEmptyClass(OFFHAND_CLASS)
                    elseif toEquip.class == OFFHAND_CLASS then
                        call .equipEmptyClass(MAINHAND_CLASS)
                    endif
                endif
            endif
            call .unequip(toEquip.class)
            // new is twohanded ?
            if toEquip.twohanded then
                call .unequip(OFFHAND_CLASS)
                call .equipTwohandIcon()
                if not SHOW_TWOHAND_ABILITY then
                    call UnitRemoveAbility(.dummy, twohandIcon.icon)
                endif
            endif
            // equip new
            call toEquip.applyAbilities(.u, true)
            call UnitAddAbility(.dummy, toEquip.icon)
            set .Item[toEquip.class] = toEquip
            call .refreshAnimation()
            // fire trigger
            set EquippingUnit = .u
            set TriggeringItem = id
            call TriggerEvaluate(OnEquip)
        endmethod
        
        static method disable takes integer itemId, integer unitType, boolean flag returns nothing
            call SaveBoolean(table, itemId - 'I000', unitType, flag)
        endmethod
        
        private method onDestroy takes nothing returns nothing
            local integer i = 0
            call RemoveUnit(.dummy)
            loop
                exitwhen i > 12
                if .Item[i] != 0 then
                    call .Item[i].applyAbilities(.u, false)
                endif
                set i = i + 1
            endloop
            call AddUnitAnimationProperties(.u, .animtag, false)
            call UnitRemoveAbility(.u, OPEN_ABILITY)
        endmethod
    
        static method create takes unit u returns Equipment
            local Equipment this = Equipment[u]
            local integer i = 0
            local integer id = GetPlayerId(GetOwningPlayer(u))
            if this != 0 then
                call RemoveUnit(.dummy)
            else
                set this = Equipment.allocate()
                call SaveInteger(table, GetHandleId(u), 0, this)
            endif
            set .u = u
            set .dummy = CreateUnit(GetOwningPlayer(u), INVENTORY_DUMMY, GetUnitX(u), GetUnitY(u), 0)
            call SaveInteger(table, GetHandleId(.dummy), 0, this)
            call UnitAddAbility(.dummy, INVENTORY_ABILITY)
            call UnitAddAbility(.dummy, EXIT_ABILITY)
            call UnitAddAbility(.u, OPEN_ABILITY)
            loop
                exitwhen i >= CLASSES
                call .equipEmptyClass(i)
                set i = i + 1
            endloop
            return this
        endmethod
        

    // **** Other Stuff ****
        private static method Access takes nothing returns boolean
            local unit u = GetTriggerUnit()
            local Equipment inv = Equipment[u]
            local integer class
            local integer i = 0
            if GetSpellAbilityId() == EXIT_ABILITY then
                if GetLocalPlayer() == GetOwningPlayer(inv.u) then
                    call ClearSelection()
                    call SelectUnit(inv.u, true)
                endif
            elseif GetSpellAbilityId() == OPEN_ABILITY then
                call SetUnitX(inv.dummy, GetUnitX(inv.u))
                call SetUnitY(inv.dummy, GetUnitY(inv.u))
                if GetLocalPlayer() == GetOwningPlayer(inv.u) then
                    call ClearSelection()
                    call SelectUnit(inv.dummy, true)
                endif
                call inv.syncInventories()
            elseif GetUnitTypeId(u) == INVENTORY_DUMMY then
                loop
                    exitwhen i >= CLASSES
                    if inv.Item[i].icon == GetSpellAbilityId() then
                        set class = i
                        set i = CLASSES
                    endif
                    set i = i + 1
                endloop
                call inv.unequip(class)
                call inv.equipEmptyClass(class)
                call inv.syncInventories()
            endif
            set u = null
            return false
        endmethod

        private static method ItemEquip takes nothing returns boolean
            local unit u = GetTriggerUnit()
            local item ite = GetManipulatedItem()
            local integer i = 0
            local Equipment inv = Equipment[u]
            local EquipmentItem invIte = EquipmentItem[GetItemTypeId(ite)]
            if GetItemTypeId(ite) - 'I000' >= 0 then
                if LoadBoolean(table, GetItemTypeId(ite) - 'I000', 0) then
                    if invIte != 0 and inv != 0 then
                        if not LoadBoolean(table, GetItemTypeId(ite) - 'I000', GetUnitTypeId(inv.u)) then
                            if u == inv.u then
                                call inv.equip(GetItemTypeId(ite))
                                call RemoveItem(ite)
                                call inv.syncInventories()
                            elseif u == inv.dummy then
                                loop
                                    exitwhen i >= 6
                                    if invIte.id == GetItemTypeId(UnitItemInSlot(inv.u, i)) then
                                        call UnitUseItem(inv.u, UnitItemInSlot(inv.u, i))
                                        call RemoveItem(ite)
                                        set i = 7
                                    endif
                                    set i = i + 1
                                endloop
                            endif
                        else
                            call DisplayTextToPlayer(GetOwningPlayer(inv.u), 0, 0, GetUnitName(inv.u) + UNABLE_TO_EQUIP_STRING + GetItemName(ite))
                        endif
                    endif
                endif
            endif
            set u = null
            set ite = null
            return false
        endmethod
        
        private static method onInit takes nothing returns nothing
            set OnEquip = CreateTrigger()
            set OnUnequip = CreateTrigger()
            call RegisterPlayerUnitEvent(EVENT_PLAYER_UNIT_USE_ITEM, function Equipment.ItemEquip)
            call RegisterPlayerUnitEvent(EVENT_PLAYER_UNIT_SPELL_CAST, function Equipment.Access)
            set .twohandIcon = EquipmentItem.create('I000' - 1, TWOHAND_ABILITY, 0, false, "")
            set table = InitHashtable()
        endmethod
        
        implement optional SaveLoadPlugin
    
    endstruct

    // **** Trigger Events ****
    function RegisterItemEquipEvent takes code func returns nothing
        call TriggerAddCondition(OnEquip, Filter(func))
    endfunction
    
    function RegisterItemUnequipEvent takes code func returns nothing
        call TriggerAddCondition(OnUnequip, Filter(func))
    endfunction
    
    function GetTriggeringItemId takes nothing returns integer
        return TriggeringItem
    endfunction
    
    function GetEquippingUnit takes nothing returns unit
        return EquippingUnit
    endfunction
   
   //wrappers
    function InitEquipment takes unit whichunit returns nothing
        call Equipment.create(whichunit)
    endfunction

    public function RegisterItem takes integer itemid, integer icon, integer class, boolean twohanded, string animation returns nothing
        call EquipmentItem.create(itemid, icon, class, twohanded, animation)
    endfunction
    
    public function AddItemAbility takes integer itemid, integer abi returns nothing
        call EquipmentItem[itemid].addAbility(abi)
    endfunction
    
    function EnableItemEquip takes integer itemId, integer unitType, boolean flag returns nothing
        call Equipment.disable(itemId, unitType, not flag)
    endfunction

    function IsEquipmentClassEmpty takes unit u, integer class returns boolean
        return Equipment[u].Item[class] == 0
    endfunction

    function EquipItem takes unit u, item ite returns nothing
        call Equipment[u].equip(GetItemTypeId(ite))
        call RemoveItem(ite)
    endfunction
    function EquipItemById takes unit u, integer itemId returns nothing
        call Equipment[u].equip(itemId)
    endfunction

    function UnequipItemById takes unit u, integer itemid returns nothing
        local integer class = EquipmentItem[itemid].class
        if Equipment[u].Item[class].id == itemid then
            call Equipment[u].unequip(EquipmentItem[itemid].class)
            call Equipment[u].equipEmptyClass(class)
        endif
    endfunction

    function UnequipItemByClass takes unit u, integer class returns nothing
        call Equipment[u].unequip(class)
        call Equipment[u].equipEmptyClass(class)
    endfunction

    function GetEquippedItemTypeId takes unit u, integer class returns integer
        return Equipment[u].Item[class].id
    endfunction

    function ChangeEquipmentOwner takes unit u, unit newowner returns nothing
        set Equipment[u].owner = newowner
    endfunction

    function UnequipAll takes unit u returns nothing
        local integer i = 1
        loop
            call Equipment[u].unequip(i)
            call Equipment[u].equipEmptyClass(i)
            exitwhen i >= CLASSES
            set i = i + 1
        endloop
    endfunction

endlibrary


//Code indented using The_Witcher's Script Language Aligner
//Download the newest version and report bugs at www.hiveworkshop.com

Keywords:
equipment, equip, system, item, hero, unit, bonus, stat, vjass, jngp, mui, mpi, animation, ability, save, load, hashtable, code, Event, events
Contents

Advanced Equipment System (Map)

Reviews
20:01, 26th Oct 2009 TriggerHappy187: Approved because of so many minimod approvals and high ratings. I also couldn't see anything wrong inside the code.
Level 1
Joined
Mar 6, 2010
Messages
1
Hi. I have a problem... I can`t test it. I just downloaded system, opened it in WE a tryed to test it. Warcraft can`t open map....
_______
Sorry for my bad english
 
Level 2
Joined
Mar 10, 2008
Messages
6
I downloaded it, imported it into my map... but i have a problem...
i use a seperate MPQ and my own WE.exe and Wc3.exe .. when i open the map with jngp editor there are only green-black boxes for the models.. okay, i know why. but
when i set everything up and try to start the campaing/map in warcraft, the screen stays black... when i deactivate the triggers, there are no problems...

can anyone help?
mb. tell me how to write this to JASS?

Thanks...
 
Level 1
Joined
Sep 22, 2009
Messages
4
This system is really good, it just saves so much time now thanks to this system. 100000/5!!
But I want to know if I can remove some of the classes, for example if I want to remove "Rings" or "Special Artifacts" which I feel is unnecessary in my map, and I'm not sure how to do that
 
This system is really good, it just saves so much time now thanks to this system. 100000/5!!
But I want to know if I can remove some of the classes, for example if I want to remove "Rings" or "Special Artifacts" which I feel is unnecessary in my map, and I'm not sure how to do that

of course you can :D
go to object editor and delete the unneeded "empty slot" abilities (e.g. rings)
then go to trigger editor and go into the trigger with my system.
scroll down until you come to the "customizable part"
adjust the line
private constant integer ITEMCLASSES = 9
to the number of the remaining classes (for example you erased only rings so there has to be an 8 instead of a 9 )
finally go to the InitNormals function, where each class gets its "empty slot" ability and erase the line where your erased ability was
(for example ring was class 7 as in my test map, erase the whole line set normalpic[7] = 'A00C')
then you have to correct the order of the others so there is no empty array
(you erased 7 so there is normalpic[5]...normalpic[6]...normalpic[8]... and thats wrong so you have to change the 8 into a 7 and so on until it looks like this
...
normalpic[4]...
normalpic[5]...
normalpic[6]...
normalpic[7]...
normalpic[8]...

and then you're done!
but i would maybe wait if i were you ;D
a huge update is coming where i rewrite the whole code to make this much easier:grin:
 
How about a new feature?
Equipping a bag? Just a bag slot in the equipment window!

And that bag will give the hero more inventory slots.

Do you like the idea?

well i already thought about that but i don't think it would be that useful...
you can have up to 11 slots for your equipment ATM...

and it's an equipment sys! not an inventory sys...

but if you can give me enough good causes why i should implement it i maybe begin working on it ;D


BTW: NEW UPDATE IS COMING TODAY
 
NEW version:

At first I'd like to thank you for your great support!!

As so many of you love it I decided to refresh this a little!
Well i got a lot more experience since i first uploaded this and decided to remake the code... now takes advantage of much more efficient struct usage, doesn't need any hashtable anymore, runs smoother, more ways to work with (if you understand vJass), and many more new things...
Whole new documentation and new methods to work with!
Of course I kept the old names for most of the functions to make it easier for you to apply the new update!
SO: Have fun :D
 
Level 13
Joined
Mar 4, 2009
Messages
1,156
I think a big update for your system would be to MAKE DUMMY UNIT WITH INVENTORY

than when player presses helmet
select dummy
give/create all items that villager has to dummy unit´s inventory

that would make items from villager click-able when the dummy is selected

what you think ?
 
Level 7
Joined
Nov 6, 2009
Messages
279
I think a big update for your system would be to MAKE DUMMY UNIT WITH INVENTORY

than when player presses helmet
select dummy
give/create all items that villager has to dummy unit´s inventory

that would make items from villager click-able when the dummy is selected

what you think ?

And lose control???
 
Level 13
Joined
Mar 4, 2009
Messages
1,156
And lose control???
lol..why would you lose control??????

-something like this would do it

when you have dummy unit selected
create all item types that hero has and give it to dummy

when dummy is ordered to use item
-remove item being manipulated
-order hero to do same as dummy
call IssueImmediateOrderById(HERO, (GetIssuedOrderId()))

if item is "replaced" like when you want to have 2 swords and you cant,also give that type of item to dummy too
 
Level 7
Joined
Nov 6, 2009
Messages
279
lol..why would you lose control??????

-something like this would do it

when you have dummy unit selected
create all item types that hero has and give it to dummy

when dummy is ordered to use item
-remove item being manipulated
-order hero to do same as dummy
call IssueImmediateOrderById(HERO, (GetIssuedOrderId()))

if item is "replaced" like when you want to have 2 swords and you cant,also give that type of item to dummy too

Get it now sorry...
 
Level 2
Joined
May 21, 2010
Messages
10
my hero is not starting with the equipment inventory ability!
what is happening?
I already changed the raw codes exactly, imported all the icons, and the villager with a lot of animations, registered one item (only one, for tests), and it isn`t working!
 
Level 2
Joined
May 21, 2010
Messages
10
I just found a glitch...
if your hero equips one item with a passive HERO ability (in the item type), like bash, some auras, and those other abilities, your hero will stay with a green icon in his abilities spaces...
 
Level 5
Joined
Aug 23, 2008
Messages
124
You know what i think?
YOU KNOW WHAT I THINK?!?!?!?

I think that this inventory system should be an oficial warcraft 3 equipment system. I mean its perfect! Its unique, its easy to understand (In game) , (but it is kinda hard (for me) to understand (in the editor). And Thank you very mutch cause now im practicing jass...
 
Level 19
Joined
Jun 16, 2007
Messages
1,574
How do i make it work for more then one player ? Since if i do this, it stops it from working :/

doing this stops it
  • Actions
    • Set u[1] = Goku 0011 <gen>
    • Set u[2] = Vegeta 0017 <gen>
    • Set u[3] = Gohan 0001 <gen>
    • Set u[3] = Gohan 0001 <gen>
    • Set u[3] = Gohan 0001 <gen>
    • Set u[3] = Gohan 0001 <gen>
    • Set u[3] = Gohan 0001 <gen>
    • Set u[3] = Gohan 0001 <gen>
    • Set u[3] = Gohan 0001 <gen>
    • Set u[3] = Gohan 0001 <gen>
    • Set u[3] = Gohan 0001 <gen>
    • Set u[3] = Gohan 0001 <gen>
    • Custom script: call InitEquipment(udg_u[1])
    • Custom script: call InitEquipment(udg_u[2])
    • Custom script: call InitEquipment(udg_u[3])
    • Custom script: call InitEquipment(udg_u[4])
    • Custom script: call InitEquipment(udg_u[5])
    • Custom script: call InitEquipment(udg_u[6])
    • Custom script: call InitEquipment(udg_u[7])
    • Custom script: call InitEquipment(udg_u[8])
    • Custom script: call InitEquipment(udg_u[9])
    • Custom script: call InitEquipment(udg_u[10])
    • Custom script: call InitEquipment(udg_u[11])
    • Custom script: call InitEquipment(udg_u[12])
Or could i just set each unit under

Set u = picked unit

Custom script: call InitEquipment(udg_u)
 
I just found a glitch...
if your hero equips one item with a passive HERO ability (in the item type), like bash, some auras, and those other abilities, your hero will stay with a green icon in his abilities spaces...

well, use item abilities and not HERO abilities... and dont add auras coz even item-type auras show on hero

Maybe in a update you should add a Shoulder Slot to.?
i think that also could be usefull.

its not needed, why? coz you can add it yourself, though you might need to find a fitting icon...

@robot-dude
in the variable editor make sure you set the array size to at least the highest value that you will use coz not doing so could stop triggers from working... and there is no problem in doing it inside a unit group loop...
 
Level 5
Joined
Jul 17, 2010
Messages
140
well yes i also can add it my self and i have..xD

But if he could make a system so you could save your hero and when you reload the hero you have the items in the equipment that where in the inventory.
so you could keep the items..:D
 
well yes i also can add it my self and i have..xD

But if he could make a system so you could save your hero and when you reload the hero you have the items in the equipment that where in the inventory.
so you could keep the items..:D

I believe it has support for that... you can get item id using this

function GetEquippedItemTypeId takes player p, integer class returns integer
return Equipment.Item[class].id
endfunction

oh, he removed the functionality to force equip using index or item type-id...

though his older version has that, support for getting item id or index and force equip using index or id...

If you know jass, you can add that yourself... (I can do it for you, but I'm not sure sure if I'm allowed to edit it...)

and then when you save, just save all the items using the function above and then when you load, call a force equip by itemtype-id (which he removed)
 
Long awaited update for many of you guys ;D

I finally added a save/load code generator!

of course, it's a very simple generator and maybe i will improve it in future!

have fun and keep on supporting my systems ;)

The_Witcher

p.s.: it may be a good idea to watch my advanced camera & keyboard sys ;) huge update is in work...
 
Long awaited update for many of you guys ;D

I finally added a save/load code generator!

of course, it's a very simple generator and maybe i will improve it in future!

have fun and keep on supporting my systems ;)

The_Witcher

p.s.: it may be a good idea to watch my advanced camera & keyboard sys ;) huge update is in work...

WoW! now that's an UPDATE!!! :goblin_good_job:
 
Level 6
Joined
Aug 30, 2005
Messages
161
This system is what made me force myself to understand vJass so i could use it on one of my maps, however i have an issue: I noticed that the model you use for your system has a bow animation, yet you dont use any bows for your demo. I made my own bow item made the proper attachments and animations work but i cant change the attack index so that it would switch to range, is it posible to do it with your system?
 
This system is what made me force myself to understand vJass so i could use it on one of my maps, however i have an issue: I noticed that the model you use for your system has a bow animation, yet you dont use any bows for your demo. I made my own bow item made the proper attachments and animations work but i cant change the attack index so that it would switch to range, is it posible to do it with your system?

you mean switching the units attack, so it gets a ranged attack? thats impossible in warcraft (blame blizzard) but you can code a workaround to replace the unit with another unit (same values as the old) but with a ranged attack and switch that back when a not-ranged weapon is equipped...
 
Level 6
Joined
Aug 30, 2005
Messages
161
you mean switching the units attack, so it gets a ranged attack? thats impossible in warcraft (blame blizzard) but you can code a workaround to replace the unit with another unit (same values as the old) but with a ranged attack and switch that back when a not-ranged weapon is equipped...

Thats a bummer, the only thing i see that was on this path is the War Club ability that allows a creature to disable and enable attack indexes but requires for the target to eat a tree. Ill find a workaround, 5/5 to your system!!
 
Level 1
Joined
Nov 15, 2010
Messages
3
Save/load bug (dupe item)

i did not know is it a bug or not, but my opinion it is bug (dupe item).
how to create this bug :
1. pickup item and equip it.
2.save
3.load
4.lol 1 golem skin on inventory and 1 at item slot.

or maybe its just me. please let me know. yes this is nicely done system =)
 
Level 1
Joined
Nov 15, 2010
Messages
3
ermm

so how can i remove it xD

Edit: Okay nvm ive done it xD

i really cant wait the MUI version xD owhh this is really good system..
I Like~~~
 
Level 6
Joined
Aug 30, 2005
Messages
161
well its a natural, blizzard thing...

would be if it did that with all abilities (even item abilities) that have icons even though they dont display, but if you apply an item ability like claws of attack +5, the icon wont show, but if you use anything else it will show an icon or a green icon if it lacks one. Unfortunately i realized this too late in my map, now i have to make items that only give armor or attack bonuses, cuz if i add any other type of item ability thats suppose to now show, it shows, taking space for other icons such as shadowmeld or the ones below for hero skills.
 
Top