-
Notifications
You must be signed in to change notification settings - Fork 5
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Neo 1.20.1 should now compile with Kilt. Just need to fix injects.
- Loading branch information
Showing
50 changed files
with
1,085 additions
and
272 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Submodule forge
updated
59 files
44 changes: 44 additions & 0 deletions
44
...in/java/xyz/bluspring/kilt/forgeinjects/client/renderer/texture/SpriteContentsInject.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
package xyz.bluspring.kilt.forgeinjects.client.renderer.texture; | ||
|
||
import com.mojang.blaze3d.platform.NativeImage; | ||
import net.minecraft.client.renderer.texture.SpriteContents; | ||
import net.minecraft.client.resources.metadata.animation.AnimationMetadataSection; | ||
import net.minecraft.client.resources.metadata.animation.FrameSize; | ||
import net.minecraft.resources.ResourceLocation; | ||
import net.minecraftforge.client.textures.ForgeTextureMetadata; | ||
import org.jetbrains.annotations.Nullable; | ||
import org.spongepowered.asm.mixin.Final; | ||
import org.spongepowered.asm.mixin.Mixin; | ||
import org.spongepowered.asm.mixin.Shadow; | ||
import xyz.bluspring.kilt.helpers.mixin.CreateInitializer; | ||
import xyz.bluspring.kilt.injections.client.renderer.texture.SpriteContentsInjection; | ||
|
||
@Mixin(SpriteContents.class) | ||
public class SpriteContentsInject implements SpriteContentsInjection { | ||
@Shadow @Final private NativeImage originalImage; | ||
@Nullable | ||
public ForgeTextureMetadata forgeMeta; | ||
|
||
public SpriteContentsInject(ResourceLocation name, FrameSize frameSize, NativeImage originalImage, AnimationMetadataSection metadata) {} | ||
|
||
@CreateInitializer | ||
public SpriteContentsInject(ResourceLocation name, FrameSize frameSize, NativeImage originalImage, AnimationMetadataSection metadata, @Nullable ForgeTextureMetadata forgeMeta) { | ||
this.forgeMeta = forgeMeta; | ||
} | ||
|
||
|
||
@Override | ||
public NativeImage getOriginalImage() { | ||
return this.originalImage; | ||
} | ||
|
||
@Override | ||
public ForgeTextureMetadata kilt$getForgeMeta() { | ||
return this.forgeMeta; | ||
} | ||
|
||
@Override | ||
public void kilt$setForgeMeta(ForgeTextureMetadata metadata) { | ||
this.forgeMeta = metadata; | ||
} | ||
} |
21 changes: 21 additions & 0 deletions
21
src/main/java/xyz/bluspring/kilt/forgeinjects/core/RegistrySetBuilderInject.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
package xyz.bluspring.kilt.forgeinjects.core; | ||
|
||
import net.minecraft.core.Registry; | ||
import net.minecraft.core.RegistrySetBuilder; | ||
import net.minecraft.resources.ResourceKey; | ||
import org.spongepowered.asm.mixin.Final; | ||
import org.spongepowered.asm.mixin.Mixin; | ||
import org.spongepowered.asm.mixin.Shadow; | ||
import xyz.bluspring.kilt.injections.core.RegistrySetBuilderInjection; | ||
|
||
import java.util.List; | ||
|
||
@Mixin(RegistrySetBuilder.class) | ||
public class RegistrySetBuilderInject implements RegistrySetBuilderInjection { | ||
@Shadow @Final public List<RegistrySetBuilder.RegistryStub<?>> entries; | ||
|
||
@Override | ||
public List<? extends ResourceKey<? extends Registry<?>>> getEntryKeys() { | ||
return this.entries.stream().map(RegistrySetBuilder.RegistryStub::key).toList(); | ||
} | ||
} |
54 changes: 34 additions & 20 deletions
54
src/main/java/xyz/bluspring/kilt/forgeinjects/data/DataGeneratorInject.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,43 +1,57 @@ | ||
package xyz.bluspring.kilt.forgeinjects.data; | ||
|
||
import net.minecraft.WorldVersion; | ||
import net.minecraft.data.DataGenerator; | ||
import net.minecraft.data.DataProvider; | ||
import org.apache.commons.compress.utils.Lists; | ||
import org.objectweb.asm.Opcodes; | ||
import net.minecraft.data.PackOutput; | ||
import org.spongepowered.asm.mixin.Final; | ||
import org.spongepowered.asm.mixin.Mixin; | ||
import org.spongepowered.asm.mixin.Shadow; | ||
import org.spongepowered.asm.mixin.injection.At; | ||
import org.spongepowered.asm.mixin.injection.Inject; | ||
import org.spongepowered.asm.mixin.injection.ModifyVariable; | ||
import org.spongepowered.asm.mixin.injection.Redirect; | ||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; | ||
import org.spongepowered.asm.mixin.Unique; | ||
import xyz.bluspring.kilt.injections.data.DataGeneratorInjection; | ||
import xyz.bluspring.kilt.mixin.DataGeneratorAccessor; | ||
|
||
import java.nio.file.Path; | ||
import java.util.Collection; | ||
import java.util.List; | ||
import java.util.Collections; | ||
import java.util.Map; | ||
import java.util.Set; | ||
|
||
@Mixin(DataGenerator.class) | ||
public class DataGeneratorInject implements DataGeneratorInjection { | ||
@Shadow @Final private Collection<Path> inputFolders; | ||
@Shadow @Final private Map<String, DataProvider> providersToRun; | ||
@Shadow @Final private PackOutput vanillaPackOutput; | ||
@Shadow @Final private Path rootOutputFolder; | ||
@Shadow @Final private Set<String> allProviderIds; | ||
@Unique private final Map<String, DataProvider> providersView = Collections.unmodifiableMap(this.providersToRun); | ||
|
||
@Shadow @Final private List<DataProvider> allProviders; | ||
@Override | ||
public Map<String, DataProvider> getProvidersView() { | ||
return this.providersView; | ||
} | ||
|
||
@Redirect(at = @At(value = "FIELD", target = "Lnet/minecraft/data/DataGenerator;inputFolders:Ljava/util/Collection;", opcode = Opcodes.PUTFIELD), method = "<init>") | ||
public void kilt$makeInputsMutable(DataGenerator instance, Collection<Path> value) { | ||
((DataGeneratorAccessor) instance).setInputFolders(Lists.newArrayList(value.iterator())); | ||
@Override | ||
public PackOutput getPackOutput() { | ||
return this.vanillaPackOutput; | ||
} | ||
|
||
@Override | ||
public List<DataProvider> getProviders() { | ||
return this.allProviders; | ||
public PackOutput getPackOutput(String path) { | ||
return new PackOutput(this.rootOutputFolder.resolve(path)); | ||
} | ||
|
||
@Override | ||
public void addInput(Path value) { | ||
inputFolders.add(value); | ||
public <T extends DataProvider> T addProvider(boolean run, DataProvider.Factory<T> factory) { | ||
return addProvider(run, factory.create(this.vanillaPackOutput)); | ||
} | ||
|
||
@Override | ||
public <T extends DataProvider> T addProvider(boolean run, T provider) { | ||
var id = provider.getName(); | ||
|
||
if (!this.allProviderIds.add(id)) | ||
throw new IllegalStateException("Duplicate provider: " + id); | ||
|
||
if (run) | ||
this.providersToRun.put(id, provider); | ||
|
||
return provider; | ||
} | ||
} |
162 changes: 12 additions & 150 deletions
162
src/main/java/xyz/bluspring/kilt/forgeinjects/data/recipes/RecipeProviderInject.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,162 +1,24 @@ | ||
package xyz.bluspring.kilt.forgeinjects.data.recipes; | ||
|
||
import com.google.gson.JsonObject; | ||
import net.minecraft.data.CachedOutput; | ||
import net.minecraft.data.DataProvider; | ||
import net.minecraft.data.PackOutput; | ||
import net.minecraft.data.recipes.FinishedRecipe; | ||
import net.minecraft.data.recipes.RecipeProvider; | ||
import net.minecraft.data.recipes.ShapedRecipeBuilder; | ||
import net.minecraft.data.recipes.ShapelessRecipeBuilder; | ||
import net.minecraft.resources.ResourceLocation; | ||
import net.minecraft.tags.TagKey; | ||
import net.minecraft.world.item.Item; | ||
import net.minecraft.world.item.ItemStack; | ||
import net.minecraft.world.item.Items; | ||
import net.minecraft.world.item.crafting.Ingredient; | ||
import net.minecraft.world.level.ItemLike; | ||
import net.minecraft.world.level.block.Blocks; | ||
import net.minecraftforge.common.Tags; | ||
import net.minecraftforge.registries.ForgeRegistries; | ||
import org.jetbrains.annotations.Nullable; | ||
import org.spongepowered.asm.mixin.Mixin; | ||
import org.spongepowered.asm.mixin.injection.*; | ||
import org.spongepowered.asm.mixin.Shadow; | ||
import xyz.bluspring.kilt.injections.data.recipes.RecipeProviderInjection; | ||
|
||
import java.lang.reflect.Field; | ||
import java.util.*; | ||
import java.util.function.Consumer; | ||
import java.util.concurrent.CompletableFuture; | ||
|
||
@Mixin(RecipeProvider.class) | ||
public class RecipeProviderInject { | ||
private static final Map<Item, TagKey<Item>> replacements = new HashMap<>(); | ||
private static final Set<ResourceLocation> excludes = new HashSet<>(); | ||
public class RecipeProviderInject implements RecipeProviderInjection { | ||
@Shadow public PackOutput.PathProvider advancementPathProvider; | ||
|
||
private static void exclude(ItemLike item) | ||
{ | ||
excludes.add(ForgeRegistries.ITEMS.getKey(item.asItem())); | ||
} | ||
|
||
private static void replace(ItemLike item, TagKey<Item> tag) | ||
{ | ||
replacements.put(item.asItem(), tag); | ||
} | ||
|
||
@Nullable | ||
private static FinishedRecipe enhance(FinishedRecipe vanilla) | ||
{ | ||
if (vanilla instanceof ShapelessRecipeBuilder.Result shapeless) | ||
return enhance(shapeless); | ||
if (vanilla instanceof ShapedRecipeBuilder.Result shaped) | ||
return enhance(shaped); | ||
return null; | ||
} | ||
|
||
@Nullable | ||
private static FinishedRecipe enhance(ShapelessRecipeBuilder.Result vanilla) | ||
{ | ||
List<Ingredient> ingredients = getField(ShapelessRecipeBuilder.Result.class, vanilla, 4); | ||
boolean modified = false; | ||
for (int x = 0; x < ingredients.size(); x++) | ||
{ | ||
Ingredient ing = enhance(vanilla.getId(), ingredients.get(x)); | ||
if (ing != null) | ||
{ | ||
ingredients.set(x, ing); | ||
modified = true; | ||
} | ||
} | ||
return modified ? vanilla : null; | ||
} | ||
|
||
@Nullable | ||
private static FinishedRecipe enhance(ShapedRecipeBuilder.Result vanilla) | ||
{ | ||
Map<Character, Ingredient> ingredients = getField(ShapedRecipeBuilder.Result.class, vanilla, 5); | ||
boolean modified = false; | ||
for (Character x : ingredients.keySet()) | ||
{ | ||
Ingredient ing = enhance(vanilla.getId(), ingredients.get(x)); | ||
if (ing != null) | ||
{ | ||
ingredients.put(x, ing); | ||
modified = true; | ||
} | ||
} | ||
return modified ? vanilla : null; | ||
} | ||
|
||
@Nullable | ||
private static Ingredient enhance(ResourceLocation name, Ingredient vanilla) | ||
{ | ||
if (excludes.contains(name)) | ||
return null; | ||
|
||
boolean modified = false; | ||
List<Ingredient.Value> items = new ArrayList<>(); | ||
Ingredient.Value[] vanillaItems = getField(Ingredient.class, vanilla, 2); //This will probably crash between versions, if null fix index | ||
for (Ingredient.Value entry : vanillaItems) | ||
{ | ||
if (entry instanceof Ingredient.ItemValue) | ||
{ | ||
ItemStack stack = entry.getItems().stream().findFirst().orElse(ItemStack.EMPTY); | ||
TagKey<Item> replacement = replacements.get(stack.getItem()); | ||
if (replacement != null) | ||
{ | ||
items.add(new Ingredient.TagValue(replacement)); | ||
modified = true; | ||
} else | ||
items.add(entry); | ||
} else | ||
items.add(entry); | ||
} | ||
return modified ? Ingredient.fromValues(items.stream()) : null; | ||
} | ||
|
||
@SuppressWarnings("unchecked") | ||
private static <T, R> R getField(Class<T> clz, T inst, int index) | ||
{ | ||
Field fld = clz.getDeclaredFields()[index]; | ||
fld.setAccessible(true); | ||
try | ||
{ | ||
return (R) fld.get(inst); | ||
} catch (IllegalArgumentException | IllegalAccessException e) | ||
{ | ||
throw new RuntimeException(e); | ||
} | ||
} | ||
|
||
@ModifyVariable(at = @At("HEAD"), method = "buildCraftingRecipes", argsOnly = true) | ||
private static Consumer<FinishedRecipe> kilt$replaceRecipes(Consumer<FinishedRecipe> consumer) { | ||
replace(Items.STICK, Tags.Items.RODS_WOODEN); | ||
replace(Items.GOLD_INGOT, Tags.Items.INGOTS_GOLD); | ||
replace(Items.IRON_INGOT, Tags.Items.INGOTS_IRON); | ||
replace(Items.NETHERITE_INGOT, Tags.Items.INGOTS_NETHERITE); | ||
replace(Items.COPPER_INGOT, Tags.Items.INGOTS_COPPER); | ||
replace(Items.AMETHYST_SHARD, Tags.Items.GEMS_AMETHYST); | ||
replace(Items.DIAMOND, Tags.Items.GEMS_DIAMOND); | ||
replace(Items.EMERALD, Tags.Items.GEMS_EMERALD); | ||
replace(Items.CHEST, Tags.Items.CHESTS_WOODEN); | ||
replace(Blocks.COBBLESTONE, Tags.Items.COBBLESTONE_NORMAL); | ||
replace(Blocks.COBBLED_DEEPSLATE, Tags.Items.COBBLESTONE_DEEPSLATE); | ||
|
||
exclude(Blocks.GOLD_BLOCK); | ||
exclude(Items.GOLD_NUGGET); | ||
exclude(Blocks.IRON_BLOCK); | ||
exclude(Items.IRON_NUGGET); | ||
exclude(Blocks.DIAMOND_BLOCK); | ||
exclude(Blocks.EMERALD_BLOCK); | ||
exclude(Blocks.NETHERITE_BLOCK); | ||
exclude(Blocks.COPPER_BLOCK); | ||
exclude(Blocks.AMETHYST_BLOCK); | ||
|
||
exclude(Blocks.COBBLESTONE_STAIRS); | ||
exclude(Blocks.COBBLESTONE_SLAB); | ||
exclude(Blocks.COBBLESTONE_WALL); | ||
exclude(Blocks.COBBLED_DEEPSLATE_STAIRS); | ||
exclude(Blocks.COBBLED_DEEPSLATE_SLAB); | ||
exclude(Blocks.COBBLED_DEEPSLATE_WALL); | ||
|
||
return (vanilla) -> { | ||
FinishedRecipe modified = enhance(vanilla); | ||
if (modified != null) | ||
consumer.accept(modified); | ||
}; | ||
@Override | ||
public @Nullable CompletableFuture<?> saveAdvancement(CachedOutput output, FinishedRecipe finishedRecipe, JsonObject advancementJson) { | ||
return DataProvider.saveStable(output, advancementJson, this.advancementPathProvider.json(finishedRecipe.getAdvancementId())); | ||
} | ||
} |
16 changes: 16 additions & 0 deletions
16
src/main/java/xyz/bluspring/kilt/forgeinjects/data/registries/VanillaRegistriesInject.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
package xyz.bluspring.kilt.forgeinjects.data.registries; | ||
|
||
import net.minecraft.core.Registry; | ||
import net.minecraft.data.registries.VanillaRegistries; | ||
import net.minecraft.resources.ResourceKey; | ||
import org.spongepowered.asm.mixin.Mixin; | ||
import xyz.bluspring.kilt.helpers.mixin.CreateStatic; | ||
import xyz.bluspring.kilt.injections.data.registries.VanillaRegistriesInjection; | ||
|
||
import java.util.List; | ||
|
||
@Mixin(VanillaRegistries.class) | ||
public class VanillaRegistriesInject { | ||
@CreateStatic | ||
private static final List<? extends ResourceKey<? extends Registry<?>>> DATAPACK_REGISTRY_KEYS = VanillaRegistriesInjection.DATAPACK_REGISTRY_KEYS; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.