You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

为何我的Minecraft物品配方插件出现Symbol does not appear in the shape:87错误?

排查Spigot插件配方报错:Symbol does not appear in the shape:87

这个错误我在写1.12版本Spigot插件时踩过同款坑,核心原因一眼就能锁定,咱们一步步拆解:

错误原因解析

从报错栈的核心提示就能看明白:

java.lang.IllegalArgumentException: Symbol does not appear in the shape:87

这句话的意思是:你尝试给一个叫87的符号绑定物品材料,但在你定义的**配方形状(shape)**里,根本没有出现过这个87符号。

举个错误代码的例子,一看就懂:

// 错误示范:形状里只有A、B,但给未出现的符号绑定了材料
ShapedRecipe testRecipe = new ShapedRecipe(new ItemStack(Material.DIAMOND_SWORD));
// 配方形状的3行字符串里,只有A和B两个符号
testRecipe.shape("ABA", "ABA", " B ");
// 这里错误地给87相关的符号设置材料,但形状里根本没这个符号
testRecipe.setIngredient('8', Material.IRON_INGOT);
testRecipe.setIngredient('A', Material.GOLD_INGOT);
testRecipe.setIngredient('B', Material.STICK);

另外要注意:Spigot的ShapedRecipe符号只能是单个字符(char类型),如果你不小心误传了多字符的符号(比如把字符串当成char用),也会触发类似错误。

修复步骤

  • 打开报错指向的CustomRecpie.java第18行,找到对应的setIngredient()调用,确认你用的符号具体是什么(这里是87相关的字符)
  • 往上查找这个配方的shape()方法定义,检查这个符号有没有出现在配方的形状字符串里
  • 修正匹配问题:
    • 如果是手滑打错了符号:把setIngredient里的符号改成形状里已经存在的字符(比如把8改成AB
    • 如果确实需要用这个符号:把形状字符串里加入对应的单个字符(比如把形状里某位置改成8

给个正确的代码示例参考:

// 正确示范:符号和形状完全匹配
ShapedRecipe testRecipe = new ShapedRecipe(new ItemStack(Material.DIAMOND_SWORD));
// 形状里加入了8这个符号
testRecipe.shape("888", "ABA", "888");
// 现在给8绑定材料就不会报错了
testRecipe.setIngredient('8', Material.IRON_INGOT);
testRecipe.setIngredient('A', Material.GOLD_INGOT);
testRecipe.setIngredient('B', Material.STICK);

额外排查点

  • 检查是否有拼写错误:比如形状里写的是7,但setIngredient里用的是8
  • 确认配方形状的每行字符串长度一致:如果形状行长度不一样,也可能间接导致符号匹配异常

内容的提问来源于stack exchange,提问作者Offlical

火山引擎 最新活动