Skip to content

Commit ba87de8

Browse files
committed
Rewrite item groups in Java
1 parent 7b954d0 commit ba87de8

File tree

13 files changed

+317
-296
lines changed

13 files changed

+317
-296
lines changed

common/src/main/java/juuxel/adorn/fluid/FluidReference.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ public Text getAmountText(long max, FluidUnit maxUnit) {
9595
}
9696

9797
private static FluidUnit getDefaultDisplayUnit() {
98-
return ConfigManager.Companion.config().client.displayedFluidUnit;
98+
return ConfigManager.config().client.displayedFluidUnit;
9999
}
100100

101101
private static long getUnitDenominator(FluidUnit from, FluidUnit to) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,256 @@
1+
package juuxel.adorn.item.group;
2+
3+
import juuxel.adorn.AdornCommon;
4+
import juuxel.adorn.block.AdornBlocks;
5+
import juuxel.adorn.block.variant.BlockKind;
6+
import juuxel.adorn.block.variant.BlockVariant;
7+
import juuxel.adorn.block.variant.BlockVariantSets;
8+
import juuxel.adorn.config.ConfigManager;
9+
import juuxel.adorn.item.AdornItems;
10+
import juuxel.adorn.lib.registry.Registered;
11+
import juuxel.adorn.lib.registry.Registrar;
12+
import juuxel.adorn.lib.registry.RegistrarFactory;
13+
import juuxel.adorn.platform.ItemGroupBridge;
14+
import net.minecraft.block.Block;
15+
import net.minecraft.item.ItemConvertible;
16+
import net.minecraft.item.ItemGroup;
17+
import net.minecraft.item.ItemGroups;
18+
import net.minecraft.item.ItemStack;
19+
import net.minecraft.item.Items;
20+
import net.minecraft.registry.Registries;
21+
import net.minecraft.registry.RegistryKeys;
22+
import net.minecraft.text.Text;
23+
import net.minecraft.util.DyeColor;
24+
import net.minecraft.util.Util;
25+
import org.jetbrains.annotations.Nullable;
26+
27+
import java.util.ArrayList;
28+
import java.util.Arrays;
29+
import java.util.List;
30+
import java.util.Optional;
31+
32+
public final class AdornItemGroups {
33+
public static final Registrar<ItemGroup> ITEM_GROUPS = RegistrarFactory.get().create(RegistryKeys.ITEM_GROUP);
34+
35+
// Block kinds for each vanilla item group
36+
private static final List<BlockKind> BUILDING_KINDS = List.of(
37+
BlockKind.POST,
38+
BlockKind.PLATFORM,
39+
BlockKind.STEP
40+
);
41+
private static final List<BlockKind> FUNCTIONAL_KINDS = List.of(
42+
BlockKind.CHAIR,
43+
BlockKind.TABLE,
44+
BlockKind.DRAWER,
45+
BlockKind.KITCHEN_COUNTER,
46+
BlockKind.KITCHEN_CUPBOARD,
47+
BlockKind.KITCHEN_SINK,
48+
BlockKind.SHELF,
49+
BlockKind.COFFEE_TABLE,
50+
BlockKind.BENCH
51+
);
52+
53+
private static final String GROUP_ID = "items";
54+
public static final Registered<ItemGroup> GROUP = ITEM_GROUPS.register(GROUP_ID,
55+
() -> ItemGroupBridge.get().builder()
56+
.displayName(Text.translatable(Util.createTranslationKey("itemGroup", AdornCommon.id(GROUP_ID))))
57+
.icon(() -> new ItemStack(AdornBlocks.SOFAS.get().get(DyeColor.LIME)))
58+
.entries((displayContext, entries) -> {
59+
ItemGroupBuildContext context = entries::add;
60+
switch (ConfigManager.config().groupItems) {
61+
case BY_MATERIAL -> addByKinds(context, Arrays.asList(BlockKind.values()));
62+
case BY_SHAPE -> {
63+
for (var kind : BlockKind.values()) {
64+
for (var block : BlockVariantSets.get(kind)) {
65+
context.add(block);
66+
}
67+
}
68+
}
69+
}
70+
addColoredBlocks(context);
71+
addChimneys(context);
72+
addFences(context);
73+
addCopperPipes(context);
74+
addCrates(context);
75+
addMiscDecorations(context);
76+
context.add(AdornBlocks.TRADING_STATION);
77+
context.add(AdornBlocks.BREWER);
78+
addFoodAndDrink(context);
79+
addIngredients(context);
80+
addTools(context);
81+
})
82+
.build());
83+
84+
public static void init() {
85+
if (ConfigManager.get().config().client.showItemsInStandardGroups) {
86+
addToVanillaItemGroups();
87+
}
88+
}
89+
90+
private static void addToVanillaItemGroups() {
91+
var itemGroups = ItemGroupBridge.get();
92+
itemGroups.addItems(ItemGroups.BUILDING_BLOCKS, context -> {
93+
for (var variant : BlockVariantSets.allVariants()) {
94+
var after = findLastBuildingBlockEntry(variant);
95+
96+
if (after != null) {
97+
List<ItemConvertible> items = new ArrayList<>();
98+
for (var kind : BUILDING_KINDS) {
99+
var block = BlockVariantSets.get(kind, variant);
100+
if (block != null) items.add(block.get());
101+
}
102+
context.addAfter(after, items);
103+
} else {
104+
addByKinds(context, variant, BUILDING_KINDS);
105+
}
106+
}
107+
108+
context.addAfter(Items.CUT_COPPER_SLAB, AdornBlocks.COPPER_PIPE);
109+
context.addAfter(Items.EXPOSED_CUT_COPPER_SLAB, AdornBlocks.EXPOSED_COPPER_PIPE);
110+
context.addAfter(Items.WEATHERED_CUT_COPPER_SLAB, AdornBlocks.WEATHERED_COPPER_PIPE);
111+
context.addAfter(Items.OXIDIZED_CUT_COPPER_SLAB, AdornBlocks.OXIDIZED_COPPER_PIPE);
112+
context.addAfter(Items.WAXED_CUT_COPPER_SLAB, AdornBlocks.WAXED_COPPER_PIPE);
113+
context.addAfter(Items.WAXED_EXPOSED_CUT_COPPER_SLAB, AdornBlocks.WAXED_EXPOSED_COPPER_PIPE);
114+
context.addAfter(Items.WAXED_WEATHERED_CUT_COPPER_SLAB, AdornBlocks.WAXED_WEATHERED_COPPER_PIPE);
115+
context.addAfter(Items.WAXED_OXIDIZED_CUT_COPPER_SLAB, AdornBlocks.WAXED_OXIDIZED_COPPER_PIPE);
116+
});
117+
itemGroups.addItems(ItemGroups.COLORED_BLOCKS, AdornItemGroups::addColoredBlocks);
118+
itemGroups.addItems(ItemGroups.FUNCTIONAL, context -> {
119+
addByKinds(context, FUNCTIONAL_KINDS);
120+
addColoredBlocks(context);
121+
addChimneys(context);
122+
addFences(context);
123+
addCrates(context);
124+
addMiscDecorations(context);
125+
context.add(AdornBlocks.TRADING_STATION);
126+
context.add(AdornBlocks.BREWER);
127+
});
128+
itemGroups.addItems(ItemGroups.FOOD_AND_DRINK, AdornItemGroups::addFoodAndDrink);
129+
itemGroups.addItems(ItemGroups.INGREDIENTS, AdornItemGroups::addIngredients);
130+
itemGroups.addItems(ItemGroups.TOOLS, AdornItemGroups::addTools);
131+
}
132+
133+
private static void addByKinds(ItemGroupBuildContext context, List<BlockKind> kinds) {
134+
for (var variant : BlockVariantSets.allVariants()) {
135+
addByKinds(context, variant, kinds);
136+
}
137+
}
138+
139+
private static void addByKinds(ItemGroupBuildContext context, BlockVariant variant, List<BlockKind> kinds) {
140+
for (var kind : kinds) {
141+
var block = BlockVariantSets.get(kind, variant);
142+
if (block != null) context.add(block);
143+
}
144+
}
145+
146+
private static void addColoredBlocks(ItemGroupBuildContext context) {
147+
for (var sofa : AdornBlocks.SOFAS.get().values()) {
148+
context.add(sofa);
149+
}
150+
for (var lamp : AdornBlocks.TABLE_LAMPS.get().values()) {
151+
context.add(lamp);
152+
}
153+
context.add(AdornBlocks.CANDLELIT_LANTERN);
154+
for (var lantern : AdornBlocks.DYED_CANDLELIT_LANTERNS.get().values()) {
155+
context.add(lantern);
156+
}
157+
}
158+
159+
private static void addCrates(ItemGroupBuildContext context) {
160+
context.add(AdornBlocks.CRATE);
161+
context.add(AdornBlocks.APPLE_CRATE);
162+
context.add(AdornBlocks.WHEAT_CRATE);
163+
context.add(AdornBlocks.CARROT_CRATE);
164+
context.add(AdornBlocks.POTATO_CRATE);
165+
context.add(AdornBlocks.MELON_CRATE);
166+
context.add(AdornBlocks.WHEAT_SEED_CRATE);
167+
context.add(AdornBlocks.MELON_SEED_CRATE);
168+
context.add(AdornBlocks.PUMPKIN_SEED_CRATE);
169+
context.add(AdornBlocks.BEETROOT_CRATE);
170+
context.add(AdornBlocks.BEETROOT_SEED_CRATE);
171+
context.add(AdornBlocks.SWEET_BERRY_CRATE);
172+
context.add(AdornBlocks.COCOA_BEAN_CRATE);
173+
context.add(AdornBlocks.NETHER_WART_CRATE);
174+
context.add(AdornBlocks.SUGAR_CANE_CRATE);
175+
context.add(AdornBlocks.EGG_CRATE);
176+
context.add(AdornBlocks.HONEYCOMB_CRATE);
177+
context.add(AdornBlocks.LIL_TATER_CRATE);
178+
}
179+
180+
private static void addChimneys(ItemGroupBuildContext context) {
181+
context.add(AdornBlocks.BRICK_CHIMNEY);
182+
context.add(AdornBlocks.STONE_BRICK_CHIMNEY);
183+
context.add(AdornBlocks.NETHER_BRICK_CHIMNEY);
184+
context.add(AdornBlocks.RED_NETHER_BRICK_CHIMNEY);
185+
context.add(AdornBlocks.COBBLESTONE_CHIMNEY);
186+
context.add(AdornBlocks.PRISMARINE_CHIMNEY);
187+
context.add(AdornBlocks.MAGMATIC_PRISMARINE_CHIMNEY);
188+
context.add(AdornBlocks.SOULFUL_PRISMARINE_CHIMNEY);
189+
}
190+
191+
private static void addFences(ItemGroupBuildContext context) {
192+
context.add(AdornBlocks.PICKET_FENCE);
193+
context.add(AdornBlocks.CHAIN_LINK_FENCE);
194+
}
195+
196+
private static void addCopperPipes(ItemGroupBuildContext context) {
197+
context.add(AdornBlocks.COPPER_PIPE);
198+
context.add(AdornBlocks.EXPOSED_COPPER_PIPE);
199+
context.add(AdornBlocks.WEATHERED_COPPER_PIPE);
200+
context.add(AdornBlocks.OXIDIZED_COPPER_PIPE);
201+
context.add(AdornBlocks.WAXED_COPPER_PIPE);
202+
context.add(AdornBlocks.WAXED_EXPOSED_COPPER_PIPE);
203+
context.add(AdornBlocks.WAXED_WEATHERED_COPPER_PIPE);
204+
context.add(AdornBlocks.WAXED_OXIDIZED_COPPER_PIPE);
205+
}
206+
207+
private static void addFoodAndDrink(ItemGroupBuildContext context) {
208+
context.add(AdornItems.MUG);
209+
context.add(AdornItems.HOT_CHOCOLATE);
210+
context.add(AdornItems.SWEET_BERRY_JUICE);
211+
context.add(AdornItems.GLOW_BERRY_TEA);
212+
context.add(AdornItems.NETHER_WART_COFFEE);
213+
}
214+
215+
private static void addIngredients(ItemGroupBuildContext context) {
216+
if (context instanceof ItemGroupModifyContext modifyContext) {
217+
modifyContext.addAfter(Items.STICK, AdornItems.STONE_ROD);
218+
modifyContext.addAfter(Items.IRON_NUGGET, AdornItems.COPPER_NUGGET);
219+
} else {
220+
context.add(AdornItems.STONE_ROD);
221+
context.add(AdornItems.COPPER_NUGGET);
222+
}
223+
}
224+
225+
private static void addTools(ItemGroupBuildContext context) {
226+
context.add(AdornItems.WATERING_CAN);
227+
context.add(AdornItems.GUIDE_BOOK);
228+
context.add(AdornItems.TRADERS_MANUAL);
229+
}
230+
231+
private static void addMiscDecorations(ItemGroupBuildContext context) {
232+
context.add(AdornItems.STONE_TORCH);
233+
context.add(AdornBlocks.STONE_LADDER);
234+
}
235+
236+
private static @Nullable Block findLastBuildingBlockEntry(BlockVariant variant) {
237+
// Buttons are the last entry in "building blocks" for each material currently,
238+
// then walls and finally slabs
239+
return findBaseBlock(variant, "button")
240+
.or(() -> findBaseBlock(variant, "wall"))
241+
.or(() -> findBaseBlock(variant, "slab"))
242+
.or(() -> findBaseBlock(variant, null))
243+
.orElse(null);
244+
}
245+
246+
private static Optional<Block> findBaseBlock(BlockVariant variant, @Nullable String suffix) {
247+
var variantId = variant.nameAsIdentifier();
248+
var buttonId = suffix != null ? variantId.withSuffixedPath("_" + suffix) : variantId;
249+
250+
if (Registries.BLOCK.containsId(buttonId)) {
251+
return Optional.of(Registries.BLOCK.get(buttonId));
252+
}
253+
254+
return Optional.empty();
255+
}
256+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package juuxel.adorn.item.group;
2+
3+
import juuxel.adorn.lib.registry.Registered;
4+
import net.minecraft.item.ItemConvertible;
5+
6+
@FunctionalInterface
7+
public interface ItemGroupBuildContext {
8+
void add(ItemConvertible item);
9+
10+
default void add(Registered<? extends ItemConvertible> item) {
11+
add(item.get());
12+
}
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package juuxel.adorn.item.group;
2+
3+
import juuxel.adorn.lib.registry.Registered;
4+
import net.minecraft.item.ItemConvertible;
5+
6+
import java.util.List;
7+
8+
public interface ItemGroupModifyContext extends ItemGroupBuildContext {
9+
void addAfter(ItemConvertible after, List<? extends ItemConvertible> items);
10+
11+
default void addAfter(ItemConvertible after, ItemConvertible item) {
12+
addAfter(after, List.of(item));
13+
}
14+
15+
default void addAfter(ItemConvertible after, Registered<? extends ItemConvertible> item) {
16+
addAfter(after, item.get());
17+
}
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package juuxel.adorn.item.group;
2+
3+
import juuxel.adorn.util.Displayable;
4+
import net.minecraft.text.Text;
5+
6+
public enum ItemGroupingOption implements Displayable {
7+
BY_MATERIAL("by_material"),
8+
BY_SHAPE("by_shape");
9+
10+
private final Text displayName;
11+
12+
ItemGroupingOption(String id) {
13+
displayName = Text.translatable("gui.adorn.item_grouping_option." + id);
14+
}
15+
16+
@Override
17+
public Text getDisplayName() {
18+
return displayName;
19+
}
20+
}

common/src/main/java/juuxel/adorn/lib/AdornGameRules.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public static void init() {
2424
}
2525

2626
private static Type<BooleanRule> createBooleanRule(Predicate<Config.GameRuleDefaults> defaultGetter) {
27-
return BooleanRule.create(defaultGetter.test(ConfigManager.Companion.config().gameRuleDefaults));
27+
return BooleanRule.create(defaultGetter.test(ConfigManager.config().gameRuleDefaults));
2828
}
2929

3030
private static <T extends Rule<T>> Key<T> register(String name, Category category, Type<T> type) {

common/src/main/kotlin/juuxel/adorn/config/ConfigManager.kt

+1
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ abstract class ConfigManager {
9191
private val DEFAULT = JANKSON.toJson(Config()) as JsonObject
9292
private val LOGGER = logger()
9393

94+
@JvmStatic
9495
fun config() = INSTANCE.config
9596
}
9697
}

0 commit comments

Comments
 (0)