Skip to content

Commit

Permalink
Merge branch '1.21.x' into CreativeTabSort
Browse files Browse the repository at this point in the history
  • Loading branch information
TelepathicGrunt committed Jul 2, 2024
2 parents 3223b8a + 0e7ecfc commit b25bdfb
Show file tree
Hide file tree
Showing 45 changed files with 815 additions and 55 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/build-prs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ jobs:
cache-read-only: false

- name: Setup with Gradle
run: ./gradlew setup
run: ./gradlew :neoforge:setup -PvalidateAccessTransformers

- name: Build with Gradle
run: ./gradlew assemble checkFormatting
Expand Down
5 changes: 4 additions & 1 deletion .github/workflows/check-local-changes.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,10 @@ jobs:
cache-read-only: false

- name: Setup with Gradle
run: ./gradlew setup
run: ./gradlew :neoforge:setup

- name: Gen patches
run: ./gradlew :neoforge:unpackSourcePatches

- name: Run datagen with Gradle
run: ./gradlew :neoforge:runData :tests:runData
Expand Down
1 change: 1 addition & 0 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -52,3 +52,4 @@ neogradle.runtime.platform.installer.debug=true
# We want to be able to have a junit run disconnected from the test and main sourcesets
neogradle.subsystems.conventions.sourcesets.automatic-inclusion=false
neogradle.subsystems.conventions.enabled=false
neogradle.subsystems.tools.jst=net.neoforged.jst:jst-cli-bundle:1.0.45
Original file line number Diff line number Diff line change
@@ -1,14 +1,60 @@
--- a/net/minecraft/client/resources/language/ClientLanguage.java
+++ b/net/minecraft/client/resources/language/ClientLanguage.java
@@ -34,6 +_,7 @@
@@ -22,36 +_,50 @@
public class ClientLanguage extends Language {
private static final Logger LOGGER = LogUtils.getLogger();
private final Map<String, String> storage;
+ private final Map<String, net.minecraft.network.chat.Component> componentStorage;
private final boolean defaultRightToLeft;

+ @Deprecated
private ClientLanguage(Map<String, String> p_118914_, boolean p_118915_) {
+ this(p_118914_, p_118915_, Map.of());
+ }
+
+ private ClientLanguage(Map<String, String> p_118914_, boolean p_118915_, Map<String, net.minecraft.network.chat.Component> componentStorage) {
this.storage = p_118914_;
this.defaultRightToLeft = p_118915_;
+ this.componentStorage = componentStorage;
}

public static ClientLanguage loadFrom(ResourceManager p_265765_, List<String> p_265743_, boolean p_265470_) {
Map<String, String> map = Maps.newHashMap();
+ Map<String, net.minecraft.network.chat.Component> componentMap = Maps.newHashMap();

for (String s : p_265743_) {
String s1 = String.format(Locale.ROOT, "lang/%s.json", s);
+ map.putAll(net.neoforged.fml.i18n.I18nManager.loadTranslations(s));

for (String s2 : p_265765_.getNamespaces()) {
try {
@@ -76,5 +_,10 @@
ResourceLocation resourcelocation = ResourceLocation.fromNamespaceAndPath(s2, s1);
- appendFrom(s, p_265765_.getResourceStack(resourcelocation), map);
+ appendFrom(s, p_265765_.getResourceStack(resourcelocation), map, componentMap);
} catch (Exception exception) {
LOGGER.warn("Skipped language file: {}:{} ({})", s2, s1, exception.toString());
}
}
}

- return new ClientLanguage(ImmutableMap.copyOf(map), p_265470_);
+ return new ClientLanguage(ImmutableMap.copyOf(map), p_265470_, ImmutableMap.copyOf(componentMap));
}

+ @Deprecated
private static void appendFrom(String p_235036_, List<Resource> p_235037_, Map<String, String> p_235038_) {
+ appendFrom(p_235036_, p_235037_, p_235038_, new java.util.HashMap<>());
+ }
+
+ private static void appendFrom(String p_235036_, List<Resource> p_235037_, Map<String, String> p_235038_, Map<String, net.minecraft.network.chat.Component> componentMap) {
for (Resource resource : p_235037_) {
try (InputStream inputstream = resource.open()) {
- Language.loadFromJson(inputstream, p_235038_::put);
+ Language.loadFromJson(inputstream, p_235038_::put, componentMap::put);
} catch (IOException ioexception) {
LOGGER.warn("Failed to load translations for {} from pack {}", p_235036_, resource.sourcePackId(), ioexception);
}
@@ -76,5 +_,15 @@
@Override
public FormattedCharSequence getVisualOrder(FormattedText p_118925_) {
return FormattedBidiReorder.reorder(p_118925_, this.defaultRightToLeft);
Expand All @@ -17,5 +63,10 @@
+ @Override
+ public Map<String, String> getLanguageData() {
+ return storage;
+ }
+
+ @Override
+ public @org.jetbrains.annotations.Nullable net.minecraft.network.chat.Component getComponent(String key) {
+ return componentStorage.get(key);
}
}
9 changes: 9 additions & 0 deletions patches/net/minecraft/core/HolderLookup.java.patch
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
--- a/net/minecraft/core/HolderLookup.java
+++ b/net/minecraft/core/HolderLookup.java
@@ -26,7 +_,7 @@
return this.listTags().map(HolderSet.Named::key);
}

- public interface Provider {
+ public interface Provider extends net.neoforged.neoforge.common.extensions.IHolderLookupProviderExtension {
Stream<ResourceKey<? extends Registry<?>>> listRegistries();

<T> Optional<HolderLookup.RegistryLookup<T>> lookup(ResourceKey<? extends Registry<? extends T>> p_256285_);
@@ -96,6 +_,11 @@
};
}
Expand Down
19 changes: 18 additions & 1 deletion patches/net/minecraft/data/DataGenerator.java.patch
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,17 @@
stopwatch1.start();
hashcache.applyUpdate(hashcache.generateUpdate(p_254418_, p_253750_::run).join());
stopwatch1.stop();
@@ -56,6 +_,34 @@
@@ -56,6 +_,51 @@
public DataGenerator.PackGenerator getBuiltinDatapack(boolean p_253826_, String p_254134_) {
Path path = this.vanillaPackOutput.getOutputFolder(PackOutput.Target.DATA_PACK).resolve("minecraft").resolve("datapacks").resolve(p_254134_);
return new DataGenerator.PackGenerator(p_253826_, p_254134_, new PackOutput(path));
+ }
+
+ public PackGenerator getBuiltinDatapack(boolean run, String namespace, String path) {
+ var packPath = vanillaPackOutput.getOutputFolder(PackOutput.Target.DATA_PACK).resolve(namespace).resolve("datapacks").resolve(path);
+ return new PackGenerator(run, namespace + '_' + path, new PackOutput(packPath));
+ }
+
+ public Map<String, DataProvider> getProvidersView() {
+ return this.providersView;
+ }
Expand All @@ -48,6 +53,18 @@
+ DataGenerator.this.providersToRun.put(id, provider);
+
+ return provider;
+ }
+
+ public void merge(DataGenerator other) {
+ other.providersToRun.forEach((id, provider) -> {
+ if(!allProviderIds.add(id))
+ throw new IllegalStateException("Duplicate provider: " + id);
+
+ providersToRun.put(id, provider);
+ });
+
+ other.providersToRun.clear();
+ other.allProviderIds.clear();
}

static {
62 changes: 55 additions & 7 deletions patches/net/minecraft/locale/Language.java.patch
Original file line number Diff line number Diff line change
@@ -1,34 +1,82 @@
--- a/net/minecraft/locale/Language.java
+++ b/net/minecraft/locale/Language.java
@@ -37,7 +_,8 @@
@@ -36,8 +_,10 @@
private static Language loadDefault() {
Builder<String, String> builder = ImmutableMap.builder();
BiConsumer<String, String> biconsumer = builder::put;
parseTranslations(biconsumer, "/assets/minecraft/lang/en_us.json");
- parseTranslations(biconsumer, "/assets/minecraft/lang/en_us.json");
- final Map<String, String> map = builder.build();
+ Map<String, net.minecraft.network.chat.Component> componentMap = new java.util.HashMap<>();
+ parseTranslations(biconsumer, componentMap::put, "/assets/minecraft/lang/en_us.json");
+ final Map<String, String> map = new java.util.HashMap<>(builder.build());
+ net.neoforged.neoforge.server.LanguageHook.captureLanguageMap(map);
+ net.neoforged.neoforge.server.LanguageHook.captureLanguageMap(map, componentMap);
return new Language() {
@Override
public String getOrDefault(String p_128127_, String p_265421_) {
@@ -64,6 +_,11 @@
@@ -64,21 +_,51 @@
)
.isPresent();
}
+
+ @Override
+ public Map<String, String> getLanguageData() {
+ return map;
+ }
+
+ @Override
+ public @org.jetbrains.annotations.Nullable net.minecraft.network.chat.Component getComponent(String key) {
+ return componentMap.get(key);
+ }
};
}

@@ -91,6 +_,9 @@
+ @Deprecated
private static void parseTranslations(BiConsumer<String, String> p_282031_, String p_283638_) {
+ parseTranslations(p_282031_, (key, value) -> {}, p_283638_);
+ }
+
+ private static void parseTranslations(BiConsumer<String, String> p_282031_, BiConsumer<String, net.minecraft.network.chat.Component> componentConsumer, String p_283638_) {
try (InputStream inputstream = Language.class.getResourceAsStream(p_283638_)) {
- loadFromJson(inputstream, p_282031_);
+ loadFromJson(inputstream, p_282031_, componentConsumer);
} catch (JsonParseException | IOException ioexception) {
LOGGER.error("Couldn't read strings from {}", p_283638_, ioexception);
}
}

public static void loadFromJson(InputStream p_128109_, BiConsumer<String, String> p_128110_) {
+ loadFromJson(p_128109_, p_128110_, (key, value) -> {});
+ }
+
+ public static void loadFromJson(InputStream p_128109_, BiConsumer<String, String> p_128110_, BiConsumer<String, net.minecraft.network.chat.Component> componentConsumer) {
JsonObject jsonobject = GSON.fromJson(new InputStreamReader(p_128109_, StandardCharsets.UTF_8), JsonObject.class);

for (Entry<String, JsonElement> entry : jsonobject.entrySet()) {
+ if (entry.getValue().isJsonArray()) {
+ var component = net.minecraft.network.chat.ComponentSerialization.CODEC
+ .parse(com.mojang.serialization.JsonOps.INSTANCE, entry.getValue())
+ .getOrThrow(msg -> new com.google.gson.JsonParseException("Error parsing translation for " + entry.getKey() + ": " + msg));
+
+ p_128110_.accept(entry.getKey(), component.getString());
+ componentConsumer.accept(entry.getKey(), component);
+
+ continue;
+ }
+
String s = UNSUPPORTED_FORMAT_PATTERN.matcher(GsonHelper.convertToString(entry.getValue(), entry.getKey())).replaceAll("%$1s");
p_128110_.accept(entry.getKey(), s);
}
@@ -90,6 +_,13 @@

public static void inject(Language p_128115_) {
instance = p_128115_;
}
+ }
+
+ // FORGE START
+ public Map<String, String> getLanguageData() { return ImmutableMap.of(); }
+
+ public @org.jetbrains.annotations.Nullable net.minecraft.network.chat.Component getComponent(String key) {
+ return null;
}

public String getOrDefault(String p_128111_) {
return this.getOrDefault(p_128111_, p_128111_);
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
--- a/net/minecraft/network/chat/ComponentSerialization.java
+++ b/net/minecraft/network/chat/ComponentSerialization.java
@@ -104,7 +_,7 @@

private static Codec<Component> createCodec(Codec<Component> p_304554_) {
ComponentContents.Type<?>[] type = new ComponentContents.Type[]{
- PlainTextContents.TYPE, TranslatableContents.TYPE, KeybindContents.TYPE, ScoreContents.TYPE, SelectorContents.TYPE, NbtContents.TYPE
+ PlainTextContents.TYPE, TranslatableContents.TYPE, KeybindContents.TYPE, ScoreContents.TYPE, SelectorContents.TYPE, NbtContents.TYPE, net.neoforged.neoforge.common.util.InsertingContents.TYPE
};
MapCodec<ComponentContents> mapcodec = createLegacyComponentMatcher(type, ComponentContents.Type::codec, ComponentContents::type, "type");
Codec<Component> codec = RecordCodecBuilder.create(
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,63 @@
+ }
}

@Override
@@ -92,6 +_,13 @@
Language language = Language.getInstance();
if (language != this.decomposedWith) {
this.decomposedWith = language;
+
+ Component langComponent = language.getComponent(this.key);
+ if (langComponent != null) {
+ this.decomposedParts = ImmutableList.of(langComponent);
+ return;
+ }
+
String s = this.fallback != null ? language.getOrDefault(this.key, this.fallback) : language.getOrDefault(this.key);

try {
@@ -170,6 +_,12 @@
public <T> Optional<T> visit(FormattedText.StyledContentConsumer<T> p_237521_, Style p_237522_) {
this.decompose();

+ if (!net.neoforged.neoforge.common.util.InsertingContents.pushTranslation(this)) {
+ // Reference cycle.
+ return Optional.empty();
+ }
+
+ try {
for (FormattedText formattedtext : this.decomposedParts) {
Optional<T> optional = formattedtext.visit(p_237521_, p_237522_);
if (optional.isPresent()) {
@@ -178,12 +_,21 @@
}

return Optional.empty();
+ } finally {
+ net.neoforged.neoforge.common.util.InsertingContents.popTranslation();
+ }
}

@Override
public <T> Optional<T> visit(FormattedText.ContentConsumer<T> p_237519_) {
this.decompose();

+ if (!net.neoforged.neoforge.common.util.InsertingContents.pushTranslation(this)) {
+ // Reference cycle.
+ return Optional.empty();
+ }
+
+ try {
for (FormattedText formattedtext : this.decomposedParts) {
Optional<T> optional = formattedtext.visit(p_237519_);
if (optional.isPresent()) {
@@ -192,6 +_,9 @@
}

return Optional.empty();
+ } finally {
+ net.neoforged.neoforge.common.util.InsertingContents.popTranslation();
+ }
}

@Override
9 changes: 9 additions & 0 deletions patches/net/minecraft/world/entity/animal/Rabbit.java.patch
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,12 @@
return false;
}

@@ -585,7 +_,7 @@
@Override
protected boolean isValidTarget(LevelReader p_29785_, BlockPos p_29786_) {
BlockState blockstate = p_29785_.getBlockState(p_29786_);
- if (blockstate.is(Blocks.FARMLAND) && this.wantsToRaid && !this.canRaid) {
+ if (blockstate.getBlock() instanceof net.minecraft.world.level.block.FarmBlock && this.wantsToRaid && !this.canRaid) {
blockstate = p_29785_.getBlockState(p_29786_.above());
if (blockstate.getBlock() instanceof CarrotBlock && ((CarrotBlock)blockstate.getBlock()).isMaxAge(blockstate)) {
this.canRaid = true;
9 changes: 9 additions & 0 deletions patches/net/minecraft/world/entity/animal/Wolf.java.patch
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,15 @@
return InteractionResult.sidedSuccess(this.level().isClientSide());
} else {
if (item instanceof DyeItem dyeitem && this.isOwnedBy(p_30412_)) {
@@ -440,7 +_,7 @@
this.setBodyArmorItem(itemstack.copyWithCount(1));
itemstack.consume(1, p_30412_);
return InteractionResult.SUCCESS;
- } else if (itemstack.is(Items.SHEARS)
+ } else if (itemstack.canPerformAction(net.neoforged.neoforge.common.ItemAbilities.SHEARS_REMOVE_ARMOR)
&& this.isOwnedBy(p_30412_)
&& this.hasArmor()
&& (!EnchantmentHelper.has(this.getBodyArmorItem(), EnchantmentEffectComponents.PREVENT_ARMOR_CHANGE) || p_30412_.isCreative())) {
@@ -488,7 +_,7 @@
}

Expand Down
18 changes: 8 additions & 10 deletions patches/net/minecraft/world/level/LevelReader.java.patch
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
--- a/net/minecraft/world/level/LevelReader.java
+++ b/net/minecraft/world/level/LevelReader.java
@@ -183,6 +_,10 @@
return this.hasChunkAt(p_46806_.getX(), p_46806_.getZ());
}
@@ -22,7 +_,7 @@
import net.minecraft.world.level.levelgen.Heightmap;
import net.minecraft.world.phys.AABB;

-public interface LevelReader extends BlockAndTintGetter, CollisionGetter, SignalGetter, BiomeManager.NoiseBiomeSource {
+public interface LevelReader extends BlockAndTintGetter, CollisionGetter, SignalGetter, BiomeManager.NoiseBiomeSource, net.neoforged.neoforge.common.extensions.ILevelReaderExtension {
@Nullable
ChunkAccess getChunk(int p_46823_, int p_46824_, ChunkStatus p_330944_, boolean p_46826_);

+ default boolean isAreaLoaded(BlockPos center, int range) {
+ return this.hasChunksAt(center.offset(-range, -range, -range), center.offset(range, range, range));
+ }
+
@Deprecated
default boolean hasChunksAt(BlockPos p_46833_, BlockPos p_46834_) {
return this.hasChunksAt(p_46833_.getX(), p_46833_.getY(), p_46833_.getZ(), p_46834_.getX(), p_46834_.getY(), p_46834_.getZ());
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
--- a/net/minecraft/world/level/block/AttachedStemBlock.java
+++ b/net/minecraft/world/level/block/AttachedStemBlock.java
@@ -84,7 +_,7 @@

@Override
protected boolean mayPlaceOn(BlockState p_48863_, BlockGetter p_48864_, BlockPos p_48865_) {
- return p_48863_.is(Blocks.FARMLAND);
+ return p_48863_.getBlock() instanceof net.minecraft.world.level.block.FarmBlock;
}

@Override
9 changes: 9 additions & 0 deletions patches/net/minecraft/world/level/block/BushBlock.java.patch
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
--- a/net/minecraft/world/level/block/BushBlock.java
+++ b/net/minecraft/world/level/block/BushBlock.java
@@ -20,7 +_,7 @@
protected abstract MapCodec<? extends BushBlock> codec();

protected boolean mayPlaceOn(BlockState p_51042_, BlockGetter p_51043_, BlockPos p_51044_) {
- return p_51042_.is(BlockTags.DIRT) || p_51042_.is(Blocks.FARMLAND);
+ return p_51042_.is(BlockTags.DIRT) || p_51042_.getBlock() instanceof net.minecraft.world.level.block.FarmBlock;
}

@Override
@@ -33,7 +_,10 @@
@Override
protected boolean canSurvive(BlockState p_51028_, LevelReader p_51029_, BlockPos p_51030_) {
Expand Down
Loading

0 comments on commit b25bdfb

Please sign in to comment.