From 601eddca300afe95a0295419fa8f65a0122d87ac Mon Sep 17 00:00:00 2001 From: TDSTOS Date: Fri, 17 Apr 2026 03:45:14 +0200 Subject: [PATCH] Add pit wall replace function --- .../speedhg/game/modules/PitManager.kt | 20 ++++++++- .../mcscrims/speedhg/util/WorldEditUtils.kt | 45 +++++++++++++++++++ 2 files changed, 63 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/club/mcscrims/speedhg/game/modules/PitManager.kt b/src/main/kotlin/club/mcscrims/speedhg/game/modules/PitManager.kt index 8f26a06..8437cfc 100644 --- a/src/main/kotlin/club/mcscrims/speedhg/game/modules/PitManager.kt +++ b/src/main/kotlin/club/mcscrims/speedhg/game/modules/PitManager.kt @@ -116,13 +116,29 @@ class PitManager(private val plugin: SpeedHG) { // ── 2. Luftschacht von Boden+1 bis über die Oberfläche ──────────────── WorldEditUtils.createCylinder( world, airStartLoc, PIT_RADIUS, true, airHeight, Material.AIR ) - // ── 3. Broadcast sofort ─────────────────────────────────────────────── + // ── 3. Wasser & Lava in den Wänden durch Glas ersetzen ──────────────── + // Radius + 1: erfasst die 1-Block-dicke Wand direkt außerhalb des Schachts. + // Nur WATER, LAVA und AIR werden ersetzt — kein Terrain-Block wird angefasst. + val wallLoc = Location( world, PIT_X, ( pitFloorY + 1 ).toDouble(), PIT_Z ) + WorldEditUtils.replaceCylinder( + world, + wallLoc, + PIT_RADIUS + 1, + airHeight, + setOf( Material.WATER, Material.LAVA, Material.AIR ), + Material.GRAY_STAINED_GLASS + ) + + // ── 4. Pit-Inneres nochmals mit Luft freiräumen (Glas das rein gerutscht ist) ─ + WorldEditUtils.createCylinder( world, airStartLoc, PIT_RADIUS, true, airHeight, Material.AIR ) + + // ── 5. Broadcast sofort ─────────────────────────────────────────────── Bukkit.getOnlinePlayers().forEach { p -> p.sendMsg( "pit.spawned" ) p.playSound( p.location, Sound.ENTITY_WITHER_SPAWN, 1f, 0.5f ) } - // ── 4. Spieler teleportieren (kurz nach WorldEdit-Commit) ───────────── + // ── 6. Spieler teleportieren (kurz nach WorldEdit-Commit) ───────────── Bukkit.getScheduler().runTaskLater( plugin, { -> teleportPlayersToPit( world ) startEscapeCheck( world ) diff --git a/src/main/kotlin/club/mcscrims/speedhg/util/WorldEditUtils.kt b/src/main/kotlin/club/mcscrims/speedhg/util/WorldEditUtils.kt index 3948ff3..3a0f9ed 100644 --- a/src/main/kotlin/club/mcscrims/speedhg/util/WorldEditUtils.kt +++ b/src/main/kotlin/club/mcscrims/speedhg/util/WorldEditUtils.kt @@ -2,7 +2,11 @@ package club.mcscrims.speedhg.util import com.sk89q.worldedit.WorldEdit import com.sk89q.worldedit.bukkit.BukkitAdapter +import com.sk89q.worldedit.function.mask.BlockTypeMask +import com.sk89q.worldedit.math.Vector2 +import com.sk89q.worldedit.regions.CylinderRegion import com.sk89q.worldedit.util.SideEffectSet +import com.sk89q.worldedit.world.block.BlockTypes import org.bukkit.Location import org.bukkit.Material import org.bukkit.World @@ -86,4 +90,45 @@ object WorldEditUtils { e.printStackTrace() } + fun replaceCylinder( + world: World, + center: Location, + radius: Int, + height: Int, + replaceMaterials: Set, + replacement: Material + ) = try { + val weWorld = BukkitAdapter.adapt( world ) + val centerVec = BukkitAdapter.asBlockVector( center ) + val radiusVec = Vector2.at( radius.toDouble(), radius.toDouble() ) + val region = CylinderRegion( + weWorld, + centerVec, + radiusVec, + centerVec.y, + centerVec.y + height - 1 + ) + + val editSession = WorldEdit.getInstance().newEditSessionBuilder() + .world( weWorld ).maxBlocks( -1 ).build() + + editSession.sideEffectApplier = SideEffectSet.defaults() + + val mask = BlockTypeMask( + editSession, + replaceMaterials.mapNotNull { mat -> + BlockTypes.get("minecraft:${mat.key.key}") + } + ) + + val replacementState = BukkitAdapter.asBlockState( ItemStack( replacement ) ) + + editSession.replaceBlocks( region, mask, replacementState ) + + editSession.commit() + editSession.close() + } catch ( e: Exception ) { + e.printStackTrace() + } + } \ No newline at end of file