• 🏆 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!

Getting Item name by Item Id

Status
Not open for further replies.
Level 12
Joined
Jan 2, 2016
Messages
973
Is there any way to get the item's name without having the create the item and then use the name of the 'last created item'?
Old trigger:
  • Loop - Actions
    • Set dice = (Random integer number between 1 and 1000)
    • Set treasure_rewards[(((Integer A) x Items_amount) + (Integer B))] = Items[((dice mod (Items_amount - items_count)) + 1)]
    • Set Items[((dice mod (Items_amount - items_count)) + 1)] = Items[(Items_amount - items_count)]
    • Hero - Create treasure_rewards[((((Integer A) - 1) x Items_amount) + (Integer B))] and give it to No unit
    • Set Item_order[(((Integer A) x Items_amount) + (Integer B))] = (Name of (Last created item))
    • Item - Remove (Last created item)
    • Set items_count = (items_count + 1)
What I'm trying to do:
JASS:
        loop
            exitwhen i > 11
            set items[1] = 'I005'
            set items[2] = 'I004'
            set items[3] = 'I006'
            set items[4] = 'I002'
            set j = 1
            loop
                exitwhen j > udg_Items_amount - unused
                set dice = GetRandomInt(1,1000)
                set udg_treasure_rewards[(i*udg_Items_amount)+j] = items[ModuloInteger(dice, udg_Items_amount - (j-1)) + 1]
                set udg_Item_order[(i*udg_Items_amount)+j] = GetItemName(items[ModuloInteger(udg_dice, udg_Items_amount - (j-1)) + 1])
//              ^ This gives me an error, since I need to input an item, not an integer.
                set items[ModuloInteger(udg_dice, udg_Items_amount - (j-1)) + 1] = items[udg_Items_amount-(j-1)]
                set j = j + 1
            endloop
            set i = i + 1
        endloop

EDIT: Alright, I actually figured out how to do it. "GetObjectName" works :)
However, the trigger itself isn't working:
JASS:
function treasure_order takes nothing returns boolean
    local integer i = 0
    local integer unused = 0
    local integer array items
    local integer dice
    local integer j
    set udg_Items_amount = 4
    if udg_game_time <= 5.00 then
        loop
            exitwhen i > 11
            set items[0] = 'I005'
            set items[1] = 'I004'
            set items[2] = 'I006'
            set items[3] = 'I002'
            set j = 1
            loop
                exitwhen j > udg_Items_amount - unused
                set dice = GetRandomInt(1,1000)
                set udg_treasure_rewards[(i*udg_Items_amount)+j] = items[ModuloInteger(dice, udg_Items_amount - (j-1))]
                set udg_Item_order[(i*udg_Items_amount)+j] = GetObjectName(items[ModuloInteger(udg_dice, udg_Items_amount - (j-1))])
                set items[ModuloInteger(udg_dice, udg_Items_amount - (j-1))] = items[udg_Items_amount-(j-1)]
                set j = j + 1
            endloop
            set i = i + 1
        endloop
    elseif IsTriggerEnabled(gg_trg_Randomizer) then
        call DestroyTrigger(gg_trg_Randomizer)
    endif
    return false
endfunction

//===========================================================================
function InitTrig_treasure takes nothing returns nothing
    set gg_trg_treasure = CreateTrigger(  )
    call TriggerRegisterVariableEvent( gg_trg_treasure, "udg_seconds", EQUAL, 0 )
    call TriggerRegisterVariableEvent( gg_trg_treasure, "udg_seconds", EQUAL, 30.00 )
    call TriggerAddCondition( gg_trg_treasure, Condition( function treasure_order ) )
