package com.simibubi.create; import java.util.ArrayList; import java.util.List; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.content.contraptions.KineticDebugger; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.turntable.TurntableHandler; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.gui.ScreenOpener; import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringHandler; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollValueHandler; import com.simibubi.create.foundation.utility.AnimationTickHolder; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.ActiveRenderInfo; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.item.ItemStack; import net.minecraft.util.math.Vec3d; import net.minecraft.util.text.ITextComponent; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.InputEvent.KeyInputEvent; import net.minecraftforge.client.event.InputEvent.MouseInputEvent; import net.minecraftforge.client.event.InputEvent.MouseScrollEvent; import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType; import net.minecraftforge.client.event.RenderWorldLastEvent; import net.minecraftforge.event.TickEvent.ClientTickEvent; import net.minecraftforge.event.TickEvent.Phase; import net.minecraftforge.event.TickEvent.RenderTickEvent; import net.minecraftforge.event.entity.player.ItemTooltipEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; @EventBusSubscriber(value = Dist.CLIENT) public class ClientEvents { private static final String itemPrefix = "item." + Create.ID; private static final String blockPrefix = "block." + Create.ID; @SubscribeEvent public static void onTick(ClientTickEvent event) { if (event.phase == Phase.START) return; AnimationTickHolder.tick(); if (!isGameActive()) return; if (!KineticDebugger.isActive() && KineticTileEntityRenderer.rainbowMode) { KineticTileEntityRenderer.rainbowMode = false; CreateClient.bufferCache.invalidate(); } ScreenOpener.tick(); CreateClient.gameTick(); } @SubscribeEvent public static void onRenderWorld(RenderWorldLastEvent event) { MatrixStack ms = event.getMatrixStack(); ActiveRenderInfo info = Minecraft.getInstance().gameRenderer.getActiveRenderInfo(); Vec3d view = info.getProjectedView(); ms.push(); ms.translate(-view.getX(), -view.getY(), -view.getZ()); SuperRenderTypeBuffer buffer = SuperRenderTypeBuffer.getInstance(); CreateClient.schematicHandler.render(ms, buffer); CreateClient.outliner.renderOutlines(ms, buffer); // CollisionDebugger.render(ms, buffer); buffer.draw(); ms.pop(); } @SubscribeEvent public static void onRenderOverlay(RenderGameOverlayEvent.Post event) { if (event.getType() != ElementType.HOTBAR) return; onRenderHotbar(new MatrixStack(), Minecraft.getInstance() .getBufferBuilders() .getEntityVertexConsumers(), 0xF000F0, OverlayTexture.DEFAULT_UV); } public static void onRenderHotbar(MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { CreateClient.schematicHandler.renderOverlay(ms, buffer, light, overlay); } @SubscribeEvent public static void onKeyInput(KeyInputEvent event) { int key = event.getKey(); boolean pressed = !(event.getAction() == 0); if (Minecraft.getInstance().currentScreen != null) return; CreateClient.schematicHandler.onKeyInput(key, pressed); } @SubscribeEvent public static void onMouseScrolled(MouseScrollEvent event) { if (Minecraft.getInstance().currentScreen != null) return; double delta = event.getScrollDelta(); // CollisionDebugger.onScroll(delta); boolean cancelled = CreateClient.schematicHandler.mouseScrolled(delta) || CreateClient.schematicAndQuillHandler.mouseScrolled(delta) || FilteringHandler.onScroll(delta) || ScrollValueHandler.onScroll(delta); event.setCanceled(cancelled); } @SubscribeEvent public static void onMouseInput(MouseInputEvent event) { if (Minecraft.getInstance().currentScreen != null) return; int button = event.getButton(); boolean pressed = !(event.getAction() == 0); CreateClient.schematicHandler.onMouseInput(button, pressed); CreateClient.schematicAndQuillHandler.onMouseInput(button, pressed); } @SubscribeEvent public static void addToItemTooltip(ItemTooltipEvent event) { if (!AllConfigs.CLIENT.tooltips.get()) return; if (Minecraft.getInstance().player == null) return; ItemStack stack = event.getItemStack(); String translationKey = stack.getItem() .getTranslationKey(stack); if (!translationKey.startsWith(itemPrefix) && !translationKey.startsWith(blockPrefix)) return; if (TooltipHelper.hasTooltip(stack)) { List itemTooltip = event.getToolTip(); List toolTip = new ArrayList<>(); toolTip.add(itemTooltip.remove(0)); TooltipHelper.getTooltip(stack) .addInformation(toolTip); itemTooltip.addAll(0, toolTip); } } @SubscribeEvent public static void onRenderTick(RenderTickEvent event) { if (!isGameActive()) return; TurntableHandler.gameRenderTick(); } protected static boolean isGameActive() { return !(Minecraft.getInstance().world == null || Minecraft.getInstance().player == null); } }