Implement proper underwater vision for seaponies

This commit is contained in:
Sollace 2023-11-09 19:19:35 +00:00
parent e0826bf1e3
commit 617a5f3a9f
No known key found for this signature in database
GPG key ID: E52FACE7B5C773DB
5 changed files with 32 additions and 19 deletions

View file

@ -14,9 +14,11 @@ import com.minelittlepony.unicopia.entity.ItemImpl;
import com.minelittlepony.unicopia.entity.Living;
import com.minelittlepony.unicopia.entity.duck.LavaAffine;
import com.minelittlepony.unicopia.entity.player.Pony;
import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.render.*;
import net.minecraft.client.render.BackgroundRenderer.FogType;
import net.minecraft.client.render.VertexConsumerProvider.Immediate;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.entity.*;
@ -46,6 +48,15 @@ public class WorldRenderDelegate {
return Optional.empty();
}
public void applyFog(Camera camera, FogType fogType, float viewDistance, boolean thickFog, float tickDelta) {
if (camera.getSubmersionType() == CameraSubmersionType.WATER) {
if (EquinePredicates.PLAYER_SEAPONY.test(MinecraftClient.getInstance().player)) {
RenderSystem.setShaderFogStart(RenderSystem.getShaderFogStart() - 30);
RenderSystem.setShaderFogEnd(RenderSystem.getShaderFogEnd() + 190);
}
}
}
public boolean beforeEntityRender(Entity entity,
double x, double y, double z, float yaw,
float tickDelta, MatrixStack matrices, VertexConsumerProvider vertices, int light) {

View file

@ -3,11 +3,9 @@ package com.minelittlepony.unicopia.entity.player;
import java.util.Optional;
import com.minelittlepony.common.util.animation.MotionCompositor;
import com.minelittlepony.unicopia.Race;
import com.minelittlepony.unicopia.ability.magic.SpellPredicate;
import com.minelittlepony.unicopia.ability.magic.spell.AbstractDisguiseSpell;
import net.minecraft.client.render.CameraSubmersionType;
import net.minecraft.util.math.Vec3d;
public class PlayerCamera extends MotionCompositor {
@ -61,15 +59,6 @@ public class PlayerCamera extends MotionCompositor {
.map(d -> distance * d);
}
public Optional<CameraSubmersionType> getSubmersionType(CameraSubmersionType original) {
if (player.getCompositeRace().includes(Race.SEAPONY)) {
if (original == CameraSubmersionType.WATER) {
return Optional.of(CameraSubmersionType.NONE);
}
}
return Optional.empty();
}
public double calculateFieldOfView(double fov) {
fov += player.getMagicalReserves().getExertion().get() / 5F;
fov += getEnergyAddition();

View file

@ -0,0 +1,20 @@
package com.minelittlepony.unicopia.mixin.client;
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 com.minelittlepony.unicopia.client.render.WorldRenderDelegate;
import net.minecraft.client.render.BackgroundRenderer;
import net.minecraft.client.render.Camera;
import net.minecraft.client.render.BackgroundRenderer.FogType;
@Mixin(BackgroundRenderer.class)
abstract class MixinBackgroundRenderer {
@Inject(method = "applyFog", at = @At("RETURN"))
private static void onApplyFog(Camera camera, FogType fogType, float viewDistance, boolean thickFog, float tickDelta, CallbackInfo info) {
WorldRenderDelegate.INSTANCE.applyFog(camera, fogType, viewDistance, thickFog, tickDelta);
}
}

View file

@ -8,7 +8,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import com.minelittlepony.unicopia.client.UnicopiaClient;
import net.minecraft.client.render.Camera;
import net.minecraft.client.render.CameraSubmersionType;
@Mixin(Camera.class)
abstract class MixinCamera {
@ -34,11 +33,4 @@ abstract class MixinCamera {
private void redirectCameraDistance(double initial, CallbackInfoReturnable<Double> info) {
UnicopiaClient.getCamera().flatMap(c -> c.calculateDistance(info.getReturnValueD())).ifPresent(info::setReturnValue);
}
@Inject(method = "getSubmersionType",
at = @At("RETURN"),
cancellable = true)
public void getSubmersionType(CallbackInfoReturnable<CameraSubmersionType> info) {
UnicopiaClient.getCamera().flatMap(c -> c.getSubmersionType(info.getReturnValue())).ifPresent(info::setReturnValue);
}
}

View file

@ -59,6 +59,7 @@
"client": [
"client.MixinAnimalModel",
"client.MixinArmorFeatureRenderer",
"client.MixinBackgroundRenderer",
"client.MixinCamera",
"client.MixinClientWorld",
"client.MixinEntityRenderDispatcher",