找回密码
 点一下
查看: 967|回复: 3

对CatalogFieldValueGet()的一点补充

[复制链接]
发表于 2012-4-26 17:27:03 | 显示全部楼层 |阅读模式
在core的xml里面有这样的定义
[codes=xml]    <const id="Burrow" path="CUnit.Collide.index" value="Land1"/>
    <const id="Swarm" path="CUnit.Collide.index" value="Land4"/>
    <const id="Flying" path="CUnit.Collide.index" value="Air1"/>
    ...[/codes]

而在unit的xml你看到了。。
[codes=xml]    <CUnit default="1" id="XXX">
        <PlaneArray index="Flying " value="1"/>
    </CUnit>[/codes]

于是乎你想用CatalogFieldValueGet()取得单位XXX是不是飞行单位,所以你写了
TriggerDebugOutput(1, IntToText(CatalogFieldValueGetAsInt(c_gameCatalogUnit, "PointDefenseDrone", "Collide[Flying]", c_playerAny)), true);
结果得到 Trigger Error in 'gt_MeleeInitialization_Func': Catalog field 'Collide[Flying]' could not be read (Core: a required object could not be found)


为什么呢,因为Flying是xml里面定义的const,而触发器是看不懂的
那为什么之前<
InfoArray
index
=
"Build1"
>触发器能看懂呢,因为Build1是属于游戏自己定义好的枚举类型

也就是说要用CatalogFieldValueGet(),数组的index只能是游戏内置的枚举类型或者是数值
TriggerDebugOutput(1, IntToText(CatalogFieldValueGetAsInt(c_gameCatalogUnit, "PointDefenseDrone", "Collide[Air1]", c_playerAny)), true);
这样写才对

这个是Collide数组的对应表:

[0] = [Land1] = CUnit.Collide.index.Burrow
[1] = [Land2] = CUnit.Collide.index.Ground
[2] = [Land3] = CUnit.Collide.index.Larva
[3] = [Land4] = CUnit.Collide.index.Swarm
[4] = [Land5] = CUnit.Collide.index.Colossus
[5] = [Land6] = CUnit.Collide.index.Structure
[6] = [Land7] = CUnit.Collide.index.RoachBurrow
[7] = [Land8] = CUnit.Collide.index.TinyCritter
[8] = [Land9] = CUnit.Collide.index.ForceField
[9] = [Land10]
[10] = [Land11]
[11] = [Land12]
[12] = [Land13]
//<Collide index="Burrow3" value="1"/> 只在战役D8Charge/D8ClusterBomb单位出现过,不肯定是笔误还是刻意设定
[13] = [Land14]
[14] = [Land15]
[15] = [Land16]
[16] = [Air1] = CUnit.Collide.index.Flying
[17] = [Air2] = CUnit.Collide.index.FlyingImmobile
[18] = [Air3] = CUnit.Collide.index.FlyingEscorts
[19] = [Air4]
[20] = [Air5]
[21] = [Air6]
[22] = [Air7]
[23] = [Air8]
[24] = [Air9]
[25] = [Air10]
[26] = [Air11]
[27] = [Air12]
[28] = [Air13]
[29] = [Air14]
[30] = [Air15]
[31] = [Air16]

xml里面定义的const就是把Flying等同于内置的Air1,也就是触发器你可以用数值0-13或者Land1-16,Air1-16,但是不能用"Flying"


最後鸣谢头目的技术支持。。
发表于 2012-4-26 17:28:39 | 显示全部楼层
全文没有鸣谢头目,太不科学了
回复

使用道具 举报

 楼主| 发表于 2012-4-26 17:31:24 | 显示全部楼层

回 麦德三世 的帖子

麦德三世:全文没有鸣谢头目,太不科学了&#160;(2012-04-26 17:28)&#160;
忘记了。。
回复

使用道具 举报

发表于 2012-4-26 17:38:17 | 显示全部楼层
顺便一说,但凡和宏相关的内容。在CatalogFieldValueGet()看来宏都是透明的。

如果你在value里面用宏,CatalogFieldValueGet()取出来的值是最终值,而不是带宏的值。(这里要注意的是“宏”和"token"是两种东西,虽然效果类似但本质不同。)

有一点不要走入误区。即严格来说CatalogFieldValueGet()是“读取数据库”用的,而不是“读取XML文件”用的。SC2的XML文件是录入数据的方式,所以很多快捷的写法并不代表最终录入值。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-8-7 13:24 , Processed in 0.040600 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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