Skip to content

Commit da57dbb

Browse files
committed
Added Ender Cube entity
It lives in the end.
1 parent c7b83a5 commit da57dbb

File tree

25 files changed

+625
-6
lines changed

25 files changed

+625
-6
lines changed

features.md

+1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
- Cheese, a cake item.
2121
- Lost entity: a type of skeleton/stray.
2222
- Trout: a type of fish.
23+
- Ender Cube: a type of magma cube that lives in the end.
2324

2425
## Images
2526
<img width="250" alt="Screenshot 2023-07-29 at 18 47 30" src="https://github.com/BarchamMal/MC-Extended/assets/115943779/634601ac-8f90-4d70-9e34-34af9e938a11">

gradle.properties

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ loader_version=0.14.21
1010

1111

1212
# Mod Properties
13-
mod_version=0.2.4
13+
mod_version=0.2.5
1414
maven_group=barch.mc_extended
1515
archives_base_name=mc-extended
1616

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package barch.mc_extended.Entities;
2+
3+
import barch.mc_extended.render.entity.model.EnderCubeEntityModel;
4+
import barch.mc_extended.render.entity.renderer.EnderCubeEntityRenderer;
5+
import net.fabricmc.fabric.api.client.rendering.v1.EntityModelLayerRegistry;
6+
import net.fabricmc.fabric.api.client.rendering.v1.EntityRendererRegistry;
7+
import net.minecraft.client.render.entity.model.EntityModelLayer;
8+
import net.minecraft.util.Identifier;
9+
10+
import static barch.mc_extended.Entities.Entities.ENDER_CUBE;
11+
import static barch.mc_extended.MCExtended.NAMESPACE;
12+
13+
public class EnderCube {
14+
15+
public static final EnderCube INSTANCE = new EnderCube();
16+
17+
public static final EntityModelLayer MODEL_ENDER_CUBE_LAYER = new EntityModelLayer(new Identifier(NAMESPACE, "ender_cube"), "main");
18+
19+
public static void registerClient() {
20+
21+
EntityRendererRegistry.register(ENDER_CUBE, EnderCubeEntityRenderer::new);
22+
23+
EntityModelLayerRegistry.registerModelLayer(MODEL_ENDER_CUBE_LAYER, EnderCubeEntityModel::getTexturedModelData);
24+
25+
}
26+
27+
}

src/client/java/barch/mc_extended/EntitiesClient.java

+3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package barch.mc_extended;
22

