Minecarts with cargo crates

This commit is contained in:
DBotThePony 2022-09-26 15:34:04 +07:00
parent 0b0e6a18b6
commit c91e3b0bc6
Signed by: DBot
GPG Key ID: DCC23B5715498507
16 changed files with 281 additions and 4 deletions

View File

@ -35,6 +35,7 @@ import ru.dbotthepony.mc.otm.datagen.recipes.addBlastingRecipes
import ru.dbotthepony.mc.otm.datagen.recipes.addCraftingTableRecipes
import ru.dbotthepony.mc.otm.datagen.recipes.addDecorativesRecipes
import ru.dbotthepony.mc.otm.datagen.recipes.addPlatePressRecipes
import ru.dbotthepony.mc.otm.datagen.recipes.addShapelessRecipes
import ru.dbotthepony.mc.otm.datagen.tags.TagsProvider
import ru.dbotthepony.mc.otm.datagen.tags.addTags
import ru.dbotthepony.mc.otm.registry.objects.ColoredDecorativeBlock
@ -272,6 +273,7 @@ object DataGen {
addCraftingTableRecipes(consumer)
addBlastingRecipes(consumer)
addDecorativesRecipes(recipeProvider, consumer)
addShapelessRecipes(consumer)
}
addPlatePressRecipes(recipeProvider)

View File