endfunction
JASS:
function DiggingEnd takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer id = GetHandleId(t)
    local unit u = LoadUnitHandle(udg_Table, id, 'digu')
    local trigger tr = LoadTriggerHandle(udg_Table, id, 'dtrg')
    local player p = GetOwningPlayer(u)
    local integer pn = GetPlayerId(p)
    set udg_treasure_digged[pn] = false
    call DestroyTrigger(tr)
    set tr = null
    call PauseUnit(u, false)
    if LoadBoolean(udg_Table, id, 'digb') then
        set udg_treasure_count[pn] = udg_treasure_count[pn]+1
        call UnitAddItemById(u, udg_treasure_rewards[(pn*udg_Items_amount)+udg_treasure_count[pn]])
        call DisplayTextToForce( GetPlayersAll(), GetPlayerName(p)+"'s "+GetHeroProperName(u)+" has found "+GetObjectName(udg_treasure_rewards[(pn*udg_Items_amount)+udg_treasure_count[pn]])+"!")
        set udg_treasure_found[pn] = true
        call TriggerExecute( gg_trg_treasure_hunt )
    else
        call DisplayTextToPlayer(p, 0, 0, "No treasure found!")
        call UnitRemoveBuffBJ( 'B003', u )
    endif
    call RecTimer(t)
    set t = null
    set p = null
    set u = null
endfunction

JASS:
function DiggerDied takes nothing returns boolean
    local trigger tr = GetTriggeringTrigger()
    local timer t = LoadTimerHandle(udg_Table, GetHandleId(tr), 'digt')
    local player p = GetTriggerPlayer()
    local integer pn = GetPlayerId(p)
    call RecTimer(t)
    set t = null
    set udg_treasure_digged[pn] = false
    call DisplayTextToPlayer(p, 0, 0, "Your hero died before the treasure hunt was finished!")
    call DestroyTrigger(tr)
    set p = null
    set tr = null
    return false
endfunction

function SearchForTreasure takes unit u, boolean b returns nothing
    local timer t = GetFreeTimer()
    local trigger tr = CreateTrigger()
    local integer id = GetHandleId(t)
    call PauseUnit(u, true)
    call TriggerRegisterUnitEvent( tr, u, EVENT_UNIT_DEATH )
    call TriggerAddCondition(tr, Condition(function DiggerDied))
    call SaveTimerHandle(udg_Table, GetHandleId(tr), 'digt', t)
    call SaveUnitHandle(udg_Table, id, 'digu', u)
    call SaveTriggerHandle(udg_Table, id, 'dtrg', tr)
    call SaveBoolean(udg_Table, id, 'digb', b)
    call TimerStart(t, 5.00, false, function DiggingEnd)
    set t = null
    set tr = null
    set u = null
endfunction

function treasure_searching takes nothing returns boolean
    local integer pn = GetPlayerId(GetTriggerPlayer())
    local integer i = 3
    local integer j = 0
    if not udg_treasure_digged[pn] and udg_treasure_count[pn] < udg_Items_amount then
        loop
            exitwhen i == 0
            if RectContainsUnit(udg_treasure_region[pn] , udg_heroes[(pn*3)+i]) then
                set j = i
            endif
            set i = i - 1
        endloop
        if j != 0 then
            call SearchForTreasure(udg_heroes[(pn*3)+j], true)
            set udg_treasure_digged[pn] = true
        else
            set j = 1
            set i = 1
            loop
                exitwhen j > 3
                loop
                    exitwhen i > 18
                    if RectContainsUnit(udg_region_for_treasure[i], udg_heroes[(pn*3)+j]) then
                        call SearchForTreasure(udg_heroes[(pn*3)+j], false)
                        set i = 18
                        set j = 4
                        set udg_treasure_digged[pn] = true
                    endif
                    set i = i + 1
                endloop
                set j = j + 1
            endloop
        endif
        if udg_treasure_digged[pn] and IsTriggerEnabled(gg_trg_treasure) and udg_Item_order[1] != "" then
           call DisableTrigger( gg_trg_treasure )
           call DisableTrigger( gg_trg_Randomizer )
        endif
    endif
    return false
endfunction

//===========================================================================
function InitTrig_treasure_searching takes nothing returns nothing
    local integer i = 0
    set gg_trg_treasure_searching = CreateTrigger(  )
    loop
        exitwhen i > 11
        call TriggerRegisterPlayerChatEvent( gg_trg_treasure_searching, Player(i), "-dig", true )
        set i = i + 1
    endloop
    call TriggerAddCondition( gg_trg_treasure_searching, Condition( function treasure_searching ) )
