From f62fc6a11e33b69f74b792579c8675a9381762d6 Mon Sep 17 00:00:00 2001 From: Bixilon Date: Sun, 16 May 2021 17:10:31 +0200 Subject: [PATCH] move raycast method, world triggers events now (when using setBlock, etc) --- .../de/bixilon/minosoft/data/world/World.kt | 88 ++++++++----------- .../minosoft/gui/rendering/RenderWindow.kt | 2 +- .../gui/rendering/chunk/WorldRenderer.kt | 6 +- .../{ => rendering}/input/camera/Camera.kt | 41 ++++++++- .../{ => rendering}/input/camera/Frustum.kt | 2 +- .../gui/rendering/input/camera/RaycastHit.kt | 27 ++++++ .../input/key/KeyBindingCallbackPair.kt | 2 +- .../input/key/RenderWindowInputHandler.kt | 4 +- .../modding/events/FrustumChangeEvent.kt | 2 +- .../minosoft/modding/event/EventInitiators.kt | 29 ++++++ .../{BlockChangeEvent.kt => BlockSetEvent.kt} | 8 +- ...ockChangeEvent.kt => MassBlockSetEvent.kt} | 7 +- .../network/connection/PlayConnection.kt | 2 +- .../packets/c2s/play/BlockBreakC2SP.kt | 1 - .../protocol/packets/s2c/play/BlockSetS2CP.kt | 31 ++----- .../packets/s2c/play/ChunkUnloadS2CP.kt | 2 - .../packets/s2c/play/MassBlockSetS2CP.kt | 4 +- 17 files changed, 156 insertions(+), 102 deletions(-) rename src/main/java/de/bixilon/minosoft/gui/{ => rendering}/input/camera/Camera.kt (89%) rename src/main/java/de/bixilon/minosoft/gui/{ => rendering}/input/camera/Frustum.kt (98%) create mode 100644 src/main/java/de/bixilon/minosoft/gui/rendering/input/camera/RaycastHit.kt rename src/main/java/de/bixilon/minosoft/gui/{ => rendering}/input/key/KeyBindingCallbackPair.kt (95%) rename src/main/java/de/bixilon/minosoft/gui/{ => rendering}/input/key/RenderWindowInputHandler.kt (98%) create mode 100644 src/main/java/de/bixilon/minosoft/modding/event/EventInitiators.kt rename src/main/java/de/bixilon/minosoft/modding/event/events/{BlockChangeEvent.kt => BlockSetEvent.kt} (82%) rename src/main/java/de/bixilon/minosoft/modding/event/events/{MultiBlockChangeEvent.kt => MassBlockSetEvent.kt} (85%) diff --git a/src/main/java/de/bixilon/minosoft/data/world/World.kt b/src/main/java/de/bixilon/minosoft/data/world/World.kt index 85ed372f3..88d66e803 100644 --- a/src/main/java/de/bixilon/minosoft/data/world/World.kt +++ b/src/main/java/de/bixilon/minosoft/data/world/World.kt @@ -17,23 +17,27 @@ import de.bixilon.minosoft.data.entities.block.BlockEntity import de.bixilon.minosoft.data.mappings.Dimension import de.bixilon.minosoft.data.mappings.biomes.Biome import de.bixilon.minosoft.data.mappings.blocks.BlockState +import de.bixilon.minosoft.data.mappings.tweaker.VersionTweaker import de.bixilon.minosoft.data.world.biome.accessor.BiomeAccessor import de.bixilon.minosoft.data.world.biome.accessor.NullBiomeAccessor import de.bixilon.minosoft.data.world.light.WorldLightAccessor -import de.bixilon.minosoft.gui.rendering.util.VecUtil import de.bixilon.minosoft.gui.rendering.util.VecUtil.chunkPosition -import de.bixilon.minosoft.gui.rendering.util.VecUtil.floor -import de.bixilon.minosoft.gui.rendering.util.VecUtil.getWorldOffset import de.bixilon.minosoft.gui.rendering.util.VecUtil.inChunkPosition +import de.bixilon.minosoft.gui.rendering.util.VecUtil.inChunkSectionPosition +import de.bixilon.minosoft.gui.rendering.util.VecUtil.sectionHeight +import de.bixilon.minosoft.modding.event.events.BlockSetEvent +import de.bixilon.minosoft.modding.event.events.ChunkUnloadEvent +import de.bixilon.minosoft.protocol.network.connection.PlayConnection import de.bixilon.minosoft.util.KUtil.synchronizedMapOf import glm_.vec2.Vec2i -import glm_.vec3.Vec3 import glm_.vec3.Vec3i /** * Collection of chunks and more */ -class World : BiomeAccessor { +class World( + val connection: PlayConnection, +) : BiomeAccessor { val chunks: MutableMap = synchronizedMapOf() val entities = WorldEntities() var isHardcore = false @@ -48,8 +52,7 @@ class World : BiomeAccessor { var age = 0L fun getBlockState(blockPosition: Vec3i): BlockState? { - val chunkLocation = blockPosition.chunkPosition - return chunks[chunkLocation]?.getBlockState(blockPosition.inChunkPosition) + return chunks[blockPosition.chunkPosition]?.getBlockState(blockPosition.inChunkPosition) } @Synchronized @@ -62,12 +65,34 @@ class World : BiomeAccessor { return chunks.getOrPut(chunkPosition) { Chunk() } } - fun setBlock(blockPosition: Vec3i, blockState: BlockState?) { - chunks[blockPosition.chunkPosition]?.setBlockState(blockPosition.inChunkPosition, blockState) + fun setBlock(blockPosition: Vec3i, blockState: BlockState?, createChunk: Boolean = false) { + val chunkPosition = blockPosition.chunkPosition + if (createChunk) { + // chunks.getOrPut(chunkPosition) { Chunk() } + TODO() + } else { + chunks[chunkPosition] + }?.let { + val sections = it.sections ?: return + + val transformedBlockState = if (connection.version.isFlattened()) { + blockState + } else { + VersionTweaker.transformBlock(blockState, sections, blockPosition.inChunkSectionPosition, blockPosition.sectionHeight) + } + it.setBlockState(blockPosition.inChunkPosition, transformedBlockState) + connection.fireEvent(BlockSetEvent( + connection = connection, + blockPosition = blockPosition, + blockState = transformedBlockState, + )) + } } - fun unloadChunk(position: Vec2i) { - chunks.remove(position) + fun unloadChunk(chunkPosition: Vec2i) { + chunks.remove(chunkPosition)?.let { + connection.fireEvent(ChunkUnloadEvent(connection, chunkPosition)) + } } fun replaceChunk(position: Vec2i, chunk: Chunk) { @@ -114,45 +139,4 @@ class World : BiomeAccessor { return blocks.toMap() } - - data class RaycastHit( - val position: Vec3, - val distance: Float, - val blockState: BlockState, - val steps: Int, - ) { - val blockPosition = position.floor - } - - fun raycast(origin: Vec3, direction: Vec3): RaycastHit? { - val currentPosition = Vec3(origin) - - fun getTotalDistance(): Float { - return (origin - currentPosition).length() - } - - for (i in 0..MAX_STEPS) { - val blockPosition = currentPosition.floor - val blockState = getBlockState(blockPosition) - val distance = blockState?.outlineShape?.let { - val aabb = it + blockPosition + blockPosition.getWorldOffset(blockState.block) - aabb.raycast(currentPosition, direction) - } ?: -1.0f - - if (distance >= 0.0f && blockState != null) { - return RaycastHit( - currentPosition + direction * distance, - getTotalDistance() + distance, - blockState = blockState, - steps = i, - ) - } - currentPosition += direction * (VecUtil.getDistanceToNextIntegerAxis(currentPosition, direction) + 0.001) - } - return null - } - - companion object { - private const val MAX_STEPS = 100 - } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/RenderWindow.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/RenderWindow.kt index d6db34e4b..77360c7ab 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/RenderWindow.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/RenderWindow.kt @@ -16,13 +16,13 @@ package de.bixilon.minosoft.gui.rendering import de.bixilon.minosoft.config.StaticConfiguration import de.bixilon.minosoft.config.config.game.controls.KeyBindingsNames import de.bixilon.minosoft.data.mappings.ResourceLocation -import de.bixilon.minosoft.gui.input.key.RenderWindowInputHandler import de.bixilon.minosoft.gui.rendering.chunk.WorldRenderer import de.bixilon.minosoft.gui.rendering.chunk.block.outline.BlockOutlineRenderer import de.bixilon.minosoft.gui.rendering.font.Font import de.bixilon.minosoft.gui.rendering.hud.HUDRenderer import de.bixilon.minosoft.gui.rendering.hud.atlas.TextureLike import de.bixilon.minosoft.gui.rendering.hud.atlas.TextureLikeTexture +import de.bixilon.minosoft.gui.rendering.input.key.RenderWindowInputHandler import de.bixilon.minosoft.gui.rendering.modding.events.RenderingStateChangeEvent import de.bixilon.minosoft.gui.rendering.modding.events.ScreenResizeEvent import de.bixilon.minosoft.gui.rendering.shader.Shader diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/WorldRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/WorldRenderer.kt index e9e87b811..d2b0a70d9 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/WorldRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/WorldRenderer.kt @@ -25,9 +25,9 @@ import de.bixilon.minosoft.data.world.Chunk import de.bixilon.minosoft.data.world.ChunkSection import de.bixilon.minosoft.data.world.ChunkSection.Companion.indexPosition import de.bixilon.minosoft.data.world.World -import de.bixilon.minosoft.gui.input.camera.Frustum import de.bixilon.minosoft.gui.rendering.* import de.bixilon.minosoft.gui.rendering.chunk.models.renderable.BlockLikeRenderContext +import de.bixilon.minosoft.gui.rendering.input.camera.Frustum import de.bixilon.minosoft.gui.rendering.modding.events.FrustumChangeEvent import de.bixilon.minosoft.gui.rendering.modding.events.RenderingStateChangeEvent import de.bixilon.minosoft.gui.rendering.shader.Shader @@ -150,7 +150,7 @@ class WorldRenderer( prepareChunk(it.chunkPosition) }) - connection.registerEvent(CallbackEventInvoker.of { + connection.registerEvent(CallbackEventInvoker.of { prepareChunkSection(it.blockPosition.chunkPosition, it.blockPosition.sectionHeight) }) @@ -158,7 +158,7 @@ class WorldRenderer( clearChunkCache() }) - connection.registerEvent(CallbackEventInvoker.of { + connection.registerEvent(CallbackEventInvoker.of { val sectionHeights: MutableSet = synchronizedSetOf() for ((key) in it.blocks) { sectionHeights.add(key.sectionHeight) diff --git a/src/main/java/de/bixilon/minosoft/gui/input/camera/Camera.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/input/camera/Camera.kt similarity index 89% rename from src/main/java/de/bixilon/minosoft/gui/input/camera/Camera.kt rename to src/main/java/de/bixilon/minosoft/gui/rendering/input/camera/Camera.kt index 361d3cc3a..1f668dafc 100644 --- a/src/main/java/de/bixilon/minosoft/gui/input/camera/Camera.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/input/camera/Camera.kt @@ -11,14 +11,13 @@ * This software is not affiliated with Mojang AB, the original developer of Minecraft. */ -package de.bixilon.minosoft.gui.input.camera +package de.bixilon.minosoft.gui.rendering.input.camera import de.bixilon.minosoft.Minosoft import de.bixilon.minosoft.config.config.game.controls.KeyBindingsNames import de.bixilon.minosoft.data.entities.EntityRotation import de.bixilon.minosoft.data.entities.entities.player.PlayerEntity import de.bixilon.minosoft.data.mappings.biomes.Biome -import de.bixilon.minosoft.data.world.World import de.bixilon.minosoft.gui.rendering.RenderConstants import de.bixilon.minosoft.gui.rendering.RenderWindow import de.bixilon.minosoft.gui.rendering.modding.events.CameraMatrixChangeEvent @@ -28,6 +27,8 @@ import de.bixilon.minosoft.gui.rendering.sky.SkyRenderer import de.bixilon.minosoft.gui.rendering.util.VecUtil import de.bixilon.minosoft.gui.rendering.util.VecUtil.blockPosition import de.bixilon.minosoft.gui.rendering.util.VecUtil.chunkPosition +import de.bixilon.minosoft.gui.rendering.util.VecUtil.floor +import de.bixilon.minosoft.gui.rendering.util.VecUtil.getWorldOffset import de.bixilon.minosoft.gui.rendering.util.VecUtil.inChunkSectionPosition import de.bixilon.minosoft.gui.rendering.util.VecUtil.sectionHeight import de.bixilon.minosoft.modding.event.CallbackEventInvoker @@ -303,13 +304,45 @@ class Camera( cameraPosition = getAbsoluteCameraPosition() } - fun getTargetBlock(): World.RaycastHit? { - return connection.world.raycast(cameraPosition, cameraFront) + fun getTargetBlock(): RaycastHit? { + return raycast(cameraPosition, cameraFront) } + + private fun raycast(origin: Vec3, direction: Vec3): RaycastHit? { + val currentPosition = Vec3(origin) + + fun getTotalDistance(): Float { + return (origin - currentPosition).length() + } + + for (i in 0..RAYCAST_MAX_STEPS) { + val blockPosition = currentPosition.floor + val blockState = connection.world.getBlockState(blockPosition) + val distance = blockState?.outlineShape?.let { + val aabb = it + blockPosition + blockPosition.getWorldOffset(blockState.block) + aabb.raycast(currentPosition, direction) + } ?: -1.0f + + if (distance >= 0.0f && blockState != null) { + return RaycastHit( + currentPosition + direction * distance, + getTotalDistance() + distance, + blockState = blockState, + steps = i, + ) + } + currentPosition += direction * (VecUtil.getDistanceToNextIntegerAxis(currentPosition, direction) + 0.001) + } + return null + } + + companion object { private val CAMERA_UP_VEC3 = Vec3(0.0f, 1.0f, 0.0f) private const val PLAYER_EYE_HEIGHT = 1.3 // player is 1.8 blocks high, the camera is normally at 0.5. 1.8 - 0.5 = 1.13 private const val PLAYER_SPRINT_SPEED_MODIFIER = 1.30000001192092896 + + private const val RAYCAST_MAX_STEPS = 100 } } diff --git a/src/main/java/de/bixilon/minosoft/gui/input/camera/Frustum.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/input/camera/Frustum.kt similarity index 98% rename from src/main/java/de/bixilon/minosoft/gui/input/camera/Frustum.kt rename to src/main/java/de/bixilon/minosoft/gui/rendering/input/camera/Frustum.kt index 463d8745f..2b1c8eee2 100644 --- a/src/main/java/de/bixilon/minosoft/gui/input/camera/Frustum.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/input/camera/Frustum.kt @@ -11,7 +11,7 @@ * This software is not affiliated with Mojang AB, the original developer of Minecraft. */ -package de.bixilon.minosoft.gui.input.camera +package de.bixilon.minosoft.gui.rendering.input.camera import de.bixilon.minosoft.gui.rendering.RenderConstants diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/input/camera/RaycastHit.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/input/camera/RaycastHit.kt new file mode 100644 index 000000000..7023402b8 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/input/camera/RaycastHit.kt @@ -0,0 +1,27 @@ +/* + * 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.gui.rendering.input.camera + +import de.bixilon.minosoft.data.mappings.blocks.BlockState +import de.bixilon.minosoft.gui.rendering.util.VecUtil.floor +import glm_.vec3.Vec3 + +data class RaycastHit( + val position: Vec3, + val distance: Float, + val blockState: BlockState, + val steps: Int, +) { + val blockPosition = position.floor +} diff --git a/src/main/java/de/bixilon/minosoft/gui/input/key/KeyBindingCallbackPair.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/input/key/KeyBindingCallbackPair.kt similarity index 95% rename from src/main/java/de/bixilon/minosoft/gui/input/key/KeyBindingCallbackPair.kt rename to src/main/java/de/bixilon/minosoft/gui/rendering/input/key/KeyBindingCallbackPair.kt index e324191c2..a15ef6554 100644 --- a/src/main/java/de/bixilon/minosoft/gui/input/key/KeyBindingCallbackPair.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/input/key/KeyBindingCallbackPair.kt @@ -11,7 +11,7 @@ * This software is not affiliated with Mojang AB, the original developer of Minecraft. */ -package de.bixilon.minosoft.gui.input.key +package de.bixilon.minosoft.gui.rendering.input.key import de.bixilon.minosoft.config.key.KeyBinding diff --git a/src/main/java/de/bixilon/minosoft/gui/input/key/RenderWindowInputHandler.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/input/key/RenderWindowInputHandler.kt similarity index 98% rename from src/main/java/de/bixilon/minosoft/gui/input/key/RenderWindowInputHandler.kt rename to src/main/java/de/bixilon/minosoft/gui/rendering/input/key/RenderWindowInputHandler.kt index 8036a108f..e5eb62d51 100644 --- a/src/main/java/de/bixilon/minosoft/gui/input/key/RenderWindowInputHandler.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/input/key/RenderWindowInputHandler.kt @@ -11,17 +11,17 @@ * This software is not affiliated with Mojang AB, the original developer of Minecraft. */ -package de.bixilon.minosoft.gui.input.key +package de.bixilon.minosoft.gui.rendering.input.key import de.bixilon.minosoft.Minosoft import de.bixilon.minosoft.config.config.game.controls.KeyBindingsNames import de.bixilon.minosoft.config.key.KeyAction import de.bixilon.minosoft.config.key.KeyCodes import de.bixilon.minosoft.data.mappings.ResourceLocation -import de.bixilon.minosoft.gui.input.camera.Camera import de.bixilon.minosoft.gui.rendering.RenderConstants import de.bixilon.minosoft.gui.rendering.RenderWindow import de.bixilon.minosoft.gui.rendering.hud.elements.input.KeyConsumer +import de.bixilon.minosoft.gui.rendering.input.camera.Camera import de.bixilon.minosoft.protocol.network.connection.PlayConnection import de.bixilon.minosoft.util.logging.Log import de.bixilon.minosoft.util.logging.LogLevels diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/modding/events/FrustumChangeEvent.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/modding/events/FrustumChangeEvent.kt index 85ac917f4..349ce7777 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/modding/events/FrustumChangeEvent.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/modding/events/FrustumChangeEvent.kt @@ -13,9 +13,9 @@ package de.bixilon.minosoft.gui.rendering.modding.events -import de.bixilon.minosoft.gui.input.camera.Frustum import de.bixilon.minosoft.gui.rendering.RenderWindow import de.bixilon.minosoft.gui.rendering.Rendering +import de.bixilon.minosoft.gui.rendering.input.camera.Frustum class FrustumChangeEvent( renderWindow: RenderWindow = Rendering.currentContext!!, diff --git a/src/main/java/de/bixilon/minosoft/modding/event/EventInitiators.kt b/src/main/java/de/bixilon/minosoft/modding/event/EventInitiators.kt new file mode 100644 index 000000000..0ef9bf110 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/modding/event/EventInitiators.kt @@ -0,0 +1,29 @@ +/* + * 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.modding.event + +import de.bixilon.minosoft.util.KUtil +import de.bixilon.minosoft.util.enum.ValuesEnum + +enum class EventInitiators { + CLIENT, + SERVER, + ; + + companion object : ValuesEnum { + override val VALUES: Array = values() + override val NAME_MAP: Map = KUtil.getEnumValues(VALUES) + + } +} diff --git a/src/main/java/de/bixilon/minosoft/modding/event/events/BlockChangeEvent.kt b/src/main/java/de/bixilon/minosoft/modding/event/events/BlockSetEvent.kt similarity index 82% rename from src/main/java/de/bixilon/minosoft/modding/event/events/BlockChangeEvent.kt rename to src/main/java/de/bixilon/minosoft/modding/event/events/BlockSetEvent.kt index 6889fe39f..f7276ddae 100644 --- a/src/main/java/de/bixilon/minosoft/modding/event/events/BlockChangeEvent.kt +++ b/src/main/java/de/bixilon/minosoft/modding/event/events/BlockSetEvent.kt @@ -13,6 +13,7 @@ package de.bixilon.minosoft.modding.event.events import de.bixilon.minosoft.data.mappings.blocks.BlockState +import de.bixilon.minosoft.modding.event.EventInitiators import de.bixilon.minosoft.protocol.network.connection.PlayConnection import de.bixilon.minosoft.protocol.packets.s2c.play.BlockSetS2CP import glm_.vec3.Vec3i @@ -20,11 +21,12 @@ import glm_.vec3.Vec3i /** * Fired when one block is changed */ -class BlockChangeEvent( +class BlockSetEvent( connection: PlayConnection, val blockPosition: Vec3i, - val block: BlockState?, + val blockState: BlockState?, + val initiator: EventInitiators = EventInitiators.CLIENT, ) : PlayConnectionEvent(connection) { - constructor(connection: PlayConnection, packet: BlockSetS2CP) : this(connection, packet.blockPosition, packet.block) + constructor(connection: PlayConnection, packet: BlockSetS2CP) : this(connection, packet.blockPosition, packet.blockState, EventInitiators.SERVER) } diff --git a/src/main/java/de/bixilon/minosoft/modding/event/events/MultiBlockChangeEvent.kt b/src/main/java/de/bixilon/minosoft/modding/event/events/MassBlockSetEvent.kt similarity index 85% rename from src/main/java/de/bixilon/minosoft/modding/event/events/MultiBlockChangeEvent.kt rename to src/main/java/de/bixilon/minosoft/modding/event/events/MassBlockSetEvent.kt index bed7edce8..ea7b974ab 100644 --- a/src/main/java/de/bixilon/minosoft/modding/event/events/MultiBlockChangeEvent.kt +++ b/src/main/java/de/bixilon/minosoft/modding/event/events/MassBlockSetEvent.kt @@ -13,6 +13,7 @@ package de.bixilon.minosoft.modding.event.events import de.bixilon.minosoft.data.mappings.blocks.BlockState +import de.bixilon.minosoft.modding.event.EventInitiators import de.bixilon.minosoft.protocol.network.connection.PlayConnection import de.bixilon.minosoft.protocol.packets.s2c.play.MassBlockSetS2CP import glm_.vec2.Vec2i @@ -21,11 +22,13 @@ import glm_.vec3.Vec3i /** * Fired when at least block is changed */ -class MultiBlockChangeEvent( +class MassBlockSetEvent( connection: PlayConnection, val blocks: Map, val chunkPosition: Vec2i, + val initiator: EventInitiators = EventInitiators.CLIENT, ) : PlayConnectionEvent(connection) { - constructor(connection: PlayConnection, packet: MassBlockSetS2CP) : this(connection, packet.blocks, packet.chunkPosition) + constructor(connection: PlayConnection, packet: MassBlockSetS2CP) : this(connection, packet.blocks, packet.chunkPosition, EventInitiators.SERVER) + } diff --git a/src/main/java/de/bixilon/minosoft/protocol/network/connection/PlayConnection.kt b/src/main/java/de/bixilon/minosoft/protocol/network/connection/PlayConnection.kt index 0ea418371..c21466472 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/network/connection/PlayConnection.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/network/connection/PlayConnection.kt @@ -53,7 +53,7 @@ class PlayConnection( val version: Version, ) : Connection() { val recipes = Recipes() - val world = World() + val world = World(this) val tabList = TabList() val scoreboardManager = ScoreboardManager() val mapping = VersionMapping() diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/play/BlockBreakC2SP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/play/BlockBreakC2SP.kt index f5896c645..931c89bd2 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/play/BlockBreakC2SP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/play/BlockBreakC2SP.kt @@ -59,7 +59,6 @@ class BlockBreakC2SP( companion object : ValuesEnum { override val VALUES: Array = values() override val NAME_MAP: Map = KUtil.getEnumValues(VALUES) - } } } diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/BlockSetS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/BlockSetS2CP.kt index 408e83f88..92910abd1 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/BlockSetS2CP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/BlockSetS2CP.kt @@ -13,12 +13,6 @@ package de.bixilon.minosoft.protocol.packets.s2c.play import de.bixilon.minosoft.data.mappings.blocks.BlockState -import de.bixilon.minosoft.data.mappings.tweaker.VersionTweaker -import de.bixilon.minosoft.gui.rendering.util.VecUtil.chunkPosition -import de.bixilon.minosoft.gui.rendering.util.VecUtil.inChunkSectionPosition -import de.bixilon.minosoft.gui.rendering.util.VecUtil.sectionHeight - -import de.bixilon.minosoft.modding.event.events.BlockChangeEvent import de.bixilon.minosoft.protocol.network.connection.PlayConnection import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer @@ -30,38 +24,23 @@ import glm_.vec3.Vec3i class BlockSetS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket() { val blockPosition: Vec3i - val block: BlockState? + val blockState: BlockState? init { if (buffer.versionId < ProtocolVersions.V_14W03B) { blockPosition = buffer.readByteBlockPosition() - block = buffer.connection.mapping.getBlockState(buffer.readVarInt() shl 4 or buffer.readByte().toInt()) // ToDo: When was the meta data "compacted"? (between 1.7.10 - 1.8) + blockState = buffer.connection.mapping.getBlockState(buffer.readVarInt() shl 4 or buffer.readByte().toInt()) // ToDo: When was the meta data "compacted"? (between 1.7.10 - 1.8) } else { blockPosition = buffer.readBlockPosition() - block = buffer.connection.mapping.getBlockState(buffer.readVarInt()) + blockState = buffer.connection.mapping.getBlockState(buffer.readVarInt()) } } override fun handle(connection: PlayConnection) { - val chunk = connection.world.getChunk(blockPosition.chunkPosition) ?: return // thanks mojang - if (!chunk.isFullyLoaded) { - return - } - val sectionHeight = blockPosition.sectionHeight - val inChunkSectionPosition = blockPosition.inChunkSectionPosition - val section = chunk.getSectionOrCreate(sectionHeight) - - // tweak - if (!connection.version.isFlattened()) { - val block = VersionTweaker.transformBlock(block!!, chunk.sections!!, inChunkSectionPosition, sectionHeight) - section.setBlockState(inChunkSectionPosition, block) - } else { - section.setBlockState(inChunkSectionPosition, block) - } - connection.fireEvent(BlockChangeEvent(connection, this)) + connection.world.setBlock(blockPosition, blockState) } override fun log() { - Log.log(LogMessageType.NETWORK_PACKETS_IN, level = LogLevels.VERBOSE) { "Block change (position=${blockPosition}, block=$block)" } + Log.log(LogMessageType.NETWORK_PACKETS_IN, level = LogLevels.VERBOSE) { "Block change (position=${blockPosition}, block=$blockState)" } } } diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/ChunkUnloadS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/ChunkUnloadS2CP.kt index 83c7f780a..18252e5e0 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/ChunkUnloadS2CP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/ChunkUnloadS2CP.kt @@ -12,7 +12,6 @@ */ package de.bixilon.minosoft.protocol.packets.s2c.play -import de.bixilon.minosoft.modding.event.events.ChunkUnloadEvent import de.bixilon.minosoft.protocol.network.connection.PlayConnection import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer @@ -26,7 +25,6 @@ class ChunkUnloadS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket() { override fun handle(connection: PlayConnection) { connection.world.unloadChunk(chunkPosition) - connection.fireEvent(ChunkUnloadEvent(connection, chunkPosition)) } override fun log() { diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/MassBlockSetS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/MassBlockSetS2CP.kt index d52330d45..3ae72deee 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/MassBlockSetS2CP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/MassBlockSetS2CP.kt @@ -17,7 +17,7 @@ import de.bixilon.minosoft.data.mappings.blocks.BlockState import de.bixilon.minosoft.data.mappings.tweaker.VersionTweaker import de.bixilon.minosoft.gui.rendering.util.VecUtil.inChunkSectionPosition import de.bixilon.minosoft.gui.rendering.util.VecUtil.sectionHeight -import de.bixilon.minosoft.modding.event.events.MultiBlockChangeEvent +import de.bixilon.minosoft.modding.event.events.MassBlockSetEvent import de.bixilon.minosoft.protocol.network.connection.PlayConnection import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer @@ -96,7 +96,7 @@ class MassBlockSetS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket() { chunk.setBlockState(key, block) } } - connection.fireEvent(MultiBlockChangeEvent(connection, this)) + connection.fireEvent(MassBlockSetEvent(connection, this)) } override fun log() {