/* * This file is part of Matter Overdrive * Copyright (c) 2015., Simeon Radivoev, All rights reserved. * * Matter Overdrive is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Matter Overdrive is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Matter Overdrive. If not, see <http://www.gnu.org/licenses>. */ package matteroverdrive.client.render.conversation; import matteroverdrive.api.dialog.IDialogMessage; import matteroverdrive.api.renderer.IDialogShot; import matteroverdrive.client.render.entity.EntityFakePlayer; import matteroverdrive.gui.GuiDialog; import matteroverdrive.util.math.MOMathHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.EntityRenderer; import net.minecraft.client.resources.IResourceManager; import net.minecraft.entity.EntityLivingBase; import net.minecraft.util.Vec3; import java.util.Random; /** * Created by Simeon on 8/9/2015. */ public class EntityRendererConversation extends EntityRenderer { EntityFakePlayer fakePlayer; Minecraft mc; Random random; public EntityRendererConversation(Minecraft minecraft, IResourceManager resourceManager) { super(minecraft, resourceManager); this.mc = minecraft; random = new Random(); } public void renderWorld(float ticks, long time) { if (fakePlayer == null) { fakePlayer = new EntityFakePlayer(mc.theWorld, mc.thePlayer.getGameProfile()); } boolean lastHideGui = mc.gameSettings.hideGUI; EntityLivingBase lastRenderViewEntity = mc.renderViewEntity; if (mc.currentScreen instanceof GuiDialog) { mc.gameSettings.hideGUI = true; mc.renderViewEntity = fakePlayer; GuiDialog guiDialog = (GuiDialog)mc.currentScreen; IDialogMessage message = guiDialog.getCurrentMessage(); if (message != null) { random.setSeed(guiDialog.getSeed()); IDialogShot[] shots = message.getShots(guiDialog.getNpc(), mc.thePlayer); if (shots != null && shots.length > 0) { shots[random.nextInt(shots.length)].positionCamera(guiDialog.getNpc().getEntity(), mc.thePlayer, ticks, this); } else { DialogShot.wideNormal.positionCamera(guiDialog.getNpc().getEntity(), mc.thePlayer, ticks, this); } } updateFakePlayerPositions(); } super.renderWorld(ticks, time); mc.renderViewEntity = lastRenderViewEntity; mc.gameSettings.hideGUI = lastHideGui; } public Vec3 getLook(EntityLivingBase active, EntityLivingBase other, float ticks) { return getPosition(other, ticks, false).subtract(getPosition(active, ticks, false)); } public Vec3 getPosition(EntityLivingBase entityLivingBase, float ticks, boolean includeHeight) { Vec3 pos = entityLivingBase.getPosition(ticks); if (includeHeight) pos.addVector(0, entityLivingBase.getEyeHeight(), 0); return pos; } public void rotateCameraYawTo(Vec3 dir, float offset) { double yaw = Math.acos(Vec3.createVectorHelper(-1, 0, 0).dotProduct(dir)); Vec3 cross = Vec3.createVectorHelper(-1, 0, 0).crossProduct(dir); Vec3 up = Vec3.createVectorHelper(0, -1, 0); if (up.dotProduct(cross) < 0) { yaw = -yaw; } yaw = Math.PI + yaw; setCameraYaw((float) Math.toDegrees(yaw) + offset); } private void rotatePitchToDir(Vec3 dir, float yaw,float offset) { setCameraPitch((float) Math.asin(Math.sqrt(dir.xCoord * dir.xCoord + dir.yCoord * dir.yCoord) / dir.zCoord) + offset); } public void setCameraPosition(double x, double y, double z) { fakePlayer.posX = x; fakePlayer.posY = y; fakePlayer.posZ = z; } public void setCameraPosition(Vec3 position) { fakePlayer.posX = position.xCoord; fakePlayer.posY = position.yCoord; fakePlayer.posZ = position.zCoord; } public void setCameraYaw(float angle) { fakePlayer.rotationYaw = angle; } public void setCameraPitch(float angle) { fakePlayer.rotationPitch = angle; } public void setCameraPositionSmooth(float angle, float speed) { fakePlayer.rotationPitch = MOMathHelper.Lerp(fakePlayer.rotationPitch,angle,speed); } private void updateFakePlayerPositions() { fakePlayer.prevPosX = fakePlayer.lastTickPosX = fakePlayer.posX; fakePlayer.prevPosY = fakePlayer.lastTickPosY = fakePlayer.posY; fakePlayer.prevPosZ = fakePlayer.lastTickPosZ = fakePlayer.posZ; fakePlayer.prevRotationPitch = fakePlayer.rotationPitch; fakePlayer.prevRotationYaw = fakePlayer.rotationYaw; fakePlayer.prevRotationYawHead = fakePlayer.rotationYawHead; } }