diff --git a/src/autogenerated/java/net/minestom/server/entity/EntityType.java b/src/autogenerated/java/net/minestom/server/entity/EntityType.java index cc229e0ed..868816d6a 100644 --- a/src/autogenerated/java/net/minestom/server/entity/EntityType.java +++ b/src/autogenerated/java/net/minestom/server/entity/EntityType.java @@ -1,6 +1,8 @@ package net.minestom.server.entity; import net.minestom.server.entity.type.ambient.EntityBat; +import net.minestom.server.entity.type.ambient.EntityVillager; +import net.minestom.server.entity.type.ambient.EntityWanderingTrader; import net.minestom.server.entity.type.animal.*; import net.minestom.server.entity.type.decoration.EntityArmorStand; import net.minestom.server.entity.type.monster.*; diff --git a/src/main/java/net/minestom/server/entity/type/Ageable.java b/src/main/java/net/minestom/server/entity/type/Ageable.java new file mode 100644 index 000000000..4f5c2ca17 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/type/Ageable.java @@ -0,0 +1,12 @@ +package net.minestom.server.entity.type; + +/** + * Created by k.shandurenko on 23.02.2021 + */ +public interface Ageable { + + boolean isBaby(); + + void setBaby(boolean value); + +} diff --git a/src/main/java/net/minestom/server/entity/type/AgeableCreature.java b/src/main/java/net/minestom/server/entity/type/AgeableCreature.java new file mode 100644 index 000000000..f1f719832 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/type/AgeableCreature.java @@ -0,0 +1,38 @@ +package net.minestom.server.entity.type; + +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 AgeableCreature extends EntityCreature implements Ageable { + + protected AgeableCreature(@NotNull EntityType entityType, @NotNull Position spawnPosition) { + super(entityType, spawnPosition); + } + + protected AgeableCreature(@NotNull EntityType entityType, @NotNull Position spawnPosition, @Nullable Instance instance) { + super(entityType, spawnPosition, instance); + } + + @Override + public boolean isBaby() { + return this.metadata.getIndex((byte) 15, false); + } + + @Override + public void setBaby(boolean value) { + this.metadata.setIndex((byte) 15, Metadata.Boolean(value)); + } + + @Override + public double getEyeHeight() { + return isBaby() ? super.getEyeHeight() / 2 : super.getEyeHeight(); + } +} diff --git a/src/main/java/net/minestom/server/entity/type/Animal.java b/src/main/java/net/minestom/server/entity/type/Animal.java index 994abd637..db2df4236 100644 --- a/src/main/java/net/minestom/server/entity/type/Animal.java +++ b/src/main/java/net/minestom/server/entity/type/Animal.java @@ -1,4 +1,4 @@ package net.minestom.server.entity.type; -public interface Animal { +public interface Animal extends Ageable { } diff --git a/src/main/java/net/minestom/server/entity/type/ambient/EntityAbstractVillager.java b/src/main/java/net/minestom/server/entity/type/ambient/EntityAbstractVillager.java new file mode 100644 index 000000000..87347b68e --- /dev/null +++ b/src/main/java/net/minestom/server/entity/type/ambient/EntityAbstractVillager.java @@ -0,0 +1,32 @@ +package net.minestom.server.entity.type.ambient; + +import net.minestom.server.entity.EntityType; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.type.AgeableCreature; +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 EntityAbstractVillager extends AgeableCreature { + + EntityAbstractVillager(@NotNull EntityType entityType, @NotNull Position spawnPosition) { + super(entityType, spawnPosition); + } + + EntityAbstractVillager(@NotNull EntityType entityType, @NotNull Position spawnPosition, @Nullable Instance instance) { + super(entityType, spawnPosition, instance); + } + + public int getHeadShakeTimer() { + return this.metadata.getIndex((byte) 16, 0); + } + + public void setHeadShakeTimer(int value) { + this.metadata.setIndex((byte) 16, Metadata.VarInt(value)); + } + +} diff --git a/src/main/java/net/minestom/server/entity/type/ambient/EntityBat.java b/src/main/java/net/minestom/server/entity/type/ambient/EntityBat.java index e039cb0bf..31e12e671 100644 --- a/src/main/java/net/minestom/server/entity/type/ambient/EntityBat.java +++ b/src/main/java/net/minestom/server/entity/type/ambient/EntityBat.java @@ -1,12 +1,12 @@ package net.minestom.server.entity.type.ambient; -import net.minestom.server.entity.EntityCreature; import net.minestom.server.entity.EntityType; import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.type.AgeableCreature; import net.minestom.server.entity.type.Animal; import net.minestom.server.utils.Position; -public class EntityBat extends EntityCreature implements Animal { +public class EntityBat extends AgeableCreature implements Animal { public EntityBat(Position spawnPosition) { super(EntityType.BAT, spawnPosition); diff --git a/src/main/java/net/minestom/server/entity/type/ambient/EntityVillager.java b/src/main/java/net/minestom/server/entity/type/ambient/EntityVillager.java new file mode 100644 index 000000000..e0374475b --- /dev/null +++ b/src/main/java/net/minestom/server/entity/type/ambient/EntityVillager.java @@ -0,0 +1,131 @@ +package net.minestom.server.entity.type.ambient; + +import net.minestom.server.entity.EntityType; +import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.type.AgeableCreature; +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 EntityVillager extends EntityAbstractVillager { + + public EntityVillager(@NotNull Position spawnPosition) { + this(EntityType.VILLAGER, spawnPosition); + } + + public EntityVillager(@NotNull Position spawnPosition, @Nullable Instance instance) { + this(EntityType.VILLAGER, spawnPosition, instance); + } + + EntityVillager(@NotNull EntityType entityType, @NotNull Position spawnPosition) { + super(entityType, spawnPosition); + } + + EntityVillager(@NotNull EntityType entityType, @NotNull Position spawnPosition, @Nullable Instance instance) { + super(entityType, spawnPosition, instance); + } + + public VillagerData getVillagerData() { + int[] data = this.metadata.getIndex((byte) 17, null); + if (data == null) { + return new VillagerData(Type.PLAINS, Profession.NONE, Level.NOVICE); + } + return new VillagerData(Type.VALUES[data[0]], Profession.VALUES[data[1]], Level.VALUES[data[2] - 1]); + } + + public void setVillagerData(VillagerData data) { + this.metadata.setIndex((byte) 17, Metadata.VillagerData( + data.type.ordinal(), + data.profession.ordinal(), + data.level.ordinal() + 1 + )); + } + + public static class VillagerData { + + private Type type; + private Profession profession; + private Level level; + + public VillagerData(@NotNull Type type, @NotNull Profession profession, @NotNull Level level) { + this.type = type; + this.profession = profession; + this.level = level; + } + + @NotNull + public Type getType() { + return this.type; + } + + public void setType(@NotNull Type type) { + this.type = type; + } + + @NotNull + public Profession getProfession() { + return this.profession; + } + + public void setProfession(@NotNull Profession profession) { + this.profession = profession; + } + + @NotNull + public Level getLevel() { + return level; + } + + public void setLevel(@NotNull Level level) { + this.level = level; + } + } + + public enum Type { + DESERT, + JUNGLE, + PLAINS, + SAVANNA, + SNOW, + SWAMP, + TAIGA; + + public final static Type[] VALUES = values(); + } + + public enum Profession { + NONE, + ARMORER, + BUTCHER, + CARTOGRAPHER, + CLERIC, + FARMER, + FISHERMAN, + FLETCHER, + LEATHERWORKER, + LIBRARIAN, + NITWIT, + UNEMPLOYED, + MASON, + SHEPHERD, + TOOLSMITH, + WEAPONSMITH; + + public final static Profession[] VALUES = values(); + } + + public enum Level { + NOVICE, + APPRENTICE, + JOURNEYMAN, + EXPERT, + MASTER; + + public final static Level[] VALUES = values(); + } + +} diff --git a/src/main/java/net/minestom/server/entity/type/ambient/EntityWanderingTrader.java b/src/main/java/net/minestom/server/entity/type/ambient/EntityWanderingTrader.java new file mode 100644 index 000000000..444031697 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/type/ambient/EntityWanderingTrader.java @@ -0,0 +1,22 @@ +package net.minestom.server.entity.type.ambient; + +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 EntityWanderingTrader extends EntityAbstractVillager { + + public EntityWanderingTrader(@NotNull Position spawnPosition) { + super(EntityType.WANDERING_TRADER, spawnPosition); + } + + public EntityWanderingTrader(@NotNull Position spawnPosition, @Nullable Instance instance) { + super(EntityType.WANDERING_TRADER, spawnPosition, instance); + } + +} diff --git a/src/main/java/net/minestom/server/entity/type/animal/EntityAbstractHorse.java b/src/main/java/net/minestom/server/entity/type/animal/EntityAbstractHorse.java index cbc7389c0..3fca2d40a 100644 --- a/src/main/java/net/minestom/server/entity/type/animal/EntityAbstractHorse.java +++ b/src/main/java/net/minestom/server/entity/type/animal/EntityAbstractHorse.java @@ -1,8 +1,8 @@ package net.minestom.server.entity.type.animal; -import net.minestom.server.entity.EntityCreature; import net.minestom.server.entity.EntityType; import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.type.AgeableCreature; import net.minestom.server.entity.type.Animal; import net.minestom.server.instance.Instance; import net.minestom.server.utils.Position; @@ -14,7 +14,7 @@ import java.util.UUID; /** * Created by k.shandurenko on 23.02.2021 */ -public class EntityAbstractHorse extends EntityCreature implements Animal { +public class EntityAbstractHorse extends AgeableCreature implements Animal { private final static byte TAMED_BIT = 0x02; private final static byte SADDLED_BIT = 0x04; diff --git a/src/main/java/net/minestom/server/entity/type/animal/EntityBee.java b/src/main/java/net/minestom/server/entity/type/animal/EntityBee.java index 6a8be079f..d1d0ea8b6 100644 --- a/src/main/java/net/minestom/server/entity/type/animal/EntityBee.java +++ b/src/main/java/net/minestom/server/entity/type/animal/EntityBee.java @@ -1,13 +1,13 @@ package net.minestom.server.entity.type.animal; -import net.minestom.server.entity.EntityCreature; import net.minestom.server.entity.EntityType; +import net.minestom.server.entity.type.AgeableCreature; import net.minestom.server.entity.type.Animal; import net.minestom.server.utils.Position; -public class EntityBee extends EntityCreature implements Animal { +public class EntityBee extends AgeableCreature implements Animal { public EntityBee(Position spawnPosition) { super(EntityType.BEE, spawnPosition); - setBoundingBox(0.7f,0.6f,0.7f); + setBoundingBox(0.7f, 0.6f, 0.7f); } } diff --git a/src/main/java/net/minestom/server/entity/type/animal/EntityChicken.java b/src/main/java/net/minestom/server/entity/type/animal/EntityChicken.java index 85186ff86..c9f762234 100644 --- a/src/main/java/net/minestom/server/entity/type/animal/EntityChicken.java +++ b/src/main/java/net/minestom/server/entity/type/animal/EntityChicken.java @@ -1,11 +1,11 @@ package net.minestom.server.entity.type.animal; -import net.minestom.server.entity.EntityCreature; import net.minestom.server.entity.EntityType; +import net.minestom.server.entity.type.AgeableCreature; import net.minestom.server.entity.type.Animal; import net.minestom.server.utils.Position; -public class EntityChicken extends EntityCreature implements Animal { +public class EntityChicken extends AgeableCreature implements Animal { public EntityChicken(Position spawnPosition) { super(EntityType.CHICKEN, spawnPosition); setBoundingBox(0.4f, 0.7f, 0.4f); diff --git a/src/main/java/net/minestom/server/entity/type/animal/EntityCow.java b/src/main/java/net/minestom/server/entity/type/animal/EntityCow.java index 580f915e6..40e2e12dc 100644 --- a/src/main/java/net/minestom/server/entity/type/animal/EntityCow.java +++ b/src/main/java/net/minestom/server/entity/type/animal/EntityCow.java @@ -1,11 +1,11 @@ package net.minestom.server.entity.type.animal; -import net.minestom.server.entity.EntityCreature; import net.minestom.server.entity.EntityType; +import net.minestom.server.entity.type.AgeableCreature; import net.minestom.server.entity.type.Animal; import net.minestom.server.utils.Position; -public class EntityCow extends EntityCreature implements Animal { +public class EntityCow extends AgeableCreature implements Animal { public EntityCow(Position spawnPosition) { super(EntityType.COW, spawnPosition); setBoundingBox(0.9f, 1.4f, 0.9f); diff --git a/src/main/java/net/minestom/server/entity/type/animal/EntityDolphin.java b/src/main/java/net/minestom/server/entity/type/animal/EntityDolphin.java index 419a7c5fd..97e81dd65 100644 --- a/src/main/java/net/minestom/server/entity/type/animal/EntityDolphin.java +++ b/src/main/java/net/minestom/server/entity/type/animal/EntityDolphin.java @@ -1,13 +1,13 @@ package net.minestom.server.entity.type.animal; -import net.minestom.server.entity.EntityCreature; import net.minestom.server.entity.EntityType; +import net.minestom.server.entity.type.AgeableCreature; import net.minestom.server.entity.type.Animal; import net.minestom.server.utils.Position; -public class EntityDolphin extends EntityCreature implements Animal { +public class EntityDolphin extends AgeableCreature implements Animal { public EntityDolphin(Position spawnPosition) { super(EntityType.DOLPHIN, spawnPosition); - setBoundingBox(0.9f,0.6f,0.9f); + setBoundingBox(0.9f, 0.6f, 0.9f); } } diff --git a/src/main/java/net/minestom/server/entity/type/animal/EntityFox.java b/src/main/java/net/minestom/server/entity/type/animal/EntityFox.java index 86323ef25..18b32beae 100644 --- a/src/main/java/net/minestom/server/entity/type/animal/EntityFox.java +++ b/src/main/java/net/minestom/server/entity/type/animal/EntityFox.java @@ -1,11 +1,11 @@ package net.minestom.server.entity.type.animal; -import net.minestom.server.entity.EntityCreature; import net.minestom.server.entity.EntityType; +import net.minestom.server.entity.type.AgeableCreature; import net.minestom.server.entity.type.Animal; import net.minestom.server.utils.Position; -public class EntityFox extends EntityCreature implements Animal { +public class EntityFox extends AgeableCreature implements Animal { public EntityFox(Position spawnPosition) { super(EntityType.FOX, spawnPosition); setBoundingBox(0.6f, 0.7f, 0.6f); diff --git a/src/main/java/net/minestom/server/entity/type/animal/EntityMooshroom.java b/src/main/java/net/minestom/server/entity/type/animal/EntityMooshroom.java index 41c794b2f..b81a03532 100644 --- a/src/main/java/net/minestom/server/entity/type/animal/EntityMooshroom.java +++ b/src/main/java/net/minestom/server/entity/type/animal/EntityMooshroom.java @@ -1,13 +1,13 @@ package net.minestom.server.entity.type.animal; -import net.minestom.server.entity.EntityCreature; import net.minestom.server.entity.EntityType; import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.type.AgeableCreature; import net.minestom.server.entity.type.Animal; import net.minestom.server.utils.Position; import org.jetbrains.annotations.NotNull; -public class EntityMooshroom extends EntityCreature implements Animal { +public class EntityMooshroom extends AgeableCreature implements Animal { public EntityMooshroom(Position spawnPosition) { super(EntityType.MOOSHROOM, spawnPosition); diff --git a/src/main/java/net/minestom/server/entity/type/animal/EntityOcelot.java b/src/main/java/net/minestom/server/entity/type/animal/EntityOcelot.java index 3b69f5522..2d7a9aebb 100644 --- a/src/main/java/net/minestom/server/entity/type/animal/EntityOcelot.java +++ b/src/main/java/net/minestom/server/entity/type/animal/EntityOcelot.java @@ -1,11 +1,11 @@ package net.minestom.server.entity.type.animal; -import net.minestom.server.entity.EntityCreature; import net.minestom.server.entity.EntityType; +import net.minestom.server.entity.type.AgeableCreature; import net.minestom.server.entity.type.Animal; import net.minestom.server.utils.Position; -public class EntityOcelot extends EntityCreature implements Animal { +public class EntityOcelot extends AgeableCreature implements Animal { public EntityOcelot(Position spawnPosition) { super(EntityType.OCELOT, spawnPosition); setBoundingBox(0.6f, 0.7f, 0.6f); diff --git a/src/main/java/net/minestom/server/entity/type/animal/EntityPanda.java b/src/main/java/net/minestom/server/entity/type/animal/EntityPanda.java index 62308a13b..0cc5e84cd 100644 --- a/src/main/java/net/minestom/server/entity/type/animal/EntityPanda.java +++ b/src/main/java/net/minestom/server/entity/type/animal/EntityPanda.java @@ -1,11 +1,11 @@ package net.minestom.server.entity.type.animal; -import net.minestom.server.entity.EntityCreature; import net.minestom.server.entity.EntityType; +import net.minestom.server.entity.type.AgeableCreature; import net.minestom.server.entity.type.Animal; import net.minestom.server.utils.Position; -public class EntityPanda extends EntityCreature implements Animal { +public class EntityPanda extends AgeableCreature implements Animal { public EntityPanda(Position spawnPosition) { super(EntityType.PANDA, spawnPosition); setBoundingBox(1.3f, 1.25f, 1.3f); diff --git a/src/main/java/net/minestom/server/entity/type/animal/EntityPig.java b/src/main/java/net/minestom/server/entity/type/animal/EntityPig.java index 206746e1e..abbf47523 100644 --- a/src/main/java/net/minestom/server/entity/type/animal/EntityPig.java +++ b/src/main/java/net/minestom/server/entity/type/animal/EntityPig.java @@ -1,12 +1,12 @@ package net.minestom.server.entity.type.animal; -import net.minestom.server.entity.EntityCreature; import net.minestom.server.entity.EntityType; import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.type.AgeableCreature; import net.minestom.server.entity.type.Animal; import net.minestom.server.utils.Position; -public class EntityPig extends EntityCreature implements Animal { +public class EntityPig extends AgeableCreature implements Animal { public EntityPig(Position spawnPosition) { super(EntityType.PIG, spawnPosition); diff --git a/src/main/java/net/minestom/server/entity/type/animal/EntityPolarBear.java b/src/main/java/net/minestom/server/entity/type/animal/EntityPolarBear.java index 33f77b5c9..b0bb55dd0 100644 --- a/src/main/java/net/minestom/server/entity/type/animal/EntityPolarBear.java +++ b/src/main/java/net/minestom/server/entity/type/animal/EntityPolarBear.java @@ -1,12 +1,12 @@ package net.minestom.server.entity.type.animal; -import net.minestom.server.entity.EntityCreature; import net.minestom.server.entity.EntityType; import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.type.AgeableCreature; import net.minestom.server.entity.type.Animal; import net.minestom.server.utils.Position; -public class EntityPolarBear extends EntityCreature implements Animal { +public class EntityPolarBear extends AgeableCreature implements Animal { public EntityPolarBear(Position spawnPosition) { super(EntityType.POLAR_BEAR, spawnPosition); diff --git a/src/main/java/net/minestom/server/entity/type/animal/EntityRabbit.java b/src/main/java/net/minestom/server/entity/type/animal/EntityRabbit.java index d5ae7c314..a06b397da 100644 --- a/src/main/java/net/minestom/server/entity/type/animal/EntityRabbit.java +++ b/src/main/java/net/minestom/server/entity/type/animal/EntityRabbit.java @@ -1,12 +1,12 @@ package net.minestom.server.entity.type.animal; -import net.minestom.server.entity.EntityCreature; import net.minestom.server.entity.EntityType; import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.type.AgeableCreature; import net.minestom.server.entity.type.Animal; import net.minestom.server.utils.Position; -public class EntityRabbit extends EntityCreature implements Animal { +public class EntityRabbit extends AgeableCreature implements Animal { public EntityRabbit(Position spawnPosition) { super(EntityType.RABBIT, spawnPosition); diff --git a/src/main/java/net/minestom/server/entity/type/monster/EntityZombieVillager.java b/src/main/java/net/minestom/server/entity/type/monster/EntityZombieVillager.java index d11f4fbca..d6eb795a8 100644 --- a/src/main/java/net/minestom/server/entity/type/monster/EntityZombieVillager.java +++ b/src/main/java/net/minestom/server/entity/type/monster/EntityZombieVillager.java @@ -2,6 +2,7 @@ package net.minestom.server.entity.type.monster; import net.minestom.server.entity.EntityType; import net.minestom.server.entity.Metadata; +import net.minestom.server.entity.type.ambient.EntityAbstractVillager; import net.minestom.server.utils.Position; import org.jetbrains.annotations.NotNull; @@ -22,12 +23,20 @@ public class EntityZombieVillager extends EntityZombie { this.metadata.setIndex((byte) 18, Metadata.Boolean(value)); } - public int[] getVillagerData() { - return this.metadata.getIndex((byte) 19, new int[]{}); + public EntityAbstractVillager.VillagerData getVillagerData() { + int[] data = this.metadata.getIndex((byte) 17, null); + if (data == null) { + return new EntityAbstractVillager.VillagerData(EntityAbstractVillager.Type.PLAINS, EntityAbstractVillager.Profession.NONE, EntityAbstractVillager.Level.NOVICE); + } + return new EntityAbstractVillager.VillagerData(EntityAbstractVillager.Type.VALUES[data[0]], EntityAbstractVillager.Profession.VALUES[data[1]], EntityAbstractVillager.Level.VALUES[data[2] - 1]); } - public void setVillagerData(int[] value) { - this.metadata.setIndex((byte) 19, Metadata.VillagerData(value[0], value[1], value[2])); + public void setVillagerData(EntityAbstractVillager.VillagerData data) { + this.metadata.setIndex((byte) 17, Metadata.VillagerData( + data.getType().ordinal(), + data.getProfession().ordinal(), + data.getLevel().ordinal() + 1 + )); } }