Added the second magical plant

This commit is contained in:
Sollace 2024-01-02 23:03:41 +01:00
parent 99fc4ea904
commit 80225bf1e7
No known key found for this signature in database
GPG key ID: E52FACE7B5C773DB
10 changed files with 656 additions and 0 deletions

File diff suppressed because one or more lines are too long

169
assets/models/tentacle.java Normal file
View file

@ -0,0 +1,169 @@
// Made with Blockbench 4.8.3
// Exported for Minecraft version 1.17+ for Yarn
// Paste this class into your mod and generate all required imports
public class tentacle extends EntityModel<Entity> {
private final ModelPart bone_a;
private final ModelPart flower_4;
private final ModelPart cube_r1;
private final ModelPart cube_r2;
private final ModelPart flower_8;
private final ModelPart cube_r3;
private final ModelPart cube_r4;
private final ModelPart flower_3;
private final ModelPart cube_r5;
private final ModelPart cube_r6;
private final ModelPart flower_7;
private final ModelPart cube_r7;
private final ModelPart cube_r8;
private final ModelPart flower_2;
private final ModelPart cube_r9;
private final ModelPart cube_r10;
private final ModelPart flower_6;
private final ModelPart cube_r11;
private final ModelPart cube_r12;
private final ModelPart flower_1;
private final ModelPart cube_r13;
private final ModelPart cube_r14;
private final ModelPart flower_5;
private final ModelPart cube_r15;
private final ModelPart cube_r16;
private final ModelPart bone_b;
private final ModelPart bone_c;
private final ModelPart flower_9;
private final ModelPart cube_r17;
private final ModelPart cube_r18;
private final ModelPart bone_d;
private final ModelPart flower_10;
private final ModelPart cube_r19;
private final ModelPart cube_r20;
private final ModelPart bone_e;
private final ModelPart bone_f;
private final ModelPart flower_11;
private final ModelPart cube_r21;
private final ModelPart cube_r22;
private final ModelPart bone_g;
private final ModelPart bone_h;
private final ModelPart flower_12;
private final ModelPart cube_r23;
private final ModelPart cube_r24;
private final ModelPart flower_13;
private final ModelPart cube_r25;
private final ModelPart cube_r26;
private final ModelPart flower_14;
private final ModelPart cube_r27;
private final ModelPart cube_r28;
public tentacle(ModelPart root) {
this.bone_a = root.getChild("bone_a");
}
public static TexturedModelData getTexturedModelData() {
ModelData modelData = new ModelData();
ModelPartData modelPartData = modelData.getRoot();
ModelPartData bone_a = modelPartData.addChild("bone_a", ModelPartBuilder.create().uv(0, 0).cuboid(-7.0F, -10.0F, -7.0F, 14.0F, 16.0F, 14.0F, new Dilation(0.0F)), ModelTransform.of(0.0F, 24.0F, 0.0F, 0.0F, 0.0F, 0.0F));
ModelPartData flower_4 = bone_a.addChild("flower_4", ModelPartBuilder.create(), ModelTransform.of(6.0F, 0.6703F, -6.7725F, 1.5929F, -0.909F, -1.1179F));
ModelPartData cube_r1 = flower_4.addChild("cube_r1", ModelPartBuilder.create().uv(86, 0).cuboid(-14.0F, 0.0F, 0.0F, 14.0F, 0.0F, 14.0F, new Dilation(0.0F)), ModelTransform.of(0.0F, 0.0F, 0.0F, 1.5708F, 0.0F, 0.7854F));
ModelPartData cube_r2 = flower_4.addChild("cube_r2", ModelPartBuilder.create().uv(86, 0).cuboid(-14.0F, 0.0F, 0.0F, 14.0F, 0.0F, 14.0F, new Dilation(0.0F)), ModelTransform.of(0.0F, 0.0F, 0.0F, 3.1416F, 0.7854F, 1.5708F));
ModelPartData flower_8 = flower_4.addChild("flower_8", ModelPartBuilder.create(), ModelTransform.of(0.0F, 0.0F, 0.0F, 2.9259F, -0.8201F, -2.1974F));
ModelPartData cube_r3 = flower_8.addChild("cube_r3", ModelPartBuilder.create().uv(86, 0).cuboid(-14.0F, 0.0F, 0.0F, 14.0F, 0.0F, 14.0F, new Dilation(0.0F)), ModelTransform.of(0.0F, 0.0F, 0.0F, 1.5708F, 0.0F, 0.7854F));
ModelPartData cube_r4 = flower_8.addChild("cube_r4", ModelPartBuilder.create().uv(86, 0).cuboid(-14.0F, 0.0F, 0.0F, 14.0F, 0.0F, 14.0F, new Dilation(0.0F)), ModelTransform.of(0.0F, 0.0F, 0.0F, 3.1416F, 0.7854F, 1.5708F));
ModelPartData flower_3 = bone_a.addChild("flower_3", ModelPartBuilder.create(), ModelTransform.of(6.0F, 0.6703F, 4.2275F, -2.4079F, 0.2344F, -2.5374F));
ModelPartData cube_r5 = flower_3.addChild("cube_r5", ModelPartBuilder.create().uv(86, 0).cuboid(-14.0F, 0.0F, 0.0F, 14.0F, 0.0F, 14.0F, new Dilation(0.0F)), ModelTransform.of(0.0F, 0.0F, 0.0F, 1.5708F, 0.0F, 0.7854F));
ModelPartData cube_r6 = flower_3.addChild("cube_r6", ModelPartBuilder.create().uv(86, 0).cuboid(-14.0F, 0.0F, 0.0F, 14.0F, 0.0F, 14.0F, new Dilation(0.0F)), ModelTransform.of(0.0F, 0.0F, 0.0F, 3.1416F, 0.7854F, 1.5708F));
ModelPartData flower_7 = flower_3.addChild("flower_7", ModelPartBuilder.create(), ModelTransform.of(0.0F, 0.0F, 0.0F, -2.4079F, 0.2344F, -2.5374F));
ModelPartData cube_r7 = flower_7.addChild("cube_r7", ModelPartBuilder.create().uv(86, 0).cuboid(-14.0F, 0.0F, 0.0F, 14.0F, 0.0F, 14.0F, new Dilation(0.0F)), ModelTransform.of(0.0F, 0.0F, 0.0F, 1.5708F, 0.0F, 0.7854F));
ModelPartData cube_r8 = flower_7.addChild("cube_r8", ModelPartBuilder.create().uv(86, 0).cuboid(-14.0F, 0.0F, 0.0F, 14.0F, 0.0F, 14.0F, new Dilation(0.0F)), ModelTransform.of(0.0F, 0.0F, 0.0F, 3.1416F, 0.7854F, 1.5708F));
ModelPartData flower_2 = bone_a.addChild("flower_2", ModelPartBuilder.create(), ModelTransform.of(-5.0F, 0.6703F, 4.2275F, -1.2698F, 0.9678F, -1.7981F));
ModelPartData cube_r9 = flower_2.addChild("cube_r9", ModelPartBuilder.create().uv(86, 0).cuboid(-14.0F, 0.0F, 0.0F, 14.0F, 0.0F, 14.0F, new Dilation(0.0F)), ModelTransform.of(0.0F, 0.0F, 0.0F, 1.5708F, 0.0F, 0.7854F));
ModelPartData cube_r10 = flower_2.addChild("cube_r10", ModelPartBuilder.create().uv(86, 0).cuboid(-14.0F, 0.0F, 0.0F, 14.0F, 0.0F, 14.0F, new Dilation(0.0F)), ModelTransform.of(0.0F, 0.0F, 0.0F, 3.1416F, 0.7854F, 1.5708F));
ModelPartData flower_6 = flower_2.addChild("flower_6", ModelPartBuilder.create(), ModelTransform.of(0.0F, 0.0F, 0.0F, -1.2698F, 0.9678F, -1.7981F));
ModelPartData cube_r11 = flower_6.addChild("cube_r11", ModelPartBuilder.create().uv(86, 0).cuboid(-14.0F, 0.0F, 0.0F, 14.0F, 0.0F, 14.0F, new Dilation(0.0F)), ModelTransform.of(0.0F, 0.0F, 0.0F, 1.5708F, 0.0F, 0.7854F));
ModelPartData cube_r12 = flower_6.addChild("cube_r12", ModelPartBuilder.create().uv(86, 0).cuboid(-14.0F, 0.0F, 0.0F, 14.0F, 0.0F, 14.0F, new Dilation(0.0F)), ModelTransform.of(0.0F, 0.0F, 0.0F, 3.1416F, 0.7854F, 1.5708F));
ModelPartData flower_1 = bone_a.addChild("flower_1", ModelPartBuilder.create(), ModelTransform.of(-3.0F, 0.6703F, -7.7725F, 0.6103F, -0.0535F, -0.5864F));
ModelPartData cube_r13 = flower_1.addChild("cube_r13", ModelPartBuilder.create().uv(86, 0).cuboid(-14.0F, 0.0F, 0.0F, 14.0F, 0.0F, 14.0F, new Dilation(0.0F)), ModelTransform.of(0.0F, 0.0F, 0.0F, 1.5708F, 0.0F, 0.7854F));
ModelPartData cube_r14 = flower_1.addChild("cube_r14", ModelPartBuilder.create().uv(86, 0).cuboid(-14.0F, 0.0F, 0.0F, 14.0F, 0.0F, 14.0F, new Dilation(0.0F)), ModelTransform.of(0.0F, 0.0F, 0.0F, 3.1416F, 0.7854F, 1.5708F));
ModelPartData flower_5 = flower_1.addChild("flower_5", ModelPartBuilder.create(), ModelTransform.of(0.0F, 0.0F, 0.0F, 0.6103F, -0.0535F, -0.5864F));
ModelPartData cube_r15 = flower_5.addChild("cube_r15", ModelPartBuilder.create().uv(86, 0).cuboid(-14.0F, 0.0F, 0.0F, 14.0F, 0.0F, 14.0F, new Dilation(0.0F)), ModelTransform.of(0.0F, 0.0F, 0.0F, 1.5708F, 0.0F, 0.7854F));
ModelPartData cube_r16 = flower_5.addChild("cube_r16", ModelPartBuilder.create().uv(86, 0).cuboid(-14.0F, 0.0F, 0.0F, 14.0F, 0.0F, 14.0F, new Dilation(0.0F)), ModelTransform.of(0.0F, 0.0F, 0.0F, 3.1416F, 0.7854F, 1.5708F));
ModelPartData bone_b = bone_a.addChild("bone_b", ModelPartBuilder.create().uv(0, 30).cuboid(-6.0F, -18.0F, -6.0F, 12.0F, 19.0F, 12.0F, new Dilation(0.0F)), ModelTransform.of(0.0F, -9.0F, 0.0F, -0.2618F, 0.0F, 0.0F));
ModelPartData bone_c = bone_b.addChild("bone_c", ModelPartBuilder.create().uv(48, 20).cuboid(-5.0F, -23.0F, -5.0F, 10.0F, 23.0F, 10.0F, new Dilation(0.0F)), ModelTransform.of(0.0F, -16.0F, 0.0F, 0.0F, 0.0F, 0.0F));
ModelPartData flower_9 = bone_c.addChild("flower_9", ModelPartBuilder.create(), ModelTransform.of(4.0F, -15.6242F, -3.3435F, 2.9259F, -0.8201F, -2.4592F));
ModelPartData cube_r17 = flower_9.addChild("cube_r17", ModelPartBuilder.create().uv(86, 0).cuboid(-14.0F, 0.0F, 0.0F, 14.0F, 0.0F, 14.0F, new Dilation(0.0F)), ModelTransform.of(0.0F, 0.0F, 0.0F, 1.5708F, 0.0F, 0.7854F));
ModelPartData cube_r18 = flower_9.addChild("cube_r18", ModelPartBuilder.create().uv(86, 0).cuboid(-14.0F, 0.0F, 0.0F, 14.0F, 0.0F, 14.0F, new Dilation(0.0F)), ModelTransform.of(0.0F, 0.0F, 0.0F, 3.1416F, 0.7854F, 1.5708F));
ModelPartData bone_d = bone_c.addChild("bone_d", ModelPartBuilder.create().uv(40, 53).cuboid(-4.0F, -23.0F, -4.0F, 8.0F, 21.0F, 8.0F, new Dilation(0.0F)), ModelTransform.of(0.0F, -18.0F, 0.0F, -0.1745F, 0.0F, 0.0F));
ModelPartData flower_10 = bone_d.addChild("flower_10", ModelPartBuilder.create(), ModelTransform.of(-2.0F, -17.1355F, 3.0055F, -2.8606F, -0.5942F, 2.4482F));
ModelPartData cube_r19 = flower_10.addChild("cube_r19", ModelPartBuilder.create().uv(86, 0).cuboid(-14.0F, 0.0F, 0.0F, 14.0F, 0.0F, 14.0F, new Dilation(0.0F)), ModelTransform.of(0.0F, 0.0F, 0.0F, 1.5708F, 0.0F, 0.7854F));
ModelPartData cube_r20 = flower_10.addChild("cube_r20", ModelPartBuilder.create().uv(86, 0).cuboid(-14.0F, 0.0F, 0.0F, 14.0F, 0.0F, 14.0F, new Dilation(0.0F)), ModelTransform.of(0.0F, 0.0F, 0.0F, 3.1416F, 0.7854F, 1.5708F));
ModelPartData bone_e = bone_d.addChild("bone_e", ModelPartBuilder.create().uv(0, 61).cuboid(-3.0F, -25.0F, -3.0F, 6.0F, 22.0F, 6.0F, new Dilation(0.0F)), ModelTransform.of(0.0F, -18.0F, 0.0F, 0.1745F, 0.0F, 0.0F));
ModelPartData bone_f = bone_e.addChild("bone_f", ModelPartBuilder.create().uv(72, 53).cuboid(-3.0F, -17.0F, -3.0F, 6.0F, 15.0F, 6.0F, new Dilation(0.0F)), ModelTransform.of(0.0F, -22.0F, 0.0F, 0.1745F, 0.0F, 0.0F));
ModelPartData flower_11 = bone_f.addChild("flower_11", ModelPartBuilder.create(), ModelTransform.of(-2.0F, -6.0251F, 0.478F, 2.7587F, 0.3479F, 2.5432F));
ModelPartData cube_r21 = flower_11.addChild("cube_r21", ModelPartBuilder.create().uv(86, 0).cuboid(-14.0F, 0.0F, 0.0F, 14.0F, 0.0F, 14.0F, new Dilation(0.0F)), ModelTransform.of(0.0F, 0.0F, 0.0F, 1.5708F, 0.0F, 0.7854F));
ModelPartData cube_r22 = flower_11.addChild("cube_r22", ModelPartBuilder.create().uv(86, 0).cuboid(-14.0F, 0.0F, 0.0F, 14.0F, 0.0F, 14.0F, new Dilation(0.0F)), ModelTransform.of(0.0F, 0.0F, 0.0F, 3.1416F, 0.7854F, 1.5708F));
ModelPartData bone_g = bone_f.addChild("bone_g", ModelPartBuilder.create().uv(56, 0).cuboid(-2.6F, -16.0F, -2.6F, 5.2F, 15.0F, 5.2F, new Dilation(0.0F)), ModelTransform.of(0.0F, -15.0F, 0.0F, 0.3054F, 0.0F, 0.0F));
ModelPartData bone_h = bone_g.addChild("bone_h", ModelPartBuilder.create().uv(24, 61).cuboid(-2.1F, -17.0F, -2.1F, 4.2F, 15.0F, 4.2F, new Dilation(0.0F)), ModelTransform.of(0.0F, -13.0F, 0.0F, 0.2618F, 0.0F, 0.0F));
ModelPartData flower_12 = bone_h.addChild("flower_12", ModelPartBuilder.create(), ModelTransform.of(0.0F, -15.1462F, 0.6365F, 2.7587F, 0.3479F, 2.9795F));
ModelPartData cube_r23 = flower_12.addChild("cube_r23", ModelPartBuilder.create().uv(86, 0).cuboid(-50.2096F, 2.6718F, -13.6647F, 14.0F, 0.0F, 14.0F, new Dilation(0.0F)), ModelTransform.of(36.0432F, 15.5243F, -3.1436F, 1.5708F, 0.0F, 0.7854F));
ModelPartData cube_r24 = flower_12.addChild("cube_r24", ModelPartBuilder.create().uv(86, 0).cuboid(-27.1617F, -35.2665F, 9.3832F, 14.0F, 0.0F, 14.0F, new Dilation(0.0F)), ModelTransform.of(36.0432F, 15.5243F, -3.1436F, 3.1416F, 0.7854F, 1.5708F));
ModelPartData flower_13 = flower_12.addChild("flower_13", ModelPartBuilder.create(), ModelTransform.of(0.0F, 0.0F, 0.0F, 2.7587F, 0.3479F, 2.5868F));
ModelPartData cube_r25 = flower_13.addChild("cube_r25", ModelPartBuilder.create().uv(86, 0).cuboid(-50.2096F, 2.6718F, -13.6647F, 14.0F, 0.0F, 14.0F, new Dilation(0.0F)), ModelTransform.of(36.0432F, 15.5243F, -3.1436F, 1.5708F, 0.0F, 0.7854F));
ModelPartData cube_r26 = flower_13.addChild("cube_r26", ModelPartBuilder.create().uv(86, 0).cuboid(-27.1617F, -35.2665F, 9.3832F, 14.0F, 0.0F, 14.0F, new Dilation(0.0F)), ModelTransform.of(36.0432F, 15.5243F, -3.1436F, 3.1416F, 0.7854F, 1.5708F));
ModelPartData flower_14 = flower_12.addChild("flower_14", ModelPartBuilder.create(), ModelTransform.of(0.0F, 0.0F, 0.0F, -1.9412F, -1.0444F, 1.7406F));
ModelPartData cube_r27 = flower_14.addChild("cube_r27", ModelPartBuilder.create().uv(86, 0).cuboid(-50.2096F, 2.6718F, -13.6647F, 14.0F, 0.0F, 14.0F, new Dilation(0.0F)), ModelTransform.of(36.0432F, 15.5243F, -3.1436F, 1.5708F, 0.0F, 0.7854F));
ModelPartData cube_r28 = flower_14.addChild("cube_r28", ModelPartBuilder.create().uv(86, 0).cuboid(-27.1617F, -35.2665F, 9.3832F, 14.0F, 0.0F, 14.0F, new Dilation(0.0F)), ModelTransform.of(36.0432F, 15.5243F, -3.1436F, 3.1416F, 0.7854F, 1.5708F));
return TexturedModelData.of(modelData, 128, 128);
}
@Override
public void setAngles(Entity entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) {
}
@Override
public void render(MatrixStack matrices, VertexConsumer vertexConsumer, int light, int overlay, float red, float green, float blue, float alpha) {
bone_a.render(matrices, vertexConsumer, light, overlay, red, green, blue, alpha);
}
}

