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.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) {
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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 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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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",
|
||||||
|
|
Loading…
Reference in a new issue