diff --git a/src/main/java/de/bixilon/minosoft/data/registries/registries/Registries.kt b/src/main/java/de/bixilon/minosoft/data/registries/registries/Registries.kt index d679c80e6..d92865c3c 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/registries/Registries.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/registries/Registries.kt @@ -73,7 +73,7 @@ class Registries { val enchantmentRegistry: Registry = register("enchantment", Registry(codec = Enchantment)) val particleTypeRegistry: Registry = register("particle_type", Registry(codec = ParticleType)) val statusEffectRegistry: Registry = register("mob_effect", Registry(codec = StatusEffect)) - val statisticRegistry: Registry = register("custom_stat", Registry()) + val statisticRegistry: Registry = register("custom_stat", Registry(codec = Statistic)) val biomeRegistry: Registry = register("biome", Registry(codec = Biome)) val dimensionRegistry: Registry = register("dimension_type", Registry(codec = Dimension)) val materialRegistry: Registry = register("material", Registry(codec = Material)) @@ -196,6 +196,8 @@ class Registries { worker += Task(this::catVariants) { catVariants.rawUpdate(pixlyzerData["variant/cat"]?.toJsonObject(), this) } worker += Task(this::frogVariants) { frogVariants.rawUpdate(pixlyzerData["variant/frog"]?.toJsonObject(), this) } + worker += Task(this::statisticRegistry) { statisticRegistry.rawUpdate(pixlyzerData["statistics"]?.toJsonObject(), this) } + val inner = CountUpAndDownLatch(1, latch) worker.work(inner) inner.dec() diff --git a/src/main/java/de/bixilon/minosoft/data/registries/statistics/SubStatistic.kt b/src/main/java/de/bixilon/minosoft/data/registries/statistics/CustomStatistic.kt similarity index 76% rename from src/main/java/de/bixilon/minosoft/data/registries/statistics/SubStatistic.kt rename to src/main/java/de/bixilon/minosoft/data/registries/statistics/CustomStatistic.kt index 53391697c..73237dfeb 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/statistics/SubStatistic.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/statistics/CustomStatistic.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2021 Moritz Zwerger + * Copyright (C) 2020-2022 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. * @@ -15,6 +15,9 @@ package de.bixilon.minosoft.data.registries.statistics import de.bixilon.minosoft.data.registries.ResourceLocation -data class SubStatistic( - val resourceLocation: ResourceLocation, -) +class CustomStatistic( + resourceLocation: ResourceLocation, + translationKey: ResourceLocation?, + unit: StatisticUnits, + val custom: Set, +) : Statistic(resourceLocation, translationKey, unit) diff --git a/src/main/java/de/bixilon/minosoft/data/registries/statistics/Statistic.kt b/src/main/java/de/bixilon/minosoft/data/registries/statistics/Statistic.kt index 3eb460008..d84d56949 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/statistics/Statistic.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/statistics/Statistic.kt @@ -12,18 +12,47 @@ */ package de.bixilon.minosoft.data.registries.statistics +import de.bixilon.kutil.cast.CastUtil.unsafeCast import de.bixilon.minosoft.data.language.Translatable import de.bixilon.minosoft.data.registries.ResourceLocation +import de.bixilon.minosoft.data.registries.registries.Registries import de.bixilon.minosoft.data.registries.registries.registry.RegistryItem +import de.bixilon.minosoft.data.registries.registries.registry.codec.ResourceLocationCodec +import de.bixilon.minosoft.util.KUtil.toResourceLocation -data class Statistic( +open class Statistic( override val resourceLocation: ResourceLocation, override val translationKey: ResourceLocation?, val unit: StatisticUnits, - @Deprecated("TODO") val subStatistics: Map, ) : RegistryItem(), Translatable { override fun toString(): String { return resourceLocation.full } + + companion object : ResourceLocationCodec { + override fun deserialize(registries: Registries?, resourceLocation: ResourceLocation, data: Map): Statistic { + val translationKey = data["translation_id"]?.toResourceLocation() + val unit = StatisticUnits[data["unit"]!!]!! + + data["sub_statistics"]?.unsafeCast>()?.let { + val custom: MutableSet = mutableSetOf() + for (value in it) { + custom += value.toResourceLocation() + } + return CustomStatistic( + resourceLocation = resourceLocation, + translationKey = translationKey, + unit = unit, + custom = custom, + ) + } + + return Statistic( + resourceLocation = resourceLocation, + translationKey = translationKey, + unit = unit, + ) + } + } } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/statistics/StatisticUnits.kt b/src/main/java/de/bixilon/minosoft/data/registries/statistics/StatisticUnits.kt index bcb4732d1..cfea5fe5e 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/statistics/StatisticUnits.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/statistics/StatisticUnits.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2021 Moritz Zwerger + * Copyright (C) 2020-2022 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. * @@ -13,9 +13,18 @@ package de.bixilon.minosoft.data.registries.statistics +import de.bixilon.kutil.enums.EnumUtil +import de.bixilon.kutil.enums.ValuesEnum + enum class StatisticUnits { BLOCK, ITEM, ENTITY_TYPE, CUSTOM, + ; + + companion object : ValuesEnum { + override val VALUES: Array = values() + override val NAME_MAP: Map = EnumUtil.getEnumValues(VALUES) + } } diff --git a/src/main/java/de/bixilon/minosoft/modding/event/events/CollectItemAnimationEvent.kt b/src/main/java/de/bixilon/minosoft/modding/event/events/CollectItemAnimationEvent.kt index 1db871189..88a1c2cd5 100644 --- a/src/main/java/de/bixilon/minosoft/modding/event/events/CollectItemAnimationEvent.kt +++ b/src/main/java/de/bixilon/minosoft/modding/event/events/CollectItemAnimationEvent.kt @@ -14,7 +14,6 @@ package de.bixilon.minosoft.modding.event.events import de.bixilon.kutil.cast.CastUtil.unsafeCast import de.bixilon.minosoft.data.entities.entities.Entity -import de.bixilon.minosoft.data.entities.entities.LivingEntity import de.bixilon.minosoft.modding.event.EventInitiators import de.bixilon.minosoft.modding.event.events.connection.play.PlayConnectionEvent import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection @@ -24,9 +23,9 @@ class CollectItemAnimationEvent( connection: PlayConnection, initiator: EventInitiators, val collectedEntity: Entity, - val collector: LivingEntity, + val collector: Entity, val count: Int, ) : PlayConnectionEvent(connection, initiator), CancelableEvent { - constructor(connection: PlayConnection, packet: EntityCollectS2CP) : this(connection, EventInitiators.SERVER, connection.world.entities[packet.itemEntityId].unsafeCast(), connection.world.entities[packet.collectorEntityId].unsafeCast(), packet.count) + constructor(connection: PlayConnection, packet: EntityCollectS2CP) : this(connection, EventInitiators.SERVER, connection.world.entities[packet.itemEntityId].unsafeCast(), connection.world.entities[packet.collectorEntityId].unsafeCast(), packet.count) } diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/block/BlockDataS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/block/BlockDataS2CP.kt index adb707467..a398de930 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/block/BlockDataS2CP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/block/BlockDataS2CP.kt @@ -35,7 +35,7 @@ class BlockDataS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket { val type = if (buffer.versionId >= V_21W37A) { buffer.connection.registries.blockEntityTypeRegistry[buffer.readVarInt()].resourceLocation } else { - buffer.connection.registries.blockDataTypeRegistry[buffer.readUnsignedByte()].resourceLocation + buffer.connection.registries.blockDataTypeRegistry.getOrNull(buffer.readUnsignedByte())?.resourceLocation } val nbt = buffer.readNBT().toJsonObject()