From fa2a73e29dc26e075d0654acee66c8b92da6a76c Mon Sep 17 00:00:00 2001 From: Bixilon Date: Fri, 22 Sep 2023 02:08:05 +0200 Subject: [PATCH] reset abilities when changing gamemode --- .../java/de/bixilon/minosoft/data/abilities/Gamemodes.kt | 8 +++++++- .../event/game/handler/gamemode/GamemodeChangeHandler.kt | 1 + .../minosoft/protocol/packets/s2c/play/InitializeS2CP.kt | 1 + .../minosoft/protocol/packets/s2c/play/RespawnS2CP.kt | 1 + 4 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/bixilon/minosoft/data/abilities/Gamemodes.kt b/src/main/java/de/bixilon/minosoft/data/abilities/Gamemodes.kt index 22393de15..4f18ea397 100644 --- a/src/main/java/de/bixilon/minosoft/data/abilities/Gamemodes.kt +++ b/src/main/java/de/bixilon/minosoft/data/abilities/Gamemodes.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2021 Moritz Zwerger + * Copyright (C) 2020-2023 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. * @@ -14,6 +14,7 @@ package de.bixilon.minosoft.data.abilities import de.bixilon.kutil.enums.EnumUtil import de.bixilon.kutil.enums.ValuesEnum +import de.bixilon.minosoft.data.entities.entities.player.local.Abilities enum class Gamemodes( val canBuild: Boolean, @@ -21,6 +22,7 @@ enum class Gamemodes( val useTools: Boolean, val canInteract: InteractionAbilities, val survival: Boolean, + val abilities: Abilities, ) { SURVIVAL( canBuild = true, @@ -28,6 +30,7 @@ enum class Gamemodes( useTools = true, canInteract = InteractionAbilities.EVERYTHING, survival = true, + Abilities(), ), CREATIVE( canBuild = true, @@ -35,6 +38,7 @@ enum class Gamemodes( useTools = true, canInteract = InteractionAbilities.EVERYTHING, survival = false, + Abilities(true, true, true), ), ADVENTURE( canBuild = false, @@ -42,6 +46,7 @@ enum class Gamemodes( useTools = false, canInteract = InteractionAbilities.ONLY_ENTITIES, survival = true, + Abilities(), ), SPECTATOR( canBuild = false, @@ -49,6 +54,7 @@ enum class Gamemodes( useTools = false, canInteract = InteractionAbilities.ONLY_ENTITIES, survival = false, + Abilities(true, true, true), ), ; diff --git a/src/main/java/de/bixilon/minosoft/data/registries/misc/event/game/handler/gamemode/GamemodeChangeHandler.kt b/src/main/java/de/bixilon/minosoft/data/registries/misc/event/game/handler/gamemode/GamemodeChangeHandler.kt index c978e1365..ca647fa1b 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/misc/event/game/handler/gamemode/GamemodeChangeHandler.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/misc/event/game/handler/gamemode/GamemodeChangeHandler.kt @@ -29,5 +29,6 @@ object GamemodeChangeHandler : GameEventHandler { return } connection.player.additional.gamemode = next + connection.player.abilities = next.abilities } } diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/InitializeS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/InitializeS2CP.kt index 1e13ab412..8272a59bc 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/InitializeS2CP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/InitializeS2CP.kt @@ -169,6 +169,7 @@ class InitializeS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket { if (previousGamemode != gamemode) { playerEntity.additional.gamemode = gamemode + playerEntity.abilities = gamemode.abilities } connection.world.hardcore = isHardcore diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/RespawnS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/RespawnS2CP.kt index 3f19b62cd..2dff51217 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/RespawnS2CP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/RespawnS2CP.kt @@ -107,6 +107,7 @@ class RespawnS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket { override fun handle(connection: PlayConnection) { connection.util.prepareSpawn() connection.player.additional.gamemode = gamemode + connection.player.abilities = gamemode.abilities val dimensionChange = this.dimension != connection.world.dimension || this.world != connection.world.name if (dimensionChange) { connection.util.resetWorld()