Files
bookshelf-inspector/remappedSrc/me/lukasabbe/bookshelfinspector/util/Inspector.java
T
2025-03-25 17:43:17 +01:00

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();
}
}