Compare commits

...
373 changed files with 8041 additions and 16 deletions

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)
}
}
}
@@ -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
)
@@ -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
}
}
}
@@ -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"
}
}
@@ -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() {
@@ -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
}
}
@@ -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 {
@@ -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)
@@ -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
}
}
@@ -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
}
@@ -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?
}
@@ -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
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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
}
}
}
@@ -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",
@@ -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"
}
}
@@ -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"
}
}
@@ -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"
}
}
@@ -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"
}
}
@@ -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"
}
}
@@ -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"
}
}
@@ -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"
}
}
@@ -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"
}
}
@@ -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"
}
}
@@ -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"
}
}
@@ -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"
}
}
@@ -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]
}
}
}
@@ -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"
}
}
@@ -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