From 9ce2fbf4975b7b5cd98d4f2e240c0fb12806ba51 Mon Sep 17 00:00:00 2001
From: GearShocky <gearshockmirasu@gmail.com>
Date: Sat, 1 Mar 2025 17:53:53 +0500
Subject: [PATCH 01/13] withered steel block

---
 .../mc/otm/datagen/blocks/BlockModels.kt          |   2 ++
 .../mc/otm/datagen/loot/DecorativeLoot.kt         |   2 ++
 .../mc/otm/datagen/recipes/ShapelessRecipes.kt    |   5 +++++
 .../mc/otm/datagen/tags/MineableTags.kt           |   2 ++
 .../ru/dbotthepony/mc/otm/registry/MNames.kt      |   3 +++
 .../dbotthepony/mc/otm/registry/game/MBlocks.kt   |   4 ++++
 .../ru/dbotthepony/mc/otm/registry/game/MItems.kt |   3 +++
 .../block/resource/withered_steel_block.png       | Bin 0 -> 489 bytes
 8 files changed, 21 insertions(+)
 create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/block/resource/withered_steel_block.png

diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/BlockModels.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/BlockModels.kt
index bbf8da1e4..31d960642 100644
--- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/BlockModels.kt
+++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/BlockModels.kt
@@ -11,6 +11,8 @@ fun addBlockModels(provider: MatteryBlockModelProvider) {
 		resourceCubeAll(MBlocks.DEEPSLATE_TRITANIUM_ORE)
 		resourceCubeAll(MBlocks.TRITANIUM_INGOT_BLOCK)
 
+		resourceCubeAll(MBlocks.WITHERED_STEEL_BLOCK)
+
 		resourceCubeAll(MBlocks.DILITHIUM_ORE)
 		resourceCubeAll(MBlocks.DEEPSLATE_DILITHIUM_ORE)
 		resourceCubeAll(MBlocks.DILITHIUM_CRYSTAL_BLOCK)
diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/DecorativeLoot.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/DecorativeLoot.kt
index 4fe3eb50b..2eda654e7 100644
--- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/DecorativeLoot.kt
+++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/DecorativeLoot.kt
@@ -50,6 +50,8 @@ fun addDecorativeLoot(lootTables: LootTables) {
 	lootTables.dropsSelf(MBlocks.TRITANIUM_INGOT_BLOCK) { condition(ExplosionCondition.survivesExplosion()) }
 	lootTables.dropsSelf(MBlocks.TRITANIUM_BARS) { condition(ExplosionCondition.survivesExplosion()) }
 
+	lootTables.dropsSelf(MBlocks.WITHERED_STEEL_BLOCK) { condition(ExplosionCondition.survivesExplosion()) }
+
 	lootTables.dropsSelf(MBlocks.TRITANIUM_HULL) { condition(ExplosionCondition.survivesExplosion()) }
 
 	lootTables.dropsSelf(MBlocks.GENERATOR_BLOCK) { condition(ExplosionCondition.survivesExplosion()) }
diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/ShapelessRecipes.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/ShapelessRecipes.kt
index 294a57307..c13d9c321 100644
--- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/ShapelessRecipes.kt
+++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/ShapelessRecipes.kt
@@ -63,6 +63,11 @@ fun addShapelessRecipes(consumer: RecipeOutput) {
 		.unlockedBy(MItemTags.TRITANIUM_INGOTS)
 		.save(consumer)
 
+	ShapelessRecipeBuilder(RecipeCategory.BUILDING_BLOCKS, MItems.WITHERED_STEEL_BLOCK, 1)
+		.requires(Ingredient.of(MItems.WITHERED_STEEL), 9)
+		.unlockedBy(MItems.WITHERED_STEEL)
+		.save(consumer)
+
 	ShapelessRecipeBuilder(RecipeCategory.BUILDING_BLOCKS, MItems.TRITANIUM_RAW_BLOCK, 1)
 		.requires(Ingredient.of(MItemTags.TRITANIUM_ORE_CLUMPS), 9)
 		.unlockedBy(MItemTags.TRITANIUM_ORE_CLUMPS)
diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/MineableTags.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/MineableTags.kt
index f89bde310..65b528c7e 100644
--- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/MineableTags.kt
+++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/MineableTags.kt
@@ -51,6 +51,8 @@ fun addMineableTags(tagsProvider: TagsProvider) {
 		*MBlocks.ENERGY_SERVO.values.toTypedArray(),
 
 		MBlocks.TRITANIUM_INGOT_BLOCK,
+		MBlocks.WITHERED_STEEL_BLOCK,
+
 		MBlocks.METAL_JUNK,
 		MBlocks.METAL_MESH,
 		MBlocks.TRITANIUM_BARS,
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MNames.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MNames.kt
index c803ef655..68fe63f41 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MNames.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MNames.kt
@@ -93,10 +93,12 @@ object MNames {
 
 	// building blocks
 	const val TRITANIUM_BLOCK = "tritanium_block"
+	const val TRITANIUM_BLOCK_YELLOW_CLASSIC = "tritanium_block_yellow_classic"
 	const val TRITANIUM_STAIRS = "tritanium_stairs"
 	const val TRITANIUM_SLAB = "tritanium_slab"
 	const val TRITANIUM_WALL = "tritanium_wall"
 	const val TRITANIUM_STRIPED_BLOCK = "tritanium_striped_block"
+	const val TRITANIUM_CLASSIC_STRIPED_BLOCK = "tritanium_classic_striped_block"
 	const val TRITANIUM_STRIPED_STAIRS = "tritanium_striped_stairs"
 	const val TRITANIUM_STRIPED_SLAB = "tritanium_striped_slab"
 	const val TRITANIUM_STRIPED_WALL = "tritanium_striped_wall"
@@ -205,6 +207,7 @@ object MNames {
 	const val TRITANIUM_INGOT = "tritanium_ingot"
 	const val TRITANIUM_INGOT_BLOCK = "tritanium_ingot_block"
 
+	const val WITHERED_STEEL_BLOCK = "withered_steel_block"
 	const val WITHERED_STEEL = "withered_steel"
 
 	const val MATTER_IO_PORT = "matter_io_port"
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MBlocks.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MBlocks.kt
index 5df204d9a..4ded2667c 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MBlocks.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MBlocks.kt
@@ -252,6 +252,10 @@ object MBlocks {
 		Block(BlockBehaviour.Properties.of().mapColor(MapColor.COLOR_BLUE).sound(SoundType.METAL).explosionResistance(400f).destroyTime(3f).requiresCorrectToolForDrops())
 	}
 
+	val WITHERED_STEEL_BLOCK: Block by registry.register(MNames.WITHERED_STEEL_BLOCK) {
+		Block(BlockBehaviour.Properties.of().mapColor(MapColor.COLOR_GREEN).sound(SoundType.NETHERITE_BLOCK).explosionResistance(400f).destroyTime(3f).requiresCorrectToolForDrops())
+	}
+
 	val METAL_JUNK: MatteryBlock by registry.register(MNames.METAL_JUNK) {
 		 MatteryBlock(BlockBehaviour.Properties.of().sound(SoundType.NETHERITE_BLOCK).mapColor(MapColor.COLOR_GRAY).explosionResistance(45f).destroyTime(3f).requiresCorrectToolForDrops())
 			 .addSimpleDescription()
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MItems.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MItems.kt
index 89194c834..685e5c1d5 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MItems.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MItems.kt
@@ -301,6 +301,9 @@ object MItems {
 	val TRITANIUM_NUGGET: Item by registry.register(MNames.TRITANIUM_NUGGET) { Item(DEFAULT_PROPERTIES) }
 	val TRITANIUM_INGOT: Item by registry.register(MNames.TRITANIUM_INGOT) { Item(DEFAULT_PROPERTIES) }
 	val TRITANIUM_INGOT_BLOCK: BlockItem by registry.register(MNames.TRITANIUM_INGOT_BLOCK) { BlockItem(MBlocks.TRITANIUM_INGOT_BLOCK, DEFAULT_PROPERTIES) }
+
+	val WITHERED_STEEL_BLOCK: BlockItem by registry.register(MNames.WITHERED_STEEL_BLOCK) { BlockItem(MBlocks.WITHERED_STEEL_BLOCK, DEFAULT_PROPERTIES) }
+
 	val TRITANIUM_BARS: BlockItem by registry.register(MNames.TRITANIUM_BARS) { BlockItem(MBlocks.TRITANIUM_BARS, DEFAULT_PROPERTIES) }
 	val METAL_RAILING: BlockItem by registry.register(MNames.METAL_RAILING) { BlockItem(MBlocks.METAL_RAILING, DEFAULT_PROPERTIES) }
 
diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/resource/withered_steel_block.png b/src/main/resources/assets/overdrive_that_matters/textures/block/resource/withered_steel_block.png
new file mode 100644
index 0000000000000000000000000000000000000000..54b0a6f2441e1d64ba087658f0aa070264ba8262
GIT binary patch
literal 489
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF<EDmyaVpw-h<|UBBlJ4m1$iT3%
zpZiZDE08Z5;1lAiZmch>p(-RP?iLx4P?c+FZ*Ae}BBuR(2~YuNfk$L90|Pf72s1kD
zdkECcAW`BPQ4*Y=R#Ki=l*$m0n3-3i=jR%tV5(=RXY_jy^ERNGZK)BSX`Y^13>-iX
zD}xjxD+42t<pspjP&UYQ8jQ?faV8+!kdX=O{3swhvz-Mjo&{usz$pnvh8I9z!Duu~
z8Gup~*cn)WDh-T`4Hy?dOa<A<x&UI*6d)S}n1JRofmH@sS^!y4U4{k*AXyVL=1sXa
zUzLH(a!(h>5Q)pOy&Jg>8wfZ*JtqI))&<LN6ZRUG=$ZUr=9+H%-0lB=PRsD-3a3YW
zd}{3-TV~qb=F)cx;we*|UhEKeCGg??hh~op4-~h}?Bl(#;~#UJOeov3&kmOi_Fi-o
xy><Tf+%4sscm;0pS1N719=BR)n#}3FQ@HumrOJ{%dxD~n!PC{xWt~$(69B~Wch>*_

literal 0
HcmV?d00001


From 271f5943898ca74c4260de320931a20799749192 Mon Sep 17 00:00:00 2001
From: GearShocky <gearshockmirasu@gmail.com>
Date: Sat, 1 Mar 2025 17:54:26 +0500
Subject: [PATCH 02/13] yes

---
 .../kotlin/ru/dbotthepony/mc/otm/registry/game/MCreativeTabs.kt  | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MCreativeTabs.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MCreativeTabs.kt
index 5b4d243b5..953e891ed 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MCreativeTabs.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MCreativeTabs.kt
@@ -237,6 +237,7 @@ private fun addMainCreativeTabItems(consumer: CreativeModeTab.Output) {
 		accept(MItems.DILITHIUM_CRYSTAL_BLOCK)
 
 		accept(MItems.WITHERED_STEEL)
+		accept(MItems.WITHERED_STEEL_BLOCK)
 
 		accept(MItems.TRITANIUM_TOOLS)
 		accept(MItems.TRITANIUM_SHIELD)

From e1decb67ec558fc823556d8e7176e8e5a764c7e3 Mon Sep 17 00:00:00 2001
From: GearShocky <gearshockmirasu@gmail.com>
Date: Sat, 1 Mar 2025 19:16:18 +0500
Subject: [PATCH 03/13] Imperfect bread

---
 .../mc/otm/datagen/blocks/BlockStates.kt      |  2 ++
 .../mc/otm/datagen/items/ItemModels.kt        |  1 +
 .../mc/otm/datagen/lang/English.kt            |  2 ++
 .../mc/otm/datagen/lang/Russian.kt            |  2 ++
 .../mc/otm/item/consumables/ImperfectBread.kt | 25 +++++++++++++++++++
 .../ru/dbotthepony/mc/otm/registry/MNames.kt  |  2 ++
 .../mc/otm/registry/game/MCreativeTabs.kt     |  1 +
 .../mc/otm/registry/game/MItems.kt            |  8 +++---
 8 files changed, 38 insertions(+), 5 deletions(-)
 create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/item/consumables/ImperfectBread.kt

diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/BlockStates.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/BlockStates.kt
index 597b94ab4..fd3419f6b 100644
--- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/BlockStates.kt
+++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/BlockStates.kt
@@ -32,6 +32,8 @@ fun addBlockStates(provider: MatteryBlockStateProvider) {
 	provider.ore(MBlocks.TRITANIUM_RAW_BLOCK)
 	provider.block(MBlocks.TRITANIUM_INGOT_BLOCK)
 
+	provider.block(MBlocks.WITHERED_STEEL_BLOCK)
+
 	provider.ore(MBlocks.DILITHIUM_ORE)
 	provider.ore(MBlocks.DEEPSLATE_DILITHIUM_ORE)
 	provider.block(MBlocks.DILITHIUM_CRYSTAL_BLOCK)
diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt
index 452c25f6c..64d8e374c 100644
--- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt
+++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt
@@ -68,6 +68,7 @@ fun addItemModels(provider: MatteryItemModelProvider) {
 	provider.generated(MItems.PILL_HEAL)
 	provider.generated(MItems.PILL_NOT_NORMAL)
 	provider.generated(MItems.NUTRIENT_PASTE)
+	provider.generated(MItems.IMPERFECT_BREAD)
 	provider.generated(MItems.REDSTONE_INTERACTOR)
 
 	provider.generated(MItems.ESSENCE_DRIVE)
diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt
index ee8818b27..e9fef487e 100644
--- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt
+++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt
@@ -612,6 +612,7 @@ private fun blocks(provider: MatteryLanguageProvider) {
 		add(MBlocks.HOLO_SIGN, "desc", "Multi-line, colored and glowing, text sign")
 
 		add(MBlocks.TRITANIUM_INGOT_BLOCK, "Tritanium Plating Block")
+		add(MBlocks.WITHERED_STEEL_BLOCK, "Withered Steel Block")
 
 		addBlock(MBlocks.ENERGY_COUNTER.values, "Energy Counter")
 		addBlock(MBlocks.ENERGY_COUNTER.values, "desc", "Restricts energy flow direction;")
@@ -741,6 +742,7 @@ private fun items(provider: MatteryLanguageProvider) {
 		add(MItems.ESSENCE_SERVO, "desc2", "Can be used as a tool to pump essence manually")
 
 		add(MItems.NUTRIENT_PASTE, "Nutrient Paste")
+		add(MItems.IMPERFECT_BREAD, "Imperfect Bread")
 
 		add(MItems.FLUID_CAPSULE, "Fluid Capsule")
 		add(MItems.FLUID_CAPSULE, "named", "Fluid Capsule (%s)")
diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt
index 229c311d1..08b3e8289 100644
--- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt
+++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt
@@ -616,6 +616,7 @@ private fun blocks(provider: MatteryLanguageProvider) {
 		add(MBlocks.HOLO_SIGN, "desc", "Многострочная, крашеная и светящееся, табличка")
 
 		add(MBlocks.TRITANIUM_INGOT_BLOCK, "Блок слитков тритана")
+		add(MBlocks.WITHERED_STEEL_BLOCK, "Блок иссушенной стали")
 
 		addBlock(MBlocks.ENERGY_COUNTER.values, "Счётчик энергии")
 		addBlock(MBlocks.ENERGY_COUNTER.values, "desc", "Ограничивает направление передачи энергии;")
@@ -734,6 +735,7 @@ private fun items(provider: MatteryLanguageProvider) {
 		add(MItems.ESSENCE_SERVO, "desc2", "Может использоваться как инструмент для ручной перекачки эссенции")
 
 		add(MItems.NUTRIENT_PASTE, "Питательная паста")
+		add(MItems.IMPERFECT_BREAD, "Несовершенный хлеб")
 
 		add(MItems.FLUID_CAPSULE, "Жидкостная капсула")
 		add(MItems.FLUID_CAPSULE, "named", "Жидкостная капсула (%s)")
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/consumables/ImperfectBread.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/consumables/ImperfectBread.kt
new file mode 100644
index 000000000..d67ae84e9
--- /dev/null
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/consumables/ImperfectBread.kt
@@ -0,0 +1,25 @@
+package ru.dbotthepony.mc.otm.item.consumables
+
+import net.minecraft.world.effect.MobEffectInstance
+import net.minecraft.world.effect.MobEffects
+import net.minecraft.world.level.Level
+import net.minecraft.world.entity.LivingEntity
+import net.minecraft.world.entity.player.Player
+import net.minecraft.world.food.FoodProperties
+import net.minecraft.world.item.Item
+import net.minecraft.world.item.ItemStack
+
+class ImperfectBread(properties: Item.Properties) : Item(properties) {
+	override fun finishUsingItem(stack: ItemStack, level: Level, entity: LivingEntity): ItemStack {
+		if (entity is Player) {
+			entity.addEffect(MobEffectInstance(MobEffects.POISON, 80, 0))
+		}
+		return super.finishUsingItem(stack, level, entity)
+	}
+}
+
+val IMPERFECT_BREAD_FOOD: FoodProperties = FoodProperties.Builder()
+	.nutrition(5)
+	.saturationModifier(0.6f)
+	.build()
+
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MNames.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MNames.kt
index 68fe63f41..22275788e 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MNames.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MNames.kt
@@ -130,6 +130,8 @@ object MNames {
 	const val PILL_HEAL = "pill_heal"
 	const val PILL_NOT_NORMAL = "pill_not_normal"
 
+	const val IMPERFECT_BREAD = "imperfect_bread"
+
 	const val BATTERY_CRUDE = "battery_crude"
 	const val BATTERY_BASIC = "battery_basic"
 	const val BATTERY_NORMAL = "battery_normal"
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MCreativeTabs.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MCreativeTabs.kt
index 953e891ed..e4f0bfda6 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MCreativeTabs.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MCreativeTabs.kt
@@ -282,6 +282,7 @@ private fun addMainCreativeTabItems(consumer: CreativeModeTab.Output) {
 		base(MItems.CARGO_CRATE_MINECARTS)
 
 		accept(MItems.NUTRIENT_PASTE)
+		accept(MItems.IMPERFECT_BREAD)
 
 		// exo
 		accept(MItems.EXOPACK_PROBE)
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MItems.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MItems.kt
index 685e5c1d5..69520f486 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MItems.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MItems.kt
@@ -43,16 +43,12 @@ import ru.dbotthepony.mc.otm.core.math.Decimal
 import ru.dbotthepony.mc.otm.item.BatteryItem
 import ru.dbotthepony.mc.otm.item.ChestUpgraderItem
 import ru.dbotthepony.mc.otm.item.CrudeBatteryItem
-import ru.dbotthepony.mc.otm.item.consumables.EssenceCapsuleItem
 import ru.dbotthepony.mc.otm.item.EssenceServoItem
 import ru.dbotthepony.mc.otm.item.FluidCapsuleItem
 import ru.dbotthepony.mc.otm.item.block.FluidTankItem
 import ru.dbotthepony.mc.otm.item.GravitationalDisruptorItem
-import ru.dbotthepony.mc.otm.item.consumables.HealPillItem
 import ru.dbotthepony.mc.otm.item.MatteryItem
 import ru.dbotthepony.mc.otm.item.MinecartCargoCrateItem
-import ru.dbotthepony.mc.otm.item.consumables.PillItem
-import ru.dbotthepony.mc.otm.item.consumables.PillType
 import ru.dbotthepony.mc.otm.item.PortableCondensationDriveItem
 import ru.dbotthepony.mc.otm.item.ProceduralBatteryItem
 import ru.dbotthepony.mc.otm.item.QuantumBatteryItem
@@ -62,7 +58,7 @@ import ru.dbotthepony.mc.otm.item.addSimpleDescription
 import ru.dbotthepony.mc.otm.item.armor.PortableGravitationStabilizerItem
 import ru.dbotthepony.mc.otm.item.armor.TritaniumArmorItem
 import ru.dbotthepony.mc.otm.item.block.EnergyCableItem
-import ru.dbotthepony.mc.otm.item.consumables.NotNormalPill
+import ru.dbotthepony.mc.otm.item.consumables.*
 import ru.dbotthepony.mc.otm.item.exopack.ExopackProbeItem
 import ru.dbotthepony.mc.otm.item.exopack.ExopackSlotUpgradeItem
 import ru.dbotthepony.mc.otm.item.exopack.ExopackUpgradeItem
@@ -429,6 +425,8 @@ object MItems {
 	val PILL_HEAL: Item by registry.register(MNames.PILL_HEAL) { HealPillItem() }
 	val PILL_NOT_NORMAL: Item by registry.register(MNames.PILL_NOT_NORMAL) { NotNormalPill() }
 
+	val IMPERFECT_BREAD: Item by registry.register(MNames.IMPERFECT_BREAD) { ImperfectBread(Item.Properties().food(IMPERFECT_BREAD_FOOD)) }
+
 	val PILLS = SupplierList(
 		MItems::PILL_ANDROID,
 		MItems::PILL_HUMANE,

From 80128a01e57b6ae4b8047c95f70a39db084e6f6d Mon Sep 17 00:00:00 2001
From: GearShocky <gearshockmirasu@gmail.com>
Date: Sat, 1 Mar 2025 19:22:48 +0500
Subject: [PATCH 04/13] forgot

---
 .../kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt    | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt
index 64d8e374c..fc78990a2 100644
--- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt
+++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt
@@ -35,6 +35,8 @@ fun addItemModels(provider: MatteryItemModelProvider) {
 	provider.block(MItems.TRITANIUM_RAW_BLOCK)
 	provider.block(MItems.TRITANIUM_INGOT_BLOCK)
 
+	provider.block(MItems.WITHERED_STEEL_BLOCK)
+
 	provider.block(MItems.DILITHIUM_ORE)
 	provider.block(MItems.DEEPSLATE_DILITHIUM_ORE)
 	provider.block(MItems.DILITHIUM_CRYSTAL_BLOCK)

From e6bab75bc7141271b8aa049a6411b20cbbf34f64 Mon Sep 17 00:00:00 2001
From: YuRaNnNzZZ <medved609@yandex.ru>
Date: Sat, 1 Mar 2025 20:58:00 +0300
Subject: [PATCH 05/13] =?UTF-8?q?YuRaNnNzZZ=20=E2=80=94=20=D0=A1=D0=B5?=
 =?UTF-8?q?=D0=B3=D0=BE=D0=B4=D0=BD=D1=8F,=20=D0=B2=2020:44=20=D0=98=D0=B7?=
 =?UTF-8?q?=D0=BE=D0=B1=D1=80=D0=B0=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B0?=
 =?UTF-8?q?=20=D0=BE=D0=B1=D1=80=D0=B0=D1=82=D0=BD=D0=BE=3F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../mc/otm/datagen/recipes/ShapelessRecipes.kt    | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/ShapelessRecipes.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/ShapelessRecipes.kt
index c13d9c321..4c307d83e 100644
--- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/ShapelessRecipes.kt
+++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/ShapelessRecipes.kt
@@ -63,11 +63,6 @@ fun addShapelessRecipes(consumer: RecipeOutput) {
 		.unlockedBy(MItemTags.TRITANIUM_INGOTS)
 		.save(consumer)
 
-	ShapelessRecipeBuilder(RecipeCategory.BUILDING_BLOCKS, MItems.WITHERED_STEEL_BLOCK, 1)
-		.requires(Ingredient.of(MItems.WITHERED_STEEL), 9)
-		.unlockedBy(MItems.WITHERED_STEEL)
-		.save(consumer)
-
 	ShapelessRecipeBuilder(RecipeCategory.BUILDING_BLOCKS, MItems.TRITANIUM_RAW_BLOCK, 1)
 		.requires(Ingredient.of(MItemTags.TRITANIUM_ORE_CLUMPS), 9)
 		.unlockedBy(MItemTags.TRITANIUM_ORE_CLUMPS)
@@ -98,4 +93,14 @@ fun addShapelessRecipes(consumer: RecipeOutput) {
 	hammerRecipe(MItems.TRITANIUM_PLATE, MItemTags.TRITANIUM_INGOTS, consumer)
 	hammerRecipe(MItems.IRON_PLATE, Tags.Items.INGOTS_IRON, consumer)
 	hammerRecipe(MItems.GOLD_PLATE, Tags.Items.INGOTS_GOLD, consumer)
+
+	ShapelessRecipeBuilder(RecipeCategory.BUILDING_BLOCKS, MItems.WITHERED_STEEL_BLOCK, 1)
+		.requires(Ingredient.of(MItems.WITHERED_STEEL), 9)
+		.unlockedBy(MItems.WITHERED_STEEL)
+		.save(consumer)
+
+	ShapelessRecipeBuilder(RecipeCategory.MISC, MItems.WITHERED_STEEL, 9)
+		.requires(Ingredient.of(MItems.WITHERED_STEEL_BLOCK))
+		.unlockedBy(MItems.WITHERED_STEEL_BLOCK)
+		.save(consumer)
 }

From 36a16ac9d2af65f3f3287e9aec5519f4e2c007a0 Mon Sep 17 00:00:00 2001
From: YuRaNnNzZZ <medved609@yandex.ru>
Date: Sat, 1 Mar 2025 21:59:10 +0300
Subject: [PATCH 06/13] Trollium

---
 .../dbotthepony/mc/otm/datagen/blocks/BlockStates.kt | 12 ++++++++++++
 .../dbotthepony/mc/otm/datagen/items/ItemModels.kt   |  2 ++
 .../ru/dbotthepony/mc/otm/datagen/lang/English.kt    |  2 ++
 .../ru/dbotthepony/mc/otm/datagen/lang/Russian.kt    |  2 ++
 .../mc/otm/datagen/recipes/ShapelessRecipes.kt       | 10 ++++++++++
 .../dbotthepony/mc/otm/datagen/tags/MineableTags.kt  |  1 +
 .../dbotthepony/mc/otm/datagen/tags/ResourceTags.kt  |  6 ++++++
 .../kotlin/ru/dbotthepony/mc/otm/registry/MNames.kt  |  3 +++
 .../ru/dbotthepony/mc/otm/registry/game/MBlocks.kt   |  4 ++++
 .../mc/otm/registry/game/MCreativeTabs.kt            |  3 +++
 .../ru/dbotthepony/mc/otm/registry/game/MItems.kt    |  3 +++
 11 files changed, 48 insertions(+)

diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/BlockStates.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/BlockStates.kt
index fd3419f6b..13b574356 100644
--- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/BlockStates.kt
+++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/BlockStates.kt
@@ -33,6 +33,18 @@ fun addBlockStates(provider: MatteryBlockStateProvider) {
 	provider.block(MBlocks.TRITANIUM_INGOT_BLOCK)
 
 	provider.block(MBlocks.WITHERED_STEEL_BLOCK)
+	provider.exec {
+		provider.getVariantBuilder(MBlocks.ROFLITE_ALLOY_BLOCK).forAllStates {
+			val side1 = modLocation("block/resource/roflite_alloy_1")
+			val side2 = modLocation("block/resource/roflite_alloy_2")
+			val top = modLocation("block/resource/roflite_alloy_top")
+
+			val a = provider.models().cube(MBlocks.ROFLITE_ALLOY_BLOCK.registryName!!.path, top, top, side1, side1, side2, side2).texture("particle", side1)
+			val b = provider.models().cube("${MBlocks.ROFLITE_ALLOY_BLOCK.registryName!!.path}_b", top, top, side2, side2, side1, side1).texture("particle", side2)
+
+			return@forAllStates arrayOf(ConfiguredModel.builder().modelFile(a).buildLast(), ConfiguredModel.builder().modelFile(b).buildLast())
+		}
+	}
 
 	provider.ore(MBlocks.DILITHIUM_ORE)
 	provider.ore(MBlocks.DEEPSLATE_DILITHIUM_ORE)
diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt
index fc78990a2..192b0a0e3 100644
--- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt
+++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt
@@ -36,6 +36,7 @@ fun addItemModels(provider: MatteryItemModelProvider) {
 	provider.block(MItems.TRITANIUM_INGOT_BLOCK)
 
 	provider.block(MItems.WITHERED_STEEL_BLOCK)
+	provider.block(MItems.ROFLITE_ALLOY_BLOCK)
 
 	provider.block(MItems.DILITHIUM_ORE)
 	provider.block(MItems.DEEPSLATE_DILITHIUM_ORE)
@@ -103,6 +104,7 @@ fun addItemModels(provider: MatteryItemModelProvider) {
 
 	provider.resource(MItems.DILITHIUM_CRYSTAL)
 	provider.resource(MItems.WITHERED_STEEL)
+	provider.resource(MItems.ROFLITE_ALLOY_INGOT)
 
 	provider.generated(MItems.EXOPACK_PROBE)
 
diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt
index e9fef487e..432b6faa9 100644
--- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt
+++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt
@@ -613,6 +613,7 @@ private fun blocks(provider: MatteryLanguageProvider) {
 
 		add(MBlocks.TRITANIUM_INGOT_BLOCK, "Tritanium Plating Block")
 		add(MBlocks.WITHERED_STEEL_BLOCK, "Withered Steel Block")
+		add(MBlocks.ROFLITE_ALLOY_BLOCK, "Roflite Alloy Block")
 
 		addBlock(MBlocks.ENERGY_COUNTER.values, "Energy Counter")
 		addBlock(MBlocks.ENERGY_COUNTER.values, "desc", "Restricts energy flow direction;")
@@ -790,6 +791,7 @@ private fun items(provider: MatteryLanguageProvider) {
 		add(MItems.TRITANIUM_INGOT, "Tritanium Ingot")
 		add(MItems.DILITHIUM_CRYSTAL, "Dilithium Crystal")
 		add(MItems.WITHERED_STEEL, "Withered Steel Ingot")
+		add(MItems.ROFLITE_ALLOY_INGOT, "Roflite Alloy Ingot")
 		add(MItems.TRITANIUM_NUGGET, "Tritanium Nugget")
 		add(MItems.MATTER_IO_PORT, "Matter IO Port")
 		add(MItems.MATTER_TRANSFORM_MATRIX, "Matter Transformation Matrix")
diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt
index 08b3e8289..10232222a 100644
--- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt
+++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt
@@ -617,6 +617,7 @@ private fun blocks(provider: MatteryLanguageProvider) {
 
 		add(MBlocks.TRITANIUM_INGOT_BLOCK, "Блок слитков тритана")
 		add(MBlocks.WITHERED_STEEL_BLOCK, "Блок иссушенной стали")
+		add(MBlocks.ROFLITE_ALLOY_BLOCK, "Блок рофлитового сплава")
 
 		addBlock(MBlocks.ENERGY_COUNTER.values, "Счётчик энергии")
 		addBlock(MBlocks.ENERGY_COUNTER.values, "desc", "Ограничивает направление передачи энергии;")
@@ -783,6 +784,7 @@ private fun items(provider: MatteryLanguageProvider) {
 		add(MItems.TRITANIUM_INGOT, "Тритановый слиток")
 		add(MItems.DILITHIUM_CRYSTAL, "Дилитевый кристалл")
 		add(MItems.WITHERED_STEEL, "Слиток иссушенной стали")
+		add(MItems.ROFLITE_ALLOY_INGOT, "Слиток рофлитового сплава")
 		add(MItems.TRITANIUM_NUGGET, "Тритановый самородок")
 		add(MItems.MATTER_IO_PORT, "Порт ввода/вывода материи")
 		add(MItems.MATTER_TRANSFORM_MATRIX, "Матрица преобразования материи")
diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/ShapelessRecipes.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/ShapelessRecipes.kt
index 4c307d83e..cfbda0e05 100644
--- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/ShapelessRecipes.kt
+++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/ShapelessRecipes.kt
@@ -103,4 +103,14 @@ fun addShapelessRecipes(consumer: RecipeOutput) {
 		.requires(Ingredient.of(MItems.WITHERED_STEEL_BLOCK))
 		.unlockedBy(MItems.WITHERED_STEEL_BLOCK)
 		.save(consumer)
+
+	ShapelessRecipeBuilder(RecipeCategory.BUILDING_BLOCKS, MItems.ROFLITE_ALLOY_BLOCK, 1)
+		.requires(Ingredient.of(MItems.ROFLITE_ALLOY_INGOT), 9)
+		.unlockedBy(MItems.ROFLITE_ALLOY_INGOT)
+		.save(consumer)
+
+	ShapelessRecipeBuilder(RecipeCategory.MISC, MItems.ROFLITE_ALLOY_INGOT, 9)
+		.requires(Ingredient.of(MItems.ROFLITE_ALLOY_BLOCK))
+		.unlockedBy(MItems.ROFLITE_ALLOY_BLOCK)
+		.save(consumer)
 }
diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/MineableTags.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/MineableTags.kt
index 65b528c7e..1997e1145 100644
--- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/MineableTags.kt
+++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/MineableTags.kt
@@ -98,6 +98,7 @@ fun addMineableTags(tagsProvider: TagsProvider) {
 		MBlocks.DILITHIUM_ORE,
 		MBlocks.DEEPSLATE_DILITHIUM_ORE,
 		MBlocks.DILITHIUM_CRYSTAL_BLOCK,
+		MBlocks.ROFLITE_ALLOY_BLOCK,
 
 		MBlocks.GRAVITATION_STABILIZER,
 		MBlocks.GRAVITATION_STABILIZER_LENS,
diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/ResourceTags.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/ResourceTags.kt
index e4412cc17..af890afef 100644
--- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/ResourceTags.kt
+++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/ResourceTags.kt
@@ -21,6 +21,8 @@ fun addResourceTags(tagsProvider: TagsProvider) {
 
 	tagsProvider.dusts.add("tritanium", MItems.TRITANIUM_DUST)
 	tagsProvider.ingots.add("tritanium", MItems.TRITANIUM_INGOT)
+	tagsProvider.ingots.add("withered_steel", MItems.WITHERED_STEEL)
+	tagsProvider.ingots.add("roflite_alloy", MItems.ROFLITE_ALLOY_INGOT)
 
 	tagsProvider.wires.add("copper", MItems.COPPER_WIRING)
 	tagsProvider.wires.add("gold", MItems.GOLD_WIRING)
@@ -32,6 +34,10 @@ fun addResourceTags(tagsProvider: TagsProvider) {
 
 	tagsProvider.storageBlocksAsItem.add("tritanium", MItems.TRITANIUM_INGOT_BLOCK)
 	tagsProvider.storageBlocksAsBlock.add("tritanium", MBlocks.TRITANIUM_INGOT_BLOCK)
+	tagsProvider.storageBlocksAsItem.add("withered_steel", MItems.WITHERED_STEEL_BLOCK)
+	tagsProvider.storageBlocksAsBlock.add("withered_steel", MBlocks.WITHERED_STEEL_BLOCK)
+	tagsProvider.storageBlocksAsItem.add("roflite_alloy", MItems.ROFLITE_ALLOY_BLOCK)
+	tagsProvider.storageBlocksAsBlock.add("roflite_alloy", MBlocks.ROFLITE_ALLOY_BLOCK)
 
 	tagsProvider.singleDropOre(
 		MBlocks.TRITANIUM_ORE,
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MNames.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MNames.kt
index 22275788e..645448316 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MNames.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MNames.kt
@@ -212,6 +212,9 @@ object MNames {
 	const val WITHERED_STEEL_BLOCK = "withered_steel_block"
 	const val WITHERED_STEEL = "withered_steel"
 
+	const val ROFLITE_ALLOY_INGOT = "roflite_alloy_ingot"
+	const val ROFLITE_ALLOY_BLOCK = "roflite_alloy_block"
+
 	const val MATTER_IO_PORT = "matter_io_port"
 
 	const val CARBON_MESH = "carbon_mesh"
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MBlocks.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MBlocks.kt
index 4ded2667c..fee5dc637 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MBlocks.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MBlocks.kt
@@ -256,6 +256,10 @@ object MBlocks {
 		Block(BlockBehaviour.Properties.of().mapColor(MapColor.COLOR_GREEN).sound(SoundType.NETHERITE_BLOCK).explosionResistance(400f).destroyTime(3f).requiresCorrectToolForDrops())
 	}
 
+	val ROFLITE_ALLOY_BLOCK: Block by registry.register(MNames.ROFLITE_ALLOY_BLOCK) {
+		Block(BlockBehaviour.Properties.of().mapColor(MapColor.COLOR_BROWN).sound(SoundType.NETHERITE_BLOCK).explosionResistance(400f).destroyTime(3f).requiresCorrectToolForDrops())
+	}
+
 	val METAL_JUNK: MatteryBlock by registry.register(MNames.METAL_JUNK) {
 		 MatteryBlock(BlockBehaviour.Properties.of().sound(SoundType.NETHERITE_BLOCK).mapColor(MapColor.COLOR_GRAY).explosionResistance(45f).destroyTime(3f).requiresCorrectToolForDrops())
 			 .addSimpleDescription()
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MCreativeTabs.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MCreativeTabs.kt
index e4f0bfda6..af34056c0 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MCreativeTabs.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MCreativeTabs.kt
@@ -239,6 +239,9 @@ private fun addMainCreativeTabItems(consumer: CreativeModeTab.Output) {
 		accept(MItems.WITHERED_STEEL)
 		accept(MItems.WITHERED_STEEL_BLOCK)
 
+		accept(MItems.ROFLITE_ALLOY_INGOT)
+		accept(MItems.ROFLITE_ALLOY_BLOCK)
+
 		accept(MItems.TRITANIUM_TOOLS)
 		accept(MItems.TRITANIUM_SHIELD)
 		accept(MItems.SIMPLE_TRITANIUM_ARMOR)
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MItems.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MItems.kt
index 69520f486..1421df044 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MItems.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MItems.kt
@@ -666,6 +666,9 @@ object MItems {
 
 	val BREAD_MONSTER_SPAWN_EGG: Item by registry.register(MNames.BREAD_MONSTER_SPAWN_EGG){ SpawnEggItem(MEntityTypes.BREAD_MONSTER, 0xFFFFFF, 0xFFFFFF, Item.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) }
+
 	init {
 		MRegistry.registerItems(registry)
 	}

From 42b86778cbf3648bde197f172f983da9234e70b4 Mon Sep 17 00:00:00 2001
From: YuRaNnNzZZ <medved609@yandex.ru>
Date: Sun, 2 Mar 2025 05:44:11 +0300
Subject: [PATCH 07/13] =?UTF-8?q?=D0=92=D0=B5=D0=B0=D1=81=D0=BE=D0=BB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../ru/dbotthepony/mc/otm/datagen/tags/ConstructionTags.kt  | 6 +++++-
 src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/Tags.kt  | 2 ++
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/ConstructionTags.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/ConstructionTags.kt
index b8b11e83c..a021f54a8 100644
--- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/ConstructionTags.kt
+++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/ConstructionTags.kt
@@ -11,7 +11,11 @@ import ru.dbotthepony.mc.otm.registry.game.MItems
 import ru.dbotthepony.mc.otm.registry.MRegistry
 
 fun addConstructionTags(tagsProvider: TagsProvider) {
-	tagsProvider.blocks.Appender(BlockTags.BEACON_BASE_BLOCKS).add(MBlocks.TRITANIUM_INGOT_BLOCK)
+	tagsProvider.blocks.Appender(BlockTags.BEACON_BASE_BLOCKS)
+		.add(MBlocks.TRITANIUM_INGOT_BLOCK)
+		.add(MBlocks.DILITHIUM_CRYSTAL_BLOCK)
+		.add(MBlocks.WITHERED_STEEL_BLOCK)
+		.add(MBlocks.ROFLITE_ALLOY_BLOCK)
 
 	tagsProvider.blocks.Appender(MBlockTags.MULTIBLOCK_STRUCTURE)
 		.add(MBlockTags.MULTIBLOCK_HARD_STRUCTURE, MBlockTags.MULTIBLOCK_SOFT_STRUCTURE)
diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/Tags.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/Tags.kt
index 0d70d1a62..6f0af90f0 100644
--- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/Tags.kt
+++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/Tags.kt
@@ -20,6 +20,8 @@ fun addTags(tagsProvider: TagsProvider) {
 	tagsProvider.items.Appender(ItemTags.BEACON_PAYMENT_ITEMS)
 		.add(MItems.TRITANIUM_INGOT)
 		.add(MItems.DILITHIUM_CRYSTAL)
+		.add(MItems.WITHERED_STEEL)
+		.add(MItems.ROFLITE_ALLOY_INGOT)
 
 	tagsProvider.items.Appender(ItemTags.MEAT).add(MItems.NUTRIENT_PASTE)
 

From 2ee6c7e923940e5c758590a3b330035f0f65c409 Mon Sep 17 00:00:00 2001
From: GearShocky <gearshockmirasu@gmail.com>
Date: Mon, 3 Mar 2025 03:20:42 +0500
Subject: [PATCH 08/13] Loader

---
 src/bb/loader.bbmodel                         |   1 +
 .../mc/otm/datagen/DecorativeData.kt          |   4 +
 .../mc/otm/datagen/SoundDataProvider.kt       |  12 ++
 .../mc/otm/datagen/items/ItemModels.kt        |   1 +
 .../mc/otm/datagen/lang/English.kt            |   1 +
 .../mc/otm/datagen/lang/Russian.kt            |   1 +
 .../otm/datagen/recipes/DecorativesRecipes.kt |   5 +
 .../mc/otm/datagen/tags/MineableTags.kt       |   1 +
 .../otm/client/animation/LoaderAnimation.java | 129 ++++++++++++++
 .../otm/client/model/entity/LoaderModel.java  | 100 +++++++++++
 .../client/render/entity/LoaderRenderer.kt    |  18 ++
 .../ru/dbotthepony/mc/otm/entity/Loader.kt    | 130 ++++++++++++++
 .../ru/dbotthepony/mc/otm/registry/MNames.kt  |   3 +
 .../mc/otm/registry/game/MBlocks.kt           |   1 +
 .../mc/otm/registry/game/MCreativeTabs.kt     |   1 +
 .../mc/otm/registry/game/MEntityTypes.kt      |  17 +-
 .../mc/otm/registry/game/MItems.kt            |   3 +
 .../mc/otm/registry/game/MSoundEvents.kt      |   2 +
 .../assets/overdrive_that_matters/loader.java |  75 ++++++++
 .../models/loader.animation.json              | 166 +++++++++++++++++
 .../models/model.animation.json               | 167 ++++++++++++++++++
 .../sounds/entity/loader/loader_ambient.ogg   | Bin 0 -> 21689 bytes
 .../sounds/entity/loader/loader_ambient2.ogg  | Bin 0 -> 31719 bytes
 .../textures/entity/loader.png                | Bin 0 -> 1966 bytes
 .../textures/item/egg/loader.png              | Bin 0 -> 496 bytes
 25 files changed, 834 insertions(+), 4 deletions(-)
 create mode 100644 src/bb/loader.bbmodel
 create mode 100644 src/main/java/ru/dbotthepony/mc/otm/client/animation/LoaderAnimation.java
 create mode 100644 src/main/java/ru/dbotthepony/mc/otm/client/model/entity/LoaderModel.java
 create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/client/render/entity/LoaderRenderer.kt
 create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/entity/Loader.kt
 create mode 100644 src/main/resources/assets/overdrive_that_matters/loader.java
 create mode 100644 src/main/resources/assets/overdrive_that_matters/models/loader.animation.json
 create mode 100644 src/main/resources/assets/overdrive_that_matters/models/model.animation.json
 create mode 100644 src/main/resources/assets/overdrive_that_matters/sounds/entity/loader/loader_ambient.ogg
 create mode 100644 src/main/resources/assets/overdrive_that_matters/sounds/entity/loader/loader_ambient2.ogg
 create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/entity/loader.png
 create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/item/egg/loader.png

diff --git a/src/bb/loader.bbmodel b/src/bb/loader.bbmodel
new file mode 100644
index 000000000..6c2f8a72b
--- /dev/null
+++ b/src/bb/loader.bbmodel
@@ -0,0 +1 @@
+{"meta":{"format_version":"4.10","model_format":"modded_entity","box_uv":true},"name":"loader","model_identifier":"","modded_entity_entity_class":"","modded_entity_version":"1.17","modded_entity_flip_y":true,"visible_box":[1,1,0],"variable_placeholders":"","variable_placeholder_buttons":[],"timeline_setups":[],"unhandled_root_fields":{},"resolution":{"width":128,"height":64},"elements":[{"name":"torso","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-10,32,-6],"to":[10,42,7],"autouv":0,"color":5,"origin":[-7,28,-7],"faces":{"north":{"uv":[13,13,33,23],"texture":0},"east":{"uv":[0,13,13,23],"texture":0},"south":{"uv":[46,13,66,23],"texture":0},"west":{"uv":[33,13,46,23],"texture":0},"up":{"uv":[33,13,13,0],"texture":0},"down":{"uv":[53,0,33,13],"texture":0}},"type":"cube","uuid":"814c3695-0447-39a1-76f7-67446edfae84"},{"name":"waist","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-3,24,-5],"to":[3,29,3],"autouv":0,"color":5,"origin":[-7,13,-8],"uv_offset":[0,50],"faces":{"north":{"uv":[8,58,14,63],"texture":0},"east":{"uv":[0,58,8,63],"texture":0},"south":{"uv":[22,58,28,63],"texture":0},"west":{"uv":[14,58,22,63],"texture":0},"up":{"uv":[14,58,8,50],"texture":0},"down":{"uv":[20,50,14,58],"texture":0}},"type":"cube","uuid":"d4bde61a-a2bc-2e0e-d424-6d2a5fd49c8e"},{"name":"leg_r","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[4,0,-3],"to":[8,16,4],"autouv":0,"color":5,"origin":[-4,0,-9],"uv_offset":[84,24],"faces":{"north":{"uv":[91,31,95,47],"texture":0},"east":{"uv":[84,31,91,47],"texture":0},"south":{"uv":[102,31,106,47],"texture":0},"west":{"uv":[95,31,102,47],"texture":0},"up":{"uv":[95,31,91,24],"texture":0},"down":{"uv":[99,24,95,31],"texture":0}},"type":"cube","uuid":"875db368-a5a5-0032-1521-03229112dabe"},{"name":"leg_l","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-9,16,-4],"to":[-3,28,2],"autouv":0,"color":5,"origin":[-16,12,-9],"uv_offset":[66,46],"faces":{"north":{"uv":[72,52,78,64],"texture":0},"east":{"uv":[66,52,72,64],"texture":0},"south":{"uv":[84,52,90,64],"texture":0},"west":{"uv":[78,52,84,64],"texture":0},"up":{"uv":[78,52,72,46],"texture":0},"down":{"uv":[84,46,78,52],"texture":0}},"type":"cube","uuid":"6c41d302-78c7-0b70-1381-dc318bdeffaa"},{"name":"arm_r","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[12,27,-3],"to":[16,43,5],"autouv":0,"color":5,"origin":[5,27,-7],"uv_offset":[80,0],"faces":{"north":{"uv":[88,8,92,24],"texture":0},"east":{"uv":[80,8,88,24],"texture":0},"south":{"uv":[100,8,104,24],"texture":0},"west":{"uv":[92,8,100,24],"texture":0},"up":{"uv":[92,8,88,0],"texture":0},"down":{"uv":[96,0,92,8],"texture":0}},"type":"cube","uuid":"119c57f2-6f39-6a4a-d621-2f39f6afe8de"},{"name":"joint","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[10,33,-2],"to":[12,39,4],"autouv":0,"color":5,"origin":[4,26,-7],"uv_offset":[96,52],"faces":{"north":{"uv":[102,58,104,64],"texture":0},"east":{"uv":[96,58,102,64],"texture":0},"south":{"uv":[110,58,112,64],"texture":0},"west":{"uv":[104,58,110,64],"texture":0},"up":{"uv":[104,58,102,52],"texture":0},"down":{"uv":[106,52,104,58],"texture":0}},"type":"cube","uuid":"881ca750-ae6a-60ac-4442-e7fa528a00dc"},{"name":"arm_r","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[12,8.2,-2],"to":[16,27.2,6],"autouv":0,"color":5,"inflate":-0.1,"origin":[5,11.2,-6],"uv_offset":[0,23],"faces":{"north":{"uv":[8,31,12,50],"texture":0},"east":{"uv":[0,31,8,50],"texture":0},"south":{"uv":[20,31,24,50],"texture":0},"west":{"uv":[12,31,20,50],"texture":0},"up":{"uv":[12,31,8,23],"texture":0},"down":{"uv":[16,23,12,31],"texture":0}},"type":"cube","uuid":"04cc32cf-81f9-b699-03b1-ab6f6e096afe"},{"name":"arm_l","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-16,8.2,-1],"to":[-12,27.2,7],"autouv":0,"color":5,"inflate":-0.1,"origin":[-23,11.2,-5],"uv_offset":[24,23],"faces":{"north":{"uv":[32,31,36,50],"texture":0},"east":{"uv":[24,31,32,50],"texture":0},"south":{"uv":[44,31,48,50],"texture":0},"west":{"uv":[36,31,44,50],"texture":0},"up":{"uv":[36,31,32,23],"texture":0},"down":{"uv":[40,23,36,31],"texture":0}},"type":"cube","uuid":"f3f72252-bd21-08bf-61ea-10740d9905c1"},{"name":"arm_l","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-16,27,-2],"to":[-12,43,6],"autouv":0,"color":5,"origin":[-23,27,-6],"uv_offset":[104,0],"faces":{"north":{"uv":[112,8,116,24],"texture":0},"east":{"uv":[104,8,112,24],"texture":0},"south":{"uv":[124,8,128,24],"texture":0},"west":{"uv":[116,8,124,24],"texture":0},"up":{"uv":[116,8,112,0],"texture":0},"down":{"uv":[120,0,116,8],"texture":0}},"type":"cube","uuid":"a9e25394-526f-d387-d1ed-8d53a3085025"},{"name":"joint","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-12,33,-1],"to":[-10,39,5],"autouv":0,"color":5,"origin":[-18,26,-6],"uv_offset":[112,52],"faces":{"north":{"uv":[118,58,120,64],"texture":0},"east":{"uv":[112,58,118,64],"texture":0},"south":{"uv":[126,58,128,64],"texture":0},"west":{"uv":[120,58,126,64],"texture":0},"up":{"uv":[120,58,118,52],"texture":0},"down":{"uv":[122,52,120,58],"texture":0}},"type":"cube","uuid":"9d99a85f-5d82-fb1d-1a34-32e445b2a60b"},{"name":"leg_r","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[3,16,-4],"to":[9,28,2],"autouv":0,"color":5,"origin":[-4,12,-9],"uv_offset":[48,34],"faces":{"north":{"uv":[54,40,60,52],"texture":0},"east":{"uv":[48,40,54,52],"texture":0},"south":{"uv":[66,40,72,52],"texture":0},"west":{"uv":[60,40,66,52],"texture":0},"up":{"uv":[60,40,54,34],"texture":0},"down":{"uv":[66,34,60,40],"texture":0}},"type":"cube","uuid":"33d60e6d-97a2-25f9-335e-1b1e34feb983"},{"name":"leg_l","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-8,0,-3],"to":[-4,16,4],"autouv":0,"color":5,"origin":[-16,0,-9],"uv_offset":[106,24],"faces":{"north":{"uv":[113,31,117,47],"texture":0},"east":{"uv":[106,31,113,47],"texture":0},"south":{"uv":[124,31,128,47],"texture":0},"west":{"uv":[117,31,124,47],"texture":0},"up":{"uv":[117,31,113,24],"texture":0},"down":{"uv":[121,24,117,31],"texture":0}},"type":"cube","uuid":"f28e1a84-932b-1c79-948e-0bb712c319d5"},{"name":"head","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[1,30,-7],"to":[7,33,-4],"autouv":0,"color":5,"origin":[-3,26,-10],"uv_offset":[48,23],"faces":{"north":{"uv":[51,26,57,29],"texture":0},"east":{"uv":[48,26,51,29],"texture":0},"south":{"uv":[60,26,66,29],"texture":0},"west":{"uv":[57,26,60,29],"texture":0},"up":{"uv":[57,26,51,23],"texture":0},"down":{"uv":[63,23,57,26],"texture":0}},"type":"cube","uuid":"39910222-2ee3-f872-643d-0e5eb3b52c76"},{"name":"waist","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-2,27,-3],"to":[2,34,4],"autouv":0,"color":5,"rotation":[15,0,0],"origin":[0,29,1],"uv_offset":[28,50],"faces":{"north":{"uv":[35,57,39,64],"texture":0},"east":{"uv":[28,57,35,64],"texture":0},"south":{"uv":[46,57,50,64],"texture":0},"west":{"uv":[39,57,46,64],"texture":0},"up":{"uv":[39,57,35,50],"texture":0},"down":{"uv":[43,50,39,57],"texture":0}},"type":"cube","uuid":"b8a04e05-1ec0-77f7-9790-9eac08a7dba6"},{"name":"canister","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-5,23,3],"to":[5,27,7],"autouv":0,"color":9,"origin":[0,25,4],"uv_offset":[53,0],"faces":{"north":{"uv":[57,4,67,8],"texture":0},"east":{"uv":[53,4,57,8],"texture":0},"south":{"uv":[71,4,81,8],"texture":0},"west":{"uv":[67,4,71,8],"texture":0},"up":{"uv":[67,4,57,0],"texture":0},"down":{"uv":[77,0,67,4],"texture":0}},"type":"cube","uuid":"95641dec-5f50-5280-94bd-3367b934546e"},{"name":"antenna","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-8,41,6],"to":[-8,55,8],"autouv":0,"color":0,"rotation":[15,0,0],"origin":[-8,48,7],"uv_offset":[76,6],"faces":{"north":{"uv":[78,8,78,22],"texture":0},"east":{"uv":[76,8,78,22],"texture":0},"south":{"uv":[80,8,80,22],"texture":0},"west":{"uv":[78,8,80,22],"texture":0},"up":{"uv":[78,8,78,6],"texture":0},"down":{"uv":[78,6,78,8],"texture":0}},"type":"cube","uuid":"ffa15fd9-1b87-5f57-f40e-84f4af6e8cea"}],"outliner":[{"name":"root","origin":[0,0,0],"color":0,"uuid":"70492b75-a238-2093-aee7-2e34103a16f7","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"selected":false,"children":[{"name":"Head","origin":[4,32,-5],"color":0,"uuid":"1ac29cbf-6a37-f40e-3378-1970cfbbcedf","export":true,"mirror_uv":false,"isOpen":false,"locked":false,"visibility":true,"autouv":0,"selected":false,"children":["39910222-2ee3-f872-643d-0e5eb3b52c76"]},{"name":"Body","origin":[0,26,-1],"color":0,"uuid":"88d057c8-aaec-acdf-2b62-5ff3c25da745","export":true,"mirror_uv":false,"isOpen":false,"locked":false,"visibility":true,"autouv":0,"selected":false,"children":["814c3695-0447-39a1-76f7-67446edfae84","d4bde61a-a2bc-2e0e-d424-6d2a5fd49c8e","b8a04e05-1ec0-77f7-9790-9eac08a7dba6","ffa15fd9-1b87-5f57-f40e-84f4af6e8cea","9d99a85f-5d82-fb1d-1a34-32e445b2a60b","881ca750-ae6a-60ac-4442-e7fa528a00dc","95641dec-5f50-5280-94bd-3367b934546e"]},{"name":"LeftLeg","origin":[-4,26,-1],"color":0,"uuid":"1a6dd538-885d-1a07-b404-079aa2a6d33e","export":true,"mirror_uv":false,"isOpen":false,"locked":false,"visibility":true,"autouv":0,"selected":false,"children":["f28e1a84-932b-1c79-948e-0bb712c319d5","6c41d302-78c7-0b70-1381-dc318bdeffaa"]},{"name":"RightLeg","origin":[4,26,-1],"color":0,"uuid":"95722aa0-de6d-5b71-e4a2-6e4961d4ec06","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"selected":false,"children":["875db368-a5a5-0032-1521-03229112dabe","33d60e6d-97a2-25f9-335e-1b1e34feb983"]},{"name":"LeftArm","origin":[-13,36,2],"color":0,"uuid":"f844f14b-21ca-39e1-6894-44acf6a87e82","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"selected":false,"children":["a9e25394-526f-d387-d1ed-8d53a3085025",{"name":"ElbowL","origin":[-14,27,1],"color":0,"uuid":"268467a2-4618-ea8b-5939-33514427d85d","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"selected":false,"children":["f3f72252-bd21-08bf-61ea-10740d9905c1"]}]},{"name":"RightArm","origin":[13,36,1],"color":0,"uuid":"5f36cdfe-dde4-7230-1baf-aa1a87c0547b","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"selected":false,"children":["119c57f2-6f39-6a4a-d621-2f39f6afe8de",{"name":"ElbowR","origin":[14,27,0],"color":0,"uuid":"633b2662-0fe0-f0d4-c002-49d98baece5f","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"selected":false,"children":["04cc32cf-81f9-b699-03b1-ab6f6e096afe"]}]}]}],"textures":[{"path":"L:\\overdrive_that_matters\\src\\main\\resources\\assets\\overdrive_that_matters\\textures\\entity\\loader.png","name":"loader.png","folder":"block","namespace":"","id":"0","group":"","width":128,"height":64,"uv_width":128,"uv_height":64,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","pbr_channel":"color","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"5d91dc01-e8a2-6bd9-d3d2-e81fe7ee8465","relative_path":"../main/resources/assets/overdrive_that_matters/textures/entity/loader.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAYAAADS1n9/AAAAAXNSR0IArs4c6QAADJVJREFUeF7tXW+MnkUR3xobeqlwtJCc5bQWwctZwVBChVZDYjSiARL5U2sIQWzPP/BBEhsVv2j8JBprRBPU2FolhNiUqkmLBqMxKdCiJVSl1MuB0lbbcgk0HNgUUmPNb9/O03nmZndnnz/v+x7X/XLvPc/s7Ozub2dnZ3b3meMqpJ3bV5/k2Y5MHnOLhuZHOa249hf+/ebNm93q1avdroc/WdA/ve9F/3v9hn9N47Fu7O0q3xjt5778hzk802+vvtrL+9CFQ+7m5ydL/PizI8eP+3c/dM7dIUrlz9bs3l3iH6s4tRXa6MWXjrvf7XxziXzrrx8x89LK+fG3P3Ty/PMGivZfv+HlLP6VCt+68boSACwYOjH/1hLZ3GMPFP+jYZA2bHllGquxVeeo7GO0IQBsWDjgxo52yqLEnxEAHh5e6K49dLREx5/lAOCmj19z8uCho27x8EL3kZX/9QDA/0h41gQAiCf4IeXwrwQAqQEsACANQLRcA9z1jX+6UEeDHhUcvmDIZz10eNI3ZCgBGLvFCP3p8uUesKmOXTQw0AFiAigf27HD3G5oK4z+B7edKADw9L7nfTmXLr2wMQDccv1crwWgAXL4myvCG9wKAJoa8PfGNdvcxMSEGxkZ8awkAKampqb16eDgoHvv0iVu/vwBd+xYZ+TS77/t2+9CeUIASKl2AkBqqjgDAGEDhEYj5vZLl57v8PezX/p9Mf9rAAjxiAEglAfz9+Rrr/nXQ/PmFb9/OW+eu/HUc8rLn3Fa/G4CELNaA+QAIKYBXp56pTQFnDt4jotpAHTyc5ePOuS74h+HC5ykAADCJy+6wIH/xU+Nu8sWLHCwCx5fukQ1Ht+/b78HSUwjzGoANDUFaCM9BQDekdpoDz3jwGkCAJoRmDNHp+wrrAKkEZjDv1UbgAufMgJDGiDWAKE8/TYFoA58GZjTQRYAyGVgDv/KANi45X9etrWr3pSS0b+XABi7/RNFfqwCtM4EAQxBLcXopRFoEtBINDIyUloC/+y7y7zlvW7s3BIH+SzkB5DFYoUTW9en6PE+R56+AUBsGcgrra3/ZaP0OwCwTpcABtDJVyABkEPfNQCQx0kiPzSQpAa4+YaPelLkJz9AqnMBEqLpFw3wza+M+DU+1uE8ac/IE2jpUOIFPjn0yJcjTyUNUMUTeMkH1pcaaO9j64r/Y55AnsmqJaQn0KjdTWRNTAHkqZMFxjSAJpxG3zUNwAXKiQWQM0iLBUg/uTbfWXqpTQCgfALBxMTEHCzzcuZcqiOWmjxhyYoUsgGs9NkAoHVqKpgDxqGOrguAGG/Z4VpZmF5CXkYNMBqPlddtNmtDDQByVGN08umRG4HoTM23gWcaAHLoCQBWeTyC+Xo9NMIAEN5wB/9zg1u2bJnbs2ePz4LfSC89+zWVBdkAmgbgAEAZVhmIrtcACMnMB5UEgObejgHASk9tqbWhJo8HAIVjLeoVrl0kAgB+AwQEhsVv+VUlAFSRoV8AYGm3bgIgR54CALCuoba0uYasUMTmCQC8kCamAAAAMX5aDoXkgCEoZSANQDJxAzOmTfi7OlNAToPDBshR6bAvcugtspCWgPFdACAlGLxL3QAAQqSpCmsA4BXnBqa1QboJAMhkNepouW2lt9aXNNI0AITmmm4DIDbnzXQAtL0MtICgMQAQI+690gRIGYE0BZAGsACA7IbBxZ8pFTl18CfTpomYjQFAdVMD0JT66bPOcrsuW+nG//THYurTVgFEP3rlB92Kv+x0m15/PUhv6fxKUwCE4POv1Wij0WoBALdDYssk4gkZQlvDpJZI0dYFQGz1Qp0iPYFNAiDV8XKZX2gAePUgWMoIRAEAAEY6krbBUQpBaMZz8gTSikEaaiQDaGPGqJQhtDmU5OSNH6O9ae32yn4APqJSHUGhW7iyqwAA/KXGSJWpaecCAIgngwGNJNpYSEz5fCVdsX9+prMJMZTe957TGys1NS3z8dEckkPK0NZO4lSj0ntt1y832KDJ+CZN5Ks6BSAvpgEOAOKnDRzNr0ByFwBIVRQbGjgNgh40+lHRjT/fYh45WlmSP60ASHvkjEzJK1W3ujtywZ/HRXi7UNnoBB6fT8nEtSZoEdhJJc5fgk/y47z8MjDFnHa0EMLaAAAfITMNAKn24+8lQOVqoGoYuw5fEwA4wjgA/AioebABwmsjpIoGWPupVVnnFepqr5zOB60cTFRv4oPgUi7PunyTBcoOakMDSBXG567UFEDol44S2ZAUbQs1cF0gWzpOtmWTGoC3YQ7fNxQA4Du49777i764687b/G+cKehHADSpATgAcvjWAkA/TAFnNEBnapm1GsCievuFRnZUzkiN1aEO31oaoKllYB0boF861yJHnZGaA4AsG0Du75Nr2V6tY7khGKo8ZG17+5elY+VSDwMD9ggSDrOSgSrbkj+nw68xe6UNvj4aSBWQmxbwXPNkhSzu2I4WrSHJMJN+ACpXBkY4D5J1pgEgVFcJAN7ZBIoYAKryVQEQQz3fN8ARLB04FHzgGxpC9LHyQlHGmQQAixaRAMD/u3b/3WddsfzdhSbhmqUJvtMAEGPKpweM3qYAIAM3UgZtw2oKACG3sDS8qKyqThgpK8qVo9fSUdSxNNpTAKDj8ineKb4lAMSYadODpK8yBcTUvEWe0BRAQS7JQwsegaYtAKQ6SL7X1L32rCm+c1KHPOjQBhWYu3c/lz6lDaQ8IQCgXjKQAi/mPT8q3xFE9arqh09pgKY6ijQujeim+FbSAP20pSkEABi3OHJ29+c7V8ug4+/9+jv9ZRVaasqY5FMARq61w4jWMgU0ybcyAKpuaGh6S1MMAPzEDv3uJgAANEtncRoLAJrkOysBMPnqJSUlMHT23sb8CdIIbEpV990U0C8aADZGyJDUNADvEMuZ/dwoYVMA0IDDVxdVgSXz1dYAYBjbpYpOaHNXa1MACDm3cvcMyOUnre9THQaPYU5qim8tAFi2KWsAQEVxYVPoeLOlIfjojWkA7iGTdxloBzZ52VViHTg4StfbcV9Jqk5EG7r7CPnb4Nt1AGBDI1WmbQDIrdqhrdHcu1kXAMtPXUqJ6+1SexAkKAA4ACCWmuZbyQ+QUum8AnwbNO1olQDg9Ll+gNgUkBp1bWoAXnboNhOikfcgWe9LaoKvSQNQQ6UaVHYkRpz1AEnqZJFmvOEZBwDRpO464JpB28nLy6prA+S0WS9ozQCwbE/mFeB311oqRvQWWnQgl4ffHZzSIMSfexRpCtDKDqnxUEwhdKuZpV69oMkCgNxzLoNBVAE0GnUoXSenBY80eksjEAAoAkl5rHEFy/KP89RkajumYGmHJmiSNgAVghGXCwDk/c2OzsYICwByKkTyPLrrrz4bRh4dG7NMAXQUjc+j4EH/02+6BUxqt7ZjCjltUYf2DQ2AJ8c7N5NTumJ0wv8kDYCjaCkA4CLIXsQU6nRqTl7TnkCNobwXj2hS+/hjwm3fe6B0sGPT+h+UyLdu+s40eenCJk0DAACkefD3w1e+UAkAvYgp5HRiHVoTALQbp2AEacuXOnF1AOCqi9/m6/PEc/92AMDw0Fv9/4cmX3BWAFCDPLP/ouK2EUxfwws6F1ohWacAeRUsDyq1GVOo06k5eU0AkBYvLnHoFwDkVDZGCxduv8UUuLxVYhKW/GcAcKqVmgJAUzEFec4x1x9hzX8GAEYAdDum8IU7byvZQ9+/7/5kX/ERb82fZMoPM1ABs20K6EVMwdqBoWnNmt8EgG4agbxCllVAN2yAVBltxBSsKjwkmzW/CQBaIVWXgbRsgxahxI1MHjDiGkfS4n4d7EOgVGf1AR7cBiCeFocSX1XEXMq5c7jcV9CaEZjaFZxCf+578qDxr4HxEOii0cvdkfGnSmw1WnwYCnsKKNXd1UsAIH5NxxRCAKAdRLzCMv4QuiSS8tR57z2BIbcmdtTKS6L5xdJV8t3+xc5aPKQBrrn1DvfIA/jC3+mk0d49OOjuYd8abEIDUIltxBRCIxiqWrsSTwKCfzhT6/Cq7z0AvvqtjotUJvjBCQD8HT2z5CM1SsCBWxWJ3wLGbYyrrr/Fvz/w7Lh7x7tG/d+5r57eJHHi7CX+OaUntj3of9bVADGPYkjL5biUQwAFALRLMfmJnjbfmwCgNQAqXwUAKQ2glaVpANgAh1etKbRFXQ2QcilzuarEFGYsAELox/MYAEL5Jr53wH/NEx9jJGTjA4z40qf8yifxCNkAuGYV5wyQL+eDzppsKQDUjSnEANDTKSDWwW28S60CUKa08C0rhjY0ANW/iZhCSL5eG4H/B+VWqNfitjynAAAAAElFTkSuQmCC"}],"animations":[{"uuid":"1c636d17-a07c-9948-4cbd-ca4621e1570d","name":"Idle","loop":"loop","override":false,"length":0.16,"snapping":25,"selected":false,"anim_time_update":"","blend_weight":"","start_delay":"","loop_delay":"","animators":{"88d057c8-aaec-acdf-2b62-5ff3c25da745":{"name":"Body","type":"bone","keyframes":[{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"4c8bc2ce-01d3-3618-51be-c32772f9f3e5","time":0,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"-0.1","z":"0"}],"uuid":"eee55604-44a1-cb70-a605-9d301960a66c","time":0.08,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"1a2b0737-505d-f39b-e2ba-c1177be3183e","time":0.16,"color":-1,"interpolation":"linear"}]},"1ac29cbf-6a37-f40e-3378-1970cfbbcedf":{"name":"Head","type":"bone","keyframes":[{"channel":"position","data_points":[{"x":"0","y":"-0.1","z":"0"}],"uuid":"3495d3da-b68f-2b36-d97c-b338c91ab3db","time":0.08,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"c80186d3-2820-1f4c-c630-0271f698f8de","time":0,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"2b5fac7a-1c1f-025e-d99d-d73925652d3a","time":0.16,"color":-1,"interpolation":"linear"}]},"f844f14b-21ca-39e1-6894-44acf6a87e82":{"name":"LeftArm","type":"bone","keyframes":[{"channel":"position","data_points":[{"x":"0","y":"0.1","z":"0"}],"uuid":"0ba8d7f1-f6bb-d281-4d32-aa1320da9bac","time":0,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"-0.2","z":"0"}],"uuid":"5ec0529e-78af-da29-6b79-0dd5d41ca0c3","time":0.12,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"156daf99-5b44-74fa-f4fa-f88a7fe7fdf1","time":0.16,"color":-1,"interpolation":"linear"}]},"5f36cdfe-dde4-7230-1baf-aa1a87c0547b":{"name":"RightArm","type":"bone","keyframes":[{"channel":"position","data_points":[{"x":"0","y":"0.1","z":"0"}],"uuid":"1669453e-e9ea-54eb-157a-ade5bc4acfca","time":0,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"-0.2","z":"0"}],"uuid":"f65492fa-fd3e-b6ec-5a87-a21616f07974","time":0.12,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"31f4b9e5-4ec9-34b5-2e98-2810f389e3cd","time":0.16,"color":-1,"interpolation":"linear"}]}}},{"uuid":"11883990-8ed5-76fb-6ad5-88877ad19206","name":"Move","loop":"loop","override":false,"length":0.48,"snapping":25,"selected":false,"anim_time_update":"","blend_weight":"","start_delay":"","loop_delay":"","animators":{"88d057c8-aaec-acdf-2b62-5ff3c25da745":{"name":"Body","type":"bone","keyframes":[{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"d197d715-2135-a6b6-2c27-6102f7af421d","time":0,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"02b9f92d-f769-ba18-b3aa-c09db0c98d2f","time":0.48,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0.3","z":"0"}],"uuid":"f185aefb-7095-6361-8b19-c83881676414","time":0.12,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"7c7e3f65-d803-9b49-ab9a-76d85beb56f9","time":0.24,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0.3","z":"0"}],"uuid":"939bf97f-8385-970a-5778-b671eba240b8","time":0.36,"color":-1,"interpolation":"linear"}]},"1ac29cbf-6a37-f40e-3378-1970cfbbcedf":{"name":"Head","type":"bone","keyframes":[{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"af1fda25-23f4-abcb-2732-83533bfa2ce9","time":0,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"c2ebf76a-0ccc-2c68-0518-908001c5a54d","time":0.48,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"8c4c4af1-8909-ce97-a249-86775ac5ee95","time":0.24,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0.3\n\n","z":"0"}],"uuid":"c060f1a3-83b5-2ecb-3bc6-baef22237038","time":0.12,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0.3\n\n","z":"0"}],"uuid":"b61c7f88-4c73-e6a6-9562-e58a2736fdca","time":0.36,"color":-1,"interpolation":"linear"}]},"1a6dd538-885d-1a07-b404-079aa2a6d33e":{"name":"LeftLeg","type":"bone","keyframes":[{"channel":"rotation","data_points":[{"x":"-22.5","y":"0","z":"0"}],"uuid":"bd5770ff-8ccd-c043-d0fa-062d2e5048c4","time":0,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"22.5","y":"0","z":"0"}],"uuid":"b0893e6a-eb82-98d9-5eaf-8f4b2850bac8","time":0.24,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"-22.5","y":"0","z":"0"}],"uuid":"2be537f5-bd1d-8a51-828d-132ae4b17475","time":0.48,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"-2"}],"uuid":"edc991d2-7db9-3888-e406-f900b22e8a94","time":0,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"1c1a7f4d-9a40-84de-4a21-e7c60d497d74","time":0.12,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"2","z":"-2"}],"uuid":"37c5c3fc-c161-2b5c-5e4b-f6a04af7dde0","time":0.36,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"-2"}],"uuid":"83acc05a-ad21-62ae-4117-00367709f538","time":0.48,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"1","z":"1"}],"uuid":"43acca1c-e84d-3891-7a81-4c70a03725b6","time":0.24,"color":-1,"interpolation":"linear"}]},"95722aa0-de6d-5b71-e4a2-6e4961d4ec06":{"name":"RightLeg","type":"bone","keyframes":[{"channel":"rotation","data_points":[{"x":"22.5","y":"0","z":"0"}],"uuid":"09ec6dd7-3127-1f13-e8a3-dcfd2da776fc","time":0,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"-22.5","y":"0","z":"0"}],"uuid":"0173cd08-d356-d4ef-46b5-d7cbffdc01d1","time":0.24,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"22.5","y":"0","z":"0"}],"uuid":"e6a71516-8f2c-fe88-3290-14490c396a02","time":0.48,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"2"}],"uuid":"5a851052-195e-01c7-0dd0-7de72aeb81d8","time":0,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"2","z":"-2"}],"uuid":"13a4db9a-c9b3-2da0-8792-d8ab843c447e","time":0.12,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"-2"}],"uuid":"0d401039-50ff-f0e9-4183-4c3a3fd1db55","time":0.24,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"02de010a-22b6-5325-b11e-1acf694c255f","time":0.36,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"2"}],"uuid":"b7317f11-b928-29f7-98ae-e8573c385d10","time":0.48,"color":-1,"interpolation":"linear"}]},"f844f14b-21ca-39e1-6894-44acf6a87e82":{"name":"LeftArm","type":"bone","keyframes":[{"channel":"rotation","data_points":[{"x":"6","y":"0","z":"0"}],"uuid":"422efc11-7e19-3ecb-e011-a2fb51d1120f","time":0,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"-6","y":"0","z":"0"}],"uuid":"2e0f259d-3095-aa71-87e9-b51eac2a3e17","time":0.24,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"6","y":"0","z":"0"}],"uuid":"ecf8f5d3-7a87-64f1-db04-4a54e117c463","time":0.48,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0.2\n\n","z":"0"}],"uuid":"ed94c6d3-55ed-51cc-422b-e34430c4035b","time":0.12,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"4a566952-2082-99c6-0499-f32ac4639806","time":0,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"19af21f0-0527-bd6e-5b44-290d9c085384","time":0.24,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0.2\n\n","z":"0"}],"uuid":"2fc07e1c-219d-5f0c-7b02-e4c042409aa2","time":0.36,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"15216770-03c9-b3dd-fe84-5bf991ccbcbc","time":0.48,"color":-1,"interpolation":"linear"}]},"633b2662-0fe0-f0d4-c002-49d98baece5f":{"name":"ElbowR","type":"bone","keyframes":[{"channel":"rotation","data_points":[{"x":"-30\n\n","y":"0","z":"0"}],"uuid":"1e414dda-1b9b-5684-b718-8aa5e84cbffd","time":0,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"-19.5","y":"0","z":"0"}],"uuid":"a4512673-e7f6-8465-1db6-a5666cc83612","time":0.24,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"-30\n\n","y":"0","z":"0"}],"uuid":"bb27fe16-7b73-2d2a-7245-e38c6f3f725d","time":0.48,"color":-1,"interpolation":"linear"}]},"5f36cdfe-dde4-7230-1baf-aa1a87c0547b":{"name":"RightArm","type":"bone","keyframes":[{"channel":"rotation","data_points":[{"x":"-6","y":"0","z":"0"}],"uuid":"59c1e6b7-0b46-a513-b3b8-0b6372a827da","time":0,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"6","y":"0","z":"0"}],"uuid":"eaa5279e-adee-6a2e-ad31-03808285c8e8","time":0.24,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"-6","y":"0","z":"0"}],"uuid":"cecb0f80-0f7c-f85a-d290-63c80c8dae67","time":0.48,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0.2\n\n","z":"0"}],"uuid":"fbd8d639-3bf9-55b4-6900-a94c7fd626ab","time":0.12,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"02be819a-e5fb-4bb2-f14e-72bff7095860","time":0,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"10f78b40-9248-1bac-65c5-2baae38a1370","time":0.24,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"7ed7cae5-e481-b030-6d4d-b616b0eb616b","time":0.48,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0.2\n\n","z":"0"}],"uuid":"87c26349-b1f0-063d-13c0-a1dbd5b4aa1e","time":0.36,"color":-1,"interpolation":"linear"}]},"268467a2-4618-ea8b-5939-33514427d85d":{"name":"ElbowL","type":"bone","keyframes":[{"channel":"rotation","data_points":[{"x":"-16.5","y":"0","z":"0"}],"uuid":"b83eb8f9-d509-6eb4-88ea-d73a856b7c08","time":0,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"-25.5","y":"0","z":"0"}],"uuid":"6ca26d91-3570-1ef5-bd53-1a935b06e9f5","time":0.24,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"-16.5","y":"0","z":"0"}],"uuid":"a48444f7-dfe6-a98c-5cce-063d6acb5ddb","time":0.48,"color":-1,"interpolation":"linear"}]}}},{"uuid":"54cd83c4-2295-8df8-6f9f-d9d8db1267b5","name":"Atack","loop":"once","override":true,"length":0.48,"snapping":25,"selected":true,"anim_time_update":"","blend_weight":"","start_delay":"","loop_delay":"","animators":{"f844f14b-21ca-39e1-6894-44acf6a87e82":{"name":"LeftArm","type":"bone","keyframes":[{"channel":"rotation","data_points":[{"x":"-135","y":"0","z":"0"}],"uuid":"c478f30b-1924-a3b8-24dc-efb0e6c3cfae","time":0.2,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"93e730fe-281f-85cd-7dce-bfbbb248338a","time":0,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"81b027a3-ba76-0438-942c-232afbad77d9","time":0.48,"color":-1,"interpolation":"linear"}]},"633b2662-0fe0-f0d4-c002-49d98baece5f":{"name":"ElbowR","type":"bone","keyframes":[{"channel":"rotation","data_points":[{"x":"-2","y":"0","z":"0"}],"uuid":"4e491bfa-c7f7-8ac1-5eea-bd2e628376cf","time":0,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"-24.5","y":"0","z":"0"}],"uuid":"71cbeb2d-40d3-03cf-4172-49307b99d085","time":0.2,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"-2","y":"0","z":"0"}],"uuid":"20f7512e-2914-ee79-77e1-c24470e12344","time":0.48,"color":-1,"interpolation":"linear"}]},"5f36cdfe-dde4-7230-1baf-aa1a87c0547b":{"name":"RightArm","type":"bone","keyframes":[{"channel":"rotation","data_points":[{"x":"-135","y":"0","z":"0"}],"uuid":"2ef7a014-1acc-1049-741b-fa5409872f45","time":0.2,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"1b4dc962-9f75-77e7-5ed7-cbaa2584ac81","time":0,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"33f2e475-8b15-bb20-8055-87c846f76f31","time":0.48,"color":-1,"interpolation":"linear"}]},"268467a2-4618-ea8b-5939-33514427d85d":{"name":"ElbowL","type":"bone","keyframes":[{"channel":"rotation","data_points":[{"x":"-2","y":"0","z":"0"}],"uuid":"2d75223d-06ab-f5e8-bf82-212f2493500b","time":0,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"-24.5","y":"0","z":"0"}],"uuid":"80416315-93aa-5f4f-a149-07138e0212a7","time":0.2,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"-2","y":"0","z":"0"}],"uuid":"5a79cf0b-5910-89ef-9eac-2729d0aea7c3","time":0.48,"color":-1,"interpolation":"linear"}]}}}]}
\ No newline at end of file
diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DecorativeData.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DecorativeData.kt
index 44f383f0f..249085671 100644
--- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DecorativeData.kt
+++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DecorativeData.kt
@@ -226,6 +226,7 @@ fun addDecorativeData(blockStateProvider: MatteryBlockStateProvider, itemModelPr
 	}
 
 	DataGen.decorativePillar(MBlocks.METAL_BEAM, "metal_beam_side", "metal_beam_top")
+	blockModelProvider.decorativeCubeAll(MBlocks.METAL_BEAM_CENTER, "metal_beam_top")
 
 	var labLampOn: BlockModelBuilder? = null
 	var labLampOff: BlockModelBuilder? = null
@@ -259,6 +260,9 @@ fun addDecorativeData(blockStateProvider: MatteryBlockStateProvider, itemModelPr
 	itemModelProvider.block(MItems.DANGER_STRIPE_BLOCK, MItems.DANGER_STRIPE_BLOCK.registryName!!.path + "_0")
 	itemModelProvider.block(MItems.METAL_BEAM)
 
+	blockStateProvider.block(MBlocks.METAL_BEAM_CENTER)
+	itemModelProvider.block(MItems.METAL_BEAM_CENTER)
+
 	blockStateProvider.exec {
 		blockStateProvider.getVariantBuilder(MBlocks.LABORATORY_LAMP).forAllStates {
 			return@forAllStates ConfiguredModel.builder()
diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/SoundDataProvider.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/SoundDataProvider.kt
index 332eadc9e..603be74a9 100644
--- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/SoundDataProvider.kt
+++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/SoundDataProvider.kt
@@ -47,6 +47,18 @@ class SoundDataProvider(event: GatherDataEvent) : SoundDefinitionsProvider(event
 					.stream()
 				))
 
+		add(
+			MSoundEvents.LOADER_AMBIENT,
+			definition().subtitle("otm.sound.entity.loader.loader_ambient")
+				.with(
+					SoundDefinition.Sound.sound(modLocation("entity/loader/loader_ambient"), SoundDefinition.SoundType.SOUND)
+					.attenuationDistance(32)
+					.stream(),
+					SoundDefinition.Sound.sound(modLocation("entity/loader/loader_ambient2"), SoundDefinition.SoundType.SOUND)
+					.attenuationDistance(32)
+					.stream()
+				))
+
 		add(
 			MSoundEvents.ANDROID_PROJ_PARRY,
 			definition().subtitle("otm.sound.android.projectile_parry")
diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt
index 192b0a0e3..f071a31a6 100644
--- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt
+++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt
@@ -115,6 +115,7 @@ fun addItemModels(provider: MatteryItemModelProvider) {
 	provider.handheld(MItems.CHEST_UPGRADER)
 
 	provider.generated(MItems.BREAD_MONSTER_SPAWN_EGG, modLocation("item/egg/bread_monster"))
+	provider.generated(MItems.LOADER_SPAWN_EGG, modLocation("item/egg/loader"))
 
 	provider.generatedTiered(MItems.BATTERIES, "battery_tier")
 	provider.generated(MItems.BATTERY_CREATIVE)
diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt
index 432b6faa9..685e01b16 100644
--- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt
+++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt
@@ -681,6 +681,7 @@ private fun blocks(provider: MatteryLanguageProvider) {
 		add(MBlocks.LABORATORY_LAMP_INVERTED, "Laboratory Lamp (Inverted signal)")
 		add(MBlocks.DANGER_STRIPE_BLOCK, "Danger Stripes")
 		add(MBlocks.METAL_BEAM, "Metal Beam")
+		add(MBlocks.METAL_BEAM_CENTER, "Metal Beam (Center)")
 
 		add(MBlocks.TRITANIUM_DOOR[null]!!, "Tritanium Door")
 		add(MBlocks.TRITANIUM_DOOR[null]!!, "description0", "High blast resistance door with redstone latch...")
diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt
index 10232222a..df1597305 100644
--- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt
+++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt
@@ -684,6 +684,7 @@ private fun blocks(provider: MatteryLanguageProvider) {
 		add(MBlocks.LABORATORY_LAMP_INVERTED, "Лабораторная лампа (инвентированный сигнал)")
 		add(MBlocks.DANGER_STRIPE_BLOCK, "Полоски 'опасность'")
 		add(MBlocks.METAL_BEAM, "Металлическая опора")
+		add(MBlocks.METAL_BEAM_CENTER, "Металлическая опора (середина)")
 
 		add(MBlocks.TRITANIUM_DOOR[null]!!, "Тритановая дверь")
 		add(MBlocks.TRITANIUM_DOOR[null]!!, "description0", "Взрывоустойчивая дверь с засовом красного камня...")
diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/DecorativesRecipes.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/DecorativesRecipes.kt
index 9d2799116..eb70427c6 100644
--- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/DecorativesRecipes.kt
+++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/DecorativesRecipes.kt
@@ -177,6 +177,11 @@ fun addDecorativesRecipes(provider: MatteryRecipeProvider, consumer: RecipeOutpu
 			.save(consumer, modLocation("decorative/vent/from_alt/${color?.name?.lowercase() ?: "default"}"))
 	}
 
+	ShapelessRecipeBuilder(RecipeCategory.BUILDING_BLOCKS, MItems.METAL_BEAM_CENTER, 1).requires(MItems.METAL_BEAM)
+		.unlockedBy(MItems.METAL_BEAM)
+	ShapelessRecipeBuilder(RecipeCategory.BUILDING_BLOCKS, MItems.METAL_BEAM, 1).requires(MItems.METAL_BEAM_CENTER)
+		.unlockedBy(MItems.METAL_BEAM_CENTER)
+
 	MatteryRecipe(MRegistry.DECORATIVE_CRATE.item, 24, category = RecipeCategory.BUILDING_BLOCKS)
 		.rowB(Tags.Items.INGOTS_IRON)
 		.row(Tags.Items.INGOTS_IRON, Tags.Items.COBBLESTONES, Tags.Items.INGOTS_IRON)
diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/MineableTags.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/MineableTags.kt
index 1997e1145..b92bca831 100644
--- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/MineableTags.kt
+++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/MineableTags.kt
@@ -146,6 +146,7 @@ fun addMineableTags(tagsProvider: TagsProvider) {
 	tagsProvider.requiresPickaxe(MBlocks.LABORATORY_LAMP, Tiers.IRON)
 	tagsProvider.requiresPickaxe(MBlocks.LABORATORY_LAMP_INVERTED, Tiers.IRON)
 	tagsProvider.requiresPickaxe(MBlocks.METAL_BEAM, Tiers.IRON)
+	tagsProvider.requiresPickaxe(MBlocks.METAL_BEAM_CENTER, Tiers.IRON)
 	tagsProvider.requiresPickaxe(MBlocks.DANGER_STRIPE_BLOCK)
 
 }
diff --git a/src/main/java/ru/dbotthepony/mc/otm/client/animation/LoaderAnimation.java b/src/main/java/ru/dbotthepony/mc/otm/client/animation/LoaderAnimation.java
new file mode 100644
index 000000000..70accc04c
--- /dev/null
+++ b/src/main/java/ru/dbotthepony/mc/otm/client/animation/LoaderAnimation.java
@@ -0,0 +1,129 @@
+package ru.dbotthepony.mc.otm.client.animation;
+
+import net.minecraft.client.animation.AnimationChannel;
+import net.minecraft.client.animation.AnimationDefinition;
+import net.minecraft.client.animation.Keyframe;
+import net.minecraft.client.animation.KeyframeAnimations;
+
+public class LoaderAnimation {
+	public static final AnimationDefinition IDLE = AnimationDefinition.Builder.withLength(0.16F).looping()
+		.addAnimation("Body", new AnimationChannel(AnimationChannel.Targets.POSITION,
+			new Keyframe(0.0F, KeyframeAnimations.posVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.08F, KeyframeAnimations.posVec(0F, -0.1F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.16F, KeyframeAnimations.posVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR)
+		))
+		.addAnimation("Head", new AnimationChannel(AnimationChannel.Targets.POSITION,
+			new Keyframe(0.0F, KeyframeAnimations.posVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.08F, KeyframeAnimations.posVec(0F, -0.1F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.16F, KeyframeAnimations.posVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR)
+		))
+		.addAnimation("LeftArm", new AnimationChannel(AnimationChannel.Targets.POSITION,
+			new Keyframe(0.0F, KeyframeAnimations.posVec(0F, 0.1F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.12F, KeyframeAnimations.posVec(0F, -0.2F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.16F, KeyframeAnimations.posVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR)
+		))
+		.addAnimation("RightArm", new AnimationChannel(AnimationChannel.Targets.POSITION,
+			new Keyframe(0.0F, KeyframeAnimations.posVec(0F, 0.1F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.12F, KeyframeAnimations.posVec(0F, -0.2F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.16F, KeyframeAnimations.posVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR)
+		))
+		.build();
+
+	public static final AnimationDefinition MOVE = AnimationDefinition.Builder.withLength(0.48F).looping()
+		.addAnimation("Body", new AnimationChannel(AnimationChannel.Targets.POSITION,
+			new Keyframe(0.0F, KeyframeAnimations.posVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.12F, KeyframeAnimations.posVec(0F, 0.3F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.24F, KeyframeAnimations.posVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.36F, KeyframeAnimations.posVec(0F, 0.3F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.48F, KeyframeAnimations.posVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR)
+		))
+		.addAnimation("Head", new AnimationChannel(AnimationChannel.Targets.POSITION,
+			new Keyframe(0.0F, KeyframeAnimations.posVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.12F, KeyframeAnimations.posVec(0F, 0.3F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.24F, KeyframeAnimations.posVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.36F, KeyframeAnimations.posVec(0F, 0.3F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.48F, KeyframeAnimations.posVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR)
+		))
+		.addAnimation("LeftLeg", new AnimationChannel(AnimationChannel.Targets.POSITION,
+			new Keyframe(0.0F, KeyframeAnimations.posVec(0F, 0F, -2F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.12F, KeyframeAnimations.posVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.24F, KeyframeAnimations.posVec(0F, 1F, 1F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.36F, KeyframeAnimations.posVec(0F, 2F, -2F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.48F, KeyframeAnimations.posVec(0F, 0F, -2F), AnimationChannel.Interpolations.LINEAR)
+		))
+		.addAnimation("LeftLeg", new AnimationChannel(AnimationChannel.Targets.ROTATION,
+			new Keyframe(0.0F, KeyframeAnimations.degreeVec(-22.5F, 0F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.24F, KeyframeAnimations.degreeVec(22.5F, 0F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.48F, KeyframeAnimations.degreeVec(-22.5F, 0F, 0F), AnimationChannel.Interpolations.LINEAR)
+		))
+		.addAnimation("RightLeg", new AnimationChannel(AnimationChannel.Targets.POSITION,
+			new Keyframe(0.0F, KeyframeAnimations.posVec(0F, 0F, 2F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.12F, KeyframeAnimations.posVec(0F, 2F, -2F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.24F, KeyframeAnimations.posVec(0F, 0F, -2F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.36F, KeyframeAnimations.posVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.48F, KeyframeAnimations.posVec(0F, 0F, 2F), AnimationChannel.Interpolations.LINEAR)
+		))
+		.addAnimation("RightLeg", new AnimationChannel(AnimationChannel.Targets.ROTATION,
+			new Keyframe(0.0F, KeyframeAnimations.degreeVec(22.5F, 0F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.24F, KeyframeAnimations.degreeVec(-22.5F, 0F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.48F, KeyframeAnimations.degreeVec(22.5F, 0F, 0F), AnimationChannel.Interpolations.LINEAR)
+		))
+		.addAnimation("LeftArm", new AnimationChannel(AnimationChannel.Targets.POSITION,
+			new Keyframe(0.0F, KeyframeAnimations.posVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.12F, KeyframeAnimations.posVec(0F, 0.2F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.24F, KeyframeAnimations.posVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.36F, KeyframeAnimations.posVec(0F, 0.2F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.48F, KeyframeAnimations.posVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR)
+		))
+		.addAnimation("LeftArm", new AnimationChannel(AnimationChannel.Targets.ROTATION,
+			new Keyframe(0.0F, KeyframeAnimations.degreeVec(6F, 0F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.24F, KeyframeAnimations.degreeVec(-6F, 0F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.48F, KeyframeAnimations.degreeVec(6F, 0F, 0F), AnimationChannel.Interpolations.LINEAR)
+		))
+		.addAnimation("ElbowR", new AnimationChannel(AnimationChannel.Targets.ROTATION,
+			new Keyframe(0.0F, KeyframeAnimations.degreeVec(-30F, 0F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.24F, KeyframeAnimations.degreeVec(-19.5F, 0F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.48F, KeyframeAnimations.degreeVec(-30F, 0F, 0F), AnimationChannel.Interpolations.LINEAR)
+		))
+		.addAnimation("RightArm", new AnimationChannel(AnimationChannel.Targets.POSITION,
+			new Keyframe(0.0F, KeyframeAnimations.posVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.12F, KeyframeAnimations.posVec(0F, 0.2F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.24F, KeyframeAnimations.posVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.36F, KeyframeAnimations.posVec(0F, 0.2F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.48F, KeyframeAnimations.posVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR)
+		))
+		.addAnimation("RightArm", new AnimationChannel(AnimationChannel.Targets.ROTATION,
+			new Keyframe(0.0F, KeyframeAnimations.degreeVec(-6F, 0F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.24F, KeyframeAnimations.degreeVec(6F, 0F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.48F, KeyframeAnimations.degreeVec(-6F, 0F, 0F), AnimationChannel.Interpolations.LINEAR)
+		))
+		.addAnimation("ElbowL", new AnimationChannel(AnimationChannel.Targets.ROTATION,
+			new Keyframe(0.0F, KeyframeAnimations.degreeVec(-16.5F, 0F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.24F, KeyframeAnimations.degreeVec(-25.5F, 0F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.48F, KeyframeAnimations.degreeVec(-16.5F, 0F, 0F), AnimationChannel.Interpolations.LINEAR)
+		))
+		.build();
+
+	public static final AnimationDefinition ATTACK = AnimationDefinition.Builder.withLength(0.48F).looping()
+		.addAnimation("LeftArm", new AnimationChannel(AnimationChannel.Targets.ROTATION,
+			new Keyframe(0.0F, KeyframeAnimations.degreeVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.2F, KeyframeAnimations.degreeVec(-135F, 0F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.48F, KeyframeAnimations.degreeVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR)
+		))
+		.addAnimation("ElbowR", new AnimationChannel(AnimationChannel.Targets.ROTATION,
+			new Keyframe(0.0F, KeyframeAnimations.degreeVec(-2F, 0F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.2F, KeyframeAnimations.degreeVec(-24.5F, 0F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.48F, KeyframeAnimations.degreeVec(-2F, 0F, 0F), AnimationChannel.Interpolations.LINEAR)
+		))
+		.addAnimation("RightArm", new AnimationChannel(AnimationChannel.Targets.ROTATION,
+			new Keyframe(0.0F, KeyframeAnimations.degreeVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.2F, KeyframeAnimations.degreeVec(-135F, 0F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.48F, KeyframeAnimations.degreeVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR)
+		))
+		.addAnimation("ElbowL", new AnimationChannel(AnimationChannel.Targets.ROTATION,
+			new Keyframe(0.0F, KeyframeAnimations.degreeVec(-2F, 0F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.2F, KeyframeAnimations.degreeVec(-24.5F, 0F, 0F), AnimationChannel.Interpolations.LINEAR),
+			new Keyframe(0.48F, KeyframeAnimations.degreeVec(-2F, 0F, 0F), AnimationChannel.Interpolations.LINEAR)
+		))
+		.build();
+}
diff --git a/src/main/java/ru/dbotthepony/mc/otm/client/model/entity/LoaderModel.java b/src/main/java/ru/dbotthepony/mc/otm/client/model/entity/LoaderModel.java
new file mode 100644
index 000000000..fb6f7fe48
--- /dev/null
+++ b/src/main/java/ru/dbotthepony/mc/otm/client/model/entity/LoaderModel.java
@@ -0,0 +1,100 @@
+package ru.dbotthepony.mc.otm.client.model.entity;
+
+import net.minecraft.client.model.HierarchicalModel;
+import net.minecraft.client.model.geom.ModelLayerLocation;
+import net.minecraft.client.model.geom.ModelPart;
+import net.minecraft.client.model.geom.PartPose;
+import net.minecraft.client.model.geom.builders.*;
+import net.neoforged.neoforge.client.event.EntityRenderersEvent;
+import org.jetbrains.annotations.NotNull;
+import ru.dbotthepony.mc.otm.client.animation.LoaderAnimation;
+import ru.dbotthepony.mc.otm.entity.Loader;
+import ru.dbotthepony.mc.otm.registry.MNames;
+
+import static ru.dbotthepony.mc.otm.OverdriveThatMatters.loc;
+
+public class LoaderModel {
+	public static final ModelLayerLocation LAYER_LOCATION = new ModelLayerLocation(loc(MNames.LOADER), "main");
+
+	private static HierarchicalModel<Loader> model;
+	private static LayerDefinition def;
+
+	public static HierarchicalModel<Loader> getModel() {
+		if (def == null) {
+			def = createBodyLayer(); // Ensure def is created before using it
+		}
+
+		if (model == null) {
+			return model = new LoaderHierarchicalModel<>(def.bakeRoot());
+		}
+
+
+		return model;
+	}
+
+	public static LayerDefinition createBodyLayer() {
+		MeshDefinition meshdefinition = new MeshDefinition();
+		PartDefinition partdefinition = meshdefinition.getRoot();
+
+		PartDefinition root = partdefinition.addOrReplaceChild("root", CubeListBuilder.create(), PartPose.offset(0.0F, 24.0F, 0.0F));
+
+		PartDefinition Head = root.addOrReplaceChild("Head", CubeListBuilder.create().texOffs(48, 23).addBox(-3.0F, -1.0F, -2.0F, 6.0F, 3.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offset(-4.0F, -32.0F, -5.0F));
+		PartDefinition Body = root.addOrReplaceChild("Body", CubeListBuilder.create().texOffs(0, 0).addBox(-10.0F, -16.0F, -5.0F, 20.0F, 10.0F, 13.0F, new CubeDeformation(0.0F))
+			.texOffs(0, 50).addBox(-3.0F, -3.0F, -4.0F, 6.0F, 5.0F, 8.0F, new CubeDeformation(0.0F))
+			.texOffs(112, 52).addBox(10.0F, -13.0F, 0.0F, 2.0F, 6.0F, 6.0F, new CubeDeformation(0.0F))
+			.texOffs(96, 52).addBox(-12.0F, -13.0F, -1.0F, 2.0F, 6.0F, 6.0F, new CubeDeformation(0.0F))
+			.texOffs(53, 0).addBox(-5.0F, -1.0F, 4.0F, 10.0F, 4.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, -26.0F, -1.0F));
+		PartDefinition antenna_r1 = Body.addOrReplaceChild("antenna_r1", CubeListBuilder.create().texOffs(76, 6).addBox(0.0F, -7.0F, -1.0F, 0.0F, 14.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(8.0F, -22.0F, 8.0F, -0.2618F, 0.0F, 0.0F));
+		PartDefinition waist_r1 = Body.addOrReplaceChild("waist_r1", CubeListBuilder.create().texOffs(28, 50).addBox(-2.0F, -5.0F, -4.0F, 4.0F, 7.0F, 7.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -3.0F, 2.0F, -0.2618F, 0.0F, 0.0F));
+
+		PartDefinition LeftLeg = root.addOrReplaceChild("LeftLeg", CubeListBuilder.create().texOffs(106, 24).addBox(0.0F, 10.0F, -2.0F, 4.0F, 16.0F, 7.0F, new CubeDeformation(0.0F))
+			.texOffs(66, 46).addBox(-1.0F, -2.0F, -3.0F, 6.0F, 12.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offset(4.0F, -26.0F, -1.0F));
+		PartDefinition RightLeg = root.addOrReplaceChild("RightLeg", CubeListBuilder.create().texOffs(84, 24).addBox(-4.0F, 10.0F, -2.0F, 4.0F, 16.0F, 7.0F, new CubeDeformation(0.0F))
+			.texOffs(48, 34).addBox(-5.0F, -2.0F, -3.0F, 6.0F, 12.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offset(-4.0F, -26.0F, -1.0F));
+
+		PartDefinition LeftArm = root.addOrReplaceChild("LeftArm", CubeListBuilder.create().texOffs(104, 0).addBox(-1.0F, -7.0F, -4.0F, 4.0F, 16.0F, 8.0F, new CubeDeformation(0.0F)), PartPose.offset(13.0F, -36.0F, 2.0F));
+		PartDefinition ElbowL = LeftArm.addOrReplaceChild("ElbowL", CubeListBuilder.create().texOffs(24, 23).addBox(-2.0F, -0.2F, -2.0F, 4.0F, 19.0F, 8.0F, new CubeDeformation(-0.1F)), PartPose.offset(1.0F, 9.0F, -1.0F));
+		PartDefinition RightArm = root.addOrReplaceChild("RightArm", CubeListBuilder.create().texOffs(80, 0).addBox(-3.0F, -7.0F, -4.0F, 4.0F, 16.0F, 8.0F, new CubeDeformation(0.0F)), PartPose.offset(-13.0F, -36.0F, 1.0F));
+		PartDefinition ElbowR = RightArm.addOrReplaceChild("ElbowR", CubeListBuilder.create().texOffs(0, 23).addBox(-2.0F, -0.2F, -2.0F, 4.0F, 19.0F, 8.0F, new CubeDeformation(-0.1F)), PartPose.offset(-1.0F, 9.0F, -1.0F));
+
+		model = null;
+		return def = LayerDefinition.create(meshdefinition, 128, 64);
+	}
+
+	private static class LoaderHierarchicalModel<T extends Loader> extends HierarchicalModel<T> {
+		private final ModelPart root;
+		public LoaderHierarchicalModel(ModelPart root) {
+			this.root = root.getChild("root");
+		}
+
+		@Override
+		public void setupAnim(@NotNull T entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) {
+			this.root().getAllParts().forEach(ModelPart::resetPose);
+
+			this.root.getChild("Head").yRot = netHeadYaw * ((float) Math.PI / 180F);
+			this.root.getChild("Head").xRot = headPitch * ((float) Math.PI / 180F);
+
+			if (entity.getAttackAnimationTick() > 0) {
+				this.animate(entity.getIdleState(), LoaderAnimation.ATTACK, ageInTicks, 1.0F);
+			}
+
+			this.animateWalk(LoaderAnimation.MOVE, limbSwing, limbSwingAmount, 1.0F, 2.5F);
+			this.animate(entity.getIdleState(), LoaderAnimation.IDLE, ageInTicks, 1.0F);
+
+		}
+
+		public ModelPart getHead() {
+			return this.root.getChild("Head");
+		}
+
+
+		@Override
+		public @NotNull ModelPart root() {
+			return this.root;
+		}
+	}
+
+	public static void register(EntityRenderersEvent.RegisterLayerDefinitions event) {
+		event.registerLayerDefinition(LAYER_LOCATION, LoaderModel::createBodyLayer);
+	}
+}
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/entity/LoaderRenderer.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/entity/LoaderRenderer.kt
new file mode 100644
index 000000000..360c49274
--- /dev/null
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/entity/LoaderRenderer.kt
@@ -0,0 +1,18 @@
+package ru.dbotthepony.mc.otm.client.render.entity
+
+import net.minecraft.client.model.HierarchicalModel
+import net.minecraft.client.renderer.entity.EntityRendererProvider
+import net.minecraft.client.renderer.entity.MobRenderer
+import net.minecraft.resources.ResourceLocation
+import ru.dbotthepony.mc.otm.OverdriveThatMatters.loc
+import ru.dbotthepony.mc.otm.client.model.entity.LoaderModel
+import ru.dbotthepony.mc.otm.entity.Loader
+
+class LoaderRenderer(context: EntityRendererProvider.Context)
+	: MobRenderer<Loader, HierarchicalModel<Loader>>(context, LoaderModel.getModel(), 0.8f) {
+	override fun getTextureLocation(entity: Loader): ResourceLocation = TEXTURE_LOCATION
+
+	companion object {
+		private val TEXTURE_LOCATION = loc("textures/entity/loader.png")
+	}
+}
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/entity/Loader.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/entity/Loader.kt
new file mode 100644
index 000000000..0a6418b46
--- /dev/null
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/entity/Loader.kt
@@ -0,0 +1,130 @@
+package ru.dbotthepony.mc.otm.entity
+
+import net.minecraft.network.syncher.EntityDataAccessor
+import net.minecraft.network.syncher.EntityDataSerializers
+import net.minecraft.network.syncher.SynchedEntityData
+import net.minecraft.sounds.SoundEvent
+import net.minecraft.sounds.SoundEvents
+import net.minecraft.world.entity.AnimationState
+import net.minecraft.world.entity.Entity
+import net.minecraft.world.entity.EntityType
+import net.minecraft.world.entity.ai.attributes.AttributeSupplier
+import net.minecraft.world.entity.ai.attributes.Attributes
+import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal
+import net.minecraft.world.entity.ai.goal.MeleeAttackGoal
+import net.minecraft.world.entity.ai.goal.RandomLookAroundGoal
+import net.minecraft.world.entity.ai.goal.WaterAvoidingRandomStrollGoal
+import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal
+import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal
+import net.minecraft.world.entity.ai.navigation.GroundPathNavigation
+import net.minecraft.world.entity.ai.navigation.PathNavigation
+import net.minecraft.world.entity.monster.Monster
+import net.minecraft.world.entity.player.Player
+import net.minecraft.world.level.Level
+import ru.dbotthepony.mc.otm.registry.game.MSoundEvents
+
+
+class Loader(type: EntityType<Loader>, level: Level) : Monster(type, level) {
+
+	val idleState = AnimationState()
+	var attackAnimationState = AnimationState()
+	var attackAnimationTick = 0
+
+	companion object {
+		fun createAttributes() : AttributeSupplier.Builder {
+			return createMonsterAttributes()
+				.add(Attributes.MAX_HEALTH, 60.0)
+				.add(Attributes.MOVEMENT_SPEED, 0.3)
+				.add(Attributes.ATTACK_DAMAGE, 5.0)
+				.add(Attributes.KNOCKBACK_RESISTANCE, 0.7)
+		}
+
+		private val DATA_ATTACKING: EntityDataAccessor<Boolean> =
+			SynchedEntityData.defineId(Loader::class.java, EntityDataSerializers.BOOLEAN)
+	}
+
+	override fun defineSynchedData(builder: SynchedEntityData.Builder) {
+		super.defineSynchedData(builder)
+		builder.define(DATA_ATTACKING, false)
+	}
+	var isAttacking: Boolean
+		get() = this.entityData.get(DATA_ATTACKING)
+		set(value) {
+			this.entityData.set(DATA_ATTACKING, value)
+		}
+
+	//https://nc.dbotthepony.ru/s/qqKdbQEYy74KyGM
+
+	init {
+		idleState.start(tickCount)
+	}
+
+	override fun registerGoals() {
+		goalSelector.addGoal(8, RandomLookAroundGoal(this))
+		goalSelector.addGoal(7, WaterAvoidingRandomStrollGoal(this, 0.8))
+		goalSelector.addGoal(8, LookAtPlayerGoal(this, Player::class.java, 8f))
+		goalSelector.addGoal(3, NearestAttackableTargetGoal(this, Player::class.java , true, true))
+
+		goalSelector.addGoal(2, MeleeAttackGoal(this, 1.0, true))
+
+		targetSelector.addGoal(1, HurtByTargetGoal(this))
+	}
+
+	override fun handleEntityEvent(id: Byte) {
+		if (id.toInt() == 4) {
+			this.attackAnimationTick = 7 // Attack animation lasts 10 ticks
+		} else {
+			super.handleEntityEvent(id)
+		}
+	}
+
+	override fun doHurtTarget(target: Entity): Boolean {
+		level().broadcastEntityEvent(this, 4.toByte())
+		val success = super.doHurtTarget(target)
+		if (success) {
+			this.playSound(SoundEvents.IRON_GOLEM_ATTACK, 1.0f, 1.0f)
+			//THIS IS FUCKING RETARDED
+			//fuck everything
+
+			level().broadcastEntityEvent(this, 4.toByte())
+			idleState.stop()
+			idleState.start(tickCount)
+
+
+			val dirx = target.x - this.x
+			val dirz = target.z - this.z
+			val dist = Math.sqrt(dirx * dirx + dirx * dirz)
+
+			target.push(dirx / dist * 0.6, 0.3, dirz / dist * 0.6)
+		}
+		return success
+	}
+
+	override fun aiStep() {
+		super.aiStep()
+
+		if (attackAnimationTick > 0) {
+			attackAnimationTick--
+			if (attackAnimationTick == 0) {
+				isAttacking = false
+			}
+		}
+	}
+	override fun getAmbientSound(): SoundEvent {
+		return  MSoundEvents.LOADER_AMBIENT
+	}
+
+	override fun getHurtSound(damageSource: net.minecraft.world.damagesource.DamageSource): SoundEvent {
+		return SoundEvents.IRON_GOLEM_HURT
+	}
+
+	override fun getDeathSound(): SoundEvent {
+		return SoundEvents.IRON_GOLEM_DEATH
+	}
+
+	override fun playStepSound(pos: net.minecraft.core.BlockPos, blockState: net.minecraft.world.level.block.state.BlockState) {
+		this.playSound(SoundEvents.IRON_GOLEM_STEP, 1.0f, 1.0f)
+	}
+
+	override fun createNavigation(level: Level): PathNavigation = GroundPathNavigation(this, level)
+}
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MNames.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MNames.kt
index 645448316..a3612f1f0 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MNames.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MNames.kt
@@ -12,6 +12,7 @@ object MNames {
 	const val LABORATORY_LAMP_LIGHT = "laboratory_lamp_light"
 	const val DANGER_STRIPE_BLOCK = "danger_stripe_block"
 	const val METAL_BEAM = "metal_beam"
+	const val METAL_BEAM_CENTER = "metal_beam_center"
 	const val ENGINE = "engine"
 	const val HOLO_SIGN = "holo_sign"
 	const val FLUID_TANK = "fluid_tank"
@@ -202,6 +203,7 @@ object MNames {
 
 	// eg
 	const val BREAD_MONSTER_SPAWN_EGG = "bead_monster_spawn_egg"
+	const val LOADER_SPAWN_EGG = "loader_spawn_egg"
 
 	// items: crafting components
 	const val TRITANIUM_DUST = "tritanium_dust"
@@ -323,6 +325,7 @@ object MNames {
 	const val PLASMA = "plasma_projectile"
 	const val RIDEABLE_DUMMY = "rideable_dummy"
 	const val BREAD_MONSTER = "bread_monster"
+	const val LOADER = "loader"
 
 	const val PHANTOM_ATTRACTOR = "phantom_attractor"
 	const val JUMP_BOOST = "jump_boost"
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MBlocks.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MBlocks.kt
index fee5dc637..a3f6b5689 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MBlocks.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MBlocks.kt
@@ -359,6 +359,7 @@ object MBlocks {
 	val LABORATORY_LAMP_LIGHT: Block by registry.register(MNames.LABORATORY_LAMP_LIGHT) { LaboratoryLampLight() }
 	val DANGER_STRIPE_BLOCK: Block by registry.register(MNames.DANGER_STRIPE_BLOCK) { Block(BlockBehaviour.Properties.of().mapColor(MapColor.COLOR_GRAY).explosionResistance(6f).destroyTime(1.5f).requiresCorrectToolForDrops()) }
 	val METAL_BEAM: Block by registry.register(MNames.METAL_BEAM) { RotatedPillarBlock(BlockBehaviour.Properties.of().mapColor(MapColor.COLOR_GRAY).sound(SoundType.METAL).explosionResistance(14f).destroyTime(2.5f).requiresCorrectToolForDrops()) }
+	val METAL_BEAM_CENTER: Block by registry.register(MNames.METAL_BEAM_CENTER) { RotatedPillarBlock(BlockBehaviour.Properties.of().mapColor(MapColor.COLOR_GRAY).sound(SoundType.METAL).explosionResistance(14f).destroyTime(2.5f).requiresCorrectToolForDrops()) }
 	val ENGINE: Block by registry.register(MNames.ENGINE) { EngineBlock() }
 	val HOLO_SIGN: Block by registry.register(MNames.HOLO_SIGN) { HoloSignBlock() }
 
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MCreativeTabs.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MCreativeTabs.kt
index af34056c0..3bea5d150 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MCreativeTabs.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MCreativeTabs.kt
@@ -318,6 +318,7 @@ private fun addDecorativeTabItems(consumer: CreativeModeTab.Output) {
 
 		accept(MItems.DANGER_STRIPE_BLOCK)
 		accept(MItems.METAL_BEAM)
+		accept(MItems.METAL_BEAM_CENTER)
 		accept(MItems.ENGINE)
 
 		accept(MItems.TRITANIUM_STRIPED_BLOCK.values)
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MEntityTypes.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MEntityTypes.kt
index bafdac6cf..434309a70 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MEntityTypes.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MEntityTypes.kt
@@ -14,11 +14,9 @@ import net.neoforged.bus.api.IEventBus
 import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent
 import net.neoforged.neoforge.event.entity.EntityAttributeCreationEvent
 import ru.dbotthepony.mc.otm.client.render.entity.BreadMonsterRenderer
+import ru.dbotthepony.mc.otm.client.render.entity.LoaderRenderer
 import ru.dbotthepony.mc.otm.client.render.entity.PlasmaProjectileRenderer
-import ru.dbotthepony.mc.otm.entity.BreadMonster
-import ru.dbotthepony.mc.otm.entity.MinecartCargoCrate
-import ru.dbotthepony.mc.otm.entity.PlasmaProjectile
-import ru.dbotthepony.mc.otm.entity.RideableDummy
+import ru.dbotthepony.mc.otm.entity.*
 import ru.dbotthepony.mc.otm.registry.MDeferredRegister
 import ru.dbotthepony.mc.otm.registry.MNames
 
@@ -50,6 +48,15 @@ object MEntityTypes {
 			.build(MNames.BREAD_MONSTER)
 	}
 
+	val LOADER: EntityType<Loader> by registry.register(MNames.LOADER) {
+		EntityType.Builder.of(::Loader, MobCategory.MONSTER)
+			.sized(1.2f, 2.5f)
+			.eyeHeight(2.0f)
+			.passengerAttachments(2.5f)
+			.clientTrackingRange(12)
+			.build(MNames.LOADER)
+	}
+
 	fun register(bus: IEventBus) {
 		registry.register(bus)
 		bus.addListener(this::registerAttributes)
@@ -58,6 +65,7 @@ object MEntityTypes {
 
 	private fun registerAttributes(event: EntityAttributeCreationEvent) {
 		event.put(BREAD_MONSTER, BreadMonster.createAttributes().build())
+		event.put(LOADER, Loader.createAttributes().build())
 	}
 
 	@Suppress("unchecked_cast")
@@ -71,6 +79,7 @@ object MEntityTypes {
 
 			EntityRenderers.register(RIDEABLE_DUMMY, ::NoopRenderer)
 			EntityRenderers.register(BREAD_MONSTER, ::BreadMonsterRenderer)
+			EntityRenderers.register(LOADER, ::LoaderRenderer)
 		}
 	}
 }
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MItems.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MItems.kt
index 1421df044..82de7fba6 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MItems.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MItems.kt
@@ -26,6 +26,7 @@ import net.minecraft.world.item.Tiers
 import net.minecraft.world.item.crafting.Ingredient
 import net.minecraft.world.level.block.Block
 import net.neoforged.bus.api.IEventBus
+import net.neoforged.neoforge.common.DeferredSpawnEggItem
 import net.neoforged.neoforge.common.SimpleTier
 import ru.dbotthepony.mc.otm.block.MatteryBlock
 import ru.dbotthepony.mc.otm.block.addSimpleDescription
@@ -512,6 +513,7 @@ object MItems {
 	val LABORATORY_LAMP_INVERTED: Item by registry.register(MNames.LABORATORY_LAMP_INVERTED) { BlockItem(MBlocks.LABORATORY_LAMP_INVERTED, DEFAULT_PROPERTIES) }
 	val DANGER_STRIPE_BLOCK: Item by registry.register(MNames.DANGER_STRIPE_BLOCK) { BlockItem(MBlocks.DANGER_STRIPE_BLOCK, DEFAULT_PROPERTIES) }
 	val METAL_BEAM: Item by registry.register(MNames.METAL_BEAM) { BlockItem(MBlocks.METAL_BEAM, DEFAULT_PROPERTIES) }
+	val METAL_BEAM_CENTER: Item by registry.register(MNames.METAL_BEAM_CENTER) { BlockItem(MBlocks.METAL_BEAM_CENTER, DEFAULT_PROPERTIES) }
 	val ENGINE: Item by registry.register(MNames.ENGINE) { BlockItem(MBlocks.ENGINE, DEFAULT_PROPERTIES) }
 	val HOLO_SIGN: Item by registry.register(MNames.HOLO_SIGN) { BlockItem(MBlocks.HOLO_SIGN, DEFAULT_PROPERTIES) }
 
@@ -665,6 +667,7 @@ object MItems {
 	val CHEST_UPGRADER: Item by registry.register(MNames.CHEST_UPGRADER) { ChestUpgraderItem() }
 
 	val BREAD_MONSTER_SPAWN_EGG: Item by registry.register(MNames.BREAD_MONSTER_SPAWN_EGG){ SpawnEggItem(MEntityTypes.BREAD_MONSTER, 0xFFFFFF, 0xFFFFFF, Item.Properties())}
+	val LOADER_SPAWN_EGG: Item by registry.register(MNames.LOADER_SPAWN_EGG){ SpawnEggItem(MEntityTypes.LOADER, 0xFFFFFF, 0xFFFFFF, Item.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) }
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MSoundEvents.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MSoundEvents.kt
index 375b3dd39..04daae5ed 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MSoundEvents.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MSoundEvents.kt
@@ -25,6 +25,8 @@ object MSoundEvents {
 
 	val BLACK_HOLE		by make("black_hole", 32F)
 
+	val LOADER_AMBIENT	by make("loader_ambient")
+
 	fun register(bus: IEventBus) {
 		registry.register(bus)
 	}
diff --git a/src/main/resources/assets/overdrive_that_matters/loader.java b/src/main/resources/assets/overdrive_that_matters/loader.java
new file mode 100644
index 000000000..c040f7a4f
--- /dev/null
+++ b/src/main/resources/assets/overdrive_that_matters/loader.java
@@ -0,0 +1,75 @@
+// Made with Blockbench 4.12.3
+// Exported for Minecraft version 1.17 or later with Mojang mappings
+// Paste this class into your mod and generate all required imports
+
+
+public class loader<T extends Entity> extends EntityModel<T> {
+	// This layer location should be baked with EntityRendererProvider.Context in the entity renderer and passed into this model's constructor
+	public static final ModelLayerLocation LAYER_LOCATION = new ModelLayerLocation(new ResourceLocation("modid", "loader"), "main");
+	private final ModelPart root;
+	private final ModelPart Head;
+	private final ModelPart Body;
+	private final ModelPart LeftLeg;
+	private final ModelPart RightLeg;
+	private final ModelPart LeftArm;
+	private final ModelPart ElbowL;
+	private final ModelPart RightArm;
+	private final ModelPart ElbowR;
+
+	public loader(ModelPart root) {
+		this.root = root.getChild("root");
+		this.Head = this.root.getChild("Head");
+		this.Body = this.root.getChild("Body");
+		this.LeftLeg = this.root.getChild("LeftLeg");
+		this.RightLeg = this.root.getChild("RightLeg");
+		this.LeftArm = this.root.getChild("LeftArm");
+		this.ElbowL = this.LeftArm.getChild("ElbowL");
+		this.RightArm = this.root.getChild("RightArm");
+		this.ElbowR = this.RightArm.getChild("ElbowR");
+	}
+
+	public static LayerDefinition createBodyLayer() {
+		MeshDefinition meshdefinition = new MeshDefinition();
+		PartDefinition partdefinition = meshdefinition.getRoot();
+
+		PartDefinition root = partdefinition.addOrReplaceChild("root", CubeListBuilder.create(), PartPose.offset(0.0F, 24.0F, 0.0F));
+
+		PartDefinition Head = root.addOrReplaceChild("Head", CubeListBuilder.create().texOffs(48, 23).addBox(-3.0F, -1.0F, -2.0F, 6.0F, 3.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offset(-4.0F, -32.0F, -5.0F));
+
+		PartDefinition Body = root.addOrReplaceChild("Body", CubeListBuilder.create().texOffs(0, 0).addBox(-10.0F, -16.0F, -5.0F, 20.0F, 10.0F, 13.0F, new CubeDeformation(0.0F))
+		.texOffs(0, 50).addBox(-3.0F, -3.0F, -4.0F, 6.0F, 5.0F, 8.0F, new CubeDeformation(0.0F))
+		.texOffs(112, 52).addBox(10.0F, -13.0F, 0.0F, 2.0F, 6.0F, 6.0F, new CubeDeformation(0.0F))
+		.texOffs(96, 52).addBox(-12.0F, -13.0F, -1.0F, 2.0F, 6.0F, 6.0F, new CubeDeformation(0.0F))
+		.texOffs(53, 0).addBox(-5.0F, -1.0F, 4.0F, 10.0F, 4.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, -26.0F, -1.0F));
+
+		PartDefinition antenna_r1 = Body.addOrReplaceChild("antenna_r1", CubeListBuilder.create().texOffs(76, 6).addBox(0.0F, -7.0F, -1.0F, 0.0F, 14.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(8.0F, -22.0F, 8.0F, -0.2618F, 0.0F, 0.0F));
+
+		PartDefinition waist_r1 = Body.addOrReplaceChild("waist_r1", CubeListBuilder.create().texOffs(28, 50).addBox(-2.0F, -5.0F, -4.0F, 4.0F, 7.0F, 7.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -3.0F, 2.0F, -0.2618F, 0.0F, 0.0F));
+
+		PartDefinition LeftLeg = root.addOrReplaceChild("LeftLeg", CubeListBuilder.create().texOffs(106, 24).addBox(0.0F, 10.0F, -2.0F, 4.0F, 16.0F, 7.0F, new CubeDeformation(0.0F))
+		.texOffs(66, 46).addBox(-1.0F, -2.0F, -3.0F, 6.0F, 12.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offset(4.0F, -26.0F, -1.0F));
+
+		PartDefinition RightLeg = root.addOrReplaceChild("RightLeg", CubeListBuilder.create().texOffs(84, 24).addBox(-4.0F, 10.0F, -2.0F, 4.0F, 16.0F, 7.0F, new CubeDeformation(0.0F))
+		.texOffs(48, 34).addBox(-5.0F, -2.0F, -3.0F, 6.0F, 12.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offset(-4.0F, -26.0F, -1.0F));
+
+		PartDefinition LeftArm = root.addOrReplaceChild("LeftArm", CubeListBuilder.create().texOffs(104, 0).addBox(-1.0F, -7.0F, -4.0F, 4.0F, 16.0F, 8.0F, new CubeDeformation(0.0F)), PartPose.offset(13.0F, -36.0F, 2.0F));
+
+		PartDefinition ElbowL = LeftArm.addOrReplaceChild("ElbowL", CubeListBuilder.create().texOffs(24, 23).addBox(-2.0F, -0.2F, -2.0F, 4.0F, 19.0F, 8.0F, new CubeDeformation(-0.1F)), PartPose.offset(1.0F, 9.0F, -1.0F));
+
+		PartDefinition RightArm = root.addOrReplaceChild("RightArm", CubeListBuilder.create().texOffs(80, 0).addBox(-3.0F, -7.0F, -4.0F, 4.0F, 16.0F, 8.0F, new CubeDeformation(0.0F)), PartPose.offset(-13.0F, -36.0F, 1.0F));
+
+		PartDefinition ElbowR = RightArm.addOrReplaceChild("ElbowR", CubeListBuilder.create().texOffs(0, 23).addBox(-2.0F, -0.2F, -2.0F, 4.0F, 19.0F, 8.0F, new CubeDeformation(-0.1F)), PartPose.offset(-1.0F, 9.0F, -1.0F));
+
+		return LayerDefinition.create(meshdefinition, 128, 64);
+	}
+
+	@Override
+	public void setupAnim(Entity entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) {
+
+	}
+
+	@Override
+	public void renderToBuffer(PoseStack poseStack, VertexConsumer vertexConsumer, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) {
+		root.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha);
+	}
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/overdrive_that_matters/models/loader.animation.json b/src/main/resources/assets/overdrive_that_matters/models/loader.animation.json
new file mode 100644
index 000000000..60ec4497b
--- /dev/null
+++ b/src/main/resources/assets/overdrive_that_matters/models/loader.animation.json
@@ -0,0 +1,166 @@
+{
+	"format_version": "1.8.0",
+	"animations": {
+		"Idle": {
+			"loop": true,
+			"animation_length": 0.16,
+			"bones": {
+				"Body": {
+					"position": {
+						"0.0": [0, 0, 0],
+						"0.08": [0, -0.1, 0],
+						"0.16": [0, 0, 0]
+					}
+				},
+				"Head": {
+					"position": {
+						"0.0": [0, 0, 0],
+						"0.08": [0, -0.1, 0],
+						"0.16": [0, 0, 0]
+					}
+				},
+				"LeftArm": {
+					"position": {
+						"0.0": [0, 0.1, 0],
+						"0.12": [0, -0.2, 0],
+						"0.16": [0, 0, 0]
+					}
+				},
+				"RightArm": {
+					"position": {
+						"0.0": [0, 0.1, 0],
+						"0.12": [0, -0.2, 0],
+						"0.16": [0, 0, 0]
+					}
+				}
+			}
+		},
+		"Move": {
+			"loop": true,
+			"animation_length": 0.48,
+			"bones": {
+				"Body": {
+					"position": {
+						"0.0": [0, 0, 0],
+						"0.12": [0, 0.3, 0],
+						"0.24": [0, 0, 0],
+						"0.36": [0, 0.3, 0],
+						"0.48": [0, 0, 0]
+					}
+				},
+				"Head": {
+					"position": {
+						"0.0": [0, 0, 0],
+						"0.12": [0, 0.3, 0],
+						"0.24": [0, 0, 0],
+						"0.36": [0, 0.3, 0],
+						"0.48": [0, 0, 0]
+					}
+				},
+				"LeftLeg": {
+					"rotation": {
+						"0.0": [-22.5, 0, 0],
+						"0.24": [22.5, 0, 0],
+						"0.48": [-22.5, 0, 0]
+					},
+					"position": {
+						"0.0": [0, 0, -2],
+						"0.12": [0, 0, 0],
+						"0.24": [0, 1, 1],
+						"0.36": [0, 2, -2],
+						"0.48": [0, 0, -2]
+					}
+				},
+				"RightLeg": {
+					"rotation": {
+						"0.0": [22.5, 0, 0],
+						"0.24": [-22.5, 0, 0],
+						"0.48": [22.5, 0, 0]
+					},
+					"position": {
+						"0.0": [0, 0, 2],
+						"0.12": [0, 2, -2],
+						"0.24": [0, 0, -2],
+						"0.36": [0, 0, 0],
+						"0.48": [0, 0, 2]
+					}
+				},
+				"LeftArm": {
+					"rotation": {
+						"0.0": [6, 0, 0],
+						"0.24": [-6, 0, 0],
+						"0.48": [6, 0, 0]
+					},
+					"position": {
+						"0.0": [0, 0, 0],
+						"0.12": [0, 0.2, 0],
+						"0.24": [0, 0, 0],
+						"0.36": [0, 0.2, 0],
+						"0.48": [0, 0, 0]
+					}
+				},
+				"ElbowR": {
+					"rotation": {
+						"0.0": [-30, 0, 0],
+						"0.24": [-19.5, 0, 0],
+						"0.48": [-30, 0, 0]
+					}
+				},
+				"RightArm": {
+					"rotation": {
+						"0.0": [-6, 0, 0],
+						"0.24": [6, 0, 0],
+						"0.48": [-6, 0, 0]
+					},
+					"position": {
+						"0.0": [0, 0, 0],
+						"0.12": [0, 0.2, 0],
+						"0.24": [0, 0, 0],
+						"0.36": [0, 0.2, 0],
+						"0.48": [0, 0, 0]
+					}
+				},
+				"ElbowL": {
+					"rotation": {
+						"0.0": [-16.5, 0, 0],
+						"0.24": [-25.5, 0, 0],
+						"0.48": [-16.5, 0, 0]
+					}
+				}
+			}
+		},
+		"Atack": {
+			"animation_length": 0.48,
+			"bones": {
+				"LeftArm": {
+					"rotation": {
+						"0.0": [0, 0, 0],
+						"0.2": [-135, 0, 0],
+						"0.48": [0, 0, 0]
+					}
+				},
+				"ElbowR": {
+					"rotation": {
+						"0.0": [-2, 0, 0],
+						"0.2": [-24.5, 0, 0],
+						"0.48": [-2, 0, 0]
+					}
+				},
+				"RightArm": {
+					"rotation": {
+						"0.0": [0, 0, 0],
+						"0.2": [-135, 0, 0],
+						"0.48": [0, 0, 0]
+					}
+				},
+				"ElbowL": {
+					"rotation": {
+						"0.0": [-2, 0, 0],
+						"0.2": [-24.5, 0, 0],
+						"0.48": [-2, 0, 0]
+					}
+				}
+			}
+		}
+	}
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/overdrive_that_matters/models/model.animation.json b/src/main/resources/assets/overdrive_that_matters/models/model.animation.json
new file mode 100644
index 000000000..49daa0b45
--- /dev/null
+++ b/src/main/resources/assets/overdrive_that_matters/models/model.animation.json
@@ -0,0 +1,167 @@
+{
+	"format_version": "1.8.0",
+	"animations": {
+		"Idle": {
+			"loop": true,
+			"animation_length": 0.16,
+			"bones": {
+				"Body": {
+					"position": {
+						"0.0": [0, 0, 0],
+						"0.08": [0, -0.1, 0],
+						"0.16": [0, 0, 0]
+					}
+				},
+				"Head": {
+					"position": {
+						"0.0": [0, 0, 0],
+						"0.08": [0, -0.1, 0],
+						"0.16": [0, 0, 0]
+					}
+				},
+				"LeftArm": {
+					"position": {
+						"0.0": [0, 0.1, 0],
+						"0.12": [0, -0.2, 0],
+						"0.16": [0, 0, 0]
+					}
+				},
+				"RightArm": {
+					"position": {
+						"0.0": [0, 0.1, 0],
+						"0.12": [0, -0.2, 0],
+						"0.16": [0, 0, 0]
+					}
+				}
+			}
+		},
+		"Move": {
+			"loop": true,
+			"animation_length": 0.48,
+			"bones": {
+				"Body": {
+					"position": {
+						"0.0": [0, 0, 0],
+						"0.12": [0, 0.3, 0],
+						"0.24": [0, 0, 0],
+						"0.36": [0, 0.3, 0],
+						"0.48": [0, 0, 0]
+					}
+				},
+				"Head": {
+					"position": {
+						"0.0": [0, 0, 0],
+						"0.12": [0, 0.3, 0],
+						"0.24": [0, 0, 0],
+						"0.36": [0, 0.3, 0],
+						"0.48": [0, 0, 0]
+					}
+				},
+				"LeftLeg": {
+					"rotation": {
+						"0.0": [-22.5, 0, 0],
+						"0.24": [22.5, 0, 0],
+						"0.48": [-22.5, 0, 0]
+					},
+					"position": {
+						"0.0": [0, 0, -2],
+						"0.12": [0, 0, 0],
+						"0.24": [0, 1, 1],
+						"0.36": [0, 2, -2],
+						"0.48": [0, 0, -2]
+					}
+				},
+				"RightLeg": {
+					"rotation": {
+						"0.0": [22.5, 0, 0],
+						"0.24": [-22.5, 0, 0],
+						"0.48": [22.5, 0, 0]
+					},
+					"position": {
+						"0.0": [0, 0, 2],
+						"0.12": [0, 2, -2],
+						"0.24": [0, 0, -2],
+						"0.36": [0, 0, 0],
+						"0.48": [0, 0, 2]
+					}
+				},
+				"LeftArm": {
+					"rotation": {
+						"0.0": [6, 0, 0],
+						"0.24": [-6, 0, 0],
+						"0.48": [6, 0, 0]
+					},
+					"position": {
+						"0.0": [0, 0, 0],
+						"0.12": [0, 0.2, 0],
+						"0.24": [0, 0, 0],
+						"0.36": [0, 0.2, 0],
+						"0.48": [0, 0, 0]
+					}
+				},
+				"ElbowR": {
+					"rotation": {
+						"0.0": [-30, 0, 0],
+						"0.24": [-19.5, 0, 0],
+						"0.48": [-30, 0, 0]
+					}
+				},
+				"RightArm": {
+					"rotation": {
+						"0.0": [-6, 0, 0],
+						"0.24": [6, 0, 0],
+						"0.48": [-6, 0, 0]
+					},
+					"position": {
+						"0.0": [0, 0, 0],
+						"0.12": [0, 0.2, 0],
+						"0.24": [0, 0, 0],
+						"0.36": [0, 0.2, 0],
+						"0.48": [0, 0, 0]
+					}
+				},
+				"ElbowL": {
+					"rotation": {
+						"0.0": [-16.5, 0, 0],
+						"0.24": [-25.5, 0, 0],
+						"0.48": [-16.5, 0, 0]
+					}
+				}
+			}
+		},
+		"Atack": {
+			"animation_length": 0.48,
+			"override_previous_animation": true,
+			"bones": {
+				"LeftArm": {
+					"rotation": {
+						"0.0": [0, 0, 0],
+						"0.2": [-135, 0, 0],
+						"0.48": [0, 0, 0]
+					}
+				},
+				"ElbowR": {
+					"rotation": {
+						"0.0": [-2, 0, 0],
+						"0.2": [-24.5, 0, 0],
+						"0.48": [-2, 0, 0]
+					}
+				},
+				"RightArm": {
+					"rotation": {
+						"0.0": [0, 0, 0],
+						"0.2": [-135, 0, 0],
+						"0.48": [0, 0, 0]
+					}
+				},
+				"ElbowL": {
+					"rotation": {
+						"0.0": [-2, 0, 0],
+						"0.2": [-24.5, 0, 0],
+						"0.48": [-2, 0, 0]
+					}
+				}
+			}
+		}
+	}
+}
\ No newline at end of file
diff --git a/src/main/resources/assets/overdrive_that_matters/sounds/entity/loader/loader_ambient.ogg b/src/main/resources/assets/overdrive_that_matters/sounds/entity/loader/loader_ambient.ogg
new file mode 100644
index 0000000000000000000000000000000000000000..13067094826217b2e5ba8529bcb3230bfb3b8fbb
GIT binary patch
literal 21689
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
HO(gg~8Si|-

literal 0
HcmV?d00001

diff --git a/src/main/resources/assets/overdrive_that_matters/sounds/entity/loader/loader_ambient2.ogg b/src/main/resources/assets/overdrive_that_matters/sounds/entity/loader/loader_ambient2.ogg
new file mode 100644
index 0000000000000000000000000000000000000000..40f9996c76e8fae26af73e6356164ae4dfbefd4d
GIT binary patch
literal 31719
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

literal 0
HcmV?d00001

diff --git a/src/main/resources/assets/overdrive_that_matters/textures/entity/loader.png b/src/main/resources/assets/overdrive_that_matters/textures/entity/loader.png
new file mode 100644
index 0000000000000000000000000000000000000000..22ec319cd067ce57529048ce182bc90fe6ee511e
GIT binary patch
literal 1966
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

literal 0
HcmV?d00001

diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/egg/loader.png b/src/main/resources/assets/overdrive_that_matters/textures/item/egg/loader.png
new file mode 100644
index 0000000000000000000000000000000000000000..e3df83d4298b9a0c755aa71c4e7cac6a155d1d34
GIT binary patch
literal 496
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC
z{oH>NS%G}T0G|-os$A2xbA66&3IG59e{!Vu&6_t@tXLr?CMG8*r>3R`RMjf*%M3_y
zmjw9*1JytQgO@+!C!jEAfk$L90|VcF5N5Ps4ORgPN|d-plmzFem6RtIr7{F0X6BXX
z`MHKDnCcno8U5bFybY*kTWW-7ny0500|$`9${@wa%D@O@c>%FBlnwHc1|u_AoC(M_
zWMl&SFbc@dY-a(BX93wDu&j)c;RVp+FdEHL2B6dgb_N!pN&_Qf1I7gqQ$aSeE`XRc
z1;_>gCZM@YV3k3Z7C;tMm!W|HNOpnDqFrGu2R8zl(Vi}jAsWH4{f<Hh6gZA_?P~b*
z|Dfv;P1EBNWyg-|#n`m!u22<Gx<5(P??QFHGRq7{7X}R%=H~E5otm8aGLG9dj^6vQ
u_d!peyq=4_OUw+vxs86E`#lt0j=o{_y1^>IqLO+5WTmI8pUXO@geCxYY<so<

literal 0
HcmV?d00001


From 4e653b65446085ef3ea06d1c147d718bd61bda16 Mon Sep 17 00:00:00 2001
From: GearShocky <gearshockmirasu@gmail.com>
Date: Mon, 3 Mar 2025 05:59:06 +0500
Subject: [PATCH 09/13] lang

---
 src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt | 3 +++
 src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt | 3 +++
 2 files changed, 6 insertions(+)

diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt
index 685e01b16..801a266c1 100644
--- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt
+++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt
@@ -920,6 +920,9 @@ private fun items(provider: MatteryLanguageProvider) {
 
 		add(MItems.BREAD_MONSTER_SPAWN_EGG, "Bread Monster Spawn Egg")
 		add(MEntityTypes.BREAD_MONSTER, "Bread Monster")
+
+		add(MItems.LOADER_SPAWN_EGG, "Loader Spawn Egg")
+		add(MEntityTypes.LOADER, "Loader")
 	}
 }
 
diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt
index df1597305..8c2b8ba63 100644
--- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt
+++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt
@@ -913,6 +913,9 @@ private fun items(provider: MatteryLanguageProvider) {
 
 		add(MItems.BREAD_MONSTER_SPAWN_EGG, "Яйцо призыва хлебного монстра")
 		add(MEntityTypes.BREAD_MONSTER, "Хлебный монстр")
+
+		add(MItems.LOADER_SPAWN_EGG, "Яйцо призыва погрузчика")
+		add(MEntityTypes.LOADER, "Погрузчик")
 	}
 }
 

From 32ef2911fa8a7186d1143054c0b5c849257fafb8 Mon Sep 17 00:00:00 2001
From: DBotThePony <dbotthepony@yandex.ru>
Date: Mon, 3 Mar 2025 12:02:42 +0700
Subject: [PATCH 10/13] Implement Complementary Multiply-With-Curry Random

---
 .../mc/otm/core/util/CMWCRandom.kt            | 115 ++++++++++++++++++
 1 file changed, 115 insertions(+)
 create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/core/util/CMWCRandom.kt

diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/util/CMWCRandom.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/util/CMWCRandom.kt
new file mode 100644
index 000000000..aec7fc452
--- /dev/null
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/util/CMWCRandom.kt
@@ -0,0 +1,115 @@
+package ru.dbotthepony.mc.otm.core.util
+
+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 java.lang.StringBuilder
+import java.util.random.RandomGenerator
+
+class CMWCRandom(seed: Long = System.nanoTime(), private val stateSize: Int = CMWC_DEFAULT_STATE_SIZE) : RandomGenerator, RandomSource {
+	private val state = IntArray(stateSize)
+	private var carry = 0
+	private var stateIndex = 0
+	private val gaussian = MarsagliaPolarGaussian(this)
+
+	var seed: Long = seed
+		private set
+
+	init {
+		setSeed(seed)
+	}
+
+	override fun setSeed(seed: Long) {
+		this.seed = seed
+		carry = Integer.remainderUnsigned(seed.toInt(), CMWC_CARRY_MAX)
+
+		// init state with regular LCG produced values
+		state[0] = seed.toInt()
+		state[1] = seed.shr(32).toInt()
+
+		for (i in 2 until state.size) {
+			state[i] = 69069 * state[i - 2] + 362437
+		}
+
+		stateIndex = state.size - 1
+		gaussian.reset()
+	}
+
+	override fun nextInt(): Int {
+		stateIndex = (stateIndex + 1) % state.size
+		val t = 18782L * state[stateIndex] + carry
+
+		carry = t.ushr(32).toInt()
+		var x = t.toInt() + carry
+
+		if (x < carry) {
+			x++
+			carry++
+		}
+
+		state[stateIndex] = 0xfffffffe.toInt() - x
+		return state[stateIndex]
+	}
+
+	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 CMWCRandom(nextLong(), stateSize)
+	}
+
+	override fun forkPositional(): PositionalRandomFactory {
+		return Positional(nextLong(), stateSize)
+	}
+
+	class Positional(val seed: Long, val stateSize: Int = CMWC_DEFAULT_STATE_SIZE) : PositionalRandomFactory {
+		override fun at(x: Int, y: Int, z: Int): RandomSource {
+			return CMWCRandom(Mth.getSeed(x, y, z).xor(seed), stateSize)
+		}
+
+		override fun fromHashOf(name: String): RandomSource {
+			return CMWCRandom(name.hashCode().toLong().xor(seed), stateSize)
+		}
+
+		override fun fromSeed(seed: Long): RandomSource {
+			return CMWCRandom(seed, stateSize)
+		}
+
+		override fun parityConfigString(builder: StringBuilder) {
+			throw UnsupportedOperationException()
+		}
+	}
+
+	companion object {
+		const val CMWC_DEFAULT_STATE_SIZE = 256 // 4096
+		const val CMWC_CARRY_MAX = 809430660
+	}
+}

From bc2c531e1fa970f5a4cfb14f58da2cc055357b02 Mon Sep 17 00:00:00 2001
From: DBotThePony <dbotthepony@yandex.ru>
Date: Mon, 3 Mar 2025 12:20:29 +0700
Subject: [PATCH 11/13] Attach CMWC random to Level class, as alternative
 random to be used in OTM

---
 .../dbotthepony/mc/otm/mixin/LevelMixin.java   | 18 ++++++++++++++++++
 .../dbotthepony/mc/otm/core/IMatteryWorld.kt   | 16 ++++++++++++++++
 .../overdrive_that_matters.mixins.json         |  3 ++-
 3 files changed, 36 insertions(+), 1 deletion(-)
 create mode 100644 src/main/java/ru/dbotthepony/mc/otm/mixin/LevelMixin.java
 create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/core/IMatteryWorld.kt

diff --git a/src/main/java/ru/dbotthepony/mc/otm/mixin/LevelMixin.java b/src/main/java/ru/dbotthepony/mc/otm/mixin/LevelMixin.java
new file mode 100644
index 000000000..cee3aabab
--- /dev/null
+++ b/src/main/java/ru/dbotthepony/mc/otm/mixin/LevelMixin.java
@@ -0,0 +1,18 @@
+package ru.dbotthepony.mc.otm.mixin;
+
+import net.minecraft.util.RandomSource;
+import net.minecraft.world.level.Level;
+import org.jetbrains.annotations.NotNull;
+import org.spongepowered.asm.mixin.Mixin;
+import ru.dbotthepony.mc.otm.core.IMatteryWorld;
+import ru.dbotthepony.mc.otm.core.util.CMWCRandom;
+
+@Mixin(Level.class)
+public abstract class LevelMixin implements IMatteryWorld {
+	public final RandomSource otm_random = new CMWCRandom();
+
+	@Override
+	public @NotNull RandomSource getOtmRandom() {
+		return otm_random;
+	}
+}
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/IMatteryWorld.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/IMatteryWorld.kt
new file mode 100644
index 000000000..137f222e2
--- /dev/null
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/IMatteryWorld.kt
@@ -0,0 +1,16 @@
+package ru.dbotthepony.mc.otm.core
+
+import net.minecraft.util.RandomSource
+import net.minecraft.world.level.Level
+
+interface IMatteryWorld {
+	/**
+	 * OTM provided [RandomSource], which has better statistical parameters
+	 *
+	 * Original Minecraft use LCG, which may show bad behavior when repeatedly sampled *a lot*,
+	 * which is what [Level]'s random is used for. OTM provided PRNG should behave better in this scenario.
+	 */
+	val otmRandom: RandomSource
+}
+
+val Level.otmRandom: RandomSource get() = (this as IMatteryWorld).otmRandom
diff --git a/src/main/resources/overdrive_that_matters.mixins.json b/src/main/resources/overdrive_that_matters.mixins.json
index 934ead87e..f317fa83a 100644
--- a/src/main/resources/overdrive_that_matters.mixins.json
+++ b/src/main/resources/overdrive_that_matters.mixins.json
@@ -18,7 +18,8 @@
     "HopperBlockEntityMixin",
     "DispenserBlockEntityMixin",
     "GuiGraphicsMixin",
-    "BlockStateBaseMixin"
+    "BlockStateBaseMixin",
+    "LevelMixin"
   ],
   "client": [
     "MixinGameRenderer",

From c96614c7c0a6b67b75a55b0a9bd9143a0e029052 Mon Sep 17 00:00:00 2001
From: DBotThePony <dbotthepony@yandex.ru>
Date: Mon, 3 Mar 2025 13:23:06 +0700
Subject: [PATCH 12/13] Replace usages of Level#random with OTM provided random
 (CMWC)

---
 .../java/ru/dbotthepony/mc/otm/mixin/LevelMixin.java     | 4 ++--
 .../mc/otm/mixin/MixinAbstractHurtingProjectile.java     | 3 ++-
 .../mc/otm/android/feature/EnderTeleporterFeature.kt     | 7 ++++---
 .../otm/block/entity/blackhole/BlackHoleBlockEntity.kt   | 3 ++-
 .../entity/blackhole/BlackHoleGeneratorBlockEntity.kt    | 5 +++--
 .../mc/otm/block/entity/cable/EnergyCableGraph.kt        | 3 ++-
 .../otm/block/entity/decorative/CargoCrateBlockEntity.kt | 3 ++-
 .../block/entity/matter/MatterDecomposerBlockEntity.kt   | 3 ++-
 .../entity/matter/MatterReconstructorBlockEntity.kt      | 3 ++-
 .../otm/block/entity/matter/MatterRecyclerBlockEntity.kt | 3 ++-
 .../block/entity/matter/MatterReplicatorBlockEntity.kt   | 3 ++-
 .../entity/tech/AbstractPoweredFurnaceBlockEntity.kt     | 3 ++-
 .../mc/otm/block/entity/tech/BatteryBankBlockEntity.kt   | 3 ++-
 .../otm/block/entity/tech/EnergyInterfaceBlockEntity.kt  | 3 ++-
 .../otm/block/entity/tech/EssenceStorageBlockEntity.kt   | 5 +++--
 .../mc/otm/block/entity/tech/PlatePressBlockEntity.kt    | 3 ++-
 .../ru/dbotthepony/mc/otm/capability/MatteryPlayer.kt    | 4 ++--
 .../mc/otm/client/screen/decorative/PainterScreen.kt     | 2 +-
 .../mc/otm/core/{IMatteryWorld.kt => IMatteryLevel.kt}   | 4 ++--
 .../ru/dbotthepony/mc/otm/entity/MinecartCargoCrate.kt   | 3 ++-
 .../kotlin/ru/dbotthepony/mc/otm/item/BatteryItem.kt     | 4 ++--
 .../mc/otm/item/consumables/EssenceCapsuleItem.kt        | 3 ++-
 .../dbotthepony/mc/otm/item/tool/ExplosiveHammerItem.kt  | 4 ++--
 .../ru/dbotthepony/mc/otm/item/weapon/EnergySwordItem.kt | 9 +++++----
 .../dbotthepony/mc/otm/network/MatteryPlayerPackets.kt   | 3 ++-
 .../dbotthepony/mc/otm/network/SmokeParticlesPacket.kt   | 3 ++-
 26 files changed, 58 insertions(+), 38 deletions(-)
 rename src/main/kotlin/ru/dbotthepony/mc/otm/core/{IMatteryWorld.kt => IMatteryLevel.kt} (83%)

diff --git a/src/main/java/ru/dbotthepony/mc/otm/mixin/LevelMixin.java b/src/main/java/ru/dbotthepony/mc/otm/mixin/LevelMixin.java
index cee3aabab..6ad554f3f 100644
--- a/src/main/java/ru/dbotthepony/mc/otm/mixin/LevelMixin.java
+++ b/src/main/java/ru/dbotthepony/mc/otm/mixin/LevelMixin.java
@@ -4,11 +4,11 @@ import net.minecraft.util.RandomSource;
 import net.minecraft.world.level.Level;
 import org.jetbrains.annotations.NotNull;
 import org.spongepowered.asm.mixin.Mixin;
-import ru.dbotthepony.mc.otm.core.IMatteryWorld;
+import ru.dbotthepony.mc.otm.core.IMatteryLevel;
 import ru.dbotthepony.mc.otm.core.util.CMWCRandom;
 
 @Mixin(Level.class)
-public abstract class LevelMixin implements IMatteryWorld {
+public abstract class LevelMixin implements IMatteryLevel {
 	public final RandomSource otm_random = new CMWCRandom();
 
 	@Override
diff --git a/src/main/java/ru/dbotthepony/mc/otm/mixin/MixinAbstractHurtingProjectile.java b/src/main/java/ru/dbotthepony/mc/otm/mixin/MixinAbstractHurtingProjectile.java
index 9e25c9de4..3733aedb7 100644
--- a/src/main/java/ru/dbotthepony/mc/otm/mixin/MixinAbstractHurtingProjectile.java
+++ b/src/main/java/ru/dbotthepony/mc/otm/mixin/MixinAbstractHurtingProjectile.java
@@ -8,6 +8,7 @@ import org.spongepowered.asm.mixin.injection.At;
 import org.spongepowered.asm.mixin.injection.Inject;
 import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
 import ru.dbotthepony.mc.otm.capability.IMatteryPlayer;
+import ru.dbotthepony.mc.otm.core.IMatteryLevel;
 import ru.dbotthepony.mc.otm.registry.game.MSoundEvents;
 
 @Mixin(AbstractHurtingProjectile.class)
@@ -24,7 +25,7 @@ public class MixinAbstractHurtingProjectile {
 			AbstractHurtingProjectile proj = (AbstractHurtingProjectile)(Object)this;
 
 			if (cap.isAndroid() && proj.getOwner() != entity) {
-				entity.level().playSound(entity, proj.blockPosition(), MSoundEvents.INSTANCE.getANDROID_PROJ_PARRY(), SoundSource.PLAYERS, 1.0f, 0.95f + entity.level().random.nextFloat() * 0.1f);
+				entity.level().playSound(entity, proj.blockPosition(), MSoundEvents.INSTANCE.getANDROID_PROJ_PARRY(), SoundSource.PLAYERS, 1.0f, 0.95f + ((IMatteryLevel) entity.level()).getOtmRandom().nextFloat() * 0.1f);
 			}
 		}
 	}
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/EnderTeleporterFeature.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/EnderTeleporterFeature.kt
index 6c5e26eb8..a90aebf88 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/EnderTeleporterFeature.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/EnderTeleporterFeature.kt
@@ -49,6 +49,7 @@ import ru.dbotthepony.mc.otm.core.math.rotateXDegrees
 import ru.dbotthepony.mc.otm.core.math.rotateYDegrees
 import ru.dbotthepony.mc.otm.core.math.shortestDistanceBetween
 import ru.dbotthepony.mc.otm.core.math.times
+import ru.dbotthepony.mc.otm.core.otmRandom
 import ru.dbotthepony.mc.otm.milliTime
 import ru.dbotthepony.mc.otm.registry.game.AndroidFeatures
 import ru.dbotthepony.mc.otm.triggers.EnderTeleporterFallDeathTrigger
@@ -302,7 +303,7 @@ class EnderTeleporterFeature(capability: MatteryPlayer) : AndroidActiveFeature(A
 		val event = EventHooks.onEnderTeleport(ply, blockPos.x + 0.5, blockPos.y.toDouble(), blockPos.z + 0.5)
 
 		if (event.isCanceled) {
-			(ply as ServerPlayer).connection.send(ClientboundSoundEntityPacket(SoundEvents.ITEM_BREAK.holder, SoundSource.PLAYERS, ply, 0.3f, 0.5f, ply.level().random.nextLong()))
+			(ply as ServerPlayer).connection.send(ClientboundSoundEntityPacket(SoundEvents.ITEM_BREAK.holder, SoundSource.PLAYERS, ply, 0.3f, 0.5f, ply.level().otmRandom.nextLong()))
 			return false
 		}
 
@@ -310,9 +311,9 @@ class EnderTeleporterFeature(capability: MatteryPlayer) : AndroidActiveFeature(A
 		lastTeleport = ply.server!!.tickCount
 		android.androidEnergy.extractEnergy(AndroidConfig.EnderTeleporter.ENERGY_COST, false)
 
-		ply.level().playSound(null, ply, SoundEvents.ENDERMAN_TELEPORT, SoundSource.PLAYERS, 0.3f, 0.8f + ply.level().random.nextFloat() * 0.4f)
+		ply.level().playSound(null, ply, SoundEvents.ENDERMAN_TELEPORT, SoundSource.PLAYERS, 0.3f, 0.8f + ply.level().otmRandom.nextFloat() * 0.4f)
 		ply.teleportTo(event.targetX, event.targetY, event.targetZ)
-		ply.level().playSound(null, ply, SoundEvents.ENDERMAN_TELEPORT, SoundSource.PLAYERS, 1f, 0.8f + ply.level().random.nextFloat() * 0.4f)
+		ply.level().playSound(null, ply, SoundEvents.ENDERMAN_TELEPORT, SoundSource.PLAYERS, 1f, 0.8f + ply.level().otmRandom.nextFloat() * 0.4f)
 
 		ply.deltaMovement = Vector(0.0, 0.0, 0.0)
 		ply.resetFallDistance()
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/blackhole/BlackHoleBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/blackhole/BlackHoleBlockEntity.kt
index 25e5efc70..c94c15b68 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/blackhole/BlackHoleBlockEntity.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/blackhole/BlackHoleBlockEntity.kt
@@ -44,6 +44,7 @@ import ru.dbotthepony.mc.otm.core.math.getSphericalBlockPositions
 import ru.dbotthepony.mc.otm.core.math.times
 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.isClient
 import ru.dbotthepony.mc.otm.matter.MatterManager
 import ru.dbotthepony.mc.otm.registry.MDamageTypes
@@ -270,7 +271,7 @@ class BlackHoleBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : Mattery
 		}
 
 		// шанс 1% что черная дыра потеряет 0.1 MtU каждую секунду * силу гравитации дыры ^ -1
-		if (level.random.nextDouble() < 0.01 * 0.05 * (1 / gravitationStrength)) {
+		if (level.otmRandom.nextDouble() < 0.01 * 0.05 * (1 / gravitationStrength)) {
 			this.mass += HAWKING_MASS_LOSE_STEP
 		}
 
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/blackhole/BlackHoleGeneratorBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/blackhole/BlackHoleGeneratorBlockEntity.kt
index 04827ffa3..2c3ab16f5 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/blackhole/BlackHoleGeneratorBlockEntity.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/blackhole/BlackHoleGeneratorBlockEntity.kt
@@ -34,6 +34,7 @@ import ru.dbotthepony.mc.otm.core.math.times
 import ru.dbotthepony.mc.otm.core.multiblock.BlockEntityTag
 import ru.dbotthepony.mc.otm.core.multiblock.MultiblockStatus
 import ru.dbotthepony.mc.otm.core.multiblock.shapedMultiblock
+import ru.dbotthepony.mc.otm.core.otmRandom
 import ru.dbotthepony.mc.otm.core.util.InvalidableLazy
 import ru.dbotthepony.mc.otm.menu.tech.BlackHoleGeneratorMenu
 import ru.dbotthepony.mc.otm.registry.game.MBlockEntities
@@ -85,8 +86,8 @@ class BlackHoleGeneratorBlockEntity(blockPos: BlockPos, blockState: BlockState)
 		multiblock?.blockEntities(MatterHatchBlockEntity.INPUT_TAG)?.iterator()?.map { it.matter }?.toList() ?: listOf()
 	}
 
-	val energy = CombinedProfiledEnergyStorage(FlowDirection.NONE, energyTarget::value, { level?.random })
-	val matter = CombinedProfiledMatterStorage(FlowDirection.NONE, matterTarget::value, { level?.random })
+	val energy = CombinedProfiledEnergyStorage(FlowDirection.NONE, energyTarget::value, { level?.otmRandom })
+	val matter = CombinedProfiledMatterStorage(FlowDirection.NONE, matterTarget::value, { level?.otmRandom })
 
 	enum class Mode(val label: Component, val tooltip: Component) {
 		TARGET_MASS(TranslatableComponent("otm.gui.black_hole_generator.sustain.mode"), TranslatableComponent("otm.gui.black_hole_generator.sustain.desc")),
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/cable/EnergyCableGraph.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/cable/EnergyCableGraph.kt
index df421a4b4..49b77cbe7 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/cable/EnergyCableGraph.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/cable/EnergyCableGraph.kt
@@ -13,6 +13,7 @@ import ru.dbotthepony.mc.otm.core.collect.map
 import ru.dbotthepony.mc.otm.core.collect.reduce
 import ru.dbotthepony.mc.otm.core.math.Decimal
 import ru.dbotthepony.mc.otm.core.math.RelativeSide
+import ru.dbotthepony.mc.otm.core.otmRandom
 import ru.dbotthepony.mc.otm.core.shuffle
 import ru.dbotthepony.mc.otm.graph.GraphNodeList
 import ru.dbotthepony.mc.otm.onceServer
@@ -614,7 +615,7 @@ class EnergyCableGraph : GraphNodeList<EnergyCableBlockEntity.Node, EnergyCableG
 	}
 
 	fun receiveEnergy(howMuch: Decimal, simulate: Boolean, fromNode: EnergyCableBlockEntity.Node, fromSide: RelativeSide): Decimal {
-		livelyNodesList.shuffle(fromNode.blockEntity.level!!.random)
+		livelyNodesList.shuffle(fromNode.blockEntity.level!!.otmRandom)
 
 		val itr = livelyNodesList.iterator()
 		var received = Decimal.ZERO
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/decorative/CargoCrateBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/decorative/CargoCrateBlockEntity.kt
index 6d7b5c27c..ec7e9a5ac 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/decorative/CargoCrateBlockEntity.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/decorative/CargoCrateBlockEntity.kt
@@ -35,6 +35,7 @@ import ru.dbotthepony.mc.otm.container.HandlerFilter
 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.menu.decorative.CargoCrateMenu
 import ru.dbotthepony.mc.otm.registry.game.MBlockEntities
 import ru.dbotthepony.mc.otm.registry.game.MSoundEvents
@@ -73,7 +74,7 @@ class CargoCrateBlockEntity(
 
 		if (interactingPlayers++ == 0 && level != null && !isRemoved && level.getBlockState(blockPos).block is CargoCrateBlock) {
 			level.setBlock(blockPos, blockState.setValue(CargoCrateBlock.IS_OPEN, true), Block.UPDATE_CLIENTS)
-			level.playSound(null, blockPos, MSoundEvents.CARGO_CRATE_OPEN, SoundSource.BLOCKS, 1f, 0.8f + level.random.nextFloat() * 0.2f)
+			level.playSound(null, blockPos, MSoundEvents.CARGO_CRATE_OPEN, SoundSource.BLOCKS, 1f, 0.8f + level.otmRandom.nextFloat() * 0.2f)
 			level.gameEvent(GameEvent.CONTAINER_OPEN, blockPos, GameEvent.Context.of(blockState))
 		}
 	}
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterDecomposerBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterDecomposerBlockEntity.kt
index a110c7226..8ed8a703e 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterDecomposerBlockEntity.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterDecomposerBlockEntity.kt
@@ -24,6 +24,7 @@ import ru.dbotthepony.mc.otm.config.MachinesConfig
 import ru.dbotthepony.mc.otm.container.HandlerFilter
 import ru.dbotthepony.mc.otm.container.MatteryContainer
 import ru.dbotthepony.mc.otm.core.math.Decimal
+import ru.dbotthepony.mc.otm.core.otmRandom
 import ru.dbotthepony.mc.otm.data.codec.DecimalCodec
 import ru.dbotthepony.mc.otm.data.codec.minRange
 import ru.dbotthepony.mc.otm.graph.matter.SimpleMatterNode
@@ -125,7 +126,7 @@ class MatterDecomposerBlockEntity(pos: BlockPos, state: BlockState)
 
 				return JobContainer.success(
 					DecomposerJob(
-						(level?.random?.nextDouble() ?: 1.0) <= 0.2 * upgrades.failureMultiplier,
+						(level?.otmRandom?.nextDouble() ?: 1.0) <= 0.2 * upgrades.failureMultiplier,
 						matter.matter,
 						matter.complexity * MachinesConfig.MATTER_DECOMPOSER.workTimeMultiplier
 					)
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterReconstructorBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterReconstructorBlockEntity.kt
index 7e48c0a1c..2ce185aca 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterReconstructorBlockEntity.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterReconstructorBlockEntity.kt
@@ -28,6 +28,7 @@ import ru.dbotthepony.mc.otm.container.HandlerFilter
 import ru.dbotthepony.mc.otm.container.MatteryContainer
 import ru.dbotthepony.mc.otm.container.UpgradeContainer
 import ru.dbotthepony.mc.otm.core.math.Decimal
+import ru.dbotthepony.mc.otm.core.otmRandom
 import ru.dbotthepony.mc.otm.core.registryName
 import ru.dbotthepony.mc.otm.graph.matter.MatterNode
 import ru.dbotthepony.mc.otm.matter.IMatterValue
@@ -263,7 +264,7 @@ class MatterReconstructorBlockEntity(blockPos: BlockPos, blockState: BlockState)
 					return
 				}
 
-				if (failureChance * upgrades.failureMultiplier <= 0.0 || level!!.random.nextDouble() >= failureChance * upgrades.failureMultiplier)
+				if (failureChance * upgrades.failureMultiplier <= 0.0 || level!!.otmRandom.nextDouble() >= failureChance * upgrades.failureMultiplier)
 					repairProgress += progressPerTick
 
 				energy.extractEnergy(energyConsumption * (progressPerTick / thisProgressPerTick), false)
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterRecyclerBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterRecyclerBlockEntity.kt
index bca170286..d8fe21afe 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterRecyclerBlockEntity.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterRecyclerBlockEntity.kt
@@ -24,6 +24,7 @@ import ru.dbotthepony.mc.otm.config.MachinesConfig
 import ru.dbotthepony.mc.otm.container.MatteryContainer
 import ru.dbotthepony.mc.otm.container.HandlerFilter
 import ru.dbotthepony.mc.otm.core.math.Decimal
+import ru.dbotthepony.mc.otm.core.otmRandom
 import ru.dbotthepony.mc.otm.graph.matter.MatterGraph
 import ru.dbotthepony.mc.otm.item.matter.MatterDustItem
 import ru.dbotthepony.mc.otm.menu.matter.MatterRecyclerMenu
@@ -116,7 +117,7 @@ class MatterRecyclerBlockEntity(blockPos: BlockPos, blockState: BlockState)
 		stack.shrink(1)
 		container.setChanged(0)
 
-		val actualMatter = dustMatter.matter * (0.4 + level!!.random.nextDouble() * 0.6)
+		val actualMatter = dustMatter.matter * (0.4 + level!!.otmRandom.nextDouble() * 0.6)
 
 		return JobContainer.success(
 			RecyclerJob(
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterReplicatorBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterReplicatorBlockEntity.kt
index 593356487..ac9f9c181 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterReplicatorBlockEntity.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterReplicatorBlockEntity.kt
@@ -28,6 +28,7 @@ import ru.dbotthepony.mc.otm.config.MachinesConfig
 import ru.dbotthepony.mc.otm.container.HandlerFilter
 import ru.dbotthepony.mc.otm.container.MatteryContainer
 import ru.dbotthepony.mc.otm.core.math.Decimal
+import ru.dbotthepony.mc.otm.core.otmRandom
 import ru.dbotthepony.mc.otm.data.codec.DecimalCodec
 import ru.dbotthepony.mc.otm.data.codec.minRange
 import ru.dbotthepony.mc.otm.graph.matter.MatterNode
@@ -183,7 +184,7 @@ class MatterReplicatorBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) :
 			task = allocation.task.id,
 			matterValue = matter.matter,
 			pattern = Optional.ofNullable(allocation.pattern),
-			asDust = (level?.random?.nextDouble() ?: 1.0) * upgrades.failureMultiplier > (allocation.pattern?.researchPercent ?: 2.0),
+			asDust = (level?.otmRandom?.nextDouble() ?: 1.0) * upgrades.failureMultiplier > (allocation.pattern?.researchPercent ?: 2.0),
 			ticks = ticks,
 		))
 	}
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/AbstractPoweredFurnaceBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/AbstractPoweredFurnaceBlockEntity.kt
index 748fb800b..4ca9c7317 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/AbstractPoweredFurnaceBlockEntity.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/AbstractPoweredFurnaceBlockEntity.kt
@@ -35,6 +35,7 @@ import ru.dbotthepony.mc.otm.container.balance
 import ru.dbotthepony.mc.otm.core.collect.filter
 import ru.dbotthepony.mc.otm.core.collect.maybe
 import ru.dbotthepony.mc.otm.core.immutableList
+import ru.dbotthepony.mc.otm.core.otmRandom
 import ru.dbotthepony.mc.otm.menu.tech.PoweredFurnaceMenu
 import ru.dbotthepony.mc.otm.recipe.MatteryCookingRecipe
 import ru.dbotthepony.mc.otm.recipe.MicrowaveRecipe
@@ -152,7 +153,7 @@ sealed class AbstractPoweredFurnaceBlockEntity<P : AbstractCookingRecipe, S : Ma
 						recipe.getResultItem(level.registryAccess()).copyWithCount(toProcess),
 						recipe.workTime * config.workTimeMultiplier,
 						config.energyConsumption * toProcess,
-						experience = recipe.experience.sample(level.random) * toProcess))
+						experience = recipe.experience.sample(level.otmRandom) * toProcess))
 			}
 		}
 
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/BatteryBankBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/BatteryBankBlockEntity.kt
index d6acd5c05..cd5940b7b 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/BatteryBankBlockEntity.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/BatteryBankBlockEntity.kt
@@ -23,6 +23,7 @@ import ru.dbotthepony.mc.otm.container.HandlerFilter
 import ru.dbotthepony.mc.otm.container.MatteryContainer
 import ru.dbotthepony.mc.otm.core.immutableList
 import ru.dbotthepony.mc.otm.core.math.Decimal
+import ru.dbotthepony.mc.otm.core.otmRandom
 import ru.dbotthepony.mc.otm.core.shuffle
 import ru.dbotthepony.mc.otm.menu.tech.BatteryBankMenu
 import ru.dbotthepony.mc.otm.registry.game.MBlockEntities
@@ -59,7 +60,7 @@ class BatteryBankBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : Matte
 		if (!howMuch.isPositive)
 			return Decimal.ZERO
 
-		containerSlotIndices.shuffle(level!!.random)
+		containerSlotIndices.shuffle(level!!.otmRandom)
 		var summ = Decimal.ZERO
 		var remaining = howMuch
 
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/EnergyInterfaceBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/EnergyInterfaceBlockEntity.kt
index b4e300552..8a74c8afd 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/EnergyInterfaceBlockEntity.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/EnergyInterfaceBlockEntity.kt
@@ -24,6 +24,7 @@ import ru.dbotthepony.mc.otm.core.math.RelativeSide
 import ru.dbotthepony.mc.otm.core.multiblock.BlockEntityTag
 import ru.dbotthepony.mc.otm.core.multiblock.IMultiblockAccess
 import ru.dbotthepony.mc.otm.core.multiblock.IMultiblockListener
+import ru.dbotthepony.mc.otm.core.otmRandom
 import ru.dbotthepony.mc.otm.core.util.InvalidableLazy
 import ru.dbotthepony.mc.otm.registry.game.MBlockEntities
 
@@ -42,7 +43,7 @@ class EnergyInterfaceBlockEntity(
 		multiblocks.keys.iterator().flatMap { it.blockEntities(TARGET).iterator() }.map { it.energyInterfaceTarget }.toList()
 	}
 
-	val energy = CombinedProfiledEnergyStorage(FlowDirection.input(isInput), targets::value, { level?.random })
+	val energy = CombinedProfiledEnergyStorage(FlowDirection.input(isInput), targets::value, { level?.otmRandom })
 
 	override fun onAddedToMultiblock(multiblock: IMultiblockAccess) {
 		check(!isRemoved) { "Block was removed" }
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/EssenceStorageBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/EssenceStorageBlockEntity.kt
index c00be40ac..9695e8dea 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/EssenceStorageBlockEntity.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/EssenceStorageBlockEntity.kt
@@ -28,6 +28,7 @@ import ru.dbotthepony.mc.otm.container.MatteryContainer
 import ru.dbotthepony.mc.otm.core.getEntitiesInEllipsoid
 import ru.dbotthepony.mc.otm.core.lookupOrThrow
 import ru.dbotthepony.mc.otm.core.math.Vector
+import ru.dbotthepony.mc.otm.core.otmRandom
 import ru.dbotthepony.mc.otm.core.util.countingLazy
 import ru.dbotthepony.mc.otm.item.consumables.EssenceCapsuleItem
 import ru.dbotthepony.mc.otm.item.EssenceServoItem
@@ -172,7 +173,7 @@ class EssenceStorageBlockEntity(blockPos: BlockPos, blockState: BlockState) : Ma
 
 					val diff = dmgPerExp - repairPoints.toFloat()
 					if (diff > 0f) {
-						repairPoints += if ((level?.random?.nextFloat() ?: 1f) <= diff) 1 else 0
+						repairPoints += if ((level?.otmRandom?.nextFloat() ?: 1f) <= diff) 1 else 0
 					}
 
 					experienceStored -= 1
@@ -201,7 +202,7 @@ class EssenceStorageBlockEntity(blockPos: BlockPos, blockState: BlockState) : Ma
 
 						level!!.playSound(null, ent.x, ent.y, ent.z,
 							SoundEvents.EXPERIENCE_ORB_PICKUP, SoundSource.BLOCKS,
-							0.1F, 0.5F + level!!.random.nextFloat() * 0.25F
+							0.1F, 0.5F + level!!.otmRandom.nextFloat() * 0.25F
 						)
 					}
 
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/PlatePressBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/PlatePressBlockEntity.kt
index 199bddfbe..bc8c6e1aa 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/PlatePressBlockEntity.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/PlatePressBlockEntity.kt
@@ -21,6 +21,7 @@ import ru.dbotthepony.mc.otm.container.HandlerFilter
 import ru.dbotthepony.mc.otm.container.balance
 import ru.dbotthepony.mc.otm.core.collect.filter
 import ru.dbotthepony.mc.otm.core.collect.maybe
+import ru.dbotthepony.mc.otm.core.otmRandom
 import ru.dbotthepony.mc.otm.menu.tech.PlatePressMenu
 import ru.dbotthepony.mc.otm.registry.game.MBlockEntities
 import ru.dbotthepony.mc.otm.registry.game.MRecipes
@@ -89,7 +90,7 @@ class PlatePressBlockEntity(
 				recipe.getResultItem(level.registryAccess()).copyWithCount(toProcess),
 				recipe.workTime * MachinesConfig.PLATE_PRESS.workTimeMultiplier,
 				MachinesConfig.PLATE_PRESS.energyConsumption * toProcess,
-				experience = recipe.experience.sample(level.random) * toProcess))
+				experience = recipe.experience.sample(level.otmRandom) * toProcess))
 	}
 
 	override fun tick() {
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayer.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayer.kt
index a0211b503..d3c8ae76f 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayer.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayer.kt
@@ -532,7 +532,7 @@ class MatteryPlayer(val ply: Player) {
 		override fun onJobTick(status: JobStatus<ItemJob>) {
 			super.onJobTick(status)
 
-			if (isExopackVisible && ply.level().random.nextFloat() <= 0.05f) {
+			if (isExopackVisible && ply.level().otmRandom.nextFloat() <= 0.05f) {
 				PacketDistributor.sendToPlayersTrackingEntityAndSelf(ply, ExopackSmokePacket(ply.uuid))
 			}
 		}
@@ -1395,7 +1395,7 @@ class MatteryPlayer(val ply: Player) {
 
 			pos.mul(RenderSystem.getProjectionMatrix())
 			pos.mul(poseStack.last().pose())
-			makeSmoke(cam.x + pos.x, cam.y + pos.y, cam.z + pos.z, ply.level().random, ply.level())
+			makeSmoke(cam.x + pos.x, cam.y + pos.y, cam.z + pos.z, ply.level().otmRandom, ply.level())
 		}
 	}
 
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/decorative/PainterScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/decorative/PainterScreen.kt
index 615ee34b8..7fcc7edb8 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/decorative/PainterScreen.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/decorative/PainterScreen.kt
@@ -104,7 +104,7 @@ class PainterScreen(menu: PainterMenu, inventory: Inventory, title: Component) :
 			it.dock = Dock.FILL
 			it.dockResize = DockResizeMode.NONE
 			it.slotBackgroundEmpty =
-				ItemStackIcon(ItemStack(BuiltInRegistries.ITEM.getOrCreateTag(Tags.Items.DYES).getRandomElement(menu.player.level().random).map { it.value() }.orElse(Items.AIR)), 16f, 16f)
+				ItemStackIcon(ItemStack(BuiltInRegistries.ITEM.getOrCreateTag(Tags.Items.DYES).getRandomElement(menu.random).map { it.value() }.orElse(Items.AIR)), 16f, 16f)
 				.fixed()
 				.composeBefore(FlatRectangleIcon(16f, 16f, RGBAColor.rgb(0x8b8b8b).copy(alpha = 0.6f)))
 				.fixed()
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/IMatteryWorld.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/IMatteryLevel.kt
similarity index 83%
rename from src/main/kotlin/ru/dbotthepony/mc/otm/core/IMatteryWorld.kt
rename to src/main/kotlin/ru/dbotthepony/mc/otm/core/IMatteryLevel.kt
index 137f222e2..dba505e23 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/core/IMatteryWorld.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/IMatteryLevel.kt
@@ -3,7 +3,7 @@ package ru.dbotthepony.mc.otm.core
 import net.minecraft.util.RandomSource
 import net.minecraft.world.level.Level
 
-interface IMatteryWorld {
+interface IMatteryLevel {
 	/**
 	 * OTM provided [RandomSource], which has better statistical parameters
 	 *
@@ -13,4 +13,4 @@ interface IMatteryWorld {
 	val otmRandom: RandomSource
 }
 
-val Level.otmRandom: RandomSource get() = (this as IMatteryWorld).otmRandom
+val Level.otmRandom: RandomSource get() = (this as IMatteryLevel).otmRandom
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/entity/MinecartCargoCrate.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/entity/MinecartCargoCrate.kt
index 5e97a2e07..ee09e29ff 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/entity/MinecartCargoCrate.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/entity/MinecartCargoCrate.kt
@@ -19,6 +19,7 @@ import net.minecraft.world.level.block.state.BlockState
 import net.minecraft.world.level.gameevent.GameEvent
 import ru.dbotthepony.mc.otm.block.decorative.CargoCrateBlock
 import ru.dbotthepony.mc.otm.block.entity.decorative.CargoCrateBlockEntity
+import ru.dbotthepony.mc.otm.core.otmRandom
 import ru.dbotthepony.mc.otm.core.position
 import ru.dbotthepony.mc.otm.menu.decorative.MinecartCargoCrateMenu
 import ru.dbotthepony.mc.otm.registry.game.MItems
@@ -89,7 +90,7 @@ class MinecartCargoCrate(
 
 		if (interactingPlayers++ == 0) {
 			if (!isRemoved) {
-				level().playSound(null, this, MSoundEvents.CARGO_CRATE_OPEN, SoundSource.BLOCKS, 1f, 0.8f + level().random.nextFloat() * 0.2f)
+				level().playSound(null, this, MSoundEvents.CARGO_CRATE_OPEN, SoundSource.BLOCKS, 1f, 0.8f + level().otmRandom.nextFloat() * 0.2f)
 				this.gameEvent(GameEvent.CONTAINER_OPEN, player)
 				PiglinAi.angerNearbyPiglins(player, true)
 			}
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/BatteryItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/BatteryItem.kt
index d7b76d2a1..5cbcab0f0 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/BatteryItem.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/BatteryItem.kt
@@ -184,7 +184,7 @@ class CrudeBatteryItem : BatteryItem(ItemsConfig.Batteries.CRUDE) {
 		if (player is ServerPlayer) {
 			if (!mattery.androidEnergy.item.isEmpty) {
 				mattery.androidEnergy.item.getCapability(Capabilities.EnergyStorage.ITEM)?.let {
-					it.extractEnergy((it.maxEnergyStored * level.random.nextFloat() * .2f).roundToInt(), false)
+					it.extractEnergy((it.maxEnergyStored * level.otmRandom.nextFloat() * .2f).roundToInt(), false)
 				}
 
 				mattery.dropBattery()
@@ -194,7 +194,7 @@ class CrudeBatteryItem : BatteryItem(ItemsConfig.Batteries.CRUDE) {
 			copyStack.count = 1
 			mattery.androidEnergy.item = copyStack
 
-			val extraDamageMult = level.random.nextFloat()
+			val extraDamageMult = level.otmRandom.nextFloat()
 			player.hurt(MatteryDamageSource(level.registryAccess().damageType(MDamageTypes.EMP), inflictor = itemStack), 1.5f + extraDamageMult * 3.5f)
 
 			val debuffDuration = 100 + (100 * (1f - extraDamageMult)).roundToInt()
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/consumables/EssenceCapsuleItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/consumables/EssenceCapsuleItem.kt
index 6f9f0a569..91d300ed5 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/consumables/EssenceCapsuleItem.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/consumables/EssenceCapsuleItem.kt
@@ -17,6 +17,7 @@ import ru.dbotthepony.mc.otm.capability.matteryPlayer
 import ru.dbotthepony.mc.otm.client.isShiftDown
 import ru.dbotthepony.mc.otm.client.minecraft
 import ru.dbotthepony.mc.otm.core.TranslatableComponent
+import ru.dbotthepony.mc.otm.core.otmRandom
 import ru.dbotthepony.mc.otm.core.util.getLevelFromXp
 import ru.dbotthepony.mc.otm.item.MatteryItem
 import ru.dbotthepony.mc.otm.registry.game.MDataComponentTypes
@@ -80,7 +81,7 @@ class EssenceCapsuleItem(private val digital: Boolean) : MatteryItem(Properties(
 		} else {
 			if (level is ServerLevel) {
 				level.levelEvent(2002, player.blockPosition(), PotionContents.getColor(Potions.WATER))
-				ExperienceOrb.award(level, player.position(), (exp * (.5 + level.random.nextFloat() * .25)).toInt())
+				ExperienceOrb.award(level, player.position(), (exp * (.5 + level.otmRandom.nextFloat() * .25)).toInt())
 			}
 		}
 
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/tool/ExplosiveHammerItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/tool/ExplosiveHammerItem.kt
index a79ab1ead..018d1d474 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/tool/ExplosiveHammerItem.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/tool/ExplosiveHammerItem.kt
@@ -84,7 +84,7 @@ class ExplosiveHammerItem(durability: Int = 512) : Item(Properties().stacksTo(1)
 		itemStack.hurtAndBreak(8, level, player) {}
 
 		if (isPrimed(itemStack)) {
-			itemStack.hurtAndBreak(level.random.nextInt(1, 20), level, player) {}
+			itemStack.hurtAndBreak(level.otmRandom.nextInt(1, 20), level, player) {}
 			unprime(itemStack)
 
 			val (ex, ey, ez) = Vector.atCenterOf(player.blockPosition())
@@ -226,7 +226,7 @@ class ExplosiveHammerItem(durability: Int = 512) : Item(Properties().stacksTo(1)
 
 			val copy = itemStack.copy()
 
-			itemStack.hurtAndBreak(level.random.nextInt(1, 20), attacker, EquipmentSlot.MAINHAND)
+			itemStack.hurtAndBreak(level.otmRandom.nextInt(1, 20), attacker, EquipmentSlot.MAINHAND)
 
 			if (!itemStack.isEmpty && attacker.random.nextDouble() <= ToolsConfig.ExplosiveHammer.FLY_OFF_CHANCE) {
 				attacker.setItemInHand(hand, ItemStack.EMPTY)
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/weapon/EnergySwordItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/weapon/EnergySwordItem.kt
index a6d5c27b2..c5a97f16d 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/weapon/EnergySwordItem.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/weapon/EnergySwordItem.kt
@@ -32,6 +32,7 @@ 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
@@ -96,10 +97,10 @@ class EnergySwordItem : MatteryItem(Properties().stacksTo(1).rarity(Rarity.RARE)
 
 		itemStack.getCapability(MatteryCapability.ITEM_ENERGY)?.let {
 			if (it.extractEnergyExact(ENERGY_PER_SWING, false)) {
-				it.extractEnergy(attacker.level().random.nextVariance(ENERGY_PER_SWING_VARIANCE), 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().random.nextVariance(ENERGY_ZAP_VARIANCE), false)
+						it.androidEnergy.extractEnergy(attacker.level().otmRandom.nextVariance(ENERGY_ZAP_VARIANCE), false)
 						victim.hurt(MatteryDamageSource(attacker.level().registryAccess().damageType(MDamageTypes.EMP), attacker, itemStack), 8f)
 					}
 				}
@@ -142,12 +143,12 @@ class EnergySwordItem : MatteryItem(Properties().stacksTo(1).rarity(Rarity.RARE)
 
 			if (blockState.`is`(BlockTags.SWORD_EFFICIENT)) {
 				if (energy?.extractEnergyExact(PLANT_POWER_COST, false) == true)
-					energy.extractEnergyExact(user.level().random.nextVariance(PLANT_POWER_COST_VARIANCE), false)
+					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().random.nextVariance(COBWEB_POWER_COST_VARIANCE), false)
+					energy.extractEnergyExact(user.level().otmRandom.nextVariance(COBWEB_POWER_COST_VARIANCE), false)
 			}
 		}
 
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/network/MatteryPlayerPackets.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/network/MatteryPlayerPackets.kt
index af2e71758..166cadfae 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/network/MatteryPlayerPackets.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/network/MatteryPlayerPackets.kt
@@ -24,6 +24,7 @@ import ru.dbotthepony.mc.otm.core.math.component1
 import ru.dbotthepony.mc.otm.core.math.component2
 import ru.dbotthepony.mc.otm.core.math.component3
 import ru.dbotthepony.mc.otm.core.math.toRadians
+import ru.dbotthepony.mc.otm.core.otmRandom
 import ru.dbotthepony.mc.otm.core.position
 import ru.dbotthepony.mc.otm.core.readItem
 import ru.dbotthepony.mc.otm.core.writeItem
@@ -445,7 +446,7 @@ class ExopackSmokePacket(val player: UUID) : CustomPacketPayload {
 				z += kotlin.math.sin(deg) * -0.4
 
 				val level = ply.level()
-				val random = level.random
+				val random = level.otmRandom
 
 				for (i in 0 .. random.nextInt(2, 4))
 					level.addParticle(
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/network/SmokeParticlesPacket.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/network/SmokeParticlesPacket.kt
index a80bb1ec5..5d87e004a 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/network/SmokeParticlesPacket.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/network/SmokeParticlesPacket.kt
@@ -13,6 +13,7 @@ import net.neoforged.neoforge.network.handling.IPayloadContext
 import ru.dbotthepony.mc.otm.OverdriveThatMatters
 import ru.dbotthepony.mc.otm.client.minecraft
 import ru.dbotthepony.mc.otm.core.ResourceLocation
+import ru.dbotthepony.mc.otm.core.otmRandom
 
 class SmokeParticlesPacket(val x: Double, val y: Double, val z: Double) : CustomPacketPayload {
 	fun write(buff: FriendlyByteBuf) {
@@ -23,7 +24,7 @@ class SmokeParticlesPacket(val x: Double, val y: Double, val z: Double) : Custom
 
 	fun play(context: IPayloadContext) {
 		minecraft.player?.level()?.let {
-			makeSmoke(x, y, z, it.random, it)
+			makeSmoke(x, y, z, it.otmRandom, it)
 		}
 	}
 

From 56cce749f7d4c06a16c9356bf6b3f32a16fa26de Mon Sep 17 00:00:00 2001
From: DBotThePony <dbotthepony@yandex.ru>
Date: Mon, 3 Mar 2025 13:40:33 +0700
Subject: [PATCH 13/13] Make HFB be correct tool for plants and cobwebs

---
 .../mc/otm/item/weapon/EnergySwordItem.kt          | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/weapon/EnergySwordItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/weapon/EnergySwordItem.kt
index c5a97f16d..ec7cc1d4a 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/weapon/EnergySwordItem.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/weapon/EnergySwordItem.kt
@@ -1,6 +1,7 @@
 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
@@ -138,7 +139,7 @@ class EnergySwordItem : MatteryItem(Properties().stacksTo(1).rarity(Rarity.RARE)
 		p_41419_: BlockPos,
 		user: LivingEntity
 	): Boolean {
-		if (blockState.getDestroySpeed(p_41417_, p_41419_) != 0f && (user !is Player || !user.isCreative)) {
+		if (blockState.getDestroySpeed(p_41417_, p_41419_) > 0f && (user !is Player || !user.isCreative)) {
 			val energy = itemStack.matteryEnergy
 
 			if (blockState.`is`(BlockTags.SWORD_EFFICIENT)) {
@@ -155,6 +156,17 @@ class EnergySwordItem : MatteryItem(Properties().stacksTo(1).rarity(Rarity.RARE)
 		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) {