package net.smart.render; import java.util.*; import net.minecraft.client.*; import net.minecraft.client.entity.*; import net.minecraft.client.gui.inventory.*; import net.minecraft.entity.*; import net.minecraft.entity.player.*; import net.smart.render.statistics.*; public class SmartRenderRender extends SmartRenderContext { public IRenderPlayer irp; public SmartRenderRender(IRenderPlayer irp) { this.irp = irp; modelBipedMain = irp.createModel(irp.getModelBipedMain(), 0.0F).getRenderModel(); SmartRenderModel modelArmorChestplate = irp.createModel(irp.getModelArmorChestplate(), 1.0F).getRenderModel(); SmartRenderModel modelArmor = irp.createModel(irp.getModelArmor(), 0.5F).getRenderModel(); irp.initialize(modelBipedMain.mp, modelArmorChestplate.mp, modelArmor.mp, 0.5F); } public void renderPlayer(AbstractClientPlayer entityplayer, double d, double d1, double d2, float f, float renderPartialTicks) { SmartStatistics statistics = SmartStatisticsFactory.getInstance(entityplayer); if(statistics != null) { boolean isInventory = d == 0.0F && d1 == 0.0F && d2 == 0.0F && f == 0.0F && renderPartialTicks == 1.0F; boolean isSleeping = entityplayer.isPlayerSleeping(); float totalVerticalDistance = statistics.getTotalVerticalDistance(renderPartialTicks); float currentVerticalSpeed = statistics.getCurrentVerticalSpeed(renderPartialTicks); float totalDistance = statistics.getTotalDistance(renderPartialTicks); float currentSpeed = statistics.getCurrentSpeed(renderPartialTicks); double distance = 0; double verticalDistance = 0; double horizontalDistance = 0; float currentCameraAngle = 0; float currentVerticalAngle = 0; float currentHorizontalAngle = 0; if (!isInventory) { double xDiff = entityplayer.posX - entityplayer.prevPosX; double yDiff = entityplayer.posY - entityplayer.prevPosY; double zDiff = entityplayer.posZ - entityplayer.prevPosZ; verticalDistance = Math.abs(yDiff); horizontalDistance = Math.sqrt(xDiff * xDiff + zDiff * zDiff); distance = Math.sqrt(horizontalDistance * horizontalDistance + verticalDistance * verticalDistance); currentCameraAngle = entityplayer.rotationYaw / RadiantToAngle; currentVerticalAngle = (float)Math.atan(yDiff / horizontalDistance); if(Float.isNaN(currentVerticalAngle)) currentVerticalAngle = Quarter; currentHorizontalAngle = (float)-Math.atan(xDiff / zDiff); if (Float.isNaN(currentHorizontalAngle)) if(Float.isNaN(statistics.prevHorizontalAngle)) currentHorizontalAngle = currentCameraAngle; else currentHorizontalAngle = statistics.prevHorizontalAngle; else if (zDiff < 0) currentHorizontalAngle += Half; statistics.prevHorizontalAngle = currentHorizontalAngle; } IModelPlayer[] modelPlayers = irp.getRenderModels(); for(int i = 0; i < modelPlayers.length; i++) { SmartRenderModel modelPlayer = modelPlayers[i].getRenderModel(); modelPlayer.isInventory = isInventory; modelPlayer.totalVerticalDistance = totalVerticalDistance; modelPlayer.currentVerticalSpeed = currentVerticalSpeed; modelPlayer.totalDistance = totalDistance; modelPlayer.currentSpeed = currentSpeed; modelPlayer.distance = distance; modelPlayer.verticalDistance = verticalDistance; modelPlayer.horizontalDistance = horizontalDistance; modelPlayer.currentCameraAngle = currentCameraAngle; modelPlayer.currentVerticalAngle = currentVerticalAngle; modelPlayer.currentHorizontalAngle = currentHorizontalAngle; modelPlayer.prevOuterRenderData = getPreviousRendererData(entityplayer); modelPlayer.isSleeping = isSleeping; } } irp.superRenderPlayer(entityplayer, d, d1, d2, f, renderPartialTicks); } public void drawFirstPersonHand(EntityPlayer entityPlayer) { modelBipedMain.firstPerson = true; irp.superDrawFirstPersonHand(entityPlayer); modelBipedMain.firstPerson = false; } public void rotatePlayer(AbstractClientPlayer entityplayer, float totalTime, float actualRotation, float f2) { boolean isLocal = entityplayer instanceof EntityPlayerSP; boolean isInventory = f2 == 1.0F && isLocal && Minecraft.getMinecraft().currentScreen instanceof GuiInventory; if(!isInventory) { float forwardRotation = entityplayer.prevRotationYaw + (entityplayer.rotationYaw - entityplayer.prevRotationYaw) * f2; if(entityplayer.isPlayerSleeping()) { actualRotation = 0; forwardRotation = 0; } float workingAngle; Minecraft minecraft = Minecraft.getMinecraft(); if(!isLocal) { workingAngle = -entityplayer.rotationYaw; workingAngle += minecraft.renderViewEntity.rotationYaw; } else workingAngle = actualRotation - getPreviousRendererData(entityplayer).rotateAngleY * RadiantToAngle; if(minecraft.gameSettings.thirdPersonView == 2 && !minecraft.renderViewEntity.isPlayerSleeping()) workingAngle += 180F; IModelPlayer[] modelPlayers = irp.getRenderModels(); for(int i = 0; i < modelPlayers.length; i++) { SmartRenderModel modelPlayer = modelPlayers[i].getRenderModel(); modelPlayer.actualRotation = actualRotation; modelPlayer.forwardRotation = forwardRotation; modelPlayer.workingAngle = workingAngle; } actualRotation = 0; } irp.superRotatePlayer(entityplayer, totalTime, actualRotation, f2); } public void renderSpecials(AbstractClientPlayer entityplayer, float f) { modelBipedMain.bipedEars.beforeRender(); modelBipedMain.bipedCloak.beforeRender(entityplayer, f); irp.superRenderSpecials(entityplayer, f); modelBipedMain.bipedCloak.afterRender(); modelBipedMain.bipedEars.afterRender(); } public void beforeHandleRotationFloat(EntityLivingBase entityliving, float f) { if(entityliving instanceof EntityPlayer) { SmartStatistics statistics = SmartStatisticsFactory.getInstance((EntityPlayer)entityliving); if (statistics != null) entityliving.ticksExisted += statistics.ticksRiding; } } public void afterHandleRotationFloat(EntityLivingBase entityliving, float f) { if(entityliving instanceof EntityPlayer) { SmartStatistics statistics = SmartStatisticsFactory.getInstance((EntityPlayer)entityliving); if (statistics != null) entityliving.ticksExisted -= statistics.ticksRiding; } } public static RendererData getPreviousRendererData(EntityPlayer entityplayer) { if(++previousRendererDataAccessCounter > 1000) { List players = Minecraft.getMinecraft().theWorld.playerEntities; Iterator<EntityPlayer> iterator = previousRendererData.keySet().iterator(); while(iterator.hasNext()) if(!players.contains(iterator.next())) iterator.remove(); previousRendererDataAccessCounter = 0; } RendererData result = previousRendererData.get(entityplayer); if(result == null) previousRendererData.put(entityplayer, result = new RendererData()); return result; } private static Map<EntityPlayer, RendererData> previousRendererData = new HashMap<EntityPlayer, RendererData>(); private static int previousRendererDataAccessCounter = 0; public final SmartRenderModel modelBipedMain; }