<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://mdtwiki.top/index.php?action=history&amp;feed=atom&amp;title=JSON%E6%A8%A1%E7%BB%84%E6%95%99%E7%A8%8B-%E5%A6%82%E4%BD%95%E6%89%BE%E5%88%B0%E8%87%AA%E5%B7%B1%E9%9C%80%E8%A6%81%E7%9A%84%E7%B1%BB%E5%92%8C%E5%AD%97%E6%AE%B5</id>
	<title>JSON模组教程-如何找到自己需要的类和字段 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://mdtwiki.top/index.php?action=history&amp;feed=atom&amp;title=JSON%E6%A8%A1%E7%BB%84%E6%95%99%E7%A8%8B-%E5%A6%82%E4%BD%95%E6%89%BE%E5%88%B0%E8%87%AA%E5%B7%B1%E9%9C%80%E8%A6%81%E7%9A%84%E7%B1%BB%E5%92%8C%E5%AD%97%E6%AE%B5"/>
	<link rel="alternate" type="text/html" href="https://mdtwiki.top/index.php?title=JSON%E6%A8%A1%E7%BB%84%E6%95%99%E7%A8%8B-%E5%A6%82%E4%BD%95%E6%89%BE%E5%88%B0%E8%87%AA%E5%B7%B1%E9%9C%80%E8%A6%81%E7%9A%84%E7%B1%BB%E5%92%8C%E5%AD%97%E6%AE%B5&amp;action=history"/>
	<updated>2026-05-16T03:11:16Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://mdtwiki.top/index.php?title=JSON%E6%A8%A1%E7%BB%84%E6%95%99%E7%A8%8B-%E5%A6%82%E4%BD%95%E6%89%BE%E5%88%B0%E8%87%AA%E5%B7%B1%E9%9C%80%E8%A6%81%E7%9A%84%E7%B1%BB%E5%92%8C%E5%AD%97%E6%AE%B5&amp;diff=2588&amp;oldid=prev</id>
		<title>硫缺铅：​创建页面，内容为“= 如何找到自己需要的类和字段 =  写 JSON 模组的尽头就是“查源码”。这是因为 JSON 的字段并不是凭空存在的，它们都来自 Java 类中的字段定义。只要你能准确找到“原版是怎么写的”，就能知道某个字段是否存在、应该怎么写、具体起到什么作用。更重要的是，源码能帮你避免“教程过时”的坑：很多老教程基于旧版本，字段早已改名或被废弃，只…”</title>
		<link rel="alternate" type="text/html" href="https://mdtwiki.top/index.php?title=JSON%E6%A8%A1%E7%BB%84%E6%95%99%E7%A8%8B-%E5%A6%82%E4%BD%95%E6%89%BE%E5%88%B0%E8%87%AA%E5%B7%B1%E9%9C%80%E8%A6%81%E7%9A%84%E7%B1%BB%E5%92%8C%E5%AD%97%E6%AE%B5&amp;diff=2588&amp;oldid=prev"/>
		<updated>2026-02-01T13:34:44Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“= 如何找到自己需要的类和字段 =  写 JSON 模组的尽头就是“查源码”。这是因为 JSON 的字段并不是凭空存在的，它们都来自 Java 类中的字段定义。只要你能准确找到“原版是怎么写的”，就能知道某个字段是否存在、应该怎么写、具体起到什么作用。更重要的是，源码能帮你避免“教程过时”的坑：很多老教程基于旧版本，字段早已改名或被废弃，只…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= 如何找到自己需要的类和字段 =&lt;br /&gt;
