找回密码
 点一下
楼主: cccty1l

一个XX的模板

[复制链接]
 楼主| 发表于 2008-12-11 11:45:19 | 显示全部楼层

应求

稍微改变了“盾”的代码,尽管依然存在满血的Bug,但是不能回复的血量会被记录下来,从而增加“盾”可以抵消的伤害的上限,避免了浪费现象。当然,满血时由于伤害过高被秒“盾”没有作用!

把 UnitGetDamage.j粘贴进了自定义代码,不再需要import命令,如果编辑器支持随意申明全局变量的话,编辑代码就不会再有障碍了。如果不支持,请下载jasshelper。

另,代码稍有改变,添加了一个删除动态触发的函数,在顶楼更新。

关于移植性问题,请1234512 原谅,我希望可以由你自己来处理,或者你可以找别人求助。因为本帖只是展示下该模板的作用,技能方面恕不能如愿。

UnitGetDamage.w3x

45 KB, 下载次数: 20

只是全是J...

回复

使用道具 举报

发表于 2008-12-11 12:25:47 | 显示全部楼层
满血bug,是指满血下承受伤害不回复么?
回复

使用道具 举报

 楼主| 发表于 2008-12-11 12:32:16 | 显示全部楼层
引用第21楼zhuzeitou于2008-12-11 12:25发表的  :
满血bug,是指满血下承受伤害不回复么?

嗯,因为它的原理就是单位受到伤害的时候,得到伤害值,在伤害之前给单位加等量的血。所以满血的时候不会生效。

但是在演示里面会把少加的血累加到“盾”可以抵消的伤害里面,总的来说,一点都没少加血其实。
回复

使用道具 举报

发表于 2008-12-11 12:41:24 | 显示全部楼层
恩,于是一般都是用一个0秒计时器的,如果伤害值比已经掉得血多,那么就直接加血;如果伤害值比扣得血少而且比当前血少,那么0秒计时器过后加血;如果伤害值比扣得血少且比当前生命值多,那么先记录血量回满,0秒计时器后恢复血量
回复

使用道具 举报

 楼主| 发表于 2008-12-11 12:46:47 | 显示全部楼层
可以这样的么?嗯,
call TimerStart(Tm,0,false,function xxx)
就行么,那这个0秒大概会在伤害后多长时间运行,这里的Tm和其动作里面使用全局变量会不会导致冲突呢?
回复

使用道具 举报

发表于 2008-12-11 12:49:29 | 显示全部楼层
0秒应该说就是瞬间
一般貌似都不怎么考虑用全局额………………
回复

使用道具 举报

 楼主| 发表于 2008-12-11 12:55:00 | 显示全部楼层
等我测试一下,如果这样可行的话,根本就不需要加血了,触发运行时设置单位无敌,然后0秒设置可攻击就好了。
回复

使用道具 举报

发表于 2008-12-11 12:58:07 | 显示全部楼层
无敌么,buff之类可能出现一些比较奇怪的现象

而且加血还能做一些减伤啊、额外伤害啊之类的更多的事情呢
回复

使用道具 举报

 楼主| 发表于 2008-12-11 13:12:04 | 显示全部楼层
嗯。触发实体代码[codes=jass]globals
timer gg=CreateTimer()
unit gu
endglobals
function aaa takes nothing returns nothing
call BJDebugMsg(I2S(3))
call SetUnitInvulnerable(gu,false)
endfunction
function bbb takes nothing returns nothing
set gu=GetTriggerUnit()
call BJDebugMsg(I2S(1))
call SetUnitInvulnerable(gu, true )
call TimerStart(gg,0,false,function aaa)
call BJDebugMsg(I2S(2))
endfunction[/codes]

通过一个巫妖对其释放Nova,因为该技能是两个连续的伤害,所以可以测试计时器的0秒到底有多快。

结果是屏幕上显示 1,2,1,2,3

也就是说计时器的速度是慢于这两个连续的伤害的,也就是说在这里尽管很快也不是瞬时,也就是不能使用全局变量来节省资源,因为会被覆盖。也就是说每次接受伤害都需要一个计时器同时配合缓存来进行接下来的动作。
回复

使用道具 举报

