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:
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)
-
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
+ 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: