mirror of
https://github.com/lukasabbe/bookshelf-inspector.git
synced 2026-04-30 10:40:53 +00:00
126 lines
4.6 KiB
Java
126 lines
4.6 KiB
Java
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.packets.BookShelfInventoryRequestPayload;
|
|
import me.lukasabbe.bookshelfinspector.network.packets.LecternInventoryRequestPayload;
|
|
import net.fabricmc.api.EnvType;
|
|
import net.fabricmc.api.Environment;
|
|
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
|
|
import net.fabricmc.fabric.api.tag.convention.v2.ConventionalBlockTags;
|
|
import net.minecraft.block.BlockState;
|
|
import net.minecraft.block.Blocks;
|
|
import net.minecraft.block.ChiseledBookshelfBlock;
|
|
import net.minecraft.client.MinecraftClient;
|
|
import net.minecraft.registry.tag.BlockTags;
|
|
import net.minecraft.util.hit.BlockHitResult;
|
|
import net.minecraft.util.hit.HitResult;
|
|
import net.minecraft.util.math.BlockPos;
|
|
|
|
import java.util.OptionalInt;
|
|
|
|
import static me.lukasabbe.bookshelfinspector.BookshelfinspectorClient.*;
|
|
|
|
@Environment(EnvType.CLIENT)
|
|
public class Inspector {
|
|
public void inspect(MinecraftClient client){
|
|
if(!modAvailable) return;
|
|
|
|
if(client.cameraEntity == null || client.player == null) return;
|
|
|
|
//Send raycast max 5 blocks
|
|
HitResult hit = client.cameraEntity.raycast(5f,0f,false);
|
|
|
|
//find block hit, if not found block returns
|
|
final HitResult.Type type = hit.getType();
|
|
if(type != HitResult.Type.BLOCK) {
|
|
resetBookShelfData();
|
|
return;
|
|
}
|
|
|
|
final BlockHitResult blockHitResult = (BlockHitResult) hit;
|
|
BlockPos pos = blockHitResult.getBlockPos();
|
|
|
|
if(bookShelfData.latestPos == null)
|
|
bookShelfData.latestPos = pos;
|
|
|
|
//If you look at a new block
|
|
if(!bookShelfData.latestPos.equals(pos)){
|
|
resetBookShelfData();
|
|
currentBookData = BookData.empty();
|
|
}
|
|
bookShelfData.latestPos = pos;
|
|
|
|
|
|
if(client.player.getWorld().getBlockState(pos).isOf(Blocks.CHISELED_BOOKSHELF)){
|
|
bookShelfInspect(pos, blockHitResult, client);
|
|
}else if(client.player.getWorld().getBlockState(pos).isOf(Blocks.LECTERN) && config.lecternToggle){
|
|
lecternInspect(pos);
|
|
}else{
|
|
|
|
bookShelfData.requestSent = false; // Just for servers that don't have the latest version of mod
|
|
|
|
if(!bookShelfData.isCurrentBookDataToggled) return;
|
|
resetBookShelfData();
|
|
}
|
|
}
|
|
|
|
|
|
private void lecternInspect(BlockPos pos){
|
|
|
|
//Checks if there is saved data.
|
|
final BookData currentBookData = BookshelfinspectorClient.currentBookData;
|
|
|
|
if(currentBookData.pos != null && currentBookData.pos.equals(pos)) return;
|
|
|
|
if(!bookShelfData.requestSent){
|
|
bookShelfData.requestSent = true;
|
|
ClientPlayNetworking.send(new LecternInventoryRequestPayload(pos));
|
|
}
|
|
}
|
|
|
|
|
|
private void bookShelfInspect(BlockPos pos, BlockHitResult blockHitResult, MinecraftClient client){
|
|
final BlockState blockState = client.player.getWorld().getBlockState(pos);
|
|
|
|
//Gets index position for a book in the bookshelf
|
|
ChiseledBookshelfBlock bookshelfBlock = (ChiseledBookshelfBlock) blockState.getBlock();
|
|
OptionalInt optionalInt = ((BookshelfInvoker)bookshelfBlock).invokerGetSlotForHitPos(blockHitResult,blockState);
|
|
|
|
//if the position is empty, return
|
|
if(optionalInt.isEmpty()) {
|
|
resetBookShelfData();
|
|
return;
|
|
}
|
|
|
|
//Checks if there is saved data.
|
|
final BookData currentBookData = BookshelfinspectorClient.currentBookData;
|
|
|
|
//Changes the id for the new one if it's new.
|
|
final int temp = bookShelfData.currentSlotInt;
|
|
final int slotNum = optionalInt.getAsInt();
|
|
bookShelfData.currentSlotInt = slotNum;
|
|
|
|
if(currentBookData.slotId!= slotNum && currentBookData.slotId!=-2 && !bookShelfData.requestSent){
|
|
bookShelfData.requestSent = true;
|
|
ClientPlayNetworking.send(new BookShelfInventoryRequestPayload(pos, slotNum));
|
|
}
|
|
else {
|
|
if(temp == slotNum)
|
|
bookShelfData.isCurrentBookDataToggled = currentBookData.slotId != -2;
|
|
else{
|
|
bookShelfData.isCurrentBookDataToggled = false;
|
|
BookshelfinspectorClient.currentBookData = BookData.empty();
|
|
}
|
|
}
|
|
}
|
|
|
|
private void resetBookShelfData(){
|
|
if(!bookShelfData.isCurrentBookDataToggled) return;
|
|
|
|
bookShelfData.isCurrentBookDataToggled = false;
|
|
currentBookData = BookData.empty();
|
|
}
|
|
}
|