找回密码
 点一下
查看: 1605|回复: 5

1.1.3里获取单位Handle ID的方法

[复制链接]
发表于 2010-11-18 19:56:41 | 显示全部楼层 |阅读模式
大概有很多同学发现24号属性已经没用了。单位的24号属性返回的是0。

不过其实这个问题不大,本来就并不是只有24号属性是单位的唯一ID的。而是24以后的数字全部都是。


只是1.1.3版本以后24-29属性的返回值全部变成了0,但是30以后没有变,所以我们只要稍微将属性参数改为30就能解决问题。


[codes=galaxy]
int UnitGetHandleId(unit u)
{
    return UnitGetPropertyInt(u,30,c_unitPropCurrent);
}
[/codes]


在一个一个单位都没有的地图上测试新建单位并显示它们的ID的结果:

可见和以前一样,依然是每个单位+64。


00:00:02.88 0
00:00:02.88 64
00:00:02.88 128
00:00:02.88 192
00:00:02.88 256
00:00:02.88 320
00:00:02.88 384
00:00:02.88 448
00:00:02.88 512
00:00:02.88 576
00:00:02.88 640
00:00:02.88 704
00:00:02.88 768
00:00:02.88 832
00:00:02.88 896
00:00:02.88 960
00:00:02.88 1024
00:00:02.88 1088
00:00:02.88 1152
00:00:02.88 1216
00:00:02.88 1280
00:00:02.88 1344
00:00:02.88 1408
00:00:02.88 1472
00:00:02.88 1536
00:00:02.88 1600
00:00:02.88 1664
00:00:02.88 1728
00:00:02.88 1792
00:00:02.88 1856
00:00:02.88 1920
00:00:02.88 1984
00:00:02.88 2048
00:00:02.88 2112
00:00:02.88 2176
00:00:02.88 2240
00:00:02.88 2304
00:00:02.88 2368
00:00:02.88 2432
00:00:02.88 2496
00:00:02.88 2560
00:00:02.88 2624
00:00:02.88 2688
00:00:02.88 2752
00:00:02.88 2816
00:00:02.88 2880
00:00:02.88 2944
00:00:02.88 3008
00:00:02.88 3072
00:00:02.88 3136
发表于 2010-11-19 08:02:56 | 显示全部楼层
很好狠强大,不过为啥要64递增呢~这样单位多了数字好长的说~~~
回复

使用道具 举报

发表于 2010-11-21 20:29:02 | 显示全部楼层
因为大约每个单位的结构占用64bytes。
回复

使用道具 举报

发表于 2011-2-13 17:54:26 | 显示全部楼层
顺便说下~~1.2.0里单位ID的属性号又后推了到了35~~

所以最安全的方法是直接写9999~~这样就可以兼容以后的版本了~~

[codes=galaxy]
int UnitGetHandleId(unit u)
{
    return UnitGetPropertyInt(u,9999,c_unitPropCurrent);
}
[/codes]
回复

使用道具 举报

发表于 2011-2-15 09:32:36 | 显示全部楼层
不知道这是什么原理。

void funny_test() {
    unit u = GetLocalSelection(1);
    int i = UnitGetPropertyInt(u,9999,c_unitPropCurrent);
    int i2 = UnitToInt(u);
     
    ScreenMsg("UnitGetPropertyInt(u,9999,c_unitPropCurrent) = "+IntToString(i));
    ScreenMsg("H2I(u) = "+IntToString(i2));
}


与单位的真实handle值对比结果
h2i.jpg
回复

使用道具 举报

发表于 2011-2-16 03:20:44 | 显示全部楼层
这两个东西本质上是一回事。

只是一个是从0开始,每个单位+64,而另一个是从1开始每个单位+262144

差值一个是2的6次方一个是2的18次方。

所以换算方法是B=A*4096+1


你把9999号属性除以64也能得到一套新的handle id。但是实际上是一样的。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-23 06:00 , Processed in 0.077089 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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