BIN
assets/models/tentacle.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View file

@ -6,6 +6,7 @@ import com.minelittlepony.unicopia.Race;
import com.minelittlepony.unicopia.ability.data.Hit;
import com.minelittlepony.unicopia.ability.data.Pos;
import com.minelittlepony.unicopia.block.UBlocks;
import com.minelittlepony.unicopia.entity.mob.TentacleEntity;
import com.minelittlepony.unicopia.entity.player.Pony;
import com.minelittlepony.unicopia.particle.MagicParticleEffect;
import com.minelittlepony.unicopia.util.TraceHelper;
@ -83,6 +84,14 @@ public class EarthPonyGrowAbility implements Ability<Pos> {
w.setBlockState(pos.down(), Blocks.DIRT.getDefaultState());
}
w.setBlockState(pos, UBlocks.PLUNDER_VINE_BUD.getDefaultState());
} else if (w.random.nextInt(5000) == 0) {
if (w.getBlockState(pos.down()).isOf(Blocks.FARMLAND)) {
w.setBlockState(pos.down(), Blocks.DIRT.getDefaultState());
}
w.breakBlock(pos, true);
TentacleEntity tentacle = new TentacleEntity(w, pos);
tentacle.updatePositionAndAngles(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, 0, 0);
w.spawnEntity(tentacle);
}
return 1;
}

