找回密码
 点一下
查看: 1984|回复: 4

怎么让哈希表做成多人使用的?

[复制链接]
发表于 2011-1-23 22:59:38 | 显示全部楼层 |阅读模式
当时放技能时,创建另一个触发运行
  1. function Spell takes nothing returns boolean
  2.     return GetSpellAbilityId()=='A0MF'
  3. endfunction
  4. function Heal takes nothing returns nothing
  5.     local integer k=GetHandleId(GetTriggeringTrigger())
  6.     local real df=LoadReal(HT,k,1)
  7.     if(df<GetEventDamage())then
  8.         call DestroyEffect(LoadEffect(HT,k,2))
  9.         call DisableTrigger(GetTriggeringTrigger())
  10.         call SaveBoolean(HT,k,4,true)
  11.     elseif(GetEventDamage()>0)then
  12.         call DelayedDamageCheck(GetTriggerUnit(),GetEventDamage())
  13.         call SaveReal(HT,k,1,df-GetEventDamage())
  14.     endif
  15. endfunction
  16. function Setting takes nothing returns nothing
  17.     local trigger heal=CreateTrigger()
  18.     local integer k=GetHandleId(heal)
  19.     local triggeraction fct=TriggerAddAction(heal,function Heal)
  20.     call TriggerRegisterUnitEvent(heal,GetSpellTargetUnit(),EVENT_UNIT_DAMAGED)
  21.     call UnitRemoveBuffsBJ(1,GetSpellTargetUnit())
  22.     call SaveReal(HT,k,1,80+30*GetUnitAbilityLevel(GetTriggerUnit(),'A002')
  23.     call SaveEffectHandle(HT,k,2,AddSpecialEffectTarget("xxx.mdx",GetSpellTargetUnit(),"chest"))
  24.     call SavePlayerHandle(HT,k,3,GetOwningPlayer(GetTriggerUnit()))
  25.     call SaveBoolean(HT,k,4,false)
  26.     call PolledWait(15)
  27.     if(LoadBoolean(HT,k,4)==false)then
  28.            call DestroyEffect(LoadEffectHandle(HT,k,2))
  29.     endif
  30.     call TriggerRemoveAction(heal,fct)
  31. endfunction
  32. function InitTrig_Shield takes nothing returns nothing
  33.     local trigger Aphotic_Shield1=CreateTrigger()
  34.     call TriggerRegisterAnyUnitEventBJ(Shield1,EVENT_PLAYER_UNIT_SPELL_EFFECT)
  35.     call TriggerAddCondition(Shield1,Condition(function Spell))
  36.     call TriggerAddAction(Shield1,function Setting)
  37. endfunction
复制代码
如上所述,单位施法后,目标单位受伤害则回血,但如果释放2次,哈希表就被覆盖了,该怎么解决这个问题呢?
发表于 2011-1-23 23:17:09 | 显示全部楼层
key,不是trigger的handle,那个,换成释放目标的handle与原来的key的最大值的乘积加上原来应该用的key ,
回复

使用道具 举报

发表于 2011-1-24 00:27:16 | 显示全部楼层
本来我遇到过类似的问题,不过因为那是个学习用的例子,没使用价值,就没继续研究下去

然后我看楼主的代码,结果发现还需要牵扯出一系列别的代码,我找到其他部分后,大致弄成了这样子
function Spell takes nothing returns boolean
&#160;&#160;&#160;&#160;return GetSpellAbilityId()=='A000'
endfunction

function DelayedDamageTimer takes nothing returns nothing
&#160;&#160;&#160;&#160;local string lf5=H2Tx(GetExpiredTimer())
&#160;&#160;&#160;&#160;local unit lEU=GetUnit(lf5,"Unit")
&#160;&#160;&#160;&#160;call SetUnitState(lEU,UNIT_STATE_LIFE,GetUnitState(lEU,UNIT_STATE_LIFE)+GetReal(lf5,"Damage"))
endfunction

function DelayedDamage takes unit pEU,real pf7 returns nothing
&#160;&#160;&#160;&#160;local timer ltt=CreateTimer()
&#160;&#160;&#160;&#160;local string lf5=H2Tx(ltt)
&#160;&#160;&#160;&#160;call SetReal(lf5,"Damage",pf7)
&#160;&#160;&#160;&#160;call SetHandle(lf5,"Unit",pEU)
&#160;&#160;&#160;&#160;call TimerStart(ltt,0,false,function DelayedDamageTimer)
endfunction

function DelayedDamageCheck takes unit pEU,real pf7 returns nothing
&#160;&#160;&#160;&#160;local real lf9=GetUnitState(pEU,UNIT_STATE_MAX_LIFE) //设置lf9为最大生命值
&#160;&#160; local real lFa=GetUnitState(pEU,UNIT_STATE_LIFE)//设置lFa为当前生命值
&#160;&#160;&#160;&#160;if pf7>(lf9-lFa)then //如果所受伤害大于最大生命值-当前生命值
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if pf7>=lFa then //如果所受伤害大于等于当前生命值
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;call SetUnitState(pEU,UNIT_STATE_LIFE,lf9) //设置单位满血
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;call DelayedDamage(pEU,pf7-(lf9-lFa)) //调用××函数,开启定时器,加回“所受伤害-(最大生命值-当前生命值)”的值
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;else
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;call DelayedDamage(pEU,pf7)//调用××函数,开启定时器,加回所受伤害
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;endif
&#160;&#160;&#160;&#160;else
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;call SetUnitState(pEU,UNIT_STATE_LIFE,GetUnitState(pEU,UNIT_STATE_LIFE)+pf7))//直接设置单位生命值为当前生命值+所受伤害
&#160;&#160;&#160;&#160;endif
endfunction

