Tabletop Simulator Lua Error: "attempt to perform arithmetic on a string value"
Tabletop Simulator Lua Error: "attempt to perform arithmetic on a string value"
首先,了解一些背景信息(除了我对编码相当陌生之外)...我正在开发一款棋盘游戏,对于该游戏的桌面模拟器版本,我已经创建了一系列 UI 菜单操作,只要玩家按下 table 中间的按钮就会弹出(玩家必须首先宣布他们将提交特定工作的出价,并且他们按下按钮会启动该工作的 RFP 投标过程)。玩家按下按钮后,UI 会发出提示,询问所有 other 玩家是否愿意参与竞标相关工作。
Bid intention menu
然后所有参与的投标人输入他们的有效投标——连同他们的市场声誉,这会影响他们在投标过程中获胜后从工作中收取的总费用——然后脚本找到最低的投标确定工作获胜者。
Bid adjustment/submission menu
此出价调整菜单的前两个字段是 editable,而第三个(费用)是只读的。费用数字根据输入到其他两个的任何值实时调整。手续费计算公式为effective bid + (reputation * 5) = fee
.
我遇到的问题是,每当玩家从前两个字段之一中删除一个值(例如,通过突出显示它并按退格键)时,游戏的聊天框中会弹出以下错误:
Error in Script (Custom Assetbundle - 64453f) function <adjustReputationBlue>:
chunk_3:(555,4-55): attempt to perform arithmetic on a string value
我假设错误是由删除数值后的 nil 值引起的,所以我尝试添加一些条件逻辑,在任何算术之前将前两个字段中的 nil 值重置为 0被执行。但是,这没有用,所以我有点难过。
这是相关的 Lua 代码(在按钮的 ttslua 文件中):
function adjustBidBlue(Player, value, id)
effective_bid_blue = value
feeAdjustBlue()
end
function adjustReputationBlue(Player, value, id)
reputation_blue = value
feeAdjustBlue()
end
function feeAdjustBlue()
if effective_bid_blue == nil then
effective_bid_blue = 0
end
if reputation_blue == nil then
reputation_blue = 0
end
fee_blue = effective_bid_blue + reputation_blue * 5
UI.setAttribute("fee_blue", "text", fee_blue)
end
这里是相关的 XML 代码(在全局 UI 文件中):
<InputField
id="effective_bid_blue"
active="false"
characterLimit="4"
characterValidation="Integer"
fontSize="26"
height="44"
offsetXY="-285 -150"
onValueChanged="64453f/adjustBidBlue"
shadow="rgba(0,0,0,0.5)"
shadowDistance="2 -2"
showAnimation="FadeIn"
animationDuration="0.25"
visibility="Blue"
width="85">
</InputField>
<InputField
id="reputation_blue"
active="false"
characterLimit="2"
characterValidation="Integer"
fontSize="26"
height="44"
offsetXY="-95 -150"
onValueChanged="64453f/adjustReputationBlue"
shadow="rgba(0,0,0,0.5)"
shadowDistance="2 -2"
showAnimation="FadeIn"
animationDuration="0.25"
visibility="Blue"
width="85">
</InputField>
<InputField
id="fee_blue"
active="false"
characterValidation="Integer"
fontSize="26"
height="44"
offsetXY="95 -150"
readOnly="true"
shadow="rgba(0,0,0,0.5)"
shadowDistance="2 -2"
showAnimation="FadeIn"
animationDuration="0.25"
width="85"
visibility="Blue">
</InputField>
如果您想查看完整代码,here it is on GitHub. And here it is in the Steam workshop。
非常感谢!
正如 Joseph 指出的那样,effective_bid_blue = value
和 reputation_blue = value
需要更改为 effective_bid_blue = tonumber(value)
和 reputation_blue = tonumber(value)
,因为 "value" 参数变量变为字符串只要不是输入的数字或 nil
.
首先,了解一些背景信息(除了我对编码相当陌生之外)...我正在开发一款棋盘游戏,对于该游戏的桌面模拟器版本,我已经创建了一系列 UI 菜单操作,只要玩家按下 table 中间的按钮就会弹出(玩家必须首先宣布他们将提交特定工作的出价,并且他们按下按钮会启动该工作的 RFP 投标过程)。玩家按下按钮后,UI 会发出提示,询问所有 other 玩家是否愿意参与竞标相关工作。
Bid intention menu
然后所有参与的投标人输入他们的有效投标——连同他们的市场声誉,这会影响他们在投标过程中获胜后从工作中收取的总费用——然后脚本找到最低的投标确定工作获胜者。
Bid adjustment/submission menu
此出价调整菜单的前两个字段是 editable,而第三个(费用)是只读的。费用数字根据输入到其他两个的任何值实时调整。手续费计算公式为effective bid + (reputation * 5) = fee
.
我遇到的问题是,每当玩家从前两个字段之一中删除一个值(例如,通过突出显示它并按退格键)时,游戏的聊天框中会弹出以下错误:
Error in Script (Custom Assetbundle - 64453f) function <adjustReputationBlue>:
chunk_3:(555,4-55): attempt to perform arithmetic on a string value
我假设错误是由删除数值后的 nil 值引起的,所以我尝试添加一些条件逻辑,在任何算术之前将前两个字段中的 nil 值重置为 0被执行。但是,这没有用,所以我有点难过。
这是相关的 Lua 代码(在按钮的 ttslua 文件中):
function adjustBidBlue(Player, value, id)
effective_bid_blue = value
feeAdjustBlue()
end
function adjustReputationBlue(Player, value, id)
reputation_blue = value
feeAdjustBlue()
end
function feeAdjustBlue()
if effective_bid_blue == nil then
effective_bid_blue = 0
end
if reputation_blue == nil then
reputation_blue = 0
end
fee_blue = effective_bid_blue + reputation_blue * 5
UI.setAttribute("fee_blue", "text", fee_blue)
end
这里是相关的 XML 代码(在全局 UI 文件中):
<InputField
id="effective_bid_blue"
active="false"
characterLimit="4"
characterValidation="Integer"
fontSize="26"
height="44"
offsetXY="-285 -150"
onValueChanged="64453f/adjustBidBlue"
shadow="rgba(0,0,0,0.5)"
shadowDistance="2 -2"
showAnimation="FadeIn"
animationDuration="0.25"
visibility="Blue"
width="85">
</InputField>
<InputField
id="reputation_blue"
active="false"
characterLimit="2"
characterValidation="Integer"
fontSize="26"
height="44"
offsetXY="-95 -150"
onValueChanged="64453f/adjustReputationBlue"
shadow="rgba(0,0,0,0.5)"
shadowDistance="2 -2"
showAnimation="FadeIn"
animationDuration="0.25"
visibility="Blue"
width="85">
</InputField>
<InputField
id="fee_blue"
active="false"
characterValidation="Integer"
fontSize="26"
height="44"
offsetXY="95 -150"
readOnly="true"
shadow="rgba(0,0,0,0.5)"
shadowDistance="2 -2"
showAnimation="FadeIn"
animationDuration="0.25"
width="85"
visibility="Blue">
</InputField>
如果您想查看完整代码,here it is on GitHub. And here it is in the Steam workshop。
非常感谢!
正如 Joseph 指出的那样,effective_bid_blue = value
和 reputation_blue = value
需要更改为 effective_bid_blue = tonumber(value)
和 reputation_blue = tonumber(value)
,因为 "value" 参数变量变为字符串只要不是输入的数字或 nil
.