Skip to content

Commit 0f0dcf8

Browse files
Infinite spray can.
1 parent fc3d38a commit 0f0dcf8

18 files changed

Lines changed: 867 additions & 1 deletion

File tree

run/server.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#Minecraft server properties
2-
#Tue Nov 11 20:14:28 EST 2025
2+
#Tue Apr 21 17:16:52 EDT 2026
33
allow-flight=true
44
allow-nether=true
55
broadcast-console-to-ops=true

src/generated/resources/assets/gtmutils/lang/en_ud.json

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,14 @@
11
{
2+
"behaviour.paintspray.infinite.fluid_storage": "ᗺɯ %s / %sɟ§ :ʇuıɐԀq§",
3+
"behaviour.paintspray.infinite.no_fluid": "ɹ§¡ʇuıɐԀ ɔıʇɐɯoɹɥɔʎןoԀ sǝɹınbǝᴚɔ§",
4+
"behaviour.paintspray.infinite.status.color": "%sɟ§ :ǝpoWㄥ§",
5+
"behaviour.paintspray.infinite.status.solvent": "ʇuǝʌןoS",
6+
"behaviour.paintspray.infinite.tooltip.current_color": "%s :ɹoןoƆ ʇuǝɹɹnƆ",
7+
"behaviour.paintspray.infinite.tooltip.info": "˙ʇuıɐd oʇㄥ§ ʞɔıןɔ-ʇɥbıᴚǝ§",
8+
"behaviour.paintspray.infinite.tooltip.info_1": "˙ʇuıɐd uıɐɥɔ oʇㄥ§ ʞɔoןq ǝןqɐʇuıɐd uo ʞɔıןɔ-ʇɥbıᴚ + ʇɟıɥSǝ§",
9+
"behaviour.paintspray.infinite.tooltip.info_2": "˙nuǝW uoıʇɔǝןǝS ɹoןoƆ uǝdo oʇㄥ§ ʞɔıןɔ-ʇɥbıᴚ + ʇɟıɥSǝ§",
10+
"behaviour.paintspray.infinite.tooltip.solvent": ")buıuɐǝןƆ( ʇuǝʌןoSq§ :ǝpoWㄥ§",
11+
"behaviour.paintspray.solvent.short": "ʇuǝʌןoS",
212
"block.gtmutils.enlarged_stocking_bus.desc.0": "ʞɹoʍʇǝu ƎW ǝɥʇ ɯoɹɟ ʎןʇɔǝɹıp sɯǝʇı sǝʌǝıɹʇǝᴚ",
313
"block.gtmutils.enlarged_stocking_bus.desc.1": "ʇsıן buıʞɔoʇs ǝbɹɐן-ɐɹʇxƎ",
414
"block.gtmutils.enlarged_stocking_bus.desc.2": "sɯǝʇı ƎW ʇuɐpunqɐ ʇsoɯ ǝɥʇ ɥʇıʍ ʇsıן ǝɥʇ ןןıɟ uɐɔ ןןnԀ-oʇnⱯ",
@@ -72,6 +82,7 @@
7282
"config.gtmutils.option.enlargedStockingSizeRows": "sʍoᴚǝzıSbuıʞɔoʇSpǝbɹɐןuǝ",
7383
"config.gtmutils.option.expandedBuffersEnabled": "pǝןqɐuƎsɹǝɟɟnᗺpǝpuɐdxǝ",
7484
"config.gtmutils.option.features": "sǝɹnʇɐǝɟ",
85+
"config.gtmutils.option.infiniteSprayCanEnabled": "pǝןqɐuƎuɐƆʎɐɹdSǝʇıuıɟuı",
7586
"config.gtmutils.option.omnibreakerEnabled": "pǝןqɐuƎɹǝʞɐǝɹqıuɯo",
7687
"config.gtmutils.option.omnibreakerEnergyCapacity": "ʎʇıɔɐdɐƆʎbɹǝuƎɹǝʞɐǝɹqıuɯo",
7788
"config.gtmutils.option.omnibreakerTier": "ɹǝı⟘ɹǝʞɐǝɹqıuɯo",
@@ -95,6 +106,7 @@
95106
"gtmutils.multiblock.pterb_machine.coolant_usage": "puoɔǝs ɹǝd %s ɟo qɯ%s suıɐɹᗡɔ§",
96107
"gtmutils.pterb.current_frequency": "%s :ʎɔuǝnbǝɹɟ ʇuǝɹɹnƆ",
97108
"gtmutils.pterb_machine.invalid_frequency": "¡0 ʎɔuǝnbǝɹɟ uo ʞɹoʍ ʇou ןןıʍ s⟘ⱯM",
109+
"gui.gtmutils.color_select.title": "ɹoןoƆ ʇɔǝןǝS",
98110
"item.gtceu.tool.ev_buzzsaw": ")ΛƎ( ʍɐszznᗺ %s",
99111
"item.gtceu.tool.ev_chainsaw": ")ΛƎ( ʍɐsuıɐɥƆ %s",
100112
"item.gtceu.tool.ev_screwdriver": ")ΛƎ( ɹǝʌıɹpʍǝɹɔS ɔıɹʇɔǝןƎ %s",
@@ -125,6 +137,7 @@
125137
"item.gtmutils.cupronickel_credit": "ʇıpǝɹƆ ןǝʞɔıuoɹdnƆ",
126138
"item.gtmutils.doge_coin": "uıoƆ ǝboᗡ",
127139
"item.gtmutils.gold_credit": "ʇıpǝɹƆ pןo⅁",
140+
"item.gtmutils.infinite_spray_can": "uɐƆ ʎɐɹdS ǝʇıuıɟuI",
128141
"item.gtmutils.luv_power_unit": "ʇıu∩ ɹǝʍoԀ ΛnꞀ",
129142
"item.gtmutils.naquadah_credit": "ʇıpǝɹƆ ɥɐpɐnbɐN",
130143
"item.gtmutils.neutronium_credit": "ʇıpǝɹƆ ɯnıuoɹʇnǝN",
@@ -134,6 +147,8 @@
134147
"item.gtmutils.silver_credit": "ʇıpǝɹƆ ɹǝʌןıS",
135148
"item.gtmutils.zpm_power_unit": "ʇıu∩ ɹǝʍoԀ WԀZ",
136149
"itemGroup.gtmutils.creative_tab": "sǝıʇıןıʇ∩ uɹǝpoW ɥɔǝ⟘bǝɹ⅁",
150+
"key.categories.gtmutils": "sןıʇ∩ W⟘⅁",
151+
"key.gtmutils.spray_can_menuu": "nuǝW ןɐıpɐᴚ uɐƆ ʎɐɹdS uǝdO",
137152
"material.gtmutils.quantum_coolant": "ʇuɐןooƆ ɯnʇuɐnὉ",
138153
"tooltip.omnibreaker.can_break_anything": "¡⅁NIH⟘ʎNⱯ ǝuıɯ-ɐʇsuı uɐɔ ɹǝʞɐǝɹq-ıuɯO ǝɥ⟘",
139154
"tooltip.omnibreaker.charge_status": "∩Ǝ %s / ∩Ǝ %s :ʎbɹǝuƎ",

src/generated/resources/assets/gtmutils/lang/en_us.json

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,14 @@
11
{
2+
"behaviour.paintspray.infinite.fluid_storage": "§bPaint: §f%s / %s mB",
3+
"behaviour.paintspray.infinite.no_fluid": "§cRequires Polychromatic Paint!§r",
4+
"behaviour.paintspray.infinite.status.color": "§7Mode: §f%s",
5+
"behaviour.paintspray.infinite.status.solvent": "Solvent",
6+
"behaviour.paintspray.infinite.tooltip.current_color": "Current Color: %s",
7+
"behaviour.paintspray.infinite.tooltip.info": "§eRight-click §7to paint.",
8+
"behaviour.paintspray.infinite.tooltip.info_1": "§eShift + Right-click on paintable block §7to chain paint.",
9+
"behaviour.paintspray.infinite.tooltip.info_2": "§eShift + Right-click §7to open Color Selection Menu.",
10+
"behaviour.paintspray.infinite.tooltip.solvent": "§7Mode: §bSolvent (Cleaning)",
11+
"behaviour.paintspray.solvent.short": "Solvent",
212
"block.gtmutils.enlarged_stocking_bus.desc.0": "Retrieves items directly from the ME network",
313
"block.gtmutils.enlarged_stocking_bus.desc.1": "Extra-large stocking list",
414
"block.gtmutils.enlarged_stocking_bus.desc.2": "Auto-Pull can fill the list with the most abundant ME items",
@@ -72,6 +82,7 @@
7282
"config.gtmutils.option.enlargedStockingSizeRows": "enlargedStockingSizeRows",
7383
"config.gtmutils.option.expandedBuffersEnabled": "expandedBuffersEnabled",
7484
"config.gtmutils.option.features": "features",
85+
"config.gtmutils.option.infiniteSprayCanEnabled": "infiniteSprayCanEnabled",
7586
"config.gtmutils.option.omnibreakerEnabled": "omnibreakerEnabled",
7687
"config.gtmutils.option.omnibreakerEnergyCapacity": "omnibreakerEnergyCapacity",
7788
"config.gtmutils.option.omnibreakerTier": "omnibreakerTier",
@@ -95,6 +106,7 @@
95106
"gtmutils.multiblock.pterb_machine.coolant_usage": "§cDrains %smb of %s per second",
96107
"gtmutils.pterb.current_frequency": "Current frequency: %s",
97108
"gtmutils.pterb_machine.invalid_frequency": "WATs will not work on frequency 0!",
109+
"gui.gtmutils.color_select.title": "Select Color",
98110
"item.gtceu.tool.ev_buzzsaw": "%s Buzzsaw (EV)",
99111
"item.gtceu.tool.ev_chainsaw": "%s Chainsaw (EV)",
100112
"item.gtceu.tool.ev_screwdriver": "%s Electric Screwdriver (EV)",
@@ -125,6 +137,7 @@
125137
"item.gtmutils.cupronickel_credit": "Cupronickel Credit",
126138
"item.gtmutils.doge_coin": "Doge Coin",
127139
"item.gtmutils.gold_credit": "Gold Credit",
140+
"item.gtmutils.infinite_spray_can": "Infinite Spray Can",
128141
"item.gtmutils.luv_power_unit": "LuV Power Unit",
129142
"item.gtmutils.naquadah_credit": "Naquadah Credit",
130143
"item.gtmutils.neutronium_credit": "Neutronium Credit",
@@ -134,6 +147,8 @@
134147
"item.gtmutils.silver_credit": "Silver Credit",
135148
"item.gtmutils.zpm_power_unit": "ZPM Power Unit",
136149
"itemGroup.gtmutils.creative_tab": "GregTech Modern Utilities",
150+
"key.categories.gtmutils": "GTM Utils",
151+
"key.gtmutils.spray_can_menuu": "Open Spray Can Radial Menu",
137152
"material.gtmutils.quantum_coolant": "Quantum Coolant",
138153
"tooltip.omnibreaker.can_break_anything": "The Omni-breaker can insta-mine ANYTHING!",
139154
"tooltip.omnibreaker.charge_status": "Energy: %s EU / %s EU",
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"parent": "minecraft:item/handheld",
3+
"textures": {
4+
"layer0": "gtmutils:item/tools/infinite_spray_can"
5+
}
6+
}

src/main/java/net/neganote/gtutilities/GregTechModernUtilities.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,15 @@
1717
import net.minecraft.world.item.Items;
1818
import net.minecraftforge.api.distmarker.Dist;
1919
import net.minecraftforge.api.distmarker.OnlyIn;
20+
import net.minecraftforge.client.event.RegisterGuiOverlaysEvent;
2021
import net.minecraftforge.common.MinecraftForge;
2122
import net.minecraftforge.eventbus.api.IEventBus;
2223
import net.minecraftforge.eventbus.api.SubscribeEvent;
2324
import net.minecraftforge.fml.common.Mod;
2425
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
2526
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
2627
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
28+
import net.neganote.gtutilities.client.renderer.SprayCanHudOverlay;
2729
import net.neganote.gtutilities.client.renderer.UtilShaders;
2830
import net.neganote.gtutilities.common.data.UtilPlaceholders;
2931
import net.neganote.gtutilities.common.item.UtilItems;
@@ -34,6 +36,7 @@
3436
import net.neganote.gtutilities.common.tools.UtilToolConnection;
3537
import net.neganote.gtutilities.config.UtilConfig;
3638
import net.neganote.gtutilities.datagen.UtilDatagen;
39+
import net.neganote.gtutilities.network.UtilsNetwork;
3740

3841
import com.tterrag.registrate.util.entry.RegistryEntry;
3942
import org.apache.logging.log4j.LogManager;
@@ -108,6 +111,7 @@ public static ResourceLocation id(String path) {
108111

109112
private void commonSetup(final FMLCommonSetupEvent event) {
110113
event.enqueueWork(() -> {
114+
UtilsNetwork.init();
111115
LOGGER.info("Hello from common setup! This is *after* registries are done, so we can do this:");
112116
LOGGER.info("Look, I found a {}!", Items.DIAMOND);
113117
});
@@ -133,6 +137,17 @@ public void clientSetup(final FMLClientSetupEvent event) {
133137
});
134138
}
135139

140+
@Mod.EventBusSubscriber(modid = GregTechModernUtilities.MOD_ID,
141+
bus = Mod.EventBusSubscriber.Bus.MOD,
142+
value = Dist.CLIENT)
143+
public static class ClientModBusEvents {
144+
145+
@SubscribeEvent
146+
public static void registerGuiOverlays(RegisterGuiOverlaysEvent event) {
147+
event.registerAboveAll("spray_can_info", SprayCanHudOverlay.HUD_SPRAY_CAN);
148+
}
149+
}
150+
136151
// You MUST have this for custom materials.
137152
// Remember to register them not to GT's namespace, but your own.
138153
private void addMaterialRegistries(MaterialRegistryEvent event) {
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package net.neganote.gtutilities.client.event;
2+
3+
import net.minecraft.client.Minecraft;
4+
import net.minecraft.sounds.SoundEvents;
5+
import net.minecraft.world.InteractionHand;
6+
import net.minecraft.world.item.ItemStack;
7+
import net.minecraft.world.phys.HitResult;
8+
import net.minecraftforge.api.distmarker.Dist;
9+
import net.minecraftforge.client.event.InputEvent;
10+
import net.minecraftforge.event.TickEvent;
11+
import net.minecraftforge.eventbus.api.SubscribeEvent;
12+
import net.minecraftforge.fml.common.Mod;
13+
import net.neganote.gtutilities.GregTechModernUtilities;
14+
import net.neganote.gtutilities.client.gui.screen.ColorRadialMenuScreen;
15+
import net.neganote.gtutilities.client.keybind.UtilKeybinds;
16+
import net.neganote.gtutilities.common.item.InfiniteSprayCanItem;
17+
import net.neganote.gtutilities.network.UtilsNetwork;
18+
import net.neganote.gtutilities.network.packet.SelectColorPacket;
19+
20+
@Mod.EventBusSubscriber(modid = GregTechModernUtilities.MOD_ID,
21+
bus = Mod.EventBusSubscriber.Bus.FORGE,
22+
value = Dist.CLIENT)
23+
public class ClientTickHandler {
24+
25+
@SubscribeEvent
26+
public static void onClientTick(TickEvent.ClientTickEvent event) {
27+
if (event.phase != TickEvent.Phase.END) return;
28+
29+
Minecraft mc = Minecraft.getInstance();
30+
if (mc.player == null || mc.level == null) return;
31+
32+
if (UtilKeybinds.SPRAY_CAN_MENU.consumeClick()) {
33+
ItemStack stack = mc.player.getMainHandItem();
34+
if (stack.getItem() instanceof InfiniteSprayCanItem) {
35+
mc.setScreen(new ColorRadialMenuScreen(InteractionHand.MAIN_HAND));
36+
}
37+
}
38+
}
39+
40+
@SubscribeEvent
41+
public static void onMouseScroll(InputEvent.MouseScrollingEvent event) {
42+
Minecraft mc = Minecraft.getInstance();
43+
44+
if (mc.player == null || mc.screen != null) return;
45+
46+
if (mc.options.keyShift.isDown()) {
47+
ItemStack stack = mc.player.getMainHandItem();
48+
if (stack.getItem() instanceof InfiniteSprayCanItem) {
49+
double scrollDelta = event.getScrollDelta();
50+
51+
event.setCanceled(true);
52+
53+
int currentColor = stack.getOrCreateTag().getInt("color");
54+
if (!stack.getOrCreateTag().contains("color")) currentColor = -1;
55+
56+
int direction = scrollDelta > 0 ? 1 : -1;
57+
int nextColor = currentColor + direction;
58+
59+
if (nextColor < -1) nextColor = 15;
60+
if (nextColor > 15) nextColor = -1;
61+
62+
UtilsNetwork.CHANNEL.sendToServer(new SelectColorPacket(InteractionHand.MAIN_HAND, nextColor));
63+
64+
mc.player.playSound(SoundEvents.UI_BUTTON_CLICK.value(), 0.1f, 1.5f + (nextColor * 0.05f));
65+
}
66+
}
67+
}
68+
69+
@SubscribeEvent
70+
public static void onRightClick(InputEvent.InteractionKeyMappingTriggered event) {
71+
Minecraft mc = Minecraft.getInstance();
72+
if (mc.player == null) return;
73+
74+
if (!event.isUseItem()) return;
75+
ItemStack stack = mc.player.getMainHandItem();
76+
if (!(stack.getItem() instanceof InfiniteSprayCanItem)) return;
77+
78+
if (!mc.player.isShiftKeyDown()) return;
79+
if (mc.hitResult == null || mc.hitResult.getType() != HitResult.Type.MISS) return;
80+
81+
event.setCanceled(true);
82+
mc.setScreen(new ColorRadialMenuScreen(InteractionHand.MAIN_HAND));
83+
}
84+
}
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
package net.neganote.gtutilities.client.gui.screen;
2+
3+
import net.minecraft.client.gui.GuiGraphics;
4+
import net.minecraft.client.gui.screens.Screen;
5+
import net.minecraft.client.resources.sounds.SimpleSoundInstance;
6+
import net.minecraft.core.registries.BuiltInRegistries;
7+
import net.minecraft.network.chat.Component;
8+
import net.minecraft.resources.ResourceLocation;
9+
import net.minecraft.sounds.SoundEvents;
10+
import net.minecraft.util.Mth;
11+
import net.minecraft.world.InteractionHand;
12+
import net.minecraft.world.item.DyeColor;
13+
import net.minecraft.world.item.Item;
14+
import net.minecraft.world.item.ItemStack;
15+
import net.neganote.gtutilities.network.UtilsNetwork;
16+
import net.neganote.gtutilities.network.packet.SelectColorPacket;
17+
18+
import com.mojang.blaze3d.systems.RenderSystem;
19+
import org.jetbrains.annotations.NotNull;
20+
21+
public class ColorRadialMenuScreen extends Screen {
22+
23+
private final InteractionHand hand;
24+
private static final int RADIUS = 85;
25+
private static final int INNER_RADIUS = 20;
26+
private static final int ITEM_RADIUS = 60;
27+
28+
public ColorRadialMenuScreen(InteractionHand hand) {
29+
super(Component.translatable("gui.gtmutils.color_select.title"));
30+
this.hand = hand;
31+
}
32+
33+
@Override
34+
public void render(@NotNull GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTicks) {
35+
this.renderBackground(guiGraphics);
36+
37+
int centerX = this.width / 2;
38+
int centerY = this.height / 2;
39+
40+
DyeColor[] colors = DyeColor.values();
41+
int numSegments = colors.length;
42+
float segmentAngle = 360.0f / numSegments;
43+
44+
double distToCenter = Math.sqrt(Math.pow(mouseX - centerX, 2) + Math.pow(mouseY - centerY, 2));
45+
double mouseAngle = Math.toDegrees(Math.atan2(mouseY - centerY, mouseX - centerX));
46+
mouseAngle = (mouseAngle + 360 + 90) % 360;
47+
48+
boolean hoveringSolvent = distToCenter < INNER_RADIUS;
49+
50+
int solventColor = hoveringSolvent ? 0xFFFF55 : 0xFFFFFF;
51+
Component solventText = Component.translatable("behaviour.paintspray.solvent.short");
52+
guiGraphics.drawCenteredString(this.font, solventText, centerX, centerY - 4, solventColor);
53+
54+
for (int i = 0; i < numSegments; i++) {
55+
float startAngleDeg = i * segmentAngle;
56+
float endAngleDeg = (i + 1) * segmentAngle;
57+
boolean hoveringThis = !hoveringSolvent && distToCenter <= RADIUS && distToCenter > INNER_RADIUS &&
58+
mouseAngle >= startAngleDeg && mouseAngle < endAngleDeg;
59+
60+
float midAngleRad = (float) Math.toRadians(startAngleDeg - 90);
61+
float itemAngleRad = (float) Math.toRadians(((startAngleDeg + endAngleDeg) / 2.0f) - 90);
62+
63+
int x1 = centerX + (int) (Mth.cos(midAngleRad) * INNER_RADIUS);
64+
int y1 = centerY + (int) (Mth.sin(midAngleRad) * INNER_RADIUS);
65+
66+
guiGraphics.fill(x1, y1, x1 + 1, y1 + 1, 0xAAFFFFFF);
67+
68+
int itemX = centerX + (int) (Mth.cos(itemAngleRad) * ITEM_RADIUS) - 8;
69+
int itemY = centerY + (int) (Mth.sin(itemAngleRad) * ITEM_RADIUS) - 8;
70+
71+
if (hoveringThis) {
72+
RenderSystem.setShaderColor(1, 1, 1, 0.2f);
73+
guiGraphics.fill(itemX - 4, itemY - 4, itemX + 20, itemY + 20, 0x44FFFFFF);
74+
RenderSystem.setShaderColor(1, 1, 1, 1);
75+
}
76+
77+
ItemStack dyeStack = new ItemStack(getDyeItem(colors[i]));
78+
guiGraphics.renderFakeItem(dyeStack, itemX, itemY);
79+
80+
if (hoveringThis) {
81+
guiGraphics.renderTooltip(this.font,
82+
Component.translatable("color.minecraft." + colors[i].getSerializedName()), mouseX, mouseY);
83+
}
84+
}
85+
}
86+
87+
@Override
88+
public boolean mouseClicked(double mouseX, double mouseY, int button) {
89+
int centerX = this.width / 2;
90+
int centerY = this.height / 2;
91+
92+
double distToCenter = Math.sqrt(Math.pow(mouseX - centerX, 2) + Math.pow(mouseY - centerY, 2));
93+
94+
if (distToCenter < INNER_RADIUS) {
95+
sendColorSelection(-1);
96+
return true;
97+
}
98+
99+
if (distToCenter <= RADIUS) {
100+
double angle = Math.toDegrees(Math.atan2(mouseY - centerY, mouseX - centerX));
101+
angle = (angle + 360 + 90) % 360;
102+
103+
DyeColor[] colors = DyeColor.values();
104+
int selectedSegment = (int) (angle / (360.0f / colors.length));
105+
106+
if (selectedSegment >= 0 && selectedSegment < colors.length) {
107+
sendColorSelection(selectedSegment);
108+
return true;
109+
}
110+
}
111+
112+
return super.mouseClicked(mouseX, mouseY, button);
113+
}
114+
115+
private void sendColorSelection(int id) {
116+
UtilsNetwork.CHANNEL.sendToServer(new SelectColorPacket(hand, id));
117+
if (this.minecraft != null) {
118+
this.minecraft.getSoundManager().play(SimpleSoundInstance.forUI(SoundEvents.UI_BUTTON_CLICK, 1.0F));
119+
}
120+
this.onClose();
121+
}
122+
123+
private Item getDyeItem(DyeColor color) {
124+
ResourceLocation id = new ResourceLocation("minecraft", color.getSerializedName() + "_dye");
125+
return BuiltInRegistries.ITEM.get(id);
126+
}
127+
128+
@Override
129+
public boolean isPauseScreen() {
130+
return false;
131+
}
132+
}

0 commit comments

Comments
 (0)