Merge remote-tracking branch 'origin/1.21' into 1.21
@ -49,6 +49,7 @@ import ru.dbotthepony.mc.otm.datagen.loot.LootModifiers
|
|||||||
import ru.dbotthepony.mc.otm.datagen.recipes.*
|
import ru.dbotthepony.mc.otm.datagen.recipes.*
|
||||||
import ru.dbotthepony.mc.otm.datagen.tags.TagsProvider
|
import ru.dbotthepony.mc.otm.datagen.tags.TagsProvider
|
||||||
import ru.dbotthepony.mc.otm.datagen.tags.addTags
|
import ru.dbotthepony.mc.otm.datagen.tags.addTags
|
||||||
|
import ru.dbotthepony.mc.otm.datagen.textures.ColorizedSpritesProvider
|
||||||
import ru.dbotthepony.mc.otm.matter.MatterDataProvider
|
import ru.dbotthepony.mc.otm.matter.MatterDataProvider
|
||||||
import ru.dbotthepony.mc.otm.registry.objects.ColoredDecorativeBlock
|
import ru.dbotthepony.mc.otm.registry.objects.ColoredDecorativeBlock
|
||||||
import ru.dbotthepony.mc.otm.registry.objects.DecorativeBlock
|
import ru.dbotthepony.mc.otm.registry.objects.DecorativeBlock
|
||||||
@ -484,6 +485,7 @@ object DataGen {
|
|||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
fun onGatherData(event: GatherDataEvent) {
|
fun onGatherData(event: GatherDataEvent) {
|
||||||
|
val colorizedSpritesProvider = ColorizedSpritesProvider(event)
|
||||||
val blockModelProvider = MatteryBlockModelProvider(event)
|
val blockModelProvider = MatteryBlockModelProvider(event)
|
||||||
val blockStateProvider = MatteryBlockStateProvider(event)
|
val blockStateProvider = MatteryBlockStateProvider(event)
|
||||||
val itemModelProvider = MatteryItemModelProvider(event)
|
val itemModelProvider = MatteryItemModelProvider(event)
|
||||||
@ -514,6 +516,7 @@ object DataGen {
|
|||||||
|
|
||||||
addTags(tagsProvider)
|
addTags(tagsProvider)
|
||||||
|
|
||||||
|
event.generator.addProvider(event.includeClient(), colorizedSpritesProvider)
|
||||||
event.generator.addProvider(event.includeClient(), blockModelProvider)
|
event.generator.addProvider(event.includeClient(), blockModelProvider)
|
||||||
event.generator.addProvider(event.includeServer(), blockStateProvider)
|
event.generator.addProvider(event.includeServer(), blockStateProvider)
|
||||||
event.generator.addProvider(event.includeClient(), itemModelProvider)
|
event.generator.addProvider(event.includeClient(), itemModelProvider)
|
||||||
|
@ -204,7 +204,6 @@ fun addDecorativeData(blockStateProvider: MatteryBlockStateProvider, itemModelPr
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DataGen.decorativeCubeAll(MBlocks.DANGER_STRIPE_BLOCK)
|
|
||||||
DataGen.decorativePillar(MBlocks.METAL_BEAM, "metal_beam_side", "metal_beam_top")
|
DataGen.decorativePillar(MBlocks.METAL_BEAM, "metal_beam_side", "metal_beam_top")
|
||||||
|
|
||||||
var labLampOn: BlockModelBuilder? = null
|
var labLampOn: BlockModelBuilder? = null
|
||||||
@ -236,7 +235,7 @@ fun addDecorativeData(blockStateProvider: MatteryBlockStateProvider, itemModelPr
|
|||||||
|
|
||||||
itemModelProvider.block(MItems.LABORATORY_LAMP)
|
itemModelProvider.block(MItems.LABORATORY_LAMP)
|
||||||
itemModelProvider.block(MItems.LABORATORY_LAMP_INVERTED, MItems.LABORATORY_LAMP.registryName!!.path + "_unlit")
|
itemModelProvider.block(MItems.LABORATORY_LAMP_INVERTED, MItems.LABORATORY_LAMP.registryName!!.path + "_unlit")
|
||||||
itemModelProvider.block(MItems.DANGER_STRIPE_BLOCK)
|
itemModelProvider.block(MItems.DANGER_STRIPE_BLOCK, MItems.DANGER_STRIPE_BLOCK.registryName!!.path + "_0")
|
||||||
itemModelProvider.block(MItems.METAL_BEAM)
|
itemModelProvider.block(MItems.METAL_BEAM)
|
||||||
|
|
||||||
blockStateProvider.exec {
|
blockStateProvider.exec {
|
||||||
|
@ -10,10 +10,10 @@ fun addBlockModels(provider: MatteryBlockModelProvider) {
|
|||||||
resourceCubeAll(MBlocks.DEEPSLATE_TRITANIUM_ORE)
|
resourceCubeAll(MBlocks.DEEPSLATE_TRITANIUM_ORE)
|
||||||
resourceCubeAll(MBlocks.TRITANIUM_INGOT_BLOCK)
|
resourceCubeAll(MBlocks.TRITANIUM_INGOT_BLOCK)
|
||||||
|
|
||||||
cable("crude_energy_cable", "block/power_cable_0")
|
cable("crude_energy_cable", "block/power_cable_0", powered = true)
|
||||||
cable("regular_energy_cable", "block/power_cable_1")
|
cable("regular_energy_cable", "block/power_cable_1", powered = true)
|
||||||
cable("advanced_energy_cable", "block/power_cable_2")
|
cable("advanced_energy_cable", "block/power_cable_2", powered = true)
|
||||||
cable("superconductor_energy_cable", "block/power_cable_3")
|
cable("superconductor_energy_cable", "block/power_cable_3", powered = true)
|
||||||
cable("matter_cable", "block/matter_cable", thin = true)
|
cable("matter_cable", "block/matter_cable", thin = true)
|
||||||
cable("storage_cable", "block/storage_cable")
|
cable("storage_cable", "block/storage_cable")
|
||||||
|
|
||||||
|
@ -250,23 +250,33 @@ fun addBlockStates(provider: MatteryBlockStateProvider) {
|
|||||||
.rotationY(dir.front.yRotationBlockstateSouth())
|
.rotationY(dir.front.yRotationBlockstateSouth())
|
||||||
.addModel()
|
.addModel()
|
||||||
.condition(CableBlock.MAPPING_CONNECTION_PROP[dir.front]!!, true)
|
.condition(CableBlock.MAPPING_CONNECTION_PROP[dir.front]!!, true)
|
||||||
|
.condition(BlockStateProperties.POWERED, false)
|
||||||
|
.end()
|
||||||
|
|
||||||
|
part().modelFile(provider.models().getExistingFile(modLocation("${block.value.registryName!!.path}_connection_powered")))
|
||||||
|
.rotationX(dir.front.xRotationBlockstateSouth())
|
||||||
|
.rotationY(dir.front.yRotationBlockstateSouth())
|
||||||
|
.addModel()
|
||||||
|
.condition(CableBlock.MAPPING_CONNECTION_PROP[dir.front]!!, true)
|
||||||
|
.condition(BlockStateProperties.POWERED, true)
|
||||||
.end()
|
.end()
|
||||||
}
|
}
|
||||||
|
|
||||||
part().modelFile(provider.models().getExistingFile(modLocation("${block.value.registryName!!.path}_core")))
|
part().modelFile(provider.models().getExistingFile(modLocation("${block.value.registryName!!.path}_core")))
|
||||||
.addModel().end()
|
.addModel().condition(BlockStateProperties.POWERED, false).end()
|
||||||
|
part().modelFile(provider.models().getExistingFile(modLocation("${block.value.registryName!!.path}_core_powered")))
|
||||||
|
.addModel().condition(BlockStateProperties.POWERED, true).end()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
provider.getVariantBuilder(MBlocks.METAL_JUNK).forAllStates {
|
provider.getVariantBuilder(MBlocks.METAL_JUNK).forAllStates {
|
||||||
val generated = ArrayList<ConfiguredModel>()
|
val generated = ArrayList<ConfiguredModel>()
|
||||||
|
|
||||||
for (suffix in arrayOf("", "_b", "_c", "_d")) {
|
for (suffix in arrayOf("_a", "_b", "_c", "_d")) {
|
||||||
val model = provider.models().getExistingFile(modLocation("block/metal_junk$suffix"))
|
val model = provider.models().cubeAll("block/metal_junk$suffix", modLocation("block/decorative/metal_junk$suffix"))
|
||||||
|
|
||||||
generated.add(with(ConfiguredModel.builder()) {
|
generated.add(with(ConfiguredModel.builder()) {
|
||||||
modelFile(model)
|
modelFile(model)
|
||||||
weight(2)
|
|
||||||
|
|
||||||
return@with buildLast()
|
return@with buildLast()
|
||||||
})
|
})
|
||||||
@ -274,7 +284,20 @@ fun addBlockStates(provider: MatteryBlockStateProvider) {
|
|||||||
generated.add(with(ConfiguredModel.builder()) {
|
generated.add(with(ConfiguredModel.builder()) {
|
||||||
modelFile(model)
|
modelFile(model)
|
||||||
rotationY(180)
|
rotationY(180)
|
||||||
weight(2)
|
|
||||||
|
return@with buildLast()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return@forAllStates generated.toTypedArray()
|
||||||
|
}
|
||||||
|
|
||||||
|
provider.getVariantBuilder(MBlocks.DANGER_STRIPE_BLOCK).forAllStates {
|
||||||
|
val generated = ArrayList<ConfiguredModel>()
|
||||||
|
|
||||||
|
for (suffix in arrayOf("_0", "_1")) {
|
||||||
|
generated.add(with(ConfiguredModel.builder()) {
|
||||||
|
modelFile(provider.models().cubeAll("block/danger_stripe_block$suffix", modLocation("block/decorative/danger_stripe_block$suffix")))
|
||||||
|
|
||||||
return@with buildLast()
|
return@with buildLast()
|
||||||
})
|
})
|
||||||
|
@ -20,7 +20,7 @@ fun addItemModels(provider: MatteryItemModelProvider) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
provider.block(MItems.CARBON_FIBRE_BLOCK)
|
provider.block(MItems.CARBON_FIBRE_BLOCK)
|
||||||
provider.block(MItems.METAL_JUNK)
|
provider.block(MItems.METAL_JUNK, MItems.METAL_JUNK.registryName!!.path + "_a")
|
||||||
provider.block(MItems.METAL_MESH)
|
provider.block(MItems.METAL_MESH)
|
||||||
provider.generatedTranslucent(MItems.TRITANIUM_BARS, modLocation("block/decorative/tritanium_bars"))
|
provider.generatedTranslucent(MItems.TRITANIUM_BARS, modLocation("block/decorative/tritanium_bars"))
|
||||||
provider.block(MItems.DEEPSLATE_TRITANIUM_ORE)
|
provider.block(MItems.DEEPSLATE_TRITANIUM_ORE)
|
||||||
|
@ -143,7 +143,7 @@ class MatteryBlockModelProvider(event: GatherDataEvent) : BlockModelProvider(eve
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun cable(modelName: String, textureName: String, thin: Boolean = false) {
|
fun cable(modelName: String, textureName: String, thin: Boolean = false, powered: Boolean = false) {
|
||||||
val baseName = if (thin) "base_cable_thin" else "base_cable"
|
val baseName = if (thin) "base_cable_thin" else "base_cable"
|
||||||
|
|
||||||
exec {
|
exec {
|
||||||
@ -156,5 +156,15 @@ class MatteryBlockModelProvider(event: GatherDataEvent) : BlockModelProvider(eve
|
|||||||
withExistingParent("item/${modelName}", modLocation("item/${baseName}"))
|
withExistingParent("item/${modelName}", modLocation("item/${baseName}"))
|
||||||
.texture("0", textureName)
|
.texture("0", textureName)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (powered && !thin) {
|
||||||
|
exec {
|
||||||
|
withExistingParent("block/${modelName}_core_powered", modLocation("block/${baseName}_core_powered"))
|
||||||
|
.texture("0", textureName)
|
||||||
|
|
||||||
|
withExistingParent("block/${modelName}_connection_powered", modLocation("block/${baseName}_connection_powered"))
|
||||||
|
.texture("0", textureName)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,150 @@
|
|||||||
|
package ru.dbotthepony.mc.otm.datagen.textures
|
||||||
|
|
||||||
|
import net.neoforged.neoforge.common.data.SpriteSourceProvider
|
||||||
|
import net.neoforged.neoforge.data.event.GatherDataEvent
|
||||||
|
import ru.dbotthepony.mc.otm.client.render.ColorizedSpriteSource
|
||||||
|
import ru.dbotthepony.mc.otm.datagen.DataGen
|
||||||
|
import ru.dbotthepony.mc.otm.datagen.modLocation
|
||||||
|
|
||||||
|
class ColorizedSpritesProvider(event: GatherDataEvent) : SpriteSourceProvider(event.generator.packOutput, event.lookupProvider, DataGen.MOD_ID, event.existingFileHelper) {
|
||||||
|
override fun gather() {
|
||||||
|
with(atlas(BLOCKS_ATLAS)) {
|
||||||
|
listOf(
|
||||||
|
"block/android_charger",
|
||||||
|
"block/android_station_base",
|
||||||
|
"block/batterybank_frame",
|
||||||
|
"block/chemical_generator",
|
||||||
|
"block/cobblestone_generator",
|
||||||
|
"block/decorative/computer_base",
|
||||||
|
"block/decorative/computer_screen",
|
||||||
|
"block/drive_viewer",
|
||||||
|
"block/electric_furnace",
|
||||||
|
"block/electric_furnace_offline",
|
||||||
|
"block/energy_counter",
|
||||||
|
"block/energy_servo",
|
||||||
|
"block/essence_storage",
|
||||||
|
"block/induction_furnace",
|
||||||
|
"block/induction_furnace_offline",
|
||||||
|
"block/item_monitor",
|
||||||
|
"block/matter_bottler",
|
||||||
|
"block/matter_decomposer",
|
||||||
|
"block/matter_panel",
|
||||||
|
"block/matter_reconstructor",
|
||||||
|
"block/matter_recycler",
|
||||||
|
"block/matter_replicator_base",
|
||||||
|
"block/matter_replicator_halted",
|
||||||
|
"block/matter_replicator",
|
||||||
|
"block/matter_replicator_offline",
|
||||||
|
"block/matter_scanner",
|
||||||
|
"block/mattercapacitorbank_frame",
|
||||||
|
"block/plate_press",
|
||||||
|
"block/plate_press2",
|
||||||
|
"block/powered_smoker_base",
|
||||||
|
"block/powered_smoker_interior_0",
|
||||||
|
"block/powered_smoker_interior_1",
|
||||||
|
"block/powered_smoker_interior_2",
|
||||||
|
"block/decorative/star_chair",
|
||||||
|
"block/storage_power_supplier",
|
||||||
|
"block/water_source"
|
||||||
|
).forEach {
|
||||||
|
addSource(
|
||||||
|
ColorizedSpriteSource(modLocation(it), modLocation(it).withSuffix("_mask"), modLocation(it)).trackGeneratedTextures(existingFileHelper)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
addSource(
|
||||||
|
ColorizedSpriteSource(
|
||||||
|
modLocation("block/decorative/crates/crate_borderless_colorless"),
|
||||||
|
modLocation("block/decorative/crates/crate_frame"),
|
||||||
|
modLocation("block/decorative/crates/crate"), "_", true, false
|
||||||
|
).trackGeneratedTextures(existingFileHelper)
|
||||||
|
)
|
||||||
|
addSource(
|
||||||
|
ColorizedSpriteSource(
|
||||||
|
modLocation("block/decorative/crates/crate_borderless_colorless"),
|
||||||
|
modLocation("block/decorative/crates/crate_borderless_colorless"),
|
||||||
|
modLocation("block/decorative/crates/crate_borderless"), "_"
|
||||||
|
).trackGeneratedTextures(existingFileHelper)
|
||||||
|
)
|
||||||
|
|
||||||
|
addSource(
|
||||||
|
ColorizedSpriteSource(
|
||||||
|
modLocation("block/decorative/tritanium_block"),
|
||||||
|
modLocation("block/decorative/tritanium_block_colorless"),
|
||||||
|
modLocation("block/decorative/tritanium_block"), "_"
|
||||||
|
).trackGeneratedTextures(existingFileHelper)
|
||||||
|
)
|
||||||
|
addSource(
|
||||||
|
ColorizedSpriteSource(
|
||||||
|
modLocation("block/decorative/tritanium_pillar"),
|
||||||
|
modLocation("block/decorative/tritanium_pillar_colorless"),
|
||||||
|
modLocation("block/decorative/tritanium_pillar"), "_"
|
||||||
|
).trackGeneratedTextures(existingFileHelper)
|
||||||
|
)
|
||||||
|
addSource(
|
||||||
|
ColorizedSpriteSource(
|
||||||
|
modLocation("block/decorative/tritanium_striped_block_base"),
|
||||||
|
modLocation("block/decorative/tritanium_striped_block_colorless_stripe"),
|
||||||
|
modLocation("block/decorative/stripe/tritanium_striped_block"), "_"
|
||||||
|
).trackGeneratedTextures(existingFileHelper)
|
||||||
|
)
|
||||||
|
addSource(
|
||||||
|
ColorizedSpriteSource(
|
||||||
|
modLocation("block/decorative/tritanium_striped_block_colorless_base"),
|
||||||
|
modLocation("block/decorative/tritanium_striped_block_colorless_stripe"),
|
||||||
|
modLocation("block/decorative/stripe/tritanium_striped_block"), "_", true, true
|
||||||
|
).trackGeneratedTextures(existingFileHelper)
|
||||||
|
)
|
||||||
|
addSource(
|
||||||
|
ColorizedSpriteSource(
|
||||||
|
modLocation("block/decorative/tritanium_door_base_top"),
|
||||||
|
modLocation("block/decorative/tritanium_door_color_top"),
|
||||||
|
modLocation("block/decorative/tritanium_door_top"), "_"
|
||||||
|
).trackGeneratedTextures(existingFileHelper)
|
||||||
|
)
|
||||||
|
addSource(
|
||||||
|
ColorizedSpriteSource(
|
||||||
|
modLocation("block/decorative/tritanium_door_base_bottom"),
|
||||||
|
modLocation("block/decorative/tritanium_door_color_bottom"),
|
||||||
|
modLocation("block/decorative/tritanium_door_bottom"), "_"
|
||||||
|
).trackGeneratedTextures(existingFileHelper)
|
||||||
|
)
|
||||||
|
addSource(
|
||||||
|
ColorizedSpriteSource(
|
||||||
|
modLocation("block/decorative/tritanium_trapdoor_overlay"),
|
||||||
|
modLocation("block/decorative/tritanium_trapdoor_colorless"),
|
||||||
|
modLocation("block/decorative/tritanium_trapdoor"), "_"
|
||||||
|
).trackGeneratedTextures(existingFileHelper)
|
||||||
|
)
|
||||||
|
addSource(
|
||||||
|
ColorizedSpriteSource(
|
||||||
|
modLocation("block/decorative/vent_colorless"),
|
||||||
|
modLocation("block/decorative/vent_overlay"),
|
||||||
|
modLocation("block/decorative/vent"), "_", true, false
|
||||||
|
).trackGeneratedTextures(existingFileHelper)
|
||||||
|
)
|
||||||
|
addSource(
|
||||||
|
ColorizedSpriteSource(
|
||||||
|
modLocation("block/decorative/vent_alternative_colorless"),
|
||||||
|
modLocation("block/decorative/vent_alternative_overlay"),
|
||||||
|
modLocation("block/decorative/vent_alternative"), "_", true, false
|
||||||
|
).trackGeneratedTextures(existingFileHelper)
|
||||||
|
)
|
||||||
|
|
||||||
|
addSource(
|
||||||
|
ColorizedSpriteSource(
|
||||||
|
modLocation("item/minecart_cargo_crate_colorless"),
|
||||||
|
modLocation("item/minecart_cargo_crate_nopaint"),
|
||||||
|
modLocation("item/minecart_cargo_crate"), "_", true, false
|
||||||
|
).trackGeneratedTextures(existingFileHelper)
|
||||||
|
)
|
||||||
|
addSource(
|
||||||
|
ColorizedSpriteSource(
|
||||||
|
modLocation("item/tritanium_door_colorless"),
|
||||||
|
modLocation("item/tritanium_door_overlay"),
|
||||||
|
modLocation("item/tritanium_door"), "_", true, false
|
||||||
|
).trackGeneratedTextures(existingFileHelper)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -36,6 +36,7 @@ import ru.dbotthepony.mc.otm.client.onClientDisconnected
|
|||||||
import ru.dbotthepony.mc.otm.client.onClientPostRender
|
import ru.dbotthepony.mc.otm.client.onClientPostRender
|
||||||
import ru.dbotthepony.mc.otm.client.tooltipEvent
|
import ru.dbotthepony.mc.otm.client.tooltipEvent
|
||||||
import ru.dbotthepony.mc.otm.client.render.ChartTooltipElement
|
import ru.dbotthepony.mc.otm.client.render.ChartTooltipElement
|
||||||
|
import ru.dbotthepony.mc.otm.client.render.ColorizedSpriteSource
|
||||||
import ru.dbotthepony.mc.otm.client.render.ShockwaveRenderer
|
import ru.dbotthepony.mc.otm.client.render.ShockwaveRenderer
|
||||||
import ru.dbotthepony.mc.otm.client.render.blockentity.BatteryBankRenderer
|
import ru.dbotthepony.mc.otm.client.render.blockentity.BatteryBankRenderer
|
||||||
import ru.dbotthepony.mc.otm.client.render.blockentity.MatterBatteryBankRenderer
|
import ru.dbotthepony.mc.otm.client.render.blockentity.MatterBatteryBankRenderer
|
||||||
@ -132,6 +133,8 @@ object OverdriveThatMatters {
|
|||||||
MOD_BUS.addListener(EventPriority.NORMAL, ChartTooltipElement.Companion::register)
|
MOD_BUS.addListener(EventPriority.NORMAL, ChartTooltipElement.Companion::register)
|
||||||
MOD_BUS.addListener(EventPriority.NORMAL, MatteryTooltipComponents::registerComponents)
|
MOD_BUS.addListener(EventPriority.NORMAL, MatteryTooltipComponents::registerComponents)
|
||||||
|
|
||||||
|
MOD_BUS.addListener(EventPriority.NORMAL, ColorizedSpriteSource::register)
|
||||||
|
|
||||||
MOD_BUS.addListener(EventPriority.HIGH, MatteryGUI::registerGuiLayers)
|
MOD_BUS.addListener(EventPriority.HIGH, MatteryGUI::registerGuiLayers)
|
||||||
|
|
||||||
MBlockColors.register(MOD_BUS)
|
MBlockColors.register(MOD_BUS)
|
||||||
|
@ -17,6 +17,7 @@ import net.minecraft.world.level.block.SoundType
|
|||||||
import net.minecraft.world.level.block.entity.BlockEntity
|
import net.minecraft.world.level.block.entity.BlockEntity
|
||||||
import net.minecraft.world.level.block.state.BlockState
|
import net.minecraft.world.level.block.state.BlockState
|
||||||
import net.minecraft.world.level.block.state.StateDefinition
|
import net.minecraft.world.level.block.state.StateDefinition
|
||||||
|
import net.minecraft.world.level.block.state.properties.BlockStateProperties
|
||||||
import net.minecraft.world.level.block.state.properties.BooleanProperty
|
import net.minecraft.world.level.block.state.properties.BooleanProperty
|
||||||
import net.minecraft.world.level.material.MapColor
|
import net.minecraft.world.level.material.MapColor
|
||||||
import net.minecraft.world.level.material.PushReaction
|
import net.minecraft.world.level.material.PushReaction
|
||||||
@ -142,6 +143,16 @@ class StorageCableBlock : CableBlock(Properties.of().mapColor(MapColor.METAL).re
|
|||||||
class EnergyCableBlock(val factory: (blockPos: BlockPos, blockState: BlockState) -> BlockEntity) : CableBlock(Properties.of().mapColor(MapColor.METAL).pushReaction(PushReaction.DESTROY).requiresCorrectToolForDrops().sound(SoundType.METAL).strength(1.0f, 6.0f)), EntityBlock {
|
class EnergyCableBlock(val factory: (blockPos: BlockPos, blockState: BlockState) -> BlockEntity) : CableBlock(Properties.of().mapColor(MapColor.METAL).pushReaction(PushReaction.DESTROY).requiresCorrectToolForDrops().sound(SoundType.METAL).strength(1.0f, 6.0f)), EntityBlock {
|
||||||
private val shapes = generateShapes(0.185)
|
private val shapes = generateShapes(0.185)
|
||||||
|
|
||||||
|
init {
|
||||||
|
registerDefaultState(defaultBlockState().setValue(BlockStateProperties.POWERED, false))
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun createBlockStateDefinition(builder: StateDefinition.Builder<Block, BlockState>) {
|
||||||
|
super.createBlockStateDefinition(builder)
|
||||||
|
|
||||||
|
builder.add(BlockStateProperties.POWERED)
|
||||||
|
}
|
||||||
|
|
||||||
@Suppress("OVERRIDE_DEPRECATION")
|
@Suppress("OVERRIDE_DEPRECATION")
|
||||||
override fun getShape(blockState: BlockState, accessor: BlockGetter, pos: BlockPos, context: CollisionContext): VoxelShape {
|
override fun getShape(blockState: BlockState, accessor: BlockGetter, pos: BlockPos, context: CollisionContext): VoxelShape {
|
||||||
return shapes[blockState] ?: Shapes.block()
|
return shapes[blockState] ?: Shapes.block()
|
||||||
|
@ -6,6 +6,7 @@ import net.minecraft.world.level.Level
|
|||||||
import net.minecraft.world.level.block.Block
|
import net.minecraft.world.level.block.Block
|
||||||
import net.minecraft.world.level.block.entity.BlockEntityType
|
import net.minecraft.world.level.block.entity.BlockEntityType
|
||||||
import net.minecraft.world.level.block.state.BlockState
|
import net.minecraft.world.level.block.state.BlockState
|
||||||
|
import net.minecraft.world.level.block.state.properties.BlockStateProperties
|
||||||
import net.neoforged.neoforge.capabilities.Capabilities
|
import net.neoforged.neoforge.capabilities.Capabilities
|
||||||
import ru.dbotthepony.mc.otm.SERVER_IS_LIVE
|
import ru.dbotthepony.mc.otm.SERVER_IS_LIVE
|
||||||
import ru.dbotthepony.mc.otm.block.CableBlock
|
import ru.dbotthepony.mc.otm.block.CableBlock
|
||||||
@ -114,12 +115,30 @@ abstract class EnergyCableBlockEntity(type: BlockEntityType<*>, blockPos: BlockP
|
|||||||
if (!SERVER_IS_LIVE) return
|
if (!SERVER_IS_LIVE) return
|
||||||
val level = level
|
val level = level
|
||||||
|
|
||||||
|
val powered = node.graph.livelyNodes.filter {
|
||||||
|
it.blockEntity.energySides.filter {
|
||||||
|
side -> side.value.neighbour.isPresent && side.value.neighbour.get() !is CableSide
|
||||||
|
}.isNotEmpty()
|
||||||
|
}.size >= 2
|
||||||
|
|
||||||
level?.once {
|
level?.once {
|
||||||
if (!node.isValid) return@once
|
if (!node.isValid) return@once
|
||||||
val newState = blockState.setValue(CableBlock.MAPPING_CONNECTION_PROP[side]!!, status)
|
|
||||||
|
val newState = blockState
|
||||||
|
.setValue(CableBlock.MAPPING_CONNECTION_PROP[side]!!, status)
|
||||||
|
.setValue(BlockStateProperties.POWERED, powered)
|
||||||
|
|
||||||
if (newState !== blockState && SERVER_IS_LIVE)
|
if (newState !== blockState && SERVER_IS_LIVE)
|
||||||
level.setBlock(blockPos, newState, Block.UPDATE_CLIENTS)
|
level.setBlock(blockPos, newState, Block.UPDATE_CLIENTS)
|
||||||
|
|
||||||
|
node.graph.livelyNodes.forEach {
|
||||||
|
if (it.isValid) {
|
||||||
|
val newState = it.blockEntity.blockState.setValue(BlockStateProperties.POWERED, powered)
|
||||||
|
|
||||||
|
if (newState !== it.blockEntity.blockState && SERVER_IS_LIVE)
|
||||||
|
level.setBlock(it.blockEntity.blockPos, newState, Block.UPDATE_CLIENTS)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,138 @@
|
|||||||
|
package ru.dbotthepony.mc.otm.client.render
|
||||||
|
|
||||||
|
import com.mojang.serialization.Codec
|
||||||
|
import com.mojang.serialization.MapCodec
|
||||||
|
import com.mojang.serialization.codecs.RecordCodecBuilder
|
||||||
|
import net.minecraft.client.renderer.texture.SpriteContents
|
||||||
|
import net.minecraft.client.renderer.texture.atlas.SpriteResourceLoader
|
||||||
|
import net.minecraft.client.renderer.texture.atlas.SpriteSource
|
||||||
|
import net.minecraft.client.renderer.texture.atlas.SpriteSource.TEXTURE_ID_CONVERTER
|
||||||
|
import net.minecraft.client.renderer.texture.atlas.SpriteSourceType
|
||||||
|
import net.minecraft.client.renderer.texture.atlas.sources.LazyLoadedImage
|
||||||
|
import net.minecraft.client.resources.metadata.animation.FrameSize
|
||||||
|
import net.minecraft.resources.ResourceLocation
|
||||||
|
import net.minecraft.server.packs.resources.ResourceManager
|
||||||
|
import net.minecraft.server.packs.resources.ResourceMetadata
|
||||||
|
import net.minecraft.world.item.DyeColor
|
||||||
|
import net.neoforged.neoforge.client.event.RegisterSpriteSourceTypesEvent
|
||||||
|
import net.neoforged.neoforge.client.model.generators.ModelProvider
|
||||||
|
import net.neoforged.neoforge.common.data.ExistingFileHelper
|
||||||
|
import ru.dbotthepony.kommons.math.RGBAColor
|
||||||
|
import ru.dbotthepony.mc.otm.OverdriveThatMatters.loc
|
||||||
|
|
||||||
|
class ColorizedSpriteSource(val base: ResourceLocation, val overlay: ResourceLocation, val outputPathBase: ResourceLocation, val outputPathSuffix: String = "/", val tintBase: Boolean = false, val tintOverlay: Boolean = true) : SpriteSource {
|
||||||
|
override fun run(
|
||||||
|
manager: ResourceManager,
|
||||||
|
output: SpriteSource.Output
|
||||||
|
) {
|
||||||
|
val baseRes = manager.getResource(TEXTURE_ID_CONVERTER.idToFile(base)).get()
|
||||||
|
val maskRes = manager.getResource(TEXTURE_ID_CONVERTER.idToFile(overlay)).get()
|
||||||
|
|
||||||
|
for (baseTint in DyeColor.entries) {
|
||||||
|
for (overlayTint in DyeColor.entries) {
|
||||||
|
if (tintBase && baseTint == overlayTint) continue
|
||||||
|
|
||||||
|
var outputLocation = outputPathBase
|
||||||
|
if (tintBase) outputLocation = outputLocation.withSuffix(outputPathSuffix + baseTint.serializedName)
|
||||||
|
if (tintOverlay) outputLocation = outputLocation.withSuffix(outputPathSuffix + overlayTint.serializedName)
|
||||||
|
|
||||||
|
val baseImage = LazyLoadedImage(base, baseRes, 1)
|
||||||
|
val maskImage = LazyLoadedImage(overlay, maskRes, 1)
|
||||||
|
|
||||||
|
output.add(outputLocation, Supplier(baseImage, if (tintBase) baseTint else null, maskImage, if (tintOverlay) overlayTint else null, outputLocation))
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!tintBase) return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun type(): SpriteSourceType {
|
||||||
|
return SPRITE_SOURCE!!
|
||||||
|
}
|
||||||
|
|
||||||
|
fun trackGeneratedTextures(efh: ExistingFileHelper) : ColorizedSpriteSource {
|
||||||
|
for (baseTint in DyeColor.entries) {
|
||||||
|
for (overlayTint in DyeColor.entries) {
|
||||||
|
if (tintBase && baseTint == overlayTint) continue
|
||||||
|
|
||||||
|
var outputLocation = outputPathBase
|
||||||
|
if (tintBase) outputLocation = outputLocation.withSuffix(outputPathSuffix + baseTint.serializedName)
|
||||||
|
if (tintOverlay) outputLocation = outputLocation.withSuffix(outputPathSuffix + overlayTint.serializedName)
|
||||||
|
|
||||||
|
efh.trackGenerated(outputLocation, ModelProvider.TEXTURE)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!tintBase) return this
|
||||||
|
}
|
||||||
|
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
class Supplier(val baseImage: LazyLoadedImage, val baseTint: DyeColor?, val maskImage: LazyLoadedImage, val maskTint: DyeColor?, val outputLocation: ResourceLocation) : SpriteSource.SpriteSupplier {
|
||||||
|
override fun apply(t: SpriteResourceLoader?): SpriteContents? {
|
||||||
|
val base = baseImage.get()
|
||||||
|
val mask = maskImage.get()
|
||||||
|
|
||||||
|
if (base.width != mask.width || base.height != mask.height) {
|
||||||
|
throw IllegalArgumentException("Base image doesn't match mask in texture size")
|
||||||
|
}
|
||||||
|
|
||||||
|
if (baseTint != null) {
|
||||||
|
val baseDiffCol = RGBAColor.argb(baseTint.textureDiffuseColor)
|
||||||
|
base.applyToAllPixels {
|
||||||
|
val a = (it and -0x1000000 ushr 24) / 255f
|
||||||
|
val b = (it and 0xFF0000 ushr 16) / 255f
|
||||||
|
val g = (it and 0xFF00 ushr 8) / 255f
|
||||||
|
val r = (it and 0xFF) / 255f
|
||||||
|
|
||||||
|
RGBAColor(r * baseDiffCol.red, g * baseDiffCol.green, b * baseDiffCol.blue, a).toRGBA()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (maskTint != null) {
|
||||||
|
val maskDiffCol = RGBAColor.argb(maskTint.textureDiffuseColor)
|
||||||
|
mask.applyToAllPixels {
|
||||||
|
val a = (it and -0x1000000 ushr 24) / 255f
|
||||||
|
val b = (it and 0xFF0000 ushr 16) / 255f
|
||||||
|
val g = (it and 0xFF00 ushr 8) / 255f
|
||||||
|
val r = (it and 0xFF) / 255f
|
||||||
|
|
||||||
|
RGBAColor(r * maskDiffCol.red, g * maskDiffCol.green, b * maskDiffCol.blue, a).toRGBA()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i in 0 until base.width) {
|
||||||
|
for (j in 0 until base.height) {
|
||||||
|
base.blendPixel(i, j, mask.getPixelRGBA(i, j))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
maskImage.release()
|
||||||
|
|
||||||
|
return SpriteContents(outputLocation, FrameSize(base.width, base.height), base, ResourceMetadata.EMPTY)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
val LOCATION = loc("colorized")
|
||||||
|
|
||||||
|
private val CODEC: MapCodec<ColorizedSpriteSource> = RecordCodecBuilder.mapCodec {
|
||||||
|
it.group(
|
||||||
|
ResourceLocation.CODEC.fieldOf("base").forGetter { it.base },
|
||||||
|
ResourceLocation.CODEC.fieldOf("overlay").forGetter { it.overlay },
|
||||||
|
ResourceLocation.CODEC.fieldOf("output_path_base").forGetter { it.outputPathBase },
|
||||||
|
Codec.STRING.optionalFieldOf("output_path_suffix", "/").forGetter { it.outputPathSuffix },
|
||||||
|
Codec.BOOL.optionalFieldOf("base_tint", false).forGetter { it.tintBase },
|
||||||
|
Codec.BOOL.optionalFieldOf("overlay_tint", true).forGetter{ it.tintOverlay }
|
||||||
|
|
||||||
|
).apply(it, ::ColorizedSpriteSource)
|
||||||
|
}
|
||||||
|
|
||||||
|
var SPRITE_SOURCE: SpriteSourceType? = null
|
||||||
|
|
||||||
|
fun register(event: RegisterSpriteSourceTypesEvent) {
|
||||||
|
SPRITE_SOURCE = event.register(LOCATION, CODEC)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"parent": "block/block",
|
||||||
|
"texture_size": [16, 16],
|
||||||
|
"textures": {
|
||||||
|
"particle": "#0"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"from": [5, 5, 11],
|
||||||
|
"to": [11, 11, 16],
|
||||||
|
"faces": {
|
||||||
|
"east": {"uv": [6, 6, 11, 12], "texture": "#0"},
|
||||||
|
"west": {"uv": [6, 6, 11, 12], "texture": "#0"},
|
||||||
|
"up": {"uv": [6, 6, 11, 12], "rotation": 90, "texture": "#0"},
|
||||||
|
"down": {"uv": [6, 6, 11, 12], "rotation": 90, "texture": "#0"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"parent": "block/block",
|
||||||
|
"texture_size": [16, 16],
|
||||||
|
"textures": {
|
||||||
|
"particle": "#0"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"from": [5, 5, 5],
|
||||||
|
"to": [11, 11, 11],
|
||||||
|
"faces": {
|
||||||
|
"north": {"uv": [0, 6, 6, 12], "texture": "#0"},
|
||||||
|
"east": {"uv": [0, 6, 6, 12], "texture": "#0"},
|
||||||
|
"south": {"uv": [0, 6, 6, 12], "texture": "#0"},
|
||||||
|
"west": {"uv": [0, 6, 6, 12], "texture": "#0"},
|
||||||
|
"up": {"uv": [0, 6, 6, 12], "texture": "#0"},
|
||||||
|
"down": {"uv": [0, 6, 6, 12], "texture": "#0"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -1,6 +0,0 @@
|
|||||||
{
|
|
||||||
"parent": "minecraft:block/cube_all",
|
|
||||||
"textures": {
|
|
||||||
"all": "overdrive_that_matters:block/decorative/metal_junk_a"
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,6 +0,0 @@
|
|||||||
{
|
|
||||||
"parent": "minecraft:block/cube_all",
|
|
||||||
"textures": {
|
|
||||||
"all": "overdrive_that_matters:block/decorative/metal_junk_b"
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,6 +0,0 @@
|
|||||||
{
|
|
||||||
"parent": "minecraft:block/cube_all",
|
|
||||||
"textures": {
|
|
||||||
"all": "overdrive_that_matters:block/decorative/metal_junk_c"
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,6 +0,0 @@
|
|||||||
{
|
|
||||||
"parent": "minecraft:block/cube_all",
|
|
||||||
"textures": {
|
|
||||||
"all": "overdrive_that_matters:block/decorative/metal_junk_d"
|
|
||||||
}
|
|
||||||
}
|
|
Before Width: | Height: | Size: 836 B |
Before Width: | Height: | Size: 836 B |
Before Width: | Height: | Size: 836 B |
Before Width: | Height: | Size: 836 B |
Before Width: | Height: | Size: 836 B |
Before Width: | Height: | Size: 836 B |
Before Width: | Height: | Size: 836 B |
Before Width: | Height: | Size: 836 B |
Before Width: | Height: | Size: 836 B |
Before Width: | Height: | Size: 836 B |
Before Width: | Height: | Size: 836 B |
Before Width: | Height: | Size: 836 B |
Before Width: | Height: | Size: 836 B |
Before Width: | Height: | Size: 836 B |
Before Width: | Height: | Size: 836 B |
Before Width: | Height: | Size: 836 B |
Before Width: | Height: | Size: 593 B |
Before Width: | Height: | Size: 593 B |
Before Width: | Height: | Size: 593 B |
Before Width: | Height: | Size: 593 B |
Before Width: | Height: | Size: 593 B |
Before Width: | Height: | Size: 593 B |
Before Width: | Height: | Size: 593 B |
Before Width: | Height: | Size: 593 B |
Before Width: | Height: | Size: 593 B |
Before Width: | Height: | Size: 593 B |
Before Width: | Height: | Size: 593 B |
Before Width: | Height: | Size: 593 B |
Before Width: | Height: | Size: 593 B |
Before Width: | Height: | Size: 593 B |
Before Width: | Height: | Size: 607 B |
Before Width: | Height: | Size: 593 B |
Before Width: | Height: | Size: 648 B |
Before Width: | Height: | Size: 648 B |
Before Width: | Height: | Size: 648 B |
Before Width: | Height: | Size: 648 B |
Before Width: | Height: | Size: 648 B |
Before Width: | Height: | Size: 648 B |
Before Width: | Height: | Size: 648 B |
Before Width: | Height: | Size: 648 B |
Before Width: | Height: | Size: 648 B |
Before Width: | Height: | Size: 648 B |
Before Width: | Height: | Size: 648 B |
Before Width: | Height: | Size: 648 B |
Before Width: | Height: | Size: 648 B |
Before Width: | Height: | Size: 648 B |
Before Width: | Height: | Size: 732 B |
Before Width: | Height: | Size: 648 B |
Before Width: | Height: | Size: 799 B |
Before Width: | Height: | Size: 799 B |
Before Width: | Height: | Size: 799 B |
Before Width: | Height: | Size: 799 B |
Before Width: | Height: | Size: 799 B |
Before Width: | Height: | Size: 799 B |
Before Width: | Height: | Size: 799 B |
Before Width: | Height: | Size: 799 B |
Before Width: | Height: | Size: 799 B |
Before Width: | Height: | Size: 799 B |
Before Width: | Height: | Size: 799 B |
Before Width: | Height: | Size: 799 B |
Before Width: | Height: | Size: 799 B |
Before Width: | Height: | Size: 799 B |
Before Width: | Height: | Size: 793 B |
Before Width: | Height: | Size: 799 B |
Before Width: | Height: | Size: 699 B |
Before Width: | Height: | Size: 699 B |
Before Width: | Height: | Size: 699 B |
Before Width: | Height: | Size: 699 B |
Before Width: | Height: | Size: 699 B |
Before Width: | Height: | Size: 699 B |
Before Width: | Height: | Size: 699 B |
Before Width: | Height: | Size: 699 B |
Before Width: | Height: | Size: 699 B |
Before Width: | Height: | Size: 699 B |
Before Width: | Height: | Size: 699 B |
Before Width: | Height: | Size: 699 B |
Before Width: | Height: | Size: 699 B |
Before Width: | Height: | Size: 699 B |
Before Width: | Height: | Size: 787 B |
Before Width: | Height: | Size: 699 B |
Before Width: | Height: | Size: 553 B |
Before Width: | Height: | Size: 553 B |
Before Width: | Height: | Size: 553 B |