找回密码
 点一下
查看: 8056|回复: 26

一比较冷门的函数GetSpellAbility()

[复制链接]
发表于 2009-7-12 00:05:00 | 显示全部楼层 |阅读模式
也许你看了这标题不以为然。这个GetSpellAbility()我不是常用么?

其实不然,大家平常在用的其实是GetSpellAbilityId(),多个Id,学问大哦
[jass]
constant native GetSpellAbilityId           takes nothing returns integer
constant native GetSpellAbility             takes nothing returns ability
[/jass]

仔细观察,会发现2个函数返回的类型不同。一个是integer,一个是ability。

ability是个什么东西呢?也许很少有人意识到。其实Common.j里的ability是继承自handle的,而如果你是1.24,还能更明确地知道它是继承自agent的,也就表明它其实是个有实际对象指向的、会计算变量连接数的变量类型。

它跟你在WE的GUI界面下看到的"Ability"可完全不同,WE里那个Ability实际上是integer,是个整数,其实它保存的是技能的id。技能id只代表一个技能类型。而jass中的ability 类型才是真正的指向某个特定技能实例的变量。也就说是对象变量。

不过实际上Jass中涉及到ability类型的函数就只有这一个GetSpellAbility。它的作用就是,当你使用单位技能事件(开始、开始效果、结束、停止)的时候,会返回触发该事件的技能的一个独一无二的handle标记。

看上去这个似乎没什么用,但是它却能用来判断两次触发事件的技能是不是同一个技能。毕竟你一张地图里可以有很多个同类型的技能(这些技能可以在同一人身上也可以在不同人身上),但是你但是用技能id是分辨不出两个烈焰风暴技能是否是同一个的(尤其是在同一个人身上的时候)。所以还是有点价值的。



本来应该给出个演示的,展示技能handle值和技能id的区别,并用GetHandleId()把技能handle显示出来。但是我想起我的War3是1.24的,用了GetHandleId()的函数的话,你们大部分人的war3都看不了。所以就只作下口头说明了。

评分

参与人数 1威望 +5 收起 理由
血戮魔动冰 + 5 膜拜

查看全部评分

 楼主| 发表于 2009-7-12 00:08:07 | 显示全部楼层
也许有人问,同一人身上两个一样的技能有何意义啊,它们不是会冲突的么?

回答是:不冲突的法子可多着呢,比如大法师身上有个暴风雪,然后它捡到一个拥有暴风雪技能的物品,或者他有个魔法书技能,魔法书里头还有暴风雪等等。

用这个函数就可以很容易把它们区分开来了。


注:这个函数比较特殊的地方是,每个技能都只有在触发过一次事件,并在动作里调用这个函数后,才会生成其handle值。否则不会产生handle表位。
回复

使用道具 举报

发表于 2009-7-12 00:44:20 | 显示全部楼层
GetSpellAbility这个以前从没用过,都是用id的。还真是神奇的东西
回复

使用道具 举报

发表于 2009-7-12 02:45:37 | 显示全部楼层

除了拜不知道该干什么了……
回复

使用道具 举报

发表于 2009-7-12 05:59:37 | 显示全部楼层
本质上是这个拉

int * GetUnitAbilityObj(PVOID pUnit, ULONG abil)
{
   int * result;
   int addr = (int)GameAdd(0x79340);//1.23
   //ECX=单位,参数(技能,0,1,1,1)返回该单位该技能object
   //如果单位没有该技能为0

   if (pUnit==0 || abil == 0) return 0;

   __asm
   {
     mov ecx, pUnit
     push 1
     push 1
     push 1 //不包含某类技能为0
     push 0
     push abil
     mov  eax, addr
     call    eax
     mov   result, eax
   }
   return result;
}
回复

使用道具 举报

发表于 2009-7-12 09:38:22 | 显示全部楼层
LS解释得灰常明白~
膜拜+1
回复

使用道具 举报

发表于 2009-7-12 10:31:35 | 显示全部楼层
估计就是个记录技能生效object的东西。。
回复

使用道具 举报

发表于 2009-7-12 10:32:41 | 显示全部楼层
同一个技能在一个单位身上生效obj是唯一的么?
回复

使用道具 举报

发表于 2009-7-12 10:51:19 | 显示全部楼层
怪不得w3c的bug报告贴里说,施法事件触发时删除触发单位的触发技能,GetSpellAbility()就返回null了
回复

使用道具 举报

发表于 2009-7-12 12:45:06 | 显示全部楼层
头目的表达能力很好.
回复

使用道具 举报

发表于 2009-7-12 12:56:35 | 显示全部楼层
很适合人类阅读
回复

使用道具 举报

发表于 2009-7-12 12:57:34 | 显示全部楼层
不懂的人路过
回复

使用道具 举报

恶声恶气 该用户已被删除
发表于 2009-7-12 12:59:58 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2009-7-12 14:39:50 | 显示全部楼层
引用第1楼Renee于2009-07-12 00:08发表的  :
注:这个函数比较特殊的地方是,每个技能都只有在触发过一次事件后,才会生成其handle值。否则不会产生handle表位。
貌似其他的也是这样。比如预置的东西如果不在T里用一下的话,jass里就用不了。
回复

使用道具 举报

发表于 2009-7-12 14:45:24 | 显示全部楼层
头目的表达能力非常强大,我这个呆瓜竟然也能看懂。
回复

使用道具 举报

发表于 2009-7-12 17:42:05 | 显示全部楼层
引用第13楼sensibillity于2009-07-12 14:39发表的  :

貌似其他的也是这样。比如预置的东西如果不在T里用一下的话,jass里就用不了。
这个是因为如果t里用不到的话,war3map.j压根就不会生成这个全局变量吧
回复

使用道具 举报

 楼主| 发表于 2009-7-12 20:50:43 | 显示全部楼层
引用第13楼sensibillity于2009-07-12 14:39发表的  :

貌似其他的也是这样。比如预置的东西如果不在T里用一下的话,jass里就用不了。

你说的这个就完全不是这么回事了。

须知所谓“预置”的单位,其实归根结底还是用jass脚本创建出来的。

你那个问题其实是由于没有指向该对象的变量而导致的。其实你如果用I2U的话还是可以抓到那些单位。
回复

使用道具 举报

发表于 2009-7-12 21:10:10 | 显示全部楼层
注:这个函数比较特殊的地方是,每个技能都只有在触发过一次事件后,才会生成其handle值。否则不会产生handle表位。

其实任何handle值都是在第一次调用触发或者函数得到他的时候才生成的,如果一个地图上连默认触发都没有,只有一个兵营,造出的单位也是没有handle值的
回复

使用道具 举报

发表于 2009-7-13 05:18:32 | 显示全部楼层
所以对战中,召唤物,NE金矿,角鹰骑士都是搜不到handle值的。。
回复

使用道具 举报

发表于 2009-7-13 13:48:34 | 显示全部楼层
膜拜头目, 膜拜17楼...
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-24 11:33 , Processed in 0.350266 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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