Skip to content

Commit cdb8cfc

Browse files
author
yitzy299
committed
Add configuration for structures in GUI
1 parent ad794f1 commit cdb8cfc

12 files changed

Lines changed: 174 additions & 96 deletions

File tree

src/main/java/net/quiltservertools/interdimensional/duck/ServerPlayerEntityAccess.java

Lines changed: 0 additions & 8 deletions
This file was deleted.

src/main/java/net/quiltservertools/interdimensional/mixin/ChunkGeneratorAccessor.java

Lines changed: 0 additions & 19 deletions
This file was deleted.
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package net.quiltservertools.interdimensional.mixin;
2+
3+
import net.minecraft.world.gen.chunk.ChunkGeneratorSettings;
4+
import net.minecraft.world.gen.chunk.StructuresConfig;
5+
import org.spongepowered.asm.mixin.Mixin;
6+
import org.spongepowered.asm.mixin.gen.Accessor;
7+
8+
@Mixin(ChunkGeneratorSettings.class)
9+
public interface ChunkGeneratorSettingsAccessor {
10+
@Accessor("structuresConfig")
11+
void setStructuresConfig(StructuresConfig config);
12+
}

src/main/java/net/quiltservertools/interdimensional/mixin/MixinChunkGenerator.java renamed to src/main/java/net/quiltservertools/interdimensional/mixin/ChunkGeneratorSettingsMixin.java

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,14 @@
11
package net.quiltservertools.interdimensional.mixin;
22

3-
import net.minecraft.world.biome.source.BiomeSource;
4-
import net.minecraft.world.gen.chunk.ChunkGenerator;
3+
import net.minecraft.world.gen.chunk.ChunkGeneratorSettings;
54
import net.minecraft.world.gen.chunk.StructuresConfig;
65
import org.spongepowered.asm.mixin.Final;
76
import org.spongepowered.asm.mixin.Mixin;
87
import org.spongepowered.asm.mixin.Mutable;
98
import org.spongepowered.asm.mixin.Shadow;
109

