创造栏排序规则

本 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 位置,而不是紧贴各自的原木。

相关条目