CarryOn/src/main/java/tschipp/carryon/client/event/RenderEntityEvents.java
2017-09-17 22:44:37 +02:00

252 lines
8.6 KiB
Java

package tschipp.carryon.client.event;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.AbstractClientPlayer;
import net.minecraft.client.entity.EntityPlayerSP;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.client.model.ModelPlayer;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.OpenGlHelper;
import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.client.settings.GameSettings;
import net.minecraft.client.settings.KeyBinding;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumHand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.client.event.GuiOpenEvent;
import net.minecraftforge.client.event.MouseEvent;
import net.minecraftforge.client.event.RenderHandEvent;
import net.minecraftforge.client.event.RenderPlayerEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.InputEvent;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import tschipp.carryon.common.handler.RegistrationHandler;
import tschipp.carryon.common.item.ItemEntity;
import tschipp.carryon.common.item.ItemTile;
public class RenderEntityEvents
{
/*
* Prevents the Player from scrolling
*/
@SideOnly(Side.CLIENT)
@SubscribeEvent
public void onScroll(MouseEvent event) throws IllegalArgumentException, IllegalAccessException
{
if (event.getDwheel() > 0 || event.getDwheel() < 0)
{
ItemStack stack = Minecraft.getMinecraft().thePlayer.getHeldItemMainhand();
if (stack != null && stack.getItem() == RegistrationHandler.itemEntity)
{
if (ItemEntity.hasEntityData(stack))
event.setCanceled(true);
}
}
}
/*
* Prevents the Player from opening Guis
*/
@SideOnly(Side.CLIENT)
@SubscribeEvent
public void onGuiOpen(GuiOpenEvent event)
{
if (event.getGui() != null)
{
boolean inventory = event.getGui() instanceof GuiContainer;
EntityPlayer player = Minecraft.getMinecraft().thePlayer;
if (player != null)
{
ItemStack stack = player.getHeldItem(EnumHand.MAIN_HAND);
if (inventory && (stack != null ? stack.getItem() == RegistrationHandler.itemEntity && ItemEntity.hasEntityData(stack) : false))
{
event.setCanceled(true);
Minecraft.getMinecraft().currentScreen = null;
}
}
}
}
/*
* Prevents the Player from switching Slots
*/
@SideOnly(Side.CLIENT)
@SubscribeEvent
public void inputEvent(InputEvent event) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, InvocationTargetException
{
GameSettings settings = Minecraft.getMinecraft().gameSettings;
Field field = KeyBinding.class.getDeclaredFields()[7];
field.setAccessible(true);
ItemStack stack = Minecraft.getMinecraft().thePlayer.getHeldItemMainhand();
EntityPlayer player = Minecraft.getMinecraft().thePlayer;
if (stack != null ? stack.getItem() == RegistrationHandler.itemEntity && ItemEntity.hasEntityData(stack) : false)
{
if (settings.keyBindDrop.isPressed())
{
field.set(settings.keyBindDrop, false);
}
if (settings.keyBindSwapHands.isPressed())
{
field.set(settings.keyBindSwapHands, false);
}
for (KeyBinding keyBind : settings.keyBindsHotbar)
{
if (keyBind.isPressed())
{
field.set(keyBind, false);
}
}
}
int current = player.inventory.currentItem;
if (player.getEntityData().hasKey("carrySlot") ? player.getEntityData().getInteger("carrySlot") != current : false)
player.inventory.currentItem = player.getEntityData().getInteger("carrySlot");
}
/*
* Renders the Entity in First Person
*/
@SideOnly(Side.CLIENT)
@SubscribeEvent
public void renderHand(RenderHandEvent event)
{
World world = Minecraft.getMinecraft().theWorld;
EntityPlayer player = Minecraft.getMinecraft().thePlayer;
AbstractClientPlayer aplayer = (AbstractClientPlayer) player;
ItemStack stack = player.getHeldItemMainhand();
int perspective = Minecraft.getMinecraft().gameSettings.thirdPersonView;
float partialticks = event.getPartialTicks();
if (stack != null ? stack.getItem() == RegistrationHandler.itemEntity && ItemEntity.hasEntityData(stack) : false)
{
BlockPos pos = player.getPosition();
Entity entity = ItemEntity.getEntity(stack, world);
if (entity != null)
{
double d0 = player.lastTickPosX + (player.posX - player.lastTickPosX) * (double) partialticks;
double d1 = player.lastTickPosY + (player.posY - player.lastTickPosY) * (double) partialticks;
double d2 = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * (double) partialticks;
entity.setPosition(d0, d1, d2);
entity.rotationYaw = 0.0f;
entity.prevRotationYaw = 0.0f;
entity.setRotationYawHead(0.0f);
float height = entity.height;
float width = entity.width;
float multiplier = height * width;
GlStateManager.pushMatrix();
GlStateManager.scale(.8, .8, .8);
GlStateManager.rotate(180, 0, 1, 0);
GlStateManager.translate(0.0, -height - .1, width + 0.1);
GlStateManager.enableAlpha();
if (perspective == 0)
{
RenderHelper.enableStandardItemLighting();
Minecraft.getMinecraft().getRenderManager().setRenderShadow(false);
Minecraft.getMinecraft().getRenderManager().renderEntityStatic(entity, 0.0f, false);
Minecraft.getMinecraft().getRenderManager().setRenderShadow(true);
}
GlStateManager.disableAlpha();
GlStateManager.scale(1, 1, 1);
GlStateManager.popMatrix();
RenderHelper.disableStandardItemLighting();
GlStateManager.disableRescaleNormal();
GlStateManager.setActiveTexture(OpenGlHelper.lightmapTexUnit);
GlStateManager.disableTexture2D();
GlStateManager.setActiveTexture(OpenGlHelper.defaultTexUnit);
if (perspective == 0)
event.setCanceled(true);
}
}
}
/*
* Renders the Block in Third Person
*/
@SideOnly(Side.CLIENT)
@SubscribeEvent
public void onPlayerRenderPost(RenderPlayerEvent.Post event)
{
World world = Minecraft.getMinecraft().theWorld;
EntityPlayer player = event.getEntityPlayer();
ModelPlayer modelPlayer = event.getRenderer().getMainModel();
EntityPlayerSP clientPlayer = Minecraft.getMinecraft().thePlayer;
ItemStack stack = player.getHeldItemMainhand();
float partialticks = event.getPartialRenderTick();
if (stack != null ? stack.getItem() == RegistrationHandler.itemEntity && ItemEntity.hasEntityData(stack) : false)
{
Entity entity = ItemEntity.getEntity(stack, world);
float rotation = -(player.prevRenderYawOffset + (player.renderYawOffset - player.prevRenderYawOffset) * partialticks);
int perspective = Minecraft.getMinecraft().gameSettings.thirdPersonView;
if (entity != null)
{
double d0 = player.lastTickPosX + (player.posX - player.lastTickPosX) * (double) partialticks;
double d1 = player.lastTickPosY + (player.posY - player.lastTickPosY) * (double) partialticks;
double d2 = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * (double) partialticks;
double c0 = clientPlayer.lastTickPosX + (clientPlayer.posX - clientPlayer.lastTickPosX) * (double) partialticks;
double c1 = clientPlayer.lastTickPosY + (clientPlayer.posY - clientPlayer.lastTickPosY) * (double) partialticks;
double c2 = clientPlayer.lastTickPosZ + (clientPlayer.posZ - clientPlayer.lastTickPosZ) * (double) partialticks;
double xOffset = d0 - c0;
double yOffset = d1 - c1;
double zOffset = d2 - c2;
float height = entity.height;
float width = entity.width;
float multiplier = height * width;
entity.setPosition(c0, c1, c2);
entity.rotationYaw = 0.0f;
entity.prevRotationYaw = 0.0f;
entity.setRotationYawHead(0.0f);
GlStateManager.pushMatrix();
GlStateManager.translate(xOffset, yOffset, zOffset);
GlStateManager.scale((10 - multiplier) * 0.08, (10 - multiplier) * 0.08, (10 - multiplier) * 0.08);
GlStateManager.rotate(rotation, 0, 1f, 0);
GlStateManager.translate(0.0, (height / 2) + -(height / 2) + 1, (width - 0.1) < 0.7 ? (width - 0.1) + (0.7 - (width - 0.1)) : (width - 0.1));
if (player.isSneaking())
GlStateManager.translate(0, -0.3, 0);
Minecraft.getMinecraft().getRenderManager().setRenderShadow(false);
Minecraft.getMinecraft().getRenderManager().renderEntityStatic(entity, 0.0f, false);
Minecraft.getMinecraft().getRenderManager().setRenderShadow(true);
GlStateManager.scale(1, 1, 1);
GlStateManager.popMatrix();
}
}
}
}