Port WorldHandler to Minecraft 1.21.1

This commit is contained in:
Codex
2026-04-26 11:54:13 +02:00
parent 1073af2472
commit 6b285f7dbd
36 changed files with 150 additions and 83 deletions

5
.gitignore vendored
View File

@@ -130,3 +130,8 @@ bin/
### Changelog ### ### Changelog ###
changelog.txt changelog.txt
### Local Codex build runtime ###
.codex-jdk/
.gradle-home/
temurin-jdk21.zip

View File

@@ -8,7 +8,7 @@ plugins {
archivesBaseName = "${mod_name}-${minecraft_version}" archivesBaseName = "${mod_name}-${minecraft_version}"
version = mod_version version = mod_version
java.toolchain.languageVersion = JavaLanguageVersion.of(17) java.toolchain.languageVersion = JavaLanguageVersion.of(21)
javadoc.options.addStringOption('Xdoclint:none', '-quiet') javadoc.options.addStringOption('Xdoclint:none', '-quiet')
println('Java: ' + System.getProperty('java.version') + ' JVM: ' + System.getProperty('java.vm.version') + ' (' + System.getProperty('java.vendor') + ') Arch: ' + System.getProperty('os.arch')) println('Java: ' + System.getProperty('java.version') + ' JVM: ' + System.getProperty('java.vm.version') + ' (' + System.getProperty('java.vendor') + ') Arch: ' + System.getProperty('os.arch'))

View File

@@ -1,15 +1,15 @@
# WorldHandler # WorldHandler
mod_id = worldhandler mod_id = worldhandler
mod_name = WorldHandler mod_name = WorldHandler
mod_version = 3.5.1 mod_version = 3.5.2
minecraft_version = 1.20.4 minecraft_version = 1.21.1
group = exopandora.worldhandler group = exopandora.worldhandler
main_class = exopandora.worldhandler.Main main_class = exopandora.worldhandler.Main
author = Exopandora author = Exopandora
# Forge # Forge
forge_version = 49.0.3 forge_version = 52.1.14
forge_compatible_minecraft_versions = 1.20.3,1.20.4 forge_compatible_minecraft_versions = 1.21.1
# Publishing # Publishing
curse_project_id = 228970 curse_project_id = 228970

View File

@@ -15,7 +15,7 @@ import exopandora.worldhandler.builder.argument.PrimitiveArgument.Operation;
import exopandora.worldhandler.builder.argument.PrimitiveArgument.Relation; import exopandora.worldhandler.builder.argument.PrimitiveArgument.Relation;
import exopandora.worldhandler.builder.argument.PrimitiveArgument.Type; import exopandora.worldhandler.builder.argument.PrimitiveArgument.Type;
import exopandora.worldhandler.util.EnumHelper; import exopandora.worldhandler.util.EnumHelper;
import net.minecraft.Util; import exopandora.worldhandler.util.RegistryHelper;
import net.minecraft.advancements.critereon.MinMaxBounds; import net.minecraft.advancements.critereon.MinMaxBounds;
import net.minecraft.commands.ParserUtils; import net.minecraft.commands.ParserUtils;
import net.minecraft.commands.arguments.EntityAnchorArgument.Anchor; import net.minecraft.commands.arguments.EntityAnchorArgument.Anchor;
@@ -160,7 +160,7 @@ public class Arguments
public static PrimitiveArgument<ResourceLocation> resourceLocation() public static PrimitiveArgument<ResourceLocation> resourceLocation()
{ {
return PrimitiveArgument.builder(string -> string.isEmpty() ? null : new ResourceLocation(string)).build(); return PrimitiveArgument.<ResourceLocation>builder(string -> string.isEmpty() ? null : ResourceLocation.parse(string)).build();
} }
public static ItemArgument item() public static ItemArgument item()
@@ -292,13 +292,13 @@ public class Arguments
{ {
try try
{ {
return Component.Serializer.fromJson(string); return Component.Serializer.fromJson(string, RegistryHelper.registryAccess());
} }
catch(Exception e) catch(Exception e)
{ {
return Component.literal(string); return Component.literal(string);
} }
}).serializer(Component.Serializer::toJson).build(); }).serializer(component -> Component.Serializer.toJson(component, RegistryHelper.registryAccess())).build();
} }
public static PrimitiveArgument<PrimitiveArgument.Relation> relation() public static PrimitiveArgument<PrimitiveArgument.Relation> relation()
@@ -355,14 +355,14 @@ public class Arguments
{ {
try try
{ {
return ParserUtils.parseJson(new StringReader(string), Style.Serializer.CODEC); return ParserUtils.parseJson(RegistryHelper.registryAccess(), new StringReader(string), Style.Serializer.CODEC);
} }
catch(Exception e) catch(Exception e)
{ {
return null; return null;
} }
}) })
.serializer(style -> GSON.toJson(Util.getOrThrow(Style.Serializer.CODEC.encodeStart(JsonOps.INSTANCE, style), JsonParseException::new))) .serializer(style -> GSON.toJson(Style.Serializer.CODEC.encodeStart(JsonOps.INSTANCE, style).getOrThrow(JsonParseException::new)))
.build(); .build();
} }
} }

View File

