TheWildBackport/common/src/main/java/com/cursedcauldron/wildbackport/client/render/ChestBoatRenderer.java
2022-07-10 00:16:25 -04:00

86 lines
4.1 KiB
Java

package com.cursedcauldron.wildbackport.client.render;
import com.cursedcauldron.wildbackport.WildBackport;
import com.cursedcauldron.wildbackport.client.render.model.ChestBoatModel;
import com.cursedcauldron.wildbackport.common.entities.MangroveBoat;
import com.cursedcauldron.wildbackport.common.entities.access.api.BoatTypes;
import com.google.common.collect.ImmutableMap;
import com.ibm.icu.impl.Pair;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import com.mojang.math.Quaternion;
import com.mojang.math.Vector3f;
import net.minecraft.client.model.geom.ModelLayerLocation;
import net.minecraft.client.model.geom.ModelLayers;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.entity.EntityRenderer;
import net.minecraft.client.renderer.entity.EntityRendererProvider;
import net.minecraft.client.renderer.texture.OverlayTexture;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.Mth;
import net.minecraft.world.entity.vehicle.Boat;
import java.util.Map;
import java.util.stream.Stream;
//<>
public class ChestBoatRenderer extends EntityRenderer<MangroveBoat> {
private final Map<Boat.Type, Pair<ResourceLocation, ChestBoatModel>> boatResources;
public ChestBoatRenderer(EntityRendererProvider.Context context, boolean chest) {
super(context);
this.shadowRadius = 0.8F;
this.boatResources = Stream.of(Boat.Type.values()).collect(ImmutableMap.toImmutableMap(type -> type, type -> Pair.of(getTexture(type, chest), this.createModel(context, type, chest))));
}
private ChestBoatModel createModel(EntityRendererProvider.Context context, Boat.Type type, boolean chest) {
ModelLayerLocation layer = chest ? ChestBoatModel.createChestBoat(type) : ModelLayers.createBoatModelName(type);
return new ChestBoatModel(context.bakeLayer(layer), chest);
}
private static ResourceLocation getTexture(Boat.Type type, boolean chested) {
if (chested) {
return new ResourceLocation(WildBackport.MOD_ID, "textures/entity/chest_boat/" + type.getName() + ".png");
} else {
return new ResourceLocation(type == BoatTypes.MANGROVE.get() ? WildBackport.MOD_ID: "minecraft", "textures/entity/boat/" + type.getName() + ".png");
}
}
@Override
public void render(MangroveBoat boat, float yaw, float angle, PoseStack stack, MultiBufferSource buffer, int light) {
stack.pushPose();
stack.translate(0.0D, 0.375D, 0.0D);
stack.mulPose(Vector3f.YP.rotationDegrees(180.0F - yaw));
float hurtTilt = (float)boat.getHurtTime() - angle;
float damageTilt = boat.getDamage() - angle;
if (damageTilt < 0.0F) damageTilt = 0.0F;
if (hurtTilt > 0.0F) stack.mulPose(Vector3f.XP.rotationDegrees(Mth.sin(hurtTilt) * hurtTilt * damageTilt / 10.0F * (float)boat.getHurtDir()));
float bubbleTilt = boat.getBubbleAngle(angle);
if (!Mth.equal(bubbleTilt, 0.0F)) stack.mulPose(new Quaternion(new Vector3f(1.0F, 0.0F, 1.0F), boat.getBubbleAngle(angle), true));
Pair<ResourceLocation, ChestBoatModel> resource = this.boatResources.get(boat.getBoatType());
ResourceLocation location = resource.first;
ChestBoatModel model = resource.second;
stack.scale(-1.0F, -1.0F, 1.0F);
stack.mulPose(Vector3f.YP.rotationDegrees(90.0F));
model.setupAnim(boat, angle, 0.0F, -0.1F, 0.0F, 0.0F);
VertexConsumer render = buffer.getBuffer(model.renderType(location));
model.renderToBuffer(stack, render, light, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F);
if (!boat.isUnderWater()) {
VertexConsumer waterRender = buffer.getBuffer(RenderType.waterMask());
model.waterPatch().render(stack, waterRender, light, OverlayTexture.NO_OVERLAY);
}
stack.popPose();
super.render(boat, yaw, angle, stack, buffer, light);
}
@Override
public ResourceLocation getTextureLocation(MangroveBoat boat) {
return this.boatResources.get(boat.getBoatType()).first;
}
}