mirror of
https://github.com/Sollace/Unicopia.git
synced 2025-02-01 11:36:43 +01:00
Added bat wings
This commit is contained in:
parent
b11bd928ae
commit
caf0175155
6 changed files with 141 additions and 47 deletions
|
@ -14,9 +14,11 @@ import com.minelittlepony.unicopia.client.particle.RunesParticle;
|
|||
import com.minelittlepony.unicopia.client.particle.SphereParticle;
|
||||
import com.minelittlepony.unicopia.client.render.AccessoryFeatureRenderer;
|
||||
import com.minelittlepony.unicopia.client.render.AmuletFeatureRenderer;
|
||||
import com.minelittlepony.unicopia.client.render.BatWingsFeatureRenderer;
|
||||
import com.minelittlepony.unicopia.client.render.BraceletFeatureRenderer;
|
||||
import com.minelittlepony.unicopia.client.render.CastSpellEntityRenderer;
|
||||
import com.minelittlepony.unicopia.client.render.FloatingArtefactEntityRenderer;
|
||||
import com.minelittlepony.unicopia.client.render.IcarusWingsFeatureRenderer;
|
||||
import com.minelittlepony.unicopia.client.render.WingsFeatureRenderer;
|
||||
import com.minelittlepony.unicopia.item.ChameleonItem;
|
||||
import com.minelittlepony.unicopia.item.GemstoneItem;
|
||||
|
@ -59,6 +61,8 @@ public interface URenderers {
|
|||
AccessoryFeatureRenderer.register(BraceletFeatureRenderer::new);
|
||||
AccessoryFeatureRenderer.register(AmuletFeatureRenderer::new);
|
||||
AccessoryFeatureRenderer.register(WingsFeatureRenderer::new);
|
||||
AccessoryFeatureRenderer.register(IcarusWingsFeatureRenderer::new);
|
||||
AccessoryFeatureRenderer.register(BatWingsFeatureRenderer::new);
|
||||
|
||||
EntityRendererRegistry.INSTANCE.register(UEntities.THROWN_ITEM, FlyingItemEntityRenderer::new);
|
||||
EntityRendererRegistry.INSTANCE.register(UEntities.FLOATING_ARTEFACT, FloatingArtefactEntityRenderer::new);
|
||||
|
|
|
@ -2,7 +2,6 @@ package com.minelittlepony.unicopia.client.render;
|
|||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import net.minecraft.client.render.VertexConsumerProvider;
|
||||
import net.minecraft.client.render.entity.feature.FeatureRenderer;
|
||||
|
@ -26,7 +25,7 @@ public class AccessoryFeatureRenderer<
|
|||
@SuppressWarnings("unchecked")
|
||||
public AccessoryFeatureRenderer(FeatureRendererContext<T, M> context) {
|
||||
super(context);
|
||||
features = REGISTRY.stream().map(f -> ((FeatureFactory<T>)f).create(context)).collect(Collectors.toList());
|
||||
features = REGISTRY.stream().map(f -> ((FeatureFactory<T>)f).create(context)).toList();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -0,0 +1,65 @@
|
|||
package com.minelittlepony.unicopia.client.render;
|
||||
|
||||
import com.minelittlepony.unicopia.Race;
|
||||
import com.minelittlepony.unicopia.entity.player.Pony;
|
||||
|
||||
import net.minecraft.client.model.Dilation;
|
||||
import net.minecraft.client.model.ModelPartBuilder;
|
||||
import net.minecraft.client.model.ModelPartData;
|
||||
import net.minecraft.client.model.ModelTransform;
|
||||
import net.minecraft.client.render.entity.feature.FeatureRendererContext;
|
||||
import net.minecraft.client.render.entity.model.BipedEntityModel;
|
||||
import net.minecraft.entity.LivingEntity;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.util.Identifier;
|
||||
|
||||
public class BatWingsFeatureRenderer<E extends LivingEntity> extends WingsFeatureRenderer<E> {
|
||||
|
||||
private static final Identifier TEXTURE = new Identifier("unicopia", "textures/models/wings/bat.png");
|
||||
|
||||
public BatWingsFeatureRenderer(FeatureRendererContext<E, ? extends BipedEntityModel<E>> context) {
|
||||
super(context);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void createWing(String name, ModelPartData parent, Dilation dilation, int k) {
|
||||
ModelPartData base = parent.addChild(name,
|
||||
ModelPartBuilder.create().cuboid(0, 0, 0, 2, 10, 2, dilation),
|
||||
ModelTransform.pivot(k * 2, 2, 2 + k * 0.5F));
|
||||
|
||||
for (int i = 0; i < FEATHER_COUNT; i++) {
|
||||
int texX = (i % 2) * 8;
|
||||
int baseLength = 23;
|
||||
int featherLength = i < 7 ? baseLength - (i % 4 * 2) : baseLength - (i * 2);
|
||||
ModelPartData wing = base.addChild("feather_" + i,
|
||||
ModelPartBuilder.create()
|
||||
.uv(8 + texX, 0)
|
||||
.cuboid(-k * (i % 2) / 90F, 0, 0, 0.02F, featherLength * 0.8F, 4, dilation),
|
||||
ModelTransform.pivot(-i * k / 9F, 7, 0)
|
||||
);
|
||||
|
||||
wing.addChild("secondary", ModelPartBuilder.create()
|
||||
.uv(8 + texX, 0)
|
||||
.cuboid(-k * (i % 2) / 90F, 0, 0, 0.02F, featherLength, 4, dilation),
|
||||
ModelTransform.rotation(0.2F, 0, 0)
|
||||
);
|
||||
if (i < 5) {
|
||||
wing.addChild("tertiary", ModelPartBuilder.create()
|
||||
.uv(8 + texX, 0)
|
||||
.cuboid(-k * (i % 2) / 90F, 0, 0, 0.02F, featherLength - 1, 4, dilation),
|
||||
ModelTransform.rotation(-0.2F, 0, 0)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean canRender(E entity) {
|
||||
return entity instanceof PlayerEntity && Pony.of((PlayerEntity)entity).getSpecies() == Race.BAT;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Identifier getTexture(E entity) {
|
||||
return TEXTURE;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
package com.minelittlepony.unicopia.client.render;
|
||||
|
||||
import com.minelittlepony.unicopia.item.UItems;
|
||||
|
||||
import net.minecraft.client.render.entity.feature.FeatureRendererContext;
|
||||
import net.minecraft.client.render.entity.model.BipedEntityModel;
|
||||
import net.minecraft.entity.LivingEntity;
|
||||
import net.minecraft.util.Identifier;
|
||||
|
||||
public class IcarusWingsFeatureRenderer<E extends LivingEntity> extends WingsFeatureRenderer<E> {
|
||||
private static final Identifier ICARUS_WINGS = new Identifier("unicopia", "textures/models/wings/icarus.png");
|
||||
private static final Identifier ICARUS_WINGS_CORRUPTED = new Identifier("unicopia", "textures/models/wings/icarus_corrupted.png");
|
||||
|
||||
public IcarusWingsFeatureRenderer(FeatureRendererContext<E, ? extends BipedEntityModel<E>> context) {
|
||||
super(context);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean canRender(E entity) {
|
||||
return !super.canRender(entity) && UItems.PEGASUS_AMULET.isApplicable(entity);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Identifier getTexture(E entity) {
|
||||
return entity.world.getDimension().isUltrawarm() ? ICARUS_WINGS_CORRUPTED : ICARUS_WINGS;
|
||||
}
|
||||
}
|
|
@ -1,7 +1,6 @@
|
|||
package com.minelittlepony.unicopia.client.render;
|
||||
|
||||
import com.minelittlepony.unicopia.entity.player.Pony;
|
||||
import com.minelittlepony.unicopia.item.UItems;
|
||||
|
||||
import net.minecraft.client.model.Dilation;
|
||||
import net.minecraft.client.model.Model;
|
||||
|
@ -25,8 +24,8 @@ import net.minecraft.util.Identifier;
|
|||
|
||||
public class WingsFeatureRenderer<E extends LivingEntity> implements AccessoryFeatureRenderer.Feature<E> {
|
||||
|
||||
private static final Identifier ICARUS_WINGS = new Identifier("unicopia", "textures/models/wings/icarus.png");
|
||||
private static final Identifier ICARUS_WINGS_CORRUPTED = new Identifier("unicopia", "textures/models/wings/icarus_corrupted.png");
|
||||
protected static final int FEATHER_COUNT = 8;
|
||||
|
||||
private static final Identifier PEGASUS_WINGS = new Identifier("unicopia", "textures/models/wings/pegasus.png");
|
||||
|
||||
private final WingsModel model;
|
||||
|
@ -35,17 +34,13 @@ public class WingsFeatureRenderer<E extends LivingEntity> implements AccessoryFe
|
|||
|
||||
public WingsFeatureRenderer(FeatureRendererContext<E, ? extends BipedEntityModel<E>> context) {
|
||||
this.context = context;
|
||||
this.model = new WingsModel(WingsModel.getData(Dilation.NONE).createModel());
|
||||
this.model = new WingsModel(createModel(Dilation.NONE).createModel());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render(MatrixStack matrices, VertexConsumerProvider renderContext, int lightUv, E entity, float limbDistance, float limbAngle, float tickDelta, float age, float headYaw, float headPitch) {
|
||||
|
||||
boolean pegasus = (entity instanceof PlayerEntity && Pony.of((PlayerEntity)entity).getSpecies().canInteractWithClouds());
|
||||
boolean icarus = UItems.PEGASUS_AMULET.isApplicable(entity);
|
||||
|
||||
if (icarus || pegasus) {
|
||||
Identifier texture = pegasus ? PEGASUS_WINGS : entity.world.getDimension().isUltrawarm() ? ICARUS_WINGS_CORRUPTED : ICARUS_WINGS;
|
||||
if (canRender(entity)) {
|
||||
Identifier texture = getTexture(entity);
|
||||
VertexConsumer consumer = ItemRenderer.getArmorGlintConsumer(renderContext, RenderLayer.getEntityTranslucent(texture), false, false);
|
||||
|
||||
model.setAngles(entity, context.getModel());
|
||||
|
@ -53,32 +48,54 @@ public class WingsFeatureRenderer<E extends LivingEntity> implements AccessoryFe
|
|||
}
|
||||
}
|
||||
|
||||
static class WingsModel extends Model {
|
||||
protected boolean canRender(E entity) {
|
||||
return entity instanceof PlayerEntity && Pony.of((PlayerEntity)entity).getSpecies().canInteractWithClouds();
|
||||
}
|
||||
|
||||
protected Identifier getTexture(E entity) {
|
||||
return PEGASUS_WINGS;
|
||||
}
|
||||
|
||||
private TexturedModelData createModel(Dilation dilation) {
|
||||
ModelData data = new ModelData();
|
||||
createWing("left_wing", data.getRoot(), dilation, -1);
|
||||
createWing("right_wing", data.getRoot(), dilation, 1);
|
||||
return TexturedModelData.of(data, 24, 23);
|
||||
}
|
||||
|
||||
protected void createWing(String name, ModelPartData parent, Dilation dilation, int k) {
|
||||
ModelPartData base = parent.addChild(name,
|
||||
ModelPartBuilder.create().cuboid(0, 0, 0, 2, 10, 2, dilation),
|
||||
ModelTransform.pivot(k * 2, 2, 2 + k * 0.5F));
|
||||
|
||||
for (int i = 0; i < FEATHER_COUNT; i++) {
|
||||
int texX = (i % 2) * 8;
|
||||
int featherLength = 21 - i * 2;
|
||||
base.addChild("feather_" + i,
|
||||
ModelPartBuilder.create()
|
||||
.uv(8 + texX, 0)
|
||||
.cuboid(-k * (i % 2) / 90F, 0, 0, 2, featherLength, 2, dilation),
|
||||
ModelTransform.pivot(0, 9, 0));
|
||||
}
|
||||
}
|
||||
|
||||
private static class WingsModel extends Model {
|
||||
private final ModelPart root;
|
||||
private final Wing[] wings;
|
||||
|
||||
private final Wing leftWing;
|
||||
private final Wing rightWing;
|
||||
|
||||
public WingsModel(ModelPart tree) {
|
||||
super(RenderLayer::getEntityTranslucent);
|
||||
root = tree;
|
||||
wings = new Wing[] {
|
||||
new Wing(tree.getChild("left_wing"), -1),
|
||||
new Wing(tree.getChild("right_wing"), 1)
|
||||
};
|
||||
}
|
||||
|
||||
static TexturedModelData getData(Dilation dilation) {
|
||||
ModelData data = new ModelData();
|
||||
Wing.getData("left_wing", data.getRoot(), dilation, -1);
|
||||
Wing.getData("right_wing", data.getRoot(), dilation, 1);
|
||||
return TexturedModelData.of(data, 24, 23);
|
||||
leftWing = new Wing(tree.getChild("left_wing"), -1);
|
||||
rightWing = new Wing(tree.getChild("right_wing"), 1);
|
||||
}
|
||||
|
||||
public void setAngles(LivingEntity entity, BipedEntityModel<?> biped) {
|
||||
root.copyTransform(biped.body);
|
||||
for (Wing wing : wings) {
|
||||
wing.setAngles(entity);
|
||||
}
|
||||
leftWing.setAngles(entity);
|
||||
rightWing.setAngles(entity);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -89,7 +106,7 @@ public class WingsFeatureRenderer<E extends LivingEntity> implements AccessoryFe
|
|||
static class Wing {
|
||||
final ModelPart base;
|
||||
|
||||
final ModelPart[] feathers = new ModelPart[8];
|
||||
final ModelPart[] feathers = new ModelPart[FEATHER_COUNT];
|
||||
|
||||
final int k;
|
||||
|
||||
|
@ -101,24 +118,6 @@ public class WingsFeatureRenderer<E extends LivingEntity> implements AccessoryFe
|
|||
}
|
||||
}
|
||||
|
||||
static void getData(String name, ModelPartData parent, Dilation dilation, int k) {
|
||||
ModelPartData base = parent.addChild(name,
|
||||
ModelPartBuilder.create().cuboid(0, 0, 0, 2, 10, 2, dilation),
|
||||
ModelTransform.pivot(k * 2, 2, 2 + k * 0.5F));
|
||||
|
||||
int featherCount = 8;
|
||||
|
||||
for (int i = 0; i < featherCount; i++) {
|
||||
int texX = (i % 2) * 8;
|
||||
int featherLength = 21 - i * 2;
|
||||
base.addChild("feather_" + i,
|
||||
ModelPartBuilder.create()
|
||||
.uv(8 + texX, 0)
|
||||
.cuboid(-k * (i % 2) / 90F, 0, 0, 2, featherLength, 2, dilation),
|
||||
ModelTransform.pivot(0, 9, 0));
|
||||
}
|
||||
}
|
||||
|
||||
void setAngles(LivingEntity entity) {
|
||||
float spreadAmount = entity instanceof PlayerEntity ? Pony.of((PlayerEntity)entity).getMotion().getWingAngle() : 0;
|
||||
|
||||
|
|
BIN
src/main/resources/assets/unicopia/textures/models/wings/bat.png
Normal file
BIN
src/main/resources/assets/unicopia/textures/models/wings/bat.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 655 B |
Loading…
Reference in a new issue