@@ -2,10 +2,10 @@ package exopandora.worldhandler.builder.argument;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import exopandora.worldhandler.util.RegistryHelper;
import exopandora.worldhandler.util.ResourceHelper; import exopandora.worldhandler.util.ResourceHelper;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.enchantment.Enchantment; import net.minecraft.world.item.enchantment.Enchantment;
import net.minecraftforge.registries.ForgeRegistries;
public class EnchantmentArgument implements IDeserializableArgument public class EnchantmentArgument implements IDeserializableArgument
{ {
@@ -25,7 +25,7 @@ public class EnchantmentArgument implements IDeserializableArgument
{ {
if(enchantment != null) if(enchantment != null)
{ {
this.set(ForgeRegistries.ENCHANTMENTS.getValue(enchantment)); this.set(RegistryHelper.getEnchantment(enchantment));
} }
else else
{ {
@@ -54,7 +54,7 @@ public class EnchantmentArgument implements IDeserializableArgument
return null; return null;
} }
return ForgeRegistries.ENCHANTMENTS.getKey(this.enchantment).toString(); return RegistryHelper.getEnchantmentKey(this.enchantment).toString();
} }
@Override @Override

View File

@@ -1,5 +1,6 @@
package exopandora.worldhandler.builder.argument.tag; package exopandora.worldhandler.builder.argument.tag;
import exopandora.worldhandler.util.TextUtils;
import exopandora.worldhandler.util.UserStylableComponent; import exopandora.worldhandler.util.UserStylableComponent;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag; import net.minecraft.nbt.ListTag;
@@ -19,7 +20,7 @@ public class DisplayTag implements ITagProvider
if(this.name.getText() != null && !this.name.getText().isEmpty()) if(this.name.getText() != null && !this.name.getText().isEmpty())
{ {
display.putString("Name", Component.Serializer.toJson(this.name)); display.putString("Name", TextUtils.toJson(this.name));
} }
ListTag lore = new ListTag(); ListTag lore = new ListTag();
@@ -28,7 +29,7 @@ public class DisplayTag implements ITagProvider
{ {
if(this.lore[x] != null && !this.lore[x].getString().isEmpty()) if(this.lore[x] != null && !this.lore[x].getString().isEmpty())
{ {
lore.add(StringTag.valueOf(Component.Serializer.toJson(this.lore[x]))); lore.add(StringTag.valueOf(TextUtils.toJson(this.lore[x])));
} }
} }

View File

@@ -7,11 +7,11 @@ import java.util.Set;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import exopandora.worldhandler.util.RegistryHelper;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag; import net.minecraft.nbt.ListTag;
import net.minecraft.nbt.Tag; import net.minecraft.nbt.Tag;
import net.minecraft.world.item.enchantment.Enchantment; import net.minecraft.world.item.enchantment.Enchantment;
import net.minecraftforge.registries.ForgeRegistries;
public class EnchantmentsTag implements ITagProvider public class EnchantmentsTag implements ITagProvider
{ {
@@ -29,7 +29,7 @@ public class EnchantmentsTag implements ITagProvider
{ {
CompoundTag enchantment = new CompoundTag(); CompoundTag enchantment = new CompoundTag();
enchantment.putString("id", ForgeRegistries.ENCHANTMENTS.getKey(entry.getKey()).toString()); enchantment.putString("id", RegistryHelper.getEnchantmentKey(entry.getKey()).toString());
enchantment.putShort("lvl", entry.getValue()); enchantment.putShort("lvl", entry.getValue());
enchantments.add(enchantment); enchantments.add(enchantment);

View File

@@ -11,6 +11,7 @@ import javax.annotation.Nullable;
import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.exceptions.CommandSyntaxException;
import exopandora.worldhandler.util.NBTHelper; import exopandora.worldhandler.util.NBTHelper;
import exopandora.worldhandler.util.TextUtils;
import exopandora.worldhandler.util.UserStylableComponent; import exopandora.worldhandler.util.UserStylableComponent;
import net.minecraft.nbt.ByteTag; import net.minecraft.nbt.ByteTag;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
@@ -405,7 +406,7 @@ public class EntityTag implements ITagProvider
if(this.customName.getText() != null && !this.customName.getText().isEmpty()) if(this.customName.getText() != null && !this.customName.getText().isEmpty())
{ {
NBTHelper.append(nbt, "CustomName", StringTag.valueOf(Component.Serializer.toJson(this.customName))); NBTHelper.append(nbt, "CustomName", StringTag.valueOf(TextUtils.toJson(this.customName)));
} }
NBTHelper.append(nbt, this.potion); NBTHelper.append(nbt, this.potion);

View File

@@ -4,6 +4,7 @@ import java.util.Arrays;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import exopandora.worldhandler.util.TextUtils;
import exopandora.worldhandler.util.UserStylableComponent; import exopandora.worldhandler.util.UserStylableComponent;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag; import net.minecraft.nbt.ListTag;
@@ -36,7 +37,7 @@ public class SidedSignTextTag implements ITagProvider
for(UserStylableComponent text : this.lines) for(UserStylableComponent text : this.lines)
{ {
messages.add(StringTag.valueOf(Component.Serializer.toJson(text))); messages.add(StringTag.valueOf(TextUtils.toJson(text)));
} }
CompoundTag tag = new CompoundTag(); CompoundTag tag = new CompoundTag();

View File

@@ -41,7 +41,8 @@ public class ClientEventHandler
if(aabb.getCenter().distanceTo(projected) < 96) if(aabb.getCenter().distanceTo(projected) < 96)
{ {
PoseStack matrix = event.getPoseStack(); PoseStack matrix = new PoseStack();
matrix.mulPose(event.getPoseStack());
matrix.pushPose(); matrix.pushPose();
matrix.translate(-projected.x(), -projected.y(), -projected.z()); matrix.translate(-projected.x(), -projected.y(), -projected.z());

View File

@@ -15,7 +15,7 @@ public class Categories
public static Category getRegisteredCategory(String name) public static Category getRegisteredCategory(String name)
{ {
Category category = Category.REGISTRY.getValue(new ResourceLocation(Main.MODID, name)); Category category = Category.REGISTRY.getValue(ResourceLocation.fromNamespaceAndPath(Main.MODID, name));
if(category == null) if(category == null)
{ {
@@ -27,6 +27,6 @@ public class Categories
public static boolean isRegistered(String name) public static boolean isRegistered(String name)
{ {
return Category.REGISTRY.containsKey(new ResourceLocation(Main.MODID, name)); return Category.REGISTRY.containsKey(ResourceLocation.fromNamespaceAndPath(Main.MODID, name));
} }
} }

View File

@@ -29,7 +29,7 @@ import net.minecraftforge.registries.RegistryBuilder;
public class Category public class Category
{ {
public static IForgeRegistry<Category> REGISTRY; public static IForgeRegistry<Category> REGISTRY;
public static final ResourceKey<Registry<Category>> REGISTRY_KEY = ResourceKey.createRegistryKey(new ResourceLocation(Main.MODID, "category")); public static final ResourceKey<Registry<Category>> REGISTRY_KEY = ResourceKey.createRegistryKey(ResourceLocation.fromNamespaceAndPath(Main.MODID, "category"));
public static final Map<String, List<String>> DEFAULT_CATEGORIES = new CategoriesBuilder() public static final Map<String, List<String>> DEFAULT_CATEGORIES = new CategoriesBuilder()
.add("main", "main", "containers", "multiplayer") .add("main", "main", "containers", "multiplayer")
.add("entities", "summon", "butcher") .add("entities", "summon", "butcher")
@@ -65,7 +65,7 @@ public class Category
public Category add(int index, String key) public Category add(int index, String key)
{ {
return this.add(index, new ResourceLocation(Main.MODID, key)); return this.add(index, ResourceLocation.fromNamespaceAndPath(Main.MODID, key));
} }
public List<ResourceLocation> getContents() public List<ResourceLocation> getContents()
@@ -103,7 +103,7 @@ public class Category
RegistryHelper.register(event, REGISTRY_KEY, entry.getKey(), () -> RegistryHelper.register(event, REGISTRY_KEY, entry.getKey(), () ->
{ {
var keys = entry.getValue().stream() var keys = entry.getValue().stream()
.map(key -> new ResourceLocation(Main.MODID, key)) .map(key -> ResourceLocation.fromNamespaceAndPath(Main.MODID, key))
.collect(Collectors.toList()); .collect(Collectors.toList());
return new Category(keys); return new Category(keys);
}); });
@@ -125,7 +125,7 @@ public class Category
{ {
if(!Categories.isRegistered(tab.getCategory())) if(!Categories.isRegistered(tab.getCategory()))
{ {
RegistryHelper.register(event, REGISTRY_KEY, tab.getCategory(), () -> new Category(new ResourceLocation(Main.MODID, id))); RegistryHelper.register(event, REGISTRY_KEY, tab.getCategory(), () -> new Category(ResourceLocation.fromNamespaceAndPath(Main.MODID, id)));
} }
else else
{ {

View File

@@ -42,7 +42,7 @@ public class GuiWorldHandler extends Container
widgets.add(new WidgetCommandSyntax()); widgets.add(new WidgetCommandSyntax());
widgets.add(new WidgetShortcuts()); widgets.add(new WidgetShortcuts());
}); });
private static final ResourceLocation BACKGROUND_TEXTURE = new ResourceLocation("textures/gui/demo_background.png"); private static final ResourceLocation BACKGROUND_TEXTURE = ResourceLocation.parse("textures/gui/demo_background.png");
private final Content content; private final Content content;

View File

@@ -47,7 +47,7 @@ import net.minecraftforge.registries.RegistryBuilder;
public abstract class Content implements IContent public abstract class Content implements IContent
{ {
public static IForgeRegistry<Content> REGISTRY; public static IForgeRegistry<Content> REGISTRY;
public static final ResourceKey<Registry<Content>> REGISTRY_KEY = ResourceKey.createRegistryKey(new ResourceLocation(Main.MODID, "content")); public static final ResourceKey<Registry<Content>> REGISTRY_KEY = ResourceKey.createRegistryKey(ResourceLocation.fromNamespaceAndPath(Main.MODID, "content"));
@SubscribeEvent @SubscribeEvent
public static void createRegistry(NewRegistryEvent event) public static void createRegistry(NewRegistryEvent event)

View File

@@ -46,7 +46,7 @@ public class Contents
public static Content getRegisteredContent(String name) public static Content getRegisteredContent(String name)
{ {
Content content = Content.REGISTRY.getValue(new ResourceLocation(Main.MODID, name)); Content content = Content.REGISTRY.getValue(ResourceLocation.fromNamespaceAndPath(Main.MODID, name));
if(content == null) if(content == null)
{ {
@@ -58,6 +58,6 @@ public class Contents
public static boolean isRegistered(String name) public static boolean isRegistered(String name)
{ {
return Content.REGISTRY.containsKey(new ResourceLocation(Main.MODID, name)); return Content.REGISTRY.containsKey(ResourceLocation.fromNamespaceAndPath(Main.MODID, name));
} }
} }

View File

@@ -11,12 +11,13 @@ import exopandora.worldhandler.util.IConnection.DedicatedConnection;
import exopandora.worldhandler.util.IConnection.IntegratedConnection; import exopandora.worldhandler.util.IConnection.IntegratedConnection;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screens.ConnectScreen; import net.minecraft.client.gui.screens.ConnectScreen;
import net.minecraft.client.gui.screens.GenericDirtMessageScreen; import net.minecraft.client.gui.screens.GenericMessageScreen;
import net.minecraft.client.gui.screens.TitleScreen; import net.minecraft.client.gui.screens.TitleScreen;
import net.minecraft.client.gui.screens.multiplayer.JoinMultiplayerScreen; import net.minecraft.client.gui.screens.multiplayer.JoinMultiplayerScreen;
import net.minecraft.client.gui.screens.multiplayer.SafetyScreen; import net.minecraft.client.gui.screens.multiplayer.SafetyScreen;
import net.minecraft.client.gui.screens.worldselection.SelectWorldScreen; import net.minecraft.client.gui.screens.worldselection.SelectWorldScreen;
import net.minecraft.client.multiplayer.ServerData; import net.minecraft.client.multiplayer.ServerData;
import net.minecraft.client.multiplayer.TransferState;
import net.minecraft.client.multiplayer.resolver.ServerAddress; import net.minecraft.client.multiplayer.resolver.ServerAddress;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.MutableComponent;
@@ -62,7 +63,7 @@ public class ContentChangeWorld extends ContentChild
if(isIntegrated) if(isIntegrated)
{ {
String folder = minecraft.getSingleplayerServer().storageSource.getLevelId(); String folder = minecraft.getSingleplayerServer().storageSource.getLevelId();
minecraft.disconnect(new GenericDirtMessageScreen(Component.translatable("menu.savingLevel"))); minecraft.disconnect(new GenericMessageScreen(Component.translatable("menu.savingLevel")));
return new IntegratedConnection(folder); return new IntegratedConnection(folder);
} }
else else
@@ -86,7 +87,7 @@ public class ContentChangeWorld extends ContentChild
} }
else if(connection instanceof IntegratedConnection integrated) else if(connection instanceof IntegratedConnection integrated)
{ {
Minecraft.getInstance().createWorldOpenFlows().checkForBackupAndLoad(integrated.getFolder(), () -> Minecraft.getInstance().createWorldOpenFlows().openWorld(integrated.getFolder(), () ->
{ {
Minecraft.getInstance().setScreen(new TitleScreen()); Minecraft.getInstance().setScreen(new TitleScreen());
}); });
@@ -95,7 +96,7 @@ public class ContentChangeWorld extends ContentChild
else if(connection instanceof DedicatedConnection dedicated) else if(connection instanceof DedicatedConnection dedicated)
{ {
ServerData data = dedicated.getData(); ServerData data = dedicated.getData();
ConnectScreen.startConnecting(new TitleScreen(), Minecraft.getInstance(), ServerAddress.parseString(data.ip), data, false); ConnectScreen.startConnecting(new TitleScreen(), Minecraft.getInstance(), ServerAddress.parseString(data.ip), data, false, (TransferState) null);
} }
} }

View File

@@ -26,6 +26,7 @@ import exopandora.worldhandler.gui.widget.menu.impl.MenuPageList;
import exopandora.worldhandler.util.ActionHandler; import exopandora.worldhandler.util.ActionHandler;
import exopandora.worldhandler.util.ActionHelper; import exopandora.worldhandler.util.ActionHelper;
import exopandora.worldhandler.util.CommandHelper; import exopandora.worldhandler.util.CommandHelper;
import exopandora.worldhandler.util.RegistryHelper;
import exopandora.worldhandler.util.TextUtils; import exopandora.worldhandler.util.TextUtils;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.MutableComponent;
@@ -131,18 +132,18 @@ public class ContentCustomItem extends Content
} }
else if(Page.ENCHANT.equals(this.page)) else if(Page.ENCHANT.equals(this.page))
{ {
MenuPageList<Enchantment> enchantments = new MenuPageList<Enchantment>(x + 118, y, new ArrayList<Enchantment>(ForgeRegistries.ENCHANTMENTS.getValues()), 114, 20, 3, container, new ILogicPageList<Enchantment>() MenuPageList<Enchantment> enchantments = new MenuPageList<Enchantment>(x + 118, y, new ArrayList<Enchantment>(RegistryHelper.enchantmentValues()), 114, 20, 3, container, new ILogicPageList<Enchantment>()
{ {
@Override @Override
public MutableComponent translate(Enchantment item) public MutableComponent translate(Enchantment item)
{ {
return Component.translatable(item.getDescriptionId()); return RegistryHelper.getEnchantmentDescription(item).copy();
} }
@Override @Override
public MutableComponent toTooltip(Enchantment item) public MutableComponent toTooltip(Enchantment item)
{ {
return Component.literal(ForgeRegistries.ENCHANTMENTS.getKey(item).toString()); return Component.literal(RegistryHelper.getEnchantmentKey(item).toString());
} }
@Override @Override
@@ -154,7 +155,7 @@ public class ContentCustomItem extends Content
@Override @Override
public GuiButtonBase onRegister(int x, int y, int width, int height, MutableComponent text, Enchantment item, ActionHandler actionHandler) public GuiButtonBase onRegister(int x, int y, int width, int height, MutableComponent text, Enchantment item, ActionHandler actionHandler)
{ {
return new GuiSlider(x, y, width, height, 0, Config.getSliders().getMaxItemEnchantment(), 0, container, new LogicSliderSimple(ForgeRegistries.ENCHANTMENTS.getKey(item).toString(), text, value -> return new GuiSlider(x, y, width, height, 0, Config.getSliders().getMaxItemEnchantment(), 0, container, new LogicSliderSimple(RegistryHelper.getEnchantmentKey(item).toString(), text, value ->
{ {
ContentCustomItem.this.enchantments.set(item, value.shortValue()); ContentCustomItem.this.enchantments.set(item, value.shortValue());
})); }));

View File

@@ -17,10 +17,10 @@ import exopandora.worldhandler.gui.widget.menu.impl.MenuPageList;
import exopandora.worldhandler.util.ActionHandler; import exopandora.worldhandler.util.ActionHandler;
import exopandora.worldhandler.util.ActionHelper; import exopandora.worldhandler.util.ActionHelper;
import exopandora.worldhandler.util.CommandHelper; import exopandora.worldhandler.util.CommandHelper;
import exopandora.worldhandler.util.RegistryHelper;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.MutableComponent;
import net.minecraft.world.item.enchantment.Enchantment; import net.minecraft.world.item.enchantment.Enchantment;
import net.minecraftforge.registries.ForgeRegistries;
public class ContentEnchantment extends Content public class ContentEnchantment extends Content
{ {
@@ -36,18 +36,18 @@ public class ContentEnchantment extends Content
@Override @Override
public void initGui(Container container, int x, int y) public void initGui(Container container, int x, int y)
{ {
MenuPageList<Enchantment> enchantments = new MenuPageList<Enchantment>(x, y, new ArrayList<Enchantment>(ForgeRegistries.ENCHANTMENTS.getValues()), 114, 20, 3, container, new ILogicPageList<Enchantment>() MenuPageList<Enchantment> enchantments = new MenuPageList<Enchantment>(x, y, new ArrayList<Enchantment>(RegistryHelper.enchantmentValues()), 114, 20, 3, container, new ILogicPageList<Enchantment>()
{ {
@Override @Override
public MutableComponent translate(Enchantment enchantment) public MutableComponent translate(Enchantment enchantment)
{ {
return Component.translatable(enchantment.getDescriptionId()); return RegistryHelper.getEnchantmentDescription(enchantment).copy();
} }
@Override @Override
public MutableComponent toTooltip(Enchantment enchantment) public MutableComponent toTooltip(Enchantment enchantment)
{ {
return Component.literal(ForgeRegistries.ENCHANTMENTS.getKey(enchantment).toString()); return Component.literal(RegistryHelper.getEnchantmentKey(enchantment).toString());
} }
@Override @Override

View File

@@ -114,7 +114,7 @@ public class ContentLocate extends Content
.thenAccept(structures -> this.structures.set(structures.getList().stream() .thenAccept(structures -> this.structures.set(structures.getList().stream()
.map(Suggestion::getText) .map(Suggestion::getText)
.filter(suggestion -> !suggestion.startsWith("#")) .filter(suggestion -> !suggestion.startsWith("#"))
.map(ResourceLocation::new) .map(ResourceLocation::parse)
.collect(Collectors.toList()))) .collect(Collectors.toList())))
.thenRun(container::init); .thenRun(container::init);
} }

View File

@@ -37,7 +37,7 @@ import net.minecraft.world.level.block.state.properties.NoteBlockInstrument;
public class ContentNoteEditor extends Content public class ContentNoteEditor extends Content
{ {
private static final ResourceLocation NOTE = new ResourceLocation(Main.MODID, "textures/misc/note.png"); private static final ResourceLocation NOTE = ResourceLocation.fromNamespaceAndPath(Main.MODID, "textures/misc/note.png");
private final SetBlockCommandBuilder builderNoteEditor = new SetBlockCommandBuilder(); private final SetBlockCommandBuilder builderNoteEditor = new SetBlockCommandBuilder();
private final CommandPreview preview = new CommandPreview(this.builderNoteEditor, SetBlockCommandBuilder.Label.REPLACE); private final CommandPreview preview = new CommandPreview(this.builderNoteEditor, SetBlockCommandBuilder.Label.REPLACE);

View File

@@ -61,7 +61,7 @@ import net.minecraftforge.registries.ForgeRegistries;
public class ContentSummon extends Content public class ContentSummon extends Content
{ {
private static final ResourceLocation BEACON_LOCATION = new ResourceLocation("textures/gui/container/beacon.png"); private static final ResourceLocation BEACON_LOCATION = ResourceLocation.parse("textures/gui/container/beacon.png");
private static final Item[] HELMETS = private static final Item[] HELMETS =
{ {
Items.AIR, Items.AIR,

View File

@@ -39,13 +39,13 @@ public class ContentWorldInfo extends Content
IntegratedServer server = Minecraft.getInstance().getSingleplayerServer(); IntegratedServer server = Minecraft.getInstance().getSingleplayerServer();
this.posXField = new GuiHintTextField(x + 118, y + 12, 114, 20); this.posXField = new GuiHintTextField(x + 118, y + 12, 114, 20);
this.posXField.setValue(I18n.get("gui.worldhandler.world_info.start.spawn") + " X: " + ContentWorldInfo.format(level, object -> object.getLevelData().getXSpawn())); this.posXField.setValue(I18n.get("gui.worldhandler.world_info.start.spawn") + " X: " + ContentWorldInfo.format(level, object -> object.getLevelData().getSpawnPos().getX()));
this.posYField = new GuiHintTextField(x + 118, y + 36, 114, 20); this.posYField = new GuiHintTextField(x + 118, y + 36, 114, 20);
this.posYField.setValue(I18n.get("gui.worldhandler.world_info.start.spawn") + " Y: " + ContentWorldInfo.format(level, object -> object.getLevelData().getYSpawn())); this.posYField.setValue(I18n.get("gui.worldhandler.world_info.start.spawn") + " Y: " + ContentWorldInfo.format(level, object -> object.getLevelData().getSpawnPos().getY()));
this.posZField = new GuiHintTextField(x + 118, y + 60, 114, 20); this.posZField = new GuiHintTextField(x + 118, y + 60, 114, 20);
this.posZField.setValue(I18n.get("gui.worldhandler.world_info.start.spawn") + " Z: " + ContentWorldInfo.format(level, object -> object.getLevelData().getZSpawn())); this.posZField.setValue(I18n.get("gui.worldhandler.world_info.start.spawn") + " Z: " + ContentWorldInfo.format(level, object -> object.getLevelData().getSpawnPos().getZ()));
this.worldField = new GuiHintTextField(x + 118, y + 12, 114, 20); this.worldField = new GuiHintTextField(x + 118, y + 12, 114, 20);
this.worldField.setValue(I18n.get("gui.worldhandler.world_info.world.name") + ": " + ContentWorldInfo.format(server, object -> object.getWorldData().getLevelName())); this.worldField.setValue(I18n.get("gui.worldhandler.world_info.world.name") + ": " + ContentWorldInfo.format(server, object -> object.getWorldData().getLevelName()));

View File

@@ -20,7 +20,7 @@ import net.minecraft.util.Mth;
public class WidgetTabRenderer implements IContainerWidget public class WidgetTabRenderer implements IContainerWidget
{ {
private static final ResourceLocation TAB_TEXTURE = new ResourceLocation("textures/gui/demo_background.png"); private static final ResourceLocation TAB_TEXTURE = ResourceLocation.parse("textures/gui/demo_background.png");
private static final int SPACING = 2; private static final int SPACING = 2;
private static final int WEDGE_HEIGHT = 10; private static final int WEDGE_HEIGHT = 10;

View File

@@ -19,9 +19,9 @@ public class GuiButtonBase extends AbstractButton
{ {
protected static final WidgetSprites VANILLA_BUTTON_SPRITES = new WidgetSprites protected static final WidgetSprites VANILLA_BUTTON_SPRITES = new WidgetSprites
( (
new ResourceLocation(Main.MODID, "textures/skins/vanilla/button.png"), ResourceLocation.fromNamespaceAndPath(Main.MODID, "textures/skins/vanilla/button.png"),
new ResourceLocation(Main.MODID, "textures/skins/vanilla/button_disabled.png"), ResourceLocation.fromNamespaceAndPath(Main.MODID, "textures/skins/vanilla/button_disabled.png"),
new ResourceLocation(Main.MODID, "textures/skins/vanilla/button_highlighted.png") ResourceLocation.fromNamespaceAndPath(Main.MODID, "textures/skins/vanilla/button_highlighted.png")
); );
private final ActionHandler actionHandler; private final ActionHandler actionHandler;

View File

@@ -16,7 +16,7 @@ import net.minecraft.sounds.SoundEvent;
public class GuiButtonPiano extends GuiButtonBase public class GuiButtonPiano extends GuiButtonBase
{ {
private static final ResourceLocation NOTE = new ResourceLocation(Main.MODID, "textures/misc/note.png"); private static final ResourceLocation NOTE = ResourceLocation.fromNamespaceAndPath(Main.MODID, "textures/misc/note.png");
private final Type type; private final Type type;
private final SoundEvent sound; private final SoundEvent sound;
private final float pitch; private final float pitch;

View File

@@ -17,9 +17,9 @@ import net.minecraft.resources.ResourceLocation;
public class GuiSlider extends GuiButtonBase public class GuiSlider extends GuiButtonBase
{ {
private static final ResourceLocation SLIDER_SPRITE = new ResourceLocation("widget/slider"); private static final ResourceLocation SLIDER_SPRITE = ResourceLocation.parse("widget/slider");
private static final ResourceLocation SLIDER_HANDLE_SPRITE = new ResourceLocation("widget/slider_handle"); private static final ResourceLocation SLIDER_HANDLE_SPRITE = ResourceLocation.parse("widget/slider_handle");
private static final ResourceLocation SLIDER_HANDLE_HIGHLIGHTED_SPRITE = new ResourceLocation("widget/slider_handle_highlighted"); private static final ResourceLocation SLIDER_HANDLE_HIGHLIGHTED_SPRITE = ResourceLocation.parse("widget/slider_handle_highlighted");
private final Persistence persistence; private final Persistence persistence;
private final ILogicSlider logic; private final ILogicSlider logic;
private final Container container; private final Container container;

View File

@@ -171,7 +171,7 @@ public class UsercontentLoader
private static boolean isValidPathName(Path path) private static boolean isValidPathName(Path path)
{ {
String name = path.getFileName().toString(); String name = path.getFileName().toString();
boolean valid = ResourceLocation.isValidResourceLocation(name); boolean valid = ResourceLocation.tryParse(name) != null;
if(!valid) if(!valid)
{ {

View File

@@ -54,7 +54,7 @@ public class WidgetFactory extends AbstractWidgetFactory
widget.getLayout().getY() + y, widget.getLayout().getY() + y,
widget.getLayout().getWidth(), widget.getLayout().getWidth(),
widget.getLayout().getHeight(), widget.getLayout().getHeight(),
ForgeRegistries.ITEMS.getValue(new ResourceLocation(widget.getAttributes().getItem())), ForgeRegistries.ITEMS.getValue(ResourceLocation.parse(widget.getAttributes().getItem())),
this.getActionHandlerFactory().createActionHandler(content, widget.getAction(), container::getPlayer) this.getActionHandlerFactory().createActionHandler(content, widget.getAction(), container::getPlayer)
); );
} }

View File

@@ -17,13 +17,12 @@ import net.minecraft.server.packs.resources.ReloadableResourceManager;
import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.server.packs.resources.ResourceManager;
import net.minecraft.util.Unit; import net.minecraft.util.Unit;
import net.minecraft.util.profiling.ProfilerFiller; import net.minecraft.util.profiling.ProfilerFiller;
import net.minecraft.world.level.storage.loot.LootDataManager;
import net.minecraftforge.common.crafting.conditions.ICondition.IContext; import net.minecraftforge.common.crafting.conditions.ICondition.IContext;
public class AdvancementHelper implements PreparableReloadListener public class AdvancementHelper implements PreparableReloadListener
{ {
private static final AdvancementHelper INSTANCE = new AdvancementHelper(); private static final AdvancementHelper INSTANCE = new AdvancementHelper();
private final ServerAdvancementManager manager = new ServerAdvancementManager(new LootDataManager(), IContext.EMPTY); private final ServerAdvancementManager manager = new ServerAdvancementManager(RegistryHelper.registryAccess(), IContext.EMPTY);
@Override @Override
public CompletableFuture<Void> reload(PreparationBarrier stage, ResourceManager resourceManager, ProfilerFiller preparationsProfiler, ProfilerFiller reloadProfiler, Executor backgroundExecutor, Executor gameExecutor) public CompletableFuture<Void> reload(PreparationBarrier stage, ResourceManager resourceManager, ProfilerFiller preparationsProfiler, ProfilerFiller reloadProfiler, Executor backgroundExecutor, Executor gameExecutor)

View File

@@ -22,7 +22,7 @@ public class BlockPredicateParser
private static final ResourceLocation AIR_RESOURCE_LOCATION = ForgeRegistries.BLOCKS.getKey(Blocks.AIR); private static final ResourceLocation AIR_RESOURCE_LOCATION = ForgeRegistries.BLOCKS.getKey(Blocks.AIR);
private final StringReader reader; private final StringReader reader;
private final Map<String, String> vagueProperties = Maps.newHashMap(); private final Map<String, String> vagueProperties = Maps.newHashMap();
private ResourceLocation block = new ResourceLocation(""); private ResourceLocation block = null;
@Nullable @Nullable
private CompoundTag nbt; private CompoundTag nbt;
private boolean isTag; private boolean isTag;

View File

@@ -5,11 +5,13 @@ import java.util.Optional;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import com.mojang.brigadier.StringReader; import com.mojang.brigadier.StringReader;
import com.mojang.brigadier.exceptions.SimpleCommandExceptionType;
import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.exceptions.CommandSyntaxException;
import net.minecraft.commands.arguments.item.ItemParser; import net.minecraft.commands.arguments.item.ItemParser;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.TagParser; import net.minecraft.nbt.TagParser;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.Item; import net.minecraft.world.item.Item;
import net.minecraft.world.item.Items; import net.minecraft.world.item.Items;
@@ -17,8 +19,9 @@ import net.minecraftforge.registries.ForgeRegistries;
public class ItemPredicateParser public class ItemPredicateParser
{ {
private static final SimpleCommandExceptionType ERROR_NO_TAGS_ALLOWED = new SimpleCommandExceptionType(Component.translatable("argument.item.tag.disallowed"));
private final StringReader reader; private final StringReader reader;
private ResourceLocation item = new ResourceLocation(""); private ResourceLocation item = null;
@Nullable @Nullable
private CompoundTag nbt; private CompoundTag nbt;
private boolean isTag; private boolean isTag;
@@ -39,7 +42,7 @@ public class ItemPredicateParser
{ {
if(!allowTags) if(!allowTags)
{ {
throw ItemParser.ERROR_NO_TAGS_ALLOWED.createWithContext(this.reader); throw ERROR_NO_TAGS_ALLOWED.createWithContext(this.reader);
} }
this.readTag(); this.readTag();

View File

@@ -1,17 +1,63 @@
package exopandora.worldhandler.util; package exopandora.worldhandler.util;
import java.util.Collection;
import java.util.function.Supplier; import java.util.function.Supplier;
import exopandora.worldhandler.Main; import exopandora.worldhandler.Main;
import net.minecraft.client.Minecraft;
import net.minecraft.core.RegistryAccess;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.core.registries.Registries;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.enchantment.Enchantment;
import net.minecraftforge.registries.RegisterEvent; import net.minecraftforge.registries.RegisterEvent;
public class RegistryHelper public class RegistryHelper
{ {
public static <T> void register(RegisterEvent event, ResourceKey<Registry<T>> key, String location, Supplier<T> valueSupplier) public static <T> void register(RegisterEvent event, ResourceKey<Registry<T>> key, String location, Supplier<T> valueSupplier)
{ {
event.register(key, new ResourceLocation(Main.MODID, location), valueSupplier); event.register(key, RegistryHelper.location(location), valueSupplier);
}
public static ResourceLocation location(String location)
{
return ResourceLocation.fromNamespaceAndPath(Main.MODID, location);
}
public static RegistryAccess registryAccess()
{
if(Minecraft.getInstance().level != null)
{
return Minecraft.getInstance().level.registryAccess();
}
return RegistryAccess.EMPTY;
}
public static Registry<Enchantment> enchantments()
{
return RegistryHelper.registryAccess().registryOrThrow(Registries.ENCHANTMENT);
}
public static Collection<Enchantment> enchantmentValues()
{
return RegistryHelper.enchantments().stream().toList();
}
public static Enchantment getEnchantment(ResourceLocation location)
{
return RegistryHelper.enchantments().get(location);
}
public static ResourceLocation getEnchantmentKey(Enchantment enchantment)
{
return RegistryHelper.enchantments().getKey(enchantment);
}
public static Component getEnchantmentDescription(Enchantment enchantment)
{
return enchantment.description();
} }
} }

View File

@@ -38,6 +38,6 @@ public class ResourceHelper
public static ResourceLocation iconTexture() public static ResourceLocation iconTexture()
{ {
return new ResourceLocation(Main.MODID, "textures/icons/icons_" + Config.getSkin().getIconSize().name() + ".png"); return ResourceLocation.fromNamespaceAndPath(Main.MODID, "textures/icons/icons_" + Config.getSkin().getIconSize().name() + ".png");
} }
} }

View File

@@ -13,6 +13,11 @@ public class TextUtils
public static final MutableComponent ARROW_LEFT_BOLD = Component.literal("<").withStyle(ChatFormatting.BOLD); public static final MutableComponent ARROW_LEFT_BOLD = Component.literal("<").withStyle(ChatFormatting.BOLD);
public static final MutableComponent ARROW_RIGHT_BOLD = Component.literal(">").withStyle(ChatFormatting.BOLD); public static final MutableComponent ARROW_RIGHT_BOLD = Component.literal(">").withStyle(ChatFormatting.BOLD);
public static String toJson(Component component)
{
return Component.Serializer.toJson(component, RegistryHelper.registryAccess());
}
public static MutableComponent stripText(MutableComponent string, int maxWidth, Font font) public static MutableComponent stripText(MutableComponent string, int maxWidth, Font font)
{ {
return TextUtils.stripText(string, Component.empty(), maxWidth, font); return TextUtils.stripText(string, Component.empty(), maxWidth, font);

View File

@@ -10,7 +10,6 @@ import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.effect.MobEffect; import net.minecraft.world.effect.MobEffect;
import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.EntityType;
import net.minecraft.world.item.Item; import net.minecraft.world.item.Item;
import net.minecraft.world.item.enchantment.Enchantment;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.IForgeRegistry; import net.minecraftforge.registries.IForgeRegistry;
@@ -25,7 +24,6 @@ public class TranslationHelper
registerRegistry(ForgeRegistries.ITEMS, Item::getDescriptionId); registerRegistry(ForgeRegistries.ITEMS, Item::getDescriptionId);
registerRegistry(ForgeRegistries.MOB_EFFECTS, MobEffect::getDescriptionId); registerRegistry(ForgeRegistries.MOB_EFFECTS, MobEffect::getDescriptionId);
registerRegistry(ForgeRegistries.BIOMES, biome -> ForgeRegistries.BIOMES.getKey(biome).toLanguageKey("biome")); registerRegistry(ForgeRegistries.BIOMES, biome -> ForgeRegistries.BIOMES.getKey(biome).toLanguageKey("biome"));
registerRegistry(ForgeRegistries.ENCHANTMENTS, Enchantment::getDescriptionId);
registerRegistry(ForgeRegistries.ENTITY_TYPES, EntityType::getDescriptionId); registerRegistry(ForgeRegistries.ENTITY_TYPES, EntityType::getDescriptionId);
registerRegistry(ForgeRegistries.STAT_TYPES, stat -> "stat." + stat.toString().replace(':', '.')); registerRegistry(ForgeRegistries.STAT_TYPES, stat -> "stat." + stat.toString().replace(':', '.'));
registerRegistry(ForgeRegistries.VILLAGER_PROFESSIONS, profession -> registerRegistry(ForgeRegistries.VILLAGER_PROFESSIONS, profession ->
@@ -44,6 +42,11 @@ public class TranslationHelper
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public static <T> String translate(ResourceLocation resource) public static <T> String translate(ResourceLocation resource)
{ {
if(RegistryHelper.getEnchantment(resource) != null)
{
return RegistryHelper.getEnchantmentDescription(RegistryHelper.getEnchantment(resource)).getString();
}
for(IForgeRegistry<?> registry : FORGE.keySet()) for(IForgeRegistry<?> registry : FORGE.keySet())
{ {
if(registry.containsKey(resource)) if(registry.containsKey(resource))

View File

@@ -1,5 +1,5 @@
modLoader="javafml" modLoader="javafml"
loaderVersion="[49,)" loaderVersion="[52,)"
updateJSONURL="https://raw.githubusercontent.com/Exopandora/worldhandler/master/version.json" updateJSONURL="https://raw.githubusercontent.com/Exopandora/worldhandler/master/version.json"
issueTrackerURL="https://github.com/Exopandora/WorldHandler/issues" issueTrackerURL="https://github.com/Exopandora/WorldHandler/issues"
displayURL="https://minecraft.curseforge.com/projects/world-handler-command-gui" displayURL="https://minecraft.curseforge.com/projects/world-handler-command-gui"
@@ -11,13 +11,13 @@ license="GPL v3.0"
[[mods]] [[mods]]
modId="worldhandler" modId="worldhandler"
version="1.20.4-${version}" version="1.21.1-${version}"
displayName="World Handler" displayName="World Handler"
description="The World Handler provides a simple and easy to use graphical user interface for commands. It lets you create powerful and complex sub-commands alongside NBT-structures within seconds." description="The World Handler provides a simple and easy to use graphical user interface for commands. It lets you create powerful and complex sub-commands alongside NBT-structures within seconds."
[[dependencies.worldhandler]] [[dependencies.worldhandler]]
modId="minecraft" modId="minecraft"
mandatory=true mandatory=true
versionRange="[1.20.3,)" versionRange="[1.21.1,1.21.2)"
ordering="NONE" ordering="NONE"
side="BOTH" side="BOTH"