11-
@Mixin(ChunkGenerator.class)
12-
public class MixinChunkGenerator {
13-
@Final
14-
@Mutable
15-
@Shadow
16-
protected BiomeSource biomeSource;
17-
10+
@Mixin(ChunkGeneratorSettings.class)
11+
public class ChunkGeneratorSettingsMixin {
1812
@Final
1913
@Mutable
2014
@Shadow

src/main/java/net/quiltservertools/interdimensional/mixin/MixinServerPlayerEntity.java

Lines changed: 0 additions & 25 deletions
This file was deleted.
Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,5 @@
11
package net.quiltservertools.interdimensional
22

3-
import net.quiltservertools.interdimensional.duck.ServerPlayerEntityAccess
4-
import net.minecraft.server.network.ServerPlayerEntity
53
import net.minecraft.text.LiteralText
6-
import net.minecraft.world.gen.chunk.ChunkGenerator
7-
8-
var ServerPlayerEntity.customGenerator: ChunkGenerator?
9-
get() = (this as ServerPlayerEntityAccess).customGenerator
10-
set(value) {
11-
(this as ServerPlayerEntityAccess).customGenerator = value
12-
}
134

145
fun String.text() = LiteralText(this)

src/main/kotlin/net/quiltservertools/interdimensional/gui/CreateGuiHandler.kt

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ import net.quiltservertools.interdimensional.gui.components.TextComponent
2121
import net.quiltservertools.interdimensional.gui.elements.*
2222
import net.quiltservertools.interdimensional.gui.options.DifficultyOption
2323
import net.quiltservertools.interdimensional.gui.options.GeneratorTypes
24+
import net.quiltservertools.interdimensional.mixin.ChunkGeneratorSettingsAccessor
25+
import net.quiltservertools.interdimensional.mixin.ChunkGeneratorSettingsMixin
2426
import net.quiltservertools.interdimensional.mixin.NoiseChunkGeneratorAccessor
2527
import net.quiltservertools.interdimensional.world.RuntimeWorldManager
2628
import xyz.nucleoid.fantasy.RuntimeWorldConfig
@@ -41,6 +43,7 @@ class CreateGuiHandler(val player: ServerPlayerEntity) {
4143
var generatorSettings: ChunkGeneratorSettings =
4244
BuiltinRegistries.CHUNK_GENERATOR_SETTINGS.get(ChunkGeneratorSettings.OVERWORLD)
4345
?: ChunkGeneratorSettings.getInstance()
46+
var structuresConfig: Optional<StructuresConfig> = Optional.empty()
4447

4548
init {
4649
val generatorTypes = GeneratorTypes.values().toMutableList()
@@ -62,6 +65,10 @@ class CreateGuiHandler(val player: ServerPlayerEntity) {
6265
// Generator settings
6366
ChunkGeneratorSettingsElement(this)
6467

68+
// Structures config
69+
StructureSelectorElement(this)
70+
StrongholdEnableComponent(this)
71+
6572
// Bottom row
6673
gui.setSlot(18, ActionComponent(Items.LIME_CONCRETE, "Submit") { submit() })
6774
gui.setSlot(26, ActionComponent(Items.RED_CONCRETE, "Close") { close() })
@@ -72,13 +79,15 @@ class CreateGuiHandler(val player: ServerPlayerEntity) {
7279
gui.open()
7380
}
7481

82+
@Suppress("CAST_NEVER_SUCCEEDS")
7583
private fun submit() {
7684
val biomeSource = biomeSourceSelector.result.biomeSource
77-
val structures =
78-
StructuresConfig(Optional.of(StructuresConfig.DEFAULT_STRONGHOLD), StructuresConfig.DEFAULT_STRUCTURES)
7985

8086
val generator = when (type) {
8187
GeneratorTypes.NOISE -> {
88+
if (structuresConfig.isPresent) {
89+
(generatorSettings as ChunkGeneratorSettingsAccessor).setStructuresConfig(structuresConfig.get())
90+
}
8291
NoiseChunkGenerator(
8392
(maplike.chunkManager.chunkGenerator as NoiseChunkGeneratorAccessor).noiseParameters,
8493
biomeSource,
@@ -87,7 +96,9 @@ class CreateGuiHandler(val player: ServerPlayerEntity) {
8796
}
8897
GeneratorTypes.FLAT -> {
8998
val config = FlatChunkGeneratorConfig.getDefaultConfig(player.server.registryManager.get(Registry.BIOME_KEY))
90-
config.withStructuresConfig(structures)
99+
if (structuresConfig.isPresent) {
100+
config.withStructuresConfig(structuresConfig.get())
101+
}
91102
config.setBiome {
92103
return@setBiome biomeSource.biomes.first()
93104
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package net.quiltservertools.interdimensional.gui.elements
2+
3+
import net.minecraft.world.gen.chunk.StructuresConfig
4+
import net.quiltservertools.interdimensional.gui.CreateGuiHandler
5+
import net.quiltservertools.interdimensional.gui.components.ShuffleComponent
6+
import net.quiltservertools.interdimensional.gui.options.StrongholdOptions
7+
import java.util.*
8+
9+
class StrongholdEnableComponent(handler: CreateGuiHandler) :
10+
ShuffleComponent<StrongholdOptions>(handler, StrongholdOptions.values().toMutableList()) {
11+
override fun setResult() {
12+
val enable = this.options[this.index].enabled
13+
val stronghold = if (enable) {
14+
Optional.of(StructuresConfig.DEFAULT_STRONGHOLD)
15+
} else {
16+
Optional.empty()
17+
}
18+
if (handler.structuresConfig.isPresent) {
19+
handler.structuresConfig = Optional.of(StructuresConfig(stronghold, handler.structuresConfig.get().structures))
20+
} else {
21+
handler.structuresConfig = Optional.of(StructuresConfig(stronghold, StructuresConfig.DEFAULT_STRUCTURES))
22+
}
23+
}
24+
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
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.minecraft.world.gen.chunk.StructureConfig
13+
import net.minecraft.world.gen.chunk.StructuresConfig
14+
import net.minecraft.world.gen.feature.FeatureConfig
15+
import net.minecraft.world.gen.feature.StructureFeature
16+
import net.quiltservertools.interdimensional.gui.CreateGuiHandler
17+
import net.quiltservertools.interdimensional.gui.components.LinkComponent
18+
import net.quiltservertools.interdimensional.text
19+
import java.util.*
20+
import kotlin.collections.HashMap
21+
22+
class StructureSelectorElement(val handler: CreateGuiHandler) : LinkComponent {
23+
24+
val gui = SimpleGui(ScreenHandlerType.GENERIC_9X3, handler.player, false)
25+
private var handlerSlotIndex: Int = 0
26+
var result: ServerWorld? = handler.maplike
27+
28+
init {
29+
handler.player.server.worlds.forEach {
30+
gui.addSlot(WorldSelectorElement.getItem(it), ComponentCallback(it, this))
31+
}
32+
gui.addSlot(ItemStack(Items.RED_CONCRETE).setCustomName("Disabled".text()), ComponentCallback(null, this))
33+
setResult(handler)
34+
handler.gui.addSlot(this.createElement())
35+
}
36+
37+
override fun getItemStack(): ItemStack {
38+
return ItemStack(Items.CARTOGRAPHY_TABLE).setCustomName("Structures: ${this.result?.registryKey?.value?.path ?: "Disabled"}".text())
39+
}
40+
41+
override fun createOptions(index: Int) {
42+
handler.close()
43+
this.handlerSlotIndex = index
44+
gui.open()
45+
}
46+
47+
override fun close() {
48+
gui.close()
49+
handler.gui.setSlot(this.handlerSlotIndex, this.createElement())
50+
handler.open()
51+
}
52+
53+
override fun setResult(handler: CreateGuiHandler) {
54+
var config = handler.structuresConfig
55+
var strongholdOptional = Optional.of(StructuresConfig.DEFAULT_STRONGHOLD)
56+
if (config.isPresent) {
57+
val stronghold = config.get().stronghold
58+
strongholdOptional = if (stronghold != null) {
59+
Optional.of(stronghold)
60+
} else {
61+
Optional.empty()
62+
}
63+
}
64+
65+
config = Optional.of(
66+
StructuresConfig(
67+
strongholdOptional,
68+
this.result?.chunkManager?.chunkGenerator?.structuresConfig?.structures
69+
?: HashMap<StructureFeature<FeatureConfig>, StructureConfig>().toMutableMap()
70+
)
71+
)
72+
handler.structuresConfig = config
73+
}
74+
75+
class ComponentCallback(val world: ServerWorld?, private val component: StructureSelectorElement) :
76+
GuiElementInterface.ClickCallback {
77+
override fun click(index: Int, type: ClickType?, action: SlotActionType?, gui: SlotGuiInterface) {
78+
component.result = world
79+
component.setResult(component.handler)
80+
component.close()
81+
}
82+
}
83+
}

src/main/kotlin/net/quiltservertools/interdimensional/gui/elements/WorldSelectorElement.kt

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -31,26 +31,6 @@ class WorldSelectorElement(worlds: Iterable<ServerWorld>, private val handler: C
3131
}
3232
}
3333

34-
private fun getItem(world: ServerWorld?): ItemStack {
35-
val path = world?.registryKey?.value?.path ?: ""
36-
val stack = when (path) {
37-
"overworld" -> {
38-
ItemStack(Items.STONE)
39-
}
40-
"the_nether" -> {
41-
ItemStack(Items.NETHERRACK)
42-
}
43-
"the_end" -> {
44-
ItemStack(Items.END_STONE)
45-
}
46-
else -> {
47-
ItemStack(Items.FILLED_MAP)
48-
}
49-
}
50-
51-
return stack.setCustomName(path.text())
52-
}
53-
5434
override fun getItemStack(): ItemStack {
5535
return ItemStack(Items.MAP).setCustomName("World like: ${handler.maplike.registryKey.value.path}".text())
5636
}
@@ -79,4 +59,26 @@ class WorldSelectorElement(worlds: Iterable<ServerWorld>, private val handler: C
7959
component.close()
8060
}
8161
}
62+
63+
companion object {
64+
fun getItem(world: ServerWorld?): ItemStack {
65+
val path = world?.registryKey?.value?.path ?: ""
66+
val stack = when (path) {
67+
"overworld" -> {
68+
ItemStack(Items.STONE)
69+
}
70+
"the_nether" -> {
71+
ItemStack(Items.NETHERRACK)
72+
}
73+
"the_end" -> {
74+
ItemStack(Items.END_STONE)
75+
}
76+
else -> {
77+
ItemStack(Items.FILLED_MAP)
78+
}
79+
}
80+
81+
return stack.setCustomName(path.text())
82+
}
83+
}
8284
}

0 commit comments

Comments
 (0)