创造栏排序规则
本 mod 把 426 个方块 + 9 个物品全部放进同一个自定义创造栏
VTab,并实现了一套按方块类型加权、再按显示名字母序的排序规则。这是本 mod 唯一的「非方块非物品」逻辑。
基本信息
| 属性 | 值 | 来源 |
|---|---|---|
| Java 类 | net.junedev.viridium.ViriTab |
ViriTab.java |
| 创造栏 ID | Viridium.VTab = new ViriTab("VTab") |
Viridium.java |
| 显示名 | itemGroup.VTab=Viridium |
assets/viridium/lang/en_US.lang |
| 图标物品 | Item.getItemFromBlock(ViriBlocks.amaranthSapling) → viridium:amaranth_sapling(苋树树苗) |
getTabIconItem() |
| 注册时机 | 静态字段 VTab 在 Viridium 类加载时创建,preInit 中所有方块/物品 setCreativeTab(Viridium.VTab) |
— |
排序算法
displayAllReleventItems(源码拼写如此)先调 super.displayAllReleventItems(items) 收集全部物品,再用内部 ItemSorter 排序。
排序分三级(ItemSorter.compare):
第 1 级:方块 vs 非方块
| 情况 | 结果 |
|---|---|
item1 是 ItemBlock、item2 不是 |
item1 排前面(返回 -1) |
item2 是 ItemBlock、item1 不是 |
item2 排前面(返回 1) |
第 2 级:方块按类型权重(getTypeValue)
| 权重 | 方块类 | 种类 |
|---|---|---|
| 10 | BushBlock |
灌木 |
| 20 | BaseFullLog |
大树原木(含去皮/树冠/橡胶变体) |
| 30 | SmallLogBlock |
小树干 |
| 40 | BaseLeaves |
树叶(大小树共用) |
| 50 | BasePlanks |
木板与小树树皮 |
| 60 | BaseSaplingBlock |
树苗(大小树共用) |
| 70 | TallPlantBlock |
高大植物 |
| 0 | 其他(返回 0) | 9 个 SeedItem |
比较时权重大的排前面(if (typeValue1 > typeValue2) return -1;)。
⚠️ 树皮用的是 BasePlanks 类,因此小树树皮和木板权重完全相同(都是 50),两者最终按显示名字母序混排,无法分组。
第 3 级:字母序
同权重内用 o1.getDisplayName().compareToIgnoreCase(o2.getDisplayName()),即按语言文件里的显示名(不是注册名)做不区分大小写的字母排序。
排序结果示意
灌木(25)
↓
大树原木 / 去皮原木 / 树冠 / 橡胶变体(97)
↓
小树干(30)
↓
树叶(51 + 30)
↓
木板 + 小树树皮(48 + 30 + 30)
↓
树苗(49 + 30)
↓
高大植物(6)
↓
种子物品(9)
已知副作用
- 6 个方块没有语言文件条目:
beech_log/beech_stripped/beech_leaves/beech_planks/beech_sapling/coast_redwood_leaves_burnt(en_US.lang中beech零命中)。游戏内它们显示为全小写注册名,且排序用的getDisplayName()取到的就是这个注册名,所以这 5 个榉树方块在各自组内按beech_*字母序混在 T 开头的树种之间。 - 去皮原木的显示名统一是
Stripped X Wood,因此 46 个去皮原木在大树原木组内会聚成一整块,出现在该组字母序的 S 位置,而不是紧贴各自的原木。