1

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

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

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

  • 假设这会静默失败并且不会破坏脚本(将来)是否安全?
  • 有没有我找不到的文件?
4

3 回答 3

1

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

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

但林登斯没有双重猜测。之所以给定这个常数,是因为聊天频道空间正在快速填满,而没有人将其用于现有内容。它最终也可以用于链接编号中的其他内容!因此,作为第二个反乌托邦的实验,我研究了使用0,因为根链接号完全更改为1链接时。然而,当脚本化的 prim 可能被取消链接时,这将失败。0我们需要一个在链接时给出但未链接时给出的变量1

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

如果您有计算链接的功能,那么使用此功能将正确评估两种方式,如果计数自. 在 prim 飞到零角之前,取消链接不会总是运行更改的事件!DEBUG-CHANNEL因此,无论链接集、附件或座位如何,这里都有一个替代方案,可以获取当前的安全处置值:

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

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

于 2019-05-13T23:39:02.537 回答
1

LINK_*如您所见,与标志不匹配的不存在链接号将静默失败。但是,这可能有一天会改变,并且您不希望所有脚本突然将一堆错误消息转储给您的用户。

我的解决方案是使用 0,然后在使用它运行任何东西之前检查它是否评估为 false(任何非零数字评估为 true)。在链接集中,没有 prim 是链接 0(根从 1 开始)。如果llGetNumberOfPrims返回 1,则您已经知道在寻找链接的 prim 时遇到了问题。但同样,无论如何,您都不想将链接 0 添加到任何命令,因为它们会影响根目录。

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

于 2017-10-01T04:11:11.257 回答
-1

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

于 2017-07-30T08:35:36.907 回答