endfunction
The 'I002' is shown as "Default string" and when I'm supposed to get it - I don't get anything.
+ I get 2-3 of the same item type(s), when I'm trying to make it 1 item type per player.

I also have 1 test trigger used to see if everything is working:
JASS:
function CmdShowItemsList takes integer i, boolean b returns nothing
    local player p = GetTriggerPlayer()
    local integer o = (i-1)*udg_Items_amount
    if b then
        call DisplayTextToPlayer( p,0,0,udg_Item_order[o+1]+", "+udg_Item_order[o+2]+", "+udg_Item_order[o+3]+", "+udg_Item_order[o+4]+": This is the order player "+GetPlayerName(ConvertedPlayer(i))+" will get his treasures in!")
    else
        call DisplayTextToPlayer( p,0,0,udg_Item_order[o+1]+", "+udg_Item_order[o+2]+", "+udg_Item_order[o+3]+", "+udg_Item_order[o+4]+": This is the order you will get your treasures in!")
    endif
    if IsTriggerEnabled(gg_trg_treasure) then
        call DisableTrigger( gg_trg_treasure )
        call DisableTrigger( gg_trg_Randomizer )
    endif
    set p = null
endfunction

// ------------ some conditions for calling other test functions -------------------
    elseif GetEventPlayerChatString() == "-item order" and udg_Item_order[1] != "" then
        call CmdShowItemsList(GetConvertedPlayerId(GetTriggerPlayer()), false)
    elseif SubStringBJ(GetEventPlayerChatString(), 1, 12) == "-item order " and udg_Item_order[1] != "" then
        call CmdShowItemsList( S2I(SubStringBJ(GetEventPlayerChatString(), 13, 14)), true)
// ------------- more conditions for calling other test functions -------------------
 
Last edited:
Level 12
Joined
Jan 2, 2016
Messages
973
Okay, after doing
JASS:
        loop
            exitwhen i > 11
            set items[0] = 'I005'
            set items[1] = 'I004'
            set items[2] = 'I006'
            set items[3] = 'I002'
if i == 0 then
call BJDebugMsg(GetObjectName(items[0])+GetObjectName(items[1])+GetObjectName(items[2])+GetObjectName(items[3]))
endif
            set j = 1
            loop
                exitwhen j > udg_Items_amount - unused
                set dice = GetRandomInt(1,1000)
if i == 0 then
call BJDebugMsg(I2S(dice)+" mod "+I2S(udg_Items_amount - (j-1))+" = "+I2S(ModuloInteger(dice, udg_Items_amount - (j-1))))
endif
                set udg_treasure_rewards[(i*udg_Items_amount)+j] = items[ModuloInteger(dice, udg_Items_amount - (j-1))]
if i == 0 then
call BJDebugMsg(GetObjectName(udg_treasure_rewards[(i*udg_Items_amount)+j]))
endif
                set udg_Item_order[(i*udg_Items_amount)+j] = GetObjectName(items[ModuloInteger(udg_dice, udg_Items_amount - (j-1))])
if i == 0 then
call BJDebugMsg(GetObjectName(items[ModuloInteger(udg_dice, udg_Items_amount - (j-1))])+GetObjectName(items[udg_Items_amount-(j-1)]))
endif
                set items[ModuloInteger(dice, udg_Items_amount - (j-1))] = items[udg_Items_amount-(j-1)]
                set j = j + 1
            endloop
            set i = i + 1
        endloop
I found out that I had forgetten to change one "udg_dice" with "dice" :p
and I had to change one udg_Items_amount - (j-1) to udg_Items_amount - j

I also found out that the 1-st "random" integers from 1 to 1000 are: 425, 871, 3xx, 46. They were always the same in my tests. I kind a knew that the "random" integers are always the same, and that's why I have a "Randomizer" trigger, and I don't run this one during the game initialization. :p
 
Status
Not open for further replies.
Top