Villagers and Ageable

This commit is contained in:
Konstantin Shandurenko 2021-02-23 07:11:54 +03:00
parent 2a55ed654d
commit ca3d36ac0c
21 changed files with 279 additions and 33 deletions

View File

@ -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.*;

View File

@ -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);
}

View File

@ -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();
}
}

View File

@ -1,4 +1,4 @@
package net.minestom.server.entity.type;
public interface Animal {
public interface Animal extends Ageable {
}

View File

@ -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));
}
}

View File

@ -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);

View File

@ -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();
}
}

View File

@ -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);
}
}

View File

@ -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;

View File

@ -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);
}
}

View File

@ -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);

View File

@ -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);

View File

@ -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);
}
}

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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
));
}
}