发表于 2008-12-11 13:16:48 | 显示全部楼层
恩,记得当时自己做着玩的时候这个问题也搞了好久,因为当时要处理伤害值大于最大生命值的问题,所以需要用到增加最大生命值的技能,但是这样如果遇到bash或者其他连续伤害情况,就会出问题,于是最后判定作的很复杂………………………………
回复

使用道具 举报

 楼主| 发表于 2008-12-11 13:20:50 | 显示全部楼层
嗯,不知道有没有办法可以得到Nova第一次伤害之后和第二次伤害之前这段时间,这个0秒还是太慢了....
回复

使用道具 举报

发表于 2008-12-11 13:28:54 | 显示全部楼层
lz是想用全局计时器来做么??貌似不怎么现实额
回复

使用道具 举报

发表于 2008-12-11 13:39:21 | 显示全部楼层

Re:应求

引用第20楼cccty1l于2008-12-11 11:45发表的 应求 :
稍微改变了“盾”的代码,尽管依然存在满血的Bug,但是不能回复的血量会被记录下来,从而增加“盾”可以抵消的伤害的上限,避免了浪费现象。当然,满血时由于伤害过高被秒“盾”没有作用!

把 UnitGetDamage.j粘贴进了自定义代码,不再需要import命令,如果编辑器支持随意申明全局变量的话,编辑代码就不会再有障碍了。如果不支持,请下载jasshelper。

另,代码稍有改变,添加了一个删除动态触发的函数,在顶楼更新。
.......
谢谢,用WEHELPER1.8.1打开直接保存不会出错了,看来可以研究研究了
回复

使用道具 举报

 楼主| 发表于 2008-12-11 13:52:31 | 显示全部楼层
引用第31楼zhuzeitou于2008-12-11 13:28发表的  :
lz是想用全局计时器来做么??貌似不怎么现实额

没什么更好的办法的话就让它Bug着吧先....
回复

使用道具 举报

发表于 2008-12-11 14:45:17 | 显示全部楼层
  1. function jineng5_trg2 takes nothing returns boolean
  2. local unit Ds=GetEventDamageSource()
  3. local integer n=GetUnitTypeId(Ds)
  4. local integer i=GetUnitAbilityLevel(GetTriggerUnit(),'B003')
  5. local boolean b=false
  6. if(n=='Obla')then
  7.     if(IsUnitType(Ds,UNIT_TYPE_HERO) and i>0)then
  8.         call UnitRemoveAbility(GetTriggerUnit(),'B003')
  9.         if(GetRandomReal(0,100)<=40)then
  10.             set b=true
  11.         endif
  12.     elseif(not IsUnitType(Ds,UNIT_TYPE_HERO) and GetRandomReal(0,100)<=20)then
  13.         set b=true
  14.     endif
  15.     if(b and i<8)then
  16.         call IssueTargetOrderById(u,852274,Ds)
  17.         set i=i+1
  18.     endif
  19. endif
  20. return false
  21. endfunction
  22. function jineng5_trg1 takes nothing returns boolean
  23. local unit u=GetTriggerUnit()
  24. local integer i1=GetUnitUserData(u)
  25. if(i1!=0)then
  26.     if(i1<i)then
  27.         set a[i1]=a[i]
  28.         call SetUnitUserData(h[i],i1)
  29.     endif
  30.     set i=i-1
  31. elseif(GetUnitTypeId(u)=='Obla')then
  32.     call SetUnitUserData(u,i)
  33.     set h[i]=u
  34.     call TriggerRegisterUnitEvent(t,u,EVENT_UNIT_TARGET_IN_RANGE)
  35.     call TriggerRegisterUnitEvent(t1,u,EVENT_UNIT_DEATH )
  36. endif
  37. return false
  38. endfunction
  39. function jineng5_trg takes nothing returns boolean
  40. local unit u=GetTriggerUnit()
  41. local unit u1=GetEventTargetUnit()
  42. local integer i
  43. if(IsUnitType(u,UNIT_TYPE_HERO))then
  44.     if(u1!=a[0])then
  45.         call Damage_AddUnit("jineng5",u1)
  46.         set a[0]=u1
  47.     endif
  48. else
  49.     set i1=GetUnitUserData(u)
  50.     if(u1!=a[i])then
  51.         call Damage_AddUnit("jineng5",u1)
  52.         set a[i]=u1
  53.     endif
  54. endif
  55. set u=null
  56. set u1=null
  57. return false
  58. endfunction
  59. function InitTrig_jineng5 takes nothing returns nothing
  60. call Damage_trg("jineng5",Condition(function jineng5_trg2))
  61. call SelectHeroSkill(u,'A009')
  62. set u=CreateUnit(GetOwningPlayer(u),'e000',0,0,0)
  63. call UnitAddAbility(u,'A004')
  64. set t=CreateTrigger()
  65. call TriggerRegisterUnitEvent(t,u,EVENT_UNIT_TARGET_IN_RANGE)
  66. call TriggerAddCondition(t,Condition(function jineng5_trg))
  67. set t1=CreateTrigger()
  68. call TriggerRegisterEnterRectSimple(t1,GetPlayableMapRect())
  69. call TriggerAddCondition(t1,Condition(function jineng5_trg1))
  70. set u=null
  71. endfunction
