From e869478e790f993eaed432784570c387b71b50af Mon Sep 17 00:00:00 2001 From: Bixilon Date: Thu, 12 Nov 2020 21:48:51 +0100 Subject: [PATCH] add zombie, prototype of new entity system (wip) --- .../minosoft/data/EntityClassMappings.java | 32 ++++++++++ .../de/bixilon/minosoft/data/Mappings.java | 3 +- .../minosoft/data/VelocityHandler.java | 2 +- .../data/entities/EntityInformation.java | 8 +++ .../data/entities/EntityMetaData.java | 2 +- .../data/entities/EntityMetaDataFields.java | 8 ++- .../minosoft/data/entities/Objects.java | 1 + .../data/entities/{ => entities}/Entity.java | 6 +- .../entities/{ => entities}/LivingEntity.java | 7 ++- .../minosoft/data/entities/entities/Mob.java | 45 ++++++++++++++ .../data/entities/entities/Monster.java | 27 +++++++++ .../data/entities/entities/PathfinderMob.java | 27 +++++++++ .../data/entities/entities/Zombie.java | 41 +++++++++++++ .../minosoft/data/mappings/CustomMapping.java | 23 +++++++- .../data/mappings/EntityMappings.java | 26 +++++++- .../mappings/versions/VersionMapping.java | 59 +++++++++++++++---- .../data/mappings/versions/Versions.java | 9 ++- .../de/bixilon/minosoft/data/world/World.java | 2 +- .../event/events/EntityDespawnEvent.java | 2 +- .../events/EntityEquipmentChangeEvent.java | 2 +- .../event/events/EntitySpawnEvent.java | 2 +- .../clientbound/play/PacketSpawnMob.java | 8 ++- .../clientbound/play/PacketSpawnObject.java | 6 +- .../play/PacketInteractEntity.java | 2 +- .../protocol/protocol/PacketHandler.java | 2 +- .../java/de/bixilon/minosoft/util/Pair.java | 44 ++++++++++++++ .../resources/assets/mapping/entities.json | 44 ++++++++++++++ 27 files changed, 404 insertions(+), 36 deletions(-) create mode 100644 src/main/java/de/bixilon/minosoft/data/EntityClassMappings.java rename src/main/java/de/bixilon/minosoft/data/entities/{ => entities}/Entity.java (97%) rename src/main/java/de/bixilon/minosoft/data/entities/{ => entities}/LivingEntity.java (91%) create mode 100644 src/main/java/de/bixilon/minosoft/data/entities/entities/Mob.java create mode 100644 src/main/java/de/bixilon/minosoft/data/entities/entities/Monster.java create mode 100644 src/main/java/de/bixilon/minosoft/data/entities/entities/PathfinderMob.java create mode 100644 src/main/java/de/bixilon/minosoft/data/entities/entities/Zombie.java create mode 100644 src/main/java/de/bixilon/minosoft/util/Pair.java create mode 100644 src/main/resources/assets/mapping/entities.json diff --git a/src/main/java/de/bixilon/minosoft/data/EntityClassMappings.java b/src/main/java/de/bixilon/minosoft/data/EntityClassMappings.java new file mode 100644 index 000000000..1f1a47243 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/data/EntityClassMappings.java @@ -0,0 +1,32 @@ +/* + * Minosoft + * Copyright (C) 2020 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program.If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.data; + +import com.google.common.collect.HashBiMap; +import de.bixilon.minosoft.data.entities.entities.Entity; +import de.bixilon.minosoft.data.entities.entities.Zombie; +import javafx.util.Pair; + +public final class EntityClassMappings { + public static final HashBiMap, Pair> ENTITY_CLASS_MAPPINGS = HashBiMap.create(); + + static { + ENTITY_CLASS_MAPPINGS.put(Zombie.class, new Pair<>("minecraft", "zombie")); + } + + public static Class getByIdentifier(String mod, String identifier) { + return ENTITY_CLASS_MAPPINGS.inverse().get(new Pair<>(mod, identifier)); + } + +} diff --git a/src/main/java/de/bixilon/minosoft/data/Mappings.java b/src/main/java/de/bixilon/minosoft/data/Mappings.java index bf4aa7506..d774d03f9 100644 --- a/src/main/java/de/bixilon/minosoft/data/Mappings.java +++ b/src/main/java/de/bixilon/minosoft/data/Mappings.java @@ -15,5 +15,6 @@ package de.bixilon.minosoft.data; public enum Mappings { BLOCKS, - REGISTRIES + REGISTRIES, + ENTITIES } diff --git a/src/main/java/de/bixilon/minosoft/data/VelocityHandler.java b/src/main/java/de/bixilon/minosoft/data/VelocityHandler.java index 85ac706bd..d148e9490 100644 --- a/src/main/java/de/bixilon/minosoft/data/VelocityHandler.java +++ b/src/main/java/de/bixilon/minosoft/data/VelocityHandler.java @@ -13,8 +13,8 @@ package de.bixilon.minosoft.data; -import de.bixilon.minosoft.data.entities.Entity; import de.bixilon.minosoft.data.entities.Velocity; +import de.bixilon.minosoft.data.entities.entities.Entity; import de.bixilon.minosoft.protocol.network.Connection; import java.util.HashMap; diff --git a/src/main/java/de/bixilon/minosoft/data/entities/EntityInformation.java b/src/main/java/de/bixilon/minosoft/data/entities/EntityInformation.java index 7eddbf1a1..f676ec6be 100644 --- a/src/main/java/de/bixilon/minosoft/data/entities/EntityInformation.java +++ b/src/main/java/de/bixilon/minosoft/data/entities/EntityInformation.java @@ -32,6 +32,14 @@ public class EntityInformation { this.height = height; } + public EntityInformation(String mod, String identifier, int maxHealth, int width, int height) { + this.mod = mod; + this.identifier = identifier; + this.maxHealth = maxHealth; + this.width = this.length = width; + this.height = height; + } + public String getMod() { return mod; } diff --git a/src/main/java/de/bixilon/minosoft/data/entities/EntityMetaData.java b/src/main/java/de/bixilon/minosoft/data/entities/EntityMetaData.java index 08b88d617..9e77c1abf 100644 --- a/src/main/java/de/bixilon/minosoft/data/entities/EntityMetaData.java +++ b/src/main/java/de/bixilon/minosoft/data/entities/EntityMetaData.java @@ -203,7 +203,7 @@ public class EntityMetaData { } public Object get(EntityMetaDataFields field) { - int index = connection.getMapping().getEntityMappings().getEntityMetaDatIndex(field); + int index = connection.getMapping().getEntityMetaDatIndex(field); if (containsKey(index)) { return super.get(index); } diff --git a/src/main/java/de/bixilon/minosoft/data/entities/EntityMetaDataFields.java b/src/main/java/de/bixilon/minosoft/data/entities/EntityMetaDataFields.java index ad733f327..06c321da1 100644 --- a/src/main/java/de/bixilon/minosoft/data/entities/EntityMetaDataFields.java +++ b/src/main/java/de/bixilon/minosoft/data/entities/EntityMetaDataFields.java @@ -29,7 +29,13 @@ public enum EntityMetaDataFields { LIVING_ENTITY_EFFECT_AMBIENCE(false), LIVING_ENTITY_ARROW_COUNT(0), LIVING_ENTITY_ABSORPTION_HEARTS(0), - LIVING_ENTITY_BED_POSITION; + LIVING_ENTITY_BED_POSITION, + + MOB_FLAGS(0), + + ZOMBIE_IS_BABY(false), + ZOMBIE_SPECIAL_TYPE(0), + ZOMBIE_DROWNING_CONVERSION(false); final Object defaultValue; diff --git a/src/main/java/de/bixilon/minosoft/data/entities/Objects.java b/src/main/java/de/bixilon/minosoft/data/entities/Objects.java index ce277b785..27d97c1d9 100644 --- a/src/main/java/de/bixilon/minosoft/data/entities/Objects.java +++ b/src/main/java/de/bixilon/minosoft/data/entities/Objects.java @@ -14,6 +14,7 @@ package de.bixilon.minosoft.data.entities; import com.google.common.collect.HashBiMap; +import de.bixilon.minosoft.data.entities.entities.Entity; public enum Objects { /* diff --git a/src/main/java/de/bixilon/minosoft/data/entities/Entity.java b/src/main/java/de/bixilon/minosoft/data/entities/entities/Entity.java similarity index 97% rename from src/main/java/de/bixilon/minosoft/data/entities/Entity.java rename to src/main/java/de/bixilon/minosoft/data/entities/entities/Entity.java index 507c767ce..c4700e146 100644 --- a/src/main/java/de/bixilon/minosoft/data/entities/Entity.java +++ b/src/main/java/de/bixilon/minosoft/data/entities/entities/Entity.java @@ -11,8 +11,9 @@ * This software is not affiliated with Mojang AB, the original developer of Minecraft. */ -package de.bixilon.minosoft.data.entities; +package de.bixilon.minosoft.data.entities.entities; +import de.bixilon.minosoft.data.entities.*; import de.bixilon.minosoft.data.inventory.InventorySlots; import de.bixilon.minosoft.data.inventory.Slot; import de.bixilon.minosoft.data.mappings.MobEffect; @@ -37,7 +38,7 @@ public abstract class Entity { protected EntityMetaData metaData; public Entity(Connection connection, int entityId, UUID uuid, Location location, EntityRotation rotation) { - this.information = connection.getMapping().getEntityMappings().getEntityInformation(getClass()); + this.information = connection.getMapping().getEntityInformation(getClass()); this.entityId = entityId; this.uuid = uuid; this.location = location; @@ -136,7 +137,6 @@ public abstract class Entity { return information; } - // meta data private boolean getEntityFlag(int bitMask) { return metaData.getSets().getBitMask(EntityMetaDataFields.ENTITY_FLAGS, bitMask); diff --git a/src/main/java/de/bixilon/minosoft/data/entities/LivingEntity.java b/src/main/java/de/bixilon/minosoft/data/entities/entities/LivingEntity.java similarity index 91% rename from src/main/java/de/bixilon/minosoft/data/entities/LivingEntity.java rename to src/main/java/de/bixilon/minosoft/data/entities/entities/LivingEntity.java index b6903aec3..1a334d3f9 100644 --- a/src/main/java/de/bixilon/minosoft/data/entities/LivingEntity.java +++ b/src/main/java/de/bixilon/minosoft/data/entities/entities/LivingEntity.java @@ -11,8 +11,11 @@ * This software is not affiliated with Mojang AB, the original developer of Minecraft. */ -package de.bixilon.minosoft.data.entities; +package de.bixilon.minosoft.data.entities.entities; +import de.bixilon.minosoft.data.entities.EntityMetaDataFields; +import de.bixilon.minosoft.data.entities.EntityRotation; +import de.bixilon.minosoft.data.entities.Location; import de.bixilon.minosoft.data.player.Hands; import de.bixilon.minosoft.data.world.BlockPosition; import de.bixilon.minosoft.protocol.network.Connection; @@ -24,7 +27,7 @@ public abstract class LivingEntity extends Entity { super(connection, entityId, uuid, location, rotation); } - // meta data + private boolean getLivingEntityFlag(int bitMask) { return metaData.getSets().getBitMask(EntityMetaDataFields.LIVING_ENTITY_FLAGS, bitMask); } diff --git a/src/main/java/de/bixilon/minosoft/data/entities/entities/Mob.java b/src/main/java/de/bixilon/minosoft/data/entities/entities/Mob.java new file mode 100644 index 000000000..5131aa3f6 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/data/entities/entities/Mob.java @@ -0,0 +1,45 @@ +/* + * Minosoft + * Copyright (C) 2020 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program.If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.data.entities.entities; + +import de.bixilon.minosoft.data.entities.EntityMetaDataFields; +import de.bixilon.minosoft.data.entities.EntityRotation; +import de.bixilon.minosoft.data.entities.Location; +import de.bixilon.minosoft.protocol.network.Connection; + +import java.util.UUID; + +public abstract class Mob extends LivingEntity { + public Mob(Connection connection, int entityId, UUID uuid, Location location, EntityRotation rotation) { + super(connection, entityId, uuid, location, rotation); + } + + private boolean getMobFlags(int bitMask) { + return metaData.getSets().getBitMask(EntityMetaDataFields.MOB_FLAGS, bitMask); + } + + public boolean isNoAi() { + return getMobFlags(0x01); + } + + public boolean isLeftHanded() { + return getMobFlags(0x02); + } + + public boolean isAggressive() { + return getMobFlags(0x04); + } + +} + diff --git a/src/main/java/de/bixilon/minosoft/data/entities/entities/Monster.java b/src/main/java/de/bixilon/minosoft/data/entities/entities/Monster.java new file mode 100644 index 000000000..e7d991673 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/data/entities/entities/Monster.java @@ -0,0 +1,27 @@ +/* + * Minosoft + * Copyright (C) 2020 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program.If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.data.entities.entities; + +import de.bixilon.minosoft.data.entities.EntityRotation; +import de.bixilon.minosoft.data.entities.Location; +import de.bixilon.minosoft.protocol.network.Connection; + +import java.util.UUID; + +public abstract class Monster extends PathfinderMob { + public Monster(Connection connection, int entityId, UUID uuid, Location location, EntityRotation rotation) { + super(connection, entityId, uuid, location, rotation); + } +} + diff --git a/src/main/java/de/bixilon/minosoft/data/entities/entities/PathfinderMob.java b/src/main/java/de/bixilon/minosoft/data/entities/entities/PathfinderMob.java new file mode 100644 index 000000000..ce346c9d7 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/data/entities/entities/PathfinderMob.java @@ -0,0 +1,27 @@ +/* + * Minosoft + * Copyright (C) 2020 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program.If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.data.entities.entities; + +import de.bixilon.minosoft.data.entities.EntityRotation; +import de.bixilon.minosoft.data.entities.Location; +import de.bixilon.minosoft.protocol.network.Connection; + +import java.util.UUID; + +public abstract class PathfinderMob extends Mob { + public PathfinderMob(Connection connection, int entityId, UUID uuid, Location location, EntityRotation rotation) { + super(connection, entityId, uuid, location, rotation); + } +} + diff --git a/src/main/java/de/bixilon/minosoft/data/entities/entities/Zombie.java b/src/main/java/de/bixilon/minosoft/data/entities/entities/Zombie.java new file mode 100644 index 000000000..dcd869a92 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/data/entities/entities/Zombie.java @@ -0,0 +1,41 @@ +/* + * Minosoft + * Copyright (C) 2020 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program.If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.data.entities.entities; + +import de.bixilon.minosoft.data.entities.EntityMetaDataFields; +import de.bixilon.minosoft.data.entities.EntityRotation; +import de.bixilon.minosoft.data.entities.Location; +import de.bixilon.minosoft.protocol.network.Connection; + +import java.util.UUID; + +public class Zombie extends Monster { + public Zombie(Connection connection, int entityId, UUID uuid, Location location, EntityRotation rotation) { + super(connection, entityId, uuid, location, rotation); + } + + + public boolean isBaby() { + return metaData.getSets().getBoolean(EntityMetaDataFields.ZOMBIE_IS_BABY); + } + + public int getSpecialType() { + return metaData.getSets().getInt(EntityMetaDataFields.ZOMBIE_SPECIAL_TYPE); + } + + public boolean isConvertingToDrowned() { + return metaData.getSets().getBoolean(EntityMetaDataFields.ZOMBIE_DROWNING_CONVERSION); + } +} + diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/CustomMapping.java b/src/main/java/de/bixilon/minosoft/data/mappings/CustomMapping.java index adbb10927..cfa0986a2 100644 --- a/src/main/java/de/bixilon/minosoft/data/mappings/CustomMapping.java +++ b/src/main/java/de/bixilon/minosoft/data/mappings/CustomMapping.java @@ -14,6 +14,9 @@ package de.bixilon.minosoft.data.mappings; import com.google.common.collect.HashBiMap; +import de.bixilon.minosoft.data.entities.EntityInformation; +import de.bixilon.minosoft.data.entities.EntityMetaDataFields; +import de.bixilon.minosoft.data.entities.entities.Entity; import de.bixilon.minosoft.data.mappings.blocks.Block; import de.bixilon.minosoft.data.mappings.particle.Particle; import de.bixilon.minosoft.data.mappings.statistics.Statistic; @@ -35,7 +38,7 @@ public class CustomMapping { final HashBiMap enchantmentMap = HashBiMap.create(); final HashBiMap particleIdMap = HashBiMap.create(); final HashBiMap statisticIdMap = HashBiMap.create(); - final EntityMappings entityMappings = null; //ToDo + final EntityMappings entityMappings = new EntityMappings(); Version version; HashMap> dimensionIdentifierMap = new HashMap<>(); @@ -186,6 +189,17 @@ public class CustomMapping { return version.getMapping().getIdByEnchantment(enchantment); } + public EntityInformation getEntityInformation(Class clazz) { + if (entityMappings.getEntityInformation(clazz) != null) { + return entityMappings.getEntityInformation(clazz); + } + return version.getMapping().getEntityInformation(clazz); + } + + public int getEntityMetaDatIndex(EntityMetaDataFields field) { + return version.getMapping().getEntityMetaDatIndex(field); + } + public void unload() { motiveIdentifierMap.clear(); particleIdentifierMap.clear(); @@ -206,7 +220,10 @@ public class CustomMapping { dimensionIdentifierMap = dimensions; } - public EntityMappings getEntityMappings() { - return entityMappings; + public Class getEntityClassById(int id) { + if (entityMappings.getEntityClassById(id) != null) { + return entityMappings.getEntityClassById(id); + } + return version.getMapping().getEntityClassById(id); } } diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/EntityMappings.java b/src/main/java/de/bixilon/minosoft/data/mappings/EntityMappings.java index 9835524f9..9816fd88b 100644 --- a/src/main/java/de/bixilon/minosoft/data/mappings/EntityMappings.java +++ b/src/main/java/de/bixilon/minosoft/data/mappings/EntityMappings.java @@ -14,18 +14,38 @@ package de.bixilon.minosoft.data.mappings; import com.google.common.collect.HashBiMap; -import de.bixilon.minosoft.data.entities.Entity; import de.bixilon.minosoft.data.entities.EntityInformation; import de.bixilon.minosoft.data.entities.EntityMetaDataFields; +import de.bixilon.minosoft.data.entities.entities.Entity; + +import java.util.HashMap; public class EntityMappings { - private final HashBiMap, EntityInformation> entityInformationMap = HashBiMap.create(); + private final HashBiMap, EntityInformation> entityInformationMap; + private final HashMap indexMapping; + private final HashBiMap> entityIdMapping; + + public EntityMappings() { + this.entityInformationMap = HashBiMap.create(); + this.indexMapping = new HashMap<>(); + this.entityIdMapping = HashBiMap.create(); + } + + public EntityMappings(HashBiMap, EntityInformation> entityInformationMap, HashMap indexMapping, HashBiMap> entityIdMapping) { + this.entityInformationMap = entityInformationMap; + this.indexMapping = indexMapping; + this.entityIdMapping = entityIdMapping; + } public EntityInformation getEntityInformation(Class clazz) { return entityInformationMap.get(clazz); } public int getEntityMetaDatIndex(EntityMetaDataFields field) { - return 0; // ToDo + return indexMapping.get(field); + } + + public Class getEntityClassById(int id) { + return entityIdMapping.get(id); } } diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/versions/VersionMapping.java b/src/main/java/de/bixilon/minosoft/data/mappings/versions/VersionMapping.java index 6a26a7191..ef433775e 100644 --- a/src/main/java/de/bixilon/minosoft/data/mappings/versions/VersionMapping.java +++ b/src/main/java/de/bixilon/minosoft/data/mappings/versions/VersionMapping.java @@ -15,7 +15,11 @@ package de.bixilon.minosoft.data.mappings.versions; import com.google.common.collect.HashBiMap; import com.google.gson.JsonObject; +import de.bixilon.minosoft.data.EntityClassMappings; import de.bixilon.minosoft.data.Mappings; +import de.bixilon.minosoft.data.entities.EntityInformation; +import de.bixilon.minosoft.data.entities.EntityMetaDataFields; +import de.bixilon.minosoft.data.entities.entities.Entity; import de.bixilon.minosoft.data.mappings.*; import de.bixilon.minosoft.data.mappings.blocks.Block; import de.bixilon.minosoft.data.mappings.blocks.Blocks; @@ -23,6 +27,7 @@ import de.bixilon.minosoft.data.mappings.particle.Particle; import de.bixilon.minosoft.data.mappings.statistics.Statistic; import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition; +import java.util.HashMap; import java.util.HashSet; public class VersionMapping { @@ -32,7 +37,6 @@ public class VersionMapping { HashBiMap particleIdentifierMap; HashBiMap statisticIdentifierMap; HashBiMap itemMap; - HashBiMap entityMap; HashBiMap motiveIdMap; HashBiMap mobEffectMap; HashBiMap dimensionMap; @@ -41,6 +45,7 @@ public class VersionMapping { HashBiMap enchantmentMap; HashBiMap particleIdMap; HashBiMap statisticIdMap; + EntityMappings entityMappings; public VersionMapping(Version version) { this.version = version; @@ -66,10 +71,6 @@ public class VersionMapping { return itemMap.inverse().get(item); } - public String getEntityIdentifierById(int versionId) { - return "minecraft:" + entityMap.get(versionId); - } - public Motive getMotiveById(int versionId) { return motiveIdMap.get(versionId); } @@ -128,11 +129,6 @@ public class VersionMapping { } itemMap.put(itemId, item); } - entityMap = HashBiMap.create(); - JsonObject entityJson = data.getAsJsonObject("entity_type").getAsJsonObject("entries"); - for (String identifier : entityJson.keySet()) { - entityMap.put(entityJson.getAsJsonObject(identifier).get("id").getAsInt(), identifier); - } enchantmentMap = HashBiMap.create(); JsonObject enchantmentJson = data.getAsJsonObject("enchantment").getAsJsonObject("entries"); for (String identifier : enchantmentJson.keySet()) { @@ -191,6 +187,36 @@ public class VersionMapping { } } case BLOCKS -> blockMap = Blocks.load("minecraft", data, version.getVersionId() < ProtocolDefinition.FLATTING_VERSION_ID); + case ENTITIES -> { + HashBiMap, EntityInformation> entityInformationMap = HashBiMap.create(); + HashMap indexMapping = new HashMap<>(); + HashBiMap> entityIdMap = HashBiMap.create(); + + for (String mod : data.keySet()) { + JsonObject modJson = data.getAsJsonObject(mod); + for (String identifier : modJson.keySet()) { + JsonObject identifierJson = modJson.getAsJsonObject(identifier); + if (!identifier.startsWith("~abstract")) { + // not abstract, has attributes + Class clazz = EntityClassMappings.getByIdentifier(mod, identifier); + entityInformationMap.put(clazz, new EntityInformation(mod, identifier, identifierJson.get("maxHealth").getAsInt(), identifierJson.get("length").getAsInt(), identifierJson.get("width").getAsInt(), identifierJson.get("height").getAsInt())); + + entityIdMap.put(identifierJson.get("id").getAsInt(), clazz); + } + + + // meta data index + if (identifierJson.has("data")) { + JsonObject metaDataJson = identifierJson.getAsJsonObject("data"); + for (String field : metaDataJson.keySet()) { + indexMapping.put(EntityMetaDataFields.valueOf(field), metaDataJson.get(field).getAsInt()); + } + } + } + } + + entityMappings = new EntityMappings(entityInformationMap, indexMapping, entityIdMap); + } } loaded.add(type); } @@ -200,7 +226,6 @@ public class VersionMapping { particleIdentifierMap.clear(); statisticIdentifierMap.clear(); itemMap.clear(); - entityMap.clear(); motiveIdMap.clear(); mobEffectMap.clear(); dimensionMap.clear(); @@ -219,4 +244,16 @@ public class VersionMapping { } return true; } + + public EntityInformation getEntityInformation(Class clazz) { + return entityMappings.getEntityInformation(clazz); + } + + public int getEntityMetaDatIndex(EntityMetaDataFields field) { + return entityMappings.getEntityMetaDatIndex(field); + } + + public Class getEntityClassById(int id) { + return entityMappings.getEntityClassById(id); + } } diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/versions/Versions.java b/src/main/java/de/bixilon/minosoft/data/mappings/versions/Versions.java index f78a6e497..b34ae9216 100644 --- a/src/main/java/de/bixilon/minosoft/data/mappings/versions/Versions.java +++ b/src/main/java/de/bixilon/minosoft/data/mappings/versions/Versions.java @@ -40,6 +40,7 @@ public class Versions { static { mappingsHashMap.put("registries", Mappings.REGISTRIES); mappingsHashMap.put("blocks", Mappings.BLOCKS); + mappingsHashMap.put("entities", Mappings.ENTITIES); } public static Version getVersionById(int versionId) { @@ -125,7 +126,13 @@ public class Versions { HashMap files = Util.readJsonTarStream(AssetsManager.readAssetAsStream(String.format("mappings/%s", version.getVersionName()))); for (Map.Entry mappingSet : mappingsHashMap.entrySet()) { - JsonObject data = files.get(mappingSet.getKey() + ".json").getAsJsonObject("minecraft"); + JsonObject data; + //ToDo + if (mappingSet.getValue() == Mappings.ENTITIES) { + data = Util.readJsonAsset("mapping/entities.json"); // ToDo + } else { + data = files.get(mappingSet.getKey() + ".json").getAsJsonObject("minecraft"); + } loadVersionMappings(mappingSet.getValue(), data, versionId); } diff --git a/src/main/java/de/bixilon/minosoft/data/world/World.java b/src/main/java/de/bixilon/minosoft/data/world/World.java index 18fe3a571..65312e5a2 100644 --- a/src/main/java/de/bixilon/minosoft/data/world/World.java +++ b/src/main/java/de/bixilon/minosoft/data/world/World.java @@ -13,8 +13,8 @@ package de.bixilon.minosoft.data.world; -import de.bixilon.minosoft.data.entities.Entity; import de.bixilon.minosoft.data.entities.block.BlockEntityMetaData; +import de.bixilon.minosoft.data.entities.entities.Entity; import de.bixilon.minosoft.data.mappings.Dimension; import de.bixilon.minosoft.data.mappings.blocks.Block; import de.bixilon.minosoft.data.mappings.blocks.Blocks; diff --git a/src/main/java/de/bixilon/minosoft/modding/event/events/EntityDespawnEvent.java b/src/main/java/de/bixilon/minosoft/modding/event/events/EntityDespawnEvent.java index 0a8114bbe..8d562b8ed 100644 --- a/src/main/java/de/bixilon/minosoft/modding/event/events/EntityDespawnEvent.java +++ b/src/main/java/de/bixilon/minosoft/modding/event/events/EntityDespawnEvent.java @@ -13,7 +13,7 @@ package de.bixilon.minosoft.modding.event.events; -import de.bixilon.minosoft.data.entities.Entity; +import de.bixilon.minosoft.data.entities.entities.Entity; import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.clientbound.play.PacketDestroyEntity; diff --git a/src/main/java/de/bixilon/minosoft/modding/event/events/EntityEquipmentChangeEvent.java b/src/main/java/de/bixilon/minosoft/modding/event/events/EntityEquipmentChangeEvent.java index 08cd6ca84..57307a971 100644 --- a/src/main/java/de/bixilon/minosoft/modding/event/events/EntityEquipmentChangeEvent.java +++ b/src/main/java/de/bixilon/minosoft/modding/event/events/EntityEquipmentChangeEvent.java @@ -13,7 +13,7 @@ package de.bixilon.minosoft.modding.event.events; -import de.bixilon.minosoft.data.entities.Entity; +import de.bixilon.minosoft.data.entities.entities.Entity; import de.bixilon.minosoft.data.inventory.InventorySlots; import de.bixilon.minosoft.data.inventory.Slot; import de.bixilon.minosoft.protocol.network.Connection; diff --git a/src/main/java/de/bixilon/minosoft/modding/event/events/EntitySpawnEvent.java b/src/main/java/de/bixilon/minosoft/modding/event/events/EntitySpawnEvent.java index 7a368b44f..fa426a404 100644 --- a/src/main/java/de/bixilon/minosoft/modding/event/events/EntitySpawnEvent.java +++ b/src/main/java/de/bixilon/minosoft/modding/event/events/EntitySpawnEvent.java @@ -13,7 +13,7 @@ package de.bixilon.minosoft.modding.event.events; -import de.bixilon.minosoft.data.entities.Entity; +import de.bixilon.minosoft.data.entities.entities.Entity; import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.clientbound.play.*; diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnMob.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnMob.java index 57c3cb0d9..bb9fc7f23 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnMob.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnMob.java @@ -13,7 +13,11 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; -import de.bixilon.minosoft.data.entities.*; +import de.bixilon.minosoft.data.entities.EntityMetaData; +import de.bixilon.minosoft.data.entities.EntityRotation; +import de.bixilon.minosoft.data.entities.Location; +import de.bixilon.minosoft.data.entities.Velocity; +import de.bixilon.minosoft.data.entities.entities.Entity; import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; @@ -40,7 +44,7 @@ public class PacketSpawnMob implements ClientboundPacket { } else { type = buffer.readVarInt(); } - Class typeClass = null; //ToDo + Class typeClass = buffer.getConnection().getMapping().getEntityClassById(type); Location location; if (buffer.getVersionId() < 100) { location = new Location(buffer.readFixedPointNumberInteger(), buffer.readFixedPointNumberInteger(), buffer.readFixedPointNumberInteger()); diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnObject.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnObject.java index 76d894610..691459602 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnObject.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnObject.java @@ -13,7 +13,11 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; -import de.bixilon.minosoft.data.entities.*; +import de.bixilon.minosoft.data.entities.EntityRotation; +import de.bixilon.minosoft.data.entities.Location; +import de.bixilon.minosoft.data.entities.Objects; +import de.bixilon.minosoft.data.entities.Velocity; +import de.bixilon.minosoft.data.entities.entities.Entity; import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/serverbound/play/PacketInteractEntity.java b/src/main/java/de/bixilon/minosoft/protocol/packets/serverbound/play/PacketInteractEntity.java index 7835002e2..35c2c70ca 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/serverbound/play/PacketInteractEntity.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/serverbound/play/PacketInteractEntity.java @@ -13,8 +13,8 @@ package de.bixilon.minosoft.protocol.packets.serverbound.play; -import de.bixilon.minosoft.data.entities.Entity; import de.bixilon.minosoft.data.entities.Location; +import de.bixilon.minosoft.data.entities.entities.Entity; import de.bixilon.minosoft.data.player.Hands; import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.protocol.network.Connection; diff --git a/src/main/java/de/bixilon/minosoft/protocol/protocol/PacketHandler.java b/src/main/java/de/bixilon/minosoft/protocol/protocol/PacketHandler.java index 1604a56cc..1e69f04c1 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/protocol/PacketHandler.java +++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/PacketHandler.java @@ -16,7 +16,7 @@ package de.bixilon.minosoft.protocol.protocol; import de.bixilon.minosoft.Minosoft; import de.bixilon.minosoft.config.ConfigurationPaths; import de.bixilon.minosoft.data.GameModes; -import de.bixilon.minosoft.data.entities.Entity; +import de.bixilon.minosoft.data.entities.entities.Entity; import de.bixilon.minosoft.data.mappings.blocks.Blocks; import de.bixilon.minosoft.data.mappings.recipes.Recipes; import de.bixilon.minosoft.data.mappings.versions.Version; diff --git a/src/main/java/de/bixilon/minosoft/util/Pair.java b/src/main/java/de/bixilon/minosoft/util/Pair.java new file mode 100644 index 000000000..4287beced --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/util/Pair.java @@ -0,0 +1,44 @@ +/* + * Minosoft + * Copyright (C) 2020 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program.If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.util; + +import java.util.Objects; + +public class Pair { + + public final K key; + public final V value; + + public Pair(K key, V value) { + this.key = key; + this.value = value; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Pair pair = (Pair) o; + return Objects.equals(key, pair.key) && Objects.equals(value, pair.value); + } + + @Override + public int hashCode() { + return Objects.hash(key, value); + } + + public String toString() { + return String.format("%s=%s", key, value); + } +} diff --git a/src/main/resources/assets/mapping/entities.json b/src/main/resources/assets/mapping/entities.json new file mode 100644 index 000000000..307ce1585 --- /dev/null +++ b/src/main/resources/assets/mapping/entities.json @@ -0,0 +1,44 @@ +{ + "minecraft": { + "~abstract_entity": { + "data": { + "ENTITY_FLAGS": 0, + "ENTITY_AIR_SUPPLY": 1, + "ENTITY_CUSTOM_NAME": 2, + "ENTITY_CUSTOM_NAME_VISIBLE": 3, + "ENTITY_SILENT": 4, + "ENTITY_NO_GRAVITY": 5, + "ENTITY_POSE": 6, + "ENTITY_TICKS_FROZEN": 7 + } + }, + "~abstract_living_entity": { + "data": { + "LIVING_ENTITY_FLAGS": 8, + "LIVING_ENTITY_HEALTH": 9, + "LIVING_ENTITY_EFFECT_COLOR": 10, + "LIVING_ENTITY_EFFECT_AMBIENCE": 11, + "LIVING_ENTITY_ARROW_COUNT": 12, + "LIVING_ENTITY_ABSORPTION_HEARTS": 13, + "LIVING_ENTITY_BED_POSITION": 14 + } + }, + "~abstract_mob": { + "data": { + "MOB_FLAGS": 15 + } + }, + "zombie": { + "id": 102, + "length": 0.6, + "width": 0.6, + "height": 1.95, + "maxHealth": 20, + "data": { + "ZOMBIE_IS_BABY": 16, + "ZOMBIE_SPECIAL_TYPE": 17, + "ZOMBIE_DROWNING_CONVERSION": 18 + } + } + } +}