function Heal takes nothing returns nothing
&#160;&#160;&#160;&#160;local integer k=GetHandleId(GetTriggeringTrigger())
&#160;&#160;&#160;&#160;local real df=LoadReal(udg_HT,k,1)
&#160;&#160;&#160;&#160;if(df<GetEventDamage())then
&#160;&#160;&#160;&#160;call DestroyEffect(LoadEffect(udg_HT,k,2))
&#160;&#160;&#160;&#160;call DisableTrigger(GetTriggeringTrigger())
&#160;&#160;&#160;&#160;call SaveBoolean(udg_HT,k,4,true)
&#160;&#160;&#160;&#160;elseif(GetEventDamage()>0)then
&#160;&#160;&#160;&#160;call DelayedDamageCheck(GetTriggerUnit(),GetEventDamage())
&#160;&#160;&#160;&#160;call SaveReal(udg_HT,k,1,df-GetEventDamage())
&#160;&#160;&#160;&#160;endif
endfunction

function Setting takes nothing returns nothing
&#160;&#160;&#160;&#160;local trigger heal=CreateTrigger()
&#160;&#160;&#160;&#160;local integer k=GetHandleId(heal)
&#160;&#160;&#160;&#160;local triggeraction fct=TriggerAddAction(heal,function Heal)
&#160;&#160;&#160;&#160;call TriggerRegisterUnitEvent(heal,GetSpellTargetUnit(),EVENT_UNIT_DAMAGED)
&#160;&#160;&#160;&#160;call UnitRemoveBuffsBJ(1,GetSpellTargetUnit())
&#160;&#160;&#160;&#160;call SaveReal(udg_HT,k,1,80+30*GetUnitAbilityLevel(GetTriggerUnit(),'A000')
&#160;&#160;&#160;&#160;call SaveEffectHandle(udg_HT,k,2,AddSpecialEffectTarget("xxx.mdx",GetSpellTargetUnit(),"chest"))
&#160;&#160;&#160;&#160;call SavePlayerHandle(udg_HT,k,3,GetOwningPlayer(GetTriggerUnit()))
&#160;&#160;&#160;&#160;call SaveBoolean(udg_HT,k,4,false)
&#160;&#160;&#160;&#160;call PolledWait(15)
&#160;&#160;&#160;&#160;if(LoadBoolean(udg_HT,k,4)==false)then
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;call DestroyEffect(LoadEffectHandle(udg_HT,k,2))
&#160;&#160;&#160;&#160;endif
&#160;&#160;&#160;&#160;call TriggerRemoveAction(heal,fct)
endfunction

function InitTrig_test002 takes nothing returns nothing
&#160;&#160;&#160;&#160;local trigger gg_trg_test002 = CreateTrigger( )
&#160;&#160;&#160;&#160;call TriggerRegisterAnyUnitEventBJ(gg_trg_test002,EVENT_PLAYER_UNIT_SPELL_EFFECT)
&#160;&#160;&#160;&#160;call TriggerAddCondition(gg_trg_test002,Condition(function Spell))
&#160;&#160;&#160;&#160;call TriggerAddAction(gg_trg_test002,function Setting)
endfunction


还几个函数不知道怎么弄出来
H2Tx
GetReal
SetReal
SetHandle
回复

使用道具 举报

发表于 2011-1-24 00:28:37 | 显示全部楼层
回复

使用道具 举报

发表于 2011-1-25 09:53:19 | 显示全部楼层
LZ的代码能通过吗?
比如第9行call DestroyEffect(LoadEffect(HT,k,2))
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-12-22 14:41 , Processed in 0.032120 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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