搜索
查看: 163|回复: 11

[沟通中] 变量赋值BUG,太牛笔的BUG了

[复制链接]
发表于 2025-9-19 23:43:27 | 显示全部楼层 |阅读模式
BUG反馈
引擎版本号: 20250911
登陆器版本号: 20250911
BUG描述: 看详情吧,如果临时S变量内容以U、I等变量名开关,那么这个变量将永远不能再赋值。
BUG重现方式: 复制详情代码100%复现。
修复后应达到的效果: 能再赋值即可
联系QQ: 隐藏内容
MOV <$N(tmp1)> 100
MOV <$S(tmp2)> I<$N(tmp1)>
sendmsg 1 <$S(tmp2)>,,,

MOV <$N(tmp1)> 200
MOV <$S(tmp2)> <$N(tmp1)>
sendmsg 1 <$S(tmp2)>,,,

MOV <$N(tmp3)> 300
MOV <$S(tmp4)> 任意非变量字母<$N(tmp3)>
sendmsg 1 <$S(tmp4)>,,,

MOV <$N(tmp3)> 400
MOV <$S(tmp4)> <$N(tmp3)>
sendmsg 1 <$S(tmp4)>,,,

上面的输出居然是:
I100,,,
I100,,,
任意非变量字母300,,,
400,,,

而正常应该输出的是:
I100,,,
200,,,
任意非变量字母300,,,
400,,,

-----------------------------------------我是分割线-----------------------
这问题坑了我半个小时,,原来是BUG。如果S变量复制的内容是以变量名比如U、I这类开头,那么后面就不能再赋值了,值会永久固定!!!N和STR变量没有试,你们可以试试。比如<$S(tmp2)>如果内容为Sxxxx,那么这个<$S(tmp2)>将永远不能再赋值了。




补充内容 (2025-9-20 00:09):
简单一句话,<$S()>变量不能为U123,I11等类似内置变量的内容。这个也许不用修复,但是不知道的人会被坑,以后不用$S变量即可。
 楼主| 发表于 2025-9-19 23:58:16 | 显示全部楼层
MOV <$S(tmp2)> I33
上面这个正常,不过意思都不一样了不讨论,是复制变量I33里面的值了。
MOV <$S(tmp2)> I.33
上面也是正常的
MOV <$S(tmp2)> I1303
上面也是正常的
MOV <$N(tmp1)> 33
MOV <$S(tmp2)> I<$N(tmp1)>
上面就不正常了,tmp2的值就会永久固定成I33了。明显原因和变量的识别有关,只要S变量的字符串是以变量开头,且后面的数值是在该变量范围内,将永久固定。。。


 楼主| 发表于 2025-9-20 00:03:55 | 显示全部楼层
看看无聊 发表于 2025-9-19 23:58
MOV  I33
上面这个正常,不过意思都不一样了不讨论,是复制变量I33里面的值了。
MOV  I.33

已经测试,只有临时变量<$S()>会现这问题,而内置变量如Sxx这类的,就不会有这个问题。目前暂时我不用临时变量就能实现指定脚本了,不然很麻烦。
发表于 2025-9-20 00:10:34 | 显示全部楼层
这样行不行?
MOV <$S(tmp2)><$STR(I(<$N(tmp1)>))>



补充内容 (2025-9-20 00:35):
看错了,绕来绕去的,你这是说只有第二个纯临时N变量斌值到临时S变量上不正常,其它都正常是吧。
 楼主| 发表于 2025-9-20 00:18:46 | 显示全部楼层
自定义变量不要以P、G、M、I、D、N、S、A、U、J、T开头
手册里有这面这句话,正常人都会以为是变量名不能以上面开头,但是今天这BUG,你这意思是内容不能以上面的开头?这有点不科学吧。。。。而且测试内容也是可以以上面开关的,只是后面的数字不能在所属范围,也就是内容不能为内置变量名吧。
 楼主| 发表于 2025-9-20 00:28:20 | 显示全部楼层
深澜 发表于 2025-9-20 00:10
这样行不行?
MOV

即使行,那么意义变了。你这是让tmp2=Ixx的值,而我本来就要让tmp2=Ixx,而不是等于Ixx的值。如果有人行会变量叫U10,而我刚好把行会名赋值级了一个临时变量,那么这个临时变量将永远等于U10,安全隐患很大的。
 楼主| 发表于 2025-9-20 00:31:22 | 显示全部楼层
看看无聊 发表于 2025-9-20 00:28
即使行,那么意义变了。你这是让tmp2=Ixx的值,而我本来就要让tmp2=Ixx,而不是等于Ixx的值。如果有人行 ...

HGE引擎的临时变量也是个人全局的,也就是这个脚本用了<$S(tmp)> ,那么这个人别的脚本也能取到这个值。如果我有个临时变量赋值了别人的行会名,或者人名。别人的名字叫T10,那么这个临时变量将永远固定,隐患极大。所以能自定义的变量千万不要用临时文本变量。
 楼主| 发表于 2025-9-20 00:43:56 | 显示全部楼层
深澜 发表于 2025-9-20 00:10
这样行不行?
MOV

反正任意S临时变量,内容不能为U10,T99,N88这类的有变量含义的值。所以但凡有字符串是用户可以决定的,最好不要用临时变量,不然用户故意输出字符串U10,那么这个变量就永远不变了。相当于mysql的关键字注入了吧。
发表于 2025-9-20 01:07:54 | 显示全部楼层
看看无聊 发表于 2025-9-20 00:43
反正任意S临时变量,内容不能为U10,T99,N88这类的有变量含义的值。所以但凡有字符串是用户可以决定的,最 ...

txt脚本的转移效率太低了,现在都是尽可能用lua写,lua转换没问题。

补充内容 (2025-9-20 01:09):
而且都临时变量了,我干嘛还以UT这些打头的自字义啊,我都是直接中文命名。

补充内容 (2025-9-20 01:11):
或者拼音缩写,不会是单个字母加数字组合,没有你说的这种问题哦!/手动滑稽。
发表于 2025-9-20 12:41:08 | 显示全部楼层
这不就是变量命名的规范问题吗
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|HGEM2论坛

GMT+8, 2025-10-14 06:34 , Processed in 0.464038 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

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