305 lines
9.9 KiB
Java
305 lines
9.9 KiB
Java
package tschipp.carryon.client.event;
|
|
|
|
import java.lang.reflect.Field;
|
|
|
|
import net.minecraft.block.Block;
|
|
import net.minecraft.block.state.IBlockState;
|
|
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.ModelBiped;
|
|
import net.minecraft.client.model.ModelRenderer;
|
|
import net.minecraft.client.renderer.GlStateManager;
|
|
import net.minecraft.client.renderer.block.model.IBakedModel;
|
|
import net.minecraft.client.renderer.entity.RenderManager;
|
|
import net.minecraft.client.renderer.entity.RenderPlayer;
|
|
import net.minecraft.client.resources.DefaultPlayerSkin;
|
|
import net.minecraft.client.settings.GameSettings;
|
|
import net.minecraft.client.settings.KeyBinding;
|
|
import net.minecraft.entity.item.EntityItem;
|
|
import net.minecraft.entity.player.EntityPlayer;
|
|
import net.minecraft.init.Blocks;
|
|
import net.minecraft.item.ItemStack;
|
|
import net.minecraft.nbt.NBTTagCompound;
|
|
import net.minecraft.util.EnumHand;
|
|
import net.minecraft.util.ResourceLocation;
|
|
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.config.CarryOnConfig;
|
|
import tschipp.carryon.common.handler.ModelOverridesHandler;
|
|
import tschipp.carryon.common.handler.RegistrationHandler;
|
|
import tschipp.carryon.common.item.ItemTile;
|
|
|
|
public class RenderEvents
|
|
{
|
|
|
|
/*
|
|
* Prevents the Player from scrolling
|
|
*/
|
|
@SideOnly(Side.CLIENT)
|
|
@SubscribeEvent
|
|
public void onScroll(MouseEvent event)
|
|
{
|
|
if (event.getDwheel() > 0 || event.getDwheel() < 0)
|
|
{
|
|
ItemStack stack = Minecraft.getMinecraft().player.getHeldItemMainhand();
|
|
if (!stack.isEmpty() && stack.getItem() == RegistrationHandler.itemTile)
|
|
{
|
|
if (ItemTile.hasTileData(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().player;
|
|
if (player != null)
|
|
{
|
|
ItemStack stack = player.getHeldItem(EnumHand.MAIN_HAND);
|
|
if (inventory && !stack.isEmpty() && stack.getItem() == RegistrationHandler.itemTile && ItemTile.hasTileData(stack))
|
|
{
|
|
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
|
|
{
|
|
GameSettings settings = Minecraft.getMinecraft().gameSettings;
|
|
Field field = KeyBinding.class.getDeclaredFields()[7];
|
|
field.setAccessible(true);
|
|
ItemStack stack = Minecraft.getMinecraft().player.getHeldItemMainhand();
|
|
if (!stack.isEmpty() && stack.getItem() == RegistrationHandler.itemTile && ItemTile.hasTileData(stack))
|
|
{
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Renders the Block in First Person
|
|
*/
|
|
@SideOnly(Side.CLIENT)
|
|
@SubscribeEvent
|
|
public void renderHand(RenderHandEvent event)
|
|
{
|
|
World world = Minecraft.getMinecraft().world;
|
|
EntityPlayer player = Minecraft.getMinecraft().player;
|
|
ItemStack stack = player.getHeldItemMainhand();
|
|
|
|
if (!stack.isEmpty() && stack.getItem() == RegistrationHandler.itemTile && ItemTile.hasTileData(stack))
|
|
{
|
|
Block block = ItemTile.getBlock(stack);
|
|
BlockPos pos = player.getPosition();
|
|
NBTTagCompound tag = ItemTile.getTileData(stack);
|
|
IBlockState state = ItemTile.getBlockState(stack);
|
|
|
|
ItemStack tileStack = ItemTile.getItemStack(stack);
|
|
|
|
int perspective = Minecraft.getMinecraft().gameSettings.thirdPersonView;
|
|
|
|
GlStateManager.pushMatrix();
|
|
GlStateManager.scale(2.5, 2.5, 2.5);
|
|
GlStateManager.translate(0, -0.6, -1);
|
|
|
|
if (CarryOnConfig.settings.facePlayer ? !isChest(block) : isChest(block))
|
|
{
|
|
GlStateManager.rotate(180, 0, 1f, 0);
|
|
GlStateManager.rotate(-8, 1f, 0, 0);
|
|
}
|
|
else
|
|
GlStateManager.rotate(8, 1f, 0, 0);
|
|
|
|
if (perspective == 0)
|
|
Minecraft.getMinecraft().getRenderItem().renderItem(tileStack.isEmpty() ? stack : tileStack, ModelOverridesHandler.hasCustomOverrideModel(state, tag) ? ModelOverridesHandler.getCustomOverrideModel(state, tag) : Minecraft.getMinecraft().getRenderItem().getItemModelWithOverrides(tileStack, world, player));
|
|
|
|
GlStateManager.scale(1, 1, 1);
|
|
GlStateManager.popMatrix();
|
|
|
|
if (perspective == 0)
|
|
event.setCanceled(true);
|
|
}
|
|
else
|
|
event.setCanceled(false);
|
|
}
|
|
|
|
/*
|
|
* Renders the Block in Third Person
|
|
*/
|
|
@SideOnly(Side.CLIENT)
|
|
@SubscribeEvent
|
|
public void onPlayerRenderPost(RenderPlayerEvent.Post event)
|
|
{
|
|
World world = Minecraft.getMinecraft().world;
|
|
EntityPlayer player = event.getEntityPlayer();
|
|
ModelBiped modelBiped = event.getRenderer().getMainModel();
|
|
EntityPlayerSP clientPlayer = Minecraft.getMinecraft().player;
|
|
ItemStack stack = player.getHeldItemMainhand();
|
|
if (!stack.isEmpty() && stack.getItem() == RegistrationHandler.itemTile && ItemTile.hasTileData(stack))
|
|
{
|
|
Block block = ItemTile.getBlock(stack);
|
|
IBlockState state = ItemTile.getBlockState(stack);
|
|
NBTTagCompound tag = ItemTile.getTileData(stack);
|
|
|
|
ItemStack tileItem = ItemTile.getItemStack(stack);
|
|
|
|
float rotation = -player.renderYawOffset;
|
|
int perspective = Minecraft.getMinecraft().gameSettings.thirdPersonView;
|
|
|
|
double xOffset = (double) player.posX - (double) clientPlayer.posX;
|
|
double yOffset = (double) player.posY - (double) clientPlayer.posY;
|
|
double zOffset = (double) player.posZ - (double) clientPlayer.posZ;
|
|
|
|
GlStateManager.pushMatrix();
|
|
GlStateManager.translate(xOffset, yOffset, zOffset);
|
|
GlStateManager.scale(0.6, 0.6, 0.6);
|
|
|
|
if (CarryOnConfig.settings.facePlayer ? !isChest(block) : isChest(block))
|
|
{
|
|
GlStateManager.rotate(rotation, 0, 1.0f, 0);
|
|
GlStateManager.translate(0, 1.6, 0.65);
|
|
}
|
|
else
|
|
{
|
|
GlStateManager.rotate(rotation + 180, 0, 1.0f, 0);
|
|
GlStateManager.translate(0, 1.6, -0.65);
|
|
}
|
|
|
|
if (player.isSneaking())
|
|
GlStateManager.translate(0, -0.3, 0);
|
|
|
|
IBakedModel model = ModelOverridesHandler.hasCustomOverrideModel(state, tag) ? ModelOverridesHandler.getCustomOverrideModel(state, tag) : Minecraft.getMinecraft().getRenderItem().getItemModelWithOverrides(tileItem, world, player);
|
|
Minecraft.getMinecraft().getRenderItem().renderItem(tileItem.isEmpty() ? stack : tileItem, model);
|
|
|
|
GlStateManager.scale(1, 1, 1);
|
|
|
|
GlStateManager.popMatrix();
|
|
}
|
|
else
|
|
{
|
|
modelBiped.bipedLeftArm.isHidden = false;
|
|
modelBiped.bipedRightArm.isHidden = false;
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Renders correct arm rotation
|
|
*/
|
|
@SideOnly(Side.CLIENT)
|
|
@SubscribeEvent
|
|
public void onPlayerRenderPre(RenderPlayerEvent.Pre event)
|
|
{
|
|
EntityPlayer player = event.getEntityPlayer();
|
|
AbstractClientPlayer aplayer = (AbstractClientPlayer) player;
|
|
ItemStack stack = player.getHeldItemMainhand();
|
|
ModelBiped model = event.getRenderer().getMainModel();
|
|
EntityPlayerSP clientPlayer = Minecraft.getMinecraft().player;
|
|
|
|
ResourceLocation skinLoc = DefaultPlayerSkin.getDefaultSkin(player.getPersistentID());
|
|
|
|
if (!stack.isEmpty() && stack.getItem() == RegistrationHandler.itemTile && ItemTile.hasTileData(stack))
|
|
{
|
|
model.bipedLeftArm.isHidden = true;
|
|
model.bipedRightArm.isHidden = true;
|
|
|
|
Minecraft.getMinecraft().getTextureManager().bindTexture(skinLoc);
|
|
float rotation = -player.renderYawOffset;
|
|
ModelRenderer fakeLeftArm = new ModelRenderer(model, 40, 16);
|
|
fakeLeftArm.mirror = true;
|
|
if (aplayer.getSkinType().equals("default"))
|
|
{
|
|
fakeLeftArm.addBox(model.bipedLeftArm.offsetX + 4.2F, model.bipedLeftArm.offsetY, model.bipedLeftArm.offsetZ, 4, 12, 4, .08F);
|
|
}
|
|
else
|
|
{
|
|
fakeLeftArm.addBox(model.bipedLeftArm.offsetX + 4.2F, model.bipedLeftArm.offsetY, model.bipedLeftArm.offsetZ, 3, 12, 4, .08F);
|
|
}
|
|
|
|
ModelRenderer fakeRightArm = new ModelRenderer(model, 40, 16);
|
|
fakeRightArm.mirror = true;
|
|
if (aplayer.getSkinType().equals("default"))
|
|
{
|
|
fakeRightArm.addBox(model.bipedRightArm.offsetX - 7.9F, model.bipedRightArm.offsetY, model.bipedRightArm.offsetZ, 4, 12, 4, .08F);
|
|
}
|
|
else
|
|
{
|
|
fakeRightArm.addBox(model.bipedRightArm.offsetX - 7.2F, model.bipedRightArm.offsetY, model.bipedRightArm.offsetZ, 3, 12, 4, .08F);
|
|
}
|
|
|
|
fakeRightArm.rotateAngleX = -.9F;
|
|
fakeLeftArm.rotateAngleX = -.9F;
|
|
model.bipedBody.addChild(fakeLeftArm);
|
|
model.bipedBody.addChild(fakeRightArm);
|
|
|
|
}
|
|
else
|
|
{
|
|
model.bipedLeftArm.isHidden = false;
|
|
model.bipedRightArm.isHidden = false;
|
|
if (model.bipedBody.childModels != null && !model.bipedBody.childModels.isEmpty())
|
|
{
|
|
model.bipedBody.childModels.clear();
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
public static boolean isChest(Block block)
|
|
{
|
|
return block == Blocks.CHEST || block == Blocks.ENDER_CHEST || block == Blocks.TRAPPED_CHEST;
|
|
}
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
private static RenderPlayer getRenderPlayer(AbstractClientPlayer player)
|
|
{
|
|
Minecraft mc = Minecraft.getMinecraft();
|
|
RenderManager manager = mc.getRenderManager();
|
|
return manager.getSkinMap().get(player.getSkinType());
|
|
}
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
private static ModelBiped getPlayerModel(AbstractClientPlayer player)
|
|
{
|
|
return getRenderPlayer(player).getMainModel();
|
|
}
|
|
|
|
}
|