diff --git a/src/main/java/fr/themode/demo/entity/ChickenCreature.java b/src/main/java/fr/themode/demo/entity/ChickenCreature.java index 1b49fa324..e2d1be0de 100644 --- a/src/main/java/fr/themode/demo/entity/ChickenCreature.java +++ b/src/main/java/fr/themode/demo/entity/ChickenCreature.java @@ -1,19 +1,16 @@ package fr.themode.demo.entity; import net.minestom.server.entity.Entity; -import net.minestom.server.entity.EntityCreature; -import net.minestom.server.entity.EntityType; import net.minestom.server.entity.Player; +import net.minestom.server.entity.type.EntityChicken; import net.minestom.server.entity.vehicle.PlayerVehicleInformation; import net.minestom.server.utils.Position; import net.minestom.server.utils.Vector; -public class ChickenCreature extends EntityCreature { +public class ChickenCreature extends EntityChicken { public ChickenCreature(Position defaultPosition) { - super(EntityType.CHICKEN, defaultPosition); - - setBoundingBox(0.4f, 0.7f, 0.4f); + super(defaultPosition); } @Override diff --git a/src/main/java/net/minestom/server/entity/Entity.java b/src/main/java/net/minestom/server/entity/Entity.java index 29499bd09..5af05889a 100644 --- a/src/main/java/net/minestom/server/entity/Entity.java +++ b/src/main/java/net/minestom/server/entity/Entity.java @@ -50,6 +50,7 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer { protected static final byte METADATA_BOOLEAN = 7; protected static final byte METADATA_ROTATION = 8; protected static final byte METADATA_POSITION = 9; + protected static final byte METADATA_PARTICLE = 15; protected static final byte METADATA_POSE = 18; protected Instance instance; diff --git a/src/main/java/net/minestom/server/entity/ItemEntity.java b/src/main/java/net/minestom/server/entity/ItemEntity.java index 89e8e001e..81adc3f02 100644 --- a/src/main/java/net/minestom/server/entity/ItemEntity.java +++ b/src/main/java/net/minestom/server/entity/ItemEntity.java @@ -26,7 +26,6 @@ public class ItemEntity extends ObjectEntity { super(EntityType.ITEM, spawnPosition); this.itemStack = itemStack; setBoundingBox(0.25f, 0.25f, 0.25f); - setGravity(0.025f); } @Override diff --git a/src/main/java/net/minestom/server/entity/type/EntityAreaEffectCloud.java b/src/main/java/net/minestom/server/entity/type/EntityAreaEffectCloud.java new file mode 100644 index 000000000..89882b7ef --- /dev/null +++ b/src/main/java/net/minestom/server/entity/type/EntityAreaEffectCloud.java @@ -0,0 +1,118 @@ +package net.minestom.server.entity.type; + +import net.minestom.server.entity.EntityType; +import net.minestom.server.entity.ObjectEntity; +import net.minestom.server.network.packet.PacketWriter; +import net.minestom.server.particle.Particle; +import net.minestom.server.utils.Position; + +import java.util.function.Consumer; + +public class EntityAreaEffectCloud extends ObjectEntity { + + public Consumer particleDataConsumer; + private float radius; + private int color; + private boolean ignoreRadius; + private Particle particle; + + public EntityAreaEffectCloud(Position spawnPosition) { + super(EntityType.AREA_EFFECT_CLOUD, spawnPosition); + setRadius(0.5f); + setColor(0); + setIgnoreRadius(false); + setParticle(Particle.EFFECT); + setParticleDataConsumer(packetWriter -> { + }); + } + + @Override + public Consumer getMetadataConsumer() { + return packet -> { + super.getMetadataConsumer().accept(packet); + fillMetadataIndex(packet, 7); + fillMetadataIndex(packet, 8); + fillMetadataIndex(packet, 9); + fillMetadataIndex(packet, 10); + }; + } + + @Override + protected void fillMetadataIndex(PacketWriter packet, int index) { + super.fillMetadataIndex(packet, index); + if (index == 7) { + packet.writeByte((byte) 7); + packet.writeByte(METADATA_FLOAT); + packet.writeFloat(radius); + } else if (index == 8) { + packet.writeByte((byte) 8); + packet.writeByte(METADATA_VARINT); + packet.writeVarInt(color); + } else if (index == 9) { + packet.writeByte((byte) 9); + packet.writeByte(METADATA_BOOLEAN); + packet.writeBoolean(ignoreRadius); + } else if (index == 10) { + packet.writeByte((byte) 10); + packet.writeByte(METADATA_PARTICLE); + packet.writeVarInt(particle.getId()); + particleDataConsumer.accept(packet); + } + } + + @Override + public int getObjectData() { + return 0; + } + + public float getRadius() { + return radius; + } + + public void setRadius(float radius) { + this.radius = radius; + setBoundingBox(2 * radius, 0.5f, 2 * radius); + sendMetadataIndex(7); + } + + public int getColor() { + return color; + } + + public void setColor(int color) { + this.color = color; + sendMetadataIndex(8); + } + + public boolean isIgnoreRadius() { + return ignoreRadius; + } + + public void setIgnoreRadius(boolean ignoreRadius) { + this.ignoreRadius = ignoreRadius; + sendMetadataIndex(9); + } + + public Particle getParticle() { + return particle; + } + + public void setParticle(Particle particle) { + this.particle = particle; + sendMetadataIndex(10); + } + + public Consumer getParticleDataConsumer() { + return particleDataConsumer; + } + + /** + * Used to add data to the particle + * + * @param particleDataConsumer the particle data consumer + * @see @see Particle data + */ + public void setParticleDataConsumer(Consumer particleDataConsumer) { + this.particleDataConsumer = particleDataConsumer; + } +} diff --git a/src/main/java/net/minestom/server/entity/type/EntityBat.java b/src/main/java/net/minestom/server/entity/type/EntityBat.java index ad12dac9a..a47c5cd55 100644 --- a/src/main/java/net/minestom/server/entity/type/EntityBat.java +++ b/src/main/java/net/minestom/server/entity/type/EntityBat.java @@ -13,6 +13,7 @@ public class EntityBat extends EntityCreature { public EntityBat(Position spawnPosition) { super(EntityType.BAT, spawnPosition); + setBoundingBox(0.5f, 0.9f, 0.5f); } @Override diff --git a/src/main/java/net/minestom/server/entity/type/EntityBlaze.java b/src/main/java/net/minestom/server/entity/type/EntityBlaze.java index 5cf5674a9..f22ebb040 100644 --- a/src/main/java/net/minestom/server/entity/type/EntityBlaze.java +++ b/src/main/java/net/minestom/server/entity/type/EntityBlaze.java @@ -11,6 +11,7 @@ public class EntityBlaze extends EntityCreature { public EntityBlaze(Position spawnPosition) { super(EntityType.BLAZE, spawnPosition); + setBoundingBox(0.6f, 1.8f, 0.6f); } @Override diff --git a/src/main/java/net/minestom/server/entity/type/EntityCaveSpider.java b/src/main/java/net/minestom/server/entity/type/EntityCaveSpider.java new file mode 100644 index 000000000..680ed21b6 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/type/EntityCaveSpider.java @@ -0,0 +1,12 @@ +package net.minestom.server.entity.type; + +import net.minestom.server.entity.EntityCreature; +import net.minestom.server.entity.EntityType; +import net.minestom.server.utils.Position; + +public class EntityCaveSpider extends EntityCreature { + public EntityCaveSpider(Position spawnPosition) { + super(EntityType.CAVE_SPIDER, spawnPosition); + setBoundingBox(0.7f, 0.5f, 0.7f); + } +} diff --git a/src/main/java/net/minestom/server/entity/type/EntityChicken.java b/src/main/java/net/minestom/server/entity/type/EntityChicken.java index c9cb32965..009e4aaa7 100644 --- a/src/main/java/net/minestom/server/entity/type/EntityChicken.java +++ b/src/main/java/net/minestom/server/entity/type/EntityChicken.java @@ -7,5 +7,6 @@ import net.minestom.server.utils.Position; public class EntityChicken extends EntityCreature { 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/EntityCow.java b/src/main/java/net/minestom/server/entity/type/EntityCow.java index 91fea081b..a77449f45 100644 --- a/src/main/java/net/minestom/server/entity/type/EntityCow.java +++ b/src/main/java/net/minestom/server/entity/type/EntityCow.java @@ -7,5 +7,6 @@ import net.minestom.server.utils.Position; public class EntityCow extends EntityCreature { 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/EntityCreeper.java b/src/main/java/net/minestom/server/entity/type/EntityCreeper.java index c9e570e0c..715bb413d 100644 --- a/src/main/java/net/minestom/server/entity/type/EntityCreeper.java +++ b/src/main/java/net/minestom/server/entity/type/EntityCreeper.java @@ -15,6 +15,7 @@ public class EntityCreeper extends EntityCreature { public EntityCreeper(Position spawnPosition) { super(EntityType.CREEPER, spawnPosition); + setBoundingBox(0.6f, 1.7f, 0.6f); } @Override diff --git a/src/main/java/net/minestom/server/entity/type/EntityEndermite.java b/src/main/java/net/minestom/server/entity/type/EntityEndermite.java index 84ea5bac5..d37ef50cf 100644 --- a/src/main/java/net/minestom/server/entity/type/EntityEndermite.java +++ b/src/main/java/net/minestom/server/entity/type/EntityEndermite.java @@ -7,5 +7,6 @@ import net.minestom.server.utils.Position; public class EntityEndermite extends EntityCreature { public EntityEndermite(Position spawnPosition) { super(EntityType.ENDERMITE, spawnPosition); + setBoundingBox(0.4f, 0.3f, 0.4f); } } diff --git a/src/main/java/net/minestom/server/entity/type/EntityGhast.java b/src/main/java/net/minestom/server/entity/type/EntityGhast.java index 352f5352a..16a3a9166 100644 --- a/src/main/java/net/minestom/server/entity/type/EntityGhast.java +++ b/src/main/java/net/minestom/server/entity/type/EntityGhast.java @@ -13,6 +13,7 @@ public class EntityGhast extends EntityCreature { public EntityGhast(Position spawnPosition) { super(EntityType.GHAST, spawnPosition); + setBoundingBox(4, 4, 4); } @Override diff --git a/src/main/java/net/minestom/server/entity/type/EntityGiant.java b/src/main/java/net/minestom/server/entity/type/EntityGiant.java index d18220f21..cb062a525 100644 --- a/src/main/java/net/minestom/server/entity/type/EntityGiant.java +++ b/src/main/java/net/minestom/server/entity/type/EntityGiant.java @@ -7,5 +7,6 @@ import net.minestom.server.utils.Position; public class EntityGiant extends EntityCreature { public EntityGiant(Position spawnPosition) { super(EntityType.GIANT, spawnPosition); + setBoundingBox(3.6f, 10.8f, 3.6f); } } diff --git a/src/main/java/net/minestom/server/entity/type/EntityGuardian.java b/src/main/java/net/minestom/server/entity/type/EntityGuardian.java new file mode 100644 index 000000000..4c68a1f6d --- /dev/null +++ b/src/main/java/net/minestom/server/entity/type/EntityGuardian.java @@ -0,0 +1,59 @@ +package net.minestom.server.entity.type; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.EntityCreature; +import net.minestom.server.entity.EntityType; +import net.minestom.server.network.packet.PacketWriter; +import net.minestom.server.utils.Position; + +import java.util.function.Consumer; + +public class EntityGuardian extends EntityCreature { + + private boolean retractingSpikes; + private Entity target; + + public EntityGuardian(Position spawnPosition) { + super(EntityType.GUARDIAN, spawnPosition); + setBoundingBox(0.85f, 0.85f, 0.85f); + } + + @Override + public Consumer getMetadataConsumer() { + return packet -> { + super.getMetadataConsumer().accept(packet); + fillMetadataIndex(packet, 15); + fillMetadataIndex(packet, 16); + }; + } + + @Override + protected void fillMetadataIndex(PacketWriter packet, int index) { + super.fillMetadataIndex(packet, index); + if (index == 15) { + packet.writeByte((byte) 15); + packet.writeByte(METADATA_BOOLEAN); + packet.writeBoolean(retractingSpikes); + } else if (index == 16) { + packet.writeByte((byte) 16); + packet.writeByte(METADATA_VARINT); + packet.writeVarInt(target == null ? 0 : target.getEntityId()); + } + } + + public boolean isRetractingSpikes() { + return retractingSpikes; + } + + public void setRetractingSpikes(boolean retractingSpikes) { + this.retractingSpikes = retractingSpikes; + } + + public Entity getTarget() { + return target; + } + + public void setTarget(Entity target) { + this.target = target; + } +} diff --git a/src/main/java/net/minestom/server/entity/type/EntityIronGolem.java b/src/main/java/net/minestom/server/entity/type/EntityIronGolem.java index 1d39e880f..b3123ce81 100644 --- a/src/main/java/net/minestom/server/entity/type/EntityIronGolem.java +++ b/src/main/java/net/minestom/server/entity/type/EntityIronGolem.java @@ -13,6 +13,7 @@ public class EntityIronGolem extends EntityCreature { public EntityIronGolem(Position spawnPosition) { super(EntityType.IRON_GOLEM, spawnPosition); + setBoundingBox(1.4f, 2.7f, 1.4f); } @Override diff --git a/src/main/java/net/minestom/server/entity/type/EntityMooshroom.java b/src/main/java/net/minestom/server/entity/type/EntityMooshroom.java index 198d000c0..1e978776b 100644 --- a/src/main/java/net/minestom/server/entity/type/EntityMooshroom.java +++ b/src/main/java/net/minestom/server/entity/type/EntityMooshroom.java @@ -13,6 +13,7 @@ public class EntityMooshroom extends EntityCreature { public EntityMooshroom(Position spawnPosition) { super(EntityType.MOOSHROOM, spawnPosition); + setBoundingBox(0.9f, 1.4f, 0.9f); setMooshroomType(MooshroomType.RED); } diff --git a/src/main/java/net/minestom/server/entity/type/EntityPhantom.java b/src/main/java/net/minestom/server/entity/type/EntityPhantom.java index cec872fd6..cf4dc0938 100644 --- a/src/main/java/net/minestom/server/entity/type/EntityPhantom.java +++ b/src/main/java/net/minestom/server/entity/type/EntityPhantom.java @@ -13,6 +13,7 @@ public class EntityPhantom extends EntityCreature { public EntityPhantom(Position spawnPosition) { super(EntityType.PHANTOM, spawnPosition); + setBoundingBox(0.9f, 0.5f, 0.9f); // TODO change based on size } @Override diff --git a/src/main/java/net/minestom/server/entity/type/EntityPig.java b/src/main/java/net/minestom/server/entity/type/EntityPig.java index ee793281e..e992205a3 100644 --- a/src/main/java/net/minestom/server/entity/type/EntityPig.java +++ b/src/main/java/net/minestom/server/entity/type/EntityPig.java @@ -13,6 +13,7 @@ public class EntityPig extends EntityCreature { public EntityPig(Position spawnPosition) { super(EntityType.PIG, spawnPosition); + setBoundingBox(0.9f, 0.9f, 0.9f); } @Override diff --git a/src/main/java/net/minestom/server/entity/type/EntityPigZombie.java b/src/main/java/net/minestom/server/entity/type/EntityPigZombie.java new file mode 100644 index 000000000..30b4262ea --- /dev/null +++ b/src/main/java/net/minestom/server/entity/type/EntityPigZombie.java @@ -0,0 +1,12 @@ +package net.minestom.server.entity.type; + +import net.minestom.server.entity.EntityCreature; +import net.minestom.server.entity.EntityType; +import net.minestom.server.utils.Position; + +public class EntityPigZombie extends EntityCreature { + public EntityPigZombie(Position spawnPosition) { + super(EntityType.ZOMBIE_PIGMAN, spawnPosition); + setBoundingBox(0.6f, 1.95f, 0.6f); + } +} diff --git a/src/main/java/net/minestom/server/entity/type/EntityPolarBear.java b/src/main/java/net/minestom/server/entity/type/EntityPolarBear.java index b848ce1fa..ac77a6663 100644 --- a/src/main/java/net/minestom/server/entity/type/EntityPolarBear.java +++ b/src/main/java/net/minestom/server/entity/type/EntityPolarBear.java @@ -13,6 +13,7 @@ public class EntityPolarBear extends EntityCreature { public EntityPolarBear(Position spawnPosition) { super(EntityType.POLAR_BEAR, spawnPosition); + setBoundingBox(1.3f, 1.4f, 1.3f); } @Override diff --git a/src/main/java/net/minestom/server/entity/type/EntityPotion.java b/src/main/java/net/minestom/server/entity/type/EntityPotion.java index a3c631904..15ee7fbf5 100644 --- a/src/main/java/net/minestom/server/entity/type/EntityPotion.java +++ b/src/main/java/net/minestom/server/entity/type/EntityPotion.java @@ -14,6 +14,7 @@ public class EntityPotion extends ObjectEntity { public EntityPotion(Position spawnPosition, ItemStack potion) { super(EntityType.POTION, spawnPosition); + setBoundingBox(0.25f, 0.25f, 0.25f); setPotion(potion); } diff --git a/src/main/java/net/minestom/server/entity/type/EntityRabbit.java b/src/main/java/net/minestom/server/entity/type/EntityRabbit.java index aebd5c8cf..f84b2afa5 100644 --- a/src/main/java/net/minestom/server/entity/type/EntityRabbit.java +++ b/src/main/java/net/minestom/server/entity/type/EntityRabbit.java @@ -13,6 +13,7 @@ public class EntityRabbit extends EntityCreature { public EntityRabbit(Position spawnPosition) { super(EntityType.RABBIT, spawnPosition); + setBoundingBox(0.4f, 0.5f, 0.4f); } @Override diff --git a/src/main/java/net/minestom/server/entity/type/EntitySilverfish.java b/src/main/java/net/minestom/server/entity/type/EntitySilverfish.java index 9f7d8d5b6..87412dc82 100644 --- a/src/main/java/net/minestom/server/entity/type/EntitySilverfish.java +++ b/src/main/java/net/minestom/server/entity/type/EntitySilverfish.java @@ -7,5 +7,6 @@ import net.minestom.server.utils.Position; public class EntitySilverfish extends EntityCreature { public EntitySilverfish(Position spawnPosition) { super(EntityType.SILVERFISH, spawnPosition); + setBoundingBox(0.4f, 0.3f, 0.4f); } } diff --git a/src/main/java/net/minestom/server/entity/type/EntitySlime.java b/src/main/java/net/minestom/server/entity/type/EntitySlime.java index 6bd92bf12..f7db3dd69 100644 --- a/src/main/java/net/minestom/server/entity/type/EntitySlime.java +++ b/src/main/java/net/minestom/server/entity/type/EntitySlime.java @@ -40,6 +40,8 @@ public class EntitySlime extends EntityCreature { public void setSize(int size) { this.size = size; + final float boxSize = 0.51000005f * size; + setBoundingBox(boxSize, boxSize, boxSize); sendMetadataIndex(15); } } diff --git a/src/main/java/net/minestom/server/entity/type/EntitySnowman.java b/src/main/java/net/minestom/server/entity/type/EntitySnowman.java index 57e74afd1..c7508e7ca 100644 --- a/src/main/java/net/minestom/server/entity/type/EntitySnowman.java +++ b/src/main/java/net/minestom/server/entity/type/EntitySnowman.java @@ -13,6 +13,7 @@ public class EntitySnowman extends EntityCreature { public EntitySnowman(Position spawnPosition) { super(EntityType.SNOW_GOLEM, spawnPosition); + setBoundingBox(0.7f, 1.9f, 0.7f); } @Override diff --git a/src/main/java/net/minestom/server/entity/type/EntitySpider.java b/src/main/java/net/minestom/server/entity/type/EntitySpider.java index c4de9b06a..ea8cf6d8b 100644 --- a/src/main/java/net/minestom/server/entity/type/EntitySpider.java +++ b/src/main/java/net/minestom/server/entity/type/EntitySpider.java @@ -13,6 +13,7 @@ public class EntitySpider extends EntityCreature { public EntitySpider(Position spawnPosition) { super(EntityType.SPIDER, spawnPosition); + setBoundingBox(1.4f, 0.9f, 1.4f); } @Override diff --git a/src/main/java/net/minestom/server/entity/type/EntityWitch.java b/src/main/java/net/minestom/server/entity/type/EntityWitch.java index f497c7b34..07fab805f 100644 --- a/src/main/java/net/minestom/server/entity/type/EntityWitch.java +++ b/src/main/java/net/minestom/server/entity/type/EntityWitch.java @@ -13,6 +13,7 @@ public class EntityWitch extends EntityCreature { public EntityWitch(Position spawnPosition) { super(EntityType.WITCH, spawnPosition); + setBoundingBox(0.6f, 1.95f, 0.6f); } @Override diff --git a/src/main/java/net/minestom/server/entity/type/EntityZombie.java b/src/main/java/net/minestom/server/entity/type/EntityZombie.java index 398f7646f..0e2995efa 100644 --- a/src/main/java/net/minestom/server/entity/type/EntityZombie.java +++ b/src/main/java/net/minestom/server/entity/type/EntityZombie.java @@ -14,6 +14,7 @@ public class EntityZombie extends EntityCreature { public EntityZombie(Position spawnPosition) { super(EntityType.ZOMBIE, spawnPosition); + setBoundingBox(0.6f, 1.95f, 0.6f); } @Override diff --git a/src/main/java/net/minestom/server/item/ItemStack.java b/src/main/java/net/minestom/server/item/ItemStack.java index d332a4b8c..5ca83696d 100644 --- a/src/main/java/net/minestom/server/item/ItemStack.java +++ b/src/main/java/net/minestom/server/item/ItemStack.java @@ -256,6 +256,10 @@ public class ItemStack implements DataContainer { itemStack.setStackingRule(getStackingRule()); itemStack.enchantmentMap = new HashMap<>(enchantmentMap); + itemStack.storedEnchantmentMap = new HashMap<>(storedEnchantmentMap); + itemStack.attributes = new ArrayList<>(attributes); + itemStack.potionTypes = new HashSet<>(potionTypes); + itemStack.hideFlag = hideFlag; Data data = getData(); if (data != null) diff --git a/src/main/java/net/minestom/server/network/player/FakePlayerConnection.java b/src/main/java/net/minestom/server/network/player/FakePlayerConnection.java index 25a9241fa..72c5f54f7 100644 --- a/src/main/java/net/minestom/server/network/player/FakePlayerConnection.java +++ b/src/main/java/net/minestom/server/network/player/FakePlayerConnection.java @@ -29,7 +29,7 @@ public class FakePlayerConnection extends PlayerConnection { @Override public void flush() { - + throw new UnsupportedOperationException("FakePlayer does not have anything to flush"); } @Override diff --git a/src/main/java/net/minestom/server/utils/Utils.java b/src/main/java/net/minestom/server/utils/Utils.java index b4876b399..abf2f51a7 100644 --- a/src/main/java/net/minestom/server/utils/Utils.java +++ b/src/main/java/net/minestom/server/utils/Utils.java @@ -220,7 +220,6 @@ public class Utils { packet.writeByte((byte) 0x08); // type id (string) packet.writeShortSizedString("Potion"); packet.writeShortSizedString("minecraft:" + potionType.name().toLowerCase()); - } } }