Compare commits

..

No commits in common. "92846cbad09949945820cc1ab53679768607aff6" and "4da5ef81f7e8aa354945ae5766453ac39eb4120d" have entirely different histories.

76 changed files with 120 additions and 1615 deletions

View File

@ -188,7 +188,7 @@ dependencies {
compileOnly("curse.maven:resourceful-config-714059:${resourceful_config_id}") compileOnly("curse.maven:resourceful-config-714059:${resourceful_config_id}")
compileOnly("curse.maven:botarium-704113:${botarium_id}") compileOnly("curse.maven:botarium-704113:${botarium_id}")
compileOnly("curse.maven:ad-astra-635042:${ad_astra_id}") compileOnly("curse.maven:ad-astra-635042:${ad_astra_id}")
runtimeOnly("curse.maven:worldedit-225608:${worldedit_id}") //runtimeOnly("curse.maven:worldedit-225608:${worldedit_id}")
runtimeOnly("me.shedaniel.cloth:cloth-config-neoforge:${cloth_config_version}") runtimeOnly("me.shedaniel.cloth:cloth-config-neoforge:${cloth_config_version}")
implementation("io.wispforest:condensed_creative-neoforge:${condensed_creative_version}") implementation("io.wispforest:condensed_creative-neoforge:${condensed_creative_version}")

View File

@ -52,7 +52,6 @@ import ru.dbotthepony.mc.otm.datagen.tags.addDyeTags
import ru.dbotthepony.mc.otm.datagen.tags.addEquipmentTags import ru.dbotthepony.mc.otm.datagen.tags.addEquipmentTags
import ru.dbotthepony.mc.otm.datagen.tags.addMineableTags import ru.dbotthepony.mc.otm.datagen.tags.addMineableTags
import ru.dbotthepony.mc.otm.datagen.tags.addResourceTags 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.addSuspiciousTags
import ru.dbotthepony.mc.otm.datagen.tags.addTags import ru.dbotthepony.mc.otm.datagen.tags.addTags
import ru.dbotthepony.mc.otm.matter.MatterDataProvider import ru.dbotthepony.mc.otm.matter.MatterDataProvider
@ -534,7 +533,6 @@ object DataGen {
addEquipmentTags(tagsProvider) addEquipmentTags(tagsProvider)
addMineableTags(tagsProvider) addMineableTags(tagsProvider)
addDyeTags(tagsProvider) addDyeTags(tagsProvider)
addStructureTags(tagsProvider)
event.generator.addProvider(event.includeClient(), blockModelProvider) event.generator.addProvider(event.includeClient(), blockModelProvider)
event.generator.addProvider(event.includeServer(), blockStateProvider) event.generator.addProvider(event.includeServer(), blockStateProvider)
@ -585,7 +583,6 @@ object DataGen {
addDecorativeLoot(lootTableProvider) addDecorativeLoot(lootTableProvider)
addAdvancementLoot(lootTableProvider) addAdvancementLoot(lootTableProvider)
addVaultLoot(lootTableProvider) addVaultLoot(lootTableProvider)
addEntityLoot(lootTableProvider)
addChestLootTables(lootTableProvider) addChestLootTables(lootTableProvider)
recipeProvider.exec { _, consumer -> recipeProvider.exec { _, consumer ->

View File

@ -114,17 +114,6 @@ fun addItemModels(provider: MatteryItemModelProvider) {
provider.handheld(MItems.CHEST_UPGRADER) provider.handheld(MItems.CHEST_UPGRADER)
provider.exec {
val path = MItems.CONFIGURATOR.registryName!!.path
val ready = provider.withExistingParent("${path}_ready", MatteryItemModelProvider.HANDHELD)
.texture("layer0", modLocation("item/${path}_ready"))
provider.withExistingParent(path, MatteryItemModelProvider.HANDHELD)
.texture("layer0", modLocation("item/$path"))
.override().predicate(modLocation("has_configuration_saved"), 1f).model(ready).end()
}
provider.generated(MItems.BREAD_MONSTER_SPAWN_EGG, modLocation("item/egg/bread_monster")) provider.generated(MItems.BREAD_MONSTER_SPAWN_EGG, modLocation("item/egg/bread_monster"))
provider.generated(MItems.LOADER_SPAWN_EGG, modLocation("item/egg/loader")) provider.generated(MItems.LOADER_SPAWN_EGG, modLocation("item/egg/loader"))

View File

@ -192,10 +192,6 @@ private fun misc(provider: MatteryLanguageProvider) {
gui("holo_screen.resize_text", "Resize text automatically") gui("holo_screen.resize_text", "Resize text automatically")
gui("holo_screen.do_not_resize_text", "Do not resize text") gui("holo_screen.do_not_resize_text", "Do not resize text")
gui("abc", "ABC")
gui("use_standard_font", "Use standard font")
gui("use_small_font", "Use small font")
gui("ticks", "Ticks") gui("ticks", "Ticks")
gui("power_cost_per_use", "Power cost per use: %s") gui("power_cost_per_use", "Power cost per use: %s")
@ -830,7 +826,6 @@ private fun items(provider: MatteryLanguageProvider) {
add(MItems.REINFORCED_IRON_PLATE, "desc", "A sturdier and more durable Iron Plate") add(MItems.REINFORCED_IRON_PLATE, "desc", "A sturdier and more durable Iron Plate")
add(MItems.ARMOR_ASSEMBLY, "Armor assembly") add(MItems.ARMOR_ASSEMBLY, "Armor assembly")
add(MItems.CARBON_MESH, "Carbon Mesh") add(MItems.CARBON_MESH, "Carbon Mesh")
add(MItems.DISPLAY_SCREEN, "Display Screen")
add(MItems.GRAVITATIONAL_DISRUPTOR, "Spacetime Equalizer") add(MItems.GRAVITATIONAL_DISRUPTOR, "Spacetime Equalizer")
@ -864,12 +859,6 @@ private fun items(provider: MatteryLanguageProvider) {
add(MItems.ENERGY_SWORD, "desc3", "Always strikes surrounding enemies with full damage if empowered") add(MItems.ENERGY_SWORD, "desc3", "Always strikes surrounding enemies with full damage if empowered")
add(MItems.ENERGY_SWORD, "desc4", "Does not benefit from Sweeping Edge enchantment") add(MItems.ENERGY_SWORD, "desc4", "Does not benefit from Sweeping Edge enchantment")
add(MItems.FALLING_SUN, "◄ Falling Sun ►")
add(MItems.FALLING_SUN, "desc", "Prototype weapon, needs power to operate")
add(MItems.FALLING_SUN, "desc2", "Deals extra damage to androids when empowered")
add(MItems.FALLING_SUN, "desc3", "Always strikes surrounding enemies with full damage if empowered")
add(MItems.FALLING_SUN, "desc4", "Does not benefit from Sweeping Edge enchantment")
add(MItems.PORTABLE_CONDENSATION_DRIVE, "Portable Condensation Drive") add(MItems.PORTABLE_CONDENSATION_DRIVE, "Portable Condensation Drive")
add(MItems.PORTABLE_DENSE_CONDENSATION_DRIVE, "Portable Dense Condensation Drive") add(MItems.PORTABLE_DENSE_CONDENSATION_DRIVE, "Portable Dense Condensation Drive")
add(MItems.TRITANIUM_ORE_CLUMP, "Raw Tritanium") add(MItems.TRITANIUM_ORE_CLUMP, "Raw Tritanium")
@ -929,12 +918,6 @@ private fun items(provider: MatteryLanguageProvider) {
add(MItems.CHEST_UPGRADER, "desc", "Replaces placed chests and barrels with cargo crates while keeping storage contents") add(MItems.CHEST_UPGRADER, "desc", "Replaces placed chests and barrels with cargo crates while keeping storage contents")
add(MItems.CHEST_UPGRADER, "desc2", "Hold desired crates in the opposite hand") add(MItems.CHEST_UPGRADER, "desc2", "Hold desired crates in the opposite hand")
add(MItems.CONFIGURATOR, "Configurator")
add(MItems.CONFIGURATOR, "desc", "Copies configuration from one block to another")
add(MItems.CONFIGURATOR, "desc2", "Sneak-use on block to copy, use to paste")
add(MItems.CONFIGURATOR, "desc3", "Use on air while sneaking to clear saved configuration")
add(MItems.CONFIGURATOR, "desc_saved", "Saved configuration for: %s")
add(MItems.BREAD_MONSTER_SPAWN_EGG, "Bread Monster Spawn Egg") add(MItems.BREAD_MONSTER_SPAWN_EGG, "Bread Monster Spawn Egg")
add(MEntityTypes.BREAD_MONSTER, "Bread Monster") add(MEntityTypes.BREAD_MONSTER, "Bread Monster")
@ -992,11 +975,6 @@ private fun gui(provider: MatteryLanguageProvider) {
gui("flow_direction_set", "Flow direction set to %s") gui("flow_direction_set", "Flow direction set to %s")
gui("tick_timer_set", "Timer set to %s ticks") gui("tick_timer_set", "Timer set to %s ticks")
gui("config_copied", "Copied configuration for %s")
gui("config_pasted", "Applied saved configuration")
gui("config_cleared", "Configuration cleared")
gui("config_missing", "No configuration to apply")
gui("black_hole_generator.help0", "Generates energy using angular momentum of Singularities") gui("black_hole_generator.help0", "Generates energy using angular momentum of Singularities")
gui("black_hole_generator.help1", "The stronger gravity Singularity has, the more power is generated!") gui("black_hole_generator.help1", "The stronger gravity Singularity has, the more power is generated!")
gui("black_hole_generator.help2", "Using Spacetime Normalizers will reduce gravitation strength of Singularity, which will reduce power output.") gui("black_hole_generator.help2", "Using Spacetime Normalizers will reduce gravitation strength of Singularity, which will reduce power output.")
@ -1205,13 +1183,6 @@ 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) { fun AddEnglishLanguage(provider: MatteryLanguageProvider) {
decoratives(provider) decoratives(provider)
sounds(provider) sounds(provider)
@ -1228,8 +1199,6 @@ fun AddEnglishLanguage(provider: MatteryLanguageProvider) {
jade(provider) jade(provider)
maps(provider)
with(provider.english) { with(provider.english) {
add("itemGroup.otm", "Overdrive That Matters") add("itemGroup.otm", "Overdrive That Matters")
add("itemGroup.otm_decorative", "Overdrive That Matters Decorative") add("itemGroup.otm_decorative", "Overdrive That Matters Decorative")

View File

@ -107,8 +107,6 @@ class MatteryLanguageProvider(private val gen: DataGenerator) {
fun jade(key: String, value: String) = slave.add("otm.jade.$key", value) 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 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) { inner class Prepended(path: String) {
val path = "$path." val path = "$path."
constructor(vararg path: String) : this(path.joinToString(".")) constructor(vararg path: String) : this(path.joinToString("."))

View File

@ -202,10 +202,6 @@ private fun misc(provider: MatteryLanguageProvider) {
gui("holo_screen.resize_text", "Изменять размер текста автоматически") gui("holo_screen.resize_text", "Изменять размер текста автоматически")
gui("holo_screen.do_not_resize_text", "Не менять размер текста") gui("holo_screen.do_not_resize_text", "Не менять размер текста")
gui("abc", "АБВ")
gui("use_standard_font", "Использовать стандартный шрифт")
gui("use_small_font", "Использовать уменьшенный шрифт")
gui("ticks", "Тиков") gui("ticks", "Тиков")
gui("power_cost_per_use", "Энергии на операцию: %s") gui("power_cost_per_use", "Энергии на операцию: %s")
@ -823,7 +819,6 @@ private fun items(provider: MatteryLanguageProvider) {
add(MItems.REINFORCED_IRON_PLATE, "desc", "Более надёжная и прочная железная пластина") add(MItems.REINFORCED_IRON_PLATE, "desc", "Более надёжная и прочная железная пластина")
add(MItems.ARMOR_ASSEMBLY, "Стройка брони") add(MItems.ARMOR_ASSEMBLY, "Стройка брони")
add(MItems.CARBON_MESH, "Углеродная сетка") add(MItems.CARBON_MESH, "Углеродная сетка")
add(MItems.DISPLAY_SCREEN, "Экран дисплея")
add(MItems.GRAVITATIONAL_DISRUPTOR, "Маяк уравнения пространства-времени") add(MItems.GRAVITATIONAL_DISRUPTOR, "Маяк уравнения пространства-времени")
@ -857,12 +852,6 @@ private fun items(provider: MatteryLanguageProvider) {
add(MItems.ENERGY_SWORD, "desc3", "Всегда наносит полный урон по площади если имеет заряд") add(MItems.ENERGY_SWORD, "desc3", "Всегда наносит полный урон по площади если имеет заряд")
add(MItems.ENERGY_SWORD, "desc4", "Зачарование 'Разящий клинок' не имеет никакого эффекта на данном оружии") add(MItems.ENERGY_SWORD, "desc4", "Зачарование 'Разящий клинок' не имеет никакого эффекта на данном оружии")
add(MItems.FALLING_SUN, "◄ Падающее Солнце ►")
add(MItems.FALLING_SUN, "desc", "Прототип,требует энергию для работы")
add(MItems.FALLING_SUN, "desc2", "Наносит дополнительный урон андроидам если имеет заряд")
add(MItems.FALLING_SUN, "desc3", "Всегда наносит полный урон по площади если имеет заряд")
add(MItems.FALLING_SUN, "desc4", "Зачарование 'Разящий клинок' не имеет никакого эффекта на данном оружии")
add(MItems.PORTABLE_CONDENSATION_DRIVE, "Portable Condensation Drive") add(MItems.PORTABLE_CONDENSATION_DRIVE, "Portable Condensation Drive")
add(MItems.PORTABLE_DENSE_CONDENSATION_DRIVE, "Portable Dense Condensation Drive") add(MItems.PORTABLE_DENSE_CONDENSATION_DRIVE, "Portable Dense Condensation Drive")
add(MItems.TRITANIUM_ORE_CLUMP, "Рудный тритан") add(MItems.TRITANIUM_ORE_CLUMP, "Рудный тритан")
@ -922,12 +911,6 @@ private fun items(provider: MatteryLanguageProvider) {
add(MItems.CHEST_UPGRADER, "desc", "Заменяет установленные сундуки и бочки грузовыми ящиками с сохранением содержимого") add(MItems.CHEST_UPGRADER, "desc", "Заменяет установленные сундуки и бочки грузовыми ящиками с сохранением содержимого")
add(MItems.CHEST_UPGRADER, "desc2", "Удерживайте необходимые ящики в противоположной руке") add(MItems.CHEST_UPGRADER, "desc2", "Удерживайте необходимые ящики в противоположной руке")
add(MItems.CONFIGURATOR, "Конфигуратор")
add(MItems.CONFIGURATOR, "desc", "Копирует настройки между блоками")
add(MItems.CONFIGURATOR, "desc2", "Использование крадясь на блоке копирует настройки, простое использование применяет")
add(MItems.CONFIGURATOR, "desc3", "Используйте крадясь на воздухе для очистки")
add(MItems.CONFIGURATOR, "desc_saved", "Сохранены настройки для: %s")
add(MItems.BREAD_MONSTER_SPAWN_EGG, "Яйцо призыва хлебного монстра") add(MItems.BREAD_MONSTER_SPAWN_EGG, "Яйцо призыва хлебного монстра")
add(MEntityTypes.BREAD_MONSTER, "Хлебный монстр") add(MEntityTypes.BREAD_MONSTER, "Хлебный монстр")
@ -985,11 +968,6 @@ private fun gui(provider: MatteryLanguageProvider) {
gui("flow_direction_set", "Направление потока установлено на %s") gui("flow_direction_set", "Направление потока установлено на %s")
gui("tick_timer_set", "Таймер установлен на %s тиков") gui("tick_timer_set", "Таймер установлен на %s тиков")
gui("config_copied", "Скопированы настройки для %s")
gui("config_pasted", "Настройки применены")
gui("config_cleared", "Настройки очищены")
gui("config_missing", "Нет настроек для применения")
gui("black_hole_generator.help0", "Генерирует электричество используя угловое ускорение сингулярностей") gui("black_hole_generator.help0", "Генерирует электричество используя угловое ускорение сингулярностей")
gui("black_hole_generator.help1", "Чем сильнее гравитационное поле сингулярности, тем больше генерация!") gui("black_hole_generator.help1", "Чем сильнее гравитационное поле сингулярности, тем больше генерация!")
gui("black_hole_generator.help2", "Использование стабилизаторов пространства-времени ослабляет гравитационное поле, снижая генерацию") gui("black_hole_generator.help2", "Использование стабилизаторов пространства-времени ослабляет гравитационное поле, снижая генерацию")
@ -1191,13 +1169,6 @@ private fun jade(provider: MatteryLanguageProvider) {
} }
} }
private fun maps(provider: MatteryLanguageProvider) {
with(provider.russian) {
map("laboratory", "Карта лаборатории")
map("wreckage", "Карта кораблекрушения")
}
}
fun AddRussianLanguage(provider: MatteryLanguageProvider) { fun AddRussianLanguage(provider: MatteryLanguageProvider) {
decoratives(provider) decoratives(provider)
blocks(provider) blocks(provider)
@ -1210,5 +1181,4 @@ fun AddRussianLanguage(provider: MatteryLanguageProvider) {
death(provider) death(provider)
androidFeatures(provider) androidFeatures(provider)
jade(provider) jade(provider)
maps(provider)
} }

View File

@ -1,21 +0,0 @@
package ru.dbotthepony.mc.otm.datagen.loot
import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets
import ru.dbotthepony.mc.otm.datagen.modLootTable
import ru.dbotthepony.mc.otm.registry.game.MItems
fun addEntityLoot(loot: LootTables) {
loot.builder(LootContextParamSets.ENTITY, modLootTable("entities/loader")) {
lootPool {
item(MItems.MECHANICAL_PARTS) {
setCount(1, 3)
setWeight(7)
}
item(MItems.ELECTRIC_PARTS) {
setCount(1, 1)
setWeight(1)
}
setRolls(1)
}
}
}

View File

@ -1,14 +1,8 @@
package ru.dbotthepony.mc.otm.datagen.loot package ru.dbotthepony.mc.otm.datagen.loot
import net.minecraft.util.valueproviders.UniformInt
import net.minecraft.world.item.Items import net.minecraft.world.item.Items
import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets
import ru.dbotthepony.mc.otm.core.math.Decimal
import ru.dbotthepony.mc.otm.data.world.UniformDecimal
import ru.dbotthepony.mc.otm.datagen.modLootTable import ru.dbotthepony.mc.otm.datagen.modLootTable
import ru.dbotthepony.mc.otm.item.ProceduralBatteryItem
import ru.dbotthepony.mc.otm.item.exopack.ProceduralExopackSlotUpgradeItem
import ru.dbotthepony.mc.otm.item.matter.MatterDustItem
import ru.dbotthepony.mc.otm.registry.game.MItems import ru.dbotthepony.mc.otm.registry.game.MItems
fun addChestLootTables(loot: LootTables) { fun addChestLootTables(loot: LootTables) {
@ -34,93 +28,24 @@ fun addChestLootTables(loot: LootTables) {
item(Items.COPPER_INGOT) { setCount(minimal = 1, maximal = 3) } item(Items.COPPER_INGOT) { setCount(minimal = 1, maximal = 3) }
item(Items.EXPOSED_COPPER) { setCount(minimal = 1, maximal = 2) } item(Items.EXPOSED_COPPER) { setCount(minimal = 1, maximal = 2) }
item(MItems.ExopackUpgrades.INVENTORY_UPGRADE_PROCEDURAL) { setRolls(3)
chanceCondition(0.1)
setWeight(1)
apply(ProceduralExopackSlotUpgradeItem.Randomizer(UniformInt.of(1, 9), UniformInt.of(0, 3)))
}
setRolls(7)
} }
} }
loot.builder(LootContextParamSets.CHEST, modLootTable("frigate_cargo")) { loot.builder(LootContextParamSets.CHEST, modLootTable("frigate_cargo")) {
lootPool { lootPool {
item(Items.IRON_INGOT) { item(Items.IRON_INGOT) { setCount(minimal = 1, maximal = 3) }
setCount(minimal = 1, maximal = 3)
setWeight(3)
}
item(Items.GOLD_INGOT) { setCount(minimal = 1, maximal = 3) } item(Items.GOLD_INGOT) { setCount(minimal = 1, maximal = 3) }
item(Items.EMERALD) { setCount(minimal = 1, maximal = 3) } item(Items.EMERALD) { setCount(minimal = 1, maximal = 3) }
item(MItems.TRITANIUM_INGOT) { setCount(minimal = 1, maximal = 3) } item(MItems.TRITANIUM_INGOT) { setCount(minimal = 1, maximal = 3) }
item(MItems.MECHANICAL_PARTS) { item(MItems.MECHANICAL_PARTS) { setCount(minimal = 2, maximal = 3) }
setCount(minimal = 2, maximal = 3)
setWeight(2)
}
item(MItems.CIRCUIT_PLATING) { setCount(minimal = 2, maximal = 3) } item(MItems.CIRCUIT_PLATING) { setCount(minimal = 2, maximal = 3) }
item(MItems.ENERGY_BUS) { setCount(minimal = 0, maximal = 2) }
item(MItems.ROFLITE_ALLOY_INGOT) { setCount(minimal = 0, maximal = 3) }
item(MItems.WITHERED_STEEL) { setCount(minimal = 0, maximal = 3) }
item(Items.SADDLE) { setCount(minimal = 0, maximal = 1) } item(Items.SADDLE) { setCount(minimal = 0, maximal = 1) }
item(Items.DIAMOND) { setCount(minimal = 0, maximal = 3) } item(Items.DIAMOND) { setCount(minimal = 0, maximal = 3) }
item(MItems.ExopackUpgrades.INVENTORY_UPGRADE_PROCEDURAL) { setRolls(3)
chanceCondition(0.2)
setWeight(3)
apply(ProceduralExopackSlotUpgradeItem.Randomizer(UniformInt.of(1, 9), UniformInt.of(0, 3)))
}
item(MItems.ExopackUpgrades.INVENTORY_UPGRADE_PROCEDURAL) {
chanceCondition(0.1)
setWeight(2)
apply(ProceduralExopackSlotUpgradeItem.Randomizer(UniformInt.of(9, 18), UniformInt.of(0, 3)))
}
item(MItems.PROCEDURAL_BATTERY) {
chanceCondition(0.05)
setWeight(1)
apply(
ProceduralBatteryItem.Randomizer(
maxBatteryLevel = UniformDecimal(Decimal(10_000_000), Decimal(50_000_000)),
batteryLevel = UniformDecimal(Decimal(0), Decimal(25_000_000)),
maxInput = UniformDecimal(Decimal(1_000), Decimal(5_000)),
))
}
item(MItems.ZPM_BATTERY) {
chanceCondition(0.001)
setWeight(1)
}
item(MItems.MATTER_DUST) {
chanceCondition(0.1)
setWeight(4)
apply(MatterDustItem.Randomizer(UniformDecimal(Decimal(100), Decimal(2_500))))
}
setRolls(12)
}
}
loot.builder(LootContextParamSets.CHEST, modLootTable("laboratory/supply")) {
lootPool {
item(Items.BREAD) { setCount(minimal = 2, maximal = 3) }
item(Items.HONEY_BOTTLE) { setCount(minimal = 1, maximal = 2) }
item(MItems.NUTRIENT_PASTE) { setCount(minimal = 2, maximal = 3) }
item(Items.SNOWBALL) { setCount(minimal = 1, maximal = 5) }
item(Items.PACKED_ICE) { setCount(minimal = 2, maximal = 3) }
setRolls(7)
}
}
loot.builder(LootContextParamSets.CHEST, modLootTable("laboratory/reward")) {
lootPool {
item(MItems.NUTRIENT_PASTE) { setCount(minimal = 2, maximal = 3) }
setRolls(5)
} }
} }
} }

View File

@ -2,7 +2,6 @@ package ru.dbotthepony.mc.otm.datagen.models
import net.minecraft.world.item.DyeColor import net.minecraft.world.item.DyeColor
import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.Block
import net.minecraft.world.level.block.WaterloggedTransparentBlock
import net.neoforged.neoforge.client.model.generators.BlockModelProvider import net.neoforged.neoforge.client.model.generators.BlockModelProvider
import net.neoforged.neoforge.data.event.GatherDataEvent import net.neoforged.neoforge.data.event.GatherDataEvent
import ru.dbotthepony.mc.otm.datagen.DataGen import ru.dbotthepony.mc.otm.datagen.DataGen
@ -82,6 +81,7 @@ class MatteryBlockModelProvider(event: GatherDataEvent) : BlockModelProvider(eve
} }
} }
} }
fun decorativeCubeAll(subdir: String, vararg blocks: Block) { fun decorativeCubeAll(subdir: String, vararg blocks: Block) {
for (block in blocks) { for (block in blocks) {
exec { exec {

View File

@ -100,10 +100,4 @@ fun addComponentRecipes(consumer: RecipeOutput) {
.row(MItemTags.COPPER_WIRES, MItems.MECHANICAL_PARTS, MItemTags.COPPER_WIRES) .row(MItemTags.COPPER_WIRES, MItems.MECHANICAL_PARTS, MItemTags.COPPER_WIRES)
.unlockedBy(MItems.ELECTROMAGNET) .unlockedBy(MItems.ELECTROMAGNET)
.build(consumer) .build(consumer)
MatteryRecipe(MItems.DISPLAY_SCREEN, 3)
.row(MItemTags.IRON_PLATES, Tags.Items.DUSTS_GLOWSTONE, Tags.Items.GLASS_PANES_COLORLESS)
.row(MItemTags.IRON_PLATES, Tags.Items.DUSTS_REDSTONE, Tags.Items.GLASS_PANES_COLORLESS)
.row(MItemTags.IRON_PLATES, Tags.Items.DUSTS_GLOWSTONE, Tags.Items.GLASS_PANES_COLORLESS)
.build(consumer)
} }

View File

@ -52,8 +52,8 @@ fun addCraftingTableRecipes(consumer: RecipeOutput) {
.save(consumer, modLocation("holo_sign_reset")) .save(consumer, modLocation("holo_sign_reset"))
MatteryRecipe(MBlocks.DRIVE_VIEWER[null]!!, category = machinesCategory) MatteryRecipe(MBlocks.DRIVE_VIEWER[null]!!, category = machinesCategory)
.rowBC(MItems.DISPLAY_SCREEN, Tags.Items.GLASS_PANES) .rowAC(MItemTags.IRON_PLATES, MItemTags.IRON_PLATES)
.row(MItemTags.IRON_PLATES, MItems.MACHINE_FRAME, MItemTags.IRON_PLATES) .row(Tags.Items.DUSTS_GLOWSTONE, MItems.MACHINE_FRAME, Tags.Items.GLASS_BLOCKS)
.row(MItemTags.BASIC_CIRCUIT, MItems.MATTER_IO_PORT, MItemTags.BASIC_CIRCUIT) .row(MItemTags.BASIC_CIRCUIT, MItems.MATTER_IO_PORT, MItemTags.BASIC_CIRCUIT)
.unlockedBy(MItems.MATTER_IO_PORT) .unlockedBy(MItems.MATTER_IO_PORT)
.build(consumer) .build(consumer)
@ -75,9 +75,9 @@ fun addCraftingTableRecipes(consumer: RecipeOutput) {
.build(consumer) .build(consumer)
MatteryRecipe(MBlocks.MATTER_PANEL[null]!!, category = machinesCategory) MatteryRecipe(MBlocks.MATTER_PANEL[null]!!, category = machinesCategory)
.row(MItems.ELECTRIC_PARTS, MItemTags.TRITANIUM_PLATES, Tags.Items.GLASS_PANES) .row(MItems.ELECTRIC_PARTS, MItemTags.TRITANIUM_PLATES, Tags.Items.GLASS_BLOCKS)
.row(MItems.MATTER_CABLE, MItems.DISPLAY_SCREEN, Tags.Items.GLASS_PANES) .row(MItems.MATTER_CABLE, Tags.Items.DUSTS_GLOWSTONE, Tags.Items.GLASS_BLOCKS)
.row(MItemTags.ADVANCED_CIRCUIT, MItemTags.TRITANIUM_PLATES, Tags.Items.GLASS_PANES) .row(MItemTags.ADVANCED_CIRCUIT, MItemTags.TRITANIUM_PLATES, Tags.Items.GLASS_BLOCKS)
.unlockedBy(Tags.Items.GLASS_BLOCKS) .unlockedBy(Tags.Items.GLASS_BLOCKS)
.build(consumer) .build(consumer)
@ -99,7 +99,7 @@ fun addCraftingTableRecipes(consumer: RecipeOutput) {
MatteryRecipe(MBlocks.ENERGY_COUNTER[null]!!, category = machinesCategory) MatteryRecipe(MBlocks.ENERGY_COUNTER[null]!!, category = machinesCategory)
.row(MItemTags.TRITANIUM_PLATES, MItems.ENERGY_BUS, MItemTags.TRITANIUM_PLATES) .row(MItemTags.TRITANIUM_PLATES, MItems.ENERGY_BUS, MItemTags.TRITANIUM_PLATES)
.row(MItemTags.BASIC_CIRCUIT, MItems.DISPLAY_SCREEN, MItemTags.HARDENED_GLASS_PANES) .row(MItemTags.BASIC_CIRCUIT, Tags.Items.DUSTS_GLOWSTONE, MItemTags.HARDENED_GLASS_PANES_COLORLESS)
.row(MItemTags.TRITANIUM_PLATES, MItems.ENERGY_BUS, MItemTags.TRITANIUM_PLATES) .row(MItemTags.TRITANIUM_PLATES, MItems.ENERGY_BUS, MItemTags.TRITANIUM_PLATES)
.unlockedBy(MItems.ENERGY_BUS) .unlockedBy(MItems.ENERGY_BUS)
.build(consumer) .build(consumer)
@ -223,7 +223,7 @@ fun addCraftingTableRecipes(consumer: RecipeOutput) {
.build(consumer) .build(consumer)
MatteryRecipe(MItems.BLACK_HOLE_SCANNER, category = RecipeCategory.TOOLS) MatteryRecipe(MItems.BLACK_HOLE_SCANNER, category = RecipeCategory.TOOLS)
.row(MItemTags.IRON_PLATES, MItems.DISPLAY_SCREEN, MItemTags.IRON_PLATES) .row(MItemTags.IRON_PLATES, Tags.Items.GLASS_PANES_COLORLESS, MItemTags.IRON_PLATES)
.row(MItemTags.GOLD_WIRES, MItems.GRAVITATION_FIELD_SENSOR, MItemTags.ADVANCED_CIRCUIT) .row(MItemTags.GOLD_WIRES, MItems.GRAVITATION_FIELD_SENSOR, MItemTags.ADVANCED_CIRCUIT)
.rowAC(Tags.Items.DUSTS_GLOWSTONE, MItemTags.TRITANIUM_PLATES) .rowAC(Tags.Items.DUSTS_GLOWSTONE, MItemTags.TRITANIUM_PLATES)
.unlockedBy(MItems.GRAVITATION_FIELD_SENSOR) .unlockedBy(MItems.GRAVITATION_FIELD_SENSOR)
@ -585,12 +585,4 @@ fun addCraftingTableRecipes(consumer: RecipeOutput) {
.unlockedBy(MItems.DILITHIUM_CRYSTAL) .unlockedBy(MItems.DILITHIUM_CRYSTAL)
.unlockedBy(MItems.DILITHIUM_CRYSTAL_BLOCK) .unlockedBy(MItems.DILITHIUM_CRYSTAL_BLOCK)
.save(consumer, modLocation("dilithium_crystal/from_block")) .save(consumer, modLocation("dilithium_crystal/from_block"))
MatteryRecipe(MItems.CONFIGURATOR, category = RecipeCategory.TOOLS)
.rowA(MItemTags.IRON_PLATES)
.row(Tags.Items.GLASS_PANES, Tags.Items.DUSTS_REDSTONE, MItems.DISPLAY_SCREEN)
.row(MItemTags.IRON_PLATES, MItemTags.BASIC_CIRCUIT, MItems.DILITHIUM_CRYSTAL)
.unlockedBy(MItems.DILITHIUM_CRYSTAL)
.unlockedBy(MItems.DISPLAY_SCREEN)
.build(consumer)
} }

View File

@ -433,11 +433,11 @@ fun addDecorativesRecipes(provider: MatteryRecipeProvider, consumer: RecipeOutpu
for ((color, item) in MRegistry.COMPUTER_TERMINAL.allItems) { for ((color, item) in MRegistry.COMPUTER_TERMINAL.allItems) {
val builder = MatteryRecipe(item, category = RecipeCategory.DECORATIONS) val builder = MatteryRecipe(item, category = RecipeCategory.DECORATIONS)
builder.row(MItemTags.BASIC_CIRCUIT, MItemTags.TRITANIUM_PLATES, MItemTags.HARDENED_GLASS_PANES_COLORLESS)
if (color != null) { if (color != null) {
builder.rowB(color.tag) builder.rowB(color.tag)
} }
builder.row(MItemTags.TRITANIUM_PLATES, MItems.DISPLAY_SCREEN, MItemTags.HARDENED_GLASS_PANES_COLORLESS)
builder.rowB(MItemTags.BASIC_CIRCUIT)
builder.build(consumer) builder.build(consumer)
} }

View File

@ -1,14 +0,0 @@
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)
}

View File

@ -185,7 +185,6 @@ class TagsProvider(private val event: GatherDataEvent) {
val mobEffects = Delegate(BuiltInRegistries.MOB_EFFECT) val mobEffects = Delegate(BuiltInRegistries.MOB_EFFECT)
val entityTypes = Delegate(BuiltInRegistries.ENTITY_TYPE) val entityTypes = Delegate(BuiltInRegistries.ENTITY_TYPE)
val damageTypes = Delegate(Registries.DAMAGE_TYPE) val damageTypes = Delegate(Registries.DAMAGE_TYPE)
val structures = Delegate(Registries.STRUCTURE)
private val coloredItems = EnumMap<DyeColor, Delegate<Item>.Appender>(DyeColor::class.java) private val coloredItems = EnumMap<DyeColor, Delegate<Item>.Appender>(DyeColor::class.java)

View File

@ -5,11 +5,11 @@ import net.minecraft.world.level.Level;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import ru.dbotthepony.mc.otm.core.IMatteryLevel; import ru.dbotthepony.mc.otm.core.IMatteryLevel;
import ru.dbotthepony.mc.otm.core.util.Xoshiro256SSRandom; import ru.dbotthepony.mc.otm.core.util.CMWCRandom;
@Mixin(Level.class) @Mixin(Level.class)
public abstract class LevelMixin implements IMatteryLevel { public abstract class LevelMixin implements IMatteryLevel {
public final RandomSource otm_random = new Xoshiro256SSRandom(); public final RandomSource otm_random = new CMWCRandom();
@Override @Override
public @NotNull RandomSource getOtmRandom() { public @NotNull RandomSource getOtmRandom() {

View File

@ -243,8 +243,6 @@ object OverdriveThatMatters {
FORGE_BUS.addListener(EventPriority.NORMAL, NotNormalFood::onInteract) FORGE_BUS.addListener(EventPriority.NORMAL, NotNormalFood::onInteract)
FORGE_BUS.addListener(EventPriority.NORMAL, MStructureTags::registerVillagerTrades)
if (isCuriosLoaded) { if (isCuriosLoaded) {
FORGE_BUS.addListener(EventPriority.NORMAL, ::onCuriosSlotModifiersUpdated) FORGE_BUS.addListener(EventPriority.NORMAL, ::onCuriosSlotModifiersUpdated)
} }

View File

@ -96,11 +96,6 @@ abstract class MatteryBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: Bloc
*/ */
protected val savetablesLevel = Savetables() protected val savetablesLevel = Savetables()
/**
* Savetables for things configured from user input
*/
protected val savetablesConfig = Savetables()
/** /**
* "shortcut" for getting [BlockRotation] * "shortcut" for getting [BlockRotation]
* *
@ -274,7 +269,6 @@ abstract class MatteryBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: Bloc
*/ */
open fun saveShared(nbt: CompoundTag, registry: Provider) { open fun saveShared(nbt: CompoundTag, registry: Provider) {
savetables.serializeNBT(nbt, registry) savetables.serializeNBT(nbt, registry)
saveConfiguration(nbt, registry)
} }
/** /**
@ -288,15 +282,6 @@ abstract class MatteryBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: Bloc
super.loadAdditional(nbt, registry) super.loadAdditional(nbt, registry)
savetables.deserializeNBT(registry, nbt) savetables.deserializeNBT(registry, nbt)
savetablesLevel.deserializeNBT(registry, nbt) savetablesLevel.deserializeNBT(registry, nbt)
loadConfiguration(nbt, registry)
}
fun saveConfiguration(nbt: CompoundTag, registry: Provider) {
savetablesConfig.serializeNBT(nbt, registry)
}
fun loadConfiguration(nbt: CompoundTag, registry: Provider) {
savetablesConfig.deserializeNBT(registry, nbt)
} }
@Suppress("OVERRIDE_DEPRECATION") @Suppress("OVERRIDE_DEPRECATION")

View File

@ -56,7 +56,7 @@ abstract class MatteryDeviceBlockEntity(blockEntityType: BlockEntityType<*>, blo
} }
init { init {
savetablesConfig.stateful(::redstoneControl, REDSTONE_CONTROL_KEY) savetables.stateful(::redstoneControl, REDSTONE_CONTROL_KEY)
} }
protected open val defaultDisplayName: Component protected open val defaultDisplayName: Component
@ -146,9 +146,9 @@ abstract class MatteryDeviceBlockEntity(blockEntityType: BlockEntityType<*>, blo
init { init {
// https://tenor.com/view/simp-metal-gear-liquid-snake-running-gif-16717852 // https://tenor.com/view/simp-metal-gear-liquid-snake-running-gif-16717852
savetablesConfig.enum(::flow, "fluid_${side}_flow", FlowDirection::valueOf) savetables.enum(::flow, "fluid_${side}_flow", FlowDirection::valueOf)
savetablesConfig.bool(::automatePull, "fluid_${side}_pull") savetables.bool(::automatePull, "fluid_${side}_pull")
savetablesConfig.bool(::automatePush, "fluid_${side}_push") savetables.bool(::automatePush, "fluid_${side}_push")
} }
var flow by syncher.enum(possibleModes, setter = { access, value -> var flow by syncher.enum(possibleModes, setter = { access, value ->
@ -375,9 +375,9 @@ abstract class MatteryDeviceBlockEntity(blockEntityType: BlockEntityType<*>, blo
} }
init { init {
savetablesConfig.enum(::energyFlow, "energy_${side}_flow", FlowDirection::valueOf) savetables.enum(::energyFlow, "energy_${side}_flow", FlowDirection::valueOf)
savetablesConfig.bool(::automatePull, "energy_${side}_pull") savetables.bool(::automatePull, "energy_${side}_pull")
savetablesConfig.bool(::automatePush, "energy_${side}_push") savetables.bool(::automatePush, "energy_${side}_push")
dirtyListeners.addListener(Runnable { dirtyListeners.addListener(Runnable {
updateTickerState() updateTickerState()
@ -626,9 +626,9 @@ abstract class MatteryDeviceBlockEntity(blockEntityType: BlockEntityType<*>, blo
} }
init { init {
savetablesConfig.bool(::automatePull, "itemhandler_${side}_automatePull") savetables.bool(::automatePull, "itemhandler_${side}_automatePull")
savetablesConfig.bool(::automatePush, "itemhandler_${side}_automatePush") savetables.bool(::automatePush, "itemhandler_${side}_automatePush")
savetablesConfig.enum(::mode, "itemhandler_${side}_mode", ItemHandlerMode::valueOf) savetables.enum(::mode, "itemhandler_${side}_mode", ItemHandlerMode::valueOf)
waitForServerLevel { waitForServerLevel {
redstoneControl.addListener(::updateTickerState) redstoneControl.addListener(::updateTickerState)

View File

@ -73,7 +73,7 @@ abstract class MatteryWorkerBlockEntity<JobType : IJob>(
var balanceInputs = false var balanceInputs = false
init { init {
savetablesConfig.bool(::balanceInputs) savetables.bool(::balanceInputs)
} }
protected open fun jobUpdated(new: JobType?, old: JobType?, id: Int) {} protected open fun jobUpdated(new: JobType?, old: JobType?, id: Int) {}

View File

@ -118,9 +118,9 @@ class BlackHoleGeneratorBlockEntity(blockPos: BlockPos, blockState: BlockState)
exposeSideless(MatteryCapability.BLOCK_ENERGY, energy) exposeSideless(MatteryCapability.BLOCK_ENERGY, energy)
exposeSideless(Capabilities.EnergyStorage.BLOCK, energy) exposeSideless(Capabilities.EnergyStorage.BLOCK, energy)
savetablesConfig.enum(::mode, map = Mode::valueOf) savetables.enum(::mode, map = Mode::valueOf)
savetablesConfig.decimal(::injectionRate) savetables.decimal(::injectionRate)
savetablesConfig.decimal(::targetMass) savetables.decimal(::targetMass)
} }
private fun findBlackHoleRange(): Int { private fun findBlackHoleRange(): Int {

View File

@ -5,7 +5,8 @@ import net.minecraft.core.BlockPos
import net.minecraft.core.HolderLookup import net.minecraft.core.HolderLookup
import net.minecraft.core.registries.Registries import net.minecraft.core.registries.Registries
import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.CompoundTag
import net.minecraft.nbt.Tag import net.minecraft.nbt.LongTag
import net.minecraft.nbt.StringTag
import net.minecraft.network.chat.Component import net.minecraft.network.chat.Component
import net.minecraft.resources.ResourceKey import net.minecraft.resources.ResourceKey
import net.minecraft.resources.ResourceLocation import net.minecraft.resources.ResourceLocation
@ -32,6 +33,8 @@ import ru.dbotthepony.mc.otm.block.entity.MatteryDeviceBlockEntity
import ru.dbotthepony.mc.otm.container.MatteryContainer import ru.dbotthepony.mc.otm.container.MatteryContainer
import ru.dbotthepony.mc.otm.container.HandlerFilter import ru.dbotthepony.mc.otm.container.HandlerFilter
import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.core.TranslatableComponent
import ru.dbotthepony.mc.otm.core.nbt.map
import ru.dbotthepony.mc.otm.core.nbt.set
import ru.dbotthepony.mc.otm.core.otmRandom import ru.dbotthepony.mc.otm.core.otmRandom
import ru.dbotthepony.mc.otm.menu.decorative.CargoCrateMenu import ru.dbotthepony.mc.otm.menu.decorative.CargoCrateMenu
import ru.dbotthepony.mc.otm.registry.game.MBlockEntities import ru.dbotthepony.mc.otm.registry.game.MBlockEntities
@ -92,20 +95,14 @@ class CargoCrateBlockEntity(
override fun saveLevel(nbt: CompoundTag, registry: HolderLookup.Provider) { override fun saveLevel(nbt: CompoundTag, registry: HolderLookup.Provider) {
super.saveLevel(nbt, registry) super.saveLevel(nbt, registry)
lootTable?.let { nbt[LOOT_TABLE_KEY] = it.toString() }
if (lootTable != null) { lootTableSeed?.let { nbt[LOOT_TABLE_SEED_KEY] = it }
nbt.putString(LOOT_TABLE_KEY, lootTable!!.location().toString())
nbt.putLong(LOOT_TABLE_SEED_KEY, lootTableSeed ?: 0L)
}
} }
override fun loadAdditional(nbt: CompoundTag, registry: HolderLookup.Provider) { override fun loadAdditional(nbt: CompoundTag, registry: HolderLookup.Provider) {
super.loadAdditional(nbt, registry) super.loadAdditional(nbt, registry)
lootTable = nbt.map(LOOT_TABLE_KEY) { it: StringTag -> ResourceLocation.tryParse(it.asString)?.let { ResourceKey.create(Registries.LOOT_TABLE, it) } }
if (nbt.contains(LOOT_TABLE_KEY, Tag.TAG_STRING.toInt())) { lootTableSeed = (nbt[LOOT_TABLE_SEED_KEY] as LongTag?)?.asLong
lootTable = ResourceKey.create(Registries.LOOT_TABLE, ResourceLocation.tryParse(nbt.getString(LOOT_TABLE_KEY)))
lootTableSeed = if (nbt.contains(LOOT_TABLE_SEED_KEY, Tag.TAG_LONG.toInt())) nbt.getLong(LOOT_TABLE_SEED_KEY) else 0L
}
} }
fun unpackLootTable(ply: Player? = null) { fun unpackLootTable(ply: Player? = null) {

View File

@ -192,8 +192,6 @@ class GrillBlockEntity(blockPos: BlockPos, blockState: BlockState) : MatteryBloc
level!!.setBlock(blockPos, blockState.set(GrillBlock.STATE_PROPERTY, GrillBlock.State.FUELED), Block.UPDATE_ALL) level!!.setBlock(blockPos, blockState.set(GrillBlock.STATE_PROPERTY, GrillBlock.State.FUELED), Block.UPDATE_ALL)
} }
} }
markDirtyFast()
} else { } else {
fuelTotalTicks = 0 fuelTotalTicks = 0

View File

@ -61,25 +61,19 @@ class HoloSignBlockEntity(blockPos: BlockPos, blockState: BlockState) : MatteryB
access.accept(value) access.accept(value)
}).delegate }).delegate
var smallerFont by syncher.boolean(false, setter = { access, value ->
setChanged()
access.accept(value)
}).delegate
var isLocked = false var isLocked = false
init { init {
savetablesConfig.string(::signText) savetables.string(::signText)
savetablesLevel.bool(::isLocked) savetablesLevel.bool(::isLocked)
savetablesConfig.stateful(::redstoneControl) savetables.stateful(::redstoneControl)
savetablesConfig.float(::textRed) savetables.float(::textRed)
savetablesConfig.float(::textGreen) savetables.float(::textGreen)
savetablesConfig.float(::textBlue) savetables.float(::textBlue)
savetablesConfig.float(::textAlpha) savetables.float(::textAlpha)
savetablesConfig.bool(::textAutoScale) savetables.bool(::textAutoScale)
savetablesConfig.bool(::smallerFont)
} }
override fun createMenu(p_39954_: Int, p_39955_: Inventory, p_39956_: Player): AbstractContainerMenu { override fun createMenu(p_39954_: Int, p_39955_: Inventory, p_39956_: Player): AbstractContainerMenu {

View File

@ -82,7 +82,7 @@ class PainterBlockEntity(blockPos: BlockPos, blockState: BlockState) : MatteryDe
init { init {
addDroppableContainer(dyeInput) addDroppableContainer(dyeInput)
savetables.stateful(dyeInput, INVENTORY_KEY) savetables.stateful(dyeInput, INVENTORY_KEY)
savetablesConfig.bool(::isBulk) savetables.bool(::isBulk)
exposeGlobally(Capabilities.FluidHandler.BLOCK, this) exposeGlobally(Capabilities.FluidHandler.BLOCK, this)
} }

View File

@ -112,8 +112,8 @@ class MatterBottlerBlockEntity(blockPos: BlockPos, blockState: BlockState) :
exposeGlobally(MatteryCapability.MATTER_BLOCK, matter) exposeGlobally(MatteryCapability.MATTER_BLOCK, matter)
exposeGlobally(MatteryCapability.MATTER_NODE, matterNode) exposeGlobally(MatteryCapability.MATTER_NODE, matterNode)
savetablesConfig.bool(::isBottling) savetables.bool(::isBottling)
savetablesConfig.bool(::spitItemsWhenCantWork) savetables.bool(::spitItemsWhenCantWork)
savetables.stateful(::energy, ENERGY_KEY) savetables.stateful(::energy, ENERGY_KEY)
savetables.stateful(::matter, MATTER_STORAGE_KEY) savetables.stateful(::matter, MATTER_STORAGE_KEY)
savetables.stateful(::bottling) savetables.stateful(::bottling)

View File

@ -84,7 +84,7 @@ class MatterPanelBlockEntity(blockPos: BlockPos, blockState: BlockState) : Matte
exposeGlobally(MatteryCapability.MATTER_NODE, matterNode) exposeGlobally(MatteryCapability.MATTER_NODE, matterNode)
exposeGlobally(MatteryCapability.REPLICATION_TASK, this) exposeGlobally(MatteryCapability.REPLICATION_TASK, this)
savetablesConfig.bool(::isProvidingTasks) savetables.bool(::isProvidingTasks)
} }
override fun setLevel(level: Level) { override fun setLevel(level: Level) {

View File

@ -63,9 +63,9 @@ class DriveRackBlockEntity(blockPos: BlockPos, blockState: BlockState) : Mattery
savetables.stateful(::energy, ENERGY_KEY) savetables.stateful(::energy, ENERGY_KEY)
savetables.stateful(::container, INVENTORY_KEY) savetables.stateful(::container, INVENTORY_KEY)
exposeGlobally(MatteryCapability.STORAGE_NODE, cell) exposeGlobally(MatteryCapability.STORAGE_NODE, cell)
savetablesConfig.int(::insertPriority) savetables.int(::insertPriority)
savetablesConfig.int(::extractPriority) savetables.int(::extractPriority)
savetablesConfig.enum(::mode, map = FlowDirection::valueOf) savetables.enum(::mode, map = FlowDirection::valueOf)
redstoneControl.addListener(Consumer { redstoneControl.addListener(Consumer {
cell.isDetached = it cell.isDetached = it

View File

@ -131,7 +131,7 @@ class StorageBusBlockEntity(blockPos: BlockPos, blockState: BlockState) : Matter
} }
init { init {
savetablesConfig.codec(::filter, ItemFilter.CODEC, FILTER_KEY, Supplier { ItemFilter(MAX_FILTERS) }) savetables.codec(::filter, ItemFilter.CODEC, FILTER_KEY, Supplier { ItemFilter(MAX_FILTERS) })
} }
override fun setLevel(level: Level) { override fun setLevel(level: Level) {

View File

@ -112,7 +112,7 @@ abstract class AbstractStorageImportExport(
} }
init { init {
savetablesConfig.codec(::filter, ItemFilter.CODEC, FILTER_KEY, Supplier { ItemFilter(MAX_FILTERS) }) savetables.codec(::filter, ItemFilter.CODEC, FILTER_KEY, Supplier { ItemFilter(MAX_FILTERS) })
} }
companion object { companion object {

View File

@ -17,8 +17,6 @@ import ru.dbotthepony.mc.otm.capability.energy.WorkerEnergyStorage
import ru.dbotthepony.mc.otm.capability.matteryPlayer import ru.dbotthepony.mc.otm.capability.matteryPlayer
import ru.dbotthepony.mc.otm.config.MachinesConfig import ru.dbotthepony.mc.otm.config.MachinesConfig
import ru.dbotthepony.mc.otm.core.getEntitiesInEllipsoid import ru.dbotthepony.mc.otm.core.getEntitiesInEllipsoid
import ru.dbotthepony.mc.otm.core.otmRandom
import ru.dbotthepony.mc.otm.core.shuffle
import ru.dbotthepony.mc.otm.menu.tech.AndroidChargerMenu import ru.dbotthepony.mc.otm.menu.tech.AndroidChargerMenu
import ru.dbotthepony.mc.otm.registry.game.MBlockEntities import ru.dbotthepony.mc.otm.registry.game.MBlockEntities
@ -37,14 +35,13 @@ class AndroidChargerBlockEntity(blockPos: BlockPos, blockState: BlockState) : Ma
override fun tick() { override fun tick() {
super.tick() super.tick()
if (redstoneControl.isBlockedByRedstone) return
val level = level ?: return val level = level ?: return
var available = energyConfig.energy.extractEnergy(energyConfig.energy.batteryLevel, true) var available = energyConfig.energy.extractEnergy(energyConfig.energy.batteryLevel, true)
if (!available.isPositive) return if (!available.isPositive) return
val ents = level.getEntitiesInEllipsoid(blockPos.center, Vec3(MachinesConfig.AndroidCharger.RADIUS_WIDTH, MachinesConfig.AndroidCharger.RADIUS_HEIGHT, MachinesConfig.AndroidCharger.RADIUS_WIDTH)) { it is Player } val ents = level.getEntitiesInEllipsoid(blockPos.center, Vec3(MachinesConfig.AndroidCharger.RADIUS_WIDTH, MachinesConfig.AndroidCharger.RADIUS_HEIGHT, MachinesConfig.AndroidCharger.RADIUS_WIDTH)) { it is Player }
ents.shuffle(level.otmRandom) ents.sort()
for ((ent) in ents) { for ((ent) in ents) {
val ply = (ent as Player).matteryPlayer val ply = (ent as Player).matteryPlayer

View File

@ -78,7 +78,7 @@ class EnergyCounterBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : Mat
} }
init { init {
savetablesConfig.int(::displayChartOnBlock) savetables.int(::displayChartOnBlock)
savetables.stateful(::history5s) savetables.stateful(::history5s)
savetables.stateful(::history15s) savetables.stateful(::history15s)
savetables.stateful(::history1m) savetables.stateful(::history1m)

View File

@ -37,13 +37,6 @@ class FlywheelBatteryBlockEntity(blockPos: BlockPos, blockState: BlockState) : M
private var multiblock: ShapedMultiblock? = null private var multiblock: ShapedMultiblock? = null
private var lastHeight = -1 private var lastHeight = -1
var batteryLevel = Decimal.ZERO var batteryLevel = Decimal.ZERO
set(value) {
if (field != value) {
field = value
markDirtyFast()
}
}
private var cachedChargeEfficiency = Decimal.ONE private var cachedChargeEfficiency = Decimal.ONE
val formed: Boolean val formed: Boolean

View File

@ -12,7 +12,6 @@ import net.minecraft.client.gui.screens.DeathScreen
import net.minecraft.client.gui.screens.InBedChatScreen import net.minecraft.client.gui.screens.InBedChatScreen
import net.minecraft.client.player.LocalPlayer import net.minecraft.client.player.LocalPlayer
import net.minecraft.network.chat.Component import net.minecraft.network.chat.Component
import net.minecraft.network.chat.Style
import net.minecraft.world.effect.MobEffects import net.minecraft.world.effect.MobEffects
import net.minecraft.world.entity.LivingEntity import net.minecraft.world.entity.LivingEntity
import net.minecraft.world.entity.player.Player import net.minecraft.world.entity.player.Player
@ -113,10 +112,6 @@ object MatteryGUI {
event.registerAbove(VanillaGuiLayers.CAMERA_OVERLAYS, loc("android_low_power"), AndroidLowPowerLayer()) event.registerAbove(VanillaGuiLayers.CAMERA_OVERLAYS, loc("android_low_power"), AndroidLowPowerLayer())
} }
val SMALL_FONT = loc("small")
val SMALL_FONT_STYLE: Style = Style.EMPTY.withFont(SMALL_FONT)
val STANDARD_FONT_STYLE: Style = Style.EMPTY
class AndroidEnergyBarLayer : LayeredDraw.Layer { class AndroidEnergyBarLayer : LayeredDraw.Layer {
override fun render( override fun render(
graphics: GuiGraphics, graphics: GuiGraphics,
@ -168,8 +163,9 @@ object MatteryGUI {
} }
val formattedPower = mattery.androidEnergy.batteryLevel.formatPower() val formattedPower = mattery.androidEnergy.batteryLevel.formatPower()
val scale = if (ClientConfig.HUD.USE_SMALL_FONT) 1f else ClientConfig.HUD.BAR_TEXT_SCALE.toFloat()
guiGraphics.draw(formattedPower.withStyle(if (ClientConfig.HUD.USE_SMALL_FONT) SMALL_FONT_STYLE else STANDARD_FONT_STYLE), left + CHARGE_BG.width + 2f + scale, top + CHARGE_BG.height / 2f + scale, font = gui.font, scale = scale, gravity = RenderGravity.CENTER_LEFT, color = RGBAColor.FULL_POWER, drawOutline = true) val scale = ClientConfig.HUD.BAR_TEXT_SCALE.toFloat()
guiGraphics.draw(formattedPower, left + CHARGE_BG.width + 2f + scale, top + CHARGE_BG.height / 2f + scale, font = gui.font, scale = scale, gravity = RenderGravity.CENTER_LEFT, color = RGBAColor.YELLOW, drawOutline = true)
RenderSystem.disableBlend() RenderSystem.disableBlend()
RenderSystem.enableDepthTest() RenderSystem.enableDepthTest()
@ -234,8 +230,8 @@ object MatteryGUI {
if (ply.absorptionAmount > 0) if (ply.absorptionAmount > 0)
formattedHealth = TextComponent("%d+%d/%d".format(ply.health.toInt(), ply.absorptionAmount.toInt(), ply.maxHealth.toInt())) formattedHealth = TextComponent("%d+%d/%d".format(ply.health.toInt(), ply.absorptionAmount.toInt(), ply.maxHealth.toInt()))
val scale = if (ClientConfig.HUD.USE_SMALL_FONT) 1f else ClientConfig.HUD.BAR_TEXT_SCALE.toFloat() val scale = ClientConfig.HUD.BAR_TEXT_SCALE.toFloat()
guiGraphics.draw(formattedHealth.withStyle(if (ClientConfig.HUD.USE_SMALL_FONT) SMALL_FONT_STYLE else STANDARD_FONT_STYLE), left - 2f, top + HEALTH_BG.height / 2f + 1f * scale, scale = scale, gravity = RenderGravity.CENTER_RIGHT, color = getHealthColorForPlayer(ply), drawOutline = true) guiGraphics.draw(formattedHealth, left - 2f, top + HEALTH_BG.height / 2f + 1f * scale, scale = scale, gravity = RenderGravity.CENTER_RIGHT, color = getHealthColorForPlayer(ply), drawOutline = true)
RenderSystem.disableBlend() RenderSystem.disableBlend()
RenderSystem.enableDepthTest() RenderSystem.enableDepthTest()

View File

@ -4,7 +4,6 @@ import com.mojang.blaze3d.vertex.PoseStack
import net.minecraft.client.renderer.MultiBufferSource import net.minecraft.client.renderer.MultiBufferSource
import net.minecraft.client.renderer.blockentity.BlockEntityRenderer import net.minecraft.client.renderer.blockentity.BlockEntityRenderer
import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider
import net.minecraft.network.chat.MutableComponent
import ru.dbotthepony.mc.otm.block.entity.decorative.HoloSignBlockEntity import ru.dbotthepony.mc.otm.block.entity.decorative.HoloSignBlockEntity
import ru.dbotthepony.mc.otm.client.font import ru.dbotthepony.mc.otm.client.font
import ru.dbotthepony.mc.otm.client.render.DynamicBufferSource import ru.dbotthepony.mc.otm.client.render.DynamicBufferSource
@ -13,9 +12,6 @@ import ru.dbotthepony.mc.otm.client.render.draw
import ru.dbotthepony.mc.otm.core.get import ru.dbotthepony.mc.otm.core.get
import ru.dbotthepony.mc.otm.core.math.BlockRotationFreedom import ru.dbotthepony.mc.otm.core.math.BlockRotationFreedom
import ru.dbotthepony.kommons.math.RGBAColor import ru.dbotthepony.kommons.math.RGBAColor
import ru.dbotthepony.mc.otm.client.MatteryGUI.SMALL_FONT_STYLE
import ru.dbotthepony.mc.otm.client.MatteryGUI.STANDARD_FONT_STYLE
import ru.dbotthepony.mc.otm.core.TextComponent
import ru.dbotthepony.mc.otm.core.math.rotateWithBlockFacing import ru.dbotthepony.mc.otm.core.math.rotateWithBlockFacing
class HoloSignRenderer(private val context: BlockEntityRendererProvider.Context) : BlockEntityRenderer<HoloSignBlockEntity> { class HoloSignRenderer(private val context: BlockEntityRendererProvider.Context) : BlockEntityRenderer<HoloSignBlockEntity> {
@ -35,8 +31,7 @@ class HoloSignRenderer(private val context: BlockEntityRendererProvider.Context)
poseStack.translate(0.5f, 0.5f, 0.75f) poseStack.translate(0.5f, 0.5f, 0.75f)
poseStack.scale(0.01f, 0.01f, 0.01f) poseStack.scale(0.01f, 0.01f, 0.01f)
val style = if (tile.smallerFont) SMALL_FONT_STYLE else STANDARD_FONT_STYLE val lines = tile.signText.split('\n')
val lines: List<MutableComponent> = tile.signText.split('\n').map { TextComponent(it).withStyle(style) }
val totalHeight = lines.size * font.lineHeight + (lines.size - 1) * 2f val totalHeight = lines.size * font.lineHeight + (lines.size - 1) * 2f
var y = -totalHeight / 2f var y = -totalHeight / 2f

View File

@ -11,8 +11,6 @@ import ru.dbotthepony.mc.otm.client.screen.panels.input.NetworkedStringInputPane
import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.core.TranslatableComponent
import ru.dbotthepony.kommons.math.RGBAColor import ru.dbotthepony.kommons.math.RGBAColor
import ru.dbotthepony.mc.otm.block.entity.decorative.HoloSignBlockEntity import ru.dbotthepony.mc.otm.block.entity.decorative.HoloSignBlockEntity
import ru.dbotthepony.mc.otm.client.MatteryGUI.SMALL_FONT_STYLE
import ru.dbotthepony.mc.otm.client.render.TextIcon
import ru.dbotthepony.mc.otm.client.render.Widgets18 import ru.dbotthepony.mc.otm.client.render.Widgets18
import ru.dbotthepony.mc.otm.client.screen.panels.button.BooleanButtonPanel import ru.dbotthepony.mc.otm.client.screen.panels.button.BooleanButtonPanel
import ru.dbotthepony.mc.otm.client.screen.panels.button.ButtonPanel import ru.dbotthepony.mc.otm.client.screen.panels.button.ButtonPanel
@ -86,16 +84,6 @@ class HoloSignScreen(menu: HoloSignMenu, inventory: Inventory, title: Component)
tooltipInactive = TranslatableComponent("otm.gui.lock_holo_screen.unlocked") tooltipInactive = TranslatableComponent("otm.gui.lock_holo_screen.unlocked")
)) ))
controls.addButton(BooleanButtonPanel.square18(
this@HoloSignScreen,
frame,
prop = menu.smallerFont,
iconActive = TextIcon(font = font, text = TranslatableComponent("otm.gui.abc").withStyle(SMALL_FONT_STYLE)),
iconInactive = TextIcon(font = font, text = TranslatableComponent("otm.gui.abc")),
tooltipActive = TranslatableComponent("otm.gui.use_small_font"),
tooltipInactive = TranslatableComponent("otm.gui.use_standard_font")
))
return frame return frame
} }
} }

View File

@ -69,10 +69,6 @@ object ClientConfig : AbstractConfig("client", ModConfig.Type.CLIENT) {
var BAR_TEXT_SCALE: Double by builder var BAR_TEXT_SCALE: Double by builder
.defineInRange("BAR_TEXT_SCALE", 0.5, 0.5, 1.0) .defineInRange("BAR_TEXT_SCALE", 0.5, 0.5, 1.0)
var USE_SMALL_FONT: Boolean by builder
.comment("Use smaller font on HUD bars", "(Scale is ignored)")
.define("USE_SMALL_FONT", false)
init { init {
builder.pop() builder.pop()
} }

View File

@ -1,14 +1,12 @@
package ru.dbotthepony.mc.otm.config package ru.dbotthepony.mc.otm.config
import ru.dbotthepony.mc.otm.item.weapon.EnergySwordItem import ru.dbotthepony.mc.otm.item.weapon.EnergySwordItem
import ru.dbotthepony.mc.otm.item.weapon.FallingSunItem
object ToolsConfig : AbstractConfig("tools") { object ToolsConfig : AbstractConfig("tools") {
val AXES_BREAK_LEAVES_INSTANTLY: Boolean by builder.define("AXES_BREAK_LEAVES_INSTANTLY", true) val AXES_BREAK_LEAVES_INSTANTLY: Boolean by builder.define("AXES_BREAK_LEAVES_INSTANTLY", true)
init { init {
EnergySwordItem.registerConfig(builder) EnergySwordItem.registerConfig(builder)
FallingSunItem.registerConfig(builder)
} }
object ExplosiveHammer { object ExplosiveHammer {

View File

@ -188,6 +188,24 @@ fun <T : Enum<T>> T.prev(values: Array<out T>): T {
return values[next] 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 <T> MutableList<T>.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) { fun IntArray.shuffle(random: RandomSource) {
for (i in lastIndex downTo 1) { for (i in lastIndex downTo 1) {
val j = random.nextInt(i + 1) val j = random.nextInt(i + 1)
@ -198,7 +216,12 @@ fun IntArray.shuffle(random: RandomSource) {
} }
fun <T> MutableList<T>.shuffle(random: RandomSource) { fun <T> MutableList<T>.shuffle(random: RandomSource) {
return Util.shuffle(this, random) for (i in lastIndex downTo 1) {
val j = random.nextInt(i + 1)
val copy = this[i]
this[i] = this[j]
this[j] = copy
}
} }
fun <T> List<T>.random(random: RandomGenerator): T { fun <T> List<T>.random(random: RandomGenerator): T {

View File

@ -4,41 +4,40 @@ import net.minecraft.util.Mth
import net.minecraft.util.RandomSource import net.minecraft.util.RandomSource
import net.minecraft.world.level.levelgen.MarsagliaPolarGaussian import net.minecraft.world.level.levelgen.MarsagliaPolarGaussian
import net.minecraft.world.level.levelgen.PositionalRandomFactory import net.minecraft.world.level.levelgen.PositionalRandomFactory
import net.minecraft.world.level.levelgen.RandomSupport
import java.lang.StringBuilder import java.lang.StringBuilder
import java.util.random.RandomGenerator import java.util.random.RandomGenerator
/** class CMWCRandom(seed: Long = System.nanoTime(), private val stateSize: Int = CMWC_DEFAULT_STATE_SIZE) : RandomGenerator, RandomSource {
* Random number generator with insane period of at least 2^511 private val state = IntArray(stateSize)
*/
class CMWCRandom(seed: Long = RandomSupport.generateUniqueSeed()) : RandomGenerator, RandomSource {
private val state = IntArray(CMWC_STATE_SIZE)
private var carry = 0 private var carry = 0
private var stateIndex = 0 private var stateIndex = 0
private val gaussian = MarsagliaPolarGaussian(this) private val gaussian = MarsagliaPolarGaussian(this)
var seed: Long = seed
private set
init { init {
setSeed(seed) setSeed(seed)
} }
override fun setSeed(seed: Long) { override fun setSeed(seed: Long) {
val rng = LCG64Random(seed) this.seed = seed
carry = Integer.remainderUnsigned(seed.toInt(), CMWC_CARRY_MAX)
// init state with regular LCG produced values // init state with regular LCG produced values
for (i in 1 until state.size) { state[0] = seed.toInt()
state[i] = rng.nextInt() state[1] = seed.shr(32).toInt()
}
do { for (i in 2 until state.size) {
carry = rng.nextInt() state[i] = 69069 * state[i - 2] + 362437
} while(carry !in 0 until CMWC_CARRY_MAX) }
stateIndex = state.size - 1 stateIndex = state.size - 1
gaussian.reset() gaussian.reset()
} }
override fun nextInt(): Int { override fun nextInt(): Int {
stateIndex = (stateIndex + 1).and(CMWC_STATE_SIZE - 1) stateIndex = (stateIndex + 1) % state.size
val t = 18782L * state[stateIndex] + carry val t = 18782L * state[stateIndex] + carry
carry = t.ushr(32).toInt() carry = t.ushr(32).toInt()
@ -84,24 +83,24 @@ class CMWCRandom(seed: Long = RandomSupport.generateUniqueSeed()) : RandomGenera
} }
override fun fork(): RandomSource { override fun fork(): RandomSource {
return CMWCRandom(nextLong()) return CMWCRandom(nextLong(), stateSize)
} }
override fun forkPositional(): PositionalRandomFactory { override fun forkPositional(): PositionalRandomFactory {
return Positional(nextLong()) return Positional(nextLong(), stateSize)
} }
class Positional(val seed: Long) : PositionalRandomFactory { class Positional(val seed: Long, val stateSize: Int = CMWC_DEFAULT_STATE_SIZE) : PositionalRandomFactory {
override fun at(x: Int, y: Int, z: Int): RandomSource { override fun at(x: Int, y: Int, z: Int): RandomSource {
return CMWCRandom(Mth.getSeed(x, y, z).xor(seed)) return CMWCRandom(Mth.getSeed(x, y, z).xor(seed), stateSize)
} }
override fun fromHashOf(name: String): RandomSource { override fun fromHashOf(name: String): RandomSource {
return CMWCRandom(name.hashCode().toLong().xor(seed)) return CMWCRandom(name.hashCode().toLong().xor(seed), stateSize)
} }
override fun fromSeed(seed: Long): RandomSource { override fun fromSeed(seed: Long): RandomSource {
return CMWCRandom(seed) return CMWCRandom(seed, stateSize)
} }
override fun parityConfigString(builder: StringBuilder) { override fun parityConfigString(builder: StringBuilder) {
@ -110,7 +109,7 @@ class CMWCRandom(seed: Long = RandomSupport.generateUniqueSeed()) : RandomGenera
} }
companion object { companion object {
const val CMWC_STATE_SIZE = 32 // 4096 const val CMWC_DEFAULT_STATE_SIZE = 256 // 4096
const val CMWC_CARRY_MAX = 809430660 const val CMWC_CARRY_MAX = 809430660
} }
} }

View File

@ -25,7 +25,7 @@ import kotlin.math.absoluteValue
import kotlin.math.max import kotlin.math.max
import kotlin.math.roundToInt import kotlin.math.roundToInt
private fun concat(numbers: String, suffix: Any): MutableComponent { private fun concat(numbers: String, suffix: Any): Component {
if (suffix == "") if (suffix == "")
return TextComponent(numbers) return TextComponent(numbers)
else if (suffix is Component) else if (suffix is Component)
@ -177,7 +177,7 @@ private fun resplice(number: String, decimals: Int): String {
return String(resplice) return String(resplice)
} }
fun Long.formatSiComponent(suffix: Any = "", decimalPlaces: Int = 3, formatAsReadable: BooleanSupplier = never, bias: Int = 0): MutableComponent { fun Long.formatSiComponent(suffix: Any = "", decimalPlaces: Int = 3, formatAsReadable: BooleanSupplier = never, bias: Int = 0): Component {
require(decimalPlaces >= 0) { "Invalid amount of decimal places required: $decimalPlaces" } require(decimalPlaces >= 0) { "Invalid amount of decimal places required: $decimalPlaces" }
if (formatAsReadable.asBoolean) { if (formatAsReadable.asBoolean) {
@ -193,18 +193,18 @@ fun Long.formatSiComponent(suffix: Any = "", decimalPlaces: Int = 3, formatAsRea
return TranslatableComponent(prefix.neighbour(bias).formatLocaleKey, "%.${decimalPlaces}f".format(this.toDouble() / prefix.long!!.toDouble()), suffix) return TranslatableComponent(prefix.neighbour(bias).formatLocaleKey, "%.${decimalPlaces}f".format(this.toDouble() / prefix.long!!.toDouble()), suffix)
} }
fun Int.formatSiComponent(suffix: Any = "", decimalPlaces: Int = 3, formatAsReadable: BooleanSupplier = never, bias: Int = 0): MutableComponent { fun Int.formatSiComponent(suffix: Any = "", decimalPlaces: Int = 3, formatAsReadable: BooleanSupplier = never, bias: Int = 0): Component {
return toLong().formatSiComponent(suffix, decimalPlaces, formatAsReadable, bias) return toLong().formatSiComponent(suffix, decimalPlaces, formatAsReadable, bias)
} }
fun Double.formatSiComponent(suffix: Any = "", decimalPlaces: Int = 3, formatAsReadable: BooleanSupplier = never, bias: Int = 0): MutableComponent { fun Double.formatSiComponent(suffix: Any = "", decimalPlaces: Int = 3, formatAsReadable: BooleanSupplier = never, bias: Int = 0): Component {
require(decimalPlaces >= 0) { "Invalid amount of decimal places required: $decimalPlaces" } require(decimalPlaces >= 0) { "Invalid amount of decimal places required: $decimalPlaces" }
if (formatAsReadable.asBoolean && this.absoluteValue >= 1.0) return concat(reformat("%.${decimalPlaces}f".format(this)), suffix) if (formatAsReadable.asBoolean && this.absoluteValue >= 1.0) return concat(reformat("%.${decimalPlaces}f".format(this)), suffix)
val prefix = SiPrefix.determine(this) val prefix = SiPrefix.determine(this)
return TranslatableComponent(prefix.neighbour(bias).formatLocaleKey, "%.${decimalPlaces}f".format(this / prefix.double), suffix) return TranslatableComponent(prefix.neighbour(bias).formatLocaleKey, "%.${decimalPlaces}f".format(this / prefix.double), suffix)
} }
fun Decimal.formatSiComponent(suffix: Any = "", decimalPlaces: Int = 3, formatAsReadable: BooleanSupplier = never, bias: Int = 0): MutableComponent { fun Decimal.formatSiComponent(suffix: Any = "", decimalPlaces: Int = 3, formatAsReadable: BooleanSupplier = never, bias: Int = 0): Component {
require(decimalPlaces >= 0) { "Invalid amount of decimal places required: $decimalPlaces" } require(decimalPlaces >= 0) { "Invalid amount of decimal places required: $decimalPlaces" }
if (this == Decimal.POSITIVE_INFINITY) return concat("", suffix) if (this == Decimal.POSITIVE_INFINITY) return concat("", suffix)
if (this == Decimal.NEGATIVE_INFINITY) return concat("-∞", suffix) if (this == Decimal.NEGATIVE_INFINITY) return concat("-∞", suffix)

View File

@ -1,95 +0,0 @@
package ru.dbotthepony.mc.otm.core.util
import net.minecraft.util.Mth
import net.minecraft.util.RandomSource
import net.minecraft.world.level.levelgen.LegacyRandomSource
import net.minecraft.world.level.levelgen.MarsagliaPolarGaussian
import net.minecraft.world.level.levelgen.PositionalRandomFactory
import net.minecraft.world.level.levelgen.RandomSupport
import java.lang.StringBuilder
import java.util.random.RandomGenerator
/**
* Simple and insanely fast random number generator, which can be used for seeding (initializing internal state) of other number generators.
*
* While can be used on its own, it probably shouldn't.
*
* Differs from [LegacyRandomSource] (also LCG, created by [RandomSource.create]) Minecraft uses in:
* * Different constants (with supposedly/expected better statistical properties)
* * Always use upper 32 bits instead of implementing BitRandomSource and sampling some upper bits
* * Uses all bits from provided seed
*/
class LCG64Random(private var seed: Long = RandomSupport.generateUniqueSeed()) : RandomGenerator, RandomSource {
private val gaussian = MarsagliaPolarGaussian(this)
override fun setSeed(seed: Long) {
this.seed = seed
gaussian.reset()
}
override fun nextInt(): Int {
this.seed = MULTIPLIER * this.seed + INCREMENT
return this.seed.ushr(32).toInt()
}
override fun nextLong(): Long {
val a = nextInt().toLong() and 0xFFFFFFFFL
val b = nextInt().toLong() and 0xFFFFFFFFL
return a.shl(32) or b
}
override fun nextInt(bound: Int): Int {
return super<RandomGenerator>.nextInt(bound)
}
override fun nextInt(origin: Int, bound: Int): Int {
return super<RandomGenerator>.nextInt(origin, bound)
}
override fun nextBoolean(): Boolean {
return super.nextBoolean()
}
override fun nextFloat(): Float {
return super.nextFloat()
}
override fun nextDouble(): Double {
return super.nextDouble()
}
override fun nextGaussian(): Double {
return gaussian.nextGaussian()
}
override fun fork(): RandomSource {
return LCG64Random(nextLong())
}
override fun forkPositional(): PositionalRandomFactory {
return Positional(nextLong())
}
class Positional(val seed: Long) : PositionalRandomFactory {
override fun at(x: Int, y: Int, z: Int): RandomSource {
return LCG64Random(Mth.getSeed(x, y, z).xor(seed))
}
override fun fromHashOf(name: String): RandomSource {
return LCG64Random(name.hashCode().toLong().xor(seed))
}
override fun fromSeed(seed: Long): RandomSource {
return LCG64Random(seed)
}
override fun parityConfigString(builder: StringBuilder) {
throw UnsupportedOperationException()
}
}
companion object {
const val MULTIPLIER = 6364136223846793005
const val INCREMENT = 1442695040888963407
}
}

View File

@ -1,132 +0,0 @@
package ru.dbotthepony.mc.otm.core.util
import it.unimi.dsi.fastutil.HashCommon
import net.minecraft.util.Mth
import net.minecraft.util.RandomSource
import net.minecraft.world.level.levelgen.MarsagliaPolarGaussian
import net.minecraft.world.level.levelgen.PositionalRandomFactory
import net.minecraft.world.level.levelgen.RandomSupport
import java.lang.StringBuilder
import java.util.random.RandomGenerator
/**
* Excellent number generator with guaranteed period of 2^255
*/
class Xoshiro256SSRandom private constructor(
private var s0: Long,
private var s1: Long,
private var s2: Long,
private var s3: Long,
marker: Nothing?
) : RandomGenerator, RandomSource {
private val gaussian = MarsagliaPolarGaussian(this)
init {
require(
s0 != 0L ||
s1 != 0L ||
s2 != 0L ||
s3 != 0L
) { "Xoshiro can't operate with seed being entirely zero" }
}
constructor(s0: Long, s1: Long, s2: Long, s3: Long) : this(s0, s1, s2, s3, null) {
// discard some values so generator can get going if provided seed was "weak"
for (i in 0 until 32)
nextLong()
}
constructor(seed: Long) : this(1L, 2L, 3L, 4L, null) {
setSeed(seed)
}
constructor() : this(RandomSupport.generateUniqueSeed(), RandomSupport.generateUniqueSeed(), RandomSupport.generateUniqueSeed(), RandomSupport.generateUniqueSeed(), null)
override fun setSeed(seed: Long) {
val rng = LCG64Random(seed)
s0 = rng.nextLong()
s1 = rng.nextLong()
s2 = rng.nextLong()
s3 = rng.nextLong()
gaussian.reset()
}
override fun nextInt(): Int {
// sample upper bits
return nextLong().ushr(32).toInt()
}
override fun nextLong(): Long {
val result = (s1 * 5).rotateLeft(7) * 9
val t = s1.shl(17)
s2 = s2.xor(s0)
s3 = s3.xor(s1)
s1 = s1.xor(s2)
s0 = s0.xor(s3)
s2 = s2.xor(t)
s3 = s3.rotateLeft(45)
return result
}
override fun nextInt(bound: Int): Int {
return super<RandomGenerator>.nextInt(bound)
}
override fun nextInt(origin: Int, bound: Int): Int {
return super<RandomGenerator>.nextInt(origin, bound)
}
override fun nextBoolean(): Boolean {
return super.nextBoolean()
}
override fun nextFloat(): Float {
return super.nextFloat()
}
override fun nextDouble(): Double {
return super.nextDouble()
}
override fun nextGaussian(): Double {
return gaussian.nextGaussian()
}
override fun fork(): RandomSource {
return Xoshiro256SSRandom(nextLong(), nextLong(), nextLong(), nextLong())
}
override fun forkPositional(): PositionalRandomFactory {
return Positional(nextLong(), nextLong(), nextLong(), nextLong())
}
class Positional(
val s0: Long,
val s1: Long,
val s2: Long,
val s3: Long,
) : PositionalRandomFactory {
override fun at(x: Int, y: Int, z: Int): RandomSource {
val rng = LCG64Random(Mth.getSeed(x, y, z))
return Xoshiro256SSRandom(
s0.rotateLeft(11).xor(rng.nextLong()),
s1.rotateLeft(22).xor(rng.nextLong()),
s2.rotateLeft(33).xor(rng.nextLong()),
s3.rotateLeft(44).xor(rng.nextLong()),
)
}
override fun fromHashOf(name: String): RandomSource {
return Xoshiro256SSRandom(s0, HashCommon.murmurHash3(name.hashCode().toLong()).xor(s1), s2, s3)
}
override fun fromSeed(seed: Long): RandomSource {
return Xoshiro256SSRandom(seed)
}
override fun parityConfigString(builder: StringBuilder) {
throw UnsupportedOperationException()
}
}
}

View File

@ -3,10 +3,6 @@ package ru.dbotthepony.mc.otm.entity
import net.minecraft.network.syncher.EntityDataAccessor import net.minecraft.network.syncher.EntityDataAccessor
import net.minecraft.network.syncher.EntityDataSerializers import net.minecraft.network.syncher.EntityDataSerializers
import net.minecraft.network.syncher.SynchedEntityData import net.minecraft.network.syncher.SynchedEntityData
import net.minecraft.resources.ResourceKey
import net.minecraft.core.registries.Registries
import ru.dbotthepony.mc.otm.core.ResourceLocation
import net.minecraft.world.level.storage.loot.LootTable
import net.minecraft.sounds.SoundEvent import net.minecraft.sounds.SoundEvent
import net.minecraft.sounds.SoundEvents import net.minecraft.sounds.SoundEvents
import net.minecraft.world.entity.AnimationState import net.minecraft.world.entity.AnimationState
@ -25,7 +21,6 @@ import net.minecraft.world.entity.ai.navigation.PathNavigation
import net.minecraft.world.entity.monster.Monster import net.minecraft.world.entity.monster.Monster
import net.minecraft.world.entity.player.Player import net.minecraft.world.entity.player.Player
import net.minecraft.world.level.Level import net.minecraft.world.level.Level
import ru.dbotthepony.mc.otm.OverdriveThatMatters
import ru.dbotthepony.mc.otm.registry.game.MSoundEvents import ru.dbotthepony.mc.otm.registry.game.MSoundEvents
@ -105,11 +100,6 @@ class Loader(type: EntityType<Loader>, level: Level) : Monster(type, level) {
return success return success
} }
override fun getDefaultLootTable(): ResourceKey<LootTable> {
return ResourceKey.create(Registries.LOOT_TABLE,
ResourceLocation(OverdriveThatMatters.MOD_ID, "entities/loader"))
}
override fun aiStep() { override fun aiStep() {
super.aiStep() super.aiStep()

View File

@ -1,111 +0,0 @@
package ru.dbotthepony.mc.otm.item
import net.minecraft.nbt.CompoundTag
import net.minecraft.network.chat.Component
import net.minecraft.server.level.ServerPlayer
import net.minecraft.world.InteractionHand
import net.minecraft.world.InteractionResult
import net.minecraft.world.InteractionResultHolder
import net.minecraft.world.entity.player.Player
import net.minecraft.world.item.ItemStack
import net.minecraft.world.item.TooltipFlag
import net.minecraft.world.item.context.UseOnContext
import net.minecraft.world.level.Level
import net.minecraft.world.level.block.Blocks
import ru.dbotthepony.mc.otm.block.entity.MatteryBlockEntity
import ru.dbotthepony.mc.otm.core.TextComponent
import ru.dbotthepony.mc.otm.core.TranslatableComponent
import ru.dbotthepony.mc.otm.registry.game.MDataComponentTypes
import ru.dbotthepony.mc.otm.server.sendActionBarMessage
class ConfiguratorItem : MatteryItem(Properties().stacksTo(1)) {
init {
addSimpleDescription()
addSimpleDescription("2")
addSimpleDescription("3")
}
override fun appendHoverText(
stack: ItemStack,
context: TooltipContext,
components: MutableList<Component>,
tooltipType: TooltipFlag
) {
super.appendHoverText(stack, context, components, tooltipType)
val tag = getConfiguration(stack)
val block = stack.getOrDefault(MDataComponentTypes.Configurator.BLOCK, Blocks.AIR.defaultBlockState())
if (!tag.isEmpty && !block.isAir) {
components.add(TranslatableComponent("$descriptionId.desc_saved", block.block.name))
}
}
override fun use(level: Level, player: Player, hand: InteractionHand): InteractionResultHolder<ItemStack?> {
if (player is ServerPlayer && player.isCrouching) {
val stack = player.getItemInHand(hand)
setConfiguration(stack, CompoundTag())
stack.set(MDataComponentTypes.Configurator.BLOCK, Blocks.AIR.defaultBlockState())
player.sendActionBarMessage(TranslatableComponent("otm.gui.config_cleared"))
return InteractionResultHolder.success(stack)
}
return super.use(level, player, hand)
}
override fun onItemUseFirst(stack: ItemStack, context: UseOnContext): InteractionResult {
val player = context.player
if (player == null) return super.useOn(context)
val level = context.level
val tile = level.getBlockEntity(context.clickedPos)
if (tile == null || tile !is MatteryBlockEntity) return super.useOn(context)
if (player.isCrouching == true) {
if (player is ServerPlayer) {
val tag = CompoundTag()
tile.saveConfiguration(tag, level.registryAccess())
if (tag.isEmpty) return super.onItemUseFirst(stack, context)
setConfiguration(stack, tag)
val block = level.getBlockState(context.clickedPos)
stack.set(MDataComponentTypes.Configurator.BLOCK, block)
player.sendActionBarMessage(TranslatableComponent("otm.gui.config_copied", block.block.name))
}
return InteractionResult.SUCCESS
}
val tag = getConfiguration(stack)
if (!tag.isEmpty) {
if (player is ServerPlayer) {
tile.loadConfiguration(tag, level.registryAccess())
player.sendActionBarMessage(TranslatableComponent("otm.gui.config_pasted"))
}
return InteractionResult.SUCCESS
} else {
if (player is ServerPlayer) {
player.sendActionBarMessage(TranslatableComponent("otm.gui.config_missing"))
}
return InteractionResult.FAIL
}
return super.useOn(context)
}
fun getConfiguration(stack: ItemStack): CompoundTag {
return stack.getOrDefault(MDataComponentTypes.Configurator.CONFIGURATION, CompoundTag())
}
fun setConfiguration(stack: ItemStack, tag: CompoundTag) {
stack.set(MDataComponentTypes.Configurator.CONFIGURATION, tag)
}
}

View File

@ -1,232 +0,0 @@
package ru.dbotthepony.mc.otm.item.weapon
import net.minecraft.core.BlockPos
import net.minecraft.core.component.DataComponents
import net.minecraft.tags.BlockTags
import net.minecraft.world.entity.EquipmentSlotGroup
import net.minecraft.world.entity.LivingEntity
import net.minecraft.world.entity.ai.attributes.AttributeModifier
import net.minecraft.world.entity.ai.attributes.Attributes
import net.minecraft.world.entity.player.Player
import net.minecraft.world.item.ItemStack
import net.minecraft.world.item.Rarity
import net.minecraft.world.item.component.ItemAttributeModifiers
import net.minecraft.world.level.Level
import net.minecraft.world.level.block.Blocks
import net.minecraft.world.level.block.state.BlockState
import net.neoforged.neoforge.capabilities.Capabilities
import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent
import net.neoforged.neoforge.common.ItemAbilities
import net.neoforged.neoforge.common.ItemAbility
import net.neoforged.neoforge.common.ModConfigSpec
import ru.dbotthepony.mc.otm.OverdriveThatMatters
import ru.dbotthepony.mc.otm.capability.MatteryCapability
import ru.dbotthepony.mc.otm.capability.energy.EnergyConsumerItem
import ru.dbotthepony.mc.otm.capability.energy.extractEnergyExact
import ru.dbotthepony.mc.otm.capability.energy.getBarColor
import ru.dbotthepony.mc.otm.capability.energy.getBarWidth
import ru.dbotthepony.mc.otm.capability.matteryEnergy
import ru.dbotthepony.mc.otm.capability.matteryPlayer
import ru.dbotthepony.mc.otm.core.ResourceLocation
import ru.dbotthepony.mc.otm.core.damageType
import ru.dbotthepony.mc.otm.core.math.Decimal
import ru.dbotthepony.mc.otm.core.math.DecimalConfigValue
import ru.dbotthepony.mc.otm.core.math.defineDecimal
import ru.dbotthepony.mc.otm.core.math.nextVariance
import ru.dbotthepony.mc.otm.core.otmRandom
import ru.dbotthepony.mc.otm.core.util.WriteOnce
import ru.dbotthepony.mc.otm.item.MatteryItem
import ru.dbotthepony.mc.otm.item.addSimpleDescription
import ru.dbotthepony.mc.otm.registry.CapabilitiesRegisterListener
import ru.dbotthepony.mc.otm.registry.MDamageTypes
import ru.dbotthepony.mc.otm.registry.MatteryDamageSource
class FallingSunItem : MatteryItem(Properties().stacksTo(1).rarity(Rarity.EPIC)), CapabilitiesRegisterListener {
private val chargedAttributes: ItemAttributeModifiers
private val dischargedAttributes: ItemAttributeModifiers
init {
var builder = ItemAttributeModifiers.builder()
builder.add(Attributes.ATTACK_DAMAGE, AttributeModifier(BASE_ATTACK_DAMAGE_ID, 13.0, AttributeModifier.Operation.ADD_VALUE), EquipmentSlotGroup.MAINHAND)
builder.add(Attributes.ATTACK_SPEED, AttributeModifier(BASE_ATTACK_SPEED_ID, -3.4, AttributeModifier.Operation.ADD_VALUE), EquipmentSlotGroup.MAINHAND)
builder.add(Attributes.SWEEPING_DAMAGE_RATIO, AttributeModifier(ResourceLocation(OverdriveThatMatters.MOD_ID, "energy_sword_sweeping_edge"), 1.0, AttributeModifier.Operation.ADD_VALUE), EquipmentSlotGroup.MAINHAND)
chargedAttributes = builder.build()
builder = ItemAttributeModifiers.builder()
builder.add(Attributes.ATTACK_DAMAGE, AttributeModifier(BASE_ATTACK_DAMAGE_ID, 5.5, AttributeModifier.Operation.ADD_VALUE), EquipmentSlotGroup.MAINHAND)
builder.add(Attributes.ATTACK_SPEED, AttributeModifier(BASE_ATTACK_SPEED_ID, -3.4, AttributeModifier.Operation.ADD_VALUE), EquipmentSlotGroup.MAINHAND)
dischargedAttributes = builder.build()
}
override fun isEnchantable(p_41456_: ItemStack): Boolean {
return p_41456_.count == 1
}
override fun getEnchantmentValue(stack: ItemStack): Int {
return 12
}
override fun getDestroySpeed(itemStack: ItemStack, blockState: BlockState): Float {
val energy = itemStack.getCapability(MatteryCapability.ITEM_ENERGY) ?: return 1f
if (blockState.`is`(Blocks.COBWEB)) {
return if (energy.batteryLevel < COBWEB_POWER_COST) 2f else 25f
} else if (blockState.`is`(BlockTags.SWORD_EFFICIENT)) {
return if (energy.batteryLevel < PLANT_POWER_COST) 1.5f else 8f
} else {
return 1f
}
}
override fun canAttackBlock(p_41441_: BlockState, p_41442_: Level, p_41443_: BlockPos, p_41444_: Player): Boolean {
return !p_41444_.isCreative
}
override fun hurtEnemy(itemStack: ItemStack, victim: LivingEntity, attacker: LivingEntity): Boolean {
if (attacker is Player && attacker.isCreative) {
victim.matteryPlayer?.let {
if (it.isAndroid) {
victim.invulnerableTime = 0
victim.hurt(MatteryDamageSource(attacker.level().registryAccess().damageType(MDamageTypes.EMP), attacker, itemStack), 8f)
}
}
return true
}
itemStack.getCapability(MatteryCapability.ITEM_ENERGY)?.let {
if (it.extractEnergyExact(ENERGY_PER_SWING, false)) {
it.extractEnergy(attacker.level().otmRandom.nextVariance(ENERGY_PER_SWING_VARIANCE), false)
victim.matteryPlayer?.let {
if (it.isAndroid && it.androidEnergy.extractEnergyExact(ENERGY_ZAP, false)) {
it.androidEnergy.extractEnergy(attacker.level().otmRandom.nextVariance(ENERGY_ZAP_VARIANCE), false)
victim.hurt(MatteryDamageSource(attacker.level().registryAccess().damageType(MDamageTypes.EMP), attacker, itemStack), 8f)
}
}
}
}
return true
}
override fun isBarVisible(p_150899_: ItemStack): Boolean {
return p_150899_.matteryEnergy != null
}
override fun getBarWidth(p_150900_: ItemStack): Int {
return p_150900_.matteryEnergy?.getBarWidth() ?: super.getBarWidth(p_150900_)
}
override fun getBarColor(p_150901_: ItemStack): Int {
return p_150901_.matteryEnergy?.getBarColor() ?: super.getBarColor(p_150901_)
}
init {
tooltips.itemEnergy()
addSimpleDescription()
addSimpleDescription("2")
addSimpleDescription("3")
addSimpleDescription("4")
}
override fun mineBlock(
itemStack: ItemStack,
p_41417_: Level,
blockState: BlockState,
p_41419_: BlockPos,
user: LivingEntity
): Boolean {
if (blockState.getDestroySpeed(p_41417_, p_41419_) > 0f && (user !is Player || !user.isCreative)) {
val energy = itemStack.matteryEnergy
if (blockState.`is`(BlockTags.SWORD_EFFICIENT)) {
if (energy?.extractEnergyExact(PLANT_POWER_COST, false) == true)
energy.extractEnergyExact(user.level().otmRandom.nextVariance(PLANT_POWER_COST_VARIANCE), false)
}
if (blockState.`is`(Blocks.COBWEB)) {
if (energy?.extractEnergyExact(COBWEB_POWER_COST, false) == true)
energy.extractEnergyExact(user.level().otmRandom.nextVariance(COBWEB_POWER_COST_VARIANCE), false)
}
}
return true
}
override fun isCorrectToolForDrops(stack: ItemStack, state: BlockState): Boolean {
val energy = stack.matteryEnergy ?: return super.isCorrectToolForDrops(stack, state)
if (state.`is`(BlockTags.SWORD_EFFICIENT) && energy.batteryLevel >= PLANT_POWER_COST)
return true
else if (state.`is`(Blocks.COBWEB) && energy.batteryLevel >= COBWEB_POWER_COST)
return true
return super.isCorrectToolForDrops(stack, state)
}
private fun cap(stack: ItemStack) = EnergyConsumerItem(stack, MAX_ENERGY)
override fun registerCapabilities(event: RegisterCapabilitiesEvent) {
event.registerItem(MatteryCapability.ITEM_ENERGY, { o, _ -> cap(o) }, this)
event.registerItem(Capabilities.EnergyStorage.ITEM, { o, _ -> cap(o) }, this)
}
override fun getDefaultAttributeModifiers(stack: ItemStack): ItemAttributeModifiers {
val energy = cap(stack)
if (energy.batteryLevel >= ENERGY_PER_SWING) {
return chargedAttributes
}
return dischargedAttributes
}
override fun canPerformAction(stack: ItemStack, toolAction: ItemAbility): Boolean {
if (cap(stack).extractEnergyExact(ENERGY_PER_SWING, true)) {
return ItemAbilities.DEFAULT_SWORD_ACTIONS.contains(toolAction)
}
return false
}
companion object {
val MAX_ENERGY get() = _MAX_ENERGY.get()
val ENERGY_ZAP get() = _ENERGY_ZAP.get()
val ENERGY_ZAP_VARIANCE get() = _ENERGY_ZAP_VARIANCE.get()
val ENERGY_PER_SWING get() = _ENERGY_PER_SWING.get()
val ENERGY_PER_SWING_VARIANCE get() = _ENERGY_PER_SWING_VARIANCE.get()
val COBWEB_POWER_COST get() = _COBWEB_POWER_COST.get()
val COBWEB_POWER_COST_VARIANCE get() = _COBWEB_POWER_COST_VARIANCE.get()
val PLANT_POWER_COST get() = _PLANT_POWER_COST.get()
val PLANT_POWER_COST_VARIANCE get() = _PLANT_POWER_COST_VARIANCE.get()
private var _MAX_ENERGY: DecimalConfigValue by WriteOnce()
private var _ENERGY_ZAP: DecimalConfigValue by WriteOnce()
private var _ENERGY_ZAP_VARIANCE: DecimalConfigValue by WriteOnce()
private var _ENERGY_PER_SWING: DecimalConfigValue by WriteOnce()
private var _ENERGY_PER_SWING_VARIANCE: DecimalConfigValue by WriteOnce()
private var _COBWEB_POWER_COST: DecimalConfigValue by WriteOnce()
private var _COBWEB_POWER_COST_VARIANCE: DecimalConfigValue by WriteOnce()
private var _PLANT_POWER_COST: DecimalConfigValue by WriteOnce()
private var _PLANT_POWER_COST_VARIANCE: DecimalConfigValue by WriteOnce()
fun registerConfig(builder: ModConfigSpec.Builder) {
builder.comment("Falling Sun values").push("FallingSun")
_MAX_ENERGY = builder.defineDecimal("MAX_ENERGY", Decimal(3_500_000), Decimal.ZERO)
_ENERGY_ZAP = builder.comment("Extra energy required when hitting androids").defineDecimal("ENERGY_ZAP", Decimal(4_000), Decimal.ZERO)
_ENERGY_ZAP_VARIANCE = builder.comment("Random deviation from ENERGY_ZAP").defineDecimal("ENERGY_ZAP_VARIANCE", Decimal(1200), Decimal.ZERO)
_ENERGY_PER_SWING = builder.defineDecimal("ENERGY_PER_SWING", Decimal(3_000), Decimal.ZERO)
_ENERGY_PER_SWING_VARIANCE = builder.comment("Random deviation from ENERGY_PER_SWING").defineDecimal("ENERGY_PER_SWING_VARIANCE", Decimal(600), Decimal.ZERO)
_COBWEB_POWER_COST = builder.defineDecimal("COBWEB_POWER_COST", Decimal(2_500), Decimal.ZERO)
_COBWEB_POWER_COST_VARIANCE = builder.comment("Random deviation from COBWEB_POWER_COST").defineDecimal("COBWEB_POWER_COST_VARIANCE", Decimal(500), Decimal.ZERO)
_PLANT_POWER_COST = builder.defineDecimal("PLANT_POWER_COST", Decimal(500), Decimal.ZERO)
_PLANT_POWER_COST_VARIANCE = builder.comment("Random deviation from PLANT_POWER_COST").defineDecimal("PLANT_POWER_COST_VARIANCE", Decimal(100), Decimal.ZERO)
builder.pop()
}
}
}

View File

@ -24,7 +24,6 @@ class HoloSignMenu(
val textBlue = FloatInputWithFeedback(this) val textBlue = FloatInputWithFeedback(this)
val textAlpha = FloatInputWithFeedback(this) val textAlpha = FloatInputWithFeedback(this)
val textAutoScale = BooleanInputWithFeedback(this) val textAutoScale = BooleanInputWithFeedback(this)
val smallerFont = BooleanInputWithFeedback(this)
init { init {
text.filter { it.isCreative || !locked.value } text.filter { it.isCreative || !locked.value }
@ -37,7 +36,6 @@ class HoloSignMenu(
textAlpha.filter { it.isCreative || !locked.value } textAlpha.filter { it.isCreative || !locked.value }
textAutoScale.filter { it.isCreative || !locked.value } textAutoScale.filter { it.isCreative || !locked.value }
smallerFont.filter { it.isCreative || !locked.value }
if (tile != null) { if (tile != null) {
text.withConsumer { tile.signText = HoloSignBlockEntity.truncate(it, tile.isLocked) }.withSupplier(tile::signText) text.withConsumer { tile.signText = HoloSignBlockEntity.truncate(it, tile.isLocked) }.withSupplier(tile::signText)
@ -48,7 +46,6 @@ class HoloSignMenu(
locked.with(tile::isLocked) locked.with(tile::isLocked)
redstone.with(tile.redstoneControl::redstoneSetting) redstone.with(tile.redstoneControl::redstoneSetting)
textAutoScale.with(tile::textAutoScale) textAutoScale.with(tile::textAutoScale)
smallerFont.with(tile::smallerFont)
} }
} }
} }

View File

@ -194,12 +194,10 @@ object MNames {
const val TRITANIUM_SHIELD = "tritanium_shield" const val TRITANIUM_SHIELD = "tritanium_shield"
const val ENERGY_SWORD = "energy_sword" const val ENERGY_SWORD = "energy_sword"
const val FALLING_SUN = "falling_sun"
const val PLASMA_RIFLE = "plasma_rifle" const val PLASMA_RIFLE = "plasma_rifle"
const val CHEST_UPGRADER = "chest_upgrader" const val CHEST_UPGRADER = "chest_upgrader"
const val CONFIGURATOR = "configurator"
const val WITHERED_STEEL_SWORD = "withered_steel_sword" const val WITHERED_STEEL_SWORD = "withered_steel_sword"
@ -232,7 +230,6 @@ object MNames {
const val MIRROR_COMPOUND = "mirror_compound" const val MIRROR_COMPOUND = "mirror_compound"
const val MIRROR = "mirror" const val MIRROR = "mirror"
const val BLANK_MACHINE_UPGRADE = "blank_machine_upgrade" const val BLANK_MACHINE_UPGRADE = "blank_machine_upgrade"
const val DISPLAY_SCREEN = "display_screen"
const val ENERGY_BUS = "energy_bus" const val ENERGY_BUS = "energy_bus"

View File

@ -6,7 +6,6 @@ import net.minecraft.core.BlockPos
import net.minecraft.core.cauldron.CauldronInteraction import net.minecraft.core.cauldron.CauldronInteraction
import net.minecraft.core.component.DataComponents import net.minecraft.core.component.DataComponents
import net.minecraft.core.registries.BuiltInRegistries import net.minecraft.core.registries.BuiltInRegistries
import net.minecraft.nbt.CompoundTag
import net.minecraft.world.entity.EntityType import net.minecraft.world.entity.EntityType
import net.minecraft.world.item.DyeColor import net.minecraft.world.item.DyeColor
import net.minecraft.world.item.Item import net.minecraft.world.item.Item
@ -43,8 +42,6 @@ import ru.dbotthepony.mc.otm.core.math.Decimal
import ru.dbotthepony.mc.otm.isClient import ru.dbotthepony.mc.otm.isClient
import ru.dbotthepony.mc.otm.item.armor.TritaniumArmorItem import ru.dbotthepony.mc.otm.item.armor.TritaniumArmorItem
import ru.dbotthepony.mc.otm.item.weapon.EnergySwordItem import ru.dbotthepony.mc.otm.item.weapon.EnergySwordItem
import ru.dbotthepony.mc.otm.item.weapon.FallingSunItem
import ru.dbotthepony.mc.otm.registry.game.MDataComponentTypes
import ru.dbotthepony.mc.otm.registry.game.MItems import ru.dbotthepony.mc.otm.registry.game.MItems
import ru.dbotthepony.mc.otm.registry.game.MStats import ru.dbotthepony.mc.otm.registry.game.MStats
import ru.dbotthepony.mc.otm.registry.objects.ColoredDecorativeBlock import ru.dbotthepony.mc.otm.registry.objects.ColoredDecorativeBlock
@ -287,14 +284,6 @@ object MRegistry : IBlockItemRegistryAcceptor {
} }
} }
ItemProperties.register(MItems.FALLING_SUN, ResourceLocation(OverdriveThatMatters.MOD_ID, "is_powered")) { stack, _, _, _ ->
if ((stack.matteryEnergy?.batteryLevel ?: Decimal.ZERO) >= FallingSunItem.ENERGY_PER_SWING) {
1f
} else {
0f
}
}
ItemProperties.register(MItems.EXPLOSIVE_HAMMER, ResourceLocation(OverdriveThatMatters.MOD_ID, "is_primed")) { stack, level, entity, _ -> ItemProperties.register(MItems.EXPLOSIVE_HAMMER, ResourceLocation(OverdriveThatMatters.MOD_ID, "is_primed")) { stack, level, entity, _ ->
if (MItems.EXPLOSIVE_HAMMER.isPrimed(stack) || entity == null) { if (MItems.EXPLOSIVE_HAMMER.isPrimed(stack) || entity == null) {
1f 1f
@ -318,11 +307,6 @@ object MRegistry : IBlockItemRegistryAcceptor {
} }
} }
} }
ItemProperties.register(MItems.CONFIGURATOR, ResourceLocation(OverdriveThatMatters.MOD_ID, "has_configuration_saved")) { stack, _, _, _ ->
val tag = stack.getOrDefault(MDataComponentTypes.Configurator.CONFIGURATION, CompoundTag())
if (tag.isEmpty) 0f else 1f
}
} }
} }

View File

@ -1,33 +0,0 @@
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<Structure> {
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))
}
}
}
}

View File

@ -18,7 +18,6 @@ import net.minecraft.world.level.block.SoundType
import net.minecraft.world.level.block.StairBlock import net.minecraft.world.level.block.StairBlock
import net.minecraft.world.level.block.TransparentBlock import net.minecraft.world.level.block.TransparentBlock
import net.minecraft.world.level.block.WallBlock import net.minecraft.world.level.block.WallBlock
import net.minecraft.world.level.block.WaterloggedTransparentBlock
import net.minecraft.world.level.block.state.BlockBehaviour import net.minecraft.world.level.block.state.BlockBehaviour
import net.minecraft.world.level.block.state.properties.BlockStateProperties import net.minecraft.world.level.block.state.properties.BlockStateProperties
import net.minecraft.world.level.block.state.properties.NoteBlockInstrument import net.minecraft.world.level.block.state.properties.NoteBlockInstrument
@ -267,7 +266,7 @@ object MBlocks {
} }
val METAL_MESH: Block by registry.register(MNames.METAL_MESH) { val METAL_MESH: Block by registry.register(MNames.METAL_MESH) {
WaterloggedTransparentBlock(BlockBehaviour.Properties.of() TransparentBlock(BlockBehaviour.Properties.of()
.mapColor(MapColor.COLOR_GRAY) .mapColor(MapColor.COLOR_GRAY)
.noOcclusion() .noOcclusion()
.sound(SoundType.COPPER_GRATE) .sound(SoundType.COPPER_GRATE)

View File

@ -263,7 +263,6 @@ private fun addMainCreativeTabItems(consumer: CreativeModeTab.Output) {
accept(MItems.GRAVITATIONAL_DISRUPTOR) accept(MItems.GRAVITATIONAL_DISRUPTOR)
accept(MItems.CHEST_UPGRADER) accept(MItems.CHEST_UPGRADER)
accept(MItems.CONFIGURATOR)
accept(MItems.ESSENCE_SERVO) accept(MItems.ESSENCE_SERVO)

View File

@ -5,11 +5,9 @@ import com.mojang.serialization.Codec
import net.minecraft.core.UUIDUtil import net.minecraft.core.UUIDUtil
import net.minecraft.core.component.DataComponentType import net.minecraft.core.component.DataComponentType
import net.minecraft.core.registries.BuiltInRegistries import net.minecraft.core.registries.BuiltInRegistries
import net.minecraft.nbt.CompoundTag
import net.minecraft.network.RegistryFriendlyByteBuf import net.minecraft.network.RegistryFriendlyByteBuf
import net.minecraft.network.codec.StreamCodec import net.minecraft.network.codec.StreamCodec
import net.minecraft.util.StringRepresentable import net.minecraft.util.StringRepresentable
import net.minecraft.world.level.block.state.BlockState
import net.neoforged.bus.api.IEventBus import net.neoforged.bus.api.IEventBus
import net.neoforged.neoforge.fluids.SimpleFluidContent import net.neoforged.neoforge.fluids.SimpleFluidContent
import ru.dbotthepony.mc.otm.capability.FlowDirection import ru.dbotthepony.mc.otm.capability.FlowDirection
@ -19,7 +17,6 @@ import ru.dbotthepony.mc.otm.core.math.Decimal
import ru.dbotthepony.mc.otm.data.codec.DecimalCodec import ru.dbotthepony.mc.otm.data.codec.DecimalCodec
import ru.dbotthepony.mc.otm.item.tool.RedstoneInteractorItem import ru.dbotthepony.mc.otm.item.tool.RedstoneInteractorItem
import ru.dbotthepony.mc.otm.network.StreamCodecs import ru.dbotthepony.mc.otm.network.StreamCodecs
import ru.dbotthepony.mc.otm.network.streamCodec
import ru.dbotthepony.mc.otm.registry.MDeferredRegister import ru.dbotthepony.mc.otm.registry.MDeferredRegister
import java.util.UUID import java.util.UUID
@ -37,16 +34,6 @@ object MDataComponentTypes {
} }
} }
private class CompoundTagComponent : DataComponentType<CompoundTag> {
override fun codec(): Codec<CompoundTag> {
return CompoundTag.CODEC
}
override fun streamCodec(): StreamCodec<in RegistryFriendlyByteBuf, CompoundTag> {
return CompoundTag.CODEC.streamCodec()
}
}
val FLUID_STACK by registry.register("fluid_stack") { val FLUID_STACK by registry.register("fluid_stack") {
object : DataComponentType<SimpleFluidContent> { object : DataComponentType<SimpleFluidContent> {
override fun codec(): Codec<SimpleFluidContent> { override fun codec(): Codec<SimpleFluidContent> {
@ -94,26 +81,6 @@ object MDataComponentTypes {
} }
} }
object Configurator {
val BLOCK: DataComponentType<BlockState> by registry.register("configurator_block") {
object : DataComponentType<BlockState> {
override fun codec(): Codec<BlockState?>? {
return BlockState.CODEC
}
override fun streamCodec(): StreamCodec<in RegistryFriendlyByteBuf, BlockState?> {
return BlockState.CODEC.streamCodec()
}
}
}
val CONFIGURATION: DataComponentType<CompoundTag> by registry.register("configurator_configuration") { CompoundTagComponent() }
}
init {
Configurator
}
fun register(bus: IEventBus) { fun register(bus: IEventBus) {
registry.register(bus) registry.register(bus)
} }

View File

@ -43,7 +43,6 @@ import ru.dbotthepony.mc.otm.core.collect.SupplierMap
import ru.dbotthepony.mc.otm.core.math.Decimal import ru.dbotthepony.mc.otm.core.math.Decimal
import ru.dbotthepony.mc.otm.item.BatteryItem import ru.dbotthepony.mc.otm.item.BatteryItem
import ru.dbotthepony.mc.otm.item.ChestUpgraderItem import ru.dbotthepony.mc.otm.item.ChestUpgraderItem
import ru.dbotthepony.mc.otm.item.ConfiguratorItem
import ru.dbotthepony.mc.otm.item.CrudeBatteryItem import ru.dbotthepony.mc.otm.item.CrudeBatteryItem
import ru.dbotthepony.mc.otm.item.EssenceServoItem import ru.dbotthepony.mc.otm.item.EssenceServoItem
import ru.dbotthepony.mc.otm.item.FluidCapsuleItem import ru.dbotthepony.mc.otm.item.FluidCapsuleItem
@ -73,7 +72,6 @@ import ru.dbotthepony.mc.otm.item.tool.ExplosiveHammerItem
import ru.dbotthepony.mc.otm.item.tool.MatteryAxeItem import ru.dbotthepony.mc.otm.item.tool.MatteryAxeItem
import ru.dbotthepony.mc.otm.item.tool.RedstoneInteractorItem import ru.dbotthepony.mc.otm.item.tool.RedstoneInteractorItem
import ru.dbotthepony.mc.otm.item.weapon.EnergySwordItem import ru.dbotthepony.mc.otm.item.weapon.EnergySwordItem
import ru.dbotthepony.mc.otm.item.weapon.FallingSunItem
import ru.dbotthepony.mc.otm.item.weapon.WitheredSteelSwordItem import ru.dbotthepony.mc.otm.item.weapon.WitheredSteelSwordItem
import ru.dbotthepony.mc.otm.registry.MDeferredRegister import ru.dbotthepony.mc.otm.registry.MDeferredRegister
import ru.dbotthepony.mc.otm.registry.MItemTags import ru.dbotthepony.mc.otm.registry.MItemTags
@ -409,7 +407,6 @@ object MItems {
val EXPLOSIVE_HAMMER: ExplosiveHammerItem by registry.register("explosive_hammer") { ExplosiveHammerItem() } val EXPLOSIVE_HAMMER: ExplosiveHammerItem by registry.register("explosive_hammer") { ExplosiveHammerItem() }
val ENERGY_SWORD: Item by registry.register(MNames.ENERGY_SWORD) { EnergySwordItem() } val ENERGY_SWORD: Item by registry.register(MNames.ENERGY_SWORD) { EnergySwordItem() }
val FALLING_SUN: Item by registry.register(MNames.FALLING_SUN) { FallingSunItem() }
val WITHERED_STEEL_SWORD: Item by registry.register(MNames.WITHERED_STEEL_SWORD) { WitheredSteelSwordItem(Item.Properties().durability(420)) } val WITHERED_STEEL_SWORD: Item by registry.register(MNames.WITHERED_STEEL_SWORD) { WitheredSteelSwordItem(Item.Properties().durability(420)) }
@ -560,7 +557,6 @@ object MItems {
val ELECTROMOTOR: Item by registry.register(MNames.ELECTROMOTOR) { Item(DEFAULT_PROPERTIES) } val ELECTROMOTOR: Item by registry.register(MNames.ELECTROMOTOR) { Item(DEFAULT_PROPERTIES) }
val MIRROR_COMPOUND: Item by registry.register(MNames.MIRROR_COMPOUND) { Item(DEFAULT_PROPERTIES) } val MIRROR_COMPOUND: Item by registry.register(MNames.MIRROR_COMPOUND) { Item(DEFAULT_PROPERTIES) }
val MIRROR: Item by registry.register(MNames.MIRROR) { MatteryItem(DEFAULT_PROPERTIES).addSimpleDescription() } val MIRROR: Item by registry.register(MNames.MIRROR) { MatteryItem(DEFAULT_PROPERTIES).addSimpleDescription() }
val DISPLAY_SCREEN: Item by registry.register(MNames.DISPLAY_SCREEN) { Item(DEFAULT_PROPERTIES) }
/** /**
* List of components for everything else * List of components for everything else
@ -590,7 +586,6 @@ object MItems {
MItems::ELECTROMOTOR, MItems::ELECTROMOTOR,
MItems::MIRROR_COMPOUND, MItems::MIRROR_COMPOUND,
MItems::MIRROR, MItems::MIRROR,
MItems::DISPLAY_SCREEN,
MItems::CARBON_MESH, MItems::CARBON_MESH,
MItems::ARMOR_ASSEMBLY, MItems::ARMOR_ASSEMBLY,
@ -626,7 +621,6 @@ object MItems {
MItems::ELECTROMOTOR, MItems::ELECTROMOTOR,
MItems::MIRROR_COMPOUND, MItems::MIRROR_COMPOUND,
MItems::MIRROR, MItems::MIRROR,
MItems::DISPLAY_SCREEN,
MItems::CARBON_MESH, MItems::CARBON_MESH,
MItems::ARMOR_ASSEMBLY, MItems::ARMOR_ASSEMBLY,
@ -678,8 +672,6 @@ object MItems {
val ROFLITE_ALLOY_INGOT: Item by registry.register(MNames.ROFLITE_ALLOY_INGOT) { Item(DEFAULT_PROPERTIES) } val ROFLITE_ALLOY_INGOT: Item by registry.register(MNames.ROFLITE_ALLOY_INGOT) { Item(DEFAULT_PROPERTIES) }
val ROFLITE_ALLOY_BLOCK: BlockItem by registry.register(MNames.ROFLITE_ALLOY_BLOCK) { BlockItem(MBlocks.ROFLITE_ALLOY_BLOCK, DEFAULT_PROPERTIES) } val ROFLITE_ALLOY_BLOCK: BlockItem by registry.register(MNames.ROFLITE_ALLOY_BLOCK) { BlockItem(MBlocks.ROFLITE_ALLOY_BLOCK, DEFAULT_PROPERTIES) }
val CONFIGURATOR: Item by registry.register(MNames.CONFIGURATOR) { ConfiguratorItem() }
init { init {
MRegistry.registerItems(registry) MRegistry.registerItems(registry)
} }

View File

@ -1,21 +0,0 @@
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<Structure> {
return ResourceKey.create(Registries.STRUCTURE, loc(location))
}
}

View File

@ -1,9 +0,0 @@
package ru.dbotthepony.mc.otm.server
import net.minecraft.network.chat.Component
import net.minecraft.network.protocol.game.ClientboundSetActionBarTextPacket
import net.minecraft.server.level.ServerPlayer
fun ServerPlayer.sendActionBarMessage(component: Component) {
this.connection.send(ClientboundSetActionBarTextPacket(component))
}

View File

@ -14,7 +14,6 @@ import net.minecraft.world.level.ChunkPos
import net.minecraft.world.level.levelgen.placement.PlacementContext import net.minecraft.world.level.levelgen.placement.PlacementContext
import net.minecraft.world.level.levelgen.placement.PlacementModifier import net.minecraft.world.level.levelgen.placement.PlacementModifier
import ru.dbotthepony.mc.otm.core.util.CMWCRandom import ru.dbotthepony.mc.otm.core.util.CMWCRandom
import ru.dbotthepony.mc.otm.core.util.Xoshiro256SSRandom
import ru.dbotthepony.mc.otm.data.codec.inRange import ru.dbotthepony.mc.otm.data.codec.inRange
import ru.dbotthepony.mc.otm.data.codec.minRange import ru.dbotthepony.mc.otm.data.codec.minRange
import java.time.Duration import java.time.Duration
@ -72,7 +71,7 @@ abstract class AbstractEnormousPlacement(val parameters: Parameters) : Placement
.build<ChunkPos, GeneratedChunk>() .build<ChunkPos, GeneratedChunk>()
private fun computeChunk(context: PlacementContext, pos: ChunkPos): GeneratedChunk { private fun computeChunk(context: PlacementContext, pos: ChunkPos): GeneratedChunk {
val random = Xoshiro256SSRandom(context.level.seed, parameters.seedMix, pos.x.toLong(), pos.z.toLong()) val random = CMWCRandom(context.level.seed + HashCommon.murmurHash3(pos.x + pos.z * 31) + parameters.seedMix)
var stream = Stream.of(BlockPos(pos.minBlockX, 0, pos.minBlockZ)) var stream = Stream.of(BlockPos(pos.minBlockX, 0, pos.minBlockZ))
parameters.placementModifiers.forEach { modifier -> stream = stream.flatMap { modifier.getPositions(context, random, it).sequential() } } parameters.placementModifiers.forEach { modifier -> stream = stream.flatMap { modifier.getPositions(context, random, it).sequential() } }
return GeneratedChunk(stream.flatMap { getPositions(it, random) }) return GeneratedChunk(stream.flatMap { getPositions(it, random) })

View File

@ -174,5 +174,3 @@ 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 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 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-f net.minecraft.advancements.critereon.SimpleCriterionTrigger removePlayerListeners(Lnet/minecraft/server/PlayerAdvancements;)V
public net.minecraft.world.entity.npc.VillagerTrades$TreasureMapForEmeralds

View File

@ -1,30 +0,0 @@
{
"providers": [
{
"type": "space",
"advances": {
" ": 4
}
},
{
"type": "bitmap",
"file": "overdrive_that_matters:font/small.png",
"chars": [
"\u0020\u0021\u0022\u0023\u0024\u0025\u0026\u0027\u0028\u0029\u002a\u002b\u002c\u002d\u002e\u002f",
"\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037\u0038\u0039\u003a\u003b\u003c\u003d\u003e\u003f",
"\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u004b\u004c\u004d\u004e\u004f",
"\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005a\u005b\u005c\u005d\u005e\u005f",
"\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006a\u006b\u006c\u006d\u006e\u006f",
"\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007a\u007b\u007c\u007d\u007e\u221E",
"\u0410\u0411\u0412\u0413\u0414\u0415\u0401\u0416\u0417\u0418\u0419\u041A\u041B\u041C\u041D\u041E",
"\u041F\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042A\u042B\u042C\u042D\u042E",
"\u042F\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000",
"\u0430\u0431\u0432\u0433\u0434\u0435\u0451\u0436\u0437\u0438\u0439\u043A\u043B\u043C\u043D\u043E",
"\u043F\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044A\u044B\u044C\u044D\u044E",
"\u044F\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"
],
"height": 6,
"ascent": 6
}
]
}

View File

@ -1,22 +0,0 @@
{
"loader": "neoforge:separate_transforms",
"gui_light": "front",
"base":
{
"parent": "overdrive_that_matters:item/falling_sun_unpowered"
},
"perspectives": {
"gui": {
"parent": "overdrive_that_matters:item/falling_sun_inventory"
},
"fixed": {
"parent": "overdrive_that_matters:item/falling_sun_inventory"
},
"ground": {
"parent": "overdrive_that_matters:item/falling_sun_inventory"
}
},
"overrides": [
{ "predicate": { "overdrive_that_matters:is_powered": 1.0 }, "model": "overdrive_that_matters:item/falling_sun_powered" }
]
}

View File

@ -1,6 +0,0 @@
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "overdrive_that_matters:item/falling_sun_icon"
}
}

View File

@ -1,241 +0,0 @@
{
"loader": "neoforge:separate_transforms",
"gui_light": "front",
"base":
{
"texture_size": [32, 32],
"textures": {
"0": "overdrive_that_matters:item/falling_sun",
"1": "overdrive_that_matters:item/falling_sun_charge",
"particle": "overdrive_that_matters:item/falling_sun"
},
"elements": [
{
"name": "frame",
"from": [7.999, 8, 9.6],
"to": [8.002, 22, 11.6],
"rotation": {"angle": 0, "axis": "y", "origin": [6, 11, 10.6]},
"faces": {
"east": {"uv": [11.5, 0, 10.5, 7], "texture": "#0"},
"west": {"uv": [10.5, 0, 11.5, 7], "texture": "#0"}
}
},
{
"name": "frame",
"from": [8, 22, 9.6],
"to": [8, 29, 11.6],
"rotation": {"angle": 22.5, "axis": "x", "origin": [8, 22, 9.6]},
"faces": {
"east": {"uv": [12.5, 0, 11.5, 3.5], "texture": "#0"},
"west": {"uv": [11.5, 0, 12.5, 3.5], "texture": "#0"}
}
},
{
"name": "cap",
"from": [7.4, 6, 7.6],
"to": [8.6, 11, 9.6],
"rotation": {"angle": 0, "axis": "y", "origin": [6.5, 7, 7.6]},
"faces": {
"north": {"uv": [7.5, 4, 8, 6.5], "texture": "#0"},
"east": {"uv": [9, 4, 8, 6.5], "texture": "#0"},
"south": {"uv": [9, 4, 9.5, 6.5], "texture": "#0"},
"west": {"uv": [8, 4, 9, 6.5], "texture": "#0"},
"up": {"uv": [8, 3.5, 9, 4], "rotation": 90, "texture": "#0"}
}
},
{
"name": "handle",
"from": [7, -5, 4],
"to": [9, -4, 10],
"rotation": {"angle": 0, "axis": "y", "origin": [7, -5, 7]},
"faces": {
"north": {"uv": [8, 10, 9, 10.5], "texture": "#0"},
"east": {"uv": [7.5, 7, 8, 10], "rotation": 270, "texture": "#0"},
"south": {"uv": [8, 6.5, 9, 7], "texture": "#0"},
"west": {"uv": [7.5, 7, 8, 10], "rotation": 90, "texture": "#0"},
"up": {"uv": [8, 7, 9, 10], "rotation": 180, "texture": "#0"},
"down": {"uv": [9, 7, 10, 10], "texture": "#0"}
}
},
{
"name": "handle",
"from": [8, -4, 4.6],
"to": [8, 3, 7.6],
"rotation": {"angle": 0, "axis": "y", "origin": [6, -3, 5.6]},
"faces": {
"east": {"uv": [9, 0, 10.5, 3.5], "texture": "#0"},
"west": {"uv": [10.5, 0, 9, 3.5], "texture": "#0"}
}
},
{
"name": "handle",
"from": [7.5, -4, 7.2],
"to": [8.5, 3, 9.2],
"rotation": {"angle": 0, "axis": "y", "origin": [6.5, -3, 7.2]},
"faces": {
"north": {"uv": [7, 0, 7.5, 3.5], "texture": "#0"},
"east": {"uv": [8.5, 0, 7.5, 3.5], "texture": "#0"},
"south": {"uv": [8.5, 0, 9, 3.5], "texture": "#0"},
"west": {"uv": [7.5, 0, 8.5, 3.5], "texture": "#0"}
}
},
{
"name": "guard",
"from": [6.5, 5, 4],
"to": [9.5, 6, 10],
"rotation": {"angle": 0, "axis": "y", "origin": [7.5, 5, 7]},
"faces": {
"north": {"uv": [4, 8, 5.5, 8.5], "texture": "#0"},
"east": {"uv": [3.5, 5, 4, 8], "rotation": 270, "texture": "#0"},
"south": {"uv": [4, 4.5, 5.5, 5], "rotation": 180, "texture": "#0"},
"west": {"uv": [5.5, 5, 6, 8], "rotation": 90, "texture": "#0"},
"up": {"uv": [4, 5, 5.5, 8], "rotation": 180, "texture": "#0"},
"down": {"uv": [6, 5, 7.5, 8], "texture": "#0"}
}
},
{
"name": "guard",
"from": [6.5, 3, 4],
"to": [9.5, 4, 10],
"rotation": {"angle": 0, "axis": "y", "origin": [7.5, 3, 7]},
"faces": {
"north": {"uv": [4, 8, 5.5, 8.5], "texture": "#0"},
"east": {"uv": [3.5, 5, 4, 8], "rotation": 270, "texture": "#0"},
"south": {"uv": [4, 4.5, 5.5, 5], "rotation": 180, "texture": "#0"},
"west": {"uv": [5.5, 5, 6, 8], "rotation": 90, "texture": "#0"},
"up": {"uv": [4, 5, 5.5, 8], "rotation": 180, "texture": "#0"},
"down": {"uv": [6, 5, 7.5, 8], "texture": "#0"}
}
},
{
"name": "blade",
"from": [7.5, 4, 4.5],
"to": [8.5, 22, 9.5],
"rotation": {"angle": 0, "axis": "y", "origin": [7.5, 6, 5.5]},
"faces": {
"north": {"uv": [0, 0.5, 0.5, 9.5], "texture": "#0"},
"east": {"uv": [3, 0.5, 0.5, 9.5], "texture": "#0"},
"south": {"uv": [3, 0.5, 3.5, 9.5], "texture": "#0"},
"west": {"uv": [0.5, 0.5, 3, 9.5], "texture": "#0"},
"up": {"uv": [0.5, 0, 3, 0.5], "rotation": 90, "texture": "#0"}
}
},
{
"name": "blade",
"from": [7.501, 22.001, 4.501],
"to": [8.499, 29.999, 9.499],
"rotation": {"angle": 22.5, "axis": "x", "origin": [7.5, 22, 4.5]},
"faces": {
"north": {"uv": [3.5, 0.5, 4, 4.5], "texture": "#0"},
"east": {"uv": [6.5, 0.5, 4, 4.5], "texture": "#0"},
"south": {"uv": [6.5, 0.5, 7, 4.5], "texture": "#0"},
"west": {"uv": [4, 0.5, 6.5, 4.5], "texture": "#0"},
"up": {"uv": [4, 0, 6.5, 0.5], "rotation": 90, "texture": "#0"}
}
},
{
"from": [7.501, 26.801, 8.601],
"to": [8.499, 25.799, 9.699],
"rotation": {"angle": 22.5, "axis": "x", "origin": [7.5, 26.8, 8.6]},
"faces": {
"north": {"uv": [4.5, 1.5, 5, 2], "texture": "#0"},
"south": {"uv": [5.5, 1.5, 6, 2], "texture": "#0"},
"up": {"uv": [5, 2, 5.5, 2.5], "rotation": 90, "texture": "#0"},
"down": {"uv": [5, 1, 5.5, 1.5], "texture": "#0"}
}
},
{
"name": "charge",
"from": [7.6, 6, 3.8],
"to": [8.4, 22, 10.2],
"rotation": {"angle": 0, "axis": "y", "origin": [6.5, 12, 4]},
"faces": {
"north": {"uv": [4, 4, 4.5, 12], "texture": "#1"},
"east": {"uv": [1, 4, 4, 12], "texture": "#1"},
"south": {"uv": [7.5, 4, 8, 12], "texture": "#1"},
"west": {"uv": [4.5, 4, 7.5, 12], "texture": "#1"}
}
},
{
"name": "charge",
"from": [7.6, 21.9, 3.8],
"to": [8.4, 30.8, 10.2],
"rotation": {"angle": 22.5, "axis": "x", "origin": [6.5, 22, 4]},
"faces": {
"north": {"uv": [4, 2.5, 4.5, 5], "texture": "#1"},
"east": {"uv": [1, 2.5, 4, 5], "texture": "#1"},
"south": {"uv": [7.5, 2.5, 8, 5], "texture": "#1"},
"west": {"uv": [4.5, 2.5, 7.5, 5], "texture": "#1"},
"up": {"uv": [3.5, 0.5, 6, 1], "rotation": 90, "texture": "#1"}
}
},
{
"name": "battery",
"from": [7.5, 7, 9.6],
"to": [8.5, 8, 11.6],
"rotation": {"angle": -22.5, "axis": "x", "origin": [7.5, 7, 9.6]},
"faces": {
"east": {"uv": [12.5, 0.5, 13, 1.5], "rotation": 270, "texture": "#0"},
"south": {"uv": [12.5, 0, 13, 0.5], "texture": "#0"},
"west": {"uv": [12.5, 0.5, 13, 1.5], "rotation": 90, "texture": "#0"},
"up": {"uv": [12.5, 0.5, 13, 1.5], "rotation": 180, "texture": "#0"},
"down": {"uv": [12.5, 0.5, 13, 1.5], "texture": "#0"}
}
},
{
"name": "battery",
"from": [7.5, 9, 9.6],
"to": [8.5, 10, 11.6],
"rotation": {"angle": -22.5, "axis": "x", "origin": [7.5, 9, 9.6]},
"faces": {
"east": {"uv": [12.5, 0.5, 13, 1.5], "rotation": 270, "texture": "#0"},
"south": {"uv": [12.5, 0, 13, 0.5], "texture": "#0"},
"west": {"uv": [12.5, 0.5, 13, 1.5], "rotation": 90, "texture": "#0"},
"up": {"uv": [12.5, 0.5, 13, 1.5], "rotation": 180, "texture": "#0"},
"down": {"uv": [12.5, 0.5, 13, 1.5], "texture": "#0"}
}
}
],
"display": {
"thirdperson_righthand": {
"translation": [0, 5.75, 1.25]
},
"thirdperson_lefthand": {
"translation": [0, 5.75, 1.25]
},
"firstperson_righthand": {
"rotation": [-35, 0, 0],
"translation": [1.5, 1.5, -3.5]
},
"firstperson_lefthand": {
"rotation": [-35, 0, 0],
"translation": [1.5, 0, -3.5]
},
"ground": {
"rotation": [-60, 0, 0],
"translation": [0, 2, 0],
"scale": [0.5, 0.5, 0.5]
},
"gui": {
"rotation": [0, 90, 0],
"translation": [0, -1.5, 0],
"scale": [0.5, 0.5, 0.5]
},
"head": {
"rotation": [-127, 0, 0],
"translation": [0, 12.25, 0]
}
}
},
"perspectives": {
"gui": {
"parent": "overdrive_that_matters:item/falling_sun_inventory"
},
"fixed": {
"parent": "overdrive_that_matters:item/falling_sun_inventory"
},
"ground": {
"parent": "overdrive_that_matters:item/falling_sun_inventory"
}
}
}

View File

@ -1,200 +0,0 @@
{
"credit": "Made with Blockbench",
"texture_size": [32, 32],
"textures": {
"0": "overdrive_that_matters:item/falling_sun",
"particle": "overdrive_that_matters:item/falling_sun"
},
"elements": [
{
"name": "frame",
"from": [7.999, 8, 9.6],
"to": [8.002, 22, 11.6],
"rotation": {"angle": 0, "axis": "y", "origin": [6, 11, 10.6]},
"faces": {
"east": {"uv": [11.5, 0, 10.5, 7], "texture": "#0"},
"west": {"uv": [10.5, 0, 11.5, 7], "texture": "#0"}
}
},
{
"name": "frame",
"from": [8, 22, 9.6],
"to": [8, 29, 11.6],
"rotation": {"angle": 22.5, "axis": "x", "origin": [8, 22, 9.6]},
"faces": {
"east": {"uv": [12.5, 0, 11.5, 3.5], "texture": "#0"},
"west": {"uv": [11.5, 0, 12.5, 3.5], "texture": "#0"}
}
},
{
"name": "cap",
"from": [7.4, 6, 7.6],
"to": [8.6, 11, 9.6],
"rotation": {"angle": 0, "axis": "y", "origin": [6.5, 7, 7.6]},
"faces": {
"north": {"uv": [7.5, 4, 8, 6.5], "texture": "#0"},
"east": {"uv": [9, 4, 8, 6.5], "texture": "#0"},
"south": {"uv": [9, 4, 9.5, 6.5], "texture": "#0"},
"west": {"uv": [8, 4, 9, 6.5], "texture": "#0"},
"up": {"uv": [8, 3.5, 9, 4], "rotation": 90, "texture": "#0"}
}
},
{
"name": "handle",
"from": [7, -5, 4],
"to": [9, -4, 10],
"rotation": {"angle": 0, "axis": "y", "origin": [7, -5, 7]},
"faces": {
"north": {"uv": [8, 10, 9, 10.5], "texture": "#0"},
"east": {"uv": [7.5, 7, 8, 10], "rotation": 270, "texture": "#0"},
"south": {"uv": [8, 6.5, 9, 7], "texture": "#0"},
"west": {"uv": [7.5, 7, 8, 10], "rotation": 90, "texture": "#0"},
"up": {"uv": [8, 7, 9, 10], "rotation": 180, "texture": "#0"},
"down": {"uv": [9, 7, 10, 10], "texture": "#0"}
}
},
{
"name": "handle",
"from": [8, -4, 4.6],
"to": [8, 3, 7.6],
"rotation": {"angle": 0, "axis": "y", "origin": [6, -3, 5.6]},
"faces": {
"east": {"uv": [9, 0, 10.5, 3.5], "texture": "#0"},
"west": {"uv": [10.5, 0, 9, 3.5], "texture": "#0"}
}
},
{
"name": "handle",
"from": [7.5, -4, 7.2],
"to": [8.5, 3, 9.2],
"rotation": {"angle": 0, "axis": "y", "origin": [6.5, -3, 7.2]},
"faces": {
"north": {"uv": [7, 0, 7.5, 3.5], "texture": "#0"},
"east": {"uv": [8.5, 0, 7.5, 3.5], "texture": "#0"},
"south": {"uv": [8.5, 0, 9, 3.5], "texture": "#0"},
"west": {"uv": [7.5, 0, 8.5, 3.5], "texture": "#0"}
}
},
{
"name": "guard",
"from": [6.5, 5, 4],
"to": [9.5, 6, 10],
"rotation": {"angle": 0, "axis": "y", "origin": [7.5, 5, 7]},
"faces": {
"north": {"uv": [4, 8, 5.5, 8.5], "texture": "#0"},
"east": {"uv": [3.5, 5, 4, 8], "rotation": 270, "texture": "#0"},
"south": {"uv": [4, 4.5, 5.5, 5], "rotation": 180, "texture": "#0"},
"west": {"uv": [5.5, 5, 6, 8], "rotation": 90, "texture": "#0"},
"up": {"uv": [4, 5, 5.5, 8], "rotation": 180, "texture": "#0"},
"down": {"uv": [6, 5, 7.5, 8], "texture": "#0"}
}
},
{
"name": "guard",
"from": [6.5, 3, 4],
"to": [9.5, 4, 10],
"rotation": {"angle": 0, "axis": "y", "origin": [7.5, 3, 7]},
"faces": {
"north": {"uv": [4, 8, 5.5, 8.5], "texture": "#0"},
"east": {"uv": [3.5, 5, 4, 8], "rotation": 270, "texture": "#0"},
"south": {"uv": [4, 4.5, 5.5, 5], "rotation": 180, "texture": "#0"},
"west": {"uv": [5.5, 5, 6, 8], "rotation": 90, "texture": "#0"},
"up": {"uv": [4, 5, 5.5, 8], "rotation": 180, "texture": "#0"},
"down": {"uv": [6, 5, 7.5, 8], "texture": "#0"}
}
},
{
"name": "blade",
"from": [7.5, 4, 4.5],
"to": [8.5, 22, 9.5],
"rotation": {"angle": 0, "axis": "y", "origin": [7.5, 6, 5.5]},
"faces": {
"north": {"uv": [0, 0.5, 0.5, 9.5], "texture": "#0"},
"east": {"uv": [3, 0.5, 0.5, 9.5], "texture": "#0"},
"south": {"uv": [3, 0.5, 3.5, 9.5], "texture": "#0"},
"west": {"uv": [0.5, 0.5, 3, 9.5], "texture": "#0"},
"up": {"uv": [0.5, 0, 3, 0.5], "rotation": 90, "texture": "#0"}
}
},
{
"name": "blade",
"from": [7.501, 22.001, 4.501],
"to": [8.499, 29.999, 9.499],
"rotation": {"angle": 22.5, "axis": "x", "origin": [7.5, 22, 4.5]},
"faces": {
"north": {"uv": [3.5, 0.5, 4, 4.5], "texture": "#0"},
"east": {"uv": [6.5, 0.5, 4, 4.5], "texture": "#0"},
"south": {"uv": [6.5, 0.5, 7, 4.5], "texture": "#0"},
"west": {"uv": [4, 0.5, 6.5, 4.5], "texture": "#0"},
"up": {"uv": [4, 0, 6.5, 0.5], "rotation": 90, "texture": "#0"}
}
},
{
"from": [7.501, 26.801, 8.601],
"to": [8.499, 25.799, 9.699],
"rotation": {"angle": 22.5, "axis": "x", "origin": [7.5, 26.8, 8.6]},
"faces": {
"north": {"uv": [4.5, 1.5, 5, 2], "texture": "#0"},
"south": {"uv": [5.5, 1.5, 6, 2], "texture": "#0"},
"up": {"uv": [5, 2, 5.5, 2.5], "rotation": 90, "texture": "#0"},
"down": {"uv": [5, 1, 5.5, 1.5], "texture": "#0"}
}
},
{
"name": "battery",
"from": [7.5, 6.5, 8.6],
"to": [8.5, 7.5, 10.6],
"rotation": {"angle": -22.5, "axis": "x", "origin": [7.5, 6.5, 8.6]},
"faces": {
"east": {"uv": [12.5, 0.5, 13, 1.5], "rotation": 270, "texture": "#0"},
"south": {"uv": [12.5, 0, 13, 0.5], "texture": "#0"},
"west": {"uv": [12.5, 0.5, 13, 1.5], "rotation": 90, "texture": "#0"},
"up": {"uv": [12.5, 0.5, 13, 1.5], "rotation": 180, "texture": "#0"},
"down": {"uv": [12.5, 0.5, 13, 1.5], "texture": "#0"}
}
},
{
"name": "battery",
"from": [7.5, 8.5, 8.6],
"to": [8.5, 9.5, 10.6],
"rotation": {"angle": -22.5, "axis": "x", "origin": [7.5, 8.5, 8.6]},
"faces": {
"east": {"uv": [12.5, 0.5, 13, 1.5], "rotation": 270, "texture": "#0"},
"south": {"uv": [12.5, 0, 13, 0.5], "texture": "#0"},
"west": {"uv": [12.5, 0.5, 13, 1.5], "rotation": 90, "texture": "#0"},
"up": {"uv": [12.5, 0.5, 13, 1.5], "rotation": 180, "texture": "#0"},
"down": {"uv": [12.5, 0.5, 13, 1.5], "texture": "#0"}
}
}
],
"display": {
"thirdperson_righthand": {
"translation": [0, 5.75, 1.25]
},
"thirdperson_lefthand": {
"translation": [0, 5.75, 1.25]
},
"firstperson_righthand": {
"rotation": [-35, 0, 0],
"translation": [1.5, 1.5, -3.5]
},
"firstperson_lefthand": {
"rotation": [-35, 0, 0],
"translation": [1.5, 0, -3.5]
},
"ground": {
"rotation": [-60, 0, 0],
"translation": [0, 2, 0],
"scale": [0.5, 0.5, 0.5]
},
"gui": {
"rotation": [0, 90, 0],
"translation": [0, -1.5, 0],
"scale": [0.5, 0.5, 0.5]
},
"head": {
"rotation": [-127, 0, 0],
"translation": [0, 12.25, 0]
}
}
}

View File

@ -1,4 +1,5 @@
{ {
"credit": "Made with Blockbench",
"parent": "minecraft:item/handheld", "parent": "minecraft:item/handheld",
"textures": { "textures": {
"layer0": "overdrive_that_matters:item/withered_steel_sword_handheld" "layer0": "overdrive_that_matters:item/withered_steel_sword_handheld"
@ -6,18 +7,18 @@
"display": { "display": {
"thirdperson_righthand": { "thirdperson_righthand": {
"rotation": [0, -90, 55], "rotation": [0, -90, 55],
"translation": [0, 5.75, 0.5], "translation": [0, 4, 0.5],
"scale": [1, 1, 0.85] "scale": [0.85, 0.85, 0.85]
}, },
"thirdperson_lefthand": { "thirdperson_lefthand": {
"rotation": [0, 90, -55], "rotation": [0, 90, -55],
"translation": [0, 5.75, 0.5], "translation": [0, 4, 0.5],
"scale": [1, 1, 0.85] "scale": [0.85, 0.85, 0.85]
}, },
"firstperson_righthand": { "firstperson_righthand": {
"rotation": [0, -90, 25], "rotation": [0, -90, 25],
"translation": [1.13, 3.2, 1.13], "translation": [1.13, 3.2, 1.13],
"scale": [0.74, 0.74, 0.68] "scale": [0.68, 0.68, 0.68]
}, },
"firstperson_lefthand": { "firstperson_lefthand": {
"rotation": [0, 90, -25], "rotation": [0, 90, -25],

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 571 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 691 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

View File

@ -1 +0,0 @@
{ "animation": { "frametime": 1 } }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 547 B

View File

@ -1,40 +0,0 @@
{
"attributes": {
"range_bonus": 0.25,
"two_handed": true,
"pose": "bettercombat:pose_two_handed_katana",
"category": "claymore",
"attacks": [
{
"hitbox": "HORIZONTAL_PLANE",
"damage_multiplier": 0.75,
"angle": 120,
"upswing": 0.5,
"animation": "bettercombat:two_handed_slash_horizontal_right",
"swing_sound": {
"id": "bettercombat:scythe_slash"
}
},
{
"hitbox": "HORIZONTAL_PLANE",
"damage_multiplier": 0.75,
"angle": 120,
"upswing": 0.5,
"animation": "bettercombat:two_handed_slash_horizontal_left",
"swing_sound": {
"id": "bettercombat:scythe_slash"
}
},
{
"hitbox": "VERTICAL_PLANE",
"damage_multiplier": 1,
"angle": 120,
"upswing": 0.8,
"animation": "bettercombat:two_handed_slash_vertical_right",
"swing_sound": {
"id": "bettercombat:scythe_slash"
}
}
]
}
}