| 09-16-2008, 12:21 PM | #1 |
Im using Diablo-dk's recipe system (as the other one requires vJass but lets not get into that... It has a feature to disassemble which works great however the items on my map can be upgraded multiple times and the disassemble only works on the last assemble... anyone have an idea of how to go about changing this? the disassemble function JASS:// This function disassembles a recipe item to its original components. function DisItem takes unit u,item it returns boolean local integer c=GetItemUserData(it) local item array newitem local integer i=udg_ic[c] if it != null then if i <= 6-UnitInventoryCount(u)+1 and i > 0 then set udg_RC=false if udg_itemid2[c] != null then set newitem[1]=CreateItem(udg_itemid1[c],GetUnitX(u),GetUnitY(u)) set newitem[2]=CreateItem(udg_itemid2[c],GetUnitX(u),GetUnitY(u)) endif if udg_itemid3[c] != null then set newitem[3]=CreateItem(udg_itemid3[c],GetUnitX(u),GetUnitY(u)) call UnitAddItem(u,newitem[3]) endif if udg_itemid4[c] != null then set newitem[4]=CreateItem(udg_itemid4[c],GetUnitX(u),GetUnitY(u)) call UnitAddItem(u,newitem[4]) endif if udg_itemid5[c] != null then set newitem[5]=CreateItem(udg_itemid5[c],GetUnitX(u),GetUnitY(u)) call UnitAddItem(u,newitem[5]) endif if udg_itemid6[c] != null then set newitem[6]=CreateItem(udg_itemid6[c],GetUnitX(u),GetUnitY(u)) call UnitAddItem(u,newitem[6]) endif call RemoveItem(it) call UnitAddItem(u,newitem[1]) call UnitAddItem(u,newitem[2]) set newitem[1]=null set newitem[2]=null set newitem[3]=null set newitem[4]=null set newitem[5]=null set newitem[6]=null set udg_RC=true else return false endif endif return true endfunction JASS://======================================================================================================= // Recipe System // By Fredbrik(Diablo-dk) // //======================================================================================================= //globals //integer RN=0 // Recipe number. //trigger RT=CreateTrigger() // Main recipe trigger. //boolean RC=true //integer array itemid1 //integer array itemid2 //integer array itemid3 //integer array itemid4 //integer array itemid5 //integer array itemid6 //integer array ic //item count //integer array output //endglobals //======================================================================================================= // User changeable constants //======================================================================================================= constant function Recipe_Effect takes nothing returns string return "Abilities\\Spells\\Items\\AIem\\AIemTarget.mdl" //An effect that comes whenever a recipe is made. endfunction constant function Recipe_AP takes nothing returns string return "origin" //Attachment point for Recipe_Effect() endfunction //======================================================================================================= // This function will return the first item of entered Id in the unit's inventory. function GetItem takes unit u, integer Id returns item local integer i=0 local item it loop exitwhen i==6 if GetItemTypeId(UnitItemInSlot(u,i)) == Id then return UnitItemInSlot(u,i) set i=5 endif set i=i+1 endloop return null endfunction //============================== function HasItems takes unit u, integer i returns boolean local integer index=0 local integer id=-1 local integer b1=0 local integer b2=0 local integer b3=0 local integer b4=0 local integer b5=0 local integer b6=0 loop exitwhen index==6 set id=GetItemTypeId(UnitItemInSlot(u,index)) if id == 0 then set id=-1 endif if id == udg_itemid1[i] and b1 == 0 then set b1=1 set id=-1 endif if id == udg_itemid2[i] and b2 == 0 then set b2=1 set id=-1 endif if id == udg_itemid3[i] and b3 == 0 then set b3=1 set id=-1 endif if id == udg_itemid4[i] and b4 == 0 then set b4=1 set id=-1 endif if id == udg_itemid5[i] and b5 == 0 then set b5=1 set id=-1 endif if id == udg_itemid6[i] and b6 == 0 then set b6=1 set id=-1 endif if b1+b2+b3+b4+b5+b6 == udg_ic[i] then return true endif set index=index+1 endloop return false endfunction //======================================================================================================= // User Functions: // Recipe Creating: // //======================================================================================================= function CreateRecipe takes integer i1,integer i2,integer i3,integer i4,integer i5,integer i6,integer output returns nothing set udg_RN=udg_RN+1 set udg_itemid1[udg_RN]=i1 set udg_itemid2[udg_RN]=i2 set udg_ic[udg_RN]=2 if i3 != 0 then set udg_itemid3[udg_RN]=i3 set udg_ic[udg_RN]=udg_ic[udg_RN]+1 endif if i4 != 0 then set udg_itemid4[udg_RN]=i4 set udg_ic[udg_RN]=udg_ic[udg_RN]+1 endif if i5 != 0 then set udg_itemid5[udg_RN]=i5 set udg_ic[udg_RN]=udg_ic[udg_RN]+1 endif if i6 != 0 then set udg_itemid6[udg_RN]=i6 set udg_ic[udg_RN]=udg_ic[udg_RN]+1 endif set udg_output[udg_RN]=output endfunction function CreateRecipe2 takes integer i1,integer i2,integer i3 returns nothing set udg_RN=udg_RN+1 set udg_itemid1[udg_RN]=i1 set udg_itemid2[udg_RN]=i2 set udg_output[udg_RN]=i3 set udg_ic[udg_RN]=2 endfunction // Creates a recipe that requires 2 items to combine into a new item. i3 is the combined item. // Example: call CreateRecipe2('I000','I001','I002') function CreateRecipe3 takes integer i1,integer i2,integer i3,integer i4 returns nothing set udg_RN=udg_RN+1 set udg_itemid1[udg_RN]=i1 set udg_itemid2[udg_RN]=i2 set udg_itemid3[udg_RN]=i3 set udg_output[udg_RN]=i4 set udg_ic[udg_RN]=3 endfunction // The same as CreateRecipe2 except this requires 3 items to combine. i4 is the combined item. function CreateRecipe4 takes integer i1,integer i2,integer i3,integer i4,integer i5 returns nothing set udg_RN=udg_RN+1 set udg_itemid1[udg_RN]=i1 set udg_itemid2[udg_RN]=i2 set udg_itemid3[udg_RN]=i3 set udg_itemid4[udg_RN]=i4 set udg_output[udg_RN]=i5 set udg_ic[udg_RN]=4 endfunction // The same as CreateRecipe2 except this requires 4 items to combine. i5 is the combined item. function CreateRecipe5 takes integer i1,integer i2,integer i3,integer i4,integer i5,integer i6 returns nothing set udg_RN=udg_RN+1 set udg_itemid1[udg_RN]=i1 set udg_itemid2[udg_RN]=i2 set udg_itemid3[udg_RN]=i3 set udg_itemid4[udg_RN]=i4 set udg_itemid5[udg_RN]=i5 set udg_output[udg_RN]=i6 set udg_ic[udg_RN]=5 endfunction // The same as CreateRecipe2 except this requires 5 items to combine. i6 is the combined item. function CreateRecipe6 takes integer i1,integer i2,integer i3,integer i4,integer i5,integer i6,integer i7 returns nothing set udg_RN=udg_RN+1 set udg_itemid1[udg_RN]=i1 set udg_itemid2[udg_RN]=i2 set udg_itemid3[udg_RN]=i3 set udg_itemid4[udg_RN]=i4 set udg_itemid5[udg_RN]=i5 set udg_itemid6[udg_RN]=i6 set udg_output[udg_RN]=i7 set udg_ic[udg_RN]=6 endfunction // The same as CreateRecipe2 except this requires 6 items to combine. i7 is the combined item. //=================================================================================================== // This function disassembles a recipe item to its original components. function DisItem takes unit u,item it returns boolean local integer c=GetItemUserData(it) local item array newitem local integer i=udg_ic[c] if it != null then if i <= 6-UnitInventoryCount(u)+1 and i > 0 then set udg_RC=false if udg_itemid2[c] != null then set newitem[1]=CreateItem(udg_itemid1[c],GetUnitX(u),GetUnitY(u)) set newitem[2]=CreateItem(udg_itemid2[c],GetUnitX(u),GetUnitY(u)) endif if udg_itemid3[c] != null then set newitem[3]=CreateItem(udg_itemid3[c],GetUnitX(u),GetUnitY(u)) call UnitAddItem(u,newitem[3]) endif if udg_itemid4[c] != null then set newitem[4]=CreateItem(udg_itemid4[c],GetUnitX(u),GetUnitY(u)) call UnitAddItem(u,newitem[4]) endif if udg_itemid5[c] != null then set newitem[5]=CreateItem(udg_itemid5[c],GetUnitX(u),GetUnitY(u)) call UnitAddItem(u,newitem[5]) endif if udg_itemid6[c] != null then set newitem[6]=CreateItem(udg_itemid6[c],GetUnitX(u),GetUnitY(u)) call UnitAddItem(u,newitem[6]) endif call RemoveItem(it) call UnitAddItem(u,newitem[1]) call UnitAddItem(u,newitem[2]) set newitem[1]=null set newitem[2]=null set newitem[3]=null set newitem[4]=null set newitem[5]=null set newitem[6]=null set udg_RC=true else return false endif endif return true endfunction //======================================================================================================= // //Main Recipe Function: Do not change unless you know what you are doing // //======================================================================================================= function Recipe_Main takes nothing returns nothing local item it local integer i=0 local unit u=GetManipulatingUnit() loop exitwhen i==udg_RN set i=i+1 if udg_RC == true then if udg_ic[i] == 6 then if HasItems(u,i) then call RemoveItem(GetItem(u,udg_itemid1[i])) call RemoveItem(GetItem(u,udg_itemid2[i])) call RemoveItem(GetItem(u,udg_itemid3[i])) call RemoveItem(GetItem(u,udg_itemid4[i])) call RemoveItem(GetItem(u,udg_itemid5[i])) call RemoveItem(GetItem(u,udg_itemid6[i])) call DestroyEffect(AddSpecialEffectTarget(Recipe_Effect(),u,Recipe_AP())) set it=CreateItem(udg_output[i],GetUnitX(u),GetUnitY(u)) call SetItemUserData(it,i) //Used for disassembling. call UnitAddItem(u,it) set i=udg_RN endif elseif udg_ic[i] == 5 then if HasItems(u,i) then call RemoveItem(GetItem(u,udg_itemid1[i])) call RemoveItem(GetItem(u,udg_itemid2[i])) call RemoveItem(GetItem(u,udg_itemid3[i])) call RemoveItem(GetItem(u,udg_itemid4[i])) call RemoveItem(GetItem(u,udg_itemid5[i])) call DestroyEffect(AddSpecialEffectTarget(Recipe_Effect(),u,Recipe_AP())) set it=CreateItem(udg_output[i],GetUnitX(u),GetUnitY(u)) call SetItemUserData(it,i) //Used for disassembling. call UnitAddItem(u,it) set i=udg_RN endif elseif udg_ic[i] == 4 then if HasItems(u,i) then call RemoveItem(GetItem(u,udg_itemid1[i])) call RemoveItem(GetItem(u,udg_itemid2[i])) call RemoveItem(GetItem(u,udg_itemid3[i])) call RemoveItem(GetItem(u,udg_itemid4[i])) call DestroyEffect(AddSpecialEffectTarget(Recipe_Effect(),u,Recipe_AP())) set it=CreateItem(udg_output[i],GetUnitX(u),GetUnitY(u)) call SetItemUserData(it,i) //Used for disassembling. call UnitAddItem(u,it) set i=udg_RN endif elseif udg_ic[i] == 3 then if HasItems(u,i) then call RemoveItem(GetItem(u,udg_itemid1[i])) call RemoveItem(GetItem(u,udg_itemid2[i])) call RemoveItem(GetItem(u,udg_itemid3[i])) call DestroyEffect(AddSpecialEffectTarget(Recipe_Effect(),u,Recipe_AP())) set it=CreateItem(udg_output[i],GetUnitX(u),GetUnitY(u)) call SetItemUserData(it,i) //Used for disassembling. call UnitAddItem(u,it) set i=udg_RN endif elseif udg_ic[i] == 2 then if HasItems(u,i) then call RemoveItem(GetItem(u,udg_itemid1[i])) call RemoveItem(GetItem(u,udg_itemid2[i])) call DestroyEffect(AddSpecialEffectTarget(Recipe_Effect(),u,Recipe_AP())) set it=CreateItem(udg_output[i],GetUnitX(u),GetUnitY(u)) call SetItemUserData(it,i) //Used for disassembling. call UnitAddItem(u,it) set i=udg_RN endif endif endif endloop set it=null set u=null endfunction function InitRecipe takes nothing returns nothing set udg_RT=CreateTrigger() set udg_RC=true call TriggerRegisterAnyUnitEventBJ( udg_RT, EVENT_PLAYER_UNIT_PICKUP_ITEM ) call TriggerAddAction(udg_RT,function Recipe_Main) endfunction //call this at map init. //forced by WE function InitTrig_Recipe takes nothing returns nothing endfunction // End Recipe |
| 09-16-2008, 01:17 PM | #2 | |
Quote:
|
| 09-16-2008, 01:26 PM | #3 | |
Quote:
dont want to get into using vjass ect as the ppl im helping....well i had to explain how a integer A loop worked as well as why you would ever want an loop a and loop b.... so any ideas on how to tweak this? (more then happy to use another system just cant use vjass or anything like that) EDIT: maby change the creation to not remove the old items instead throw them in cache and recall them on disassemble? EDIT2: or maby using the inverse of the assemble code? |
