请选择 进入手机版 | 继续访问电脑版
查看: 4094|回复: 0

自动捡取物品功能[jass]

[复制链接]

4

主题

12

帖子

89

积分

注册会员

Rank: 2

积分
89
 楼主| 发表于 2019-6-27 20:25:06 | 显示全部楼层 |阅读模式
本帖最后由 超能之鱼人 于 2019-6-27 22:40 编辑
  1. //此演示为初级演示,仅支持非自动使用类型的物品。 另外物品可能需要锁定。
复制代码
  1. #define HASHTABLE ht
  2. #define GETITEMDIST 150.0
  3. #define GETITEMDISTTIME 10
  4. #define GETITEMMAXTIME 100
  5. #define ITEMFUNC_ITEM_OFFSET 10
  6. #define ITEMFUNC_MAX 1
  7. #define ITEMFUNC_MIN 2
  8. #define ITEMFUNC_TIMER1 3
  9. #define ITEMFUNC_TIME 4
  10. #define ITEMFUNC_TIMEEXIT 5
  11. globals
  12. hashtable ht=InitHashtable()
  13. unit itemcacheUnit=null
  14. endglobals
  15. function dbxy takes  real x1,real y1, real x2, real y2 returns real
  16.     return SquareRoot((x2 - x1) * (x2 - x1) +  (y2 - y1) * (y2 - y1))
  17. endfunction
  18. function hdbxy takes  widget d1, widget d2 returns real
  19.     return dbxy(GetWidgetX(d1),GetWidgetY(d1),GetWidgetX(d2),GetWidgetY(d2))
  20. endfunction
  21. function agetitem takes nothing returns nothing
  22.     local integer i=GetHandleId(GetExpiredTimer())
  23.     local unit u=LoadUnitHandle(HASHTABLE,i,0)
  24.     local integer min=LoadInteger(HASHTABLE,GetHandleId(u),ITEMFUNC_MIN)
  25.     local integer n=LoadInteger(HASHTABLE,GetHandleId(u),ITEMFUNC_TIMER1)
  26.     local integer s=LoadInteger(HASHTABLE,GetHandleId(u),ITEMFUNC_TIME)
  27.     local item im=LoadItemHandle(HASHTABLE,GetHandleId(u),ITEMFUNC_ITEM_OFFSET+min)
  28.    
  29.     if(im!=null)then
  30.         if(IsItemVisible(im))then
  31.             if(hdbxy(u,im)<GETITEMDIST)then
  32.                 call IssueTargetOrderById( u, 851971, im)
  33.                 set s=IMaxBJ(s,GETITEMMAXTIME-GETITEMDISTTIME)
  34.             else
  35.                 call IssuePointOrderById( u, 851983, GetWidgetX(im),GetWidgetY(im))
  36.             endif
  37.         else
  38.             set im=null
  39.         endif
  40.         call BJDebugMsg("时间:"+R2S(I2R(s)*0.1))
  41.         if(s>GETITEMMAXTIME)then
  42.             call SaveInteger(HASHTABLE,GetHandleId(u),ITEMFUNC_TIMEEXIT,1)
  43.             set im=null
  44.         else
  45.             call SaveInteger(HASHTABLE,GetHandleId(u),ITEMFUNC_TIME,s+1)   //时间0.1=1
  46.         endif
  47.     endif
  48.     if(im==null)then
  49.         call SaveInteger(HASHTABLE,GetHandleId(u),ITEMFUNC_TIMER1,0)
  50.         call FlushChildHashtable(HASHTABLE,i)
  51.         call PauseTimer(GetExpiredTimer())
  52.         call DestroyTimer(GetExpiredTimer())
  53.     endif
  54.     set u=null
  55.     set im=null
  56. endfunction
  57. function removeitemgetfunc takes unit u returns nothing
  58.     local integer i=GetHandleId(u)
  59.     local integer max=LoadInteger(HASHTABLE,GetHandleId(u),ITEMFUNC_MAX)
  60.     local integer min=LoadInteger(HASHTABLE,GetHandleId(u),ITEMFUNC_MIN)
  61.     loop
  62.         exitwhen min>max
  63.         call RemoveSavedHandle(HASHTABLE,i,ITEMFUNC_ITEM_OFFSET+min)
  64.     set min=min+1
  65.     endloop
  66.     call RemoveSavedInteger(HASHTABLE,i,ITEMFUNC_MAX)
  67.     call RemoveSavedInteger(HASHTABLE,i,ITEMFUNC_MIN)
  68.     call RemoveSavedInteger(HASHTABLE,i,ITEMFUNC_TIMER1)
  69.     call RemoveSavedInteger(HASHTABLE,i,ITEMFUNC_TIME)
  70.     call RemoveSavedInteger(HASHTABLE,i,ITEMFUNC_TIMEEXIT)
  71. endfunction
  72. function aglookupitem takes nothing returns nothing
  73.     local integer i=GetHandleId(GetExpiredTimer())
  74.     local unit u=LoadUnitHandle(HASHTABLE,i,0)
  75.     local integer max=LoadInteger(HASHTABLE,GetHandleId(u),ITEMFUNC_MAX)
  76.     local integer min=LoadInteger(HASHTABLE,GetHandleId(u),ITEMFUNC_MIN)
  77.     local integer n=LoadInteger(HASHTABLE,GetHandleId(u),ITEMFUNC_TIMER1)
  78.     local integer s=LoadInteger(HASHTABLE,GetHandleId(u),ITEMFUNC_TIME)
  79.     local integer ss=LoadInteger(HASHTABLE,GetHandleId(u),ITEMFUNC_TIMEEXIT)
  80.     local timer t
  81.     if(n==0)then
  82.         if(min<max and ss==0)then
  83.             set min=min+1
  84.             set t=CreateTimer()
  85.             call SaveUnitHandle(HASHTABLE,GetHandleId(t),0,u)
  86.             call SaveInteger(HASHTABLE,GetHandleId(u),ITEMFUNC_MIN,min)
  87.             call SaveInteger(HASHTABLE,GetHandleId(u),ITEMFUNC_TIMER1,1)
  88.             call SaveInteger(HASHTABLE,GetHandleId(u),ITEMFUNC_TIME,0)
  89.             call TimerStart(t,0.1,true,function agetitem)
  90.             set t=null
  91.         else
  92.             call removeitemgetfunc(u)
  93.             call FlushChildHashtable(HASHTABLE,i)
  94.             call PauseTimer(GetExpiredTimer())
  95.             call DestroyTimer(GetExpiredTimer())
  96.             call BJDebugMsg("结束")
  97.         endif
  98.     endif
  99.     set u=null
  100. endfunction

  101. function FromCenterSizeRect takes real x,real y, real width, real height returns rect
  102.     return Rect( x - width*0.5, y - height*0.5, x + width*0.5, y + height*0.5 )
  103. endfunction

  104. function agitemEnumItemsAction takes nothing returns nothing
  105.     local integer i=LoadInteger(HASHTABLE,GetHandleId(itemcacheUnit),ITEMFUNC_MAX)
  106.     set i=i+1
  107.     call SaveInteger(HASHTABLE,GetHandleId(itemcacheUnit),ITEMFUNC_MAX,i)
  108.     call SaveItemHandle(HASHTABLE,GetHandleId(itemcacheUnit),ITEMFUNC_ITEM_OFFSET+i,GetEnumItem())
  109. endfunction
  110. function rcautogetitem takes unit u,real rcsize returns nothing
  111.     local rect rc
  112.     local timer t
  113.     set itemcacheUnit=u
  114.     set rc=FromCenterSizeRect(GetUnitX(itemcacheUnit),GetUnitY(itemcacheUnit),rcsize,rcsize)
  115.     call EnumItemsInRect( rc,null, function agitemEnumItemsAction )
  116.     call RemoveRect(rc)
  117.     set rc=null
  118.     set t=CreateTimer()
  119.     call SaveUnitHandle(HASHTABLE,GetHandleId(t),0,itemcacheUnit)
  120.     call TimerStart(t,0.1,true,function aglookupitem)
  121.     set t=null
  122.     set itemcacheUnit=null
  123. endfunction
  124. function Trig_NewTrigger_000Conditions takes nothing returns boolean
  125.     return ((GetSpellAbilityId() == 'Absk'))
  126. endfunction
  127. function Trig_NewTrigger_000Actions takes nothing returns nothing
  128.     call rcautogetitem(GetSpellAbilityUnit(),375*2)
  129. endfunction
  130. //===========================================================================
  131. function InitTrig_NewTrigger_000 takes nothing returns nothing
  132.     set gg_trg_NewTrigger_000 = CreateTrigger()
  133. #ifdef DEBUG
  134.     call YDWESaveTriggerName(gg_trg_NewTrigger_000, "NewTrigger 000")
  135. #endif
  136.     call TriggerRegisterAnyUnitEventBJ( gg_trg_NewTrigger_000, EVENT_PLAYER_UNIT_SPELL_EFFECT )
  137.     call TriggerAddCondition(gg_trg_NewTrigger_000, Condition(function Trig_NewTrigger_000Conditions))
  138.     call TriggerAddAction(gg_trg_NewTrigger_000, function Trig_NewTrigger_000Actions)
  139. endfunction

复制代码

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

魔兽争霸官方对战平台 ( 互联网违法和不良信息举报电话:0571-28090163 )

GMT+8, 2021-12-1 03:17 , Processed in 0.044317 second(s), 6 queries , Redis On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表