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.Living;
import com.minelittlepony.unicopia.entity.duck.LavaAffine; import com.minelittlepony.unicopia.entity.duck.LavaAffine;
import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.entity.player.Pony;
import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.render.*; import net.minecraft.client.render.*;
import net.minecraft.client.render.BackgroundRenderer.FogType;
import net.minecraft.client.render.VertexConsumerProvider.Immediate; import net.minecraft.client.render.VertexConsumerProvider.Immediate;
import net.minecraft.client.util.math.MatrixStack; import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.entity.*; import net.minecraft.entity.*;
@ -46,6 +48,15 @@ public class WorldRenderDelegate {
return Optional.empty(); 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, public boolean beforeEntityRender(Entity entity,
double x, double y, double z, float yaw, double x, double y, double z, float yaw,
float tickDelta, MatrixStack matrices, VertexConsumerProvider vertices, int light) { 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 java.util.Optional;
import com.minelittlepony.common.util.animation.MotionCompositor; 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.SpellPredicate;
import com.minelittlepony.unicopia.ability.magic.spell.AbstractDisguiseSpell; import com.minelittlepony.unicopia.ability.magic.spell.AbstractDisguiseSpell;
import net.minecraft.client.render.CameraSubmersionType;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
public class PlayerCamera extends MotionCompositor { public class PlayerCamera extends MotionCompositor {
@ -61,15 +59,6 @@ public class PlayerCamera extends MotionCompositor {
.map(d -> distance * d); .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) { public double calculateFieldOfView(double fov) {
fov += player.getMagicalReserves().getExertion().get() / 5F; fov += player.getMagicalReserves().getExertion().get() / 5F;
fov += getEnergyAddition(); 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 com.minelittlepony.unicopia.client.UnicopiaClient;
import net.minecraft.client.render.Camera; import net.minecraft.client.render.Camera;
import net.minecraft.client.render.CameraSubmersionType;
@Mixin(Camera.class) @Mixin(Camera.class)
abstract class MixinCamera { abstract class MixinCamera {
@ -34,11 +33,4 @@ abstract class MixinCamera {
private void redirectCameraDistance(double initial, CallbackInfoReturnable<Double> info) { private void redirectCameraDistance(double initial, CallbackInfoReturnable<Double> info) {
UnicopiaClient.getCamera().flatMap(c -> c.calculateDistance(info.getReturnValueD())).ifPresent(info::setReturnValue); 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": [
"client.MixinAnimalModel", "client.MixinAnimalModel",
"client.MixinArmorFeatureRenderer", "client.MixinArmorFeatureRenderer",
"client.MixinBackgroundRenderer",
"client.MixinCamera", "client.MixinCamera",
"client.MixinClientWorld", "client.MixinClientWorld",
"client.MixinEntityRenderDispatcher", "client.MixinEntityRenderDispatcher",