|
本帖最后由 超能之鱼人 于 2019-6-27 22:40 编辑
- //此演示为初级演示,仅支持非自动使用类型的物品。 另外物品可能需要锁定。
复制代码- #define HASHTABLE ht
- #define GETITEMDIST 150.0
- #define GETITEMDISTTIME 10
- #define GETITEMMAXTIME 100
- #define ITEMFUNC_ITEM_OFFSET 10
- #define ITEMFUNC_MAX 1
- #define ITEMFUNC_MIN 2
- #define ITEMFUNC_TIMER1 3
- #define ITEMFUNC_TIME 4
- #define ITEMFUNC_TIMEEXIT 5
- globals
- hashtable ht=InitHashtable()
- unit itemcacheUnit=null
- endglobals
- function dbxy takes real x1,real y1, real x2, real y2 returns real
- return SquareRoot((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1))
- endfunction
- function hdbxy takes widget d1, widget d2 returns real
- return dbxy(GetWidgetX(d1),GetWidgetY(d1),GetWidgetX(d2),GetWidgetY(d2))
- endfunction
- function agetitem takes nothing returns nothing
- local integer i=GetHandleId(GetExpiredTimer())
- local unit u=LoadUnitHandle(HASHTABLE,i,0)
- local integer min=LoadInteger(HASHTABLE,GetHandleId(u),ITEMFUNC_MIN)
- local integer n=LoadInteger(HASHTABLE,GetHandleId(u),ITEMFUNC_TIMER1)
- local integer s=LoadInteger(HASHTABLE,GetHandleId(u),ITEMFUNC_TIME)
- local item im=LoadItemHandle(HASHTABLE,GetHandleId(u),ITEMFUNC_ITEM_OFFSET+min)
-
- if(im!=null)then
- if(IsItemVisible(im))then
- if(hdbxy(u,im)<GETITEMDIST)then
- call IssueTargetOrderById( u, 851971, im)
- set s=IMaxBJ(s,GETITEMMAXTIME-GETITEMDISTTIME)
- else
- call IssuePointOrderById( u, 851983, GetWidgetX(im),GetWidgetY(im))
- endif
- else
- set im=null
- endif
- call BJDebugMsg("时间:"+R2S(I2R(s)*0.1))
- if(s>GETITEMMAXTIME)then
- call SaveInteger(HASHTABLE,GetHandleId(u),ITEMFUNC_TIMEEXIT,1)
- set im=null
- else
- call SaveInteger(HASHTABLE,GetHandleId(u),ITEMFUNC_TIME,s+1) //时间0.1=1
- endif
- endif
- if(im==null)then
- call SaveInteger(HASHTABLE,GetHandleId(u),ITEMFUNC_TIMER1,0)
- call FlushChildHashtable(HASHTABLE,i)
- call PauseTimer(GetExpiredTimer())
- call DestroyTimer(GetExpiredTimer())
- endif
- set u=null
- set im=null
- endfunction
- function removeitemgetfunc takes unit u returns nothing
- local integer i=GetHandleId(u)
- local integer max=LoadInteger(HASHTABLE,GetHandleId(u),ITEMFUNC_MAX)
- local integer min=LoadInteger(HASHTABLE,GetHandleId(u),ITEMFUNC_MIN)
- loop
- exitwhen min>max
- call RemoveSavedHandle(HASHTABLE,i,ITEMFUNC_ITEM_OFFSET+min)
- set min=min+1
- endloop
- call RemoveSavedInteger(HASHTABLE,i,ITEMFUNC_MAX)
- call RemoveSavedInteger(HASHTABLE,i,ITEMFUNC_MIN)
- call RemoveSavedInteger(HASHTABLE,i,ITEMFUNC_TIMER1)
- call RemoveSavedInteger(HASHTABLE,i,ITEMFUNC_TIME)
- call RemoveSavedInteger(HASHTABLE,i,ITEMFUNC_TIMEEXIT)
- endfunction
- function aglookupitem takes nothing returns nothing
- local integer i=GetHandleId(GetExpiredTimer())
- local unit u=LoadUnitHandle(HASHTABLE,i,0)
- local integer max=LoadInteger(HASHTABLE,GetHandleId(u),ITEMFUNC_MAX)
- local integer min=LoadInteger(HASHTABLE,GetHandleId(u),ITEMFUNC_MIN)
- local integer n=LoadInteger(HASHTABLE,GetHandleId(u),ITEMFUNC_TIMER1)
- local integer s=LoadInteger(HASHTABLE,GetHandleId(u),ITEMFUNC_TIME)
- local integer ss=LoadInteger(HASHTABLE,GetHandleId(u),ITEMFUNC_TIMEEXIT)
- local timer t
- if(n==0)then
- if(min<max and ss==0)then
- set min=min+1
- set t=CreateTimer()
- call SaveUnitHandle(HASHTABLE,GetHandleId(t),0,u)
- call SaveInteger(HASHTABLE,GetHandleId(u),ITEMFUNC_MIN,min)
- call SaveInteger(HASHTABLE,GetHandleId(u),ITEMFUNC_TIMER1,1)
- call SaveInteger(HASHTABLE,GetHandleId(u),ITEMFUNC_TIME,0)
- call TimerStart(t,0.1,true,function agetitem)
- set t=null
- else
- call removeitemgetfunc(u)
- call FlushChildHashtable(HASHTABLE,i)
- call PauseTimer(GetExpiredTimer())
- call DestroyTimer(GetExpiredTimer())
- call BJDebugMsg("结束")
- endif
- endif
- set u=null
- endfunction
- function FromCenterSizeRect takes real x,real y, real width, real height returns rect
- return Rect( x - width*0.5, y - height*0.5, x + width*0.5, y + height*0.5 )
- endfunction
- function agitemEnumItemsAction takes nothing returns nothing
- local integer i=LoadInteger(HASHTABLE,GetHandleId(itemcacheUnit),ITEMFUNC_MAX)
- set i=i+1
- call SaveInteger(HASHTABLE,GetHandleId(itemcacheUnit),ITEMFUNC_MAX,i)
- call SaveItemHandle(HASHTABLE,GetHandleId(itemcacheUnit),ITEMFUNC_ITEM_OFFSET+i,GetEnumItem())
- endfunction
- function rcautogetitem takes unit u,real rcsize returns nothing
- local rect rc
- local timer t
- set itemcacheUnit=u
- set rc=FromCenterSizeRect(GetUnitX(itemcacheUnit),GetUnitY(itemcacheUnit),rcsize,rcsize)
- call EnumItemsInRect( rc,null, function agitemEnumItemsAction )
- call RemoveRect(rc)
- set rc=null
- set t=CreateTimer()
- call SaveUnitHandle(HASHTABLE,GetHandleId(t),0,itemcacheUnit)
- call TimerStart(t,0.1,true,function aglookupitem)
- set t=null
- set itemcacheUnit=null
- endfunction
- function Trig_NewTrigger_000Conditions takes nothing returns boolean
- return ((GetSpellAbilityId() == 'Absk'))
- endfunction
- function Trig_NewTrigger_000Actions takes nothing returns nothing
- call rcautogetitem(GetSpellAbilityUnit(),375*2)
- endfunction
- //===========================================================================
- function InitTrig_NewTrigger_000 takes nothing returns nothing
- set gg_trg_NewTrigger_000 = CreateTrigger()
- #ifdef DEBUG
- call YDWESaveTriggerName(gg_trg_NewTrigger_000, "NewTrigger 000")
- #endif
- call TriggerRegisterAnyUnitEventBJ( gg_trg_NewTrigger_000, EVENT_PLAYER_UNIT_SPELL_EFFECT )
- call TriggerAddCondition(gg_trg_NewTrigger_000, Condition(function Trig_NewTrigger_000Conditions))
- call TriggerAddAction(gg_trg_NewTrigger_000, function Trig_NewTrigger_000Actions)
- endfunction
复制代码
|
|