//作用:物品仓库
//此技能用不死族的[腐臭蜂群]作为模板来改
//把[所定允许]改为 ground,debris,item,player,air,self
//(复制以上的内容,按住Shift双击[所定允许],粘贴进去)
//[影响区域],[最终区域],[距离],[伤害]都改为0
//把[射箭技巧]去掉
//当然,你也可以通过修改一个“通魔”技能来完成,但会有一个小小的BUG:
//以英雄带在身上的物品为目标放入仓库时,有时无法完成
//当英雄以自己为目标时,则为把身上的所有物品放到仓库里
//以物品为目标时,拾起该物品放到仓库里(物品可以是英雄携带的,也可以是地上的)
//以空地为目标时,取出物品,取物品的顺序与放入的相反,后放入的先取出
function Trig_Storage_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'AUcs'
endfunction
function Trig_Storage_Actions takes nothing returns nothing
local integer M=100 //最多100个物品
local integer N=12 //支持12位玩家
// M,N必须满足这个关系:M*N*4<8192-N
local item ITEM=GetSpellTargetItem()
local unit UNIT=GetSpellAbilityUnit()
local integer i=GetPlayerId(GetOwningPlayer(UNIT))
local integer c
local integer ic
local location loc
local string str="==error on storage=="
if (UNIT==GetSpellTargetUnit()) then //以自己为目标,存储身上的所有物品
if ( UnitInventoryCount(UNIT)==0 ) then
set str="|cffffcc00你没有物品可以放到仓库里"
else
set ic=0
loop
//我是使用了bj_meleeTwinkedHeroes这个变量来保存物品里...尽其所用
//这个变量是在Blizzard.j里定义的,第499行 integer array bj_meleeTwinkedHeroes
//如果你的地图有标准对战成份,那么就自己定义一个全局变量吧。。
exitwhen bj_meleeTwinkedHeroes[i*N]==M or ic>5
set c=bj_meleeTwinkedHeroes[i*N]
set ITEM=UnitItemInSlot(UNIT,ic)
if ( ITEM!=null ) then
set bj_meleeTwinkedHeroes[i*N]=c+1
set bj_meleeTwinkedHeroes[N+c*3+0+i*M]=GetItemTypeId(ITEM)
set bj_meleeTwinkedHeroes[N+c*3+1+i*M]=GetItemUserData(ITEM)
set bj_meleeTwinkedHeroes[N+c*3+2+i*M]=GetItemCharges(ITEM)
set bj_meleeTwinkedHeroes[N+c*3+3+i*M]=R2I(GetItemLifeBJ(ITEM))
call RemoveItem(ITEM)
endif
set ic=ic+1
endloop
if ( bj_meleeTwinkedHeroes[i*N]==M ) then
set str="|cffffcc00仓库已满,无法再放入物品"
else
set str="仓库现共有物品数:"+I2S(bj_meleeTwinkedHeroes[i*N])
endif
endif
elseif ( ITEM!=null ) then //以单个物品为目标,存储
if ( bj_meleeTwinkedHeroes[i*N]==M ) then
set str="|cffff0000仓库已满,无法再放入物品"
else
set c=bj_meleeTwinkedHeroes[i*N]
set bj_meleeTwinkedHeroes[i*N]=c+1
set bj_meleeTwinkedHeroes[N+c*3+0+i*M]=GetItemTypeId(ITEM)
set bj_meleeTwinkedHeroes[N+c*3+1+i*M]=GetItemUserData(ITEM)
set bj_meleeTwinkedHeroes[N+c*3+2+i*M]=GetItemCharges(ITEM)
set bj_meleeTwinkedHeroes[N+c*3+3+i*M]=R2I(GetItemLifeBJ(ITEM))
call RemoveItem(ITEM)
set str="仓库现共有物品数:"+I2S(c+1)
endif
else //以空地为目标,提取物品
set ic=6-UnitInventoryCount(UNIT)
if ( ic==0 ) then
set str="|cffffcc00英雄的物品栏已满,无法再提取物品"
else
if ( bj_meleeTwinkedHeroes[i*N]==0 ) then
set str="|cffff0000仓库已空,没有物品可提取 "
else
set loc=GetSpellTargetLoc()
loop
exitwhen bj_meleeTwinkedHeroes[i*N]==0 or ic==0
set c=bj_meleeTwinkedHeroes[i*N]-1
set bj_meleeTwinkedHeroes[i*N]=c
set ITEM=CreateItem(bj_meleeTwinkedHeroes[N+c*3+0+i*M],GetLocationX(loc)+50,GetLocationY(loc)+50)
call SetItemUserData(ITEM,bj_meleeTwinkedHeroes[N+c*3+1+i*M])
call SetItemCharges( ITEM,bj_meleeTwinkedHeroes[N+c*3+2+i*M])
call SetItemLifeBJ( ITEM,I2R(bj_meleeTwinkedHeroes[N+c*3+3+i*M]))
call UnitAddItem(UNIT,ITEM)
set ic=ic-1
endloop
call RemoveLocation(loc)
if (bj_meleeTwinkedHeroes[i*N]==0) then
set str="|cffffcc00仓库里的物品已经被全部提出"
else
set str="仓库还剩下物品数:"+I2S(bj_meleeTwinkedHeroes[i*N])
endif
endif
endif
endif
call DisplayTimedTextToPlayer(Player(i),0,0,5,str)
endfunction
//===========================================================================
function InitTrig_Storage takes nothing returns nothing
set gg_trg_Storage = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Storage, EVENT_PLAYER_UNIT_SPELL_CAST )
call TriggerAddCondition( gg_trg_Storage, Condition( function Trig_Storage_Conditions ) )
call TriggerAddAction( gg_trg_Storage, function Trig_Storage_Actions )
endfunction |