在不存在的链接号上调用llSetLinkPrimitiveParamsFast是否安全?

时间:2017-07-28 23:11:17

标签: linden-scripting-language

考虑使用不代表现有链接号的link参数调用llSetLinkPrimitiveParamsFast(),例如:

llSetLinkPrimitiveParamsFast(  -5, [PRIM_POSITION, <0.0, 0.0, 0.0>]);
llSetLinkPrimitiveParamsFast(1337, [PRIM_POSITION, <0.0, 0.0, 0.0>]);

在我的所有测试中,这似乎默默地失败而不会中断脚本或抛出任何错误。但是,文档没有说明在这种情况下的预期行为,我找不到任何其他来源的详细说明。

  • 可以安全地假设这会无声地失败并且不会破坏 脚本(将来)?
  • 我是否有任何文件 找不到了?

3 个答案:

答案 0 :(得分:1)

如您所见,与LINK_*标志不匹配的不存在的链接号将无声地失败。但是,这可能会在某一天发生变化,并且您不希望所有脚本突然向用户转储大量错误消息。

我的解决方案是使用0,然后在运行任何内容之前检查它是否为false(任何非零数字的计算结果为true)。在链接集中,没有prim是链接0(root从1开始)。如果llGetNumberOfPrims返回1,那么如果您正在寻找链接的prims,则您已经知道您有问题。但同样,您不希望将链接0添加到任何命令,因为它们会影响根。

您还可以使用DEBUG_CHANNEL作为最大整数进行评估,如果您确实需要在不进行评估的情况下运行链接集列表,那么几乎肯定不会将其作为链接号访问。避免使用负数来识别空链接。

答案 1 :(得分:0)

对于llSetLinkPrimitiveParams()Fast而言,我们只需要一个当前不是链接号的值。但是作为未来的证明很好,因此我们尝试选择一个永远不会成为链接号的链接。为了避免将来扩展链接集限制,我们可以选择最高的32位带符号整数2147483647(或0x7FFFFFFF),幸运的是,在LSL中甚至有一个常数:

llSetLinkPrimitiveParams( DEBUG-CHANNEL, [ ... ] );

但是,林登斯没有双重猜测。之所以提供该常量是因为聊天通道空间正在快速填充,并且没有人将其用于现有内容。最终它也可以用于链接号中的其他内容!因此,作为第二种反乌托邦的实验,我研究了使用0的原因,因为根本链接时根链接号更改为1。但是,当脚本原语可以取消链接时,此操作将失败。我们需要一个变量,该变量在链接时给出0,而在未链接时给出1

llSetLinkPrimitiveParams( prim_count==1, [ ... ] );

如果您仍然具有对链接进行计数的功能,则使用此方法可以正确评估两种方式,如果此后计数没有变化。在原色飞到零角之前,取消链接并不总是运行更改后的事件!因此,这里是DEBUG-CHANNEL的替代方法,无论链接集,附件或座位如何,它都可以获取当前的安全处置值:

llSetLinkPrimitiveParams( !( ( llGetObjectPrimCount( llGetKey() ) > 1 ) || ( llGetNumberOfPrims() > 1 ) ), [ ... ] );

当然,值得注意的是,如果您只打算在此处使用伪值,因为所有参数都将声明与PRIM-LINK-TARGET的链接,那么这一切都是没有原因的;无论如何,第一个链接号将被下一个链接声明丢弃。

答案 2 :(得分:-1)

首先,您为什么要使用不存在的链接号码来呼叫它?如果找不到链接,该函数将无声地失败,但是请查看LINK_THIS或类似的LINK_标志 - 它们都具有负值,分别为-1到-4。将来,如果Lindens添加另一个标志(不能看到他们为什么会这样做的原因),这可能是-5,它可能会破坏事情。如果他们决定在256的链接集中提高prim限制,则相同。我认为他们不会很快改变它,因为使用网格很难达到这样的数字而且它们在过去并没有真正改变它。