复制代码
...
回复

使用道具 举报

 楼主| 发表于 2008-12-11 15:25:45 | 显示全部楼层

我给你简单说下这个技能的思路吧。
1,你有了一个英雄,他自身有一个被动技能,攻击其他单位会产生ID为'B003'的Buff。当单位被攻击并且身上有这个Buff的话,开始取随机数,满足条件就命令傀儡单位对其释放幻象权杖的技能,于是生成了一个镜像。同时,记录镜像数量的整数加1。这个整数大于8的话,就不会再产生镜像了。

2,镜像进入地图区域,会触发一个函数,它首先会获取单位的自定义值,如果是零,那么好,给它一个自定义值,并且添加了其死亡的事件。

3,镜像攻击单位产生伤害了,因为之前英雄的被动技能镜像是不能使用的,所以单位身上没有那个Buff,但是我们可以得到攻击者的单位ID,这个ID与英雄相同并且还不是英雄。那么它就是满足条件的镜像,于是随机值,再让傀儡对其使用幻象权杖。同时,记录镜像数量的整数加1.。这时,会触发2。再来一次判断。

然后说下单位的自定义值有什么用,因为单位受伤害这个动态的触发并没有在一开始就添加了所有单位,所以我就让英雄和其镜像在获取到可攻击单位的同时把被攻击的单位添加进触发,但是这样的结果就是他们每次攻击都得判断是否要把这个要挨揍的单位添加进触发,很麻烦,所以我就给每个攻击者对应了一个变量,上面记录了它上次攻击了谁,而这次如果还一样的话,那就不要判断了,已经被添加了!而这个记录,我是使用单位的自定义值来获取的,配对了数组。

还有镜像时间到了或被揍死了,它也会触发2里面说的函数,同样的,它先获取单位的自定义值,好了,有。那么记录镜像数量的整数减1。

说了这么多我都晕了....

好了,问题就到此为止,这个贴我不再管了,请你也不要在这里贴帖子了。有问题的话,给我发站内信好了。
回复

使用道具 举报

发表于 2008-12-11 16:20:42 | 显示全部楼层
恩恩,这个是你要的

AI_beta0.5a2.2.rar

2.54 MB, 下载次数: 18

回复

使用道具 举报

发表于 2008-12-11 16:30:28 | 显示全部楼层
引用第35楼cccty1l于2008-12-11 15:25发表的  :

我给你简单说下这个技能的思路吧。
1,你有了一个英雄,他自身有一个被动技能,攻击其他单位会产生ID为'B003'的Buff。当单位被攻击并且身上有这个Buff的话,开始取随机数,满足条件就命令傀儡单位对其释放幻象权杖的技能,于是生成了一个镜像。同时,记录镜像数量的整数加1。这个整数大于8的话,就不会再产生镜像了。

2,镜像进入地图区域,会触发一个函数,它首先会获取单位的自定义值,如果是零,那么好,给它一个自定义值,并且添加了其死亡的事件。
.......
基本还是能看懂流程,之前稍微有点PHP之类的基础,J没研究过,不过最近接触多还能有点感觉,只是时间不够用,没法深入学习研究,
再次感谢你这么不厌其烦的指导,等空了再继续研究这个了[s:186]
回复

使用道具 举报

发表于 2008-12-15 17:25:55 | 显示全部楼层
技能最好能介绍详细点,否则没玩过Dota的估计比较难理解,比如我,呵呵
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-2 12:12 , Processed in 0.192561 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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