From d2f119a112e02339dc8a170578589a44347b85ab Mon Sep 17 00:00:00 2001 From: YuRaNnNzZZ Date: Mon, 3 Mar 2025 17:34:39 +0300 Subject: [PATCH 1/5] =?UTF-8?q?=D1=82=D0=B5=D0=B3=D0=B8=20=D1=81=D1=82?= =?UTF-8?q?=D1=80=D1=83=D0=BA=D1=82=D1=83=D1=80=20=D0=B8=20=D0=BA=D0=B0?= =?UTF-8?q?=D1=80=D1=82=D1=8B=20=D0=B4=D0=BB=D1=8F=20=D0=BA=D0=B0=D1=80?= =?UTF-8?q?=D1=82=D0=BE=D0=B3=D1=80=D0=B0=D1=84=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/dbotthepony/mc/otm/datagen/DataGen.kt | 2 ++ .../mc/otm/datagen/lang/English.kt | 9 +++++ .../datagen/lang/MatteryLanguageProvider.kt | 2 ++ .../mc/otm/datagen/lang/Russian.kt | 8 +++++ .../mc/otm/datagen/tags/StructureTags.kt | 14 ++++++++ .../mc/otm/datagen/tags/TagsProvider.kt | 1 + .../mc/otm/OverdriveThatMatters.kt | 2 ++ .../mc/otm/registry/MStructureTags.kt | 33 +++++++++++++++++++ .../mc/otm/registry/game/MStructures.kt | 21 ++++++++++++ .../resources/META-INF/accesstransformer.cfg | 2 ++ 10 files changed, 94 insertions(+) create mode 100644 src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/StructureTags.kt create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/registry/MStructureTags.kt create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MStructures.kt diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt index 37cd0efe8..da93af5c8 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt @@ -52,6 +52,7 @@ import ru.dbotthepony.mc.otm.datagen.tags.addDyeTags import ru.dbotthepony.mc.otm.datagen.tags.addEquipmentTags import ru.dbotthepony.mc.otm.datagen.tags.addMineableTags import ru.dbotthepony.mc.otm.datagen.tags.addResourceTags +import ru.dbotthepony.mc.otm.datagen.tags.addStructureTags import ru.dbotthepony.mc.otm.datagen.tags.addSuspiciousTags import ru.dbotthepony.mc.otm.datagen.tags.addTags import ru.dbotthepony.mc.otm.matter.MatterDataProvider @@ -533,6 +534,7 @@ object DataGen { addEquipmentTags(tagsProvider) addMineableTags(tagsProvider) addDyeTags(tagsProvider) + addStructureTags(tagsProvider) event.generator.addProvider(event.includeClient(), blockModelProvider) event.generator.addProvider(event.includeServer(), blockStateProvider) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt index 801a266c1..47a522393 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt @@ -1183,6 +1183,13 @@ private fun jade(provider: MatteryLanguageProvider) { } } +private fun maps(provider: MatteryLanguageProvider) { + with(provider.english) { + map("laboratory", "Laboratory Map") + map("wreckage", "Wreckage Map") + } +} + fun AddEnglishLanguage(provider: MatteryLanguageProvider) { decoratives(provider) sounds(provider) @@ -1199,6 +1206,8 @@ fun AddEnglishLanguage(provider: MatteryLanguageProvider) { jade(provider) + maps(provider) + with(provider.english) { add("itemGroup.otm", "Overdrive That Matters") add("itemGroup.otm_decorative", "Overdrive That Matters Decorative") diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/MatteryLanguageProvider.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/MatteryLanguageProvider.kt index 87faba8da..a92f5f2bf 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/MatteryLanguageProvider.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/MatteryLanguageProvider.kt @@ -107,6 +107,8 @@ class MatteryLanguageProvider(private val gen: DataGenerator) { fun jade(key: String, value: String) = slave.add("otm.jade.$key", value) fun jadeloc(key: String, value: String) = slave.add("config.jade.plugin_${DataGen.MOD_ID}.$key", value) + fun map(key: String, value: String) = slave.add("filled_map.otm_$key", value) + inner class Prepended(path: String) { val path = "$path." constructor(vararg path: String) : this(path.joinToString(".")) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt index 8c2b8ba63..fd30292c9 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt @@ -1169,6 +1169,13 @@ private fun jade(provider: MatteryLanguageProvider) { } } +private fun maps(provider: MatteryLanguageProvider) { + with(provider.russian) { + map("laboratory", "Карта лаборатории") + map("wreckage", "Карта кораблекрушения") + } +} + fun AddRussianLanguage(provider: MatteryLanguageProvider) { decoratives(provider) blocks(provider) @@ -1181,4 +1188,5 @@ fun AddRussianLanguage(provider: MatteryLanguageProvider) { death(provider) androidFeatures(provider) jade(provider) + maps(provider) } diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/StructureTags.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/StructureTags.kt new file mode 100644 index 000000000..3e964f0eb --- /dev/null +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/StructureTags.kt @@ -0,0 +1,14 @@ +package ru.dbotthepony.mc.otm.datagen.tags + +import ru.dbotthepony.mc.otm.registry.MStructureTags +import ru.dbotthepony.mc.otm.registry.game.MStructures + +fun addStructureTags(tagsProvider: TagsProvider) { + tagsProvider.structures.Appender(MStructureTags.LABORATORIES).add(MStructures.LABORATORY) + + tagsProvider.structures.Appender(MStructureTags.FIELD_RESEARCH_PODS) + .add(MStructures.FIELD_RESEARCH_POD) + .add(MStructures.FIELD_RESEARCH_POD_RUIN) + + tagsProvider.structures.Appender(MStructureTags.WRECKAGES).add(MStructures.WRECKAGE) +} diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/TagsProvider.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/TagsProvider.kt index 6b5050bc0..e84eeee6d 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/TagsProvider.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/TagsProvider.kt @@ -185,6 +185,7 @@ class TagsProvider(private val event: GatherDataEvent) { val mobEffects = Delegate(BuiltInRegistries.MOB_EFFECT) val entityTypes = Delegate(BuiltInRegistries.ENTITY_TYPE) val damageTypes = Delegate(Registries.DAMAGE_TYPE) + val structures = Delegate(Registries.STRUCTURE) private val coloredItems = EnumMap.Appender>(DyeColor::class.java) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/OverdriveThatMatters.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/OverdriveThatMatters.kt index c9d4377f1..b020f9548 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/OverdriveThatMatters.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/OverdriveThatMatters.kt @@ -241,6 +241,8 @@ object OverdriveThatMatters { FORGE_BUS.addListener(EventPriority.NORMAL, NotNormalFood::onInteract) + FORGE_BUS.addListener(EventPriority.NORMAL, MStructureTags::registerVillagerTrades) + if (isCuriosLoaded) { FORGE_BUS.addListener(EventPriority.NORMAL, ::onCuriosSlotModifiersUpdated) } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MStructureTags.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MStructureTags.kt new file mode 100644 index 000000000..734dcd587 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MStructureTags.kt @@ -0,0 +1,33 @@ +package ru.dbotthepony.mc.otm.registry + +import net.minecraft.core.registries.Registries +import net.minecraft.tags.TagKey +import net.minecraft.world.entity.npc.VillagerProfession +import net.minecraft.world.entity.npc.VillagerTrades +import net.minecraft.world.level.levelgen.structure.Structure +import net.minecraft.world.level.saveddata.maps.MapDecorationTypes +import net.neoforged.neoforge.event.village.VillagerTradesEvent +import ru.dbotthepony.mc.otm.OverdriveThatMatters.loc + +object MStructureTags { + val LABORATORIES = create("laboratories") + val FIELD_RESEARCH_PODS = create("field_research_pods") + val WRECKAGES = create("wreckages") + + fun create(location: String): TagKey { + return TagKey.create(Registries.STRUCTURE, loc(location)) + } + + fun registerVillagerTrades(event: VillagerTradesEvent) { + if (event.type == VillagerProfession.CARTOGRAPHER) { + with (event.trades.get(2)) { + add(VillagerTrades.TreasureMapForEmeralds(10, WRECKAGES, "filled_map.otm_wreckage", + MapDecorationTypes.RED_X, 12, 5)) + } + with (event.trades.get(3)) { + add(VillagerTrades.TreasureMapForEmeralds(25, LABORATORIES, "filled_map.otm_laboratory", + MapDecorationTypes.LIGHT_BLUE_BANNER, 12, 10)) + } + } + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MStructures.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MStructures.kt new file mode 100644 index 000000000..647db47d1 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MStructures.kt @@ -0,0 +1,21 @@ +package ru.dbotthepony.mc.otm.registry.game + +import net.minecraft.core.registries.Registries +import net.minecraft.resources.ResourceKey +import net.minecraft.world.level.levelgen.structure.Structure +import ru.dbotthepony.mc.otm.OverdriveThatMatters.loc + +object MStructures { + val CARGO_CONTAINER = create("cargo_container") + val FIELD_RESEARCH_POD = create("field_research_pod") + val FIELD_RESEARCH_POD_RUIN = create("field_research_pod_ruin") + val FRIGATE = create("frigate") + val FUEL_BASE = create("fuel_base") + val LABORATORY = create("laboratory") + val OCEAN_CONTAINER = create("ocean_container") + val WRECKAGE = create("wreckage") + + fun create(location: String): ResourceKey { + return ResourceKey.create(Registries.STRUCTURE, loc(location)) + } +} diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 125b536e7..981907976 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -174,3 +174,5 @@ public net.minecraft.advancements.critereon.InventoryChangeTrigger$TriggerInstan #public-f net.minecraft.advancements.critereon.SimpleCriterionTrigger addPlayerListener(Lnet/minecraft/server/PlayerAdvancements;Lnet/minecraft/advancements/CriterionTrigger$Listener;)V #public-f net.minecraft.advancements.critereon.SimpleCriterionTrigger removePlayerListener(Lnet/minecraft/server/PlayerAdvancements;Lnet/minecraft/advancements/CriterionTrigger$Listener;)V #public-f net.minecraft.advancements.critereon.SimpleCriterionTrigger removePlayerListeners(Lnet/minecraft/server/PlayerAdvancements;)V + +public net.minecraft.world.entity.npc.VillagerTrades$TreasureMapForEmeralds From 38923d79788821816e2dd5bd82c167022ff4450d Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Mon, 3 Mar 2025 22:17:20 +0700 Subject: [PATCH 2/5] Fix flywheel battery not marking chunk dirty when energy level changes --- .../mc/otm/block/entity/tech/FlywheelBatteryBlockEntity.kt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/FlywheelBatteryBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/FlywheelBatteryBlockEntity.kt index 1ec935423..13fee1bae 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/FlywheelBatteryBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/FlywheelBatteryBlockEntity.kt @@ -37,6 +37,13 @@ class FlywheelBatteryBlockEntity(blockPos: BlockPos, blockState: BlockState) : M private var multiblock: ShapedMultiblock? = null private var lastHeight = -1 var batteryLevel = Decimal.ZERO + set(value) { + if (field != value) { + field = value + markDirtyFast() + } + } + private var cachedChargeEfficiency = Decimal.ONE val formed: Boolean From fcec612718174f6de545605cd2dcda0cd81f7a3e Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Mon, 3 Mar 2025 22:19:57 +0700 Subject: [PATCH 3/5] Lock CMWC state size to 256 WORDs, improving performance of nextInt() --- .../mc/otm/core/util/CMWCRandom.kt | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/util/CMWCRandom.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/util/CMWCRandom.kt index aec7fc452..ae291f2d1 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/core/util/CMWCRandom.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/util/CMWCRandom.kt @@ -7,8 +7,8 @@ import net.minecraft.world.level.levelgen.PositionalRandomFactory import java.lang.StringBuilder import java.util.random.RandomGenerator -class CMWCRandom(seed: Long = System.nanoTime(), private val stateSize: Int = CMWC_DEFAULT_STATE_SIZE) : RandomGenerator, RandomSource { - private val state = IntArray(stateSize) +class CMWCRandom(seed: Long = System.nanoTime()) : RandomGenerator, RandomSource { + private val state = IntArray(CMWC_STATE_SIZE) private var carry = 0 private var stateIndex = 0 private val gaussian = MarsagliaPolarGaussian(this) @@ -37,7 +37,7 @@ class CMWCRandom(seed: Long = System.nanoTime(), private val stateSize: Int = CM } override fun nextInt(): Int { - stateIndex = (stateIndex + 1) % state.size + stateIndex = (stateIndex + 1).and(CMWC_STATE_SIZE - 1) val t = 18782L * state[stateIndex] + carry carry = t.ushr(32).toInt() @@ -83,24 +83,24 @@ class CMWCRandom(seed: Long = System.nanoTime(), private val stateSize: Int = CM } override fun fork(): RandomSource { - return CMWCRandom(nextLong(), stateSize) + return CMWCRandom(nextLong()) } override fun forkPositional(): PositionalRandomFactory { - return Positional(nextLong(), stateSize) + return Positional(nextLong()) } - class Positional(val seed: Long, val stateSize: Int = CMWC_DEFAULT_STATE_SIZE) : PositionalRandomFactory { + class Positional(val seed: Long) : PositionalRandomFactory { override fun at(x: Int, y: Int, z: Int): RandomSource { - return CMWCRandom(Mth.getSeed(x, y, z).xor(seed), stateSize) + return CMWCRandom(Mth.getSeed(x, y, z).xor(seed)) } override fun fromHashOf(name: String): RandomSource { - return CMWCRandom(name.hashCode().toLong().xor(seed), stateSize) + return CMWCRandom(name.hashCode().toLong().xor(seed)) } override fun fromSeed(seed: Long): RandomSource { - return CMWCRandom(seed, stateSize) + return CMWCRandom(seed) } override fun parityConfigString(builder: StringBuilder) { @@ -109,7 +109,7 @@ class CMWCRandom(seed: Long = System.nanoTime(), private val stateSize: Int = CM } companion object { - const val CMWC_DEFAULT_STATE_SIZE = 256 // 4096 + const val CMWC_STATE_SIZE = 256 // 4096 const val CMWC_CARRY_MAX = 809430660 } } From b83c9edf137cb173e61de5c98f0e418fe97f95e0 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Mon, 3 Mar 2025 22:22:04 +0700 Subject: [PATCH 4/5] Delegate List.shuffle extension impl to Minecraft util --- .../kotlin/ru/dbotthepony/mc/otm/core/Ext.kt | 25 +------------------ 1 file changed, 1 insertion(+), 24 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/Ext.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/Ext.kt index 04120682f..718e617b1 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/core/Ext.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/Ext.kt @@ -188,24 +188,6 @@ fun > T.prev(values: Array): T { return values[next] } -fun IntArray.shuffle(random: RandomGenerator) { - for (i in lastIndex downTo 1) { - val j = random.nextInt(i + 1) - val copy = this[i] - this[i] = this[j] - this[j] = copy - } -} - -fun MutableList.shuffle(random: RandomGenerator) { - for (i in lastIndex downTo 1) { - val j = random.nextInt(i + 1) - val copy = this[i] - this[i] = this[j] - this[j] = copy - } -} - fun IntArray.shuffle(random: RandomSource) { for (i in lastIndex downTo 1) { val j = random.nextInt(i + 1) @@ -216,12 +198,7 @@ fun IntArray.shuffle(random: RandomSource) { } fun MutableList.shuffle(random: RandomSource) { - for (i in lastIndex downTo 1) { - val j = random.nextInt(i + 1) - val copy = this[i] - this[i] = this[j] - this[j] = copy - } + return Util.shuffle(this, random) } fun List.random(random: RandomGenerator): T { From 5df477feab20d4e183ecbe6867bb1586b6a512fd Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Mon, 3 Mar 2025 22:29:00 +0700 Subject: [PATCH 5/5] Fix grill not marking chunk as dirty when it ticks progress/fuel --- .../mc/otm/block/entity/decorative/GrillBlockEntity.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/decorative/GrillBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/decorative/GrillBlockEntity.kt index da51be08f..7046c6a4a 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/decorative/GrillBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/decorative/GrillBlockEntity.kt @@ -192,6 +192,8 @@ class GrillBlockEntity(blockPos: BlockPos, blockState: BlockState) : MatteryBloc level!!.setBlock(blockPos, blockState.set(GrillBlock.STATE_PROPERTY, GrillBlock.State.FUELED), Block.UPDATE_ALL) } } + + markDirtyFast() } else { fuelTotalTicks = 0