From 8472ad3c1ddf487ba18c4ae5adcaf13921347444 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 26 May 2021 16:38:09 +0300 Subject: [PATCH] Enchantment Menu mixin, Tag API rename --- src/main/java/ru/bclib/BCLib.java | 4 +- .../bclib/api/{BCLibTags.java => TagAPI.java} | 2 +- .../bclib/mixin/common/BoneMealItemMixin.java | 4 +- .../mixin/common/EnchantmentMenuMixin.java | 140 ++++++++++++++++++ .../java/ru/bclib/util/StructureHelper.java | 8 +- .../world/features/NBTStructureFeature.java | 8 +- src/main/resources/bclib.mixins.common.json | 1 + 7 files changed, 154 insertions(+), 13 deletions(-) rename src/main/java/ru/bclib/api/{BCLibTags.java => TagAPI.java} (97%) create mode 100644 src/main/java/ru/bclib/mixin/common/EnchantmentMenuMixin.java diff --git a/src/main/java/ru/bclib/BCLib.java b/src/main/java/ru/bclib/BCLib.java index fc4704e9..2712ff6f 100644 --- a/src/main/java/ru/bclib/BCLib.java +++ b/src/main/java/ru/bclib/BCLib.java @@ -5,7 +5,7 @@ import net.fabricmc.api.ModInitializer; import net.fabricmc.loader.api.FabricLoader; import ru.bclib.util.Logger; import ru.bclib.world.surface.BCLSurfaceBuilders; -import ru.bclib.api.BCLibTags; +import ru.bclib.api.TagAPI; public class BCLib implements ModInitializer { public static final String MOD_ID = "bclib"; @@ -14,7 +14,7 @@ public class BCLib implements ModInitializer { @Override public void onInitialize() { BCLSurfaceBuilders.register(); - BCLibTags.init(); + TagAPI.init(); } public static boolean isDevEnvironment() { diff --git a/src/main/java/ru/bclib/api/BCLibTags.java b/src/main/java/ru/bclib/api/TagAPI.java similarity index 97% rename from src/main/java/ru/bclib/api/BCLibTags.java rename to src/main/java/ru/bclib/api/TagAPI.java index d27e5676..8a4accba 100644 --- a/src/main/java/ru/bclib/api/BCLibTags.java +++ b/src/main/java/ru/bclib/api/TagAPI.java @@ -16,7 +16,7 @@ import net.minecraft.world.level.block.Blocks; import ru.bclib.BCLib; import ru.bclib.util.TagHelper; -public class BCLibTags { +public class TagAPI { // Block Tags public static final Tag.Named BOOKSHELVES = makeCommonBlockTag("bookshelves"); public static final Tag.Named GEN_TERRAIN = makeBlockTag(BCLib.MOD_ID, "gen_terrain"); diff --git a/src/main/java/ru/bclib/mixin/common/BoneMealItemMixin.java b/src/main/java/ru/bclib/mixin/common/BoneMealItemMixin.java index 01df4312..dc2bec59 100644 --- a/src/main/java/ru/bclib/mixin/common/BoneMealItemMixin.java +++ b/src/main/java/ru/bclib/mixin/common/BoneMealItemMixin.java @@ -16,7 +16,7 @@ import net.minecraft.world.level.biome.Biome.BiomeCategory; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; -import ru.bclib.api.BCLibTags; +import ru.bclib.api.TagAPI; import ru.bclib.api.BiomeAPI; import ru.bclib.api.BonemealAPI; import ru.bclib.util.BlocksHelper; @@ -34,7 +34,7 @@ public class BoneMealItemMixin { BlockPos offseted = blockPos.relative(context.getClickedFace()); boolean endBiome = world.getBiome(offseted).getBiomeCategory() == BiomeCategory.THEEND; - if (world.getBlockState(blockPos).is(BCLibTags.END_GROUND)) { + if (world.getBlockState(blockPos).is(TagAPI.END_GROUND)) { boolean consume = false; if (world.getBlockState(blockPos).is(Blocks.END_STONE)) { BlockState nylium = bclib_getNylium(world, blockPos); diff --git a/src/main/java/ru/bclib/mixin/common/EnchantmentMenuMixin.java b/src/main/java/ru/bclib/mixin/common/EnchantmentMenuMixin.java new file mode 100644 index 00000000..d0af1dd8 --- /dev/null +++ b/src/main/java/ru/bclib/mixin/common/EnchantmentMenuMixin.java @@ -0,0 +1,140 @@ +package ru.bclib.mixin.common; + +import java.util.List; +import java.util.Random; + +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.callback.CallbackInfo; + +import net.minecraft.core.Registry; +import net.minecraft.world.Container; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.ContainerLevelAccess; +import net.minecraft.world.inventory.DataSlot; +import net.minecraft.world.inventory.EnchantmentMenu; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.EnchantmentInstance; +import ru.bclib.api.TagAPI; + +@Mixin(EnchantmentMenu.class) +public abstract class EnchantmentMenuMixin extends AbstractContainerMenu { + @Final + @Shadow + private Container enchantSlots; + + @Final + @Shadow + private ContainerLevelAccess access; + + @Final + @Shadow + private Random random; + + @Final + @Shadow + private DataSlot enchantmentSeed; + + @Shadow + @Final + public int[] costs; + + @Shadow + @Final + public int[] enchantClue; + + @Shadow + @Final + public int[] levelClue; + + protected EnchantmentMenuMixin(MenuType type, int syncId) { + super(type, syncId); + } + + @Inject(method = "slotsChanged", at = @At("HEAD"), cancellable = true) + private void be_slotsChanged(Container inventory, CallbackInfo info) { + if (inventory == this.enchantSlots) { + ItemStack itemStack = inventory.getItem(0); + if (!itemStack.isEmpty() && itemStack.isEnchantable()) { + this.access.execute((world, blockPos) -> { + int i = 0; + + int j; + for (j = -1; j <= 1; ++j) { + for (int k = -1; k <= 1; ++k) { + if ((j != 0 || k != 0) && world.isEmptyBlock(blockPos.offset(k, 0, j)) && world.isEmptyBlock(blockPos.offset(k, 1, j))) { + if (world.getBlockState(blockPos.offset(k * 2, 0, j * 2)).is(TagAPI.BOOKSHELVES)) { + ++i; + } + + if (world.getBlockState(blockPos.offset(k * 2, 1, j * 2)).is(TagAPI.BOOKSHELVES)) { + ++i; + } + + if (k != 0 && j != 0) { + if (world.getBlockState(blockPos.offset(k * 2, 0, j)).is(TagAPI.BOOKSHELVES)) { + ++i; + } + + if (world.getBlockState(blockPos.offset(k * 2, 1, j)).is(TagAPI.BOOKSHELVES)) { + ++i; + } + + if (world.getBlockState(blockPos.offset(k, 0, j * 2)).is(TagAPI.BOOKSHELVES)) { + ++i; + } + + if (world.getBlockState(blockPos.offset(k, 1, j * 2)).is(TagAPI.BOOKSHELVES)) { + ++i; + } + } + } + } + } + + random.setSeed(enchantmentSeed.get()); + + for (j = 0; j < 3; ++j) { + costs[j] = EnchantmentHelper.getEnchantmentCost(this.random, j, i, itemStack); + enchantClue[j] = -1; + levelClue[j] = -1; + if (costs[j] < j + 1) { + costs[j] = 0; + } + } + + for (j = 0; j < 3; ++j) { + if (this.costs[j] > 0) { + List list = this.getEnchantmentList(itemStack, j, this.costs[j]); + if (list != null && !list.isEmpty()) { + EnchantmentInstance enchantmentLevelEntry = (EnchantmentInstance) list.get(this.random.nextInt(list.size())); + enchantClue[j] = Registry.ENCHANTMENT.getId(enchantmentLevelEntry.enchantment); + levelClue[j] = enchantmentLevelEntry.level; + } + } + } + + broadcastChanges(); + }); + } + else { + for (int i = 0; i < 3; ++i) { + costs[i] = 0; + enchantClue[i] = -1; + levelClue[i] = -1; + } + } + info.cancel(); + } + } + + @Shadow + private List getEnchantmentList(ItemStack stack, int slot, int level) { + return null; + } +} diff --git a/src/main/java/ru/bclib/util/StructureHelper.java b/src/main/java/ru/bclib/util/StructureHelper.java index f0cc810a..205676bc 100644 --- a/src/main/java/ru/bclib/util/StructureHelper.java +++ b/src/main/java/ru/bclib/util/StructureHelper.java @@ -27,7 +27,7 @@ import net.minecraft.world.level.levelgen.structure.BoundingBox; import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; import net.minecraft.world.level.material.Material; -import ru.bclib.api.BCLibTags; +import ru.bclib.api.TagAPI; public class StructureHelper { private static final Direction[] DIR = BlocksHelper.makeHorizontal(); @@ -264,7 +264,7 @@ public class StructureHelper { private static boolean isTerrainNear(WorldGenLevel world, BlockPos pos) { for (Direction dir: BlocksHelper.DIRECTIONS) { - if (world.getBlockState(pos.relative(dir)).is(BCLibTags.GEN_TERRAIN)) { + if (world.getBlockState(pos.relative(dir)).is(TagAPI.GEN_TERRAIN)) { return true; } } @@ -344,7 +344,7 @@ public class StructureHelper { private static boolean ignore(BlockState state) { return state.getMaterial().isReplaceable() || !state.getFluidState().isEmpty() || - state.is(BCLibTags.END_GROUND) || + state.is(TagAPI.END_GROUND) || state.is(BlockTags.LOGS) || state.is(BlockTags.LEAVES) || state.getMaterial().equals(Material.PLANT) || @@ -362,7 +362,7 @@ public class StructureHelper { for (int y = bounds.y1; y >= bounds.y0; y--) { mut.setY(y); BlockState state = world.getBlockState(mut); - if (state.is(BCLibTags.END_GROUND) && !world.getBlockState(mut.above()).getMaterial().isSolidBlocking()) { + if (state.is(TagAPI.END_GROUND) && !world.getBlockState(mut.above()).getMaterial().isSolidBlocking()) { BlocksHelper.setWithoutUpdate(world, mut, top); } } diff --git a/src/main/java/ru/bclib/world/features/NBTStructureFeature.java b/src/main/java/ru/bclib/world/features/NBTStructureFeature.java index 7422e599..27bf3d1d 100644 --- a/src/main/java/ru/bclib/world/features/NBTStructureFeature.java +++ b/src/main/java/ru/bclib/world/features/NBTStructureFeature.java @@ -22,7 +22,7 @@ import net.minecraft.world.level.levelgen.structure.BoundingBox; import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilderConfiguration; -import ru.bclib.api.BCLibTags; +import ru.bclib.api.TagAPI; import ru.bclib.api.BiomeAPI; import ru.bclib.util.BlocksHelper; import ru.bclib.world.processors.DestructionStructureProcessor; @@ -124,11 +124,11 @@ public abstract class NBTStructureFeature extends DefaultFeature { mut.setZ(z); mut.setY(surfMax); BlockState state = world.getBlockState(mut); - if (!state.is(BCLibTags.GEN_TERRAIN) && state.isFaceSturdy(world, mut, Direction.DOWN)) { + if (!state.is(TagAPI.GEN_TERRAIN) && state.isFaceSturdy(world, mut, Direction.DOWN)) { for (int i = 0; i < 10; i++) { mut.setY(mut.getY() - 1); BlockState stateSt = world.getBlockState(mut); - if (!stateSt.is(BCLibTags.GEN_TERRAIN)) { + if (!stateSt.is(TagAPI.GEN_TERRAIN)) { if (merge == TerrainMerge.SURFACE) { SurfaceBuilderConfiguration config = world.getBiome(mut).getGenerationSettings().getSurfaceBuilderConfig(); boolean isTop = mut.getY() == surfMax && state.getMaterial().isSolidBlocking(); @@ -140,7 +140,7 @@ public abstract class NBTStructureFeature extends DefaultFeature { } } else { - if (stateSt.is(BCLibTags.END_GROUND) && state.getMaterial().isSolidBlocking()) { + if (stateSt.is(TagAPI.END_GROUND) && state.getMaterial().isSolidBlocking()) { if (merge == TerrainMerge.SURFACE) { SurfaceBuilderConfiguration config = world.getBiome(mut).getGenerationSettings() .getSurfaceBuilderConfig(); diff --git a/src/main/resources/bclib.mixins.common.json b/src/main/resources/bclib.mixins.common.json index 874c057c..e90d188a 100644 --- a/src/main/resources/bclib.mixins.common.json +++ b/src/main/resources/bclib.mixins.common.json @@ -7,6 +7,7 @@ "ComposterBlockAccessor", "PotionBrewingAccessor", "RecipeManagerAccessor", + "EnchantmentMenuMixin", "RecipeManagerMixin", "BoneMealItemMixin", "TagLoaderMixin"