@ -16,6 +16,14 @@ private fun decoratives(provider: MatteryLanguageProvider) {
provider.englishColors.add(MRegistry.CARGO_CRATES, "%s Cargo Crate")
provider.englishColors.add(MRegistry.DECORATIVE_CRATE, "%s Container Block")
for ((color, name) in provider.englishColors.dyeClassMapped) {
provider.english.add(MItems.CARGO_CRATE_MINECARTS[color]!!, "Minecart with $name Cargo Crate")
provider.english.add(MEntityTypes.CARGO_CRATE_MINECARTS[color]!!, "Minecart with $name Cargo Crate")
}
provider.english.add(MItems.CARGO_CRATE_MINECARTS[null]!!, "Minecart with Cargo Crate")
provider.english.add(MEntityTypes.CARGO_CRATE_MINECARTS[null]!!, "Minecart with Cargo Crate")
with(provider.english) {
add(MRegistry.CARGO_CRATES.block, "Cargo Crate")
add(MRegistry.TRITANIUM_BLOCK.block, "Tritanium Block")

View File

@ -222,6 +222,12 @@ class MatteryLanguageProvider(private val gen: DataGenerator) {
}
}
fun forEach(consumer: (color: DyeColor, name: String) -> Unit) {
for ((a, b) in dyeClassPairs) {
consumer.invoke(a, b)
}
}
fun add(
whiteBlock: Block,
orangeBlock: Block,

View File

@ -28,9 +28,9 @@ fun addCraftingTableRecipes(consumer: Consumer<FinishedRecipe>) {
.save(consumer)
ShapelessRecipeBuilder(crate, 1)
.requires(Ingredient.of(MItemTags.TRITANIUM_CRATES), 1)
.requires(Ingredient.of(MItemTags.CARGO_CRATES), 1)
.requires(Ingredient.of(dye.tag), 1)
.unlockedBy("has_tritanium_crate", has(MItemTags.TRITANIUM_CRATES))
.unlockedBy("has_tritanium_crate", has(MItemTags.CARGO_CRATES))
.save(consumer, "${crate.registryName}_alt")
}

View File

@ -0,0 +1,36 @@
package ru.dbotthepony.mc.otm.datagen.recipes
import net.minecraft.data.recipes.FinishedRecipe
import net.minecraft.data.recipes.ShapelessRecipeBuilder
import net.minecraft.world.item.DyeColor
import net.minecraft.world.item.Items
import ru.dbotthepony.mc.otm.core.registryName
import ru.dbotthepony.mc.otm.datagen.modLocation
import ru.dbotthepony.mc.otm.registry.MItemTags
import ru.dbotthepony.mc.otm.registry.MItems
import ru.dbotthepony.mc.otm.registry.MRegistry
import java.util.function.Consumer
fun addShapelessRecipes(consumer: Consumer<FinishedRecipe>) {
for (color in DyeColor.values()) {
ShapelessRecipeBuilder(MItems.CARGO_CRATE_MINECARTS[color]!!, 1)
.requires(Items.MINECART)
.requires(MRegistry.CARGO_CRATES.items[color]!!)
.unlockedBy(Items.MINECART)
.unlockedBy(MRegistry.CARGO_CRATES.items[color]!!)
.save(consumer)
ShapelessRecipeBuilder(MItems.CARGO_CRATE_MINECARTS[color]!!, 1)
.requires(MItemTags.MINECART_CARGO_CRATES)
.requires(color.tag)
.unlockedBy(MItemTags.MINECART_CARGO_CRATES)
.save(consumer, modLocation(MItems.CARGO_CRATE_MINECARTS[color]!!.registryName!!.path + "_alt"))
}
ShapelessRecipeBuilder(MItems.CARGO_CRATE_MINECARTS[null]!!, 1)
.requires(Items.MINECART)
.requires(MRegistry.CARGO_CRATES.item)
.unlockedBy(Items.MINECART)
.unlockedBy(MRegistry.CARGO_CRATES.item)
.save(consumer)
}

View File

@ -5,6 +5,7 @@ import net.minecraft.world.item.DyeColor
import net.minecraft.world.item.Items
import net.minecraft.world.item.Tiers
import ru.dbotthepony.mc.otm.registry.MBlocks
import ru.dbotthepony.mc.otm.registry.MItemTags
import ru.dbotthepony.mc.otm.registry.MItems
import ru.dbotthepony.mc.otm.registry.MRegistry
import ru.dbotthepony.mc.otm.registry.MSoundEvents
@ -32,6 +33,8 @@ fun addTags(tagsProvider: TagsProvider) {
MBlocks.STORAGE_CABLE
)
tagsProvider.items.appender(MItemTags.MINECART_CARGO_CRATES).add(MItems.CARGO_CRATE_MINECARTS.values)
tagsProvider.items.forge("hardened_glass").add(MRegistry.INDUSTRIAL_GLASS.allItems.values)
tagsProvider.items.forge("hardened_glass/colorless").add(MRegistry.INDUSTRIAL_GLASS.item)
tagsProvider.items.forge("hardened_glass/tinted").add(MRegistry.INDUSTRIAL_GLASS.items.values)

View File

@ -6,9 +6,22 @@ import ru.dbotthepony.mc.otm.client.screen.panels.FramePanel
import ru.dbotthepony.mc.otm.client.screen.panels.GridPanel
import ru.dbotthepony.mc.otm.client.screen.panels.SlotPanel
import ru.dbotthepony.mc.otm.menu.CargoCrateMenu
import ru.dbotthepony.mc.otm.menu.MinecartCargoCrateMenu
class CargoCrateScreen(menu: CargoCrateMenu, inventory: Inventory, title: Component) : MatteryScreen<CargoCrateMenu>(menu, inventory, title) {
override fun makeMainFrame(): FramePanel<out MatteryScreen<*>> {
override fun makeMainFrame(): FramePanel<MatteryScreen<*>> {
val frame = FramePanel(this, null, 0f, 0f, INVENTORY_FRAME_WIDTH, 22f + 4f + 6f * 18f, getTitle())
val grid = GridPanel(this, frame, 8f, 18f, 9f * 18f, 6f * 18f, 9, 6)
for (slot in menu.storageSlots)
SlotPanel(this, grid, slot)
return frame
}
}
class MinecartCargoCrateScreen(menu: MinecartCargoCrateMenu, inventory: Inventory, title: Component) : MatteryScreen<MinecartCargoCrateMenu>(menu, inventory, title) {
override fun makeMainFrame(): FramePanel<MatteryScreen<*>> {
val frame = FramePanel(this, null, 0f, 0f, INVENTORY_FRAME_WIDTH, 22f + 4f + 6f * 18f, getTitle())
val grid = GridPanel(this, frame, 8f, 18f, 9f * 18f, 6f * 18f, 9, 6)

View File

@ -0,0 +1,69 @@
package ru.dbotthepony.mc.otm.entity
import net.minecraft.core.NonNullList
import net.minecraft.world.entity.EntityType
import net.minecraft.world.entity.player.Inventory
import net.minecraft.world.entity.vehicle.AbstractMinecartContainer
import net.minecraft.world.inventory.AbstractContainerMenu
import net.minecraft.world.item.DyeColor
import net.minecraft.world.item.Item
import net.minecraft.world.item.ItemStack
import net.minecraft.world.level.Level
import net.minecraft.world.level.block.state.BlockState
import ru.dbotthepony.mc.otm.block.CargoCrateBlock
import ru.dbotthepony.mc.otm.block.entity.CargoCrateBlockEntity
import ru.dbotthepony.mc.otm.menu.MinecartCargoCrateMenu
import ru.dbotthepony.mc.otm.registry.MItems
import ru.dbotthepony.mc.otm.registry.MRegistry
class MinecartCargoCrate(
type: EntityType<*>,
val color: DyeColor?,
level: Level,
x: Double = 0.0,
y: Double = 0.0,
z: Double = 0.0
) : AbstractMinecartContainer(type, x, y, z, level) {
val block = MRegistry.CARGO_CRATES.allBlocks[color] ?: throw NullPointerException("No cargo crate block for color $color!")
val item = MItems.CARGO_CRATE_MINECARTS[color] ?: throw NullPointerException("No minecart cargo crate item for color $color!")
private val itemStacksList = NonNullList.withSize(CargoCrateBlockEntity.CAPACITY, ItemStack.EMPTY)
override fun getItemStacks(): NonNullList<ItemStack> {
return itemStacksList
}
override fun clearItemStacks() {
for (i in 0 until itemStacksList.size) {
itemStacksList[i] = ItemStack.EMPTY
}
}
override fun getDropItem(): Item {
return item
}
override fun getMinecartType(): Type {
return Type.CHEST
}
override fun getDefaultDisplayBlockState(): BlockState {
return block.defaultBlockState().setValue(CargoCrateBlock.IS_OPEN, false)
}
override fun getDefaultDisplayOffset(): Int {
return 8
}
override fun getContainerSize(): Int {
return CargoCrateBlockEntity.CAPACITY
}
override fun createMenu(p_38222_: Int, p_38223_: Inventory): AbstractContainerMenu {
return MinecartCargoCrateMenu(p_38222_, p_38223_, this)
}
override fun getPickResult(): ItemStack {
return ItemStack(item, 1)
}
}

View File

@ -0,0 +1,53 @@
package ru.dbotthepony.mc.otm.item
import net.minecraft.tags.BlockTags
import net.minecraft.world.InteractionResult
import net.minecraft.world.entity.vehicle.AbstractMinecart
import net.minecraft.world.item.DyeColor
import net.minecraft.world.item.Item
import net.minecraft.world.item.context.UseOnContext
import net.minecraft.world.level.block.BaseRailBlock
import net.minecraft.world.level.block.state.properties.RailShape
import net.minecraft.world.level.gameevent.GameEvent
import ru.dbotthepony.mc.otm.OverdriveThatMatters
import ru.dbotthepony.mc.otm.entity.MinecartCargoCrate
import ru.dbotthepony.mc.otm.registry.MEntityTypes
class MinecartCargoCrateItem(val color: DyeColor?) : Item(Properties().stacksTo(64).tab(OverdriveThatMatters.INSTANCE.CREATIVE_TAB)) {
override fun useOn(useOnContext: UseOnContext): InteractionResult {
val level = useOnContext.level
val blockpos = useOnContext.clickedPos
val blockstate = level.getBlockState(blockpos)
if (!blockstate.`is`(BlockTags.RAILS)) {
return InteractionResult.FAIL
}
val itemstack = useOnContext.itemInHand
if (!level.isClientSide) {
val railshape =
if (blockstate.block is BaseRailBlock)
(blockstate.block as BaseRailBlock).getRailDirection(blockstate, level, blockpos, null)
else
RailShape.NORTH_SOUTH
val d0 = if (railshape.isAscending) 0.5 else 0.0
val type = MEntityTypes.CARGO_CRATE_MINECARTS[color] ?: throw NullPointerException("Unable to find minecart entity type for color $color!")
val entity = MinecartCargoCrate(type, color, level, blockpos.x.toDouble() + 0.5, blockpos.y.toDouble() + 0.0625 + d0, blockpos.z.toDouble() + 0.5)
if (itemstack.hasCustomHoverName()) {
entity.customName = itemstack.hoverName
}
level.addFreshEntity(entity)
level.gameEvent(GameEvent.ENTITY_PLACE, blockpos, GameEvent.Context.of(useOnContext.player, level.getBlockState(blockpos.below())))
}
if (useOnContext.player?.abilities?.instabuild != true) {
itemstack.shrink(1)
}
return InteractionResult.sidedSuccess(level.isClientSide)
}
}

View File

@ -0,0 +1,34 @@
package ru.dbotthepony.mc.otm.menu
import net.minecraft.world.Container
import net.minecraft.world.SimpleContainer
import net.minecraft.world.entity.player.Inventory
import net.minecraft.world.entity.player.Player
import ru.dbotthepony.mc.otm.core.ImmutableList
import ru.dbotthepony.mc.otm.block.entity.CargoCrateBlockEntity
import ru.dbotthepony.mc.otm.entity.MinecartCargoCrate
import ru.dbotthepony.mc.otm.registry.MMenus
class MinecartCargoCrateMenu @JvmOverloads constructor(
p_38852_: Int,
inventory: Inventory,
val cart: MinecartCargoCrate? = null
) : MatteryMenu(MMenus.CARGO_CRATE, p_38852_, inventory) {
override val storageSlots: List<MatterySlot>
init {
val container = cart as Container? ?: SimpleContainer(CargoCrateBlockEntity.CAPACITY)
storageSlots = ImmutableList(CargoCrateBlockEntity.CAPACITY) {
val slot = MatterySlot(container, it)
addSlot(slot)
return@ImmutableList slot
}
addInventorySlots()
}
override fun stillValid(player: Player): Boolean {
return cart?.stillValid(player) ?: true
}
}

View File

@ -0,0 +1,35 @@
package ru.dbotthepony.mc.otm.registry
import net.minecraft.world.item.DyeColor
import net.minecraftforge.registries.DeferredRegister
import ru.dbotthepony.mc.otm.item.MinecartCargoCrateItem
private fun <T> DeferredRegister<T>.doColored(prefix: String, factory: (color: DyeColor, name: String) -> T): MutableCollection<Pair<DyeColor, () -> T>> {
return mutableListOf(
DyeColor.BLACK to register(prefix + "_black") { factory.invoke(DyeColor.BLACK, prefix + "_black") }::get,
DyeColor.BLUE to register(prefix + "_blue") { factory.invoke(DyeColor.BLUE, prefix + "_blue") }::get,
DyeColor.BROWN to register(prefix + "_brown") { factory.invoke(DyeColor.BROWN, prefix + "_brown") }::get,
DyeColor.CYAN to register(prefix + "_cyan") { factory.invoke(DyeColor.CYAN, prefix + "_cyan") }::get,
DyeColor.GRAY to register(prefix + "_gray") { factory.invoke(DyeColor.GRAY, prefix + "_gray") }::get,
DyeColor.GREEN to register(prefix + "_green") { factory.invoke(DyeColor.GREEN, prefix + "_green") }::get,
DyeColor.LIGHT_BLUE to register(prefix + "_light_blue") { factory.invoke(DyeColor.LIGHT_BLUE, prefix + "_light_blue") }::get,
DyeColor.LIGHT_GRAY to register(prefix + "_light_gray") { factory.invoke(DyeColor.LIGHT_GRAY, prefix + "_light_gray") }::get,
DyeColor.LIME to register(prefix + "_lime") { factory.invoke(DyeColor.LIME, prefix + "_lime") }::get,
DyeColor.MAGENTA to register(prefix + "_magenta") { factory.invoke(DyeColor.MAGENTA, prefix + "_magenta") }::get,
DyeColor.ORANGE to register(prefix + "_orange") { factory.invoke(DyeColor.ORANGE, prefix + "_orange") }::get,
DyeColor.PINK to register(prefix + "_pink") { factory.invoke(DyeColor.PINK, prefix + "_pink") }::get,
DyeColor.PURPLE to register(prefix + "_purple") { factory.invoke(DyeColor.PURPLE, prefix + "_purple") }::get,
DyeColor.RED to register(prefix + "_red") { factory.invoke(DyeColor.RED, prefix + "_red") }::get,
DyeColor.WHITE to register(prefix + "_white") { factory.invoke(DyeColor.WHITE, prefix + "_white") }::get,
DyeColor.YELLOW to register(prefix + "_yellow") { factory.invoke(DyeColor.YELLOW, prefix + "_yellow") }::get,
)
}
fun <T> DeferredRegister<T>.colored(prefix: String, factory: (color: DyeColor, name: String) -> T): Map<DyeColor, T> {
return LazyMap(doColored(prefix, factory))
}
@Suppress("unchecked_cast")
fun <T> DeferredRegister<T>.allColored(prefix: String, factory: (color: DyeColor?, name: String) -> T): Map<DyeColor?, T> {
return LazyMap(doColored(prefix, factory).also { (it as MutableCollection<Pair<DyeColor?, () -> T>>).add((null as DyeColor?) to register(prefix) { factory.invoke(null, prefix) }::get) })
}

View File

@ -1,10 +1,13 @@
package ru.dbotthepony.mc.otm.registry
import net.minecraft.client.model.geom.ModelLayers
import net.minecraft.client.renderer.entity.EntityRenderer
import net.minecraft.client.renderer.entity.EntityRenderers
import net.minecraft.client.renderer.entity.MinecartRenderer
import net.minecraft.world.entity.Entity
import net.minecraft.world.entity.EntityType
import net.minecraft.world.entity.MobCategory
import net.minecraft.world.item.DyeColor
import net.minecraftforge.eventbus.api.IEventBus
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext
@ -12,6 +15,7 @@ import net.minecraftforge.registries.DeferredRegister
import net.minecraftforge.registries.ForgeRegistries
import ru.dbotthepony.mc.otm.OverdriveThatMatters
import ru.dbotthepony.mc.otm.client.render.entity.PlasmaProjectileRenderer
import ru.dbotthepony.mc.otm.entity.MinecartCargoCrate
import ru.dbotthepony.mc.otm.entity.PlasmaProjectile
object MEntityTypes {
@ -21,6 +25,10 @@ object MEntityTypes {
EntityType.Builder.of<PlasmaProjectile>({ _, level -> PlasmaProjectile(level) }, MobCategory.MISC).sized(0.4f, 0.4f).build(MNames.PLASMA)
}
val CARGO_CRATE_MINECARTS = registry.allColored(MNames.MINECART_CARGO_CRATE) { color, name ->
EntityType.Builder.of<MinecartCargoCrate>({ it, level -> MinecartCargoCrate(it, color, level)}, MobCategory.MISC).sized(0.98F, 0.7F).clientTrackingRange(8).build(name)
}
internal fun register(bus: IEventBus) {
registry.register(bus)
bus.addListener(this::registerClient)
@ -30,6 +38,10 @@ object MEntityTypes {
private fun registerClient(event: FMLClientSetupEvent) {
event.enqueueWork {
EntityRenderers.register(PLASMA) { PlasmaProjectileRenderer(it) as EntityRenderer<Entity> }
for (type in CARGO_CRATE_MINECARTS.values) {
EntityRenderers.register(type) { MinecartRenderer<MinecartCargoCrate>(it, ModelLayers.CHEST_MINECART) as EntityRenderer<Entity> }
}
}
}
}

View File

@ -277,6 +277,8 @@ object MItems {
{ MIRROR },
)
val CARGO_CRATE_MINECARTS = registry.allColored(MNames.MINECART_CARGO_CRATE) { color, _ -> MinecartCargoCrateItem(color) }
val EXOSUIT_PROBE: Item by registry.register(MNames.EXOSUIT_PROBE, ::ExoSuitProbeItem)
val EXOSUIT_INVENTORY_UPGRADE_CREATIVE: Item by registry.register("exosuit_inventory_upgrade_creative") { ExoSuitSlotUpgradeItem(null, 9, Item.Properties().stacksTo(8).rarity(Rarity.EPIC).tab(OverdriveThatMatters.INSTANCE.CREATIVE_TAB)) }
val EXOSUIT_CRAFTING_UPGRADE: Item by registry.register("exosuit_crafting_upgrade", ::ExoSuitCraftingUpgradeItem)

View File

@ -25,6 +25,7 @@ object MMenus {
val MATTER_BOTTLER: MenuType<*> by registry.register(MNames.MATTER_BOTTLER) { MenuType(::MatterBottlerMenu) }
val DRIVE_VIEWER: MenuType<*> by registry.register(MNames.DRIVE_VIEWER) { MenuType(::DriveViewerMenu) }
val CARGO_CRATE: MenuType<*> by registry.register(MNames.CARGO_CRATE) { MenuType(::CargoCrateMenu) }
val MINECART_CARGO_CRATE: MenuType<*> by registry.register(MNames.MINECART_CARGO_CRATE) { MenuType(::MinecartCargoCrateMenu) }
val DRIVE_RACK: MenuType<*> by registry.register(MNames.DRIVE_RACK) { MenuType(::DriveRackMenu) }
val ITEM_MONITOR: MenuType<*> by registry.register(MNames.ITEM_MONITOR) { MenuType(::ItemMonitorMenu) }
val ENERGY_COUNTER: MenuType<*> by registry.register(MNames.ENERGY_COUNTER) { MenuType(::EnergyCounterMenu) }
@ -57,6 +58,7 @@ object MMenus {
MenuScreens.register(MATTER_BOTTLER as MenuType<MatterBottlerMenu>, ::MatterBottlerScreen)
MenuScreens.register(DRIVE_VIEWER as MenuType<DriveViewerMenu>, ::DriveViewerScreen)
MenuScreens.register(CARGO_CRATE as MenuType<CargoCrateMenu>, ::CargoCrateScreen)
MenuScreens.register(MINECART_CARGO_CRATE as MenuType<MinecartCargoCrateMenu>, ::MinecartCargoCrateScreen)
MenuScreens.register(DRIVE_RACK as MenuType<DriveRackMenu>, ::DriveRackScreen)
MenuScreens.register(ITEM_MONITOR as MenuType<ItemMonitorMenu>, ::ItemMonitorScreen)
MenuScreens.register(ENERGY_COUNTER as MenuType<EnergyCounterMenu>, ::EnergyCounterScreen)

View File

@ -41,6 +41,7 @@ object MNames {
const val GRAVITATION_STABILIZER_LENS = "gravitation_stabilizer_lens"
const val CARGO_CRATE = "cargo_crate"
const val MINECART_CARGO_CRATE = "minecart_cargo_crate"
const val DECORATIVE_CRATE = "decorative_crate"
const val STORAGE_BUS = "storage_bus"

View File

@ -12,7 +12,8 @@ object MItemTags {
val TRITANIUM_PLATES: TagKey<Item> = ItemTags.create(ResourceLocation("forge", "plates/tritanium"))
val IRON_PLATES: TagKey<Item> = ItemTags.create(ResourceLocation("forge", "plates/iron"))
val GOLD_PLATES: TagKey<Item> = ItemTags.create(ResourceLocation("forge", "plates/gold"))
val TRITANIUM_CRATES: TagKey<Item> = ItemTags.create(ResourceLocation(OverdriveThatMatters.MOD_ID, "tritanium_crates"))
val CARGO_CRATES: TagKey<Item> = ItemTags.create(ResourceLocation(OverdriveThatMatters.MOD_ID, "cargo_crates"))
val MINECART_CARGO_CRATES: TagKey<Item> = ItemTags.create(ResourceLocation(OverdriveThatMatters.MOD_ID, "minecart_cargo_crates"))
val INDUSTRIAL_GLASS: TagKey<Item> = ItemTags.create(ResourceLocation(OverdriveThatMatters.MOD_ID, "industrial_glass"))
val BASIC_CIRCUIT: TagKey<Item> = ItemTags.create(ResourceLocation("forge", "circuits/basic"))