Compare commits
5
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c77963dec0 | ||
|
|
515986e7bd | ||
|
|
245f569c8a | ||
|
|
b7d8d85b1c | ||
|
|
66ffb21bbd |
No files matched your search
@@ -34,7 +34,10 @@ object CobblemonBlockEntities : PlatformRegistry<Registry<BlockEntityType<*>>, R
|
||||
val HEALING_MACHINE: BlockEntityType<HealingMachineBlockEntity> = this.create("healing_machine", BlockEntityType.Builder.of(::HealingMachineBlockEntity, CobblemonBlocks.HEALING_MACHINE).build(null))
|
||||
|
||||
@JvmField
|
||||
val PC: BlockEntityType<PCBlockEntity> = this.create("pc", BlockEntityType.Builder.of(::PCBlockEntity, CobblemonBlocks.PC).build(null))
|
||||
val PC: BlockEntityType<PCBlockEntity> = this.create(
|
||||
"pc",
|
||||
BlockEntityType.Builder.of(::PCBlockEntity, CobblemonBlocks.PC, *CobblemonModificationBlocks.pcVariantBlocks().toTypedArray()).build(null)
|
||||
)
|
||||
|
||||
@JvmField
|
||||
val LECTERN: BlockEntityType<LecternBlockEntity> = this.create("lectern", BlockEntityType.Builder.of(::LecternBlockEntity, CobblemonBlocks.LECTERN).build(null))
|
||||
@@ -89,7 +92,11 @@ object CobblemonBlockEntities : PlatformRegistry<Registry<BlockEntityType<*>>, R
|
||||
|
||||
@JvmField
|
||||
val DISPLAY_CASE: BlockEntityType<DisplayCaseBlockEntity> = this.create("display_case",
|
||||
BlockEntityType.Builder.of(::DisplayCaseBlockEntity, CobblemonBlocks.DISPLAY_CASE).build(null)
|
||||
BlockEntityType.Builder.of(
|
||||
::DisplayCaseBlockEntity,
|
||||
CobblemonBlocks.DISPLAY_CASE,
|
||||
*CobblemonModificationBlocks.displayCaseVariantBlocks().toTypedArray()
|
||||
).build(null)
|
||||
)
|
||||
|
||||
// TODO after 1.7
|
||||
|
||||
@@ -678,6 +678,18 @@ object CobblemonBlocks : PlatformRegistry<Registry<Block>, ResourceKey<Registry<
|
||||
)
|
||||
)
|
||||
|
||||
@JvmField
|
||||
val MODIFICATION_STATION = create(
|
||||
"modification_station",
|
||||
ModificationStationBlock(
|
||||
BlockBehaviour.Properties.of()
|
||||
.mapColor(MapColor.STONE)
|
||||
.sound(SoundType.STONE)
|
||||
.strength(3.5F)
|
||||
.requiresCorrectToolForDrops()
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
@JvmField
|
||||
val LECTERN = create("lectern", LecternBlock(BlockBehaviour.Properties.of().mapColor(MapColor.WOOD).instrument(NoteBlockInstrument.BASS).sound(SoundType.WOOD).strength(2.5F).ignitedByLava().lightLevel { if (it.getValue(LecternBlock.EMIT_LIGHT) as Boolean) 13 else 0 }))
|
||||
|
||||
@@ -99,6 +99,12 @@ object CobblemonItemComponents : PlatformRegistry<Registry<DataComponentType<*>>
|
||||
.networkSynchronized(ByteBufCodecs.BOOL)
|
||||
.build())
|
||||
|
||||
@JvmField
|
||||
val MODIFICATION_VARIANT: DataComponentType<ModificationVariantComponent> = create("modification_variant", DataComponentType.builder<ModificationVariantComponent>()
|
||||
.persistent(ModificationVariantComponent.CODEC)
|
||||
.networkSynchronized(ModificationVariantComponent.PACKET_CODEC)
|
||||
.build())
|
||||
|
||||
fun register() {
|
||||
Registry.register(BuiltInRegistries.DATA_COMPONENT_TYPE, ResourceLocation.parse("cobblemon:pokemon_item"), POKEMON_ITEM)
|
||||
Registry.register(BuiltInRegistries.DATA_COMPONENT_TYPE, ResourceLocation.parse("cobblemon:bait"), BAIT)
|
||||
@@ -112,6 +118,7 @@ object CobblemonItemComponents : PlatformRegistry<Registry<DataComponentType<*>>
|
||||
Registry.register(BuiltInRegistries.DATA_COMPONENT_TYPE, ResourceLocation.parse("cobblemon:food"), FOOD)
|
||||
Registry.register(BuiltInRegistries.DATA_COMPONENT_TYPE, ResourceLocation.parse("cobblemon:mob_effects"), MOB_EFFECTS)
|
||||
Registry.register(BuiltInRegistries.DATA_COMPONENT_TYPE, ResourceLocation.parse("cobblemon:held_item_effect"), HELD_ITEM_EFFECT)
|
||||
Registry.register(BuiltInRegistries.DATA_COMPONENT_TYPE, ResourceLocation.parse("cobblemon:modification_variant"), MODIFICATION_VARIANT)
|
||||
}
|
||||
|
||||
override val registry = BuiltInRegistries.DATA_COMPONENT_TYPE
|
||||
|
||||
@@ -459,6 +459,8 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
|
||||
@JvmField
|
||||
val TM_MACHINE = blockItem("tm_machine", CobblemonBlocks.TM_MACHINE)
|
||||
@JvmField
|
||||
val MODIFICATION_STATION = blockItem("modification_station", CobblemonBlocks.MODIFICATION_STATION)
|
||||
@JvmField
|
||||
val TM_SHELF = blockItem("tm_shelf", CobblemonBlocks.TM_SHELF)
|
||||
@JvmField
|
||||
val PASTURE = blockItem("pasture", CobblemonBlocks.PASTURE)
|
||||
|
||||
@@ -10,6 +10,7 @@ package com.cobblemon.mod.common
|
||||
|
||||
|
||||
import com.cobblemon.mod.common.block.campfirepot.CookingPotMenu
|
||||
import com.cobblemon.mod.common.block.modificationstation.ModificationStationMenu
|
||||
import com.cobblemon.mod.common.block.tmmachine.TMMachineMenu
|
||||
import com.cobblemon.mod.common.platform.PlatformRegistry
|
||||
import net.minecraft.core.Registry
|
||||
@@ -22,6 +23,7 @@ object CobblemonMenuType : PlatformRegistry<Registry<MenuType<*>>, ResourceKey<R
|
||||
|
||||
val COOKING_POT = MenuType.register("cooking_pot_menu", ::CookingPotMenu)
|
||||
val TM_MACHINE = MenuType.register("tm_machine_menu", ::TMMachineMenu)
|
||||
val MODIFICATION_STATION = MenuType.register("modification_station_menu", ::ModificationStationMenu)
|
||||
|
||||
override val registry: Registry<MenuType<*>>
|
||||
get() = BuiltInRegistries.MENU
|
||||
|
||||
@@ -0,0 +1,77 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common
|
||||
|
||||
import com.cobblemon.mod.common.modification_station.DisplayCaseVariantBlocks
|
||||
import com.cobblemon.mod.common.modification_station.DomeFossilVariantBlocks
|
||||
import com.cobblemon.mod.common.modification_station.ModificationVariantBlockRegistrar
|
||||
import com.cobblemon.mod.common.modification_station.PCVariantBlocks
|
||||
import com.cobblemon.mod.common.platform.PlatformRegistry
|
||||
import net.minecraft.core.Registry
|
||||
import net.minecraft.core.registries.BuiltInRegistries
|
||||
import net.minecraft.core.registries.Registries
|
||||
import net.minecraft.resources.ResourceKey
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.world.level.block.Block
|
||||
|
||||
@Suppress("MemberVisibilityCanBePrivate")
|
||||
object CobblemonModificationBlocks : PlatformRegistry<Registry<Block>, ResourceKey<Registry<Block>>, Block>() {
|
||||
override val registry: Registry<Block> = BuiltInRegistries.BLOCK
|
||||
override val resourceKey: ResourceKey<Registry<Block>> = Registries.BLOCK
|
||||
|
||||
private val variantRegistrars: List<ModificationVariantBlockRegistrar> = listOf(
|
||||
DisplayCaseVariantBlocks,
|
||||
DomeFossilVariantBlocks,
|
||||
PCVariantBlocks
|
||||
)
|
||||
|
||||
override fun register(consumer: (ResourceLocation, Block) -> Unit) {
|
||||
variantRegistrars.forEach { registrar -> registrar.registerAll(consumer) }
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun allVariantEntries(): Map<ResourceLocation, Block> = linkedMapOf<ResourceLocation, Block>().also { result ->
|
||||
variantRegistrars.forEach { registrar -> result.putAll(registrar.allEntries()) }
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun variantIdentifier(block: Block): ResourceLocation? {
|
||||
variantRegistrars.forEach { registrar ->
|
||||
val identifier = registrar.variantIdentifier(block)
|
||||
if (identifier != null) {
|
||||
return identifier
|
||||
}
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun isVariant(block: Block): Boolean = variantIdentifier(block) != null
|
||||
|
||||
@JvmStatic
|
||||
fun displayCaseVariantBlocks(): Collection<Block> = DisplayCaseVariantBlocks.allBlocks()
|
||||
|
||||
@JvmStatic
|
||||
fun displayCaseTintedVariantBlocks(): Collection<Block> = DisplayCaseVariantBlocks.tintedVariantBlocks()
|
||||
|
||||
@JvmStatic
|
||||
fun displayCaseNonTintedVariantBlocks(): Collection<Block> = DisplayCaseVariantBlocks.nonTintedVariantBlocks()
|
||||
|
||||
@JvmStatic
|
||||
fun displayCaseVariantEntries(): Map<ResourceLocation, Block> = DisplayCaseVariantBlocks.allEntries()
|
||||
|
||||
@JvmStatic
|
||||
fun displayCaseVariantIdentifier(block: Block): ResourceLocation? = DisplayCaseVariantBlocks.variantIdentifier(block)
|
||||
|
||||
@JvmStatic
|
||||
fun domeFossilVariantBlocks(): Collection<Block> = DomeFossilVariantBlocks.allBlocks()
|
||||
|
||||
@JvmStatic
|
||||
fun pcVariantBlocks(): Collection<Block> = PCVariantBlocks.allBlocks()
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common
|
||||
|
||||
import com.cobblemon.mod.common.platform.PlatformRegistry
|
||||
import net.minecraft.core.Registry
|
||||
import net.minecraft.core.registries.BuiltInRegistries
|
||||
import net.minecraft.core.registries.Registries
|
||||
import net.minecraft.resources.ResourceKey
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.world.item.BlockItem
|
||||
import net.minecraft.world.item.Item
|
||||
|
||||
@Suppress("MemberVisibilityCanBePrivate")
|
||||
object CobblemonModificationItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<Item>>, Item>() {
|
||||
override val registry: Registry<Item> = BuiltInRegistries.ITEM
|
||||
override val resourceKey: ResourceKey<Registry<Item>> = Registries.ITEM
|
||||
|
||||
private val variantItemsById = linkedMapOf<ResourceLocation, BlockItem>()
|
||||
|
||||
init {
|
||||
CobblemonModificationBlocks.allVariantEntries().forEach { (identifier, block) ->
|
||||
variantItemsById[identifier] = create(identifier, BlockItem(block, Item.Properties()))
|
||||
}
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun allVariantItems(): Collection<Item> = variantItemsById.values
|
||||
|
||||
@JvmStatic
|
||||
fun displayCaseVariantItems(): Collection<Item> = variantItemsById.values
|
||||
}
|
||||
@@ -416,6 +416,7 @@ object CobblemonNetwork {
|
||||
list.add(PacketRegisterInfo(DexEntrySyncPacket.ID, DexEntrySyncPacket::decode, DataRegistrySyncPacketHandler()))
|
||||
list.add(PacketRegisterInfo(SpawnBaitRegistrySyncPacket.ID, SpawnBaitRegistrySyncPacket::decode, DataRegistrySyncPacketHandler()))
|
||||
list.add(PacketRegisterInfo(SeasoningRegistrySyncPacket.ID, SeasoningRegistrySyncPacket::decode, DataRegistrySyncPacketHandler()))
|
||||
list.add(PacketRegisterInfo(ModificationVariantRegistrySyncPacket.ID, ModificationVariantRegistrySyncPacket::decode, DataRegistrySyncPacketHandler()))
|
||||
list.add(PacketRegisterInfo(CallbackRegistrySyncPacket.ID, CallbackRegistrySyncPacket::decode, DataRegistrySyncPacketHandler()))
|
||||
list.add(PacketRegisterInfo(CosmeticItemAssignmentSyncPacket.ID, CosmeticItemAssignmentSyncPacket::decode, DataRegistrySyncPacketHandler()))
|
||||
list.add(PacketRegisterInfo(BehaviourSyncPacket.ID, BehaviourSyncPacket::decode, DataRegistrySyncPacketHandler()))
|
||||
@@ -626,4 +627,4 @@ object CobblemonNetwork {
|
||||
fun sendPacketToPlayer(player: ServerPlayer, packet: NetworkPacket<*>) {
|
||||
Cobblemon.implementation.networkManager.sendPacketToPlayer(player, packet)
|
||||
}
|
||||
}
|
||||
}
|
||||
+80
@@ -0,0 +1,80 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.api.modification
|
||||
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.world.phys.shapes.Shapes
|
||||
import net.minecraft.world.phys.shapes.VoxelShape
|
||||
|
||||
data class ModificationVariant(
|
||||
@Transient
|
||||
var identifier: ResourceLocation = ResourceLocation.withDefaultNamespace("missing"),
|
||||
val parent: ResourceLocation,
|
||||
val model: String,
|
||||
val id: Int = 0,
|
||||
val shape: List<List<Double>>? = emptyList(),
|
||||
val size: ModificationVariantSize? = null
|
||||
) {
|
||||
fun resolvedModelIdentifier(): ResourceLocation {
|
||||
return ResourceLocation.tryParse(model) ?: ResourceLocation.fromNamespaceAndPath(parent.namespace, model)
|
||||
}
|
||||
|
||||
fun resolvedBlockModelIdentifier(): ResourceLocation {
|
||||
val resolved = resolvedModelIdentifier()
|
||||
return if (resolved.path.startsWith("block/")) {
|
||||
resolved
|
||||
} else {
|
||||
ResourceLocation.fromNamespaceAndPath(resolved.namespace, "block/${resolved.path}")
|
||||
}
|
||||
}
|
||||
|
||||
fun createShape(): VoxelShape? {
|
||||
if (!shape.isNullOrEmpty()) {
|
||||
var combined = Shapes.empty()
|
||||
for (entry in shape) {
|
||||
if (entry.size != 6) {
|
||||
continue
|
||||
}
|
||||
|
||||
combined = Shapes.or(
|
||||
combined,
|
||||
Shapes.box(
|
||||
entry[0] / 16.0,
|
||||
entry[1] / 16.0,
|
||||
entry[2] / 16.0,
|
||||
entry[3] / 16.0,
|
||||
entry[4] / 16.0,
|
||||
entry[5] / 16.0
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
return if (combined.isEmpty) null else combined
|
||||
}
|
||||
|
||||
val sized = size ?: return null
|
||||
return Shapes.box(
|
||||
sized.offsetX / 16.0,
|
||||
sized.offsetY / 16.0,
|
||||
sized.offsetZ / 16.0,
|
||||
(sized.offsetX + sized.width) / 16.0,
|
||||
(sized.offsetY + sized.height) / 16.0,
|
||||
(sized.offsetZ + sized.depth) / 16.0
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
data class ModificationVariantSize(
|
||||
val width: Double = 16.0,
|
||||
val height: Double = 16.0,
|
||||
val depth: Double = 16.0,
|
||||
val offsetX: Double = 0.0,
|
||||
val offsetY: Double = 0.0,
|
||||
val offsetZ: Double = 0.0
|
||||
)
|
||||
+93
@@ -0,0 +1,93 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.api.modification
|
||||
|
||||
import com.cobblemon.mod.common.Cobblemon
|
||||
import com.cobblemon.mod.common.api.data.JsonDataRegistry
|
||||
import com.cobblemon.mod.common.api.reactive.SimpleObservable
|
||||
import com.cobblemon.mod.common.net.messages.client.data.ModificationVariantRegistrySyncPacket
|
||||
import com.cobblemon.mod.common.util.adapters.IdentifierAdapter
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import com.google.gson.Gson
|
||||
import com.google.gson.GsonBuilder
|
||||
import com.google.gson.reflect.TypeToken
|
||||
import net.minecraft.core.registries.BuiltInRegistries
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.server.level.ServerPlayer
|
||||
import net.minecraft.server.packs.PackType
|
||||
|
||||
object ModificationVariants : JsonDataRegistry<ModificationVariant> {
|
||||
override val id: ResourceLocation = cobblemonResource("modification_variants")
|
||||
override val type: PackType = PackType.SERVER_DATA
|
||||
override val observable = SimpleObservable<ModificationVariants>()
|
||||
override val typeToken: TypeToken<ModificationVariant> = TypeToken.get(ModificationVariant::class.java)
|
||||
override val resourcePath = "modification_variants"
|
||||
override val gson: Gson = GsonBuilder()
|
||||
.registerTypeAdapter(ResourceLocation::class.java, IdentifierAdapter)
|
||||
.setPrettyPrinting()
|
||||
.disableHtmlEscaping()
|
||||
.create()
|
||||
|
||||
private val variantsByIdentifier = linkedMapOf<ResourceLocation, ModificationVariant>()
|
||||
private val variantsByParent = hashMapOf<ResourceLocation, List<ModificationVariant>>()
|
||||
|
||||
override fun reload(data: Map<ResourceLocation, ModificationVariant>) {
|
||||
val variants = data.mapNotNull { (identifier, variant) ->
|
||||
val parentExistsAsBlock = BuiltInRegistries.BLOCK.containsKey(variant.parent)
|
||||
val parentExistsAsItem = BuiltInRegistries.ITEM.containsKey(variant.parent)
|
||||
if (!parentExistsAsBlock && !parentExistsAsItem) {
|
||||
Cobblemon.LOGGER.warn(
|
||||
"Skipping modification variant {} because parent id {} does not exist as a block or item",
|
||||
identifier,
|
||||
variant.parent
|
||||
)
|
||||
return@mapNotNull null
|
||||
}
|
||||
if (!BuiltInRegistries.BLOCK.containsKey(identifier)) {
|
||||
Cobblemon.LOGGER.warn("Skipping modification variant {} because variant block {} does not exist", identifier, identifier)
|
||||
return@mapNotNull null
|
||||
}
|
||||
|
||||
variant.identifier = identifier
|
||||
variant
|
||||
}
|
||||
|
||||
reloadEntries(variants)
|
||||
}
|
||||
|
||||
fun reloadEntries(entries: Collection<ModificationVariant>) {
|
||||
val sorted = entries
|
||||
.sortedWith(compareBy<ModificationVariant> { it.id }.thenBy { it.identifier.toString() })
|
||||
|
||||
variantsByIdentifier.clear()
|
||||
variantsByParent.clear()
|
||||
|
||||
sorted.forEach { variant ->
|
||||
variantsByIdentifier[variant.identifier] = variant
|
||||
}
|
||||
|
||||
variantsByParent.putAll(sorted.groupBy { it.parent })
|
||||
|
||||
Cobblemon.LOGGER.info("Loaded {} modification variants", variantsByIdentifier.size)
|
||||
observable.emit(this)
|
||||
}
|
||||
|
||||
override fun sync(player: ServerPlayer) {
|
||||
ModificationVariantRegistrySyncPacket(all()).sendToPlayer(player)
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun all(): List<ModificationVariant> = variantsByIdentifier.values.toList()
|
||||
|
||||
@JvmStatic
|
||||
fun forParent(parent: ResourceLocation): List<ModificationVariant> = variantsByParent[parent] ?: emptyList()
|
||||
|
||||
@JvmStatic
|
||||
fun getByIdentifier(identifier: ResourceLocation): ModificationVariant? = variantsByIdentifier[identifier]
|
||||
}
|
||||
@@ -8,20 +8,29 @@
|
||||
|
||||
package com.cobblemon.mod.common.block
|
||||
|
||||
import com.cobblemon.mod.common.CobblemonBlocks
|
||||
import com.cobblemon.mod.common.CobblemonItemComponents
|
||||
import com.cobblemon.mod.common.CobblemonModificationBlocks
|
||||
import com.cobblemon.mod.common.api.modification.ModificationVariants
|
||||
import com.cobblemon.mod.common.block.entity.DisplayCaseBlockEntity
|
||||
import com.cobblemon.mod.common.item.PokeBallItem
|
||||
import com.cobblemon.mod.common.item.components.ModificationVariantComponent
|
||||
import com.cobblemon.mod.common.util.rotateShape
|
||||
import com.mojang.serialization.MapCodec
|
||||
import net.minecraft.core.BlockPos
|
||||
import net.minecraft.core.Direction
|
||||
import net.minecraft.world.Containers
|
||||
import net.minecraft.world.InteractionHand
|
||||
import net.minecraft.world.InteractionResult
|
||||
import net.minecraft.world.entity.LivingEntity
|
||||
import net.minecraft.world.entity.player.Player
|
||||
import net.minecraft.world.item.BlockItem
|
||||
import net.minecraft.world.item.ItemStack
|
||||
import net.minecraft.world.item.context.BlockPlaceContext
|
||||
import net.minecraft.world.level.BlockGetter
|
||||
import net.minecraft.world.level.Level
|
||||
import net.minecraft.world.level.LevelAccessor
|
||||
import net.minecraft.world.level.LevelReader
|
||||
import net.minecraft.world.level.block.BaseEntityBlock
|
||||
import net.minecraft.world.level.block.Block
|
||||
import net.minecraft.world.level.block.Blocks
|
||||
@@ -32,6 +41,11 @@ import net.minecraft.world.level.block.state.StateDefinition
|
||||
import net.minecraft.world.level.block.state.properties.DirectionProperty
|
||||
import net.minecraft.world.level.pathfinder.PathComputationType
|
||||
import net.minecraft.world.phys.BlockHitResult
|
||||
import net.minecraft.world.phys.shapes.CollisionContext
|
||||
import net.minecraft.world.phys.shapes.Shapes
|
||||
import net.minecraft.world.phys.shapes.VoxelShape
|
||||
import net.minecraft.world.level.storage.loot.LootParams
|
||||
import net.minecraft.world.level.storage.loot.parameters.LootContextParams
|
||||
|
||||
@Suppress("OVERRIDE_DEPRECATION")
|
||||
class DisplayCaseBlock(settings: Properties) : BaseEntityBlock(settings) {
|
||||
@@ -80,6 +94,12 @@ class DisplayCaseBlock(settings: Properties) : BaseEntityBlock(settings) {
|
||||
else super.updateShape(state, direction, neighborState, world, pos, neighborPos)
|
||||
}
|
||||
|
||||
override fun setPlacedBy(world: Level, pos: BlockPos, state: BlockState, placer: LivingEntity?, stack: ItemStack) {
|
||||
super.setPlacedBy(world, pos, state, placer, stack)
|
||||
val entity = world.getBlockEntity(pos) as? DisplayCaseBlockEntity ?: return
|
||||
entity.applyVariantFromStack(stack)
|
||||
}
|
||||
|
||||
override fun useWithoutItem(
|
||||
state: BlockState,
|
||||
world: Level,
|
||||
@@ -95,6 +115,28 @@ class DisplayCaseBlock(settings: Properties) : BaseEntityBlock(settings) {
|
||||
return result
|
||||
}
|
||||
|
||||
override fun getCloneItemStack(level: LevelReader, pos: BlockPos, state: BlockState): ItemStack {
|
||||
val stack = super.getCloneItemStack(level, pos, state)
|
||||
if (state.block != CobblemonBlocks.DISPLAY_CASE) {
|
||||
return stack
|
||||
}
|
||||
|
||||
val variantId = (level.getBlockEntity(pos) as? DisplayCaseBlockEntity)?.variantIdentifier ?: return stack
|
||||
stack.set(CobblemonItemComponents.MODIFICATION_VARIANT, ModificationVariantComponent(variantId))
|
||||
return stack
|
||||
}
|
||||
|
||||
override fun getDrops(state: BlockState, params: LootParams.Builder): List<ItemStack> {
|
||||
val drop = ItemStack(this)
|
||||
if (state.block == CobblemonBlocks.DISPLAY_CASE) {
|
||||
val variantId = (params.getOptionalParameter(LootContextParams.BLOCK_ENTITY) as? DisplayCaseBlockEntity)?.variantIdentifier
|
||||
if (variantId != null) {
|
||||
drop.set(CobblemonItemComponents.MODIFICATION_VARIANT, ModificationVariantComponent(variantId))
|
||||
}
|
||||
}
|
||||
return listOf(drop)
|
||||
}
|
||||
|
||||
override fun onRemove(
|
||||
state: BlockState,
|
||||
world: Level,
|
||||
@@ -124,6 +166,24 @@ class DisplayCaseBlock(settings: Properties) : BaseEntityBlock(settings) {
|
||||
|
||||
override fun hasAnalogOutputSignal(state: BlockState): Boolean = true
|
||||
|
||||
override fun getShape(state: BlockState, level: BlockGetter, pos: BlockPos, context: CollisionContext): VoxelShape {
|
||||
return getVariantShape(state, level, pos) ?: BASE_SHAPE
|
||||
}
|
||||
|
||||
override fun getCollisionShape(state: BlockState, level: BlockGetter, pos: BlockPos, context: CollisionContext): VoxelShape {
|
||||
return getShape(state, level, pos, context)
|
||||
}
|
||||
|
||||
private fun getVariantShape(state: BlockState, level: BlockGetter, pos: BlockPos): VoxelShape? {
|
||||
val blockEntity = level.getBlockEntity(pos) as? DisplayCaseBlockEntity ?: return null
|
||||
val variantIdentifier = blockEntity.variantIdentifier
|
||||
?: CobblemonModificationBlocks.displayCaseVariantIdentifier(state.block)
|
||||
?: return null
|
||||
val variant = ModificationVariants.getByIdentifier(variantIdentifier) ?: return null
|
||||
val shape = variant.createShape() ?: return null
|
||||
return rotateShape(Direction.NORTH, state.getValue(FACING), shape)
|
||||
}
|
||||
|
||||
override fun codec(): MapCodec<out BaseEntityBlock> {
|
||||
return CODEC
|
||||
}
|
||||
@@ -133,6 +193,7 @@ class DisplayCaseBlock(settings: Properties) : BaseEntityBlock(settings) {
|
||||
companion object {
|
||||
val CODEC = simpleCodec(::DisplayCaseBlock)
|
||||
val ITEM_DIRECTION = DirectionProperty.create("item_facing")
|
||||
val BASE_SHAPE: VoxelShape = Shapes.block()
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,113 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.block
|
||||
|
||||
import com.cobblemon.mod.common.block.modificationstation.ModificationStationMenu
|
||||
import com.cobblemon.mod.common.util.rotateShape
|
||||
import com.mojang.serialization.MapCodec
|
||||
import net.minecraft.core.BlockPos
|
||||
import net.minecraft.core.Direction
|
||||
import net.minecraft.network.chat.Component
|
||||
import net.minecraft.stats.Stats
|
||||
import net.minecraft.world.InteractionResult
|
||||
import net.minecraft.world.MenuProvider
|
||||
import net.minecraft.world.SimpleMenuProvider
|
||||
import net.minecraft.world.entity.player.Player
|
||||
import net.minecraft.world.inventory.ContainerLevelAccess
|
||||
import net.minecraft.world.item.context.BlockPlaceContext
|
||||
import net.minecraft.world.level.BlockGetter
|
||||
import net.minecraft.world.level.Level
|
||||
import net.minecraft.world.level.block.Block
|
||||
import net.minecraft.world.level.block.HorizontalDirectionalBlock
|
||||
import net.minecraft.world.level.block.Mirror
|
||||
import net.minecraft.world.level.block.RenderShape
|
||||
import net.minecraft.world.level.block.Rotation
|
||||
import net.minecraft.world.level.block.state.BlockState
|
||||
import net.minecraft.world.level.block.state.StateDefinition
|
||||
import net.minecraft.world.level.block.state.properties.DirectionProperty
|
||||
import net.minecraft.world.level.pathfinder.PathComputationType
|
||||
import net.minecraft.world.phys.BlockHitResult
|
||||
import net.minecraft.world.phys.shapes.CollisionContext
|
||||
import net.minecraft.world.phys.shapes.Shapes
|
||||
import net.minecraft.world.phys.shapes.VoxelShape
|
||||
|
||||
class ModificationStationBlock(properties: Properties) : Block(properties) {
|
||||
override fun codec(): MapCodec<ModificationStationBlock> = CODEC
|
||||
|
||||
init {
|
||||
registerDefaultState(stateDefinition.any().setValue(FACING, Direction.NORTH))
|
||||
}
|
||||
|
||||
override fun getStateForPlacement(context: BlockPlaceContext): BlockState {
|
||||
return defaultBlockState().setValue(FACING, context.horizontalDirection.opposite)
|
||||
}
|
||||
|
||||
override fun useWithoutItem(state: BlockState, level: Level, pos: BlockPos, player: Player, hit: BlockHitResult): InteractionResult {
|
||||
if (level.isClientSide) {
|
||||
return InteractionResult.SUCCESS
|
||||
}
|
||||
|
||||
player.openMenu(state.getMenuProvider(level, pos))
|
||||
player.awardStat(Stats.INTERACT_WITH_STONECUTTER)
|
||||
return InteractionResult.CONSUME
|
||||
}
|
||||
|
||||
override fun getMenuProvider(state: BlockState, level: Level, pos: BlockPos): MenuProvider {
|
||||
return SimpleMenuProvider(
|
||||
{ syncId, inventory, _ -> ModificationStationMenu(syncId, inventory, ContainerLevelAccess.create(level, pos)) },
|
||||
CONTAINER_TITLE
|
||||
)
|
||||
}
|
||||
|
||||
override fun getShape(state: BlockState, level: BlockGetter, pos: BlockPos, context: CollisionContext): VoxelShape {
|
||||
return SHAPES_BY_FACING[state.getValue(FACING)] ?: SHAPE
|
||||
}
|
||||
|
||||
override fun getCollisionShape(state: BlockState, level: BlockGetter, pos: BlockPos, context: CollisionContext): VoxelShape {
|
||||
return getShape(state, level, pos, context)
|
||||
}
|
||||
|
||||
override fun useShapeForLightOcclusion(state: BlockState): Boolean = true
|
||||
override fun getRenderShape(state: BlockState): RenderShape = RenderShape.MODEL
|
||||
|
||||
override fun rotate(state: BlockState, rotation: Rotation): BlockState {
|
||||
return state.setValue(FACING, rotation.rotate(state.getValue(FACING)))
|
||||
}
|
||||
|
||||
override fun mirror(state: BlockState, mirror: Mirror): BlockState {
|
||||
return state.rotate(mirror.getRotation(state.getValue(FACING)))
|
||||
}
|
||||
|
||||
override fun createBlockStateDefinition(builder: StateDefinition.Builder<Block, BlockState>) {
|
||||
builder.add(FACING)
|
||||
}
|
||||
|
||||
override fun isPathfindable(state: BlockState, type: PathComputationType): Boolean = false
|
||||
|
||||
companion object {
|
||||
val CODEC: MapCodec<ModificationStationBlock> = simpleCodec(::ModificationStationBlock)
|
||||
val CONTAINER_TITLE: Component = Component.translatable("container.cobblemon.modification_station")
|
||||
val FACING: DirectionProperty = HorizontalDirectionalBlock.FACING
|
||||
val SHAPE: VoxelShape = Shapes.or(
|
||||
box(3.0, 0.0, 4.0, 13.0, 17.0, 13.0),
|
||||
box(0.0, 8.0, 4.0, 3.0, 13.0, 13.0),
|
||||
box(2.0, 10.5, 0.5, 16.0, 14.5, 13.5),
|
||||
box(3.0, 3.0, 4.0, 4.0, 8.0, 6.0),
|
||||
box(12.0, 3.0, 4.0, 13.0, 8.0, 6.0),
|
||||
box(11.5, 13.5, 0.5, 15.5, 14.5, 4.5),
|
||||
box(1.0, 13.0, 9.5, 2.0, 17.0, 12.5)
|
||||
)
|
||||
val SHAPES_BY_FACING: Map<Direction, VoxelShape> = mapOf(
|
||||
Direction.NORTH to SHAPE,
|
||||
Direction.EAST to rotateShape(Direction.NORTH, Direction.EAST, SHAPE),
|
||||
Direction.SOUTH to rotateShape(Direction.NORTH, Direction.SOUTH, SHAPE),
|
||||
Direction.WEST to rotateShape(Direction.NORTH, Direction.WEST, SHAPE)
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -50,7 +50,7 @@ import net.minecraft.world.phys.shapes.CollisionContext
|
||||
import net.minecraft.world.phys.shapes.Shapes
|
||||
import net.minecraft.world.phys.shapes.VoxelShape
|
||||
|
||||
class PCBlock(properties: Properties): BaseEntityBlock(properties), SimpleWaterloggedBlock {
|
||||
open class PCBlock(properties: Properties): BaseEntityBlock(properties), SimpleWaterloggedBlock {
|
||||
companion object {
|
||||
val CODEC = simpleCodec(::PCBlock)
|
||||
val PART = EnumProperty.create("part", PCPart::class.java)
|
||||
@@ -163,7 +163,7 @@ class PCBlock(properties: Properties): BaseEntityBlock(properties), SimpleWaterl
|
||||
}
|
||||
}
|
||||
|
||||
fun getPositionOfOtherPart(state: BlockState, pos: BlockPos): BlockPos {
|
||||
open fun getPositionOfOtherPart(state: BlockState, pos: BlockPos): BlockPos {
|
||||
return if (state.getValue(PART) == PCPart.BOTTOM) {
|
||||
pos.above()
|
||||
} else {
|
||||
@@ -171,7 +171,7 @@ class PCBlock(properties: Properties): BaseEntityBlock(properties), SimpleWaterl
|
||||
}
|
||||
}
|
||||
|
||||
fun getBasePosition(state: BlockState, pos: BlockPos): BlockPos {
|
||||
open fun getBasePosition(state: BlockState, pos: BlockPos): BlockPos {
|
||||
return if (isBase(state)) {
|
||||
pos
|
||||
} else {
|
||||
@@ -331,4 +331,4 @@ class PCBlock(properties: Properties): BaseEntityBlock(properties), SimpleWaterl
|
||||
|
||||
return state
|
||||
}
|
||||
}
|
||||
}
|
||||
+42
-1
@@ -9,6 +9,8 @@
|
||||
package com.cobblemon.mod.common.block.entity
|
||||
|
||||
import com.cobblemon.mod.common.CobblemonBlockEntities
|
||||
import com.cobblemon.mod.common.CobblemonItemComponents
|
||||
import com.cobblemon.mod.common.CobblemonModificationBlocks
|
||||
import com.cobblemon.mod.common.CobblemonSounds
|
||||
import com.cobblemon.mod.common.util.giveOrDropItemStack
|
||||
import net.minecraft.core.BlockPos
|
||||
@@ -31,11 +33,14 @@ import net.minecraft.world.level.Level
|
||||
import net.minecraft.world.level.block.Block
|
||||
import net.minecraft.world.level.block.entity.BlockEntity
|
||||
import net.minecraft.world.level.block.state.BlockState
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
|
||||
class DisplayCaseBlockEntity(pos: BlockPos, state: BlockState) : BlockEntity(CobblemonBlockEntities.DISPLAY_CASE, pos, state),
|
||||
WorldlyContainer {
|
||||
|
||||
val inv: NonNullList<ItemStack> = NonNullList.withSize(1, ItemStack.EMPTY)
|
||||
var variantIdentifier: ResourceLocation? = null
|
||||
private set
|
||||
|
||||
/**
|
||||
* Updates the [ItemStack] stored in this entity
|
||||
@@ -98,15 +103,41 @@ class DisplayCaseBlockEntity(pos: BlockPos, state: BlockState) : BlockEntity(Cob
|
||||
onItemUpdated(level, oldState, level.getBlockState(blockPos))
|
||||
}
|
||||
|
||||
fun applyVariantFromStack(stack: ItemStack) {
|
||||
val stackVariant = stack.get(CobblemonItemComponents.MODIFICATION_VARIANT)?.variant
|
||||
val blockVariant = CobblemonModificationBlocks.displayCaseVariantIdentifier(blockState.block)
|
||||
updateVariantIdentifier(stackVariant ?: blockVariant)
|
||||
}
|
||||
|
||||
fun updateVariantIdentifier(identifier: ResourceLocation?) {
|
||||
if (variantIdentifier == identifier) {
|
||||
return
|
||||
}
|
||||
|
||||
variantIdentifier = identifier
|
||||
val level = level
|
||||
if (level != null) {
|
||||
onVariantUpdated(level)
|
||||
} else {
|
||||
setChanged()
|
||||
}
|
||||
}
|
||||
|
||||
override fun saveAdditional(nbt: CompoundTag, registryLookup: HolderLookup.Provider) {
|
||||
super.saveAdditional(nbt, registryLookup)
|
||||
ContainerHelper.saveAllItems(nbt, inv, true, registryLookup)
|
||||
variantIdentifier?.let { nbt.putString(MODIFICATION_VARIANT_TAG, it.toString()) }
|
||||
}
|
||||
|
||||
override fun loadAdditional(nbt: CompoundTag, registryLookup: HolderLookup.Provider) {
|
||||
super.loadAdditional(nbt, registryLookup)
|
||||
inv.clear()
|
||||
ContainerHelper.loadAllItems(nbt, inv, registryLookup)
|
||||
variantIdentifier = if (nbt.contains(MODIFICATION_VARIANT_TAG)) {
|
||||
ResourceLocation.tryParse(nbt.getString(MODIFICATION_VARIANT_TAG))
|
||||
} else {
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
override fun getUpdatePacket(): Packet<ClientGamePacketListener>? {
|
||||
@@ -123,6 +154,12 @@ class DisplayCaseBlockEntity(pos: BlockPos, state: BlockState) : BlockEntity(Cob
|
||||
setChanged()
|
||||
}
|
||||
|
||||
private fun onVariantUpdated(world: Level) {
|
||||
val state = world.getBlockState(blockPos)
|
||||
world.sendBlockUpdated(blockPos, state, state, Block.UPDATE_CLIENTS)
|
||||
setChanged()
|
||||
}
|
||||
|
||||
override fun clearContent() {
|
||||
inv.clear()
|
||||
}
|
||||
@@ -176,4 +213,8 @@ class DisplayCaseBlockEntity(pos: BlockPos, state: BlockState) : BlockEntity(Cob
|
||||
|
||||
override fun canPlaceItemThroughFace(slot: Int, stack: ItemStack, dir: Direction?): Boolean = (getStack().isEmpty)
|
||||
override fun canTakeItemThroughFace(slot: Int, stack: ItemStack, direction: Direction): Boolean = (direction == Direction.DOWN)
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val MODIFICATION_VARIANT_TAG = "ModificationVariant"
|
||||
}
|
||||
}
|
||||
+267
@@ -0,0 +1,267 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.block.modificationstation
|
||||
|
||||
import com.cobblemon.mod.common.CobblemonBlocks
|
||||
import com.cobblemon.mod.common.CobblemonMenuType
|
||||
import com.cobblemon.mod.common.api.modification.ModificationVariant
|
||||
import com.cobblemon.mod.common.api.modification.ModificationVariants
|
||||
import net.minecraft.core.registries.BuiltInRegistries
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.sounds.SoundEvents
|
||||
import net.minecraft.sounds.SoundSource
|
||||
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 net.minecraft.world.inventory.AbstractContainerMenu
|
||||
import net.minecraft.world.inventory.ContainerLevelAccess
|
||||
import net.minecraft.world.inventory.DataSlot
|
||||
import net.minecraft.world.inventory.ResultContainer
|
||||
import net.minecraft.world.inventory.Slot
|
||||
import net.minecraft.world.item.BlockItem
|
||||
import net.minecraft.world.item.ItemStack
|
||||
import net.minecraft.world.item.Items
|
||||
import net.minecraft.world.level.Level
|
||||
|
||||
class ModificationStationMenu(
|
||||
containerId: Int,
|
||||
playerInventory: Inventory,
|
||||
private val access: ContainerLevelAccess
|
||||
) : AbstractContainerMenu(CobblemonMenuType.MODIFICATION_STATION, containerId) {
|
||||
|
||||
private val selectedVariantIndex = DataSlot.standalone()
|
||||
private val level: Level = playerInventory.player.level()
|
||||
private var variants: List<ModificationVariant> = emptyList()
|
||||
private var variantOutputs: List<ItemStack> = emptyList()
|
||||
private var input: ItemStack = ItemStack.EMPTY
|
||||
private var lastSoundTime: Long = 0L
|
||||
|
||||
val container: Container = object : SimpleContainer(1) {
|
||||
override fun setChanged() {
|
||||
super.setChanged()
|
||||
this@ModificationStationMenu.slotsChanged(this)
|
||||
slotUpdateListener.run()
|
||||
}
|
||||
}
|
||||
|
||||
private val resultContainer = ResultContainer()
|
||||
val inputSlot: Slot
|
||||
val resultSlot: Slot
|
||||
private var slotUpdateListener: Runnable = Runnable {}
|
||||
|
||||
init {
|
||||
inputSlot = addSlot(object : Slot(container, INPUT_SLOT, 20, 33) {
|
||||
override fun mayPlace(stack: ItemStack): Boolean = hasVariantsFor(stack)
|
||||
})
|
||||
|
||||
resultSlot = addSlot(object : Slot(resultContainer, RESULT_SLOT, 143, 33) {
|
||||
override fun mayPlace(stack: ItemStack): Boolean = false
|
||||
|
||||
override fun onTake(player: Player, stack: ItemStack) {
|
||||
stack.onCraftedBy(player.level(), player, stack.count)
|
||||
inputSlot.remove(1)
|
||||
|
||||
if (inputSlot.hasItem()) {
|
||||
setupResultSlot()
|
||||
} else {
|
||||
selectedVariantIndex.set(-1)
|
||||
this.set(ItemStack.EMPTY)
|
||||
}
|
||||
|
||||
access.execute { level, pos ->
|
||||
val gameTime = level.gameTime
|
||||
if (lastSoundTime != gameTime) {
|
||||
level.playSound(null, pos, SoundEvents.UI_STONECUTTER_TAKE_RESULT, SoundSource.BLOCKS, 1.0F, 1.0F)
|
||||
lastSoundTime = gameTime
|
||||
}
|
||||
}
|
||||
|
||||
super.onTake(player, stack)
|
||||
}
|
||||
})
|
||||
|
||||
for (row in 0 until 3) {
|
||||
for (col in 0 until 9) {
|
||||
addSlot(Slot(playerInventory, col + row * 9 + 9, 8 + col * 18, 84 + row * 18))
|
||||
}
|
||||
}
|
||||
|
||||
for (hotbar in 0 until 9) {
|
||||
addSlot(Slot(playerInventory, hotbar, 8 + hotbar * 18, 142))
|
||||
}
|
||||
|
||||
addDataSlot(selectedVariantIndex)
|
||||
}
|
||||
|
||||
constructor(containerId: Int, playerInventory: Inventory) : this(containerId, playerInventory, ContainerLevelAccess.NULL)
|
||||
|
||||
fun getSelectedVariantIndex(): Int = selectedVariantIndex.get()
|
||||
fun getVariants(): List<ModificationVariant> = variants
|
||||
fun getVariantOutputs(): List<ItemStack> = variantOutputs
|
||||
fun getNumVariants(): Int = variants.size
|
||||
|
||||
fun hasInputItem(): Boolean = inputSlot.hasItem() && variants.isNotEmpty()
|
||||
|
||||
override fun stillValid(player: Player): Boolean {
|
||||
return stillValid(access, player, CobblemonBlocks.MODIFICATION_STATION)
|
||||
}
|
||||
|
||||
override fun clickMenuButton(player: Player, id: Int): Boolean {
|
||||
if (isValidVariantIndex(id)) {
|
||||
selectedVariantIndex.set(id)
|
||||
setupResultSlot()
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
private fun isValidVariantIndex(index: Int): Boolean = index >= 0 && index < variants.size
|
||||
|
||||
override fun slotsChanged(container: Container) {
|
||||
val inputStack = inputSlot.item
|
||||
if (!inputStack.`is`(input.item)) {
|
||||
input = inputStack.copy()
|
||||
setupVariantList(inputStack)
|
||||
}
|
||||
}
|
||||
|
||||
private fun setupVariantList(inputStack: ItemStack) {
|
||||
variants = emptyList()
|
||||
variantOutputs = emptyList()
|
||||
selectedVariantIndex.set(-1)
|
||||
resultSlot.set(ItemStack.EMPTY)
|
||||
|
||||
if (!inputStack.isEmpty) {
|
||||
val parentId = getParentIdentifier(inputStack)
|
||||
if (parentId != null) {
|
||||
val resolvedVariants = ModificationVariants.forParent(parentId)
|
||||
.mapNotNull { variant ->
|
||||
val output = createVariantOutput(variant) ?: return@mapNotNull null
|
||||
variant to output
|
||||
}
|
||||
|
||||
variants = resolvedVariants.map { it.first }
|
||||
variantOutputs = resolvedVariants.map { it.second }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun setupResultSlot() {
|
||||
if (isValidVariantIndex(selectedVariantIndex.get())) {
|
||||
resultSlot.set(variantOutputs[selectedVariantIndex.get()].copy())
|
||||
} else {
|
||||
resultSlot.set(ItemStack.EMPTY)
|
||||
}
|
||||
broadcastChanges()
|
||||
}
|
||||
|
||||
fun registerUpdateListener(listener: Runnable) {
|
||||
slotUpdateListener = listener
|
||||
}
|
||||
|
||||
override fun canTakeItemForPickAll(stack: ItemStack, slot: Slot): Boolean {
|
||||
return slot.container !== resultContainer && super.canTakeItemForPickAll(stack, slot)
|
||||
}
|
||||
|
||||
override fun quickMoveStack(player: Player, index: Int): ItemStack {
|
||||
var copiedStack = ItemStack.EMPTY
|
||||
val slot = slots[index]
|
||||
|
||||
if (slot.hasItem()) {
|
||||
val movedStack = slot.item
|
||||
val movedItem = movedStack.item
|
||||
copiedStack = movedStack.copy()
|
||||
|
||||
if (index == RESULT_SLOT) {
|
||||
movedItem.onCraftedBy(movedStack, player.level(), player)
|
||||
if (!moveItemStackTo(movedStack, INV_SLOT_START, USE_ROW_SLOT_END, true)) {
|
||||
return ItemStack.EMPTY
|
||||
}
|
||||
slot.onQuickCraft(movedStack, copiedStack)
|
||||
} else if (index == INPUT_SLOT) {
|
||||
if (!moveItemStackTo(movedStack, INV_SLOT_START, USE_ROW_SLOT_END, false)) {
|
||||
return ItemStack.EMPTY
|
||||
}
|
||||
} else if (hasVariantsFor(movedStack)) {
|
||||
if (!moveItemStackTo(movedStack, INPUT_SLOT, RESULT_SLOT, false)) {
|
||||
return ItemStack.EMPTY
|
||||
}
|
||||
} else if (index in INV_SLOT_START until INV_SLOT_END) {
|
||||
if (!moveItemStackTo(movedStack, USE_ROW_SLOT_START, USE_ROW_SLOT_END, false)) {
|
||||
return ItemStack.EMPTY
|
||||
}
|
||||
} else if (index in USE_ROW_SLOT_START until USE_ROW_SLOT_END) {
|
||||
if (!moveItemStackTo(movedStack, INV_SLOT_START, INV_SLOT_END, false)) {
|
||||
return ItemStack.EMPTY
|
||||
}
|
||||
}
|
||||
|
||||
if (movedStack.isEmpty) {
|
||||
slot.setByPlayer(ItemStack.EMPTY)
|
||||
} else {
|
||||
slot.setChanged()
|
||||
}
|
||||
|
||||
if (movedStack.count == copiedStack.count) {
|
||||
return ItemStack.EMPTY
|
||||
}
|
||||
|
||||
slot.onTake(player, movedStack)
|
||||
broadcastChanges()
|
||||
}
|
||||
|
||||
return copiedStack
|
||||
}
|
||||
|
||||
override fun removed(player: Player) {
|
||||
super.removed(player)
|
||||
resultContainer.removeItemNoUpdate(1)
|
||||
access.execute { _, _ -> clearContainer(player, container) }
|
||||
}
|
||||
|
||||
private fun hasVariantsFor(stack: ItemStack): Boolean {
|
||||
val parentId = getParentIdentifier(stack) ?: return false
|
||||
return ModificationVariants.forParent(parentId).isNotEmpty()
|
||||
}
|
||||
|
||||
private fun getParentIdentifier(stack: ItemStack): ResourceLocation? {
|
||||
val blockItem = stack.item as? BlockItem
|
||||
if (blockItem != null) {
|
||||
val blockIdentifier = BuiltInRegistries.BLOCK.getKey(blockItem.block)
|
||||
return ModificationVariants.getByIdentifier(blockIdentifier)?.parent ?: blockIdentifier
|
||||
}
|
||||
|
||||
val itemIdentifier = BuiltInRegistries.ITEM.getKey(stack.item)
|
||||
return itemIdentifier
|
||||
}
|
||||
|
||||
private fun createVariantOutput(variant: ModificationVariant): ItemStack? {
|
||||
if (!BuiltInRegistries.BLOCK.containsKey(variant.identifier)) {
|
||||
return null
|
||||
}
|
||||
|
||||
val block = BuiltInRegistries.BLOCK.get(variant.identifier) ?: return null
|
||||
val item = block.asItem()
|
||||
if (item == Items.AIR) {
|
||||
return null
|
||||
}
|
||||
|
||||
return ItemStack(item)
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val INPUT_SLOT = 0
|
||||
const val RESULT_SLOT = 1
|
||||
private const val INV_SLOT_START = 2
|
||||
private const val INV_SLOT_END = 29
|
||||
private const val USE_ROW_SLOT_START = 29
|
||||
private const val USE_ROW_SLOT_END = 38
|
||||
}
|
||||
}
|
||||
@@ -15,6 +15,7 @@ import com.cobblemon.mod.common.CobblemonClientImplementation
|
||||
import com.cobblemon.mod.common.CobblemonEntities
|
||||
import com.cobblemon.mod.common.CobblemonItems
|
||||
import com.cobblemon.mod.common.CobblemonMenuType
|
||||
import com.cobblemon.mod.common.CobblemonModificationBlocks
|
||||
import com.cobblemon.mod.common.api.berry.Berries
|
||||
import com.cobblemon.mod.common.api.scheduling.ClientTaskTracker
|
||||
import com.cobblemon.mod.common.api.storage.player.client.ClientGeneralPlayerData
|
||||
@@ -28,6 +29,7 @@ import com.cobblemon.mod.common.client.gui.PartyOverlayDataControl
|
||||
import com.cobblemon.mod.common.client.gui.RideControlsOverlay
|
||||
import com.cobblemon.mod.common.client.gui.battle.BattleOverlay
|
||||
import com.cobblemon.mod.common.client.gui.cookingpot.CookingPotScreen
|
||||
import com.cobblemon.mod.common.client.gui.modificationstation.ModificationStationScreen
|
||||
import com.cobblemon.mod.common.client.gui.tmmachine.TMMachineScreen
|
||||
import com.cobblemon.mod.common.client.gui.party.PartyTutorialToasts
|
||||
import com.cobblemon.mod.common.client.particle.BedrockParticleOptionsRepository
|
||||
@@ -252,6 +254,7 @@ object CobblemonClient {
|
||||
RenderType.cutout(),
|
||||
CobblemonBlocks.GILDED_CHEST,
|
||||
CobblemonBlocks.FOSSIL_ANALYZER,
|
||||
CobblemonBlocks.MODIFICATION_STATION,
|
||||
CobblemonBlocks.APRICORN_DOOR,
|
||||
CobblemonBlocks.APRICORN_TRAPDOOR,
|
||||
CobblemonBlocks.APRICORN_SIGN,
|
||||
@@ -332,6 +335,9 @@ object CobblemonClient {
|
||||
CobblemonBlocks.SKY_TUMBLESTONE_CLUSTER,
|
||||
CobblemonBlocks.GIMMIGHOUL_CHEST,
|
||||
CobblemonBlocks.DISPLAY_CASE,
|
||||
*CobblemonModificationBlocks.displayCaseNonTintedVariantBlocks().toTypedArray(),
|
||||
*CobblemonModificationBlocks.domeFossilVariantBlocks().toTypedArray(),
|
||||
*CobblemonModificationBlocks.pcVariantBlocks().toTypedArray(),
|
||||
CobblemonBlocks.SACCHARINE_DOOR,
|
||||
CobblemonBlocks.SACCHARINE_TRAPDOOR,
|
||||
CobblemonBlocks.SACCHARINE_SIGN,
|
||||
@@ -395,6 +401,11 @@ object CobblemonClient {
|
||||
CobblemonBlocks.TM_MACHINE
|
||||
)
|
||||
|
||||
this.implementation.registerBlockRenderType(
|
||||
RenderType.translucent(),
|
||||
*CobblemonModificationBlocks.displayCaseTintedVariantBlocks().toTypedArray()
|
||||
)
|
||||
|
||||
this.createBoatModelLayers()
|
||||
}
|
||||
|
||||
@@ -421,6 +432,7 @@ object CobblemonClient {
|
||||
private fun registerMenuScreens() {
|
||||
MenuScreens.register(CobblemonMenuType.COOKING_POT, ::CookingPotScreen)
|
||||
MenuScreens.register(CobblemonMenuType.TM_MACHINE, ::TMMachineScreen)
|
||||
MenuScreens.register(CobblemonMenuType.MODIFICATION_STATION, ::ModificationStationScreen)
|
||||
}
|
||||
|
||||
private fun registerBlockEntityRenderers() {
|
||||
|
||||
+217
@@ -0,0 +1,217 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.client.gui.modificationstation
|
||||
|
||||
import net.minecraft.client.Minecraft
|
||||
import net.minecraft.client.gui.GuiGraphics
|
||||
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen
|
||||
import net.minecraft.client.resources.sounds.SimpleSoundInstance
|
||||
import com.cobblemon.mod.common.block.modificationstation.ModificationStationMenu
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.sounds.SoundEvents
|
||||
import net.minecraft.util.Mth
|
||||
import net.minecraft.network.chat.Component
|
||||
import net.minecraft.world.entity.player.Inventory
|
||||
|
||||
class ModificationStationScreen(
|
||||
menu: ModificationStationMenu,
|
||||
playerInventory: Inventory,
|
||||
title: Component
|
||||
) : AbstractContainerScreen<ModificationStationMenu>(menu, playerInventory, title) {
|
||||
|
||||
private var scrollOffs = 0.0F
|
||||
private var scrolling = false
|
||||
private var startIndex = 0
|
||||
private var displayVariants = false
|
||||
|
||||
init {
|
||||
menu.registerUpdateListener { containerChanged() }
|
||||
titleLabelY -= 1
|
||||
}
|
||||
|
||||
override fun render(graphics: GuiGraphics, mouseX: Int, mouseY: Int, partialTick: Float) {
|
||||
super.render(graphics, mouseX, mouseY, partialTick)
|
||||
renderTooltip(graphics, mouseX, mouseY)
|
||||
}
|
||||
|
||||
override fun renderBg(graphics: GuiGraphics, partialTick: Float, mouseX: Int, mouseY: Int) {
|
||||
val left = leftPos
|
||||
val top = topPos
|
||||
|
||||
graphics.blit(BG_LOCATION, left, top, 0, 0, imageWidth, imageHeight)
|
||||
|
||||
val yOffset = (41.0F * scrollOffs).toInt()
|
||||
val scrollerSprite = if (isScrollBarActive()) SCROLLER_SPRITE else SCROLLER_DISABLED_SPRITE
|
||||
graphics.blitSprite(scrollerSprite, left + 119, top + 15 + yOffset, 12, 15)
|
||||
|
||||
val variantsLeft = leftPos + RECIPES_X
|
||||
val variantsTop = topPos + RECIPES_Y
|
||||
val variantsEnd = startIndex + (RECIPES_COLUMNS * RECIPES_ROWS)
|
||||
|
||||
renderButtons(graphics, mouseX, mouseY, variantsLeft, variantsTop, variantsEnd)
|
||||
renderVariants(graphics, variantsLeft, variantsTop, variantsEnd)
|
||||
}
|
||||
|
||||
override fun renderTooltip(graphics: GuiGraphics, x: Int, y: Int) {
|
||||
super.renderTooltip(graphics, x, y)
|
||||
|
||||
if (!displayVariants) {
|
||||
return
|
||||
}
|
||||
|
||||
val variantsLeft = leftPos + RECIPES_X
|
||||
val variantsTop = topPos + RECIPES_Y
|
||||
val variantsEnd = startIndex + (RECIPES_COLUMNS * RECIPES_ROWS)
|
||||
val outputs = menu.getVariantOutputs()
|
||||
|
||||
for (index in startIndex until variantsEnd) {
|
||||
if (index >= menu.getNumVariants()) {
|
||||
break
|
||||
}
|
||||
|
||||
val relativeIndex = index - startIndex
|
||||
val xPos = variantsLeft + relativeIndex % RECIPES_COLUMNS * RECIPES_IMAGE_SIZE_WIDTH
|
||||
val yPos = variantsTop + relativeIndex / RECIPES_COLUMNS * RECIPES_IMAGE_SIZE_HEIGHT + 2
|
||||
|
||||
if (x >= xPos && x < xPos + RECIPES_IMAGE_SIZE_WIDTH && y >= yPos && y < yPos + RECIPES_IMAGE_SIZE_HEIGHT) {
|
||||
graphics.renderTooltip(font, outputs[index], x, y)
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun renderButtons(graphics: GuiGraphics, mouseX: Int, mouseY: Int, x: Int, y: Int, endIndex: Int) {
|
||||
for (index in startIndex until endIndex) {
|
||||
if (index >= menu.getNumVariants()) {
|
||||
break
|
||||
}
|
||||
|
||||
val relativeIndex = index - startIndex
|
||||
val xPos = x + relativeIndex % RECIPES_COLUMNS * RECIPES_IMAGE_SIZE_WIDTH
|
||||
val row = relativeIndex / RECIPES_COLUMNS
|
||||
val yPos = y + row * RECIPES_IMAGE_SIZE_HEIGHT + 2
|
||||
|
||||
val sprite = if (index == menu.getSelectedVariantIndex()) {
|
||||
RECIPE_SELECTED_SPRITE
|
||||
} else if (mouseX in xPos until (xPos + RECIPES_IMAGE_SIZE_WIDTH) && mouseY in yPos until (yPos + RECIPES_IMAGE_SIZE_HEIGHT)) {
|
||||
RECIPE_HIGHLIGHTED_SPRITE
|
||||
} else {
|
||||
RECIPE_SPRITE
|
||||
}
|
||||
|
||||
graphics.blitSprite(sprite, xPos, yPos - 1, RECIPES_IMAGE_SIZE_WIDTH, RECIPES_IMAGE_SIZE_HEIGHT)
|
||||
}
|
||||
}
|
||||
|
||||
private fun renderVariants(graphics: GuiGraphics, x: Int, y: Int, endIndex: Int) {
|
||||
val outputs = menu.getVariantOutputs()
|
||||
|
||||
for (index in startIndex until endIndex) {
|
||||
if (index >= menu.getNumVariants()) {
|
||||
break
|
||||
}
|
||||
|
||||
val relativeIndex = index - startIndex
|
||||
val xPos = x + relativeIndex % RECIPES_COLUMNS * RECIPES_IMAGE_SIZE_WIDTH
|
||||
val row = relativeIndex / RECIPES_COLUMNS
|
||||
val yPos = y + row * RECIPES_IMAGE_SIZE_HEIGHT + 2
|
||||
|
||||
graphics.renderItem(outputs[index], xPos, yPos)
|
||||
}
|
||||
}
|
||||
|
||||
override fun mouseClicked(mouseX: Double, mouseY: Double, button: Int): Boolean {
|
||||
scrolling = false
|
||||
val minecraftClient = minecraft ?: return super.mouseClicked(mouseX, mouseY, button)
|
||||
|
||||
if (displayVariants) {
|
||||
val variantsLeft = leftPos + RECIPES_X
|
||||
val variantsTop = topPos + RECIPES_Y
|
||||
val variantsEnd = startIndex + (RECIPES_COLUMNS * RECIPES_ROWS)
|
||||
|
||||
for (index in startIndex until variantsEnd) {
|
||||
val relativeIndex = index - startIndex
|
||||
val xPos = mouseX - (variantsLeft + relativeIndex % RECIPES_COLUMNS * RECIPES_IMAGE_SIZE_WIDTH)
|
||||
val yPos = mouseY - (variantsTop + relativeIndex / RECIPES_COLUMNS * RECIPES_IMAGE_SIZE_HEIGHT)
|
||||
if (xPos >= 0.0 && yPos >= 0.0 && xPos < RECIPES_IMAGE_SIZE_WIDTH.toDouble() && yPos < RECIPES_IMAGE_SIZE_HEIGHT.toDouble()) {
|
||||
val player = minecraftClient.player
|
||||
if (player != null && menu.clickMenuButton(player, index)) {
|
||||
Minecraft.getInstance().soundManager.play(SimpleSoundInstance.forUI(SoundEvents.UI_STONECUTTER_SELECT_RECIPE, 1.0F))
|
||||
minecraftClient.gameMode?.handleInventoryButtonClick(menu.containerId, index)
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val scrollX = leftPos + 119
|
||||
val scrollY = topPos + 9
|
||||
if (mouseX >= scrollX && mouseX < (scrollX + 12) && mouseY >= scrollY && mouseY < (scrollY + 54)) {
|
||||
scrolling = true
|
||||
}
|
||||
}
|
||||
|
||||
return super.mouseClicked(mouseX, mouseY, button)
|
||||
}
|
||||
|
||||
override fun mouseDragged(mouseX: Double, mouseY: Double, button: Int, dragX: Double, dragY: Double): Boolean {
|
||||
if (scrolling && isScrollBarActive()) {
|
||||
val minY = topPos + 14
|
||||
val maxY = minY + 54
|
||||
scrollOffs = ((mouseY.toFloat() - minY.toFloat()) - 7.5F) / ((maxY - minY).toFloat() - 15.0F)
|
||||
scrollOffs = Mth.clamp(scrollOffs, 0.0F, 1.0F)
|
||||
startIndex = (scrollOffs * getOffscreenRows().toFloat() + 0.5).toInt() * RECIPES_COLUMNS
|
||||
return true
|
||||
}
|
||||
|
||||
return super.mouseDragged(mouseX, mouseY, button, dragX, dragY)
|
||||
}
|
||||
|
||||
override fun mouseScrolled(mouseX: Double, mouseY: Double, scrollX: Double, scrollY: Double): Boolean {
|
||||
if (isScrollBarActive()) {
|
||||
val offscreenRows = getOffscreenRows()
|
||||
val offset = scrollY.toFloat() / offscreenRows.toFloat()
|
||||
scrollOffs = Mth.clamp(scrollOffs - offset, 0.0F, 1.0F)
|
||||
startIndex = (scrollOffs * offscreenRows.toFloat() + 0.5).toInt() * RECIPES_COLUMNS
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
private fun isScrollBarActive(): Boolean {
|
||||
return displayVariants && menu.getNumVariants() > RECIPES_COLUMNS * RECIPES_ROWS
|
||||
}
|
||||
|
||||
private fun getOffscreenRows(): Int {
|
||||
return (menu.getNumVariants() + RECIPES_COLUMNS - 1) / RECIPES_COLUMNS - RECIPES_ROWS
|
||||
}
|
||||
|
||||
private fun containerChanged() {
|
||||
displayVariants = menu.hasInputItem()
|
||||
if (!displayVariants) {
|
||||
scrollOffs = 0.0F
|
||||
startIndex = 0
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
private val SCROLLER_SPRITE = ResourceLocation.withDefaultNamespace("container/stonecutter/scroller")
|
||||
private val SCROLLER_DISABLED_SPRITE = ResourceLocation.withDefaultNamespace("container/stonecutter/scroller_disabled")
|
||||
private val RECIPE_SELECTED_SPRITE = ResourceLocation.withDefaultNamespace("container/stonecutter/recipe_selected")
|
||||
private val RECIPE_HIGHLIGHTED_SPRITE = ResourceLocation.withDefaultNamespace("container/stonecutter/recipe_highlighted")
|
||||
private val RECIPE_SPRITE = ResourceLocation.withDefaultNamespace("container/stonecutter/recipe")
|
||||
private val BG_LOCATION = ResourceLocation.withDefaultNamespace("textures/gui/container/stonecutter.png")
|
||||
|
||||
private const val RECIPES_COLUMNS = 4
|
||||
private const val RECIPES_ROWS = 3
|
||||
private const val RECIPES_IMAGE_SIZE_WIDTH = 16
|
||||
private const val RECIPES_IMAGE_SIZE_HEIGHT = 18
|
||||
private const val RECIPES_X = 52
|
||||
private const val RECIPES_Y = 14
|
||||
}
|
||||
}
|
||||
+6
-2
@@ -34,6 +34,7 @@ class DisplayCaseRenderer(ctx: BlockEntityRendererProvider.Context) : BlockEntit
|
||||
val coinPouchStack: ItemStack by lazy { ItemStack(
|
||||
CobblemonItems.RELIC_COIN_POUCH
|
||||
).also { it.set(DataComponents.CUSTOM_MODEL_DATA, CustomModelData(1)) } }
|
||||
|
||||
override fun render(
|
||||
entity: DisplayCaseBlockEntity,
|
||||
tickDelta: Float,
|
||||
@@ -47,6 +48,7 @@ class DisplayCaseRenderer(ctx: BlockEntityRendererProvider.Context) : BlockEntit
|
||||
} else {
|
||||
entity.getStack()
|
||||
}
|
||||
|
||||
val world = entity.level ?: return
|
||||
val posType = getPositioningType(stack, world)
|
||||
val blockState = if (entity.level != null) entity.blockState
|
||||
@@ -167,6 +169,7 @@ class DisplayCaseRenderer(ctx: BlockEntityRendererProvider.Context) : BlockEntit
|
||||
//stack.item == CobblemonItems.POKEMON_MODEL -> PositioningType.ITEM_MODEL
|
||||
stack.item == Items.SHIELD -> PositioningType.SHIELD
|
||||
stack.item == Items.DECORATED_POT -> PositioningType.MOB_HEAD
|
||||
stack.item == CobblemonItems.DOME_FOSSIL -> PositioningType.DOME_FOSSIL
|
||||
Minecraft.getInstance().itemRenderer.getModel(stack, world, null, 0).isGui3d -> PositioningType.BLOCK_MODEL
|
||||
else -> PositioningType.ITEM_MODEL
|
||||
}
|
||||
@@ -186,6 +189,7 @@ class DisplayCaseRenderer(ctx: BlockEntityRendererProvider.Context) : BlockEntit
|
||||
MOB_HEAD(1f, 1f, 1f, 0f, -0.025f, 0f, 180f),
|
||||
SHIELD(1f, 1f, 1f, 0f, -0.045f, 0f, 180f),
|
||||
PASTURE(1f, 1f, 1f, 0f, 0.0375f, 0f),
|
||||
COIN_POUCH(1f, 1f, 1f, 0f, 0.415f, 0f)
|
||||
COIN_POUCH(1f, 1f, 1f, 0f, 0.415f, 0f),
|
||||
DOME_FOSSIL(1f, 1f, 1f, 0f, -0.15f, 0f)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -34,6 +34,7 @@ import com.cobblemon.mod.common.api.fossil.NaturalMaterials
|
||||
import com.cobblemon.mod.common.api.interaction.PokemonInteractions
|
||||
import com.cobblemon.mod.common.api.item.HeldItems
|
||||
import com.cobblemon.mod.common.api.mark.Marks
|
||||
import com.cobblemon.mod.common.api.modification.ModificationVariants
|
||||
import com.cobblemon.mod.common.api.moves.Moves
|
||||
import com.cobblemon.mod.common.api.moves.animations.ActionEffects
|
||||
import com.cobblemon.mod.common.api.npc.NPCClasses
|
||||
@@ -119,6 +120,7 @@ object CobblemonDataProvider : DataProvider {
|
||||
this.register(SpawnBaitEffects, reloadable = false)
|
||||
this.register(CobblemonRideSettings, reloadable = true)
|
||||
this.register(TechnicalMachines, reloadable = false)
|
||||
this.register(ModificationVariants, reloadable = true)
|
||||
SpawnBait.Effects.setupEffects()
|
||||
|
||||
PlatformEvents.SERVER_PLAYER_LOGOUT.subscribe {
|
||||
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.item.components
|
||||
|
||||
import com.mojang.serialization.Codec
|
||||
import io.netty.buffer.ByteBuf
|
||||
import net.minecraft.network.codec.ByteBufCodecs
|
||||
import net.minecraft.network.codec.StreamCodec
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
|
||||
data class ModificationVariantComponent(val variant: ResourceLocation) {
|
||||
companion object {
|
||||
val CODEC: Codec<ModificationVariantComponent> = ResourceLocation.CODEC.xmap(
|
||||
::ModificationVariantComponent,
|
||||
ModificationVariantComponent::variant
|
||||
)
|
||||
|
||||
val PACKET_CODEC: StreamCodec<ByteBuf, ModificationVariantComponent> = ByteBufCodecs.fromCodec(CODEC)
|
||||
}
|
||||
}
|
||||
@@ -251,6 +251,7 @@ object CobblemonItemGroups {
|
||||
entries.accept(CobblemonItems.HEALING_MACHINE)
|
||||
entries.accept(CobblemonItems.PASTURE)
|
||||
entries.accept(CobblemonItems.TM_MACHINE)
|
||||
entries.accept(CobblemonItems.MODIFICATION_STATION)
|
||||
|
||||
entries.accept(CobblemonItems.GILDED_CHEST)
|
||||
entries.accept(CobblemonItems.YELLOW_GILDED_CHEST)
|
||||
|
||||
+90
@@ -0,0 +1,90 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.modification_station
|
||||
|
||||
import com.cobblemon.mod.common.CobblemonSounds
|
||||
import com.cobblemon.mod.common.block.DisplayCaseBlock
|
||||
import com.cobblemon.mod.common.platform.PlatformRegistry
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import net.minecraft.core.Registry
|
||||
import net.minecraft.core.registries.BuiltInRegistries
|
||||
import net.minecraft.core.registries.Registries
|
||||
import net.minecraft.resources.ResourceKey
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.world.level.block.Block
|
||||
import net.minecraft.world.level.block.state.BlockBehaviour
|
||||
import net.minecraft.world.level.material.MapColor
|
||||
import net.minecraft.world.level.material.PushReaction
|
||||
|
||||
object DisplayCaseVariantBlocks : PlatformRegistry<Registry<Block>, ResourceKey<Registry<Block>>, Block>(),
|
||||
ModificationVariantBlockRegistrar {
|
||||
|
||||
override val registry: Registry<Block> = BuiltInRegistries.BLOCK
|
||||
override val resourceKey: ResourceKey<Registry<Block>> = Registries.BLOCK
|
||||
|
||||
private val blocksByIdentifier = linkedMapOf<ResourceLocation, DisplayCaseBlock>()
|
||||
private val identifiersByBlock = hashMapOf<Block, ResourceLocation>()
|
||||
private val tintedBlocks = mutableListOf<Block>()
|
||||
private val nonTintedBlocks = mutableListOf<Block>()
|
||||
|
||||
init {
|
||||
displayCaseVariantPaths().forEach { path ->
|
||||
registerDisplayCaseVariant(path)
|
||||
}
|
||||
}
|
||||
|
||||
override fun registerAll(consumer: (ResourceLocation, Block) -> Unit) {
|
||||
register(consumer)
|
||||
}
|
||||
|
||||
override fun allBlocks(): Collection<Block> = blocksByIdentifier.values
|
||||
|
||||
override fun allEntries(): Map<ResourceLocation, Block> = blocksByIdentifier.toMap()
|
||||
|
||||
override fun variantIdentifier(block: Block): ResourceLocation? = identifiersByBlock[block]
|
||||
|
||||
fun tintedVariantBlocks(): Collection<Block> = tintedBlocks
|
||||
|
||||
fun nonTintedVariantBlocks(): Collection<Block> = nonTintedBlocks
|
||||
|
||||
private fun registerDisplayCaseVariant(path: String): DisplayCaseBlock {
|
||||
val identifier = cobblemonResource(path)
|
||||
val block = create(
|
||||
identifier,
|
||||
DisplayCaseBlock(
|
||||
BlockBehaviour.Properties.of()
|
||||
.sound(CobblemonSounds.DISPLAY_CASE_SOUNDS)
|
||||
.noOcclusion()
|
||||
.pushReaction(PushReaction.BLOCK)
|
||||
.mapColor(MapColor.STONE)
|
||||
.strength(0.3F)
|
||||
.requiresCorrectToolForDrops()
|
||||
)
|
||||
)
|
||||
|
||||
blocksByIdentifier[identifier] = block
|
||||
identifiersByBlock[block] = identifier
|
||||
if (path.contains("_tinted_glass_")) {
|
||||
tintedBlocks.add(block)
|
||||
} else {
|
||||
nonTintedBlocks.add(block)
|
||||
}
|
||||
return block
|
||||
}
|
||||
|
||||
private fun displayCaseVariantPaths(): List<String> {
|
||||
val paths = mutableListOf("display_case_default")
|
||||
for (index in 1..16) {
|
||||
paths.add("display_case_stone_glass_color_$index")
|
||||
paths.add("display_case_stone_no_glass_color_$index")
|
||||
paths.add("display_case_stone_tinted_glass_color_$index")
|
||||
}
|
||||
return paths
|
||||
}
|
||||
}
|
||||
+77
@@ -0,0 +1,77 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.modification_station
|
||||
|
||||
import com.cobblemon.mod.common.platform.PlatformRegistry
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import net.minecraft.core.BlockPos
|
||||
import net.minecraft.core.Registry
|
||||
import net.minecraft.core.registries.BuiltInRegistries
|
||||
import net.minecraft.core.registries.Registries
|
||||
import net.minecraft.resources.ResourceKey
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.world.level.BlockGetter
|
||||
import net.minecraft.world.level.block.Block
|
||||
import net.minecraft.world.level.block.state.BlockBehaviour
|
||||
import net.minecraft.world.level.block.state.BlockState
|
||||
import net.minecraft.world.level.material.MapColor
|
||||
import net.minecraft.world.phys.shapes.CollisionContext
|
||||
import net.minecraft.world.phys.shapes.Shapes
|
||||
import net.minecraft.world.phys.shapes.VoxelShape
|
||||
|
||||
object DomeFossilVariantBlocks : PlatformRegistry<Registry<Block>, ResourceKey<Registry<Block>>, Block>(),
|
||||
ModificationVariantBlockRegistrar {
|
||||
|
||||
override val registry: Registry<Block> = BuiltInRegistries.BLOCK
|
||||
override val resourceKey: ResourceKey<Registry<Block>> = Registries.BLOCK
|
||||
|
||||
private val blocksByIdentifier = linkedMapOf<ResourceLocation, Block>()
|
||||
private val identifiersByBlock = hashMapOf<Block, ResourceLocation>()
|
||||
|
||||
init {
|
||||
registerVariant("dome_fossil_block_1", Shapes.box(4.0 / 16.0, 0.0, 3.0 / 16.0, 12.0 / 16.0, 2.75 / 16.0, 13.0 / 16.0))
|
||||
registerVariant("dome_fossil_block_2", Shapes.box(0.0, 0.0, 0.0, 1.0, 5.75 / 16.0, 1.0))
|
||||
}
|
||||
|
||||
override fun registerAll(consumer: (ResourceLocation, Block) -> Unit) {
|
||||
register(consumer)
|
||||
}
|
||||
|
||||
override fun allBlocks(): Collection<Block> = blocksByIdentifier.values
|
||||
|
||||
override fun allEntries(): Map<ResourceLocation, Block> = blocksByIdentifier.toMap()
|
||||
|
||||
override fun variantIdentifier(block: Block): ResourceLocation? = identifiersByBlock[block]
|
||||
|
||||
private fun registerVariant(path: String, shape: VoxelShape): Block {
|
||||
val identifier = cobblemonResource(path)
|
||||
val block = create(
|
||||
identifier,
|
||||
DomeFossilVariantBlock(
|
||||
BlockBehaviour.Properties.of()
|
||||
.mapColor(MapColor.STONE)
|
||||
.strength(0.8F)
|
||||
.noOcclusion(),
|
||||
shape
|
||||
)
|
||||
)
|
||||
blocksByIdentifier[identifier] = block
|
||||
identifiersByBlock[block] = identifier
|
||||
return block
|
||||
}
|
||||
}
|
||||
|
||||
private class DomeFossilVariantBlock(
|
||||
properties: BlockBehaviour.Properties,
|
||||
private val shape: VoxelShape
|
||||
) : Block(properties) {
|
||||
override fun getShape(state: BlockState, level: BlockGetter, pos: BlockPos, context: CollisionContext): VoxelShape = shape
|
||||
|
||||
override fun getCollisionShape(state: BlockState, level: BlockGetter, pos: BlockPos, context: CollisionContext): VoxelShape = shape
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.modification_station
|
||||
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.world.level.block.Block
|
||||
|
||||
interface ModificationVariantBlockRegistrar {
|
||||
fun registerAll(consumer: (ResourceLocation, Block) -> Unit)
|
||||
fun allBlocks(): Collection<Block>
|
||||
fun allEntries(): Map<ResourceLocation, Block>
|
||||
fun variantIdentifier(block: Block): ResourceLocation?
|
||||
}
|
||||
+194
@@ -0,0 +1,194 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.modification_station
|
||||
|
||||
import com.cobblemon.mod.common.block.PCBlock
|
||||
import com.cobblemon.mod.common.platform.PlatformRegistry
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import net.minecraft.core.BlockPos
|
||||
import net.minecraft.core.Registry
|
||||
import net.minecraft.core.registries.BuiltInRegistries
|
||||
import net.minecraft.core.registries.Registries
|
||||
import net.minecraft.resources.ResourceKey
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.world.entity.LivingEntity
|
||||
import net.minecraft.world.item.ItemStack
|
||||
import net.minecraft.world.item.context.BlockPlaceContext
|
||||
import net.minecraft.world.level.BlockGetter
|
||||
import net.minecraft.world.level.Level
|
||||
import net.minecraft.world.level.LevelAccessor
|
||||
import net.minecraft.world.level.block.Block
|
||||
import net.minecraft.world.level.block.Blocks
|
||||
import net.minecraft.world.level.block.HorizontalDirectionalBlock
|
||||
import net.minecraft.world.level.block.SoundType
|
||||
import net.minecraft.world.level.block.state.BlockBehaviour
|
||||
import net.minecraft.world.level.block.state.BlockState
|
||||
import net.minecraft.world.level.block.state.properties.BlockStateProperties.WATERLOGGED
|
||||
import net.minecraft.world.level.material.Fluids
|
||||
import net.minecraft.world.level.material.MapColor
|
||||
import net.minecraft.world.level.material.PushReaction
|
||||
import net.minecraft.world.phys.shapes.CollisionContext
|
||||
import net.minecraft.world.phys.shapes.Shapes
|
||||
import net.minecraft.world.phys.shapes.VoxelShape
|
||||
|
||||
object PCVariantBlocks : PlatformRegistry<Registry<Block>, ResourceKey<Registry<Block>>, Block>(),
|
||||
ModificationVariantBlockRegistrar {
|
||||
|
||||
override val registry: Registry<Block> = BuiltInRegistries.BLOCK
|
||||
override val resourceKey: ResourceKey<Registry<Block>> = Registries.BLOCK
|
||||
|
||||
private val blocksByIdentifier = linkedMapOf<ResourceLocation, PCBlock>()
|
||||
private val identifiersByBlock = hashMapOf<Block, ResourceLocation>()
|
||||
|
||||
init {
|
||||
registerSingleBlockPCVariant("pc_hgss")
|
||||
registerSingleBlockPCVariant("pc_sm")
|
||||
registerDoubleBlockPCVariant("pc_xd")
|
||||
registerDoubleBlockPCVariant("pc_bw")
|
||||
registerDoubleBlockPCVariant("pc_dppt")
|
||||
registerDoubleBlockPCVariant("pc_swsh")
|
||||
registerOrasPCVariant("pc_oras")
|
||||
}
|
||||
|
||||
override fun registerAll(consumer: (ResourceLocation, Block) -> Unit) {
|
||||
register(consumer)
|
||||
}
|
||||
|
||||
override fun allBlocks(): Collection<Block> = blocksByIdentifier.values
|
||||
|
||||
override fun allEntries(): Map<ResourceLocation, Block> = blocksByIdentifier.toMap()
|
||||
|
||||
override fun variantIdentifier(block: Block): ResourceLocation? = identifiersByBlock[block]
|
||||
|
||||
private fun registerSingleBlockPCVariant(path: String): PCBlock {
|
||||
val identifier = cobblemonResource(path)
|
||||
val block = create(
|
||||
identifier,
|
||||
SingleBlockPCVariantBlock(
|
||||
BlockBehaviour.Properties.of()
|
||||
.mapColor(MapColor.METAL)
|
||||
.sound(SoundType.METAL)
|
||||
.pushReaction(PushReaction.BLOCK)
|
||||
.strength(2F)
|
||||
.noOcclusion()
|
||||
.lightLevel {
|
||||
if (it.getValue(PCBlock.ON)) 13 else 0
|
||||
}
|
||||
)
|
||||
)
|
||||
|
||||
blocksByIdentifier[identifier] = block
|
||||
identifiersByBlock[block] = identifier
|
||||
return block
|
||||
}
|
||||
|
||||
private fun registerDoubleBlockPCVariant(path: String): PCBlock {
|
||||
val identifier = cobblemonResource(path)
|
||||
val block = create(
|
||||
identifier,
|
||||
PCBlock(
|
||||
BlockBehaviour.Properties.of()
|
||||
.mapColor(MapColor.METAL)
|
||||
.sound(SoundType.METAL)
|
||||
.pushReaction(PushReaction.BLOCK)
|
||||
.strength(2F)
|
||||
.noOcclusion()
|
||||
.lightLevel {
|
||||
if (it.getValue(PCBlock.ON) && it.getValue(PCBlock.PART) == PCBlock.PCPart.TOP) 13 else 0
|
||||
}
|
||||
)
|
||||
)
|
||||
|
||||
blocksByIdentifier[identifier] = block
|
||||
identifiersByBlock[block] = identifier
|
||||
return block
|
||||
}
|
||||
|
||||
private fun registerOrasPCVariant(path: String): PCBlock {
|
||||
val identifier = cobblemonResource(path)
|
||||
val block = create(
|
||||
identifier,
|
||||
OrasPCVariantBlock(
|
||||
BlockBehaviour.Properties.of()
|
||||
.mapColor(MapColor.METAL)
|
||||
.sound(SoundType.METAL)
|
||||
.pushReaction(PushReaction.BLOCK)
|
||||
.strength(2F)
|
||||
.noOcclusion()
|
||||
.lightLevel {
|
||||
if (it.getValue(PCBlock.ON) && it.getValue(PCBlock.PART) == PCBlock.PCPart.TOP) 13 else 0
|
||||
}
|
||||
)
|
||||
)
|
||||
|
||||
blocksByIdentifier[identifier] = block
|
||||
identifiersByBlock[block] = identifier
|
||||
return block
|
||||
}
|
||||
}
|
||||
|
||||
private class SingleBlockPCVariantBlock(properties: BlockBehaviour.Properties) : PCBlock(properties) {
|
||||
override fun getStateForPlacement(blockPlaceContext: BlockPlaceContext): BlockState {
|
||||
return defaultBlockState()
|
||||
.setValue(HorizontalDirectionalBlock.FACING, blockPlaceContext.horizontalDirection)
|
||||
.setValue(PART, PCPart.BOTTOM)
|
||||
.setValue(WATERLOGGED, blockPlaceContext.level.getFluidState(blockPlaceContext.clickedPos).type == Fluids.WATER)
|
||||
}
|
||||
|
||||
override fun setPlacedBy(
|
||||
world: Level,
|
||||
pos: BlockPos,
|
||||
state: BlockState,
|
||||
placer: LivingEntity?,
|
||||
itemStack: ItemStack
|
||||
) {
|
||||
// Intentionally single-block: do not place a top half.
|
||||
}
|
||||
|
||||
override fun getPositionOfOtherPart(state: BlockState, pos: BlockPos): BlockPos = pos
|
||||
|
||||
override fun updateShape(
|
||||
state: BlockState,
|
||||
direction: net.minecraft.core.Direction,
|
||||
neighborState: BlockState,
|
||||
world: LevelAccessor,
|
||||
pos: BlockPos,
|
||||
neighborPos: BlockPos
|
||||
): BlockState {
|
||||
if (state.getValue(WATERLOGGED)) {
|
||||
world.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world))
|
||||
}
|
||||
|
||||
return if (state.getValue(PART) == PCPart.TOP) Blocks.AIR.defaultBlockState() else state
|
||||
}
|
||||
}
|
||||
|
||||
private class OrasPCVariantBlock(properties: BlockBehaviour.Properties) : PCBlock(properties) {
|
||||
companion object {
|
||||
private val ORAS_TOP_SECTION_SHAPE = Shapes.box(0.0, 0.5, 0.0, 1.0, 1.0, 1.0)
|
||||
}
|
||||
|
||||
override fun getShape(
|
||||
blockState: BlockState,
|
||||
blockGetter: BlockGetter,
|
||||
blockPos: BlockPos,
|
||||
collisionContext: CollisionContext
|
||||
): VoxelShape {
|
||||
return if (blockState.getValue(PART) == PCPart.TOP) Shapes.empty() else ORAS_TOP_SECTION_SHAPE
|
||||
}
|
||||
|
||||
override fun getCollisionShape(
|
||||
blockState: BlockState,
|
||||
blockGetter: BlockGetter,
|
||||
blockPos: BlockPos,
|
||||
collisionContext: CollisionContext
|
||||
): VoxelShape {
|
||||
return if (blockState.getValue(PART) == PCPart.TOP) Shapes.empty() else ORAS_TOP_SECTION_SHAPE
|
||||
}
|
||||
}
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.net.messages.client.data
|
||||
|
||||
import com.cobblemon.mod.common.api.modification.ModificationVariant
|
||||
import com.cobblemon.mod.common.api.modification.ModificationVariants
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import net.minecraft.network.RegistryFriendlyByteBuf
|
||||
|
||||
class ModificationVariantRegistrySyncPacket(variants: Collection<ModificationVariant>) :
|
||||
DataRegistrySyncPacket<ModificationVariant, ModificationVariantRegistrySyncPacket>(variants) {
|
||||
|
||||
companion object {
|
||||
val ID = cobblemonResource("modification_variant_registry_sync")
|
||||
|
||||
fun decode(buffer: RegistryFriendlyByteBuf): ModificationVariantRegistrySyncPacket {
|
||||
return ModificationVariantRegistrySyncPacket(emptyList()).apply { decodeBuffer(buffer) }
|
||||
}
|
||||
}
|
||||
|
||||
override val id = ID
|
||||
|
||||
override fun encodeEntry(buffer: RegistryFriendlyByteBuf, entry: ModificationVariant) {
|
||||
buffer.writeUtf(ModificationVariants.gson.toJson(entry))
|
||||
}
|
||||
|
||||
override fun decodeEntry(buffer: RegistryFriendlyByteBuf): ModificationVariant {
|
||||
return ModificationVariants.gson.fromJson(buffer.readUtf(), ModificationVariant::class.java)
|
||||
}
|
||||
|
||||
override fun synchronizeDecoded(entries: Collection<ModificationVariant>) {
|
||||
ModificationVariants.reloadEntries(entries)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/display_case"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/display_case",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/display_case",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/display_case",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_1"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_1",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_1",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_1",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_10"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_10",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_10",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_10",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_11"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_11",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_11",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_11",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_12"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_12",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_12",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_12",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_13"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_13",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_13",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_13",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_14"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_14",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_14",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_14",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_15"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_15",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_15",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_15",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_16"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_16",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_16",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_16",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_2"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_2",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_2",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_2",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_3"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_3",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_3",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_3",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_4"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_4",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_4",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_4",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_5"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_5",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_5",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_5",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_6"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_6",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_6",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_6",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_7"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_7",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_7",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_7",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_8"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_8",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_8",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_8",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_9"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_9",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_9",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_9",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_1"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_1",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_1",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_1",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_10"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_10",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_10",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_10",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_11"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_11",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_11",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_11",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_12"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_12",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_12",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_12",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_13"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_13",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_13",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_13",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_14"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_14",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_14",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_14",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_15"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_15",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_15",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_15",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_16"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_16",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_16",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_16",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_2"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_2",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_2",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_2",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_3"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_3",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_3",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_3",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_4"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_4",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_4",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_4",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_5"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_5",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_5",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_5",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_6"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_6",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_6",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_6",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_7"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_7",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_7",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_7",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_8"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_8",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_8",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_8",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_9"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_9",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_9",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_no_glass_color_9",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_1"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_1",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_1",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_1",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_10"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_10",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_10",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_10",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_11"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_11",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_11",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_11",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_12"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_12",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_12",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_12",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_13"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_13",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_13",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_13",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_14"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_14",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_14",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_14",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_15"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_15",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_15",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_15",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_16"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_16",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_16",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_16",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_2"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_2",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_2",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_2",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_3"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_3",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_3",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_3",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_4"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_4",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_4",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_4",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_5"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_5",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_5",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_5",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_6"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_6",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_6",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_6",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_7"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_7",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_7",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_7",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_8"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_8",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_8",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_8",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_9"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_9",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_9",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/mod_station/display_case/display_case_stone_tinted_glass_color_9",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"variants": {
|
||||
"": {
|
||||
"model": "cobblemon:block/mod_station/dome_fossil/dome_fossil_block_1"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"variants": {
|
||||
"": {
|
||||
"model": "cobblemon:block/mod_station/dome_fossil/dome_fossil_block_2"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south": {
|
||||
"model": "cobblemon:block/modification_station"
|
||||
},
|
||||
"facing=west": {
|
||||
"model": "cobblemon:block/modification_station",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north": {
|
||||
"model": "cobblemon:block/modification_station",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east": {
|
||||
"model": "cobblemon:block/modification_station",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south,part=top,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=west,part=top,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=north,part=top,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=east,part=top,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=south,part=top,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=west,part=top,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=north,part=top,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=east,part=top,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=south,part=bottom,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_bw"
|
||||
},
|
||||
"facing=west,part=bottom,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_bw",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,part=bottom,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_bw",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,part=bottom,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_bw",
|
||||
"y": 270
|
||||
},
|
||||
"facing=south,part=bottom,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_bw_on"
|
||||
},
|
||||
"facing=west,part=bottom,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_bw_on",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,part=bottom,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_bw_on",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,part=bottom,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_bw_on",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south,part=top,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=west,part=top,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=north,part=top,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=east,part=top,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=south,part=top,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=west,part=top,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=north,part=top,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=east,part=top,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=south,part=bottom,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_dppt"
|
||||
},
|
||||
"facing=west,part=bottom,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_dppt",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,part=bottom,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_dppt",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,part=bottom,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_dppt",
|
||||
"y": 270
|
||||
},
|
||||
"facing=south,part=bottom,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_dppt_on"
|
||||
},
|
||||
"facing=west,part=bottom,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_dppt_on",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,part=bottom,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_dppt_on",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,part=bottom,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_dppt_on",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south,part=top,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=west,part=top,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=north,part=top,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=east,part=top,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=south,part=top,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=west,part=top,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=north,part=top,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=east,part=top,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=south,part=bottom,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_hgss"
|
||||
},
|
||||
"facing=west,part=bottom,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_hgss",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,part=bottom,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_hgss",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,part=bottom,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_hgss",
|
||||
"y": 270
|
||||
},
|
||||
"facing=south,part=bottom,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_hgss_on"
|
||||
},
|
||||
"facing=west,part=bottom,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_hgss_on",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,part=bottom,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_hgss_on",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,part=bottom,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_hgss_on",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south,part=top,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=west,part=top,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=north,part=top,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=east,part=top,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=south,part=top,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=west,part=top,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=north,part=top,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=east,part=top,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=south,part=bottom,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_oras"
|
||||
},
|
||||
"facing=west,part=bottom,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_oras",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,part=bottom,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_oras",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,part=bottom,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_oras",
|
||||
"y": 270
|
||||
},
|
||||
"facing=south,part=bottom,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_oras_on"
|
||||
},
|
||||
"facing=west,part=bottom,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_oras_on",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,part=bottom,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_oras_on",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,part=bottom,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_oras_on",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south,part=top,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=west,part=top,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=north,part=top,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=east,part=top,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=south,part=top,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=west,part=top,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=north,part=top,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=east,part=top,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=south,part=bottom,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_sm"
|
||||
},
|
||||
"facing=west,part=bottom,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_sm",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,part=bottom,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_sm",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,part=bottom,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_sm",
|
||||
"y": 270
|
||||
},
|
||||
"facing=south,part=bottom,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_sm_on"
|
||||
},
|
||||
"facing=west,part=bottom,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_sm_on",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,part=bottom,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_sm_on",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,part=bottom,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_sm_on",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south,part=top,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=west,part=top,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=north,part=top,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=east,part=top,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=south,part=top,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=west,part=top,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=north,part=top,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=east,part=top,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=south,part=bottom,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_swsh"
|
||||
},
|
||||
"facing=west,part=bottom,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_swsh",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,part=bottom,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_swsh",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,part=bottom,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_swsh",
|
||||
"y": 270
|
||||
},
|
||||
"facing=south,part=bottom,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_swsh_on"
|
||||
},
|
||||
"facing=west,part=bottom,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_swsh_on",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,part=bottom,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_swsh_on",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,part=bottom,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_swsh_on",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
{
|
||||
"variants": {
|
||||
"facing=south,part=top,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=west,part=top,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=north,part=top,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=east,part=top,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=south,part=top,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=west,part=top,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=north,part=top,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=east,part=top,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_variant_top_empty"
|
||||
},
|
||||
"facing=south,part=bottom,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_xd"
|
||||
},
|
||||
"facing=west,part=bottom,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_xd",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,part=bottom,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_xd",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,part=bottom,on=false": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_xd",
|
||||
"y": 270
|
||||
},
|
||||
"facing=south,part=bottom,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_xd_on"
|
||||
},
|
||||
"facing=west,part=bottom,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_xd_on",
|
||||
"y": 90
|
||||
},
|
||||
"facing=north,part=bottom,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_xd_on",
|
||||
"y": 180
|
||||
},
|
||||
"facing=east,part=bottom,on=true": {
|
||||
"model": "cobblemon:block/mod_station/pc/pc_xd_on",
|
||||
"y": 270
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -989,6 +989,7 @@
|
||||
"block.cobblemon.campfire_pot_white": "White Campfire Pot",
|
||||
"block.cobblemon.campfire_pot_yellow": "Yellow Campfire Pot",
|
||||
"block.cobblemon.tm_machine": "TM Machine",
|
||||
"block.cobblemon.modification_station": "Modification Station",
|
||||
"block.cobblemon.hearty_grain_bale": "Hearty Grain Bale",
|
||||
"block.cobblemon.tatami_block": "Tatami",
|
||||
"block.cobblemon.tatami_mat": "Tatami Mat",
|
||||
@@ -1184,6 +1185,7 @@
|
||||
"cobblemon.container.campfire_pot": "Campfire Pot",
|
||||
"cobblemon.container.campfire_pot.recipe_book.toggle_recipes": "Showing Cookable",
|
||||
"cobblemon.container.tm_machine": "TM Machine",
|
||||
"container.cobblemon.modification_station": "Modification Station",
|
||||
|
||||
"cobblemon.ui.pokenav.title": "PokéNav",
|
||||
"cobblemon.ui.pokenav.narrator.backbutton": "Poke Nav button pressed",
|
||||
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"parent": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_5",
|
||||
"textures": {
|
||||
"8": "cobblemon:block/mod_station/display_case/display_case_pillow_1"
|
||||
}
|
||||
}
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"parent": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_5",
|
||||
"textures": {
|
||||
"8": "cobblemon:block/mod_station/display_case/display_case_pillow_10"
|
||||
}
|
||||
}
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"parent": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_5",
|
||||
"textures": {
|
||||
"8": "cobblemon:block/mod_station/display_case/display_case_pillow_11"
|
||||
}
|
||||
}
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"parent": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_5",
|
||||
"textures": {
|
||||
"8": "cobblemon:block/mod_station/display_case/display_case_pillow_12"
|
||||
}
|
||||
}
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"parent": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_5",
|
||||
"textures": {
|
||||
"8": "cobblemon:block/mod_station/display_case/display_case_pillow_13"
|
||||
}
|
||||
}
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"parent": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_5",
|
||||
"textures": {
|
||||
"8": "cobblemon:block/mod_station/display_case/display_case_pillow_14"
|
||||
}
|
||||
}
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"parent": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_5",
|
||||
"textures": {
|
||||
"8": "cobblemon:block/mod_station/display_case/display_case_pillow_15"
|
||||
}
|
||||
}
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"parent": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_5",
|
||||
"textures": {
|
||||
"8": "cobblemon:block/mod_station/display_case/display_case_pillow_16"
|
||||
}
|
||||
}
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"parent": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_5",
|
||||
"textures": {
|
||||
"8": "cobblemon:block/mod_station/display_case/display_case_pillow_2"
|
||||
}
|
||||
}
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"parent": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_5",
|
||||
"textures": {
|
||||
"8": "cobblemon:block/mod_station/display_case/display_case_pillow_3"
|
||||
}
|
||||
}
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"parent": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_5",
|
||||
"textures": {
|
||||
"8": "cobblemon:block/mod_station/display_case/display_case_pillow_4"
|
||||
}
|
||||
}
|
||||
+90
@@ -0,0 +1,90 @@
|
||||
{
|
||||
"format_version": "1.9.0",
|
||||
"credit": "Made with Blockbench",
|
||||
"textures": {
|
||||
"0": "cobblemon:block/functional/display_case_bottom",
|
||||
"1": "cobblemon:block/functional/display_case_side",
|
||||
"2": "cobblemon:block/functional/display_case_top",
|
||||
"3": "cobblemon:block/functional/display_case_internal",
|
||||
"8": "cobblemon:block/mod_station/display_case/display_case_pillow_5",
|
||||
"particle": "cobblemon:block/functional/display_case_bottom"
|
||||
},
|
||||
"elements": [
|
||||
{
|
||||
"name": "cushion",
|
||||
"from": [2, 4, 2],
|
||||
"to": [14, 5, 14],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 2]},
|
||||
"faces": {
|
||||
"north": {"uv": [1, 13, 13, 14], "texture": "#8"},
|
||||
"east": {"uv": [0, 1, 1, 13], "rotation": 270, "texture": "#8"},
|
||||
"south": {"uv": [1, 0, 13, 1], "rotation": 180, "texture": "#8"},
|
||||
"west": {"uv": [13, 1, 14, 13], "rotation": 90, "texture": "#8"},
|
||||
"up": {"uv": [13, 13, 1, 1], "texture": "#8"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "base",
|
||||
"from": [0, 0, 0],
|
||||
"to": [16, 4, 16],
|
||||
"faces": {
|
||||
"north": {"uv": [0, 12, 16, 16], "texture": "#1", "cullface": "north"},
|
||||
"east": {"uv": [0, 12, 16, 16], "texture": "#1", "cullface": "north"},
|
||||
"south": {"uv": [0, 12, 16, 16], "texture": "#1", "cullface": "north"},
|
||||
"west": {"uv": [0, 12, 16, 16], "texture": "#1", "cullface": "north"},
|
||||
"up": {"uv": [0, 0, 16, 16], "texture": "#3"},
|
||||
"down": {"uv": [0, 0, 16, 16], "texture": "#0", "cullface": "down"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "glass",
|
||||
"from": [0, 4, 0],
|
||||
"to": [16, 16, 16],
|
||||
"faces": {
|
||||
"north": {"uv": [0, 0, 16, 12], "texture": "#1", "cullface": "north"},
|
||||
"east": {"uv": [0, 0, 16, 12], "texture": "#1", "cullface": "east"},
|
||||
"south": {"uv": [0, 0, 16, 12], "texture": "#1", "cullface": "south"},
|
||||
"west": {"uv": [0, 0, 16, 12], "texture": "#1", "cullface": "west"},
|
||||
"up": {"uv": [0, 0, 16, 16], "texture": "#2", "cullface": "up"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "glass_int",
|
||||
"from": [15.975, 15.975, 15.975],
|
||||
"to": [0.025, 4, 0.025],
|
||||
"faces": {
|
||||
"north": {"uv": [0, 12, 16, 0], "texture": "#1", "cullface": "south"},
|
||||
"east": {"uv": [0, 12, 16, 0], "texture": "#1", "cullface": "west"},
|
||||
"south": {"uv": [0, 12, 16, 0], "texture": "#1", "cullface": "north"},
|
||||
"west": {"uv": [0, 12, 16, 0], "texture": "#1", "cullface": "east"},
|
||||
"down": {"uv": [16, 0, 0, 16], "texture": "#1", "cullface": "up"}
|
||||
}
|
||||
}
|
||||
],
|
||||
"display": {
|
||||
"thirdperson_righthand": {
|
||||
"rotation": [75, 135, 0],
|
||||
"translation": [0, 2.5, 0],
|
||||
"scale": [0.375, 0.375, 0.375]
|
||||
},
|
||||
"firstperson_righthand": {
|
||||
"rotation": [0, 135, 0],
|
||||
"scale": [0.4, 0.4, 0.4]
|
||||
},
|
||||
"firstperson_lefthand": {
|
||||
"rotation": [0, 135, 0],
|
||||
"scale": [0.4, 0.4, 0.4]
|
||||
},
|
||||
"ground": {
|
||||
"translation": [0, 3, 0],
|
||||
"scale": [0.25, 0.25, 0.25]
|
||||
},
|
||||
"gui": {
|
||||
"rotation": [30, -135, 0],
|
||||
"scale": [0.625, 0.625, 0.625]
|
||||
},
|
||||
"fixed": {
|
||||
"scale": [0.5, 0.5, 0.5]
|
||||
}
|
||||
}
|
||||
}
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"parent": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_5",
|
||||
"textures": {
|
||||
"8": "cobblemon:block/mod_station/display_case/display_case_pillow_6"
|
||||
}
|
||||
}
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"parent": "cobblemon:block/mod_station/display_case/display_case_stone_glass_color_5",
|
||||
"textures": {
|
||||
"8": "cobblemon:block/mod_station/display_case/display_case_pillow_7"
|
||||
}
|
||||
}
|
||||
Loaded 100 of 373 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user