diff --git a/src/main/java/de/bixilon/minosoft/data/DefaultEntityFactories.kt b/src/main/java/de/bixilon/minosoft/data/DefaultEntityFactories.kt index af29842ac..b93875ff3 100644 --- a/src/main/java/de/bixilon/minosoft/data/DefaultEntityFactories.kt +++ b/src/main/java/de/bixilon/minosoft/data/DefaultEntityFactories.kt @@ -190,7 +190,7 @@ object DefaultEntityFactories { val tweakedFactory = ENTITY_FACTORY_MAP[tweakedResourceLocation] ?: throw UnknownEntityException("Can not find tweaked entity type: $tweakedResourceLocation for $factory") - val tweakedEntityType = connection.mapping.entityRegistry[tweakedResourceLocation] ?: throw UnknownEntityException("Can not find tweaked entity type data in ${connection.version}: $tweakedResourceLocation for $factory") + val tweakedEntityType = connection.mapping.entityTypeRegistry[tweakedResourceLocation] ?: throw UnknownEntityException("Can not find tweaked entity type data in ${connection.version}: $tweakedResourceLocation for $factory") return tweakedFactory.build(connection, tweakedEntityType, position, rotation) } diff --git a/src/main/java/de/bixilon/minosoft/data/Tag.kt b/src/main/java/de/bixilon/minosoft/data/Tag.kt index 1ae3c8ed4..bb0eca4ed 100644 --- a/src/main/java/de/bixilon/minosoft/data/Tag.kt +++ b/src/main/java/de/bixilon/minosoft/data/Tag.kt @@ -14,7 +14,7 @@ package de.bixilon.minosoft.data import de.bixilon.minosoft.data.mappings.ResourceLocation -data class Tag( +data class Tag( val resourceLocation: ResourceLocation, - val ids: IntArray, + val ids: Set, ) diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/registry/Registry.kt b/src/main/java/de/bixilon/minosoft/data/mappings/registry/Registry.kt index 62584ed90..a8c44daff 100644 --- a/src/main/java/de/bixilon/minosoft/data/mappings/registry/Registry.kt +++ b/src/main/java/de/bixilon/minosoft/data/mappings/registry/Registry.kt @@ -37,7 +37,7 @@ open class Registry( } open operator fun get(id: Int): T { - return idValueMap[id] ?: parentRegistry?.get(id)!! + return idValueMap[id] ?: parentRegistry?.get(id) ?: throw NullPointerException("Can not find item with id $id") } open fun getId(value: T): Int { diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/versions/VersionMapping.kt b/src/main/java/de/bixilon/minosoft/data/mappings/versions/VersionMapping.kt index 532a92489..c40135e65 100644 --- a/src/main/java/de/bixilon/minosoft/data/mappings/versions/VersionMapping.kt +++ b/src/main/java/de/bixilon/minosoft/data/mappings/versions/VersionMapping.kt @@ -91,7 +91,7 @@ class VersionMapping { val blockStateIdMap: MutableMap = mutableMapOf() val entityMetaIndexMap: MutableMap = mutableMapOf() - val entityRegistry: Registry = Registry() + val entityTypeRegistry: Registry = Registry() val blockEntityTypeRegistry = BlockEntityTypeRegistry() val blockEntityMetaDataTypeRegistry: Registry = Registry() @@ -190,7 +190,7 @@ class VersionMapping { villagerProfessionRegistry.initialize(pixlyzerData["villager_professions"]?.asJsonObject, this, VillagerProfession) - entityRegistry.initialize(pixlyzerData["entities"]?.asJsonObject, this, EntityType) + entityTypeRegistry.initialize(pixlyzerData["entities"]?.asJsonObject, this, EntityType) blockEntityMetaDataTypeRegistry.initialize(pixlyzerData["block_entity_meta_data_types"]?.asJsonObject, this, BlockEntityMetaType, alternative = DefaultRegistries.BLOCK_ENTITY_META_TYPE_REGISTRY.forVersion(version)) diff --git a/src/main/java/de/bixilon/minosoft/data/player/Player.kt b/src/main/java/de/bixilon/minosoft/data/player/Player.kt index c0f87c0d0..71ffd575c 100644 --- a/src/main/java/de/bixilon/minosoft/data/player/Player.kt +++ b/src/main/java/de/bixilon/minosoft/data/player/Player.kt @@ -30,7 +30,7 @@ class Player( val healthCondition = PlayerHealthCondition() val experienceCondition = PlayerExperienceCondition() var spawnPosition: Vec3i = VecUtil.EMPTY_VEC3I - val entity: PlayerEntity = PlayerEntity(connection, connection.mapping.entityRegistry[PlayerEntity.RESOURCE_LOCATION]!!, VecUtil.EMPTY_VEC3, EntityRotation(0.0, 0.0), account.username) + val entity: PlayerEntity = PlayerEntity(connection, connection.mapping.entityTypeRegistry[PlayerEntity.RESOURCE_LOCATION]!!, VecUtil.EMPTY_VEC3, EntityRotation(0.0, 0.0), account.username) @Deprecated(message = "Will be replaced with some kind of teleport manager, ...") var isSpawnConfirmed = false diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/EntityObjectSpawnS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/EntityObjectSpawnS2CP.kt index 1db09b897..aa178c500 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/EntityObjectSpawnS2CP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/EntityObjectSpawnS2CP.kt @@ -61,9 +61,9 @@ class EntityObjectSpawnS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket() { } entity = if (buffer.versionId < ProtocolVersions.V_19W05A) { val entityResourceLocation = ENTITY_OBJECT_REGISTRY[type].resourceLocation - buffer.connection.mapping.entityRegistry[entityResourceLocation]!!.build(buffer.connection, position, rotation, null, buffer.versionId)!! // ToDo: Entity meta data tweaking + buffer.connection.mapping.entityTypeRegistry[entityResourceLocation]!!.build(buffer.connection, position, rotation, null, buffer.versionId)!! // ToDo: Entity meta data tweaking } else { - buffer.connection.mapping.entityRegistry[type].build(buffer.connection, position, rotation, null, buffer.versionId)!! + buffer.connection.mapping.entityTypeRegistry[type].build(buffer.connection, position, rotation, null, buffer.versionId)!! } } diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/ExperienceOrbSpawnS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/ExperienceOrbSpawnS2CP.kt index 489810819..b227ac1a5 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/ExperienceOrbSpawnS2CP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/ExperienceOrbSpawnS2CP.kt @@ -27,7 +27,7 @@ class ExperienceOrbSpawnS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket() { val entityId: Int = buffer.readEntityId() val entity: ExperienceOrb = ExperienceOrb( connection = buffer.connection, - entityType = buffer.connection.mapping.entityRegistry[ExperienceOrb.RESOURCE_LOCATION]!!, + entityType = buffer.connection.mapping.entityTypeRegistry[ExperienceOrb.RESOURCE_LOCATION]!!, position = if (buffer.versionId < ProtocolVersions.V_16W06A) { Vec3(buffer.readFixedPointNumberInt(), buffer.readFixedPointNumberInt(), buffer.readFixedPointNumberInt()) } else { diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/GlobalEntitySpawnS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/GlobalEntitySpawnS2CP.kt index e2189370e..098ce92fa 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/GlobalEntitySpawnS2CP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/GlobalEntitySpawnS2CP.kt @@ -35,7 +35,7 @@ class GlobalEntitySpawnS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket() { buffer.readPosition() } - entity = LightningBolt(buffer.connection, buffer.connection.mapping.entityRegistry[LightningBolt.RESOURCE_LOCATION]!!, position) + entity = LightningBolt(buffer.connection, buffer.connection.mapping.entityTypeRegistry[LightningBolt.RESOURCE_LOCATION]!!, position) } override fun handle(connection: PlayConnection) { diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/MobSpawnS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/MobSpawnS2CP.kt index 4ba635e29..072e12443 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/MobSpawnS2CP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/MobSpawnS2CP.kt @@ -55,7 +55,7 @@ class MobSpawnS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket() { } else { null } - val entityType = buffer.connection.mapping.entityRegistry[typeId] + val entityType = buffer.connection.mapping.entityTypeRegistry[typeId] entity = entityType.build(buffer.connection, position, rotation, metaData, buffer.versionId)!! entity.velocity = velocity metaData?.let { diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PaintingSpawnS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PaintingSpawnS2CP.kt index 1e127fb72..145788ba8 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PaintingSpawnS2CP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PaintingSpawnS2CP.kt @@ -52,7 +52,7 @@ class PaintingSpawnS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket() { position = buffer.readBlockPosition() direction = byId(buffer.readUnsignedByte()) } - entity = Painting(buffer.connection, buffer.connection.mapping.entityRegistry[Painting.RESOURCE_LOCATION]!!, position, direction, motive!!) + entity = Painting(buffer.connection, buffer.connection.mapping.entityTypeRegistry[Painting.RESOURCE_LOCATION]!!, position, direction, motive!!) } override fun handle(connection: PlayConnection) { diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PlayerEntitySpawnS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PlayerEntitySpawnS2CP.kt index 3e1edffc7..5ce5ba72a 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PlayerEntitySpawnS2CP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PlayerEntitySpawnS2CP.kt @@ -68,7 +68,7 @@ class PlayerEntitySpawnS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket() { } entity = PlayerEntity( connection = buffer.connection, - entityType = buffer.connection.mapping.entityRegistry[PlayerEntity.RESOURCE_LOCATION]!!, + entityType = buffer.connection.mapping.entityTypeRegistry[PlayerEntity.RESOURCE_LOCATION]!!, position = position, rotation = EntityRotation(yaw.toFloat(), pitch.toFloat(), 0.0f), name = name, diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/TagsS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/TagsS2CP.kt index 2f659762c..330d37e27 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/TagsS2CP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/TagsS2CP.kt @@ -23,23 +23,29 @@ import de.bixilon.minosoft.util.logging.LogLevels import de.bixilon.minosoft.util.logging.LogMessageType class TagsS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket() { - val tags: Map> + val tags: Map>> init { - val tags: MutableMap> = mutableMapOf() + val tags: MutableMap>> = mutableMapOf() if (buffer.versionId < ProtocolVersions.V_20W51A) { - tags[BLOCK_TAG_RESOURCE_LOCATION] = buffer.readTagArray().toList() - tags[ITEM_TAG_RESOURCE_LOCATION] = buffer.readTagArray().toList() - tags[FLUID_TAG_RESOURCE_LOCATION] = buffer.readTagArray().toList() // ToDo: when was this added? Was not available in 18w01 + tags[BLOCK_TAG_RESOURCE_LOCATION] = buffer.readTagArray { buffer.connection.mapping.getBlockState(it)!! } + tags[ITEM_TAG_RESOURCE_LOCATION] = buffer.readTagArray { buffer.connection.mapping.itemRegistry[it] } + tags[FLUID_TAG_RESOURCE_LOCATION] = buffer.readTagArray { buffer.connection.mapping.fluidRegistry[it] } // ToDo: when was this added? Was not available in 18w01 if (buffer.versionId >= ProtocolVersions.V_18W43A) { - tags[ENTITY_TYPE_TAG_RESOURCE_LOCATION] = buffer.readTagArray().toList() + tags[ENTITY_TYPE_TAG_RESOURCE_LOCATION] = buffer.readTagArray { buffer.connection.mapping.entityTypeRegistry[it] } } if (buffer.versionId >= ProtocolVersions.V_20W49A) { - tags[GAME_EVENT_TAG_RESOURCE_LOCATION] = buffer.readTagArray().toList() + tags[GAME_EVENT_TAG_RESOURCE_LOCATION] = buffer.readTagArray { it } } } else { for (i in 0 until buffer.readVarInt()) { - tags[buffer.readResourceLocation()] = buffer.readTagArray().toList() + when (buffer.readResourceLocation()) { + BLOCK_TAG_RESOURCE_LOCATION -> buffer.readTagArray { buffer.connection.mapping.blockRegistry[it] } + ITEM_TAG_RESOURCE_LOCATION -> buffer.readTagArray { buffer.connection.mapping.itemRegistry[it] } + FLUID_TAG_RESOURCE_LOCATION -> buffer.readTagArray { buffer.connection.mapping.fluidRegistry[it] } + ENTITY_TYPE_TAG_RESOURCE_LOCATION -> buffer.readTagArray { buffer.connection.mapping.entityTypeRegistry[it] } + GAME_EVENT_TAG_RESOURCE_LOCATION -> buffer.readTagArray { it } + } } } this.tags = tags.toMap() diff --git a/src/main/java/de/bixilon/minosoft/protocol/protocol/InByteBuffer.kt b/src/main/java/de/bixilon/minosoft/protocol/protocol/InByteBuffer.kt index c0f66c45d..5b200b693 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/protocol/InByteBuffer.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/InByteBuffer.kt @@ -409,12 +409,18 @@ open class InByteBuffer { return String(Base64.getEncoder().encode(readRest())) } - fun readTag(): Tag { - return Tag(readResourceLocation(), readVarIntArray()) + fun readTag(idResolver: (Int) -> T): Tag { + val resourceLocation = readResourceLocation() + val ids = readVarIntArray() + val items: MutableSet = mutableSetOf() + for (id in ids) { + items += idResolver(id) + } + return Tag(resourceLocation, items.toSet()) } - fun readTagArray(length: Int = readVarInt()): Array { - return readArray(length) { readTag() } + fun readTagArray(length: Int = readVarInt(), idResolver: (Int) -> T): List> { + return (readArray(length) { readTag(idResolver) }).toList() } fun readOptional(reader: () -> T): T? {