/*
* Copyright (C) 2022 NotEnoughUpdates contributors
*
* This file is part of NotEnoughUpdates.
*
* NotEnoughUpdates is free software: you can redistribute it
* and/or modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation, either
* version 3 of the License, or (at your option) any later version.
*
* NotEnoughUpdates 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with NotEnoughUpdates. If not, see .
*/
package io.github.moulberry.notenoughupdates.mixins;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
import io.github.moulberry.notenoughupdates.miscfeatures.FishingHelper;
import io.github.moulberry.notenoughupdates.util.SpecialColour;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.WorldRenderer;
import net.minecraft.client.renderer.entity.Render;
import net.minecraft.client.renderer.entity.RenderFish;
import net.minecraft.client.renderer.entity.RenderManager;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.entity.projectile.EntityFishHook;
import net.minecraft.init.Items;
import net.minecraft.util.MathHelper;
import net.minecraft.util.Vec3;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL14;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.awt.*;
@Mixin(RenderFish.class)
public abstract class MixinRenderFish extends Render {
protected MixinRenderFish(RenderManager renderManager) {
super(renderManager);
}
@Inject(method = "doRender(Lnet/minecraft/entity/projectile/EntityFishHook;DDDFF)V", at = @At(value = "HEAD"), cancellable = true)
public void render(
EntityFishHook entity,
double x,
double y,
double z,
float entityYaw,
float partialTicks,
CallbackInfo ci
) {
if (NotEnoughUpdates.INSTANCE.config.fishing.hideOtherPlayerAll &&
entity != null && entity.angler != Minecraft.getMinecraft().thePlayer) {
ci.cancel();
return;
}
if ((!NotEnoughUpdates.INSTANCE.config.fishing.enableRodColours &&
FishingHelper.getInstance().warningState == FishingHelper.PlayerWarningState.NOTHING) || entity == null)
return;
String internalname = NotEnoughUpdates.INSTANCE.manager.getInternalNameForItem(entity.angler.getHeldItem());
if (NotEnoughUpdates.INSTANCE.isOnSkyblock() && internalname != null && entity.angler != null &&
entity.angler.getHeldItem().getItem().equals(Items.fishing_rod)) {
if (!internalname.equals("GRAPPLING_HOOK") && !internalname.endsWith("_WHIP")) {
ci.cancel();
GlStateManager.pushMatrix();
GlStateManager.translate((float) x, (float) y, (float) z);
GlStateManager.enableRescaleNormal();
GlStateManager.scale(0.5F, 0.5F, 0.5F);
GlStateManager.rotate(180.0F - this.renderManager.playerViewY, 0.0F, 1.0F, 0.0F);
GlStateManager.rotate(-this.renderManager.playerViewX, 1.0F, 0.0F, 0.0F);
this.bindEntityTexture(entity);
Tessellator tessellator = Tessellator.getInstance();
WorldRenderer worldrenderer = tessellator.getWorldRenderer();
worldrenderer.begin(7, DefaultVertexFormats.POSITION_TEX_NORMAL);
worldrenderer.pos(-0.5D, -0.5D, 0.0D).tex(0.0625D, 0.1875D).normal(0.0F, 1.0F, 0.0F).endVertex();
worldrenderer.pos(0.5D, -0.5D, 0.0D).tex(0.125D, 0.1875D).normal(0.0F, 1.0F, 0.0F).endVertex();
worldrenderer.pos(0.5D, 0.5D, 0.0D).tex(0.125D, 0.125D).normal(0.0F, 1.0F, 0.0F).endVertex();
worldrenderer.pos(-0.5D, 0.5D, 0.0D).tex(0.0625D, 0.125D).normal(0.0F, 1.0F, 0.0F).endVertex();
tessellator.draw();
FishingHelper.getInstance().onRenderBobber(entity);
GlStateManager.disableRescaleNormal();
GlStateManager.popMatrix();
double playerVecX;
double playerVecY;
double playerVecZ;
double startY;
if (this.renderManager.options.thirdPersonView == 0 && entity.angler == Minecraft.getMinecraft().thePlayer) {
float f7 = entity.angler.getSwingProgress(partialTicks);
float sqrtSinSwing = MathHelper.sin(MathHelper.sqrt_float(f7) * (float) Math.PI);
double decimalFov = (this.renderManager.options.fovSetting / 110.0D);
Vec3 fppOffset = new Vec3(
(-decimalFov + (decimalFov / 2.5) - (decimalFov / 8)) + 0.025,
-0.045D * (this.renderManager.options.fovSetting / 100.0D),
0.4D
);
fppOffset = fppOffset.rotatePitch(
-mathLerp(partialTicks, entity.angler.prevRotationPitch, entity.angler.rotationPitch) *
((float) Math.PI / 180.0F));
fppOffset = fppOffset.rotateYaw(
-mathLerp(partialTicks, entity.angler.prevRotationYaw, entity.angler.rotationYaw) *
((float) Math.PI / 180.0F));
fppOffset = fppOffset.rotateYaw(sqrtSinSwing * 0.5F);
fppOffset = fppOffset.rotatePitch(-sqrtSinSwing * 0.7F);
playerVecX = entity.angler.prevPosX + (entity.angler.posX - entity.angler.prevPosX) * (double) partialTicks +
fppOffset.xCoord;
playerVecY = entity.angler.prevPosY + (entity.angler.posY - entity.angler.prevPosY) * (double) partialTicks +
fppOffset.yCoord;
playerVecZ = entity.angler.prevPosZ + (entity.angler.posZ - entity.angler.prevPosZ) * (double) partialTicks +
fppOffset.zCoord;
startY = entity.angler.getEyeHeight();
} else {
float angle = (entity.angler.prevRenderYawOffset +
(entity.angler.renderYawOffset - entity.angler.prevRenderYawOffset) * partialTicks) * (float) Math.PI /
180.0F;
double d4 = MathHelper.sin(angle);
double d6 = MathHelper.cos(angle);
playerVecX = entity.angler.prevPosX + (entity.angler.posX - entity.angler.prevPosX) * (double) partialTicks -
d6 * 0.35D - d4 * 0.8D;
playerVecY = entity.angler.prevPosY + entity.angler.getEyeHeight() +
(entity.angler.posY - entity.angler.prevPosY) * (double) partialTicks - 0.45D;
playerVecZ = entity.angler.prevPosZ + (entity.angler.posZ - entity.angler.prevPosZ) * (double) partialTicks -
d4 * 0.35D + d6 * 0.8D;
startY = entity.angler.isSneaking() ? -0.1875D : 0.0D;
}
double d13 = entity.prevPosX + (entity.posX - entity.prevPosX) * (double) partialTicks;
double d5 = entity.prevPosY + (entity.posY - entity.prevPosY) * (double) partialTicks + 0.25D;
double d7 = entity.prevPosZ + (entity.posZ - entity.prevPosZ) * (double) partialTicks;
double d9 = (float) (playerVecX - d13);
double d11 = (double) ((float) (playerVecY - d5)) + startY;
double d12 = (float) (playerVecZ - d7);
GlStateManager.disableTexture2D();
GlStateManager.disableLighting();
GlStateManager.enableBlend();
GL14.glBlendFuncSeparate(
GL11.GL_SRC_ALPHA,
GL11.GL_ONE_MINUS_SRC_ALPHA,
GL11.GL_ONE,
GL11.GL_ONE_MINUS_SRC_ALPHA
);
worldrenderer.begin(3, DefaultVertexFormats.POSITION_COLOR);
String specialColour;
if (entity.angler.getUniqueID().equals(Minecraft.getMinecraft().thePlayer.getUniqueID())) {
specialColour = NotEnoughUpdates.INSTANCE.config.fishing.ownRodColour;
} else {
specialColour = NotEnoughUpdates.INSTANCE.config.fishing.otherRodColour;
}
int colourI = SpecialColour.specialToChromaRGB(specialColour);
for (int l = 0; l <= 16; ++l) {
if (SpecialColour.getSpeed(specialColour) > 0) { //has chroma
colourI = SpecialColour.rotateHue(colourI, 10);
}
Color colour = new Color(colourI, true);
float f10 = (float) l / 16.0F;
worldrenderer.pos(
x + d9 * (double) f10,
y + d11 * (double) (f10 * f10 + f10) * 0.5D + 0.25D,
z + d12 * (double) f10
)
.color(colour.getRed(), colour.getGreen(), colour.getBlue(), colour.getAlpha()).endVertex();
}
tessellator.draw();
GlStateManager.disableBlend();
GlStateManager.enableLighting();
GlStateManager.enableTexture2D();
}
}
}
private static float mathLerp(float var1, float var2, float var3) {
return var2 + var1 * (var3 - var2);
}
private static double mathLerp(double var1, double var2, double var3) {
return var2 + var1 * (var3 - var2);
}
}