From d6713951e9cc3cc5431b7fac622f7b3d24f9fc31 Mon Sep 17 00:00:00 2001 From: Bixilon Date: Sat, 16 Apr 2022 00:32:13 +0200 Subject: [PATCH] improve registries, block break particles, world events --- .../data/registries/DefaultRegistries.kt | 16 +++-- .../blocks/entites/BlockEntityTypeRegistry.kt | 3 +- .../data/registries/items/ItemRegistry.kt | 5 +- .../registries/other/game/event/GameEvent.kt | 35 ---------- .../world/event/DefaultWorldEventHandlers.kt | 21 ++++++ .../other/world/event/WorldEventHandler.kt | 23 +++++++ .../event/handlers/BlockDestroyedHandler.kt | 66 +++++++++++++++++++ .../data/registries/registries/Registries.kt | 7 +- .../registries/registry/AbstractRegistry.kt | 11 +++- .../registries/registry/BlockStateRegistry.kt | 8 ++- .../registry/PerVersionEnumRegistry.kt | 6 +- .../registries/registry/PerVersionRegistry.kt | 18 ++--- .../registries/registry/Registry.kt | 12 ++-- .../registry/ResourceLocationRegistry.kt | 6 ++ .../interaction/BreakInteractionHandler.kt | 5 +- .../gui/rendering/util/vec/vec3/Vec3dUtil.kt | 14 ++++ .../gui/rendering/util/vec/vec3/Vec3iUtil.kt | 6 +- .../event/events/GameEventChangeEvent.kt | 6 +- .../packets/s2c/play/GameEventS2CP.kt | 8 ++- .../packets/s2c/play/WorldEventS2CP.kt | 12 +++- .../minosoft/recipes/RecipeRegistry.kt | 7 ++ .../minosoft/mapping/default_registries.json | 7 ++ 22 files changed, 223 insertions(+), 79 deletions(-) delete mode 100644 src/main/java/de/bixilon/minosoft/data/registries/other/game/event/GameEvent.kt create mode 100644 src/main/java/de/bixilon/minosoft/data/registries/other/world/event/DefaultWorldEventHandlers.kt create mode 100644 src/main/java/de/bixilon/minosoft/data/registries/other/world/event/WorldEventHandler.kt create mode 100644 src/main/java/de/bixilon/minosoft/data/registries/other/world/event/handlers/BlockDestroyedHandler.kt diff --git a/src/main/java/de/bixilon/minosoft/data/registries/DefaultRegistries.kt b/src/main/java/de/bixilon/minosoft/data/registries/DefaultRegistries.kt index 8ba6fd433..0fa8da5a5 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/DefaultRegistries.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/DefaultRegistries.kt @@ -21,10 +21,10 @@ import de.bixilon.minosoft.data.entities.EntityObjectType import de.bixilon.minosoft.data.entities.block.BlockEntityMetaType import de.bixilon.minosoft.data.entities.meta.EntityData import de.bixilon.minosoft.data.registries.other.containers.ContainerType -import de.bixilon.minosoft.data.registries.other.game.event.GameEvent import de.bixilon.minosoft.data.registries.registries.registry.PerVersionEnumRegistry import de.bixilon.minosoft.data.registries.registries.registry.PerVersionRegistry import de.bixilon.minosoft.data.registries.registries.registry.Registry +import de.bixilon.minosoft.data.registries.registries.registry.ResourceLocationRegistry import de.bixilon.minosoft.protocol.packets.c2s.play.entity.EntityActionC2SP import de.bixilon.minosoft.protocol.packets.s2c.play.entity.EntityAnimationS2CP import de.bixilon.minosoft.protocol.packets.s2c.play.title.TitleS2CF @@ -49,12 +49,14 @@ object DefaultRegistries { val ENTITY_OBJECT_REGISTRY: Registry = Registry() - val BLOCK_ENTITY_META_TYPE_REGISTRY: PerVersionRegistry = PerVersionRegistry() + val BLOCK_ENTITY_META_TYPE_REGISTRY: PerVersionRegistry> = PerVersionRegistry { Registry() } - val DEFAULT_PLUGIN_CHANNELS_REGISTRY: PerVersionRegistry = PerVersionRegistry() + val DEFAULT_PLUGIN_CHANNELS_REGISTRY: PerVersionRegistry> = PerVersionRegistry { Registry() } - val CONTAINER_TYPE_REGISTRY: PerVersionRegistry = PerVersionRegistry() - val GAME_EVENT_REGISTRY: PerVersionRegistry = PerVersionRegistry() + val CONTAINER_TYPE_REGISTRY: PerVersionRegistry> = PerVersionRegistry { Registry() } + + val GAME_EVENT_REGISTRY: PerVersionRegistry = PerVersionRegistry { ResourceLocationRegistry() } + val WORLD_EVENT_REGISTRY: PerVersionRegistry = PerVersionRegistry { ResourceLocationRegistry() } fun load() { @@ -84,7 +86,9 @@ object DefaultRegistries { BLOCK_ENTITY_META_TYPE_REGISTRY.initialize(registriesJson[ResourceLocation("block_entity_meta_data_types")].asJsonObject(), BlockEntityMetaType) CONTAINER_TYPE_REGISTRY.initialize(registriesJson[ResourceLocation("container_types")].asJsonObject(), ContainerType) - GAME_EVENT_REGISTRY.initialize(registriesJson[ResourceLocation("game_events")].asJsonObject(), GameEvent) + + GAME_EVENT_REGISTRY.initialize(registriesJson[ResourceLocation("game_events")].asJsonObject(), null) + WORLD_EVENT_REGISTRY.initialize(registriesJson[ResourceLocation("world_events")].asJsonObject(), null) initialized = true } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/entites/BlockEntityTypeRegistry.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/entites/BlockEntityTypeRegistry.kt index 66265b542..412f29dd2 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/entites/BlockEntityTypeRegistry.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/entites/BlockEntityTypeRegistry.kt @@ -16,6 +16,7 @@ package de.bixilon.minosoft.data.registries.blocks.entites import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.data.registries.blocks.types.Block import de.bixilon.minosoft.data.registries.registries.Registries +import de.bixilon.minosoft.data.registries.registries.registry.AbstractRegistry import de.bixilon.minosoft.data.registries.registries.registry.Registry import de.bixilon.minosoft.data.registries.registries.registry.ResourceLocationDeserializer @@ -29,7 +30,7 @@ class BlockEntityTypeRegistry( return blockTypeMap[block] ?: parentRegistry?.get(block) } - override fun initialize(data: Map?, registries: Registries?, deserializer: ResourceLocationDeserializer>, flattened: Boolean, metaType: MetaTypes, alternative: Registry>?): Registry> { + override fun initialize(data: Map?, registries: Registries?, deserializer: ResourceLocationDeserializer>?, flattened: Boolean, metaType: MetaTypes, alternative: AbstractRegistry>?): Registry> { super.initialize(data, registries, deserializer, flattened, metaType, alternative) for ((_, type) in resourceLocationMap) { diff --git a/src/main/java/de/bixilon/minosoft/data/registries/items/ItemRegistry.kt b/src/main/java/de/bixilon/minosoft/data/registries/items/ItemRegistry.kt index 8a0f90bfc..2d063da70 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/items/ItemRegistry.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/items/ItemRegistry.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,7 @@ package de.bixilon.minosoft.data.registries.items import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.data.registries.registries.Registries +import de.bixilon.minosoft.data.registries.registries.registry.AbstractRegistry import de.bixilon.minosoft.data.registries.registries.registry.Registry import de.bixilon.minosoft.data.registries.registries.registry.ResourceLocationDeserializer @@ -42,7 +43,7 @@ class ItemRegistry( } } - override fun initialize(data: Map?, registries: Registries?, deserializer: ResourceLocationDeserializer, flattened: Boolean, metaType: MetaTypes, alternative: Registry?): Registry { + override fun initialize(data: Map?, registries: Registries?, deserializer: ResourceLocationDeserializer?, flattened: Boolean, metaType: MetaTypes, alternative: AbstractRegistry?): Registry { this.flattened = flattened return super.initialize(data, registries, deserializer, flattened, metaType, alternative) } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/other/game/event/GameEvent.kt b/src/main/java/de/bixilon/minosoft/data/registries/other/game/event/GameEvent.kt deleted file mode 100644 index c9be324a5..000000000 --- a/src/main/java/de/bixilon/minosoft/data/registries/other/game/event/GameEvent.kt +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Minosoft - * Copyright (C) 2021 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.registries.other.game.event - -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.ResourceLocationDeserializer - -data class GameEvent( - override val resourceLocation: ResourceLocation, -) : RegistryItem() { - - override fun toString(): String { - return resourceLocation.toString() - } - - companion object : ResourceLocationDeserializer { - override fun deserialize(registries: Registries?, resourceLocation: ResourceLocation, data: Map): GameEvent { - return GameEvent( - resourceLocation = resourceLocation, - ) - } - } -} diff --git a/src/main/java/de/bixilon/minosoft/data/registries/other/world/event/DefaultWorldEventHandlers.kt b/src/main/java/de/bixilon/minosoft/data/registries/other/world/event/DefaultWorldEventHandlers.kt new file mode 100644 index 000000000..2f9f7bfbc --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/data/registries/other/world/event/DefaultWorldEventHandlers.kt @@ -0,0 +1,21 @@ +/* + * Minosoft + * 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. + * + * 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.registries.other.world.event + +import de.bixilon.minosoft.data.registries.factory.DefaultFactory +import de.bixilon.minosoft.data.registries.other.world.event.handlers.BlockDestroyedHandler + +object DefaultWorldEventHandlers : DefaultFactory( + BlockDestroyedHandler, +) diff --git a/src/main/java/de/bixilon/minosoft/data/registries/other/world/event/WorldEventHandler.kt b/src/main/java/de/bixilon/minosoft/data/registries/other/world/event/WorldEventHandler.kt new file mode 100644 index 000000000..8f067753d --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/data/registries/other/world/event/WorldEventHandler.kt @@ -0,0 +1,23 @@ +/* + * Minosoft + * 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. + * + * 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.registries.other.world.event + +import de.bixilon.minosoft.data.registries.CompanionResourceLocation +import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection +import glm_.vec3.Vec3i + +interface WorldEventHandler : CompanionResourceLocation { + + fun handle(connection: PlayConnection, position: Vec3i, data: Int, isGlobal: Boolean) +} diff --git a/src/main/java/de/bixilon/minosoft/data/registries/other/world/event/handlers/BlockDestroyedHandler.kt b/src/main/java/de/bixilon/minosoft/data/registries/other/world/event/handlers/BlockDestroyedHandler.kt new file mode 100644 index 000000000..c46f22e62 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/data/registries/other/world/event/handlers/BlockDestroyedHandler.kt @@ -0,0 +1,66 @@ +/* + * Minosoft + * 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. + * + * 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.registries.other.world.event.handlers + +import de.bixilon.minosoft.data.registries.ResourceLocation +import de.bixilon.minosoft.data.registries.blocks.BlockState +import de.bixilon.minosoft.data.registries.other.world.event.WorldEventHandler +import de.bixilon.minosoft.data.registries.particle.data.BlockParticleData +import de.bixilon.minosoft.gui.rendering.particle.types.render.texture.advanced.block.BlockDustParticle +import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3dUtil.ceil +import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3dUtil.min +import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3iUtil.max +import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection +import de.bixilon.minosoft.util.KUtil.toResourceLocation +import glm_.vec3.Vec3d +import glm_.vec3.Vec3i + +object BlockDestroyedHandler : WorldEventHandler { + override val RESOURCE_LOCATION: ResourceLocation = "minecraft:block_destroyed".toResourceLocation() + + override fun handle(connection: PlayConnection, position: Vec3i, data: Int, isGlobal: Boolean) { + val state = connection.registries.blockStateRegistry[data] ?: return + handleDestroy(connection, position, state) + } + + fun handleDestroy(connection: PlayConnection, position: Vec3i, state: BlockState) { + state.breakSoundEvent?.let { + connection.world.playSoundEvent(it, position, volume = state.soundEventVolume, pitch = state.soundEventPitch) + } + + addBlockBreakParticles(connection, position, state) + } + + private fun addBlockBreakParticles(connection: PlayConnection, position: Vec3i, state: BlockState) { + val particleRenderer = connection.world.particleRenderer ?: return + val type = connection.registries.particleTypeRegistry[BlockDustParticle] ?: return + val shape = state.outlineShape + val particleData = BlockParticleData(state, type) + + for (aabb in shape) { + val delta = (aabb.max - aabb.min).min(1.0) + val max = (delta * 4.0).ceil().max(2) + + for (x in 0 until max.x) { + for (y in 0 until max.y) { + for (z in 0 until max.z) { + val center = (Vec3d(x, y, z) + 0.5) / max + val particlePosition = center * delta + aabb.min + particleRenderer.add(BlockDustParticle(connection, particlePosition + position, particlePosition - 0.5, particleData)) + } + } + } + } + } +} 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 d4c7955ca..c9f3fcd36 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 @@ -37,7 +37,6 @@ import de.bixilon.minosoft.data.registries.items.Item import de.bixilon.minosoft.data.registries.items.ItemRegistry import de.bixilon.minosoft.data.registries.materials.Material import de.bixilon.minosoft.data.registries.other.containers.ContainerType -import de.bixilon.minosoft.data.registries.other.game.event.GameEvent import de.bixilon.minosoft.data.registries.particle.ParticleType import de.bixilon.minosoft.data.registries.registries.registry.* import de.bixilon.minosoft.data.registries.statistics.Statistic @@ -94,7 +93,8 @@ class Registries { val blockEntityMetaDataTypeRegistry: Registry = Registry() val containerTypeRegistry: Registry = Registry() - val gameEventRegistry: Registry = Registry() + val gameEventRegistry: ResourceLocationRegistry = ResourceLocationRegistry() + val worldEventRegistry: ResourceLocationRegistry = ResourceLocationRegistry() var isFullyLoaded = false private set @@ -148,7 +148,8 @@ class Registries { // id resource location stuff containerTypeRegistry.rawInitialize(pixlyzerData["container_types"]?.toJsonObject(), this, ContainerType, alternative = DefaultRegistries.CONTAINER_TYPE_REGISTRY.forVersion(version)) - gameEventRegistry.rawInitialize(pixlyzerData["game_events"]?.toJsonObject(), this, GameEvent, alternative = DefaultRegistries.GAME_EVENT_REGISTRY.forVersion(version)) + gameEventRegistry.rawInitialize(pixlyzerData["game_events"]?.toJsonObject(), this, null, alternative = DefaultRegistries.GAME_EVENT_REGISTRY.forVersion(version)) + worldEventRegistry.rawInitialize(pixlyzerData["world_events"]?.toJsonObject(), this, null, alternative = DefaultRegistries.WORLD_EVENT_REGISTRY.forVersion(version)) entityTypeRegistry.rawInitialize(pixlyzerData["entities"]?.toJsonObject(), this, EntityType) diff --git a/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/AbstractRegistry.kt b/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/AbstractRegistry.kt index 55bf154af..d6dbc01ca 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/AbstractRegistry.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/AbstractRegistry.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,7 +13,10 @@ package de.bixilon.minosoft.data.registries.registries.registry +import de.bixilon.minosoft.data.registries.ResourceLocation +import de.bixilon.minosoft.data.registries.registries.Registries import de.bixilon.minosoft.util.collections.Clearable +import de.bixilon.minosoft.util.json.ResourceLocationJsonMap.toResourceLocationMap interface AbstractRegistry : Iterable, Clearable, Parentable> { val size: Int @@ -24,6 +27,12 @@ interface AbstractRegistry : Iterable, Clearable, Parentable?, registries: Registries?, deserializer: ResourceLocationDeserializer?, flattened: Boolean = true, metaType: Registry.MetaTypes = Registry.MetaTypes.NONE, alternative: AbstractRegistry? = null): AbstractRegistry { + return initialize(data?.toResourceLocationMap(), registries, deserializer, flattened, metaType, alternative) + } + + fun initialize(data: Map?, registries: Registries?, deserializer: ResourceLocationDeserializer?, flattened: Boolean = true, metaType: Registry.MetaTypes = Registry.MetaTypes.NONE, alternative: AbstractRegistry? = null): AbstractRegistry + fun noParentIterator(): Iterator override fun iterator(): Iterator { diff --git a/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/BlockStateRegistry.kt b/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/BlockStateRegistry.kt index 5ec70deb9..8bbd62167 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/BlockStateRegistry.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/BlockStateRegistry.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,7 +13,9 @@ package de.bixilon.minosoft.data.registries.registries.registry +import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.data.registries.blocks.BlockState +import de.bixilon.minosoft.data.registries.registries.Registries import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap @@ -66,6 +68,10 @@ class BlockStateRegistry(var flattened: Boolean) : AbstractRegistry return forceGet(id) } + override fun initialize(data: Map?, registries: Registries?, deserializer: ResourceLocationDeserializer?, flattened: Boolean, metaType: Registry.MetaTypes, alternative: AbstractRegistry?): AbstractRegistry { + TODO("Not yet implemented") + } + override fun getId(value: BlockState?): Int { TODO("Not yet implemented") } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/PerVersionEnumRegistry.kt b/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/PerVersionEnumRegistry.kt index 6095d7553..da3405971 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/PerVersionEnumRegistry.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/PerVersionEnumRegistry.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. * @@ -24,7 +24,7 @@ class PerVersionEnumRegistry>( fun forVersion(version: Version): EnumRegistry? { - // must loop from highest version to lowest! + // must loop from the highest version to lowest! for ((versionId, registry) in versions) { if (version.versionId < versionId) { continue @@ -40,7 +40,7 @@ class PerVersionEnumRegistry>( val versions: SortedMap> = sortedMapOf({ t, t2 -> t2 - t }) for ((versionId, json) in data) { - versions[Integer.parseInt(versionId)] = EnumRegistry(values = values, mutable = false).initialize(json) + versions[versionId.toInt()] = EnumRegistry(values = values, mutable = false).initialize(json) } this.versions = versions.toMap() } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/PerVersionRegistry.kt b/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/PerVersionRegistry.kt index 79a6ea192..09c02fab6 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/PerVersionRegistry.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/PerVersionRegistry.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. * @@ -17,11 +17,11 @@ import de.bixilon.kutil.json.JsonUtil.toJsonObject import de.bixilon.minosoft.data.registries.versions.Version import java.util.* -class PerVersionRegistry { - private lateinit var versions: Map> +class PerVersionRegistry>(private val registryCreator: () -> R) { + private lateinit var versions: Map - fun forVersion(version: Version): Registry { - // must loop from highest version to lowest! + fun forVersion(version: Version): R { + // must loop from the highest version to lowest! for ((versionId, registry) in versions) { if (version.versionId < versionId) { continue @@ -31,12 +31,14 @@ class PerVersionRegistry { throw IllegalArgumentException("Can not find a registry for version $version") } - fun initialize(data: Map, deserializer: ResourceLocationDeserializer) { + fun initialize(data: Map, deserializer: ResourceLocationDeserializer?) { check(!this::versions.isInitialized) { "Already initialized!" } - val versions: SortedMap> = sortedMapOf({ t, t2 -> t2 - t }) + val versions: SortedMap = sortedMapOf({ t, t2 -> t2 - t }) for ((versionId, json) in data) { - versions[Integer.parseInt(versionId)] = Registry().rawInitialize(json.toJsonObject(), null, deserializer) + val registry = registryCreator() + registry.rawInitialize(json.toJsonObject(), null, deserializer) + versions[Integer.parseInt(versionId)] = registry } this.versions = versions.toMap() } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/Registry.kt b/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/Registry.kt index a3d4e9350..7cf2aa02b 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/Registry.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/Registry.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. * @@ -22,7 +22,6 @@ import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.data.registries.ResourceLocationAble import de.bixilon.minosoft.data.registries.registries.Registries import de.bixilon.minosoft.util.KUtil.toResourceLocation -import de.bixilon.minosoft.util.json.ResourceLocationJsonMap.toResourceLocationMap import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap @@ -110,8 +109,11 @@ open class Registry( return valueIdMap[value] ?: parent?.getId(value)!! } - open fun initialize(data: Map?, registries: Registries?, deserializer: ResourceLocationDeserializer, flattened: Boolean = true, metaType: MetaTypes = MetaTypes.NONE, alternative: Registry? = null): Registry { + override fun initialize(data: Map?, registries: Registries?, deserializer: ResourceLocationDeserializer?, flattened: Boolean, metaType: MetaTypes, alternative: AbstractRegistry?): Registry { check(!initialized) { "Already initialized" } + if (deserializer == null) { + throw NullPointerException("Deserializer can not be null!") + } if (data == null) { if (alternative != null) { @@ -152,10 +154,6 @@ open class Registry( return this } - open fun rawInitialize(data: Map?, registries: Registries?, deserializer: ResourceLocationDeserializer, flattened: Boolean = true, metaType: MetaTypes = MetaTypes.NONE, alternative: Registry? = null): Registry { - return initialize(data?.toResourceLocationMap(), registries, deserializer, flattened, metaType, alternative) - } - open fun postInit(registries: Registries) { for ((_, value) in resourceLocationMap) { value.inject(registries) diff --git a/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/ResourceLocationRegistry.kt b/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/ResourceLocationRegistry.kt index 240aab3f2..1279b1116 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/ResourceLocationRegistry.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/ResourceLocationRegistry.kt @@ -13,8 +13,10 @@ package de.bixilon.minosoft.data.registries.registries.registry +import de.bixilon.kutil.cast.CastUtil.unsafeCast import de.bixilon.kutil.primitive.IntUtil.toInt import de.bixilon.minosoft.data.registries.ResourceLocation +import de.bixilon.minosoft.data.registries.registries.Registries import de.bixilon.minosoft.util.json.ResourceLocationJsonMap.toResourceLocationMap import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap @@ -54,6 +56,10 @@ class ResourceLocationRegistry( return valueIdMap[value] ?: parent?.getId(value) ?: -1 } + override fun initialize(data: Map?, registries: Registries?, deserializer: ResourceLocationDeserializer?, flattened: Boolean, metaType: Registry.MetaTypes, alternative: AbstractRegistry?): AbstractRegistry { + return initialize(data, alternative.unsafeCast()) + } + fun initialize(data: Map?, alternative: ResourceLocationRegistry? = null): ResourceLocationRegistry { check(!initialized) { "Already initialized" } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/input/interaction/BreakInteractionHandler.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/input/interaction/BreakInteractionHandler.kt index 48bf4159c..ff15ec07e 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/input/interaction/BreakInteractionHandler.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/input/interaction/BreakInteractionHandler.kt @@ -25,6 +25,7 @@ import de.bixilon.minosoft.data.registries.effects.DefaultStatusEffects import de.bixilon.minosoft.data.registries.enchantment.DefaultEnchantments import de.bixilon.minosoft.data.registries.fluid.DefaultFluids import de.bixilon.minosoft.data.registries.items.tools.MiningToolItem +import de.bixilon.minosoft.data.registries.other.world.event.handlers.BlockDestroyedHandler import de.bixilon.minosoft.gui.rendering.RenderWindow import de.bixilon.minosoft.gui.rendering.camera.target.targets.BlockTarget import de.bixilon.minosoft.modding.event.events.LegacyBlockBreakAckEvent @@ -134,9 +135,7 @@ class BreakInteractionHandler( clearDigging() connection.world[target.blockPosition] = null - target.blockState.breakSoundEvent?.let { - connection.world.playSoundEvent(it, target.blockPosition, volume = target.blockState.soundEventVolume, pitch = target.blockState.soundEventPitch) - } + BlockDestroyedHandler.handleDestroy(connection, target.blockPosition, target.blockState) } val canStartBreaking = currentTime - breakSent >= ProtocolDefinition.TICK_TIME diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/util/vec/vec3/Vec3dUtil.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/util/vec/vec3/Vec3dUtil.kt index 6b2599354..3aa3f9744 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/util/vec/vec3/Vec3dUtil.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/util/vec/vec3/Vec3dUtil.kt @@ -15,8 +15,10 @@ package de.bixilon.minosoft.gui.rendering.util.vec.vec3 import de.bixilon.kutil.math.interpolation.DoubleInterpolation.interpolateLinear import de.bixilon.kutil.math.interpolation.DoubleInterpolation.interpolateSine +import de.bixilon.kutil.math.simple.DoubleMath.ceil import glm_.vec3.Vec3 import glm_.vec3.Vec3d +import glm_.vec3.Vec3i object Vec3dUtil { @@ -58,4 +60,16 @@ object Vec3dUtil { } return Vec3d(interpolateSine(delta, start.x, end.x), interpolateSine(delta, start.y, end.y), interpolateSine(delta, start.z, end.z)) } + + fun Vec3d.min(value: Double): Vec3d { + return Vec3d(minOf(value, x), minOf(value, y), minOf(value, z)) + } + + fun Vec3d.max(value: Double): Vec3d { + return Vec3d(maxOf(value, x), maxOf(value, y), maxOf(value, z)) + } + + fun Vec3d.ceil(): Vec3i { + return Vec3i(x.ceil, y.ceil, z.ceil) + } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/util/vec/vec3/Vec3iUtil.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/util/vec/vec3/Vec3iUtil.kt index 60385bc85..1fa452cbf 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/util/vec/vec3/Vec3iUtil.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/util/vec/vec3/Vec3iUtil.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. * @@ -46,4 +46,8 @@ object Vec3iUtil { else -> null } } + + fun Vec3i.max(value: Int): Vec3i { + return Vec3i(maxOf(value, x), maxOf(value, y), maxOf(value, z)) + } } diff --git a/src/main/java/de/bixilon/minosoft/modding/event/events/GameEventChangeEvent.kt b/src/main/java/de/bixilon/minosoft/modding/event/events/GameEventChangeEvent.kt index 82f45a714..368b3ff65 100644 --- a/src/main/java/de/bixilon/minosoft/modding/event/events/GameEventChangeEvent.kt +++ b/src/main/java/de/bixilon/minosoft/modding/event/events/GameEventChangeEvent.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2020 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. * @@ -12,7 +12,7 @@ */ package de.bixilon.minosoft.modding.event.events -import de.bixilon.minosoft.data.registries.other.game.event.GameEvent +import de.bixilon.minosoft.data.registries.ResourceLocation 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 @@ -21,7 +21,7 @@ import de.bixilon.minosoft.protocol.packets.s2c.play.GameEventS2CP class GameEventChangeEvent( connection: PlayConnection, initiator: EventInitiators, - val event: GameEvent, + val event: ResourceLocation?, val data: Float, ) : PlayConnectionEvent(connection, initiator) { diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/GameEventS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/GameEventS2CP.kt index c83908fec..176f70098 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/GameEventS2CP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/GameEventS2CP.kt @@ -13,7 +13,6 @@ package de.bixilon.minosoft.protocol.packets.s2c.play import de.bixilon.minosoft.data.registries.other.game.event.DefaultGameEventHandlers -import de.bixilon.minosoft.data.registries.other.game.event.GameEvent import de.bixilon.minosoft.modding.event.events.GameEventChangeEvent import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection import de.bixilon.minosoft.protocol.packets.factory.LoadPacket @@ -25,16 +24,19 @@ import de.bixilon.minosoft.util.logging.LogMessageType @LoadPacket class GameEventS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket { - val event: GameEvent = buffer.connection.registries.gameEventRegistry[buffer.readUnsignedByte()] + val event = buffer.connection.registries.gameEventRegistry[buffer.readUnsignedByte()] val data: Float = buffer.readFloat() override fun handle(connection: PlayConnection) { + if (event == null) { + return + } val event = GameEventChangeEvent(connection, this) if (connection.fireEvent(event)) { return } - DefaultGameEventHandlers[this.event.resourceLocation]?.handle(data, connection) + DefaultGameEventHandlers[this.event]?.handle(data, connection) } override fun log(reducedLog: Boolean) { diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/WorldEventS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/WorldEventS2CP.kt index 45a65e28b..7944c3fe5 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/WorldEventS2CP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/WorldEventS2CP.kt @@ -12,6 +12,8 @@ */ package de.bixilon.minosoft.protocol.packets.s2c.play +import de.bixilon.minosoft.data.registries.other.world.event.DefaultWorldEventHandlers +import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection import de.bixilon.minosoft.protocol.packets.factory.LoadPacket import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer @@ -23,7 +25,8 @@ import glm_.vec3.Vec3i @LoadPacket class WorldEventS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket { - private val eventId: Int = buffer.readInt() + val eventId: Int = buffer.readInt() + val event = buffer.connection.registries.worldEventRegistry[eventId] var position: Vec3i = if (buffer.versionId < ProtocolVersions.V_14W03B) { buffer.readByteBlockPosition() } else { @@ -32,7 +35,12 @@ class WorldEventS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket { val data: Int = buffer.readInt() val isGlobal: Boolean = buffer.readBoolean() + override fun handle(connection: PlayConnection) { + val handler = DefaultWorldEventHandlers[event ?: return] ?: return + handler.handle(connection, position, data, isGlobal) + } + override fun log(reducedLog: Boolean) { - Log.log(LogMessageType.NETWORK_PACKETS_IN, level = LogLevels.VERBOSE) { "World event packet (position=$position, eventId=$eventId, data=$data, isGlobal=$isGlobal)" } + Log.log(LogMessageType.NETWORK_PACKETS_IN, level = LogLevels.VERBOSE) { "World event packet (position=$position, event=${event ?: eventId}, data=$data, isGlobal=$isGlobal)" } } } diff --git a/src/main/java/de/bixilon/minosoft/recipes/RecipeRegistry.kt b/src/main/java/de/bixilon/minosoft/recipes/RecipeRegistry.kt index 384210bd8..896d3cefa 100644 --- a/src/main/java/de/bixilon/minosoft/recipes/RecipeRegistry.kt +++ b/src/main/java/de/bixilon/minosoft/recipes/RecipeRegistry.kt @@ -15,7 +15,10 @@ package de.bixilon.minosoft.recipes import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.data.registries.ResourceLocationAble +import de.bixilon.minosoft.data.registries.registries.Registries import de.bixilon.minosoft.data.registries.registries.registry.AbstractRegistry +import de.bixilon.minosoft.data.registries.registries.registry.Registry +import de.bixilon.minosoft.data.registries.registries.registry.ResourceLocationDeserializer import de.bixilon.minosoft.util.KUtil.toResourceLocation import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap @@ -46,6 +49,10 @@ class RecipeRegistry( return idValueMap[id] ?: parent?.get(id) } + override fun initialize(data: Map?, registries: Registries?, deserializer: ResourceLocationDeserializer?, flattened: Boolean, metaType: Registry.MetaTypes, alternative: AbstractRegistry?): AbstractRegistry { + TODO("Not yet implemented") + } + override fun getId(value: Recipe): Int { return valueIdMap[value] ?: parent?.getId(value) ?: throw IllegalArgumentException("No id available for $value") } diff --git a/src/main/resources/assets/minosoft/mapping/default_registries.json b/src/main/resources/assets/minosoft/mapping/default_registries.json index 2eaf59e8a..d31097d85 100644 --- a/src/main/resources/assets/minosoft/mapping/default_registries.json +++ b/src/main/resources/assets/minosoft/mapping/default_registries.json @@ -587,5 +587,12 @@ "id": 11 } } + }, + "minecraft:world_events": { + "0": { + "minecraft:block_destroyed": { + "id": 2001 + } + } } }