mirror of
https://github.com/Sollace/Unicopia.git
synced 2025-02-01 11:36:43 +01:00
Implement proper underwater vision for seaponies
This commit is contained in:
parent
e0826bf1e3
commit
617a5f3a9f
5 changed files with 32 additions and 19 deletions
|
@ -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) {
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -59,6 +59,7 @@
|
|||
"client": [
|
||||
"client.MixinAnimalModel",
|
||||
"client.MixinArmorFeatureRenderer",
|
||||
"client.MixinBackgroundRenderer",
|
||||
"client.MixinCamera",
|
||||
"client.MixinClientWorld",
|
||||
"client.MixinEntityRenderDispatcher",
|
||||
|
|
Loading…
Reference in a new issue