diff --git a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java b/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java index bc56ef92..53b58e00 100644 --- a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java @@ -29,6 +29,7 @@ import ru.betterend.blocks.basis.BlockTrapdoor; import ru.betterend.blocks.basis.BlockWoodenButton; import ru.betterend.recipe.builders.GridRecipe; import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndTags; import ru.betterend.util.TagHelper; public class WoodenMaterial { @@ -99,6 +100,7 @@ public class WoodenMaterial { GridRecipe.make(name + "_sign", sign).setOutputCount(3).setShape("###", "###", " I ").addMaterial('#', planks).addMaterial('I', Items.STICK).setGroup("end_signs").build(); GridRecipe.make(name + "_chest", chest).setShape("###", "# #", "###").addMaterial('#', planks).setGroup("end_chests").build(); GridRecipe.make(name + "_barrel", barrel).setShape("#S#", "# #", "#S#").addMaterial('#', planks).addMaterial('S', slab).setGroup("end_barrels").build(); + GridRecipe.make(name + "_bookshelf", shelf).setShape("###", "PPP", "###").addMaterial('#', planks).addMaterial('P', Items.PAPER).setGroup("end_bookshelves").build(); // Item Tags // TagHelper.addTag(ItemTags.PLANKS, planks); @@ -125,6 +127,7 @@ public class WoodenMaterial { TagHelper.addTags(slab, BlockTags.WOODEN_SLABS, BlockTags.SLABS); TagHelper.addTags(stairs, BlockTags.WOODEN_STAIRS, BlockTags.STAIRS); TagHelper.addTags(trapdoor, BlockTags.WOODEN_TRAPDOORS, BlockTags.TRAPDOORS); + TagHelper.addTag(EndTags.BOOKSHELVES, shelf); } public boolean isTreeLog(Block block) { diff --git a/src/main/java/ru/betterend/mixin/client/EnchantingTableBlockMixin.java b/src/main/java/ru/betterend/mixin/client/EnchantingTableBlockMixin.java new file mode 100644 index 00000000..113e3c27 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/client/EnchantingTableBlockMixin.java @@ -0,0 +1,46 @@ +package ru.betterend.mixin.client; + +import java.util.Random; + +import org.spongepowered.asm.mixin.Mixin; +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.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.EnchantingTableBlock; +import net.minecraft.particle.ParticleTypes; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import ru.betterend.registry.EndTags; + +@Mixin(EnchantingTableBlock.class) +public abstract class EnchantingTableBlockMixin extends Block { + public EnchantingTableBlockMixin(Settings settings) { + super(settings); + } + + @Inject(method = "randomDisplayTick", at = @At(value = "TAIL")) + private void beOnRandomDisplayTick(BlockState state, World world, BlockPos pos, Random random, CallbackInfo info) { + for (int px = -2; px <= 2; ++px) { + for (int pz = -2; pz <= 2; ++pz) { + if (px > -2 && px < 2 && pz == -1) { + pz = 2; + } + if (random.nextInt(16) == 0) { + for (int py = 0; py <= 1; ++py) { + BlockPos blockPos = pos.add(px, py, pz); + if (world.getBlockState(blockPos).isIn(EndTags.BOOKSHELVES)) { + if (!world.isAir(pos.add(px / 2, 0, pz / 2))) { + break; + } + world.addParticle(ParticleTypes.ENCHANT, pos.getX() + 0.5, pos.getY() + 2.0, pos.getZ() + 0.5, px + random.nextFloat() - 0.5, py - random.nextFloat() - 1.0, pz + random.nextFloat() - 0.5); + } + } + } + } + } + + } +} diff --git a/src/main/java/ru/betterend/mixin/common/EnchantmentScreenHandlerMixin.java b/src/main/java/ru/betterend/mixin/common/EnchantmentScreenHandlerMixin.java new file mode 100644 index 00000000..669666ea --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/EnchantmentScreenHandlerMixin.java @@ -0,0 +1,140 @@ +package ru.betterend.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.enchantment.EnchantmentHelper; +import net.minecraft.enchantment.EnchantmentLevelEntry; +import net.minecraft.inventory.Inventory; +import net.minecraft.item.ItemStack; +import net.minecraft.screen.EnchantmentScreenHandler; +import net.minecraft.screen.Property; +import net.minecraft.screen.ScreenHandler; +import net.minecraft.screen.ScreenHandlerContext; +import net.minecraft.screen.ScreenHandlerType; +import net.minecraft.util.registry.Registry; +import ru.betterend.registry.EndTags; + +@Mixin(EnchantmentScreenHandler.class) +public abstract class EnchantmentScreenHandlerMixin extends ScreenHandler { + @Shadow + @Final + private Inventory inventory; + + @Shadow + @Final + private ScreenHandlerContext context; + + @Shadow + @Final + private Random random; + + @Shadow + @Final + private Property seed; + + @Shadow + @Final + public int[] enchantmentPower; + + @Shadow + @Final + public int[] enchantmentId; + + @Shadow + @Final + public int[] enchantmentLevel; + + protected EnchantmentScreenHandlerMixin(ScreenHandlerType type, int syncId) { + super(type, syncId); + } + + @Inject(method = "onContentChanged", at = @At("HEAD"), cancellable = true) + private void beOnContentChanged(Inventory inventory, CallbackInfo info) { + if (inventory == this.inventory) { + ItemStack itemStack = inventory.getStack(0); + if (!itemStack.isEmpty() && itemStack.isEnchantable()) { + this.context.run((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.isAir(blockPos.add(k, 0, j)) && world.isAir(blockPos.add(k, 1, j))) { + if (world.getBlockState(blockPos.add(k * 2, 0, j * 2)).isIn(EndTags.BOOKSHELVES)) { + ++i; + } + + if (world.getBlockState(blockPos.add(k * 2, 1, j * 2)).isIn(EndTags.BOOKSHELVES)) { + ++i; + } + + if (k != 0 && j != 0) { + if (world.getBlockState(blockPos.add(k * 2, 0, j)).isIn(EndTags.BOOKSHELVES)) { + ++i; + } + + if (world.getBlockState(blockPos.add(k * 2, 1, j)).isIn(EndTags.BOOKSHELVES)) { + ++i; + } + + if (world.getBlockState(blockPos.add(k, 0, j * 2)).isIn(EndTags.BOOKSHELVES)) { + ++i; + } + + if (world.getBlockState(blockPos.add(k, 1, j * 2)).isIn(EndTags.BOOKSHELVES)) { + ++i; + } + } + } + } + } + + this.random.setSeed((long) this.seed.get()); + + for (j = 0; j < 3; ++j) { + this.enchantmentPower[j] = EnchantmentHelper.calculateRequiredExperienceLevel(this.random, j, i, itemStack); + this.enchantmentId[j] = -1; + this.enchantmentLevel[j] = -1; + if (this.enchantmentPower[j] < j + 1) { + this.enchantmentPower[j] = 0; + } + } + + for (j = 0; j < 3; ++j) { + if (this.enchantmentPower[j] > 0) { + List list = this.generateEnchantments(itemStack, j, this.enchantmentPower[j]); + if (list != null && !list.isEmpty()) { + EnchantmentLevelEntry enchantmentLevelEntry = (EnchantmentLevelEntry) list.get(this.random.nextInt(list.size())); + this.enchantmentId[j] = Registry.ENCHANTMENT.getRawId(enchantmentLevelEntry.enchantment); + this.enchantmentLevel[j] = enchantmentLevelEntry.level; + } + } + } + + this.sendContentUpdates(); + }); + } + else { + for (int i = 0; i < 3; ++i) { + this.enchantmentPower[i] = 0; + this.enchantmentId[i] = -1; + this.enchantmentLevel[i] = -1; + } + } + info.cancel(); + } + } + + @Shadow + private List generateEnchantments(ItemStack stack, int slot, int level) { + return null; + } +} diff --git a/src/main/java/ru/betterend/registry/EndTags.java b/src/main/java/ru/betterend/registry/EndTags.java index d096806d..2d038cc6 100644 --- a/src/main/java/ru/betterend/registry/EndTags.java +++ b/src/main/java/ru/betterend/registry/EndTags.java @@ -25,12 +25,21 @@ public class EndTags { // Block Tags public static final Tag.Identified END_GROUND = makeTag("end_ground"); public static final Tag.Identified GEN_TERRAIN = makeTag("gen_terrain"); + public static final Tag.Identified BOOKSHELVES = makeCommonTag("bookshelves"); // Item Tags public final static Tag HAMMERS = registerFabricItemTag("hammers"); private static Tag.Identified makeTag(String name) { - return (Identified) TagRegistry.block(BetterEnd.makeID(name)); + Identifier id = BetterEnd.makeID(name); + Tag tag = BlockTags.getTagGroup().getTag(id); + return tag == null ? (Identified) TagRegistry.block(id) : (Identified) tag; + } + + private static Tag.Identified makeCommonTag(String name) { + Identifier id = new Identifier("c", name); + Tag tag = BlockTags.getTagGroup().getTag(id); + return tag == null ? (Identified) TagRegistry.block(id) : (Identified) tag; } public static void register() { diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index 95ae0cfc..1e7d1768 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -259,5 +259,11 @@ "block.betterend.dragon_tree_sapling": "Dragon Tree Sapling", "block.betterend.shadow_grass": "Shadow Grass", "block.betterend.shadow_grass_path": "Shadow Grass Path", - "block.betterend.shadow_plant": "Shadow Plant" + "block.betterend.shadow_plant": "Shadow Plant", + + "block.betterend.dragon_tree_bookshelf": "Dragon Tree Bookshelf", + "block.betterend.end_lotus_bookshelf": "End Lotus Bookshelf", + "block.betterend.lacugrove_bookshelf": "Lacugrove Bookshelf", + "block.betterend.mossy_glowshroom_bookshelf": "Mossy Glowshroom Bookshelf", + "block.betterend.pythadendron_bookshelf": "Pythadendron Bookshelf" } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index bc30a347..ac1d8ce3 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -261,5 +261,11 @@ "block.betterend.dragon_tree_sapling": "Саженец драконова древа", "block.betterend.shadow_grass": "Теневая трава", "block.betterend.shadow_grass_path": "Тропа из теневой травы", - "block.betterend.shadow_plant": "Теневое растение" + "block.betterend.shadow_plant": "Теневое растение", + + "block.betterend.dragon_tree_bookshelf": "Книжные полки из драконова древа", + "block.betterend.end_lotus_bookshelf": "Книжные полки из лотоса края", + "block.betterend.lacugrove_bookshelf": "Книжные полки из оземангра", + "block.betterend.mossy_glowshroom_bookshelf": "Книжные полки из мшистого светогриба", + "block.betterend.pythadendron_bookshelf": "Книжные полки из пифадендрона" } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/block/dragon_tree_bookshelf.png b/src/main/resources/assets/betterend/textures/block/dragon_tree_bookshelf.png new file mode 100644 index 00000000..ff3963fe Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/dragon_tree_bookshelf.png differ diff --git a/src/main/resources/assets/betterend/textures/block/end_lotus_bookshelf.png b/src/main/resources/assets/betterend/textures/block/end_lotus_bookshelf.png new file mode 100644 index 00000000..dd76c8c4 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/end_lotus_bookshelf.png differ diff --git a/src/main/resources/assets/betterend/textures/block/lacugrove_bookshelf.png b/src/main/resources/assets/betterend/textures/block/lacugrove_bookshelf.png new file mode 100644 index 00000000..4cee5809 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/lacugrove_bookshelf.png differ diff --git a/src/main/resources/assets/betterend/textures/block/pythadendron_bookshelf.png b/src/main/resources/assets/betterend/textures/block/pythadendron_bookshelf.png new file mode 100644 index 00000000..8c45748f Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/pythadendron_bookshelf.png differ diff --git a/src/main/resources/betterend.mixins.client.json b/src/main/resources/betterend.mixins.client.json index 5be4b250..70fbfbd4 100644 --- a/src/main/resources/betterend.mixins.client.json +++ b/src/main/resources/betterend.mixins.client.json @@ -8,6 +8,7 @@ "ClientPlayNetworkHandlerMixin", "NamespaceResourceManagerMixin", "DeserializationContextMixin", + "EnchantingTableBlockMixin", "BackgroundRendererMixin", "ClientRecipeBookMixin", "ModelVariantMapMixin", diff --git a/src/main/resources/betterend.mixins.common.json b/src/main/resources/betterend.mixins.common.json index 3ab50090..3ade9c13 100644 --- a/src/main/resources/betterend.mixins.common.json +++ b/src/main/resources/betterend.mixins.common.json @@ -5,6 +5,7 @@ "compatibilityLevel": "JAVA_8", "mixins": [ "ServerPlayNetworkHandlerMixin", + "EnchantmentScreenHandlerMixin", "CraftingScreenHandlerMixin", "GenerationSettingsAccessor", "AnvilScreenHandlerMixin", diff --git a/src/main/resources/data/c/tags/blocks/bookshelves.json b/src/main/resources/data/c/tags/blocks/bookshelves.json new file mode 100644 index 00000000..98dee3c8 --- /dev/null +++ b/src/main/resources/data/c/tags/blocks/bookshelves.json @@ -0,0 +1,6 @@ +{ + "replace": "false", + "values": [ + "minecraft:bookshelf" + ] +} \ No newline at end of file