diff --git a/README.md b/README.md index 030d9cf..bfb4c6a 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,9 @@ Written book: Normal book: ![Example 3. with a normal book](./images/2024-09-20_22.38.19.png) +lectern: +![Example 4. with a lectern with a book](./images/lectern_support.png) + # Multiplayer This mod will need to be on the server to work in multiplayer. diff --git a/build.gradle b/build.gradle index dfbf7ac..251556a 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,10 @@ base { } -repositories {} +repositories { + maven { url "https://maven.shedaniel.me/" } + maven { url "https://maven.terraformersmc.com/releases/" } +} dependencies { // To change the versions see the gradle.properties file @@ -22,12 +25,18 @@ dependencies { Set apiMudules = [ "fabric-api-base", "fabric-networking-api-v1", - "fabric-lifecycle-events-v1" + "fabric-lifecycle-events-v1", + "fabric-resource-loader-v0" ] apiMudules.forEach { modImplementation(fabricApi.module(it,project.fabric_version)) } + + modApi "me.shedaniel.cloth:cloth-config-fabric:${project.cloth_config}" + modApi "com.terraformersmc:modmenu:${project.modmenu}" + + include(implementation "org.yaml:snakeyaml:${project.YAML_snake}") } processResources { diff --git a/gradle.properties b/gradle.properties index 9f4b626..5f0db89 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,10 +6,13 @@ minecraft_version=1.21.2-rc1 yarn_mappings=1.21.2-rc1+build.1 loader_version=0.16.7 # Mod Properties -mod_version=1.4+1.21.2-SNAPSHOT.1 - +mod_version=1.5+1.21.2 maven_group=me.lukasabbe archives_base_name=Bookshelfinspector -fabric_version=0.106.0+1.21.2 +# Dependencies +fabric_version=0.104.0+1.21.1 +cloth_config=15.0.140 +modmenu=11.0.3 +YAML_snake=2.2 diff --git a/images/lectern_support.png b/images/lectern_support.png new file mode 100644 index 0000000..9a47dd4 Binary files /dev/null and b/images/lectern_support.png differ diff --git a/src/main/java/me/lukasabbe/bookshelfinspector/Bookshelfinspector.java b/src/main/java/me/lukasabbe/bookshelfinspector/Bookshelfinspector.java index 82807cc..e65a5db 100644 --- a/src/main/java/me/lukasabbe/bookshelfinspector/Bookshelfinspector.java +++ b/src/main/java/me/lukasabbe/bookshelfinspector/Bookshelfinspector.java @@ -1,19 +1,17 @@ package me.lukasabbe.bookshelfinspector; -import io.netty.buffer.Unpooled; import me.lukasabbe.bookshelfinspector.network.BookShelfInventoryPayload; import me.lukasabbe.bookshelfinspector.network.BookShelfInventoryRequestPayload; +import me.lukasabbe.bookshelfinspector.network.LecternInventoryRequestPayload; import me.lukasabbe.bookshelfinspector.network.ModCheckPayload; import me.lukasabbe.bookshelfinspector.util.BookshelfTools; +import me.lukasabbe.bookshelfinspector.util.LecternTools; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry; import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents; import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; -import net.minecraft.network.RegistryByteBuf; -import net.minecraft.network.codec.PacketCodec; -import net.minecraft.registry.DynamicRegistryManager; import net.minecraft.server.MinecraftServer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -27,10 +25,10 @@ public class Bookshelfinspector implements ModInitializer { @Override public void onInitialize() { PayloadTypeRegistry.playC2S().register(BookShelfInventoryRequestPayload.ID,BookShelfInventoryRequestPayload.CODEC); + PayloadTypeRegistry.playC2S().register(LecternInventoryRequestPayload.ID, LecternInventoryRequestPayload.CODEC); PayloadTypeRegistry.playS2C().register(BookShelfInventoryPayload.ID,BookShelfInventoryPayload.CODEC); PayloadTypeRegistry.playS2C().register(ModCheckPayload.ID, ModCheckPayload.CODEC); - ServerPlayNetworking.registerGlobalReceiver(BookShelfInventoryRequestPayload.ID,((payload, context) -> context.server().execute(() -> { if(Bookshelfinspector.serverInstance == null) return; @@ -40,7 +38,18 @@ public class Bookshelfinspector implements ModInitializer { return; } ServerPlayNetworking.send(context.player(), new BookShelfInventoryPayload(stack, payload.pos(), payload.slotNum())); - new RegistryByteBuf(Unpooled.buffer(), DynamicRegistryManager.EMPTY); + }))); + + ServerPlayNetworking.registerGlobalReceiver(LecternInventoryRequestPayload.ID, ((payload, context) -> context.server().execute(() ->{ + if(Bookshelfinspector.serverInstance == null) return; + + ItemStack stack = LecternTools.getItemStack(payload.pos(), context.player()); + + if(stack == null){ + ServerPlayNetworking.send(context.player(), new BookShelfInventoryPayload(Items.AIR.getDefaultStack(), payload.pos(), 0)); + return; + } + ServerPlayNetworking.send(context.player(), new BookShelfInventoryPayload(stack, payload.pos(), 0)); }))); ServerPlayConnectionEvents.JOIN.register(((handler, sender, server) -> { diff --git a/src/main/java/me/lukasabbe/bookshelfinspector/BookshelfinspectorClient.java b/src/main/java/me/lukasabbe/bookshelfinspector/BookshelfinspectorClient.java index 2071db6..00f7903 100644 --- a/src/main/java/me/lukasabbe/bookshelfinspector/BookshelfinspectorClient.java +++ b/src/main/java/me/lukasabbe/bookshelfinspector/BookshelfinspectorClient.java @@ -1,5 +1,6 @@ package me.lukasabbe.bookshelfinspector; +import me.lukasabbe.bookshelfinspector.config.Config; import me.lukasabbe.bookshelfinspector.data.BookData; import me.lukasabbe.bookshelfinspector.data.BookShelfData; import me.lukasabbe.bookshelfinspector.network.BookShelfInventoryPayload; @@ -17,9 +18,11 @@ public class BookshelfinspectorClient implements ClientModInitializer { public static BookData currentBookData = BookData.empty(); public static BookShelfData bookShelfData = new BookShelfData(); public static boolean modAvailable = false; + public static Config config = new Config(); @Override public void onInitializeClient() { + config.loadConfig(); ClientPlayNetworking.registerGlobalReceiver(BookShelfInventoryPayload.ID, ((payload, context) -> context.client().execute(() ->{ diff --git a/src/main/java/me/lukasabbe/bookshelfinspector/config/Config.java b/src/main/java/me/lukasabbe/bookshelfinspector/config/Config.java new file mode 100644 index 0000000..7fe6b05 --- /dev/null +++ b/src/main/java/me/lukasabbe/bookshelfinspector/config/Config.java @@ -0,0 +1,61 @@ +package me.lukasabbe.bookshelfinspector.config; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.loader.api.FabricLoader; +import org.yaml.snakeyaml.Yaml; + +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Map; + +@Environment(EnvType.CLIENT) +public class Config { + public boolean lecternToggle = true; + + public void loadConfig(){ + Path configPath = FabricLoader.getInstance().getConfigDir().resolve("bookshelfinspector-config.yml"); + if(!Files.exists(configPath))createConfig(configPath); + Yaml yaml = new Yaml(); + try{ + Map configMap = yaml.load(new FileReader(configPath.toFile())); + if(configMap.containsKey("lectern-toggle")){ + lecternToggle = (boolean) configMap.get("lectern-toggle"); + } + + } catch (FileNotFoundException e) { + throw new RuntimeException(e); + } + } + + private void createConfig(Path configPath){ + FabricLoader.getInstance().getModContainer("bookshelfinspector").ifPresent(modContainer -> { + Path path = modContainer.findPath("bookshelfinspector-config.yml").orElseThrow(); + try { + Files.copy(path,configPath); + } catch (IOException e) { + throw new RuntimeException(e); + } + }); + } + + public void saveConfig(){ + Path configPath = FabricLoader.getInstance().getConfigDir().resolve("bookshelfinspector-config.yml"); + if(!Files.exists(configPath))createConfig(configPath); + Yaml yaml = new Yaml(); + try{ + Map configMap = yaml.load(new FileReader(configPath.toFile())); + configMap.put("lectern-toggle",lecternToggle); + FileWriter writer = new FileWriter(configPath.toString()); + yaml.dump(configMap,writer); + writer.close(); + + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/main/java/me/lukasabbe/bookshelfinspector/config/ModMenu.java b/src/main/java/me/lukasabbe/bookshelfinspector/config/ModMenu.java new file mode 100644 index 0000000..7959572 --- /dev/null +++ b/src/main/java/me/lukasabbe/bookshelfinspector/config/ModMenu.java @@ -0,0 +1,34 @@ +package me.lukasabbe.bookshelfinspector.config; + +import com.terraformersmc.modmenu.api.ConfigScreenFactory; +import com.terraformersmc.modmenu.api.ModMenuApi; +import me.lukasabbe.bookshelfinspector.BookshelfinspectorClient; +import me.shedaniel.clothconfig2.api.ConfigBuilder; +import me.shedaniel.clothconfig2.api.ConfigEntryBuilder; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.text.Text; + +@Environment(EnvType.CLIENT) +public class ModMenu implements ModMenuApi { + @Override + public ConfigScreenFactory getModConfigScreenFactory() { + return parent -> { + ConfigBuilder builder = ConfigBuilder + .create() + .setParentScreen(parent) + .setTitle(Text.translatable("bookshelfinspector.config.title")); + ConfigEntryBuilder entryBuilder = builder.entryBuilder(); + + builder + .getOrCreateCategory(Text.translatable("bookshelfinspector.config.category")) + .addEntry(entryBuilder + .startBooleanToggle(Text.translatable("bookshelfinspector.config.lectern.toggle"), BookshelfinspectorClient.config.lecternToggle) + .setTooltip(Text.translatable("bookshelfinspector.config.lectern.toggle.tooltip")) + .setDefaultValue(true) + .setSaveConsumer(val -> BookshelfinspectorClient.config.lecternToggle = val).build()); + builder.setSavingRunnable(BookshelfinspectorClient.config::saveConfig); + return builder.build(); + }; + } +} diff --git a/src/main/java/me/lukasabbe/bookshelfinspector/data/BookShelfData.java b/src/main/java/me/lukasabbe/bookshelfinspector/data/BookShelfData.java index 0ba54ac..d63dece 100644 --- a/src/main/java/me/lukasabbe/bookshelfinspector/data/BookShelfData.java +++ b/src/main/java/me/lukasabbe/bookshelfinspector/data/BookShelfData.java @@ -1,7 +1,10 @@ package me.lukasabbe.bookshelfinspector.data; +import net.minecraft.util.math.BlockPos; + public class BookShelfData { public boolean isCurrentBookDataToggled = false; + public BlockPos latestPos = null; public boolean requestSent = false; public int currentSlotInt = -1; } diff --git a/src/main/java/me/lukasabbe/bookshelfinspector/mixin/BookshelfMixin.java b/src/main/java/me/lukasabbe/bookshelfinspector/mixin/BookshelfMixin.java index 02643c8..63bdb6c 100644 --- a/src/main/java/me/lukasabbe/bookshelfinspector/mixin/BookshelfMixin.java +++ b/src/main/java/me/lukasabbe/bookshelfinspector/mixin/BookshelfMixin.java @@ -1,18 +1,8 @@ package me.lukasabbe.bookshelfinspector.mixin; -import me.lukasabbe.bookshelfinspector.BookshelfinspectorClient; -import me.lukasabbe.bookshelfinspector.data.BookData; -import me.lukasabbe.bookshelfinspector.network.BookShelfInventoryRequestPayload; -import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; -import net.minecraft.block.BlockState; -import net.minecraft.block.ChiseledBookshelfBlock; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.block.entity.ChiseledBookshelfBlockEntity; +import me.lukasabbe.bookshelfinspector.util.Inspector; import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.hit.HitResult; -import net.minecraft.util.math.BlockPos; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -21,63 +11,18 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import java.util.Optional; -import java.util.OptionalInt; - @Mixin(ClientPlayerEntity.class) public class BookshelfMixin{ @Shadow @Final protected MinecraftClient client; + @Unique + private final Inspector inspector = new Inspector(); + @Inject(method = "tick", at= @At(value = "INVOKE", target = "Ljava/util/List;iterator()Ljava/util/Iterator;")) public void injectTick(CallbackInfo ci){ - bookShelfInspect(); + inspector.inspect(client); } - @Unique - public void bookShelfInspect(){ - if(!BookshelfinspectorClient.modAvailable) return; - if(client.cameraEntity == null || client.player == null) return; - - HitResult hit = client.cameraEntity.raycast(5f,0f,false); - final HitResult.Type type = hit.getType(); - if(type != HitResult.Type.BLOCK) return; - final BlockHitResult blockHitResult = (BlockHitResult) hit; - BlockPos pos = blockHitResult.getBlockPos(); - - Optional optionalChiseledBookshelfBlockEntity = client.player.getWorld().getBlockEntity(pos, BlockEntityType.CHISELED_BOOKSHELF); - if(optionalChiseledBookshelfBlockEntity.isEmpty()){ - BookshelfinspectorClient.bookShelfData.isCurrentBookDataToggled = false; - BookshelfinspectorClient.currentBookData = BookData.empty(); - return; - } - - final BlockState blockState = client.player.getWorld().getBlockState(pos); - - ChiseledBookshelfBlock bookshelfBlock = (ChiseledBookshelfBlock) blockState.getBlock(); - - OptionalInt optionalInt = ((BookshelfInvoker)bookshelfBlock).invokerGetSlotForHitPos(blockHitResult,blockState); - if(optionalInt.isEmpty()) { - BookshelfinspectorClient.bookShelfData.isCurrentBookDataToggled = false; - return; - } - - final BookData currentBookData = BookshelfinspectorClient.currentBookData; - - int temp = BookshelfinspectorClient.bookShelfData.currentSlotInt; - final int slotNum = optionalInt.getAsInt(); - BookshelfinspectorClient.bookShelfData.currentSlotInt = slotNum; - - if(currentBookData.slotId!= slotNum && currentBookData.slotId!=-2 && !BookshelfinspectorClient.bookShelfData.requestSent){ - BookshelfinspectorClient.bookShelfData.requestSent = true; - ClientPlayNetworking.send(new BookShelfInventoryRequestPayload(pos, slotNum)); - } - else { - if(temp == slotNum) - BookshelfinspectorClient.bookShelfData.isCurrentBookDataToggled = currentBookData.slotId != -2; - else - BookshelfinspectorClient.currentBookData = BookData.empty(); - } - } } diff --git a/src/main/java/me/lukasabbe/bookshelfinspector/network/BookShelfInspectorNetworkConstants.java b/src/main/java/me/lukasabbe/bookshelfinspector/network/BookShelfInspectorNetworkConstants.java index ba82dfe..9923e1d 100644 --- a/src/main/java/me/lukasabbe/bookshelfinspector/network/BookShelfInspectorNetworkConstants.java +++ b/src/main/java/me/lukasabbe/bookshelfinspector/network/BookShelfInspectorNetworkConstants.java @@ -7,4 +7,5 @@ public class BookShelfInspectorNetworkConstants { public static final Identifier BOOK_SHELF_INVENTORY_REQUEST_PACKET_ID = Identifier.of(Bookshelfinspector.MOD_ID,"book_shelf_inventory_request"); public static final Identifier BOOK_SHELF_INVENTORY_PACKET_ID = Identifier.of(Bookshelfinspector.MOD_ID,"book_shelf_inventory"); public static final Identifier MOD_CHECK_PACKET_ID = Identifier.of(Bookshelfinspector.MOD_ID,"mod_check"); + public static final Identifier LECTERN_INVENTORY_REQUEST_PACKET_ID = Identifier.of(Bookshelfinspector.MOD_ID, "lectern_inventory_request"); } diff --git a/src/main/java/me/lukasabbe/bookshelfinspector/network/LecternInventoryRequestPayload.java b/src/main/java/me/lukasabbe/bookshelfinspector/network/LecternInventoryRequestPayload.java new file mode 100644 index 0000000..07751aa --- /dev/null +++ b/src/main/java/me/lukasabbe/bookshelfinspector/network/LecternInventoryRequestPayload.java @@ -0,0 +1,19 @@ +package me.lukasabbe.bookshelfinspector.network; + +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.packet.CustomPayload; +import net.minecraft.util.math.BlockPos; + +public record LecternInventoryRequestPayload(BlockPos pos) implements CustomPayload{ + public static final CustomPayload.Id ID = new CustomPayload.Id<>(BookShelfInspectorNetworkConstants.LECTERN_INVENTORY_REQUEST_PACKET_ID); + + public static final PacketCodec CODEC = PacketCodec.tuple( + BlockPos.PACKET_CODEC,LecternInventoryRequestPayload::pos, + LecternInventoryRequestPayload::new); + + @Override + public CustomPayload.Id getId() { + return ID; + } +} diff --git a/src/main/java/me/lukasabbe/bookshelfinspector/util/Inspector.java b/src/main/java/me/lukasabbe/bookshelfinspector/util/Inspector.java new file mode 100644 index 0000000..6a1db55 --- /dev/null +++ b/src/main/java/me/lukasabbe/bookshelfinspector/util/Inspector.java @@ -0,0 +1,110 @@ +package me.lukasabbe.bookshelfinspector.util; + +import me.lukasabbe.bookshelfinspector.BookshelfinspectorClient; +import me.lukasabbe.bookshelfinspector.data.BookData; +import me.lukasabbe.bookshelfinspector.mixin.BookshelfInvoker; +import me.lukasabbe.bookshelfinspector.network.BookShelfInventoryRequestPayload; +import me.lukasabbe.bookshelfinspector.network.LecternInventoryRequestPayload; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.ChiseledBookshelfBlock; +import net.minecraft.block.entity.BlockEntityType; +import net.minecraft.block.entity.ChiseledBookshelfBlockEntity; +import net.minecraft.block.entity.LecternBlockEntity; +import net.minecraft.client.MinecraftClient; +import net.minecraft.util.hit.BlockHitResult; +import net.minecraft.util.hit.HitResult; +import net.minecraft.util.math.BlockPos; + +import java.util.Optional; +import java.util.OptionalInt; + +@Environment(EnvType.CLIENT) +public class Inspector { + public void inspect(MinecraftClient client){ + if(!BookshelfinspectorClient.modAvailable) return; + + if(client.cameraEntity == null || client.player == null) return; + + HitResult hit = client.cameraEntity.raycast(5f,0f,false); + final HitResult.Type type = hit.getType(); + if(type != HitResult.Type.BLOCK) { + BookshelfinspectorClient.bookShelfData.isCurrentBookDataToggled = false; + BookshelfinspectorClient.currentBookData = BookData.empty(); + } + final BlockHitResult blockHitResult = (BlockHitResult) hit; + BlockPos pos = blockHitResult.getBlockPos(); + if(client.player.getWorld().getBlockState(pos).isOf(Blocks.CHISELED_BOOKSHELF)){ + bookShelfInspect(pos, blockHitResult, client); + }else if(client.player.getWorld().getBlockState(pos).isOf(Blocks.LECTERN) && BookshelfinspectorClient.config.lecternToggle){ + lecternInspect(pos, client); + }else{ + BookshelfinspectorClient.bookShelfData.isCurrentBookDataToggled = false; + BookshelfinspectorClient.currentBookData = BookData.empty(); + BookshelfinspectorClient.bookShelfData.latestPos = null; + BookshelfinspectorClient.bookShelfData.requestSent = false; + } + } + + + private void lecternInspect(BlockPos pos, MinecraftClient client){ + Optional optionalLecternBlockEntity = client.player.getWorld().getBlockEntity(pos, BlockEntityType.LECTERN); + if(optionalLecternBlockEntity.isEmpty()){ + BookshelfinspectorClient.bookShelfData.isCurrentBookDataToggled = false; + BookshelfinspectorClient.currentBookData = BookData.empty(); + return; + } + + if(BookshelfinspectorClient.bookShelfData.latestPos != null && BookshelfinspectorClient.bookShelfData.latestPos.equals(pos)){ + return; + } + + if(!BookshelfinspectorClient.bookShelfData.requestSent){ + BookshelfinspectorClient.bookShelfData.requestSent = true; + ClientPlayNetworking.send(new LecternInventoryRequestPayload(pos)); + BookshelfinspectorClient.bookShelfData.latestPos = pos; + } + } + + + private void bookShelfInspect(BlockPos pos, BlockHitResult blockHitResult, MinecraftClient client){ + Optional optionalChiseledBookshelfBlockEntity = client.player.getWorld().getBlockEntity(pos, BlockEntityType.CHISELED_BOOKSHELF); + if(optionalChiseledBookshelfBlockEntity.isEmpty()){ + BookshelfinspectorClient.bookShelfData.isCurrentBookDataToggled = false; + BookshelfinspectorClient.currentBookData = BookData.empty(); + return; + } + + final BlockState blockState = client.player.getWorld().getBlockState(pos); + + ChiseledBookshelfBlock bookshelfBlock = (ChiseledBookshelfBlock) blockState.getBlock(); + + OptionalInt optionalInt = ((BookshelfInvoker)bookshelfBlock).invokerGetSlotForHitPos(blockHitResult,blockState); + if(optionalInt.isEmpty()) { + BookshelfinspectorClient.bookShelfData.isCurrentBookDataToggled = false; + return; + } + + final BookData currentBookData = BookshelfinspectorClient.currentBookData; + + int temp = BookshelfinspectorClient.bookShelfData.currentSlotInt; + final int slotNum = optionalInt.getAsInt(); + BookshelfinspectorClient.bookShelfData.currentSlotInt = slotNum; + + if(currentBookData.slotId!= slotNum && currentBookData.slotId!=-2 && !BookshelfinspectorClient.bookShelfData.requestSent){ + BookshelfinspectorClient.bookShelfData.requestSent = true; + ClientPlayNetworking.send(new BookShelfInventoryRequestPayload(pos, slotNum)); + } + else { + if(temp == slotNum) + BookshelfinspectorClient.bookShelfData.isCurrentBookDataToggled = currentBookData.slotId != -2; + else{ + BookshelfinspectorClient.bookShelfData.isCurrentBookDataToggled = false; + BookshelfinspectorClient.currentBookData = BookData.empty(); + } + } + } +} diff --git a/src/main/java/me/lukasabbe/bookshelfinspector/util/LecternTools.java b/src/main/java/me/lukasabbe/bookshelfinspector/util/LecternTools.java new file mode 100644 index 0000000..4811ebf --- /dev/null +++ b/src/main/java/me/lukasabbe/bookshelfinspector/util/LecternTools.java @@ -0,0 +1,25 @@ +package me.lukasabbe.bookshelfinspector.util; + +import me.lukasabbe.bookshelfinspector.Bookshelfinspector; +import net.minecraft.block.entity.BlockEntityType; +import net.minecraft.block.entity.LecternBlockEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +import java.util.Optional; + +public class LecternTools { + public static ItemStack getItemStack(BlockPos pos, PlayerEntity player){ + final World world = Bookshelfinspector.serverInstance.getPlayerManager().getPlayer(player.getUuid()).getWorld(); + + if(world == null) return null; + Optional blockEntityOptional = world.getBlockEntity(pos, BlockEntityType.LECTERN); + if(blockEntityOptional.isEmpty()) return null; + + LecternBlockEntity lecternBlock = blockEntityOptional.get(); + + return lecternBlock.getBook(); + } +} diff --git a/src/main/resources/assets/bookshelfinspector/lang/en_us.json b/src/main/resources/assets/bookshelfinspector/lang/en_us.json new file mode 100644 index 0000000..114660d --- /dev/null +++ b/src/main/resources/assets/bookshelfinspector/lang/en_us.json @@ -0,0 +1,6 @@ +{ + "bookshelfinspector.config.title": "Bookshelf Inspector Config", + "bookshelfinspector.config.category": "Settings", + "bookshelfinspector.config.lectern.toggle": "Turn OFF or ON lectern support", + "bookshelfinspector.config.lectern.toggle.tooltip": "This will turn OFF/ON the visibility of lectern inspection" +} \ No newline at end of file diff --git a/src/main/resources/assets/bookshelfinspector/lang/sv_se.json b/src/main/resources/assets/bookshelfinspector/lang/sv_se.json new file mode 100644 index 0000000..6d167bd --- /dev/null +++ b/src/main/resources/assets/bookshelfinspector/lang/sv_se.json @@ -0,0 +1,6 @@ +{ + "bookshelfinspector.config.title": "Bookshelf Inspector Config", + "bookshelfinspector.config.category": "Inställningar", + "bookshelfinspector.config.lectern.toggle": "Stäng AV eller PÅ läspulpet stöd", + "bookshelfinspector.config.lectern.toggle.tooltip": "Denna inställning kommer stänga av eller på synligeten av läspulpet inspection" +} \ No newline at end of file diff --git a/src/main/resources/bookshelfinspector-config.yml b/src/main/resources/bookshelfinspector-config.yml new file mode 100644 index 0000000..5ee84d8 --- /dev/null +++ b/src/main/resources/bookshelfinspector-config.yml @@ -0,0 +1 @@ +lectern-toggle: true \ No newline at end of file diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index a2d20a6..e8a6251 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -15,6 +15,9 @@ ], "main": [ "me.lukasabbe.bookshelfinspector.Bookshelfinspector" + ], + "modmenu": [ + "me.lukasabbe.bookshelfinspector.config.ModMenu" ] }, "mixins": [