3+
import barch.mc_extended.Entities.EnderCube;
34
import barch.mc_extended.Entities.Lost;
45
import barch.mc_extended.Entities.SilverGolem;
56
import barch.mc_extended.Entities.TroutFish;
@@ -11,12 +12,14 @@ public class EntitiesClient {
1112
public static final Lost LOST = Lost.INSTANCE;
1213
public static final TroutFish TROUT_FISH = TroutFish.INSTANCE;
1314
public static final SilverGolem SILVER_GOLEM = SilverGolem.INSTANCE;
15+
public static final EnderCube ENDER_CUBE = EnderCube.INSTANCE;
1416

1517
public static void registerClient() {
1618

1719
LOST.registerClient();
1820
TROUT_FISH.registerClient();
1921
SILVER_GOLEM.registerClient();
22+
ENDER_CUBE.registerClient();
2023

2124
}
2225

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package barch.mc_extended.render.entity.model;
2+
3+
import java.util.Arrays;
4+
5+
import barch.mc_extended.Entities.EnderCubeEntity;
6+
import net.fabricmc.api.EnvType;
7+
import net.fabricmc.api.Environment;
8+
import net.minecraft.client.model.ModelData;
9+
import net.minecraft.client.model.ModelPart;
10+
import net.minecraft.client.model.ModelPartBuilder;
11+
import net.minecraft.client.model.ModelPartData;
12+
import net.minecraft.client.model.ModelTransform;
13+
import net.minecraft.client.model.TexturedModelData;
14+
import net.minecraft.client.render.entity.model.SinglePartEntityModel;
15+
import net.minecraft.util.math.MathHelper;
16+
17+
@Environment(EnvType.CLIENT)
18+
public class EnderCubeEntityModel<T extends EnderCubeEntity> extends SinglePartEntityModel<T> {
19+
private static final int SLICES_COUNT = 8;
20+
private final ModelPart root;
21+
private final ModelPart[] slices = new ModelPart[8];
22+
23+
public EnderCubeEntityModel(ModelPart root) {
24+
this.root = root;
25+
Arrays.setAll(this.slices, (index) -> {
26+
return root.getChild(getSliceName(index));
27+
});
28+
}
29+
30+
private static String getSliceName(int index) {
31+
return "cube" + index;
32+
}
33+
34+
public static TexturedModelData getTexturedModelData() {
35+
ModelData modelData = new ModelData();
36+
ModelPartData modelPartData = modelData.getRoot();
37+
38+
for(int i = 0; i < 8; ++i) {
39+
int j = 0;
40+
int k = i;
41+
if (i == 2) {
42+
j = 24;
43+
k = 10;
44+
} else if (i == 3) {
45+
j = 24;
46+
k = 19;
47+
}
48+
49+
modelPartData.addChild(getSliceName(i), ModelPartBuilder.create().uv(j, k).cuboid(-4.0F, (float)(16 + i), -4.0F, 8.0F, 1.0F, 8.0F), ModelTransform.NONE);
50+
}
51+
52+
modelPartData.addChild("inside_cube", ModelPartBuilder.create().uv(0, 16).cuboid(-2.0F, 18.0F, -2.0F, 4.0F, 4.0F, 4.0F), ModelTransform.NONE);
53+
return TexturedModelData.of(modelData, 64, 32);
54+
}
55+
56+
public void setAngles(T enderEntity, float f, float g, float h, float i, float j) {
57+
}
58+
59+
public void animateModel(T enderEntity, float f, float g, float h) {
60+
float i = MathHelper.lerp(h, enderEntity.lastStretch, enderEntity.stretch);
61+
if (i < 0.0F) {
62+
i = 0.0F;
63+
}
64+
65+
for(int j = 0; j < this.slices.length; ++j) {
66+
this.slices[j].pivotY = (float)(-(4 - j)) * i * 1.7F;
67+
}
68+
69+
}
70+
71+
public ModelPart getPart() {
72+
return this.root;
73+
}
74+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package barch.mc_extended.render.entity.renderer;
2+
3+
import barch.mc_extended.Entities.EnderCubeEntity;
4+
import barch.mc_extended.render.entity.model.EnderCubeEntityModel;
5+
import net.fabricmc.api.EnvType;
6+
import net.fabricmc.api.Environment;
7+
import net.minecraft.client.render.VertexConsumerProvider;
8+
import net.minecraft.client.render.entity.EntityRendererFactory;
9+
import net.minecraft.client.render.entity.MobEntityRenderer;
10+
import net.minecraft.client.util.math.MatrixStack;
11+
import net.minecraft.util.Identifier;
12+
import net.minecraft.util.math.BlockPos;
13+
import net.minecraft.util.math.MathHelper;
14+
15+
import static barch.mc_extended.Entities.EnderCube.MODEL_ENDER_CUBE_LAYER;
16+
import static barch.mc_extended.MCExtended.NAMESPACE;
17+
18+
@Environment(EnvType.CLIENT)
19+
public class EnderCubeEntityRenderer extends MobEntityRenderer<EnderCubeEntity, EnderCubeEntityModel<EnderCubeEntity>> {
20+
private static final Identifier TEXTURE = new Identifier(NAMESPACE,"textures/entity/slimes/ender_cube.png");
21+
22+
public EnderCubeEntityRenderer(EntityRendererFactory.Context context) {
23+
super(context, new EnderCubeEntityModel(context.getPart(MODEL_ENDER_CUBE_LAYER)), 0.25F);
24+
}
25+
26+
protected int getBlockLight(EnderCubeEntity enderCubeEntity, BlockPos blockPos) {
27+
return 15;
28+
}
29+
30+
public Identifier getTexture(EnderCubeEntity enderCubeEntity) {
31+
return TEXTURE;
32+
}
33+
34+
public void render(EnderCubeEntity enderCubeEntity, float f, float g, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i) {
35+
this.shadowRadius = 0.25F * (float)enderCubeEntity.getSize();
36+
super.render(enderCubeEntity, f, g, matrixStack, vertexConsumerProvider, i);
37+
}
38+
39+
protected void scale(EnderCubeEntity enderCubeEntity, MatrixStack matrixStack, float f) {
40+
int i = enderCubeEntity.getSize();
41+
float g = MathHelper.lerp(f, enderCubeEntity.lastStretch, enderCubeEntity.stretch) / ((float)i * 0.5F + 1.0F);
42+
float h = 1.0F / (g + 1.0F);
43+
matrixStack.scale(h * (float)i, 1.0F / h * (float)i, h * (float)i);
44+
}
45+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
package barch.mc_extended.Entities;
2+
3+
import net.minecraft.entity.EntityType;
4+
import net.minecraft.entity.SpawnReason;
5+
import net.minecraft.entity.attribute.DefaultAttributeContainer;
6+
import net.minecraft.entity.attribute.EntityAttributes;
7+
import net.minecraft.entity.damage.DamageSource;
8+
import net.minecraft.entity.mob.HostileEntity;
9+
import net.minecraft.entity.mob.SlimeEntity;
10+
import net.minecraft.fluid.Fluid;
11+
import net.minecraft.particle.ParticleEffect;
12+
import net.minecraft.particle.ParticleTypes;
13+
import net.minecraft.registry.tag.FluidTags;
14+
import net.minecraft.registry.tag.TagKey;
15+
import net.minecraft.sound.SoundEvent;
16+
import net.minecraft.sound.SoundEvents;
17+
import net.minecraft.util.math.BlockPos;
18+
import net.minecraft.util.math.Vec3d;
19+
import net.minecraft.util.math.random.Random;
20+
import net.minecraft.world.Difficulty;
21+
import net.minecraft.world.World;
22+
import net.minecraft.world.WorldAccess;
23+
import net.minecraft.world.WorldView;
24+
25+
public class EnderCubeEntity
26+
extends SlimeEntity {
27+
public EnderCubeEntity(EntityType<? extends EnderCubeEntity> entityType, World world) {
28+
super((EntityType<? extends SlimeEntity>)entityType, world);
29+
}
30+
31+
public static DefaultAttributeContainer.Builder createEnderCubeAttributes() {
32+
return HostileEntity.createHostileAttributes().add(EntityAttributes.GENERIC_MOVEMENT_SPEED, 0.2f);
33+
}
34+
35+
public static boolean canEnderCubeSpawn(EntityType<EnderCubeEntity> type, WorldAccess world, SpawnReason spawnReason, BlockPos pos, Random random) {
36+
return world.getDifficulty() != Difficulty.PEACEFUL;
37+
}
38+
39+
@Override
40+
public boolean canSpawn(WorldView world) {
41+
return world.doesNotIntersectEntities(this) && !world.containsFluid(this.getBoundingBox());
42+
}
43+
44+
@Override
45+
public void setSize(int size, boolean heal) {
46+
super.setSize(size, heal);
47+
this.getAttributeInstance(EntityAttributes.GENERIC_ARMOR).setBaseValue(size * 3);
48+
}
49+
50+
@Override
51+
public float getBrightnessAtEyes() {
52+
return 1.0f;
53+
}
54+
55+
@Override
56+
protected ParticleEffect getParticles() {
57+
return ParticleTypes.PORTAL;
58+
}
59+
60+
@Override
61+
public boolean isOnFire() {
62+
return false;
63+
}
64+
65+
@Override
66+
protected int getTicksUntilNextJump() {
67+
return super.getTicksUntilNextJump() * 4;
68+
}
69+
70+
@Override
71+
protected void updateStretch() {
72+
this.targetStretch *= 0.9f;
73+
}
74+
75+
@Override
76+
protected void jump() {
77+
Vec3d vec3d = this.getVelocity();
78+
float f = (float)this.getSize() * 0.1f;
79+
this.setVelocity(vec3d.x, this.getJumpVelocity() + f, vec3d.z);
80+
this.velocityDirty = true;
81+
}
82+
83+
@Override
84+
protected void swimUpward(TagKey<Fluid> fluid) {
85+
if (fluid == FluidTags.LAVA) {
86+
Vec3d vec3d = this.getVelocity();
87+
this.setVelocity(vec3d.x, 0.22f + (float)this.getSize() * 0.05f, vec3d.z);
88+
this.velocityDirty = true;
89+
} else {
90+
super.swimUpward(fluid);
91+
}
92+
}
93+
94+
@Override
95+
protected boolean canAttack() {
96+
return this.canMoveVoluntarily();
97+
}
98+
99+
@Override
100+
protected float getDamageAmount() {
101+
return super.getDamageAmount() + 4.0f;
102+
}
103+
104+
@Override
105+
protected SoundEvent getHurtSound(DamageSource source) {
106+
if (this.isSmall()) {
107+
return SoundEvents.ENTITY_MAGMA_CUBE_HURT_SMALL;
108+
}
109+
return SoundEvents.ENTITY_MAGMA_CUBE_HURT;
110+
}
111+
112+
@Override
113+
protected SoundEvent getDeathSound() {
114+
if (this.isSmall()) {
115+
return SoundEvents.ENTITY_MAGMA_CUBE_DEATH_SMALL;
116+
}
117+
return SoundEvents.ENTITY_MAGMA_CUBE_DEATH;
118+
}
119+
120+
@Override
121+
protected SoundEvent getSquishSound() {
122+
if (this.isSmall()) {
123+
return SoundEvents.ENTITY_MAGMA_CUBE_SQUISH_SMALL;
124+
}
125+
return SoundEvents.ENTITY_MAGMA_CUBE_SQUISH;
126+
}
127+
128+
@Override
129+
protected SoundEvent getJumpSound() {
130+
return SoundEvents.ENTITY_MAGMA_CUBE_JUMP;
131+
}
132+
}
133+

src/main/java/barch/mc_extended/Entities/Entities.java

+22
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,12 @@ public class Entities {
4444
new Identifier(NAMESPACE, "silver_golem"),
4545
FabricEntityTypeBuilder.create(SpawnGroup.CREATURE, SilverGolemEntity::new).dimensions(EntityDimensions.fixed(1.5f, 1.8f)).trackRangeBlocks(10).build()
4646
);
47+
// ender_cube entity
48+
public static final EntityType<EnderCubeEntity> ENDER_CUBE = Registry.register(
49+
Registries.ENTITY_TYPE,
50+
new Identifier(NAMESPACE, "ender_cube"),
51+
FabricEntityTypeBuilder.create(SpawnGroup.MONSTER, EnderCubeEntity::new).dimensions(EntityDimensions.changing(2.04f,2.04f)).trackRangeBlocks(10).build()
52+
);
4753

4854
// spawn eggs
4955

@@ -53,6 +59,9 @@ public class Entities {
5359
public static final Item TROUT_FISH_SPAWN_EGG = new SpawnEggItem(TROUT_FISH, 0x835e50, 0xeac17c, new FabricItemSettings());
5460
// silver_golem
5561
public static final Item SILVER_GOLEM_SPAWN_EGG = new SpawnEggItem(SILVER_GOLEM, 0xd0d0fa, 0x7c7da2, new FabricItemSettings());
62+
// ender_cube
63+
public static final Item ENDER_CUBE_SPAWN_EGG = new SpawnEggItem(ENDER_CUBE, 0x3b2754, 0xf6fabd, new FabricItemSettings());
64+
5665

5766

5867
public static void RegisterAll() {
@@ -71,6 +80,11 @@ public static void RegisterAll() {
7180
FabricDefaultAttributeRegistry.register(SILVER_GOLEM, SilverGolemEntity.createSilverGolemAttributes());
7281
Registry.register(Registries.ITEM, new Identifier(NAMESPACE, "silver_golem_spawn_egg"), SILVER_GOLEM_SPAWN_EGG);
7382

83+
// ender_cube entity
84+
FabricDefaultAttributeRegistry.register(ENDER_CUBE, SilverGolemEntity.createSilverGolemAttributes());
85+
Registry.register(Registries.ITEM, new Identifier(NAMESPACE, "ender_cube_spawn_egg"), ENDER_CUBE_SPAWN_EGG);
86+
BiomeModifications.addSpawn(BiomeSelectors.foundInTheEnd(), SpawnGroup.MONSTER, ENDER_CUBE, 10, 1, 3);
87+
7488
GroupAll();
7589

7690
}
@@ -102,5 +116,13 @@ public static void GroupAll() {
102116
content.addAfter(Items.IRON_GOLEM_SPAWN_EGG, SILVER_GOLEM_SPAWN_EGG);
103117
});
104118

119+
// ender cube spawn egg
120+
ItemGroupEvents.modifyEntriesEvent(MC_EXTENDED_GROUP).register(content -> {
121+
content.add(ENDER_CUBE_SPAWN_EGG);
122+
});
123+
ItemGroupEvents.modifyEntriesEvent(ItemGroups.SPAWN_EGGS).register(content -> {
124+
content.addAfter(Items.MAGMA_CUBE_SPAWN_EGG, ENDER_CUBE_SPAWN_EGG);
125+
});
126+
105127
}
106128
}

src/main/java/barch/mc_extended/Misc/FishBuckets.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public static void RegisterAll() {
3434

3535
public static void GroupItems() {
3636

37-
// onion tomato sauce
37+
// trout fish bucket
3838
ItemGroupEvents.modifyEntriesEvent(MC_EXTENDED_GROUP).register(content -> {
3939
content.add(TROUT_BUCKET);
4040
});

src/main/java/barch/mc_extended/Misc/Misc.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,15 @@ public class Misc {
55
public static final Misc INSTANCE = new Misc();
66

77
// fish buckets
8-
98
public static final FishBuckets FISH_BUCKETS = FishBuckets.INSTANCE;
109

10+
// other misc
11+
public static final OtherMisc OTHER_MISC = OtherMisc.INSTANCE;
12+
1113
public static void RegisterAll() {
1214

1315
FISH_BUCKETS.RegisterAll();
16+
OTHER_MISC.RegisterAll();
1417

1518
}
1619
}

0 commit comments

Comments
 (0)