View file

@ -97,6 +97,7 @@ public interface URenderers {
EntityRendererRegistry.register(UEntities.AIR_BALLOON, AirBalloonEntityRenderer::new);
EntityRendererRegistry.register(UEntities.FRIENDLY_CREEPER, FriendlyCreeperEntityRenderer::new);
EntityRendererRegistry.register(UEntities.LOOT_BUG, LootBugEntityRenderer::new);
EntityRendererRegistry.register(UEntities.TENTACLE, TentacleEntityRenderer::new);
BlockEntityRendererFactories.register(UBlockEntities.WEATHER_VANE, WeatherVaneBlockEntityRenderer::new);
BlockEntityRendererFactories.register(UBlockEntities.FANCY_BED, CloudBedBlockEntityRenderer::new);

View file

@ -0,0 +1,142 @@
package com.minelittlepony.unicopia.client.render.entity;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.minelittlepony.unicopia.entity.mob.TentacleEntity;
import net.minecraft.client.model.Dilation;
import net.minecraft.client.model.ModelData;
import net.minecraft.client.model.ModelPart;
import net.minecraft.client.model.ModelPartBuilder;
import net.minecraft.client.model.ModelPartData;
import net.minecraft.client.model.ModelTransform;
import net.minecraft.client.model.TexturedModelData;
import net.minecraft.client.render.RenderLayer;
import net.minecraft.client.render.VertexConsumer;
import net.minecraft.client.render.entity.model.EntityModel;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.util.math.MathHelper;
public class TentacleEntityModel extends EntityModel<TentacleEntity> {
private final ModelPart part;
private final Map<String, ModelPart> parts = new HashMap<>();
private final List<ModelPart> bones = new ArrayList<>();
private final List<ModelPart> brushes;
private final ModelPart tip;
public TentacleEntityModel(ModelPart root) {
super(RenderLayer::getEntityTranslucent);
this.part = root;
for (String key : List.of("bone_a", "bone_b", "bone_c", "bone_d", "bone_e", "bone_f", "bone_g", "bone_h")) {
parts.put(key, root = root.getChild(key));
bones.add(root);
}
var bone_a = parts.get("bone_a");
brushes = List.of(
bone_a.getChild("brush_1"),
bone_a.getChild("brush_2"),
bone_a.getChild("brush_3"),
bone_a.getChild("brush_4"),
parts.get("bone_c").getChild("flower_1"),
parts.get("bone_d").getChild("flower_2"),
parts.get("bone_f").getChild("flower_3"));
tip = parts.get("bone_h").getChild("tip");
}
public static TexturedModelData getTexturedModelData() {
ModelData data = new ModelData();
data.getRoot()
.addChild("bone_a", ModelPartBuilder.create().uv(0, 0).cuboid(-7, -10, -7, 14, 16, 14, Dilation.NONE), ModelTransform.pivot(0, 24, 0))
.addChild("bone_b", ModelPartBuilder.create().uv(0, 30).cuboid(-6, -18, -6, 12, 19, 12, Dilation.NONE), ModelTransform.of(0, -9, 0, -0.2618F, 0, 0))
.addChild("bone_c", ModelPartBuilder.create().uv(48, 20).cuboid(-5, -23, -5, 10, 23, 10, Dilation.NONE), ModelTransform.of(0, -16, 0, 0, 0, 0))
.addChild("bone_d", ModelPartBuilder.create().uv(40, 53).cuboid(-4, -23, -4, 8, 21, 8, Dilation.NONE), ModelTransform.of(0, -18, 0, -0.1745F, 0, 0))
.addChild("bone_e", ModelPartBuilder.create().uv(0, 61).cuboid(-3, -25, -3, 6, 22, 6, Dilation.NONE), ModelTransform.of(0, -18, 0, 0.1745F, 0, 0))
.addChild("bone_f", ModelPartBuilder.create().uv(72, 53).cuboid(-3, -17, -3, 6, 15, 6, Dilation.NONE), ModelTransform.of(0, -22, 0, 0.1745F, 0, 0))
.addChild("bone_g", ModelPartBuilder.create().uv(56, 0).cuboid(-2.6F, -16, -2.6F, 5.2F, 15, 5.2F, Dilation.NONE), ModelTransform.of(0, -15, 0, 0.3054F, 0, 0))
.addChild("bone_h", ModelPartBuilder.create().uv(24, 61).cuboid(-2.1F, -17, -2.1F, 4.2F, 15, 4.2F, Dilation.NONE), ModelTransform.of(0, -13, 0, 0.2618F, 0, 0));
return TexturedModelData.of(addFlowers(data), 128, 128);
}
private static ModelData addFlowers(ModelData data) {
ModelPartData bone_a = data.getRoot().getChild("bone_a");
createFlowerSinglet(createFlowerSinglet(bone_a.addChild("brush_1", ModelPartBuilder.create(), ModelTransform.of(-3, 0.6703F, -7.7725F, 0.6103F, -0.0535F, -0.5864F))).addChild("bundle", ModelPartBuilder.create(), ModelTransform.rotation(0.6103F, -0.0535F, -0.5864F)));
createFlowerSinglet(createFlowerSinglet(bone_a.addChild("brush_2", ModelPartBuilder.create(), ModelTransform.of(-5, 0.6703F, 4.2275F, -1.2698F, 0.9678F, -1.7981F))).addChild("bundle", ModelPartBuilder.create(), ModelTransform.rotation(-1.2698F, 0.9678F, -1.7981F)));
createFlowerSinglet(createFlowerSinglet(bone_a.addChild("brush_3", ModelPartBuilder.create(), ModelTransform.of( 6, 0.6703F, 4.2275F, -2.4079F, 0.2344F, -2.5374F))).addChild("bundle", ModelPartBuilder.create(), ModelTransform.rotation(-2.4079F, 0.2344F, -2.5374F)));
createFlowerSinglet(createFlowerSinglet(bone_a.addChild("brush_4", ModelPartBuilder.create(), ModelTransform.of( 6, 0.6703F, -6.7725F, 1.5929F, -0.909F, -1.1179F))).addChild("bundle", ModelPartBuilder.create(), ModelTransform.rotation(2.9259F, -0.8201F, -2.1974F)));
ModelPartData bone_c = bone_a.getChild("bone_b").getChild("bone_c");
createFlowerSinglet(bone_c.addChild("flower_1", ModelPartBuilder.create(), ModelTransform.of( 4, -15.6242F, -3.3435F, 2.9259F, -0.8201F, -2.4592F)));
ModelPartData bone_d = bone_c.getChild("bone_d");
createFlowerSinglet(bone_d.addChild("flower_2", ModelPartBuilder.create(), ModelTransform.of(-2, -17.1355F, 3.0055F, -2.8606F, -0.5942F, 2.4482F)));
ModelPartData bone_f = bone_d.getChild("bone_e").getChild("bone_f");
createFlowerSinglet(bone_f.addChild("flower_3", ModelPartBuilder.create(), ModelTransform.of(-2, -6.0251F, 0.478F, 2.7587F, 0.3479F, 2.5432F)));
ModelPartData flower_12 = createFlowerBunch(bone_f.getChild("bone_g").getChild("bone_h").addChild("tip", ModelPartBuilder.create(), ModelTransform.of(0, -15.1462F, 0.6365F, 2.7587F, 0.3479F, 2.9795F)));
createFlowerBunch(flower_12.addChild("bundle_1", ModelPartBuilder.create(), ModelTransform.rotation( 2.7587F, 0.3479F, 2.5868F)));
createFlowerBunch(flower_12.addChild("bundle_2", ModelPartBuilder.create(), ModelTransform.rotation(-1.9412F, -1.0444F, 1.7406F)));
return data;
}
private static ModelPartData createFlowerSinglet(ModelPartData parent) {
parent.addChild("flower_1", ModelPartBuilder.create().uv(86, 0).cuboid(-14, 0, 0, 14, 0, 14, Dilation.NONE), ModelTransform.rotation(1.5708F, 0, 0.7854F));
parent.addChild("flower_2", ModelPartBuilder.create().uv(86, 0).cuboid(-14, 0, 0, 14, 0, 14, Dilation.NONE), ModelTransform.rotation(3.1416F, 0.7854F, 1.5708F));
return parent;
}
private static ModelPartData createFlowerBunch(ModelPartData parent) {
parent.addChild("flower_1", ModelPartBuilder.create().uv(86, 0).cuboid(-50.2096F, 2.6718F, -13.6647F, 14, 0, 14, Dilation.NONE), ModelTransform.of(36.0432F, 15.5243F, -3.1436F, 1.5708F, 0, 0.7854F));
parent.addChild("flower_2", ModelPartBuilder.create().uv(86, 0).cuboid(-27.1617F, -35.2665F, 9.3832F, 14, 0, 14, Dilation.NONE), ModelTransform.of(36.0432F, 15.5243F, -3.1436F, 3.1416F, 0.7854F, 1.5708F));
return parent;
}
@Override
public void setAngles(TentacleEntity entity, float limbSwing, float limbSwingAmount, float tickDelta, float yaw, float pitch) {
float age = entity.age + tickDelta + (entity.getUuid().getMostSignificantBits() % 100);
float idleWaveTimer = entity.getAnimationTimer(tickDelta);
float attackProgress = entity.isAttacking() ? Math.abs(MathHelper.sin(entity.getAttackProgress(tickDelta) * MathHelper.PI)) : 0;
float attackCurve = attackProgress * -0.5F;
float sweepDirection = 1;
float bendIntentisty = 1 + entity.getAttackProgress(tickDelta) / 2F;
part.yaw = (yaw * MathHelper.RADIANS_PER_DEGREE) + MathHelper.HALF_PI * attackProgress;
for (ModelPart bone : bones) {
float idlePitch = MathHelper.sin(idleWaveTimer) * 0.0226F * bendIntentisty;
float idleYaw = MathHelper.cos(idleWaveTimer + 0.53F) * 0.07F;
float idleRoll = MathHelper.sin(idleWaveTimer * 0.2F) * 0.0226F * bendIntentisty;
idleWaveTimer += 1.5F;
bendIntentisty += 3F;
bone.resetTransform();
bone.pitch = MathHelper.lerp(attackProgress, idlePitch, bone.pitch + attackCurve);
bone.yaw = MathHelper.lerp(attackProgress, idleYaw, bone.yaw + sweepDirection * attackCurve);
bone.roll = MathHelper.lerp(attackProgress, idleRoll, bone.roll);
attackCurve *= 1.04F;
}
float direction = 1;
for (ModelPart brush : brushes) {
brush.resetTransform();
brush.pitch += MathHelper.sin(age * 0.003F) * 0.03F;
brush.yaw += MathHelper.cos(age * 0.003F) * 0.1F * (direction *= -1);
}
tip.resetTransform();
tip.pitch += MathHelper.sin(age * 0.003F) * 0.3F;
tip.yaw += MathHelper.sin(age * 0.03F) * 0.3F;
}
@Override
public void render(MatrixStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, float blue, float alpha) {
part.render(matrices, vertices, light, overlay);
}
}

View file

@ -0,0 +1,42 @@
package com.minelittlepony.unicopia.client.render.entity;
import com.minelittlepony.unicopia.Unicopia;
import com.minelittlepony.unicopia.entity.mob.TentacleEntity;
import net.minecraft.client.render.OverlayTexture;
import net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.render.entity.EntityRenderer;
import net.minecraft.client.render.entity.EntityRendererFactory;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.util.Identifier;
public class TentacleEntityRenderer extends EntityRenderer<TentacleEntity> {
private static final Identifier TEXTURE = Unicopia.id("textures/entity/poison_joke/tentacle.png");
private final TentacleEntityModel model;
public TentacleEntityRenderer(EntityRendererFactory.Context context) {
super(context);
model = new TentacleEntityModel(TentacleEntityModel.getTexturedModelData().createModel());
}
@Override
public void render(TentacleEntity entity, float yaw, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertices, int light) {
matrices.push();
matrices.scale(-1, -1, 1);
float scale = entity.getGrowth(tickDelta);
matrices.scale(scale, scale, scale);
matrices.translate(0, -0.9F, 0);
model.setAngles(entity, 0, 0, tickDelta, entity.getYaw(tickDelta), entity.getPitch(tickDelta));
model.render(matrices, vertices.getBuffer(model.getLayer(getTexture(entity))), light, OverlayTexture.DEFAULT_UV, 1, 1, 1, 1);
matrices.pop();
super.render(entity, yaw, tickDelta, matrices, vertices, light);
}
@Override
public Identifier getTexture(TentacleEntity entity) {
return TEXTURE;
}
}

View file

@ -0,0 +1,289 @@
package com.minelittlepony.unicopia.entity.mob;
import java.util.Comparator;
import org.jetbrains.annotations.Nullable;
import com.minelittlepony.unicopia.entity.player.Pony;
import com.minelittlepony.unicopia.particle.ParticleUtils;
import com.minelittlepony.unicopia.util.shape.Sphere;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.MovementType;
import net.minecraft.entity.damage.DamageSource;
import net.minecraft.entity.data.DataTracker;
import net.minecraft.entity.data.TrackedData;
import net.minecraft.entity.data.TrackedDataHandlerRegistry;
import net.minecraft.entity.decoration.AbstractDecorationEntity;
import net.minecraft.entity.mob.HostileEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.particle.ParticleTypes;
import net.minecraft.registry.tag.ItemTags;
import net.minecraft.sound.SoundEvents;
import net.minecraft.util.Hand;
import net.minecraft.util.hit.HitResult;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Box;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.RaycastContext;
import net.minecraft.world.World;
public class TentacleEntity extends AbstractDecorationEntity {
static final byte ATTACK_STATUS = 54;
static final int MAX_GROWTH = 25;
private static final TrackedData<Integer> GROWTH = DataTracker.registerData(TentacleEntity.class, TrackedDataHandlerRegistry.INTEGER);
private static final TrackedData<Integer> MOTION_OFFSET = DataTracker.registerData(TentacleEntity.class, TrackedDataHandlerRegistry.INTEGER);
@Nullable
private Box visibilityBox;
private int prevGrowth;
private int attackingTicks;
private float prevAttackingTicks;
private int ticksActive;
private int prevMotionOffset;
@Nullable
private LivingEntity target;
private final Comparator<LivingEntity> targetSorting = Comparator.comparing(this::distanceTo);
public TentacleEntity(EntityType<? extends TentacleEntity> type, World world) {
super(type, world);
}
public TentacleEntity(World world, BlockPos pos) {
super(UEntities.TENTACLE, world, pos);
}
@Override
protected void initDataTracker() {
super.initDataTracker();
dataTracker.startTracking(GROWTH, 0);
dataTracker.startTracking(MOTION_OFFSET, 0);
}
public void attack(BlockPos pos) {
var offset = pos.toCenterPos().subtract(getBlockPos().toCenterPos());
double dX = offset.x;
double dY = offset.y;
double dZ = offset.z;
double radius = Math.sqrt(dX * dX + dZ * dZ);
setPitch(MathHelper.wrapDegrees((float)(-(MathHelper.atan2(dY, radius) * MathHelper.DEGREES_PER_RADIAN))));
setYaw(MathHelper.wrapDegrees((float)(MathHelper.atan2(dZ, dX) * MathHelper.DEGREES_PER_RADIAN) - 90));
getWorld().sendEntityStatus(this, ATTACK_STATUS);
attackingTicks = 30;
}
public float getAttackProgress(float tickDelta) {
return (30F - MathHelper.lerp(tickDelta, prevAttackingTicks, attackingTicks)) / 30F;
}
public float getGrowth(float tickDelta) {
return MathHelper.lerp(tickDelta, prevGrowth, getGrowth()) / (float)MAX_GROWTH;
}
public int getGrowth() {
return dataTracker.get(GROWTH);
}
public void setGrowth(int growth) {
dataTracker.set(GROWTH, Math.max(0, growth));
}
public float getAnimationTimer(float tickDelta) {
return (age + tickDelta + (getUuid().getMostSignificantBits() % 100)) * 0.00043F
+ MathHelper.lerp(tickDelta, prevMotionOffset, getMotionOffset()) * 0.002F;
}
public int getMotionOffset() {
return dataTracker.get(MOTION_OFFSET);
}
public void setMotionOffset(int motionOffset) {
dataTracker.set(MOTION_OFFSET, motionOffset);
}
public boolean isAttacking() {
return attackingTicks > 0;
}
@Override
public int getWidthPixels() {
return 9;
}
@Override
public int getHeightPixels() {
return 9;
}
@Override
public boolean damage(DamageSource source, float amount) {
if (source.getAttacker() instanceof PlayerEntity player) {
if (player.getStackInHand(Hand.MAIN_HAND).isIn(ItemTags.SHOVELS)) {
kill();
ParticleUtils.spawnParticles(ParticleTypes.EFFECT, this, 10);
}
if (getWorld().random.nextInt(5) == 0 && canTarget(player)) {
setTarget(player);
}
}
ticksActive += 20;
playSound(SoundEvents.ENTITY_RAVAGER_ROAR, 5, 1);
return true;
}
@Override
public void tick() {
prevMotionOffset = getMotionOffset();
prevGrowth = getGrowth();
super.tick();
prevAttackingTicks = attackingTicks;
if (isAttacking()) {
if (--attackingTicks == 12) {
if (target != null) {
target.damage(getDamageSources().generic(), 15);
Vec3d diff = target.getPos().subtract(getPos());
target.takeKnockback(1, diff.x, diff.z);
ParticleUtils.spawnParticles(ParticleTypes.CLOUD, target, 10);
for (Entity bystander : getWorld().getOtherEntities(target, target.getBoundingBox().expand(3))) {
if (bystander instanceof LivingEntity l) {
diff = l.getPos().subtract(getPos());
l.takeKnockback(1, diff.x, diff.z);
ParticleUtils.spawnParticles(ParticleTypes.CLOUD, target, 10);
}
}
target = null;
}
playSound(SoundEvents.BLOCK_POINTED_DRIPSTONE_LAND, 1, 1);
}
}
ParticleUtils.spawnParticles(ParticleTypes.ASH, this, 4);
var sphere = new Sphere(false, 10).translate(getPos());
ParticleUtils.spawnParticles(getWorld(), sphere, ParticleTypes.ASH, 4);
if (!getWorld().isClient) {
int growth = getGrowth();
if (growth >= MAX_GROWTH / 2) {
if (age % 50 == 0) {
updateTarget();
}
if (target != null && !isAttacking()) {
attack(target.getBlockPos());
}
}
if (growth < MAX_GROWTH) {
setGrowth(growth + 1);
}
if (getWorld().random.nextInt(110) == 0) {
playSound(SoundEvents.BLOCK_CONDUIT_AMBIENT_SHORT, 1, 0.3F);
}
if (ticksActive > 0) {
ticksActive--;
setMotionOffset(getMotionOffset() + ticksActive);
}
}
}
public void setTarget(LivingEntity target) {
this.target = target;
playSound(SoundEvents.ENTITY_RAVAGER_ROAR, 5, 1);
if (target instanceof PlayerEntity player) {
Pony.of(player).getMagicalReserves().getEnergy().add(6);
}
}
private void updateTarget() {
if (!canTarget(target)) {
target = null;
}
if (target == null && !isAttacking()) {
getWorld().getEntitiesByClass(HostileEntity.class, getBoundingBox().expand(10, 3, 10), this::canTarget)
.stream()
.sorted(targetSorting)
.findFirst()
.ifPresent(this::setTarget);
}
}
protected boolean canTarget(LivingEntity target) {
return target != null
&& !target.isRemoved()
&& !target.isSneaky()
&& !(target instanceof PlayerEntity player && (player.isCreative() || player.isSpectator()))
&& canSee(target);
}
private boolean canSee(Entity entity) {
return entity.getWorld() == getWorld()
&& distanceTo(entity) <= 128
&& getWorld().raycast(new RaycastContext(getPos(), entity.getPos(), RaycastContext.ShapeType.COLLIDER, RaycastContext.FluidHandling.NONE, this)).getType() == HitResult.Type.MISS;
}
@Override
public void handleStatus(byte status) {
switch (status) {
case ATTACK_STATUS:
attackingTicks = 30;
break;
default:
super.handleStatus(status);
}
}
@Override
public void onBreak(Entity breaker) {
}
@Override
public void onPlace() {
}
@Override
public boolean canStayAttached() {
return getWorld().isTopSolid(getBlockPos().down(), this);
}
@Override
public Box getVisibilityBoundingBox() {
if (visibilityBox == null) {
visibilityBox = getBoundingBox().expand(10, 0, 10).stretch(0, 10, 0);
}
return visibilityBox;
}
@Override
protected void updateAttachmentPosition() {
visibilityBox = null;
Vec3d pos = attachmentPos.toCenterPos();
setPos(pos.x, pos.y, pos.z);
setBoundingBox(Box.of(pos, 1, 1, 1).stretch(0, 2, 0));
}
@Override
public void move(MovementType movementType, Vec3d movement) { }
@Override
public void addVelocity(double deltaX, double deltaY, double deltaZ) { }
}

View file

@ -67,6 +67,9 @@ public interface UEntities {
EntityType<LootBugEntity> LOOT_BUG = register("loot_bug", FabricEntityTypeBuilder.create(SpawnGroup.MONSTER, LootBugEntity::new)
.trackRangeChunks(8)
.dimensions(EntityDimensions.fixed(0.8F, 0.6F)));
EntityType<TentacleEntity> TENTACLE = register("tentacle", FabricEntityTypeBuilder.<TentacleEntity>create(SpawnGroup.MISC, TentacleEntity::new)
.trackRangeChunks(8)
.dimensions(EntityDimensions.fixed(0.8F, 0.8F)));
static <T extends Entity> EntityType<T> register(String name, FabricEntityTypeBuilder<T> builder) {
EntityType<T> type = builder.build();

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB