From cfc5f860e9e1ca04167d23aa3ecd03e7cef7570b Mon Sep 17 00:00:00 2001 From: Konstantin Shandurenko Date: Tue, 23 Feb 2021 08:47:09 +0300 Subject: [PATCH] Fishes --- .../minestom/server/entity/EntityType.java | 3 +- .../entity/type/other/EntityShulker.java | 6 +- .../entity/type/water/EntityAbstractFish.java | 32 +++++ .../server/entity/type/water/EntityCod.java | 24 ++++ .../entity/type/water/EntityPufferFish.java | 56 ++++++++ .../entity/type/water/EntitySalmon.java | 24 ++++ .../server/entity/type/water/EntitySquid.java | 25 ++++ .../entity/type/water/EntityTropicalFish.java | 125 ++++++++++++++++++ 8 files changed, 292 insertions(+), 3 deletions(-) create mode 100644 src/main/java/net/minestom/server/entity/type/water/EntityAbstractFish.java create mode 100644 src/main/java/net/minestom/server/entity/type/water/EntityCod.java create mode 100644 src/main/java/net/minestom/server/entity/type/water/EntityPufferFish.java create mode 100644 src/main/java/net/minestom/server/entity/type/water/EntitySalmon.java create mode 100644 src/main/java/net/minestom/server/entity/type/water/EntitySquid.java create mode 100644 src/main/java/net/minestom/server/entity/type/water/EntityTropicalFish.java diff --git a/src/autogenerated/java/net/minestom/server/entity/EntityType.java b/src/autogenerated/java/net/minestom/server/entity/EntityType.java index a24392848..d4fe880c6 100644 --- a/src/autogenerated/java/net/minestom/server/entity/EntityType.java +++ b/src/autogenerated/java/net/minestom/server/entity/EntityType.java @@ -15,6 +15,7 @@ import net.minestom.server.entity.type.projectile.EntityArrow; import net.minestom.server.entity.type.projectile.EntityPotion; import net.minestom.server.entity.type.projectile.EntitySpectralArrow; import net.minestom.server.entity.type.vehicle.EntityBoat; +import net.minestom.server.entity.type.water.*; import net.minestom.server.registry.Registries; import net.minestom.server.utils.LambdaMetafactoryUtils; import net.minestom.server.utils.NamespaceID; @@ -50,7 +51,7 @@ public enum EntityType { CHICKEN("minecraft:chicken", EntityChicken.class), - COD("minecraft:cod"), + COD("minecraft:cod", EntityCod.class), COW("minecraft:cow", EntityCow.class), diff --git a/src/main/java/net/minestom/server/entity/type/other/EntityShulker.java b/src/main/java/net/minestom/server/entity/type/other/EntityShulker.java index 2470dbd67..3fd928cc6 100644 --- a/src/main/java/net/minestom/server/entity/type/other/EntityShulker.java +++ b/src/main/java/net/minestom/server/entity/type/other/EntityShulker.java @@ -12,16 +12,18 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** - * Created by k.shandurenko on 23.02.2021 + * TODO: update bounding box depending on state */ public class EntityShulker extends EntityCreature implements Constructable { public EntityShulker(@NotNull Position spawnPosition) { super(EntityType.SHULKER, spawnPosition); + setBoundingBox(1D, 1D, 1D); } public EntityShulker(@NotNull Position spawnPosition, @Nullable Instance instance) { super(EntityType.SHULKER, spawnPosition, instance); + setBoundingBox(1D, 1D, 1D); } public Direction getAttachFace() { @@ -49,7 +51,7 @@ public class EntityShulker extends EntityCreature implements Constructable { } public byte getColor() { - return this.metadata.getIndex((byte) 18, (byte) 0); + return this.metadata.getIndex((byte) 18, (byte) 10); } public void setColor(byte value) { diff --git a/src/main/java/net/minestom/server/entity/type/water/EntityAbstractFish.java b/src/main/java/net/minestom/server/entity/type/water/EntityAbstractFish.java new file mode 100644 index 000000000..82f260df5 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/type/water/EntityAbstractFish.java @@ -0,0 +1,32 @@ +package net.minestom.server.entity.type.water; + +import net.minestom.server.entity.EntityCreature; +import net.minestom.server.entity.EntityType; +import net.minestom.server.entity.Metadata; +import net.minestom.server.instance.Instance; +import net.minestom.server.utils.Position; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * Created by k.shandurenko on 23.02.2021 + */ +public class EntityAbstractFish extends EntityCreature { + + protected EntityAbstractFish(@NotNull EntityType entityType, @NotNull Position spawnPosition) { + super(entityType, spawnPosition); + } + + protected EntityAbstractFish(@NotNull EntityType entityType, @NotNull Position spawnPosition, @Nullable Instance instance) { + super(entityType, spawnPosition, instance); + } + + public boolean isFromBucket() { + return this.metadata.getIndex((byte) 15, false); + } + + public void setFromBucket(boolean value) { + this.metadata.setIndex((byte) 15, Metadata.Boolean(value)); + } + +} diff --git a/src/main/java/net/minestom/server/entity/type/water/EntityCod.java b/src/main/java/net/minestom/server/entity/type/water/EntityCod.java new file mode 100644 index 000000000..e9b9f7cb6 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/type/water/EntityCod.java @@ -0,0 +1,24 @@ +package net.minestom.server.entity.type.water; + +import net.minestom.server.entity.EntityType; +import net.minestom.server.instance.Instance; +import net.minestom.server.utils.Position; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * Created by k.shandurenko on 23.02.2021 + */ +public class EntityCod extends EntityAbstractFish { + + public EntityCod(@NotNull Position spawnPosition) { + super(EntityType.COD, spawnPosition); + setBoundingBox(.5D, .3D, .5D); + } + + public EntityCod(@NotNull Position spawnPosition, @Nullable Instance instance) { + super(EntityType.COD, spawnPosition, instance); + setBoundingBox(.5D, .3D, .5D); + } + +} diff --git a/src/main/java/net/minestom/server/entity/type/water/EntityPufferFish.java b/src/main/java/net/minestom/server/entity/type/water/EntityPufferFish.java new file mode 100644 index 000000000..077bcc2f1 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/type/water/EntityPufferFish.java @@ -0,0 +1,56 @@ +package net.minestom.server.entity.type.water; + +import net.minestom.server.entity.EntityType; +import net.minestom.server.entity.Metadata; +import net.minestom.server.instance.Instance; +import net.minestom.server.utils.Position; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * Created by k.shandurenko on 23.02.2021 + */ +public class EntityPufferFish extends EntityAbstractFish { + + public EntityPufferFish(@NotNull Position spawnPosition) { + super(EntityType.PUFFERFISH, spawnPosition); + updateBoundingBox(State.UNPUFFED); + } + + public EntityPufferFish(@NotNull Position spawnPosition, @Nullable Instance instance) { + super(EntityType.PUFFERFISH, spawnPosition, instance); + updateBoundingBox(State.UNPUFFED); + } + + public State getState() { + return State.VALUES[this.metadata.getIndex((byte) 16, 0)]; + } + + public void setState(State state) { + this.metadata.setIndex((byte) 16, Metadata.VarInt(state.ordinal())); + updateBoundingBox(state); + } + + private void updateBoundingBox(State state) { + switch (state) { + case UNPUFFED: + setBoundingBox(.35D, .35D, .35D); + break; + case SEMI_PUFFED: + setBoundingBox(.5D, .5D, .5D); + break; + default: + setBoundingBox(.7D, .7D, .7D); + break; + } + } + + public enum State { + UNPUFFED, + SEMI_PUFFED, + FULLY_PUFFED; + + private final static State[] VALUES = values(); + } + +} diff --git a/src/main/java/net/minestom/server/entity/type/water/EntitySalmon.java b/src/main/java/net/minestom/server/entity/type/water/EntitySalmon.java new file mode 100644 index 000000000..c498e6c21 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/type/water/EntitySalmon.java @@ -0,0 +1,24 @@ +package net.minestom.server.entity.type.water; + +import net.minestom.server.entity.EntityType; +import net.minestom.server.instance.Instance; +import net.minestom.server.utils.Position; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * Created by k.shandurenko on 23.02.2021 + */ +public class EntitySalmon extends EntityAbstractFish { + + public EntitySalmon(@NotNull Position spawnPosition) { + super(EntityType.SALMON, spawnPosition); + setBoundingBox(.7D, .4D, .7D); + } + + public EntitySalmon(@NotNull Position spawnPosition, @Nullable Instance instance) { + super(EntityType.SALMON, spawnPosition, instance); + setBoundingBox(.7D, .4D, .7D); + } + +} diff --git a/src/main/java/net/minestom/server/entity/type/water/EntitySquid.java b/src/main/java/net/minestom/server/entity/type/water/EntitySquid.java new file mode 100644 index 000000000..6f8b445fc --- /dev/null +++ b/src/main/java/net/minestom/server/entity/type/water/EntitySquid.java @@ -0,0 +1,25 @@ +package net.minestom.server.entity.type.water; + +import net.minestom.server.entity.EntityCreature; +import net.minestom.server.entity.EntityType; +import net.minestom.server.instance.Instance; +import net.minestom.server.utils.Position; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * Created by k.shandurenko on 23.02.2021 + */ +public class EntitySquid extends EntityCreature { + + public EntitySquid(@NotNull Position spawnPosition) { + super(EntityType.SQUID, spawnPosition); + setBoundingBox(.8D, .8D, .8D); + } + + public EntitySquid(@NotNull Position spawnPosition, @Nullable Instance instance) { + super(EntityType.SQUID, spawnPosition, instance); + setBoundingBox(.8D, .8D, .8D); + } + +} diff --git a/src/main/java/net/minestom/server/entity/type/water/EntityTropicalFish.java b/src/main/java/net/minestom/server/entity/type/water/EntityTropicalFish.java new file mode 100644 index 000000000..6c1415f67 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/type/water/EntityTropicalFish.java @@ -0,0 +1,125 @@ +package net.minestom.server.entity.type.water; + +import net.minestom.server.entity.EntityType; +import net.minestom.server.entity.Metadata; +import net.minestom.server.instance.Instance; +import net.minestom.server.utils.Position; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * Created by k.shandurenko on 23.02.2021 + */ +public class EntityTropicalFish extends EntityAbstractFish { + + public EntityTropicalFish(@NotNull Position spawnPosition) { + super(EntityType.TROPICAL_FISH, spawnPosition); + setBoundingBox(.5D, .4D, .5D); + } + + public EntityTropicalFish(@NotNull Position spawnPosition, @Nullable Instance instance) { + super(EntityType.TROPICAL_FISH, spawnPosition, instance); + setBoundingBox(.5D, .4D, .5D); + } + + public Variant getVariant() { + return getVariantFromID(this.metadata.getIndex((byte) 16, 0)); + } + + public void setVariant(Variant variant) { + this.metadata.setIndex((byte) 16, Metadata.VarInt(getVariantID(variant))); + } + + public static int getVariantID(Variant variant) { + int id = 0; + id |= variant.patternColor; + id <<= 8; + id |= variant.bodyColor; + id <<= 8; + id |= variant.pattern.ordinal(); + id <<= 8; + id |= variant.type.ordinal(); + return id; + } + + public static Variant getVariantFromID(int variantID) { + Type type = Type.VALUES[variantID & 0xFF]; + variantID >>= 8; + Pattern pattern = Pattern.VALUES[variantID & 0xFF]; + variantID >>= 8; + byte bodyColor = (byte) (variantID & 0xFF); + variantID >>= 8; + byte patternColor = (byte) (variantID & 0xFF); + return new Variant(type, pattern, bodyColor, patternColor); + } + + public static class Variant { + + private Type type; + private Pattern pattern; + private byte bodyColor; + private byte patternColor; + + public Variant(@NotNull Type type, @NotNull Pattern pattern, byte bodyColor, byte patternColor) { + this.type = type; + this.pattern = pattern; + this.bodyColor = bodyColor; + this.patternColor = patternColor; + } + + @NotNull + public Type getType() { + return this.type; + } + + public void setType(@NotNull Type type) { + this.type = type; + } + + @NotNull + public Pattern getPattern() { + return this.pattern; + } + + public void setPattern(@NotNull Pattern pattern) { + this.pattern = pattern; + } + + public byte getBodyColor() { + return this.bodyColor; + } + + public void setBodyColor(byte bodyColor) { + this.bodyColor = bodyColor; + } + + public byte getPatternColor() { + return this.patternColor; + } + + public void setPatternColor(byte patternColor) { + this.patternColor = patternColor; + } + } + + public enum Type { + SMALL, + LARGE, + INVISIBLE; + + private final static Type[] VALUES = values(); + } + + public enum Pattern { + KOB, // FLOPPER for LARGE fish + SUNSTREAK, // STRIPEY for LARGE fish + SNOOPER, // GLITTER for LARGE fish + DASHER, // BLOCKFISH for LARGE fish + BRINELY, // BETTY for LARGE fish + SPOTTY, // CLAYFISH for LARGE fish + NONE; + + private final static Pattern[] VALUES = values(); + } + +}