Skip to content

Commit 6e36d27

Browse files
author
yitzy299
committed
Add world deletion GUI
1 parent cdb8cfc commit 6e36d27

5 files changed

Lines changed: 117 additions & 27 deletions

File tree

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,23 @@
11
package net.quiltservertools.interdimensional.command
22

3-
import com.mojang.brigadier.context.CommandContext
43
import com.mojang.brigadier.tree.LiteralCommandNode
54
import me.lucko.fabric.api.permissions.v0.Permissions
6-
import net.minecraft.server.command.CommandManager
5+
import net.minecraft.server.command.CommandManager.literal
76
import net.minecraft.server.command.ServerCommandSource
8-
import net.minecraft.server.world.ServerWorld
9-
import net.quiltservertools.interdimensional.command.InterdimensionalCommand.success
10-
import net.quiltservertools.interdimensional.command.argument.ServerDimensionArgument
11-
import net.quiltservertools.interdimensional.world.RuntimeWorldManager.getHandle
12-
import net.quiltservertools.interdimensional.world.RuntimeWorldManager.remove
7+
import net.quiltservertools.interdimensional.gui.DeleteGuiHandler
138

149
object DeleteCommand : Command {
1510
override fun register(): LiteralCommandNode<ServerCommandSource> {
16-
return CommandManager.literal("delete")
17-
.then(ServerDimensionArgument.dimension("dimension")
18-
.requires(Permissions.require("interdimensional.commands.delete", 4))
19-
.executes { ctx: CommandContext<ServerCommandSource> ->
20-
delete(
21-
ServerDimensionArgument.get(ctx, "dimension"),
22-
ctx.source
23-
)
24-
})
11+
return literal("delete")
12+
.requires(Permissions.require("interdimensional.commands.delete", 3))
13+
.executes {
14+
delete(it.source)
15+
}
2516
.build()
2617
}
2718

28-
private fun delete(world: ServerWorld, scs: ServerCommandSource): Int {
29-
val id = world.registryKey.value
30-
remove(getHandle(id))
31-
scs.sendFeedback("Deleted dimension $id".success(), true)
32-
return 1
19+
private fun delete(scs: ServerCommandSource): Int {
20+
DeleteGuiHandler(scs.player)
21+
return 0
3322
}
3423
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package net.quiltservertools.interdimensional.gui
2+
3+
import eu.pb4.sgui.api.gui.SimpleGui
4+
import net.minecraft.item.Items
5+
import net.minecraft.screen.ScreenHandlerType
6+
import net.minecraft.server.network.ServerPlayerEntity
7+
import net.minecraft.util.Identifier
8+
import net.quiltservertools.interdimensional.command.InterdimensionalCommand.error
9+
import net.quiltservertools.interdimensional.command.InterdimensionalCommand.success
10+
import net.quiltservertools.interdimensional.gui.components.ActionComponent
11+
import net.quiltservertools.interdimensional.gui.elements.WorldDeleteElement
12+
import net.quiltservertools.interdimensional.world.RuntimeWorldManager
13+
14+
class DeleteGuiHandler(val player: ServerPlayerEntity) {
15+
16+
val gui = SimpleGui(ScreenHandlerType.GENERIC_9X3, player, false)
17+
var identifier: Identifier? = null
18+
19+
init {
20+
gui.addSlot(WorldDeleteElement(player.server.worlds, this).createElement())
21+
22+
// Bottom row
23+
gui.setSlot(18, ActionComponent(Items.LIME_CONCRETE, "Submit") { submit() })
24+
gui.setSlot(26, ActionComponent(Items.RED_CONCRETE, "Close") { close() })
25+
open()
26+
}
27+
fun open() {
28+
gui.open()
29+
}
30+
fun close() {
31+
gui.close()
32+
}
33+
34+
private fun submit() {
35+
val identifier = this.identifier
36+
if (identifier != null) {
37+
RuntimeWorldManager.remove(RuntimeWorldManager.getHandle(identifier))
38+
player.sendMessage("Deleted world: $identifier".success(), false)
39+
} else {
40+
player.sendMessage("No world selected for deletion".error(), false)
41+
}
42+
close()
43+
}
44+
}

src/main/kotlin/net/quiltservertools/interdimensional/gui/components/LinkComponent.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,12 @@ interface LinkComponent {
1919
*/
2020
fun createOptions(index: Int)
2121
fun close()
22-
fun setResult(handler: CreateGuiHandler)
22+
fun setResult(handler: CreateGuiHandler) {
23+
24+
}
2325

2426
fun createElement(): GuiElementInterface {
25-
return GuiElement(getItemStack().setCustomName(getItemStack().name)) {
27+
return GuiElement(getItemStack()) {
2628
index: Int, type: ClickType?, action: SlotActionType?, gui: SlotGuiInterface ->
2729
this.createOptions(index)
2830
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package net.quiltservertools.interdimensional.gui.elements
2+
3+
import eu.pb4.sgui.api.ClickType
4+
import eu.pb4.sgui.api.elements.GuiElementInterface
5+
import eu.pb4.sgui.api.gui.SimpleGui
6+
import eu.pb4.sgui.api.gui.SlotGuiInterface
7+
import net.minecraft.item.ItemStack
8+
import net.minecraft.item.Items
9+
import net.minecraft.screen.ScreenHandlerType
10+
import net.minecraft.screen.slot.SlotActionType
11+
import net.minecraft.server.world.ServerWorld
12+
import net.quiltservertools.interdimensional.gui.DeleteGuiHandler
13+
import net.quiltservertools.interdimensional.gui.components.LinkComponent
14+
import net.quiltservertools.interdimensional.text
15+
16+
class WorldDeleteElement(worlds: Iterable<ServerWorld>, val handler: DeleteGuiHandler) :
17+
LinkComponent {
18+
19+
val gui = SimpleGui(ScreenHandlerType.GENERIC_9X3, handler.player, false)
20+
var handlerSlotIndex = 0
21+
22+
init {
23+
worlds.forEach {
24+
gui.addSlot(WorldSelectorElement.getItem(it), ComponentCallback(it, this))
25+
}
26+
}
27+
28+
override fun getItemStack(): ItemStack {
29+
var text = "World".text()
30+
if (handler.identifier != null) {
31+
text = "World: ${handler.identifier}".text()
32+
}
33+
return ItemStack(Items.FILLED_MAP).setCustomName(text)
34+
}
35+
36+
override fun createOptions(index: Int) {
37+
this.handlerSlotIndex = index
38+
handler.close()
39+
this.gui.open()
40+
}
41+
42+
override fun close() {
43+
this.gui.close()
44+
handler.open()
45+
}
46+
47+
class ComponentCallback(val world: ServerWorld, private val element: WorldDeleteElement) :
48+
GuiElementInterface.ClickCallback {
49+
override fun click(index: Int, type: ClickType?, action: SlotActionType?, gui: SlotGuiInterface) {
50+
element.handler.identifier = world.registryKey.value
51+
element.handler.gui.setSlot(element.handlerSlotIndex, element.createElement())
52+
element.close()
53+
}
54+
}
55+
}

src/main/kotlin/net/quiltservertools/interdimensional/world/RuntimeWorldManager.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ object RuntimeWorldManager {
1818

1919
fun remove(handle: RuntimeWorldHandle) {
2020
runtimeDimensionHandlers.remove(handle)
21-
Interdimensional.LOGGER.info("Removed dimension" + handle.asWorld().registryKey.value)
21+
Interdimensional.LOGGER.info("Removed dimension${handle.asWorld().registryKey.value}")
2222
handle.delete()
2323
}
2424

@@ -44,9 +44,9 @@ object RuntimeWorldManager {
4444
}
4545

4646
fun getHandle(identifier: Identifier): RuntimeWorldHandle {
47-
val result = runtimeDimensionHandlers.stream().filter { h: RuntimeWorldHandle ->
47+
val result = runtimeDimensionHandlers.first { h: RuntimeWorldHandle ->
4848
h.asWorld().registryKey.value == identifier
49-
}.findFirst()
50-
return result.orElse(null)
49+
}
50+
return result
5151
}
5252
}

0 commit comments

Comments
 (0)