&lt;br /&gt;
写 JSON 模组的尽头就是“查源码”。这是因为 JSON 的字段并不是凭空存在的，它们都来自 Java 类中的字段定义。只要你能准确找到“原版是怎么写的”，就能知道某个字段是否存在、应该怎么写、具体起到什么作用。更重要的是，源码能帮你避免“教程过时”的坑：很多老教程基于旧版本，字段早已改名或被废弃，只有源码才是当前版本的最终答案。&lt;br /&gt;
&lt;br /&gt;
== 从显示名反推内部名 ==&lt;br /&gt;
&lt;br /&gt;
第一步永远是找到内部名。原版的显示名在 &amp;lt;code&amp;gt;core/assets/bundles/bundle_zh_CN.properties&amp;lt;/code&amp;gt; 里，例如“幻型”对应 &amp;lt;code&amp;gt;unit.poly&amp;lt;/code&amp;gt;，“机械钻头”对应 &amp;lt;code&amp;gt;block.mechanical-drill&amp;lt;/code&amp;gt;，“石墨压缩机”对应 &amp;lt;code&amp;gt;block.graphite-press&amp;lt;/code&amp;gt;。内部名就是 JSON 文件名，或者 Java 里 &amp;lt;code&amp;gt;new Xxx(&amp;amp;quot;name&amp;amp;quot;)&amp;lt;/code&amp;gt; 的 &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;。拿到内部名，你就能精准搜索源码。&lt;br /&gt;
&lt;br /&gt;
更实际的做法是“先搜中文名，再看键名”。例如你知道“机械钻头”，就直接在 &amp;lt;code&amp;gt;bundle_zh_CN.properties&amp;lt;/code&amp;gt; 里搜索它，会得到 &amp;lt;code&amp;gt;block.mechanical-drill.name = 机械钻头&amp;lt;/code&amp;gt;。这个键名里的 &amp;lt;code&amp;gt;block.mechanical-drill&amp;lt;/code&amp;gt; 就是你要找的内部名。如果你看到多个匹配项，就看前缀：&amp;lt;code&amp;gt;block.&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;unit.&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;item.&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;liquid.&amp;lt;/code&amp;gt; 会告诉你内容类型。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;rg -n &amp;quot;机械钻头&amp;quot; core/assets/bundles/bundle_zh_CN.properties&amp;lt;/pre&amp;gt;&lt;br /&gt;
如果你要核对英文名或其他语言包，同目录下还有 &amp;lt;code&amp;gt;bundle.properties&amp;lt;/code&amp;gt; 与其他语言文件。模组也可以提供自己的 &amp;lt;code&amp;gt;bundle_zh_CN.properties&amp;lt;/code&amp;gt; 来添加翻译。记住：翻译文件只影响“显示名”，真正的内部名还是由内容文件或 Java 里 &amp;lt;code&amp;gt;new Xxx(&amp;amp;quot;name&amp;amp;quot;)&amp;lt;/code&amp;gt; 决定。&lt;br /&gt;
&lt;br /&gt;
如果你不知道该内容属于哪一类，先看内部名前缀：&amp;lt;code&amp;gt;unit.*&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;block.*&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;item.*&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;liquid.*&amp;lt;/code&amp;gt;。然后去对应的内容定义文件查它的“原版配置”。原版内容大多在 &amp;lt;code&amp;gt;core/src/mindustry/content/&amp;lt;/code&amp;gt; 目录下，比如 &amp;lt;code&amp;gt;Blocks.java&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;UnitTypes.java&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;Items.java&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;Liquids.java&amp;lt;/code&amp;gt;。这些文件的作用是“把内容从类变成具体实例”，所以它们是学习字段组合的最好入口。&lt;br /&gt;
&lt;br /&gt;
如果连中文名都找不到，直接看内容文件名也是办法。JSON 文件名通常就是内部名，例如 &amp;lt;code&amp;gt;content/blocks/xxx.json&amp;lt;/code&amp;gt; 的 &amp;lt;code&amp;gt;xxx&amp;lt;/code&amp;gt; 就是内部名。对模组而言，&amp;lt;code&amp;gt;content/&amp;lt;/code&amp;gt; 目录比语言包更直观，因为它不受翻译影响。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;先看原版配置再看类定义&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 先看原版配置，再看类定义 ==&lt;br /&gt;
&lt;br /&gt;
拿到内部名后，先在 &amp;lt;code&amp;gt;core/src/mindustry/content/&amp;lt;/code&amp;gt; 里搜索它是怎么被配置的。这样你能看到最典型的字段组合。例如你搜索 &amp;lt;code&amp;gt;graphite-press&amp;lt;/code&amp;gt;，就能看到“石墨压缩机”是 &amp;lt;code&amp;gt;GenericCrafter&amp;lt;/code&amp;gt;，并且它设置了 &amp;lt;code&amp;gt;craftTime&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;outputItem&amp;lt;/code&amp;gt; 与消耗项。原版配置告诉你“最常见的写法是什么”。&lt;br /&gt;
&lt;br /&gt;
再比如你搜索 &amp;lt;code&amp;gt;mechanical-drill&amp;lt;/code&amp;gt;，会看到它是 &amp;lt;code&amp;gt;Drill&amp;lt;/code&amp;gt; 类型，并且只改了 &amp;lt;code&amp;gt;tier&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;drillTime&amp;lt;/code&amp;gt; 等少量字段。这种“只改关键字段”的写法其实最值得学习，因为它能让你理解“哪些字段是必须写的，哪些可以沿用默认值”。如果你一开始就把所有字段都写满，反而很难判断哪些值真正生效。&lt;br /&gt;
&lt;br /&gt;
涉及研究树时，可以顺便看看 &amp;lt;code&amp;gt;core/src/mindustry/content/TechTree.java&amp;lt;/code&amp;gt; 和 &amp;lt;code&amp;gt;Objectives&amp;lt;/code&amp;gt; 相关类。很多 &amp;lt;code&amp;gt;research&amp;lt;/code&amp;gt; 的 &amp;lt;code&amp;gt;objectives&amp;lt;/code&amp;gt; 类型都在这里定义，理解它们能让你更准确地写解锁条件，避免“研究树显示了但无法解锁”的问题。&lt;br /&gt;
&lt;br /&gt;
接下来再去类定义文件中查看字段与逻辑。方块类通常在 &amp;lt;code&amp;gt;core/src/mindustry/world/blocks/&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;，单位与物品类在 &amp;lt;code&amp;gt;core/src/mindustry/type/&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;。阅读类定义可以回答两个关键问题：这个字段是什么类型？这个字段在什么时候被使用？你会发现很多字段只影响 UI 或统计面板，而真正影响逻辑的字段往往集中在 &amp;lt;code&amp;gt;updateTile()&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;init()&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
别忽略内部类。很多方块会有 &amp;lt;code&amp;gt;Build&amp;lt;/code&amp;gt; 子类（比如 &amp;lt;code&amp;gt;DrillBuild&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;GenericCrafterBuild&amp;lt;/code&amp;gt;），里面保存的是“运行时状态”，例如当前进度、缓冲物品、液体等。这些字段不应该写在 JSON 里，但它们决定了“字段为什么这样生效”。当你理解了 &amp;lt;code&amp;gt;Build&amp;lt;/code&amp;gt; 的逻辑，就能更准确判断哪些字段是真正影响产量或行为的。&lt;br /&gt;
&lt;br /&gt;
当你需要理解“运行时逻辑”时，重点看 &amp;lt;code&amp;gt;load()&amp;lt;/code&amp;gt;（贴图命名规则）、&amp;lt;code&amp;gt;setStats()&amp;lt;/code&amp;gt;（数据库面板如何显示）、&amp;lt;code&amp;gt;updateTile()&amp;lt;/code&amp;gt;（方块每帧逻辑）、&amp;lt;code&amp;gt;init()&amp;lt;/code&amp;gt;（初始化与额外配置）以及 &amp;lt;code&amp;gt;consumes&amp;lt;/code&amp;gt; 相关方法（输入的解析与生效条件）。这些位置往往直接揭示“字段如何生效”。&lt;br /&gt;
&lt;br /&gt;
如果你关心 UI 表现，别忽略 &amp;lt;code&amp;gt;setBars()&amp;lt;/code&amp;gt;：很多“效率条”“液体条”就是在这里配置的。你还会看到一些字段只用于 &amp;lt;code&amp;gt;setStats()&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;setBars()&amp;lt;/code&amp;gt;，它们不会改变逻辑，但会改变玩家对方块强度的判断。理解这一点很重要，因为你可以通过调整展示字段来引导玩家，而不用改动真正的数值机制。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;用-contentparser-验证-json-支持&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 用 ContentParser 验证 JSON 支持 ==&lt;br /&gt;
&lt;br /&gt;
即使类里有字段，也不代表 JSON 一定能写。&amp;lt;code&amp;gt;ContentParser&amp;lt;/code&amp;gt; 是 JSON 解析器，它决定了哪些写法是合法的。比如 &amp;lt;code&amp;gt;consumes&amp;lt;/code&amp;gt; 并不是普通字段，而是被 &amp;lt;code&amp;gt;ContentParser&amp;lt;/code&amp;gt; 专门解析的“消耗器语法”；&amp;lt;code&amp;gt;Effect&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;BulletType&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;DrawPart&amp;lt;/code&amp;gt; 等复杂对象也有专门的解析逻辑。如果你看到字段在类里存在，但写在 JSON 里没效果，就要怀疑解析器是否支持。&lt;br /&gt;
&lt;br /&gt;
当你怀疑“字段写了但没生效”，优先查 &amp;lt;code&amp;gt;core/src/mindustry/mod/ContentParser.java&amp;lt;/code&amp;gt;：看看它是否读取了该字段，是否对类型做了特殊处理。很多“JSON 写法不对”的问题，都能在这里找到答案。例如 &amp;lt;code&amp;gt;BulletType&amp;lt;/code&amp;gt; 支持字符串（引用原版子弹）、数组（组合为 &amp;lt;code&amp;gt;MultiBulletType&amp;lt;/code&amp;gt;）、对象（通过 &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; 指定子类），这些差异都写在解析器里。&lt;br /&gt;
&lt;br /&gt;
同样的逻辑也适用于 &amp;lt;code&amp;gt;drawer&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;parts&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;research&amp;lt;/code&amp;gt; 等复杂对象。如果解析器没有对应的分支，你在 JSON 里写再多也不会生效。最典型的例子是 &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;：当你省略 &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; 时，解析器会使用默认类；当你写了 &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;，它才会去实例化对应子类。这一点在 &amp;lt;code&amp;gt;Effect&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;DrawPart&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;ShootPattern&amp;lt;/code&amp;gt; 等对象上尤其明显。&lt;br /&gt;
&lt;br /&gt;
还要注意“字段类型是否可序列化”。像 &amp;lt;code&amp;gt;Boolf&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;Func&amp;lt;/code&amp;gt; 这种函数类型，或 &amp;lt;code&amp;gt;UnitSorts.closest&amp;lt;/code&amp;gt; 这样的静态方法，JSON 是写不进去的，除非解析器提供了特殊语法。你在类里看到这些字段时，要先判断“它是不是一个普通值”；如果不是，就需要 JS/Java 来接管。&lt;br /&gt;
&lt;br /&gt;
解析器通常只会写入 &amp;lt;code&amp;gt;public&amp;lt;/code&amp;gt; 字段，&amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;protected&amp;lt;/code&amp;gt; 或标注为运行时状态的字段不会被 JSON 读取。即使字段是 &amp;lt;code&amp;gt;public&amp;lt;/code&amp;gt;，如果它被 &amp;lt;code&amp;gt;transient&amp;lt;/code&amp;gt; 或特殊逻辑覆盖，也可能“写了看不到效果”。这就是为什么“看类定义 + 看解析器”这两步缺一不可。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;理解字段类型才能写对-json&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 理解字段类型，才能写对 JSON ==&lt;br /&gt;
&lt;br /&gt;
字段的类型决定写法。&amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;float&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;boolean&amp;lt;/code&amp;gt; 这类基础类型很好理解，直接写数字或 true/false 即可。复杂类型则需要特别注意：&amp;lt;code&amp;gt;ItemStack&amp;lt;/code&amp;gt; 可以写成 &amp;lt;code&amp;gt;&amp;amp;quot;copper/10&amp;amp;quot;&amp;lt;/code&amp;gt;，也可以写成 &amp;lt;code&amp;gt;{ &amp;amp;quot;item&amp;amp;quot;: &amp;amp;quot;copper&amp;amp;quot;, &amp;amp;quot;amount&amp;amp;quot;: 10 }&amp;lt;/code&amp;gt;；&amp;lt;code&amp;gt;LiquidStack&amp;lt;/code&amp;gt; 也支持 &amp;lt;code&amp;gt;&amp;amp;quot;water/0.1&amp;amp;quot;&amp;lt;/code&amp;gt; 的简写。&amp;lt;code&amp;gt;Seq&amp;lt;/code&amp;gt; 或数组通常写成 JSON 数组。&amp;lt;code&amp;gt;Effect&amp;lt;/code&amp;gt; 可以用字符串或对象，&amp;lt;code&amp;gt;BulletType&amp;lt;/code&amp;gt; 可以用字符串或对象。&lt;br /&gt;
&lt;br /&gt;
枚举也是常见类型，例如 &amp;lt;code&amp;gt;category&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;env&amp;lt;/code&amp;gt; 或一些开关状态。枚举字段通常用字符串写（大小写要和源码一致），如果字段是“多个标志组合”，解析器可能支持数组或位运算。遇到这类字段时，最稳妥的方式还是去 &amp;lt;code&amp;gt;ContentParser&amp;lt;/code&amp;gt; 看具体支持哪种写法。&lt;br /&gt;
&lt;br /&gt;
内容引用字段（&amp;lt;code&amp;gt;Item&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;Liquid&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;Block&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;UnitType&amp;lt;/code&amp;gt; 等）一定要写内部名，而不是显示名。你在 JSON 里写“铜”并不会被自动识别成 &amp;lt;code&amp;gt;copper&amp;lt;/code&amp;gt;，必须使用内部名 &amp;lt;code&amp;gt;copper&amp;lt;/code&amp;gt;。如果你忘了内部名，就回到 &amp;lt;code&amp;gt;bundle_zh_CN.properties&amp;lt;/code&amp;gt; 查键名，这是最稳妥的来源。&lt;br /&gt;
&lt;br /&gt;
内部名的拼写也要注意，原版大量使用连字符（例如 &amp;lt;code&amp;gt;mechanical-drill&amp;lt;/code&amp;gt;），模组也常用统一前缀。最稳妥的做法是用 &amp;lt;code&amp;gt;rg --files&amp;lt;/code&amp;gt; 列出 &amp;lt;code&amp;gt;content/&amp;lt;/code&amp;gt; 目录的文件名，再复制粘贴进 JSON，避免拼写错误导致解析失败。&lt;br /&gt;
&lt;br /&gt;
如果你看到字段类型是 &amp;lt;code&amp;gt;Seq&amp;amp;lt;ItemStack&amp;amp;gt;&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;ItemStack[]&amp;lt;/code&amp;gt;，就应该优先考虑数组写法；如果字段类型是 &amp;lt;code&amp;gt;ObjectMap&amp;lt;/code&amp;gt;，通常会在 JSON 里写成“键值映射”。这些规律可以在解析器里得到验证。&lt;br /&gt;
&lt;br /&gt;
除了看原版，还可以从成熟模组里“反推写法”。例如“饱和火力 3.3.0”的“离子钻头”同时使用 &amp;lt;code&amp;gt;consumes.power&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;consumes.liquid&amp;lt;/code&amp;gt;，并把液体消耗写成对象形式来支持 &amp;lt;code&amp;gt;optional&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;booster&amp;lt;/code&amp;gt;。这种配置方式在 &amp;lt;code&amp;gt;ContentParser&amp;lt;/code&amp;gt; 里是明确支持的，因此你完全可以把它当成“真实可用的模板”，再根据自己的平衡做改动。&lt;br /&gt;
&lt;br /&gt;
== 常用检索方式 ==&lt;br /&gt;
&lt;br /&gt;
如果你习惯命令行，可以直接用 &amp;lt;code&amp;gt;rg&amp;lt;/code&amp;gt; 搜索内部名或字段。例如：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;rg &amp;quot;graphite-press&amp;quot; core/src/mindustry/content -n&lt;br /&gt;
rg &amp;quot;class GenericCrafter&amp;quot; core/src/mindustry/world/blocks -n&amp;lt;/pre&amp;gt;&lt;br /&gt;
第一条会定位原版内容配置，第二条会定位类定义。这样一来，你就能把“字段长什么样”与“字段怎么运行”串起来看。很多复杂字段其实只是“从原版抄一个，再改数值”的问题。&lt;br /&gt;
&lt;br /&gt;
查字段时别只盯着当前类。很多基础字段其实来自父类，比如 &amp;lt;code&amp;gt;Block&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;PowerBlock&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;LiquidBlock&amp;lt;/code&amp;gt;，或者 &amp;lt;code&amp;gt;UnitType&amp;lt;/code&amp;gt; 的上层接口。你在子类里找不到字段时，可以沿着 &amp;lt;code&amp;gt;extends&amp;lt;/code&amp;gt; 往上找，或者直接搜索字段名（如 &amp;lt;code&amp;gt;rg -n &amp;amp;quot;drillTime&amp;amp;quot; core/src/mindustry/world&amp;lt;/code&amp;gt;）。这一步很关键，因为 JSON 能写的字段往往分散在继承链上。&lt;br /&gt;
&lt;br /&gt;
同样地，&amp;lt;code&amp;gt;*Build&amp;lt;/code&amp;gt; 内部类也很重要。方块的“运行时逻辑”很多写在 &amp;lt;code&amp;gt;updateTile()&amp;lt;/code&amp;gt; 的 &amp;lt;code&amp;gt;Build&amp;lt;/code&amp;gt; 版本里，字段有时只在 &amp;lt;code&amp;gt;Build&amp;lt;/code&amp;gt; 中使用。理解这一点后，你会更容易区分“配置字段”和“运行时状态”。&lt;br /&gt;
&lt;br /&gt;
如果你想追踪某个字段是如何显示在数据库面板上的，可以用 &amp;lt;code&amp;gt;rg -n &amp;amp;quot;setStats&amp;amp;quot; core/src/mindustry/world/blocks&amp;lt;/code&amp;gt; 查找统计展示，再配合 &amp;lt;code&amp;gt;Stat.*&amp;lt;/code&amp;gt; 字段定位具体显示名。对 UI 相关问题（比如某个数值显示不对）来说，这一步比盲目试数值更有效。&lt;br /&gt;
&lt;br /&gt;
另外，很多“是否生效”取决于开关字段，比如 &amp;lt;code&amp;gt;hasPower&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;hasLiquids&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;hasItems&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;sync&amp;lt;/code&amp;gt; 等。这些字段往往在 &amp;lt;code&amp;gt;init()&amp;lt;/code&amp;gt; 里被检查，如果没开启，对应系统就不会工作。遇到“字段写了但不动”的情况，先确认这些开关是否被设置。&lt;br /&gt;
&lt;br /&gt;
如果你想了解“原版成本与产量的常见比例”，可以在 &amp;lt;code&amp;gt;Blocks.java&amp;lt;/code&amp;gt; 里搜索 &amp;lt;code&amp;gt;requirements&amp;lt;/code&amp;gt; 和 &amp;lt;code&amp;gt;outputItem&amp;lt;/code&amp;gt; 的组合。这样做比凭感觉调整更稳，尤其是当你想让模组与原版难度保持一致时。&lt;br /&gt;
&lt;br /&gt;
很多老问题其实是“字段记不住”。建议你在熟悉后做一份自己的速查表，把常用字段的用途和默认值记下来。这样比反复翻源码更高效，也能避免“同一个坑踩很多次”。&lt;br /&gt;
&lt;br /&gt;
最后提醒一点：数据库面板显示的数值不一定就是运行时的真实值。很多数值是 &amp;lt;code&amp;gt;setStats()&amp;lt;/code&amp;gt; 按“理论值”计算出来的，而运行时会受到效率、输入与环境影响。查源码时把 &amp;lt;code&amp;gt;setStats()&amp;lt;/code&amp;gt; 与 &amp;lt;code&amp;gt;updateTile()&amp;lt;/code&amp;gt; 对照起来看，才能判断“显示值”和“实际值”的差距。&lt;br /&gt;
&lt;br /&gt;
== 内部名与冲突 ==&lt;br /&gt;
&lt;br /&gt;
JSON 引用内容时，会先尝试 &amp;lt;code&amp;gt;modName-内部名&amp;lt;/code&amp;gt;，找不到才去找原版内部名。因此，若你的内部名与原版冲突，会出现覆盖或解析失败。最安全的做法是给自定义内容起一个“有前缀”的内部名，或者在 &amp;lt;code&amp;gt;mod.json&amp;lt;/code&amp;gt; 中使用独特的 &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;，避免与其他模组冲突。&lt;br /&gt;
&lt;br /&gt;
这里的 &amp;lt;code&amp;gt;modName&amp;lt;/code&amp;gt; 指的是 &amp;lt;code&amp;gt;mod.json&amp;lt;/code&amp;gt; 里的 &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; 字段，而不是 &amp;lt;code&amp;gt;displayName&amp;lt;/code&amp;gt;。这意味着两个模组即使显示名不同，只要 &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; 相同，就会产生前缀冲突。引用其他模组内容时，也要使用对方的 &amp;lt;code&amp;gt;modName-内部名&amp;lt;/code&amp;gt;，否则解析器会优先解析为当前模组或原版内容。&lt;br /&gt;
&lt;br /&gt;
如果你要覆盖原版内容，文件名必须与原版内部名一致，并且清楚自己会影响哪些玩法。覆盖往往是“全局生效”的，一旦修改了产量或伤害，所有地图都会受到影响。除非你真的想重写原版，否则更推荐用新内部名创建“并存内容”。&lt;br /&gt;
&lt;br /&gt;
== 小结 ==&lt;br /&gt;
&lt;br /&gt;
找到字段的流程很简单：先找内部名，再看原版配置，然后看类定义，最后用 &amp;lt;code&amp;gt;ContentParser&amp;lt;/code&amp;gt; 验证 JSON 写法。熟练之后，你会发现“查源码”其实比找模板更快，也更稳。把源码、解析器与模组配置对照起来，几乎所有字段问题都能被定位。每次查一次，就会积累一套自己的检索习惯，最后形成稳定的排查流程，效率也会越来越高，实践越多越熟，也更稳妥、更安心。&lt;/div&gt;</summary>
		<author><name>硫缺铅</name></author>
	</entry>
</feed>