Compare commits

..
Author SHA1 Message Date
JazzMcNade 6ba2804a46 Added type checking 2024-05-14 00:46:40 -05:00
JazzMcNade d13d5183c8 Implemented missing functions. 2024-05-14 00:24:09 -05:00
494 changed files with 1768 additions and 20741 deletions

No files matched your search

-1
View File
@@ -36,7 +36,6 @@ common/src/main/resources/assets/cobblemon/showdown
*/generated/resources/*
/fabric/src/generated/resources/cobblemon-common.accesswidener
/.ignored/
common/.fabric
# MacOS
.DS_Store
+2 -36
View File
@@ -2,44 +2,10 @@
## [1.5.1](#1-5-1)
### Additions
- Added unique send out particles for Cherish, Dream, Beast, and Ancient Origin balls.
- Made Wooloo and Dubwool dye-able like sheep
### Changes
- Sounds for Relic Coin Sacks have been correctly renamed. Relic Coin Pouches received new sounds for breaking and placing.
- Readjusted Petilil portraits
- Changed "dimensions" spawn condition to check with dimension IDs instead of effects, so custom dimension IDs can be used.
### Fixes
- Fixed a bug in which adding organic material to the fossil tank via right click was adding the full count of the stack currently in hand
- Fixed a niche issue where some properties of entities were not initialized correctly, causing Pokémon that appeared to be level 1 until you battle them.
- Fixed Fossilized Drake being missing from the Fossils item tag.
- Fixed Gilded Chest block entity not being cleared on block break
- Fixed sherd brokenness on Forge/Supplementaries incompat
- Fixed Fossil Compartment crash with Jade / WAILA forks
- Fixed PCStore#resize not allowing PC boxes size reduction.
- Fixed pasture block PC lookups when the player is offline.
- Fixed an untranslated battle message that occurs when using a move that just ran out of PP (e.g. Fire Blast that just got spited mid-turn).
- Fixed held items being eaten even when the held item evolutions are already unlocked.
- Fixed Hisuian Decidueye not being Grass/Fighting
- Fixed both Decidueye forms learning both Triple Arrows and Spirit Shackle
- Fixed Pineco being unable to evolve into Shulker Forretress
- Fixed Kabutops T-posing when underwater. It still does not have proper swimming animations yet though.
- Fixed Pidgey's missing walk animation.
- Fixed recoil evo condition.
- Fixed issue where poser debug tools didnt work on JSON posers
- Fixed issue where gilded chests dont close when going far away
-Fixed a bug in which adding organic material to the fossil tank via right click was adding the full count of the stack currently in hand
### Developer
- Changed SpawnAction#complete to return a nullable generic R (the spawn action result) instead of a boolean. More information this way.
### Data Pack & Resource Pack Creators
- Added support for MoLang conditions for quirks and poses.
- Changed the AttackDefenceRatio requirement to StatCompare and StatEqual.
## [1.5.0 - The Ruins and Revival Update (May 12th, 2024)](#1-5-0)
## [1.5.0 - The Ruins and Revival Update (May Xth, 2024)](#1-5-0)
#### "You're telling me that Mojang has added archaeology to the game? Hmm... that gives me an idea."
### Additions
@@ -102,6 +102,7 @@ import com.cobblemon.mod.common.pokemon.properties.HiddenAbilityPropertyType
import com.cobblemon.mod.common.pokemon.properties.UncatchableProperty
import com.cobblemon.mod.common.pokemon.properties.tags.PokemonFlagProperty
import com.cobblemon.mod.common.pokemon.stat.CobblemonStatProvider
import com.cobblemon.mod.common.sherds.CobblemonSherds
import com.cobblemon.mod.common.starter.CobblemonStarterHandler
import com.cobblemon.mod.common.trade.TradeManager
import com.cobblemon.mod.common.util.DataKeys
@@ -188,7 +189,6 @@ object Cobblemon {
implementation.registerEntityAttributes()
implementation.registerBlockEntityTypes()
implementation.registerWorldGenFeatures()
implementation.registerFoliagePlacers()
implementation.registerParticles()
DropEntry.register("command", CommandDropEntry::class.java)
@@ -235,7 +235,7 @@ object Cobblemon {
val player = event.player
val block = player.world.getBlockState(event.pos).block
player.party().forEach { pokemon ->
pokemon.lockedEvolutions
pokemon.evolutions
.filterIsInstance<BlockClickEvolution>()
.forEach { evolution ->
evolution.attemptEvolution(pokemon, BlockClickEvolution.BlockInteractionContext(block, player.world))
@@ -416,6 +416,7 @@ object Cobblemon {
).ifSuccessful { it.mute = true }
}
CobblemonSherds.registerSherds()
}
fun getLevel(dimension: RegistryKey<World>): World? {
@@ -234,7 +234,7 @@ object CobblemonBlocks : PlatformRegistry<Registry<Block>, RegistryKey<Registry<
"relic_coin_pouch",
CoinPouchBlock(
AbstractBlock.Settings.create()
.sounds(CobblemonSounds.RELIC_COIN_POUCH_SOUNDS)
.sounds(CobblemonSounds.COIN_POUCH_SOUNDS)
.pistonBehavior(PistonBehavior.DESTROY)
.strength(0.4f)
.nonOpaque(), true
@@ -245,7 +245,7 @@ object CobblemonBlocks : PlatformRegistry<Registry<Block>, RegistryKey<Registry<
"relic_coin_sack",
CoinPouchBlock(
AbstractBlock.Settings.create()
.sounds(CobblemonSounds.RELIC_COIN_SACK_SOUNDS)
.sounds(CobblemonSounds.COIN_POUCH_SOUNDS)
.pistonBehavior(PistonBehavior.DESTROY)
.strength(0.4f), false
))
@@ -528,7 +528,6 @@ object CobblemonBlocks : PlatformRegistry<Registry<Block>, RegistryKey<Registry<
val WEPEAR_BERRY = this.berryBlock("wepear")
val WIKI_BERRY = this.berryBlock("wiki")
val YACHE_BERRY = this.berryBlock("yache")
//val BINDING_SOIL = this.create("binding_soil", BindingSoilBlock(AbstractBlock.Settings.create()))
init {
/**
@@ -106,8 +106,6 @@ interface CobblemonImplementation {
*/
fun registerWorldGenFeatures()
fun registerFoliagePlacers()
fun registerParticles()
/**
@@ -23,7 +23,6 @@ import com.cobblemon.mod.common.item.armor.CobblemonArmorTrims
import com.cobblemon.mod.common.item.battle.DireHitItem
import com.cobblemon.mod.common.item.battle.GuardSpecItem
import com.cobblemon.mod.common.item.battle.XStatItem
import com.cobblemon.mod.common.item.berry.BerryItem
import com.cobblemon.mod.common.item.berry.FriendshipRaisingBerryItem
import com.cobblemon.mod.common.item.berry.HealingBerryItem
import com.cobblemon.mod.common.item.berry.PPRestoringBerryItem
@@ -986,8 +985,6 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, RegistryKey<Registry<It
val STEEL_GEM = noSettingsItem("steel_gem")
@JvmField
val FAIRY_GEM = noSettingsItem("fairy_gem")
//@JvmField
//val BINDING_SOIL = blockItem("binding_soil", CobblemonBlocks.BINDING_SOIL)
private fun blockItem(name: String, block: Block): BlockItem = this.create(name, BlockItem(block, Item.Settings()))
@@ -122,18 +122,13 @@ object CobblemonSounds : PlatformRegistry<Registry<SoundEvent>, RegistryKey<Regi
val FOSSIL_MACHINE_UNPROTECTED = this.create("fossil_machine.unprotected")
@JvmField
val RELIC_COIN_SACK_BREAK = this.create("relic_coin_sack.break")
val COIN_POUCH_BREAK = this.create("coin_pouch.break")
@JvmField
val RELIC_COIN_SACK_HIT = this.create("relic_coin_sack.hit")
val COIN_POUCH_HIT = this.create("coin_pouch.hit")
@JvmField
val RELIC_COIN_SACK_STEP = this.create("relic_coin_sack.step")
val COIN_POUCH_STEP = this.create("coin_pouch.step")
@JvmField
val RELIC_COIN_SACK_PLACE = this.create("relic_coin_sack.place")
@JvmField
val RELIC_COIN_POUCH_BREAK = this.create("relic_coin_pouch.break")
@JvmField
val RELIC_COIN_POUCH_PLACE = this.create("relic_coin_pouch.place")
val COIN_POUCH_PLACE = this.create("coin_pouch.place")
@JvmField
val TUMBLESTONE_BREAK = this.create("tumblestone.break")
@JvmField
@@ -194,22 +189,13 @@ object CobblemonSounds : PlatformRegistry<Registry<SoundEvent>, RegistryKey<Regi
val GILDED_CHEST_PLACE = this.create("gilded_chest.place")
@JvmField
val RELIC_COIN_SACK_SOUNDS = BlockSoundGroup(1f, 1f,
RELIC_COIN_SACK_BREAK,
RELIC_COIN_SACK_STEP,
RELIC_COIN_SACK_PLACE,
RELIC_COIN_SACK_HIT,
RELIC_COIN_SACK_STEP
val COIN_POUCH_SOUNDS = BlockSoundGroup(1f, 1f,
COIN_POUCH_BREAK,
COIN_POUCH_STEP,
COIN_POUCH_PLACE,
COIN_POUCH_HIT,
COIN_POUCH_STEP
)
@JvmField
val RELIC_COIN_POUCH_SOUNDS = BlockSoundGroup(1f, 1f,
RELIC_COIN_POUCH_BREAK,
RELIC_COIN_SACK_STEP,
RELIC_COIN_POUCH_PLACE,
RELIC_COIN_SACK_HIT,
RELIC_COIN_SACK_STEP
)
@JvmField
val IMPACT_NORMAL = this.create("impact.normal")
@JvmField
@@ -226,7 +226,7 @@ open class PokemonBattle(
val facedFainted = opponentPokemon.facedOpponents.contains(faintedPokemon)
val pokemon = opponentPokemon.effectedPokemon
if (facedFainted) {
pokemon.lockedEvolutions.forEach { evolution ->
pokemon.evolutions.forEach { evolution ->
evolution.requirements.filterIsInstance<DefeatRequirement>().forEach { defeatRequirement ->
if (defeatRequirement.target.matches(faintedPokemon.effectedPokemon)) {
val progress = pokemon.evolutionProxy.current().progressFirstOrCreate({ it is DefeatEvolutionProgress && it.currentProgress().target == defeatRequirement.target }) { DefeatEvolutionProgress() }
@@ -16,7 +16,7 @@ import com.cobblemon.mod.common.api.events.berry.BerryYieldCalculationEvent
import com.cobblemon.mod.common.api.mulch.MulchVariant
import com.cobblemon.mod.common.block.BerryBlock
import com.cobblemon.mod.common.block.entity.BerryBlockEntity
import com.cobblemon.mod.common.item.berry.BerryItem
import com.cobblemon.mod.common.item.BerryItem
import com.cobblemon.mod.common.pokemon.Nature
import com.cobblemon.mod.common.util.readBox
import com.cobblemon.mod.common.util.writeBox
@@ -45,8 +45,9 @@ import net.minecraft.world.biome.Biome
* @property identifier The [Identifier] of this berry.
* @property baseYield The [IntRange] possible for the berry tree before [bonusYield] is calculated.
* @property preferredBiomeTags The [TagKey]s of the berries preffered biomes. Determines spawning and yield
* @property growthTime The [IntRange] possible in minutes for how long the berry tree takes to grow frome age 0 to age 3
* @property refreshRate The [IntRange] possible in minutes for how long the berry tree takes to grow from age 3 to age 5
* @property growthTime The [IntRange] possible in minutes for how long the berry tree takes to grow.
* @property refreshRate The [IntRange] possible in minutes for how long the berry tree takes to regrow its berries once it has been harvested.
* @depreciated @property lifeCycles The [IntRange] possible for the berry to live for between harvests.
* @property favoriteMulches The types of mulches that benefit this berries yield
* @property growthFactors An array of [GrowthFactor]s that will affect this berry. The client is not aware of these.
* @property mutations A map of the partner berry as the key and the value as the resulting mutation with this berry.
@@ -59,7 +60,6 @@ import net.minecraft.world.biome.Biome
* @property flowerTexture The [Identifier] for the texture of the berry in flower form. This is resolved into a [ModelPart] on the client.
* @property fruitModelIdentifier The [Identifier] for the model of the berry in flower form. This is resolved into a [ModelPart] on the client.
* @property fruitTexture The [Identifier] for the texture of the berry in flower form.
* @property stageOnePositioning Transformation of the berry model for age 0
*
* @throws IllegalArgumentException if the any yield range argument is not a positive range.
*/
@@ -69,6 +69,7 @@ class Berry(
val preferredBiomeTags: List<TagKey<Biome>>,
val growthTime: IntRange,
val refreshRate: IntRange,
//val lifeCycles: IntRange,
val favoriteMulches: EnumSet<MulchVariant>,
val growthFactors: Collection<GrowthFactor>,
val spawnConditions: List<BerrySpawnCondition>,
@@ -87,7 +88,6 @@ class Berry(
@SerializedName("fruitModel")
val fruitModelIdentifier: Identifier,
val fruitTexture: Identifier,
val stageOnePositioning: GrowthPoint,
val weight: Float
) {
@@ -162,8 +162,7 @@ class Berry(
var yield = base + bonus.first
val treeEntity = world.getBlockEntity(pos) as BerryBlockEntity
if (BerryBlock.getMulch(state) == MulchVariant.RICH) {
//I hope the upper bound isnt exclusive, especially when there's a method called nextBetweenExclusive
yield += world.random.nextBetween(1, 2)
yield = min(yield + 1, maxYield())
treeEntity.decrementMulchDuration(world, pos, state)
}
val event = BerryYieldCalculationEvent(this, world, state, pos, placer, yield, bonus.second)
@@ -280,12 +279,6 @@ class Berry(
buffer.writeIdentifier(this.flowerTexture)
buffer.writeIdentifier(this.fruitModelIdentifier)
buffer.writeIdentifier(this.fruitTexture)
buffer.writeDouble(stageOnePositioning.position.x)
buffer.writeDouble(stageOnePositioning.position.y)
buffer.writeDouble(stageOnePositioning.position.z)
buffer.writeDouble(stageOnePositioning.rotation.x)
buffer.writeDouble(stageOnePositioning.rotation.y)
buffer.writeDouble(stageOnePositioning.rotation.z)
}
/**
@@ -346,8 +339,7 @@ class Berry(
val flowerTexture = buffer.readIdentifier()
val fruitModelIdentifier = buffer.readIdentifier()
val fruitTexture = buffer.readIdentifier()
val stageOneYPos = GrowthPoint(Vec3d(buffer.readDouble(), buffer.readDouble(), buffer.readDouble()), Vec3d(buffer.readDouble(), buffer.readDouble(), buffer.readDouble()))
return Berry(identifier, baseYield, emptyList(), growthTime, refreshRate, favMulchs, emptySet(), emptyList(), growthPoints, randomizedGrowthPoints, mutations, sproutShapeBoxes, matureShapeBoxes, flavors, tintIndexes, flowerModelIdentifier, flowerTexture, fruitModelIdentifier, fruitTexture, stageOneYPos, 0F)
return Berry(identifier, baseYield, emptyList(), growthTime, refreshRate, favMulchs, emptySet(), emptyList(), growthPoints, randomizedGrowthPoints, mutations, sproutShapeBoxes, matureShapeBoxes, flavors, tintIndexes, flowerModelIdentifier, flowerTexture, fruitModelIdentifier, fruitTexture, 0F)
}
}
@@ -16,11 +16,11 @@ import net.minecraft.util.StringIdentifiable
*/
enum class MulchVariant(val duration: Int = -1) : StringIdentifiable {
COARSE,
GROWTH(5),
GROWTH(3),
HUMID,
LOAMY,
PEAT,
RICH(5),
RICH(3),
SANDY,
SURPRISE(3),
NONE;
@@ -28,8 +28,4 @@ enum class MulchVariant(val duration: Int = -1) : StringIdentifiable {
override fun asString(): String {
return name.lowercase()
}
companion object {
const val GROWTH_TIME_MULTIPLIER = 0.5
}
}
@@ -52,24 +52,21 @@ abstract class MultiblockBlock(properties: Settings) : BlockWithEntity(propertie
if(hand == Hand.OFF_HAND) {
return ActionResult.SUCCESS
}
if (!world.isClient) {
val entity = world.getBlockEntity(pos) as MultiblockEntity?
if (entity?.multiblockStructure != null) {
return entity.multiblockStructure!!.onUse(state, world, pos, player, hand, hit)
}
val entity = world.getBlockEntity(pos) as MultiblockEntity?
if (entity?.multiblockStructure != null) {
return entity.multiblockStructure!!.onUse(state, world, pos, player, hand, hit)
}
return super.onUse(state, world, pos, player, hand, hit)
}
override fun onBreak(world: World, pos: BlockPos, state: BlockState, player: PlayerEntity?) {
super.onBreak(world, pos, state, player)
if (!world.isClient) {
val entity = world.getBlockEntity(pos)
if (entity is MultiblockEntity && entity.multiblockStructure != null) {
entity.multiblockStructure!!.onBreak(world, pos, state, player)
}
entity?.markRemoved()
}
super.onBreak(world, pos, state, player)
}
override fun createBlockEntity(pos: BlockPos, state: BlockState): BlockEntity? {
@@ -81,7 +78,6 @@ abstract class MultiblockBlock(properties: Settings) : BlockWithEntity(propertie
return BlockRenderType.MODEL
}
//This is done so a block picked with NBT doesnt absolutely DESTROY multiblocks
override fun getPickStack(world: BlockView, pos: BlockPos, state: BlockState): ItemStack {
val blockEntity = world.getBlockEntity(pos) as? MultiblockEntity ?: return ItemStack.EMPTY
return if (blockEntity.multiblockStructure == null) super.getPickStack(world, pos, state) else ItemStack.EMPTY
@@ -153,7 +153,7 @@ interface Evolution : EvolutionLike {
pokemon.getOwnerPlayer()?.sendMessage(lang("experience.learned_move", pokemon.getDisplayName(), move.displayName))
}
// we want to instantly tick for example you might only evolve your Bulbasaur at level 34 so Venusaur should be immediately available
pokemon.lockedEvolutions.filterIsInstance<PassiveEvolution>().forEach { evolution -> evolution.attemptEvolution(pokemon) }
pokemon.evolutions.filterIsInstance<PassiveEvolution>().forEach { evolution -> evolution.attemptEvolution(pokemon) }
pokemon.getOwnerPlayer()?.playSound(CobblemonSounds.EVOLVING, SoundCategory.NEUTRAL, 1F, 1F)
CobblemonEvents.EVOLUTION_COMPLETE.post(EvolutionCompleteEvent(pokemon, this))
}
@@ -78,7 +78,7 @@ abstract class SpawningCondition<T : SpawningContext> {
return false
} else if (ctx.position.z < minZ.orMin() || ctx.position.z > maxZ.orMax()) {
return false
} else if (dimensions != null && dimensions!!.isNotEmpty() && ctx.world.dimensionKey.value !in dimensions!!) {
} else if (dimensions != null && dimensions!!.isNotEmpty() && ctx.world.dimension.effects !in dimensions!!) {
return false
} else if (moonPhase != null && ctx.moonPhase !in moonPhase!!) {
return false
@@ -34,19 +34,15 @@ abstract class SpawnAction<R>(
/**
* Runs the spawn action and processes any non-null result.
*/
open fun complete(): R? {
if (future.isDone) {
return null
}
open fun complete(): Boolean {
ctx.influences.forEach { it.affectAction(this) }
val result = run()
if (result != null) {
return if (result != null) {
future.complete(result)
true
} else {
future.completeExceptionally(Exception("Nothing was spawned."))
false
}
return result
}
}
@@ -124,7 +124,7 @@ open class PlayerPartyStore(
}
// Passive evolutions
pokemon.lockedEvolutions.filterIsInstance<PassiveEvolution>().forEach { it.attemptEvolution(pokemon) }
pokemon.evolutions.filterIsInstance<PassiveEvolution>().forEach { it.attemptEvolution(pokemon) }
val removeList = mutableListOf<Evolution>()
pokemon.evolutionProxy.server().forEach {
if (!it.test(pokemon) && it is LevelUpEvolution && !it.permanent)
@@ -99,7 +99,7 @@ open class PCStore(
this.lockedSize = lockNewSize
if (boxes.size > newSize) {
// reduce
val slicedBoxes = boxes.slice(newSize until boxes.size)
val slicedBoxes = boxes.slice(boxes.size until newSize)
boxes.removeAll(slicedBoxes)
slicedBoxes.flatMap { it.asIterable() }.forEach(overflowHandler)
} else {
@@ -54,8 +54,8 @@ class DamageInstruction(
if (recoiling) {
battlePokemon.effectedPokemon.let { pokemon ->
if (RecoilEvolutionProgress.supports(pokemon)) {
val healthStr = privateMessage.argumentAt(1) ?: throw UnsupportedOperationException("Cant get recoil string")
val newHealth = "([0-9]+).*".toRegex().find(healthStr)?.groups?.get(1)?.value?.toIntOrNull() ?: throw UnsupportedOperationException("Cant get recoil string")
val newPercentage = privateMessage.argumentAt(1)?.split("/")?.getOrNull(0)?.toIntOrNull() ?: 0
val newHealth = (pokemon.hp * (newPercentage / 100.0)).roundToInt()
val difference = pokemon.currentHealth - newHealth
if (difference > 0) {
val progress = pokemon.evolutionProxy.current().progressFirstOrCreate({ it is RecoilEvolutionProgress }) { RecoilEvolutionProgress() }
@@ -89,7 +89,6 @@ class BerryBlock(private val berryIdentifier: Identifier, settings: Settings) :
.with(WAS_GENERATED, false)
.with(AGE, 0)
.with(MULCH, MulchVariant.NONE)
.with(IS_ROOTED, false)
}
override fun grow(world: ServerWorld, random: Random, pos: BlockPos, state: BlockState) {
@@ -144,9 +143,7 @@ class BerryBlock(private val berryIdentifier: Identifier, settings: Settings) :
state: BlockState,
variant: MulchVariant
): Boolean {
val underBlockState = world.getBlockState(pos.down())
val validSoil = state.get(IS_ROOTED) || underBlockState.isIn(CobblemonBlockTags.BERRY_SOIL)
return getMulch(state) == MulchVariant.NONE && state.get(AGE) < FLOWER_AGE && validSoil
return getMulch(state) == MulchVariant.NONE && state.get(AGE) < FLOWER_AGE && world.getBlockState(pos.down()).isOf(Blocks.FARMLAND)
}
override fun applyMulch(
@@ -192,7 +189,7 @@ class BerryBlock(private val berryIdentifier: Identifier, settings: Settings) :
val below = world.getBlockState(pos.down())
return (state.get(WAS_GENERATED) && below.isIn(CobblemonBlockTags.BERRY_WILD_SOIL))
|| below.isIn(CobblemonBlockTags.BERRY_SOIL)
|| state.get(IS_ROOTED)
|| below.block is FarmlandBlock
}
@Deprecated("Deprecated in Java")
@@ -211,7 +208,6 @@ class BerryBlock(private val berryIdentifier: Identifier, settings: Settings) :
builder.add(AGE)
builder.add(WAS_GENERATED)
builder.add(MULCH)
builder.add(IS_ROOTED)
}
override fun getPickStack(world: BlockView?, pos: BlockPos?, state: BlockState?): ItemStack {
@@ -243,7 +239,6 @@ class BerryBlock(private val berryIdentifier: Identifier, settings: Settings) :
val AGE: IntProperty = IntProperty.of("age", 0, FRUIT_AGE)
val MULCH: EnumProperty<MulchVariant> = EnumProperty.of("mulch", MulchVariant::class.java)
val WAS_GENERATED: BooleanProperty = BooleanProperty.of("generated")
val IS_ROOTED: BooleanProperty = BooleanProperty.of("rooted")
// val PLANTED_SHAPE = VoxelShapes.union(
// VoxelShapes.cuboid(0.3125, -0.0625, 0.3125, 0.6875, 0.0, 0.6875),
// VoxelShapes.cuboid(0.375, 0.0, 0.375, 0.625, 0.0625, 0.625)
@@ -1,49 +0,0 @@
/*
* 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.entity.BerryBlockEntity
import com.cobblemon.mod.common.item.berry.BerryItem
import net.minecraft.block.AbstractBlock
import net.minecraft.block.Block
import net.minecraft.block.BlockState
import net.minecraft.entity.player.PlayerEntity
import net.minecraft.util.ActionResult
import net.minecraft.util.Hand
import net.minecraft.util.hit.BlockHitResult
import net.minecraft.util.math.BlockPos
import net.minecraft.world.World
/**
* @author Apion
* @since February 27, 2024
*/
class BindingSoilBlock(settings: Settings) : Block(settings) {
@Deprecated("Deprecated in Java")
override fun onUse(
state: BlockState,
world: World,
pos: BlockPos,
player: PlayerEntity,
hand: Hand,
hit: BlockHitResult
): ActionResult {
if (!world.isClient) {
val itemStack = player.getStackInHand(hand)
val item = itemStack.item
if (item is BerryItem) {
world.setBlockState(pos, item.block.defaultState.with(BerryBlock.IS_ROOTED, true))
if (!player.isCreative) {
itemStack.decrement(1)
}
}
}
return ActionResult.SUCCESS
}
}
@@ -38,7 +38,6 @@ import net.minecraft.util.shape.VoxelShapes
import net.minecraft.world.BlockView
import net.minecraft.world.World
import net.minecraft.world.WorldAccess
import net.minecraft.world.WorldEvents
import net.minecraft.world.WorldView
@@ -73,12 +72,10 @@ class RestorationTankBlock(properties: Settings) : MultiblockBlock(properties),
override fun onBreak(world: World, pos: BlockPos, state: BlockState, player: PlayerEntity?) {
super.onBreak(world, pos, state, player)
if (!world.isClient) {
val otherPart = world.getBlockState(getPositionOfOtherPart(state, pos))
if (otherPart.block is RestorationTankBlock) {
world.setBlockState(getPositionOfOtherPart(state, pos), Blocks.AIR.defaultState, Block.NOTIFY_ALL)
world.syncWorldEvent(player, WorldEvents.BLOCK_BROKEN, getPositionOfOtherPart(state, pos), getRawIdFromState(otherPart))
}
val otherPart = world.getBlockState(getPositionOfOtherPart(state, pos))
if (otherPart.block is RestorationTankBlock) {
world.setBlockState(getPositionOfOtherPart(state, pos), Blocks.AIR.defaultState, 35)
world.syncWorldEvent(player, 2001, getPositionOfOtherPart(state, pos), getRawIdFromState(otherPart))
}
}
@@ -90,9 +87,9 @@ class RestorationTankBlock(properties: Settings) : MultiblockBlock(properties),
itemStack: ItemStack?
) {
//Place the full block before we call to super to validate the multiblock
world.setBlockState(pos.up(), state.with(PART, TankPart.TOP) as BlockState, Block.NOTIFY_ALL)
world.setBlockState(pos.up(), state.with(PART, TankPart.TOP) as BlockState, 3)
world.updateNeighbors(pos, Blocks.AIR)
state.updateNeighbors(world, pos, Block.NOTIFY_ALL)
state.updateNeighbors(world, pos, 3)
super.onPlaced(world, pos, state, placer, itemStack)
}
@@ -103,7 +100,7 @@ class RestorationTankBlock(properties: Settings) : MultiblockBlock(properties),
val tankBottomPos = pos.down()
val tankBottomState = world.getBlockState(tankBottomPos)
if(tankBottomState.block.equals(CobblemonBlocks.RESTORATION_TANK.asBlock()) && tankBottomState.get(PART) == TankPart.BOTTOM) {
return onUse(tankBottomState, world, tankBottomPos, player, hand, hit)
return super.onUse(tankBottomState, world, tankBottomPos, player, hand, hit)
}
}
return super.onUse(state, world, pos, player, hand, hit)
@@ -27,7 +27,6 @@ import net.minecraft.item.ItemPlacementContext
import net.minecraft.item.ItemStack
import net.minecraft.screen.ScreenHandler
import net.minecraft.server.network.ServerPlayerEntity
import net.minecraft.server.world.ServerWorld
import net.minecraft.sound.SoundCategory
import net.minecraft.state.StateManager
import net.minecraft.state.property.BooleanProperty
@@ -38,7 +37,6 @@ import net.minecraft.util.*
import net.minecraft.util.hit.BlockHitResult
import net.minecraft.util.math.BlockPos
import net.minecraft.util.math.Direction
import net.minecraft.util.math.random.Random
import net.minecraft.util.shape.VoxelShape
import net.minecraft.util.shape.VoxelShapes
import net.minecraft.world.BlockView
@@ -127,13 +125,11 @@ class GildedChestBlock(settings: Settings, val type: Type = Type.RED) : BlockWit
fun isFake() = (type == Type.FAKE)
override fun onBreak(world: World, pos: BlockPos, state: BlockState, player: PlayerEntity) {
if (!world.isClient) {
if (isFake() && (player is ServerPlayerEntity)) {
if (isFake()) {
if (player is ServerPlayerEntity) {
spawnPokemon(world, pos, state, player)
}
world.setBlockState(pos, if (state.fluidState.isOf(Fluids.WATER)) Blocks.WATER.defaultState else Blocks.AIR.defaultState)
val bEntity = world.getBlockEntity(pos) as? GildedChestBlockEntity
bEntity?.markRemoved()
} else super.onBreak(world, pos, state, player)
}
@@ -201,11 +197,9 @@ class GildedChestBlock(settings: Settings, val type: Type = Type.RED) : BlockWit
newState: BlockState,
moved: Boolean
) {
if (!state.isOf(newState.block) && !world.isClient) {
val chest = world.getBlockEntity(pos) as? GildedChestBlockEntity
chest?.let {
ItemScatterer.spawn(world, pos, chest.inventoryContents)
}
if (!state.isOf(newState.block)) {
val chest = world.getBlockEntity(pos) as GildedChestBlockEntity
ItemScatterer.spawn(world, pos, chest.inventoryContents)
}
}
@@ -267,14 +261,4 @@ class GildedChestBlock(settings: Settings, val type: Type = Type.RED) : BlockWit
}
}
override fun scheduledTick(
state: BlockState?,
world: ServerWorld?,
pos: BlockPos?,
random: Random?
) {
val blockEntity = world?.getBlockEntity(pos) as? GildedChestBlockEntity ?: return
blockEntity.onScheduledTick()
}
}
@@ -43,8 +43,8 @@ class BerryBlockEntity(pos: BlockPos, state: BlockState) : BlockEntity(Cobblemon
lateinit var berryIdentifier: Identifier
private val ticksPerMinute = 1200
var renderState: RenderState? = null
//The time left for the tree until its either age 3 or age 5 (check block state, if we are at age 0<x<3 unti 3 otherwise until 5)
var growthTimer: Int = 0
//The time left for the tree to grow to stage 5
var growthTimer: Int = 72000
set(value) {
if (value < 0) {
throw IllegalArgumentException("You cannot set the growth time to less than zero")
@@ -55,7 +55,7 @@ class BerryBlockEntity(pos: BlockPos, state: BlockState) : BlockEntity(Cobblemon
field = value
}
//The time left for the tree to grow to the next stage
var stageTimer: Int = 0
var stageTimer: Int = growthTimer / BerryBlock.MATURE_AGE
set(value) {
if (field != value) {
this.markDirty()
@@ -107,8 +107,6 @@ class BerryBlockEntity(pos: BlockPos, state: BlockState) : BlockEntity(Cobblemon
}
}
//This function basically runs twice when the berry tree is growing, once when it starts, once when it hits age 3
//Why dont we just go 0-5? Design thinks its annoying to balance the numbers using 0-5 and 3-5
fun resetGrowTimers(pos: BlockPos, state: BlockState) {
val curAge = state.get(BerryBlock.AGE)
if (curAge == 5) {
@@ -121,14 +119,12 @@ class BerryBlockEntity(pos: BlockPos, state: BlockState) : BlockEntity(Cobblemon
val upperGrowthLimit = (if (curAge == 0) berry.growthTime.last else berry.refreshRate.last) * multiplier / 10
val growthRange = lowerGrowthLimit..upperGrowthLimit
this.growthTimer = this.applyMulchModifier(pos, growthRange.random() * ticksPerMinute, true)
val stagesLeft = if (curAge < 3) BerryBlock.MATURE_AGE - curAge else BerryBlock.FRUIT_AGE - curAge
this.goToNextStageTimer(stagesLeft)
this.growthTimer = this.applyMulchModifier(pos, growthRange.random() * ticksPerMinute)
this.goToNextStageTimer(BerryBlock.FRUIT_AGE - curAge)
}
fun goToNextStageTimer(stagesLeft: Int) {
val avgStageTime = growthTimer / stagesLeft
//A number between 80% and 100% the average stage time
stageTimer = this.world?.random?.nextBetween((avgStageTime * 8) / 10, avgStageTime) ?:
(((Math.random() * 0.2) + 0.8) * avgStageTime).toInt()
growthTimer -= stageTimer
@@ -141,7 +137,7 @@ class BerryBlockEntity(pos: BlockPos, state: BlockState) : BlockEntity(Cobblemon
* @param timer Timer to be modified
* @return The modified timer
*/
private fun applyMulchModifier(pos: BlockPos, timer: Int, decrementMulch: Boolean = false): Int {
private fun applyMulchModifier(pos: BlockPos, timer: Int): Int {
val state = world?.getBlockState(pos) ?: return timer
val curAge = state.get(BerryBlock.AGE)
@@ -152,12 +148,8 @@ class BerryBlockEntity(pos: BlockPos, state: BlockState) : BlockEntity(Cobblemon
if (getMulch(state) != MulchVariant.GROWTH) {
return timer
}
if (decrementMulch) {
world?.let {
decrementMulchDuration(it, pos, state)
}
}
return (timer * MulchVariant.GROWTH_TIME_MULTIPLIER).toInt()
return (timer * 0.66).toInt()
}
/**
@@ -331,9 +323,8 @@ class BerryBlockEntity(pos: BlockPos, state: BlockState) : BlockEntity(Cobblemon
companion object {
internal val TICKER = BlockEntityTicker<BerryBlockEntity> { world, pos, state, blockEntity ->
if (world.isClient) return@BlockEntityTicker
if (state.get(BerryBlock.IS_ROOTED)) return@BlockEntityTicker
if (blockEntity.stageTimer >= 0) {
//blockEntity.stageTimer--
blockEntity.stageTimer--
}
if (blockEntity.stageTimer == 0) {
(state.block as BerryBlock).grow(world as ServerWorld, world.random, pos, state)
@@ -56,20 +56,23 @@ class FossilAnalyzerBlockEntity(
return ItemStack.EMPTY
}
//Unimplemented since no extract
override fun removeStack(slot: Int, amount: Int): ItemStack {
return removeStack(slot)
if (analyzerEntity.multiblockStructure != null && analyzerEntity.multiblockStructure is FossilMultiblockStructure) {
val fossilMultiblockStructure = analyzerEntity.multiblockStructure as FossilMultiblockStructure
if (fossilMultiblockStructure.fossilInventory.size > slot) {
return fossilMultiblockStructure.fossilInventory[slot]
}
}
return ItemStack.EMPTY
}
override fun removeStack(slot: Int): ItemStack {
// if(analyzerEntity.multiblockStructure is FossilMultiblockStructure) {
// val fossilMultiblockStructure = analyzerEntity.multiblockStructure as FossilMultiblockStructure
// if (fossilMultiblockStructure.fossilInventory.size > slot) {
// val itemStack = fossilMultiblockStructure.fossilInventory.removeAt(slot)
// markDirty()
// return itemStack
// }
// }
if(analyzerEntity.multiblockStructure is FossilMultiblockStructure) {
val fossilMultiblockStructure = analyzerEntity.multiblockStructure as FossilMultiblockStructure
if (fossilMultiblockStructure.fossilInventory.size > slot) {
return fossilMultiblockStructure.fossilInventory.removeAt(slot)
}
}
return ItemStack.EMPTY
}
@@ -96,7 +99,7 @@ class FossilAnalyzerBlockEntity(
if(analyzerEntity.multiblockStructure != null && analyzerEntity.multiblockStructure is FossilMultiblockStructure) {
return intArrayOf(0,1,2)
}
return IntArray(0)
return IntArray(1)
}
override fun canInsert(slot: Int, stack: ItemStack?, dir: Direction?): Boolean {
@@ -111,8 +114,8 @@ class FossilAnalyzerBlockEntity(
}
override fun canExtract(slot: Int, stack: ItemStack?, dir: Direction?): Boolean {
// return analyzerEntity.multiblockStructure != null && analyzerEntity.multiblockStructure is FossilMultiblockStructure && dir == Direction.DOWN
return false
}
}
}
@@ -20,7 +20,6 @@ import net.minecraft.entity.player.PlayerEntity
import net.minecraft.entity.player.PlayerInventory
import net.minecraft.inventory.DoubleInventory
import net.minecraft.inventory.Inventories
import net.minecraft.inventory.Inventory
import net.minecraft.inventory.SidedInventory
import net.minecraft.item.ItemStack
import net.minecraft.nbt.NbtCompound
@@ -59,7 +58,9 @@ class GildedChestBlockEntity(pos: BlockPos, state: BlockState, val type: Type =
override fun isPlayerViewing(player: PlayerEntity): Boolean {
if (player.currentScreenHandler is GenericContainerScreenHandler) {
val inventory = (player.currentScreenHandler as GenericContainerScreenHandler).inventory
return inventory === this@GildedChestBlockEntity
return inventory === this@GildedChestBlockEntity || inventory is DoubleInventory && inventory.isPart(
this@GildedChestBlockEntity
)
}
return false
}
@@ -98,6 +99,8 @@ class GildedChestBlockEntity(pos: BlockPos, state: BlockState, val type: Type =
return dir == Direction.DOWN
}
override fun canPlayerUse(player: PlayerEntity) = !player.isSpectator
override fun getInvStackList(): DefaultedList<ItemStack> = inventoryContents
override fun setInvStackList(list: DefaultedList<ItemStack>) {
@@ -161,10 +164,4 @@ class GildedChestBlockEntity(pos: BlockPos, state: BlockState, val type: Type =
Inventories.readNbt(nbt, inventoryContents)
}
}
fun onScheduledTick() {
if (!this.removed) {
stateManager.updateViewerCount(this.getWorld(), this.getPos(), this.cachedState)
}
}
}
@@ -14,7 +14,6 @@ import com.bedrockk.molang.runtime.value.MoValue
import com.bedrockk.molang.runtime.value.StringValue
import com.cobblemon.mod.common.api.molang.MoLangFunctions.addFunctions
import com.cobblemon.mod.common.api.molang.MoLangFunctions.getQueryStruct
import com.cobblemon.mod.common.api.text.text
import com.cobblemon.mod.common.util.asIdentifierDefaultingNamespace
import net.minecraft.client.MinecraftClient
import net.minecraft.client.sound.PositionedSoundInstance
@@ -32,13 +31,6 @@ object ClientMoLangFunctions {
MinecraftClient.getInstance().soundManager.play(PositionedSoundInstance.master(soundEvent, pitch))
}
},
"is_time" to java.util.function.Function { params ->
val time = (MinecraftClient.getInstance().world?.timeOfDay ?: 0) % 24000
val min = params.getInt(0)
val max = params.getInt(1)
time in min..max
},
"say" to java.util.function.Function { params -> MinecraftClient.getInstance().player?.sendMessage(params.getString(0).text()) ?: Unit },
)
fun MoLangRuntime.setupClient(): MoLangRuntime {
@@ -272,9 +272,6 @@ class PokemonClientDelegate : PoseableEntityState<PokemonEntity>(), PokemonSideD
},
"weight" to java.util.function.Function {
return@Function DoubleValue(currentEntity.pokemon.species.weight.toDouble())
},
"friendship" to java.util.function.Function {
return@Function DoubleValue(currentEntity.pokemon.friendship.toDouble())
}
))
}
@@ -33,7 +33,6 @@ import net.minecraft.client.util.math.MatrixStack
import net.minecraft.util.math.Box
import net.minecraft.util.math.Vec3d
import org.joml.Matrix4f
import org.joml.Vector3f
class BerryBlockRenderer(private val context: BlockEntityRendererFactory.Context) : BlockEntityRenderer<BerryBlockEntity> {
@@ -47,7 +46,7 @@ class BerryBlockRenderer(private val context: BlockEntityRendererFactory.Context
if (!isInRenderDistance(entity, entity.pos.toVec3d())) return
val blockState = entity.cachedState
val age = blockState.get(BerryBlock.AGE)
if (age <= BerryBlock.MATURE_AGE && age != 0) {
if (age <= BerryBlock.MATURE_AGE) {
return
}
if (entity.renderState == null) {
@@ -71,38 +70,8 @@ class BerryBlockRenderer(private val context: BlockEntityRendererFactory.Context
CobblemonRenderLayers.BERRY_LAYER.endDrawing()
matrices.pop()
}
fun renderToBuffer(entity: BerryBlockEntity, light: Int, overlay: Int, buffer: VertexBuffer) {
if (entity.cachedState.get(BerryBlock.AGE) == 0) {
renderBabyToBuffer(entity, light, overlay, buffer)
}
else {
renderAdultToBuffer(entity, light, overlay, buffer)
}
}
fun renderBabyToBuffer(entity: BerryBlockEntity, light: Int, overlay: Int, buffer: VertexBuffer) {
val bufferBuilder = Tessellator.getInstance().buffer
bufferBuilder.begin(CobblemonRenderLayers.BERRY_LAYER.drawMode, CobblemonRenderLayers.BERRY_LAYER.vertexFormat)
val berry = entity.berry() ?: return
val model = BerryModelRepository.modelOf(berry.fruitModelIdentifier) ?: return
val pos = berry.stageOnePositioning.position
model.setPosition(Axis.X_AXIS.ordinal, pos.x.toFloat())
model.setPosition(Axis.Y_AXIS.ordinal, pos.y.toFloat())
model.setPosition(Axis.Z_AXIS.ordinal, pos.z.toFloat())
val rot = berry.stageOnePositioning.rotation
model.setAngles(
Math.toRadians(180 - rot.x).toFloat(),
Math.toRadians(180 + rot.y).toFloat(),
Math.toRadians(rot.z).toFloat()
)
model.render(MatrixStack(), bufferBuilder, light, overlay)
val bufferBuilderFinal = bufferBuilder.end()
buffer.bind()
buffer.upload(bufferBuilderFinal)
VertexBuffer.unbind()
}
fun renderAdultToBuffer(entity: BerryBlockEntity, light: Int, overlay: Int, buffer: VertexBuffer) {
val blockState = entity.cachedState
val age = blockState.get(BerryBlock.AGE)
if (age <= BerryBlock.MATURE_AGE) {
@@ -20,10 +20,7 @@ import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFram
import com.cobblemon.mod.common.client.render.models.blockbench.quirk.SimpleQuirk
import com.cobblemon.mod.common.entity.PoseType
import com.cobblemon.mod.common.util.asExpressionLike
import com.cobblemon.mod.common.util.normalizeToArray
import com.cobblemon.mod.common.util.resolveBoolean
import com.cobblemon.mod.common.util.resolveObject
import com.cobblemon.mod.common.util.singularToPluralList
import com.google.gson.JsonArray
import com.google.gson.JsonObject
import com.google.gson.JsonPrimitive
@@ -37,8 +34,6 @@ class JsonPose<T : Entity>(model: PoseableEntityModel<T>, json: JsonObject) {
it.environment.getQueryStruct().addFunctions(model.functions.functions)
}
val condition: ExpressionLike = json.singularToPluralList("condition").get("condition")?.normalizeToArray()?.map { it.asString }?.asExpressionLike() ?: "true".asExpressionLike()
val poseName = json.get("poseName")?.asString ?: "pose"
val poseTypes = (json.get("poseTypes")?.asJsonArray?.map { name ->
PoseType.values().find { it.name.lowercase() == name.asString.lowercase() }
@@ -86,9 +81,8 @@ class JsonPose<T : Entity>(model: PoseableEntityModel<T>, json: JsonObject) {
}
json as JsonObject
json.singularToPluralList("animation")
val animations: (state: PoseableEntityState<T>) -> List<StatefulAnimation<T, *>> = { _ ->
(json.get("animations")?.normalizeToArray()?.asJsonArray ?: JsonArray()).map { animJson ->
(json.get("animations")?.asJsonArray ?: JsonArray()).map { animJson ->
try {
val expr = animJson.asString.asExpressionLike()
runtime.resolveObject(expr).obj as StatefulAnimation<T, *>
@@ -103,11 +97,10 @@ class JsonPose<T : Entity>(model: PoseableEntityModel<T>, json: JsonObject) {
val loopTimes = json.get("loopTimes")?.asInt ?: 1
val minSeconds = json.get("minSecondsBetweenOccurrences")?.asFloat ?: 8F
val maxSeconds = json.get("maxSecondsBetweenOccurrences")?.asFloat ?: 30F
val condition = json.get("condition")?.asString?.asExpressionLike() ?: "true".asExpressionLike()
model.quirkMultiple(
secondsBetweenOccurrences = minSeconds to maxSeconds,
condition = { it.runtime.resolveBoolean(condition) },
condition = { true },
loopTimes = 1..loopTimes,
animations = animations
)
@@ -46,7 +46,6 @@ import com.cobblemon.mod.common.util.asExpressionLike
import com.cobblemon.mod.common.util.getDoubleOrNull
import com.cobblemon.mod.common.util.getStringOrNull
import com.cobblemon.mod.common.util.plus
import com.cobblemon.mod.common.util.resolveBoolean
import net.minecraft.client.model.ModelPart
import net.minecraft.client.render.OverlayTexture
import net.minecraft.client.render.RenderLayer
@@ -879,18 +878,6 @@ abstract class PoseableEntityModel<T : Entity>(
animations = { listOf(animation(it)) }
)
fun quirkMoLangCondition(
secondsBetweenOccurrences: Pair<Float, Float> = 8F to 30F,
loopTimes: IntRange = 1..1,
conditionExpression: ExpressionLike = "true".asExpressionLike(),
animation: (state: PoseableEntityState<T>) -> StatefulAnimation<T, *>
) = SimpleQuirk<T>(
secondsBetweenOccurrences = secondsBetweenOccurrences,
loopTimes = loopTimes,
condition = { it.runtime.resolveBoolean(conditionExpression) },
animations = { listOf(animation(it)) }
)
fun quirkMultiple(
secondsBetweenOccurrences: Pair<Float, Float> = 8F to 30F,
loopTimes: IntRange = 1..1,
@@ -78,7 +78,7 @@ abstract class PoseableEntityState<T : Entity> : Schedulable {
"anim_time" to java.util.function.Function { return@Function reusableAnimTime.also { it.value = animationSeconds.toDouble() } },
"pose_type" to java.util.function.Function { return@Function StringValue((getEntity() as Poseable).getCurrentPoseType().name) },
"pose" to java.util.function.Function { _ -> return@Function StringValue(currentPose ?: "") },
"has_entity" to java.util.function.Function { _ -> return@Function DoubleValue(getEntity() != null) },
"say" to java.util.function.Function { params -> MinecraftClient.getInstance().player?.sendMessage(params.getString(0).text()) ?: Unit },
"sound" to java.util.function.Function { params ->
val entity = getEntity() ?: return@Function Unit
if (params.get<MoValue>(0) !is StringValue) {
@@ -9,7 +9,6 @@
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon
import com.cobblemon.mod.common.api.molang.ExpressionLike
import com.cobblemon.mod.common.client.entity.PokemonClientDelegate
import com.cobblemon.mod.common.client.render.models.blockbench.JsonPose
import com.cobblemon.mod.common.client.render.models.blockbench.JsonPoseableEntityModel
import com.cobblemon.mod.common.client.render.models.blockbench.PoseableEntityState
@@ -25,7 +24,6 @@ import com.cobblemon.mod.common.util.isDusk
import com.cobblemon.mod.common.util.isStandingOnRedSand
import com.cobblemon.mod.common.util.isStandingOnSand
import com.cobblemon.mod.common.util.isStandingOnSandOrRedSand
import com.cobblemon.mod.common.util.resolveBoolean
import com.google.gson.ExclusionStrategy
import com.google.gson.FieldAttributes
import com.google.gson.GsonBuilder
@@ -86,12 +84,30 @@ class JsonPokemonPoseableModel(override val rootPart: Bone) : PokemonPoseableMod
override val head: Bone by lazy { headJoint?.let { getPart(it) } ?: rootPart }
@SerializedName("portraitScale")
private val _portraitScale: Float? = null
@SerializedName("portraitTranslation")
private val _portraitTranslation: Vec3d? = null
@SerializedName("profileScale")
private val _profileScale: Float? = null
@SerializedName("profileTranslation")
private val _profileTranslation: Vec3d? = null
//Some weirdness going on here, vars have to be initialized, gson doesn't like multiple fields with the same name
//Idk, works fine with Blastoise
@Transient
override var portraitScale = 1F
get() = _portraitScale ?: 1F
@Transient
override var portraitTranslation = Vec3d.ZERO
get() = _portraitTranslation ?: Vec3d(0.0, 0.0, 0.0)
@Transient
override var profileScale = 1F
get() = _profileScale ?: 1F
@Transient
override var profileTranslation = Vec3d.ZERO
get() = _profileTranslation ?: Vec3d(0.0, 0.0, 0.0)
val faint: Supplier<StatefulAnimation<PokemonEntity, ModelFrame>>? = null
@@ -176,8 +192,6 @@ class JsonPokemonPoseableModel(override val rootPart: Bone) : PokemonPoseableMod
conditionsList.add { mustBeDusk == it.isDusk() }
}
conditionsList.add { (it.delegate as PokemonClientDelegate).runtime.resolveBoolean(pose.condition) }
val poseCondition: ((PokemonEntity) -> Boolean)? = if (conditionsList.isEmpty()) null else conditionsList.reduce { acc, function -> { acc(it) && function(it) } }
return Pose(
@@ -8,14 +8,13 @@
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen1
import com.cobblemon.mod.common.client.render.models.blockbench.animation.BipedWalkAnimation
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BipedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPose
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPoseableModel
import com.cobblemon.mod.common.entity.PoseType
import com.cobblemon.mod.common.entity.PoseType.Companion.MOVING_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.STATIONARY_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.UI_POSES
import net.minecraft.client.model.ModelPart
import net.minecraft.util.math.Vec3d
@@ -57,7 +56,7 @@ class KabutopsModel(root: ModelPart) : PokemonPoseableModel(), HeadedFrame, Bipe
standing = registerPose(
poseName = "standing",
poseTypes = UI_POSES + STATIONARY_POSES,
poseTypes = UI_POSES + PoseType.STAND,
condition = { !it.isBattling },
quirks = arrayOf(blink),
idleAnimations = arrayOf(
@@ -68,7 +67,7 @@ class KabutopsModel(root: ModelPart) : PokemonPoseableModel(), HeadedFrame, Bipe
walk = registerPose(
poseName = "walk",
poseTypes = MOVING_POSES,
poseType = PoseType.WALK,
quirks = arrayOf(blink),
idleAnimations = arrayOf(
singleBoneLook(),
@@ -8,14 +8,21 @@
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen1
import com.cobblemon.mod.common.client.render.models.blockbench.animation.WingFlapIdleAnimation
import com.cobblemon.mod.common.client.render.models.blockbench.createTransformation
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BiWingedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BipedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPose
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPoseableModel
import com.cobblemon.mod.common.client.render.models.blockbench.pose.ModelPartTransformation
import com.cobblemon.mod.common.client.render.models.blockbench.wavefunction.parabolaFunction
import com.cobblemon.mod.common.client.render.models.blockbench.wavefunction.sineFunction
import com.cobblemon.mod.common.entity.PoseType
import com.cobblemon.mod.common.entity.PoseType.Companion.SHOULDER_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.UI_POSES
import com.cobblemon.mod.common.util.math.geometry.toRadians
import net.minecraft.client.model.ModelPart
import net.minecraft.util.math.Vec3d
@@ -59,7 +66,7 @@ class PidgeyModel(root: ModelPart) : PokemonPoseableModel(), HeadedFrame {
stand = registerPose(
poseName = "standing",
poseTypes = SHOULDER_POSES + UI_POSES + PoseType.STATIONARY_POSES - PoseType.HOVER,
poseTypes = SHOULDER_POSES + UI_POSES + PoseType.STANDING_POSES,
transformTicks = 10,
transformedParts = arrayOf(
wingClosedLeft.createTransformation().withVisibility(visibility = true),
@@ -25,8 +25,8 @@ class PetililHisuiBiasModel (root: ModelPart) : PokemonPoseableModel(), HeadedFr
val leaf_left = getPart("leaf_left_rotation")
val leaf_right = getPart("leaf_right_rotation")
override var portraitScale = 1.52F
override var portraitTranslation = Vec3d(0.1, -0.25, 0.0)
override var portraitScale = 1.75F
override var portraitTranslation = Vec3d(0.01, -0.39, 0.0)
override var profileScale = 0.8F
override var profileTranslation = Vec3d(0.0, 0.5, 0.0)
@@ -22,8 +22,8 @@ class PetililModel (root: ModelPart) : PokemonPoseableModel(), HeadedFrame {
override val rootPart = root.registerChildWithAllChildren("petilil")
override val head = getPart("head")
override var portraitScale = 1.52F
override var portraitTranslation = Vec3d(0.1, -0.25, 0.0)
override var portraitScale = 2.0F
override var portraitTranslation = Vec3d(-0.3, -1.2, 0.0)
override var profileScale = 0.8F
override var profileTranslation = Vec3d(0.0, 0.5, 0.0)
@@ -28,8 +28,8 @@ class DubwoolModel(root: ModelPart) : PokemonPoseableModel(), HeadedFrame, Quadr
override val foreRightLeg = getPart("leg_front_right")
override val hindLeftLeg = getPart("leg_back_left")
override val hindRightLeg = getPart("leg_back_right")
val wool = getPart("wool_shearable")
val neckWool = getPart("neck_wool_shearable")
val wool = getPart("wool")
val neckWool = getPart("neck_wool")
override var portraitScale = 3.1F
override var portraitTranslation = Vec3d(-1.2, -0.7, 0.0)
@@ -28,7 +28,7 @@ class WoolooModel(root: ModelPart) : PokemonPoseableModel(), HeadedFrame, Quadru
override val foreRightLeg = getPart("leg_front_right")
override val hindLeftLeg = getPart("leg_back_left")
override val hindRightLeg = getPart("leg_back_right")
val wool = getPart("wool_shearable")
val wool = getPart("wool")
override var portraitScale = 3.1F
override var portraitTranslation = Vec3d(-0.85, -1.8, 0.0)
@@ -21,9 +21,7 @@ import com.cobblemon.mod.common.api.interaction.PokemonEntityInteraction
import com.cobblemon.mod.common.api.net.serializers.PoseTypeDataSerializer
import com.cobblemon.mod.common.api.net.serializers.StringSetDataSerializer
import com.cobblemon.mod.common.api.pokemon.PokemonProperties
import com.cobblemon.mod.common.api.pokemon.feature.ChoiceSpeciesFeatureProvider
import com.cobblemon.mod.common.api.pokemon.feature.FlagSpeciesFeature
import com.cobblemon.mod.common.api.pokemon.feature.StringSpeciesFeature
import com.cobblemon.mod.common.api.pokemon.status.Statuses
import com.cobblemon.mod.common.api.reactive.ObservableSubscription
import com.cobblemon.mod.common.api.reactive.SimpleObservable
@@ -61,6 +59,7 @@ import com.cobblemon.mod.common.pokemon.evolution.variants.ItemInteractionEvolut
import com.cobblemon.mod.common.pokemon.misc.GimmighoulStashHandler
import com.cobblemon.mod.common.util.*
import com.cobblemon.mod.common.world.gamerules.CobblemonGameRules
import net.minecraft.block.Blocks
import java.util.EnumSet
import java.util.Optional
import java.util.UUID
@@ -83,7 +82,6 @@ import net.minecraft.entity.passive.PassiveEntity
import net.minecraft.entity.passive.TameableShoulderEntity
import net.minecraft.entity.player.PlayerEntity
import net.minecraft.fluid.FluidState
import net.minecraft.item.DyeItem
import net.minecraft.item.ItemStack
import net.minecraft.item.ItemUsage
import net.minecraft.item.Items
@@ -104,11 +102,8 @@ import net.minecraft.sound.SoundEvents
import net.minecraft.text.Text
import net.minecraft.text.TextContent
import net.minecraft.util.ActionResult
import net.minecraft.util.Colors
import net.minecraft.util.DyeColor
import net.minecraft.util.Hand
import net.minecraft.util.Identifier
import net.minecraft.util.Util
import net.minecraft.util.math.BlockPos
import net.minecraft.util.math.Box
import net.minecraft.util.math.Vec3d
@@ -141,7 +136,6 @@ open class PokemonEntity(
@JvmStatic val UNBATTLEABLE = DataTracker.registerData(PokemonEntity::class.java, TrackedDataHandlerRegistry.BOOLEAN)
@JvmStatic val COUNTS_TOWARDS_SPAWN_CAP = DataTracker.registerData(PokemonEntity::class.java, TrackedDataHandlerRegistry.BOOLEAN)
@JvmStatic val SPAWN_DIRECTION = DataTracker.registerData(PokemonEntity::class.java, TrackedDataHandlerRegistry.FLOAT)
@JvmStatic val FRIENDSHIP = DataTracker.registerData(PokemonEntity::class.java, TrackedDataHandlerRegistry.INTEGER)
const val BATTLE_LOCK = "battle"
@@ -187,8 +181,6 @@ open class PokemonEntity(
set(value) = dataTracker.set(BATTLE_ID, Optional.ofNullable(value))
val isBattling: Boolean
get() = dataTracker.get(BATTLE_ID).isPresent
val friendship: Int
get() = dataTracker.get(FRIENDSHIP)
var drops: DropTable? = null
@@ -254,9 +246,7 @@ open class PokemonEntity(
dataTracker.startTracking(LABEL_LEVEL, 1)
dataTracker.startTracking(HIDE_LABEL, false)
dataTracker.startTracking(UNBATTLEABLE, false)
dataTracker.startTracking(COUNTS_TOWARDS_SPAWN_CAP, true)
dataTracker.startTracking(SPAWN_DIRECTION, world.random.nextFloat() * 360F)
dataTracker.startTracking(FRIENDSHIP, 0)
}
override fun onTrackedDataSet(data: TrackedData<*>) {
@@ -336,21 +326,6 @@ open class PokemonEntity(
this.tethering = null
this.pokemon.recall()
}
//This is so that pokemon in the pasture block are ALWAYS in sync with the pokemon box
//Before, pokemon entities in pastures would hold an old ref to a pokemon obj and changes to that would not appear to the underlying file
if (this.tethering != null) {
//Only for online players
if (world.getPlayerByUuid(ownerUuid) != null){
this.ownerUuid?.let {
val actualPokemon = Cobblemon.storage.getPC(it)[this.pokemon.uuid]
actualPokemon?.let {
if (it !== pokemon) {
pokemon = it
}
}
}
}
}
schedulingTracker.update(1/20F)
}
@@ -615,7 +590,6 @@ open class PokemonEntity(
override fun interactMob(player: PlayerEntity, hand: Hand) : ActionResult {
val itemStack = player.getStackInHand(hand)
val colorFeature = pokemon.getFeature<StringSpeciesFeature>(DataKeys.CAN_BE_COLORED)
if (itemStack.isOf(Items.SHEARS) && this.isShearable) {
this.sheared(SoundCategory.PLAYERS)
@@ -681,6 +655,7 @@ open class PokemonEntity(
pokemon.lastFlowerFed = ItemStack.EMPTY
return ActionResult.success(world.isClient)
}
else {
val mushroomStew = ItemUsage.exchangeStack(itemStack, player, Items.MUSHROOM_STEW.defaultStack)
player.setStackInHand(hand, mushroomStew)
@@ -721,22 +696,6 @@ open class PokemonEntity(
return ActionResult.SUCCESS
}
}
else if (itemStack.item is DyeItem && colorFeature != null) {
val item = itemStack.item as DyeItem
if (item.color.name.lowercase() != colorFeature.value.lowercase()) {
itemStack.decrement(1)
colorFeature.value = item.color.name.lowercase()
this.pokemon.markFeatureDirty(colorFeature)
this.pokemon.updateAspects()
}
}
else if (itemStack.item.equals(Items.WATER_BUCKET) && colorFeature != null) {
itemStack.decrement(1)
player.giveOrDropItemStack(Items.BUCKET.defaultStack)
colorFeature.value = ""
this.pokemon.markFeatureDirty(colorFeature)
this.pokemon.updateAspects()
}
if (hand == Hand.MAIN_HAND && player is ServerPlayerEntity && pokemon.getOwnerPlayer() == player) {
@@ -865,7 +824,7 @@ open class PokemonEntity(
// Check evolution item interaction
if (pokemon.getOwnerPlayer() == player) {
val context = ItemInteractionEvolution.ItemInteractionContext(stack, player.world)
pokemon.lockedEvolutions
pokemon.evolutions
.filterIsInstance<ItemInteractionEvolution>()
.forEach { evolution ->
if (evolution.attemptEvolution(pokemon, context)) {
@@ -1163,26 +1122,8 @@ open class PokemonEntity(
this.pokemon.markFeatureDirty(feature)
this.pokemon.updateAspects()
val i = this.random.nextInt(3) + 1
for (j in 0 .. i) {
val color = this.pokemon.getFeature<StringSpeciesFeature>(DataKeys.CAN_BE_COLORED)?.value ?: "white"
val woolItem = when (color) {
"black" -> Items.BLACK_WOOL
"blue" -> Items.BLUE_WOOL
"brown" -> Items.BROWN_WOOL
"cyan" -> Items.CYAN_WOOL
"gray" -> Items.GRAY_WOOL
"green" -> Items.GREEN_WOOL
"light-blue" -> Items.LIGHT_BLUE_WOOL
"light-gray" -> Items.LIGHT_GRAY_WOOL
"lime" -> Items.LIME_WOOL
"magenta" -> Items.MAGENTA_WOOL
"orange" -> Items.ORANGE_WOOL
"purple" -> Items.PURPLE_WOOL
"red" -> Items.RED_WOOL
"yellow" -> Items.YELLOW_WOOL
else -> Items.WHITE_WOOL
}
val itemEntity = this.dropItem(woolItem, 1) ?: return
for (j in 0 until i) {
val itemEntity = this.dropItem(Items.WHITE_WOOL, 1) ?: return
itemEntity.velocity = itemEntity.velocity.add(
((this.random.nextFloat() - this.random.nextFloat()) * 0.1f).toDouble(),
(this.random.nextFloat() * 0.05f).toDouble(),
@@ -1196,8 +1137,6 @@ open class PokemonEntity(
return !this.isBusy && !this.pokemon.isFainted() && !feature.enabled
}
override fun canUsePortals() = false
override fun setAir(air: Int) {
@@ -92,28 +92,10 @@ class PokemonServerDelegate : PokemonSideDelegate {
speed = 0.1F
entity.despawner.beginTracking(this)
}
updateTrackedValues()
}
fun getBattle() = entity.battleId?.let(BattleRegistry::getBattle)
fun updateTrackedValues() {
val trackedSpecies = mock?.species ?: entity.pokemon.species.resourceIdentifier.toString()
val trackedNickname = mock?.nickname ?: entity.pokemon.nickname ?: Text.empty()
val trackedAspects = mock?.aspects ?: entity.pokemon.aspects
entity.dataTracker.set(PokemonEntity.SPECIES, trackedSpecies)
if (entity.dataTracker.get(PokemonEntity.NICKNAME) != trackedNickname) {
entity.dataTracker.set(PokemonEntity.NICKNAME, trackedNickname)
}
entity.dataTracker.set(PokemonEntity.ASPECTS, trackedAspects)
entity.dataTracker.set(PokemonEntity.LABEL_LEVEL, entity.pokemon.level)
entity.dataTracker.set(PokemonEntity.MOVING, entity.velocity.multiply(1.0, if (entity.isOnGround) 0.0 else 1.0, 1.0).length() > 0.005F)
entity.dataTracker.set(PokemonEntity.FRIENDSHIP, entity.pokemon.friendship)
updatePoseType()
}
override fun onTrackedDataSet(data: TrackedData<*>) {
super.onTrackedDataSet(data)
if (this::entity.isInitialized) {
@@ -180,7 +162,19 @@ class PokemonServerDelegate : PokemonSideDelegate {
entity.remove(Entity.RemovalReason.DISCARDED)
}
updateTrackedValues()
val trackedSpecies = mock?.species ?: entity.pokemon.species.resourceIdentifier.toString()
val trackedNickname = mock?.nickname ?: entity.pokemon.nickname ?: Text.empty()
val trackedAspects = mock?.aspects ?: entity.pokemon.aspects
entity.dataTracker.set(PokemonEntity.SPECIES, trackedSpecies)
if (entity.dataTracker.get(PokemonEntity.NICKNAME) != trackedNickname) {
entity.dataTracker.set(PokemonEntity.NICKNAME, trackedNickname)
}
entity.dataTracker.set(PokemonEntity.ASPECTS, trackedAspects)
entity.dataTracker.set(PokemonEntity.LABEL_LEVEL, entity.pokemon.level)
entity.dataTracker.set(PokemonEntity.MOVING, entity.velocity.multiply(1.0, if (entity.isOnGround) 0.0 else 1.0, 1.0).length() > 0.005F)
updatePoseType()
}
fun updatePoseType() {
@@ -87,7 +87,9 @@ object AdvancementHandler {
event.battle.actors.forEach { battleActor ->
if (!event.winners.contains(battleActor) && battleActor.type == ActorType.WILD) {
battleActor.pokemonList.forEach { battlePokemon ->
advancementData.updateTotalDefeatedCount(battlePokemon.originalPokemon)
battlePokemon.entity?.pokemon?.let {
advancementData.updateTotalDefeatedCount(it)
}
}
}
}
@@ -10,9 +10,10 @@ package com.cobblemon.mod.common.integration.jei.berry
import com.cobblemon.mod.common.CobblemonItems
import com.cobblemon.mod.common.integration.jei.CobblemonJeiProvider
import com.cobblemon.mod.common.item.berry.BerryItem
import com.cobblemon.mod.common.item.BerryItem
import mezz.jei.api.registration.IRecipeCategoryRegistration
import mezz.jei.api.registration.IRecipeRegistration
import net.minecraft.item.ItemStack
class BerryMutationProvider : CobblemonJeiProvider {
override fun registerCategory(registration: IRecipeCategoryRegistration) {
@@ -8,7 +8,7 @@
package com.cobblemon.mod.common.integration.jei.berry
import com.cobblemon.mod.common.item.berry.BerryItem
import com.cobblemon.mod.common.item.BerryItem
//Dont make these ItemStacks, they do not have consistent hash codes, breaks stuff
data class BerryMutationRecipe(
@@ -6,7 +6,7 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.item.berry
package com.cobblemon.mod.common.item
import com.cobblemon.mod.common.block.BerryBlock
import net.minecraft.item.AliasedBlockItem
@@ -14,6 +14,7 @@ import com.cobblemon.mod.common.CobblemonSounds
import com.cobblemon.mod.common.api.item.PokemonSelectingItem
import com.cobblemon.mod.common.api.pokemon.stats.Stat
import com.cobblemon.mod.common.block.BerryBlock
import com.cobblemon.mod.common.item.BerryItem
import com.cobblemon.mod.common.pokemon.Pokemon
import com.cobblemon.mod.common.util.genericRuntime
import com.cobblemon.mod.common.util.resolveInt
@@ -15,6 +15,7 @@ import com.cobblemon.mod.common.api.battles.model.actor.BattleActor
import com.cobblemon.mod.common.api.item.PokemonSelectingItem
import com.cobblemon.mod.common.battles.pokemon.BattlePokemon
import com.cobblemon.mod.common.block.BerryBlock
import com.cobblemon.mod.common.item.BerryItem
import com.cobblemon.mod.common.item.battle.BagItem
import com.cobblemon.mod.common.pokemon.Pokemon
import com.cobblemon.mod.common.util.genericRuntime
@@ -16,6 +16,7 @@ import com.cobblemon.mod.common.api.item.PokemonAndMoveSelectingItem
import com.cobblemon.mod.common.api.moves.Move
import com.cobblemon.mod.common.battles.pokemon.BattlePokemon
import com.cobblemon.mod.common.block.BerryBlock
import com.cobblemon.mod.common.item.BerryItem
import com.cobblemon.mod.common.item.battle.BagItem
import com.cobblemon.mod.common.pokemon.Pokemon
import com.cobblemon.mod.common.util.genericRuntime
@@ -15,6 +15,7 @@ import com.cobblemon.mod.common.api.battles.model.actor.BattleActor
import com.cobblemon.mod.common.api.item.PokemonSelectingItem
import com.cobblemon.mod.common.battles.pokemon.BattlePokemon
import com.cobblemon.mod.common.block.BerryBlock
import com.cobblemon.mod.common.item.BerryItem
import com.cobblemon.mod.common.item.battle.BagItem
import com.cobblemon.mod.common.pokemon.Pokemon
import com.cobblemon.mod.common.util.genericRuntime
@@ -15,6 +15,7 @@ import com.cobblemon.mod.common.api.item.PokemonSelectingItem
import com.cobblemon.mod.common.api.pokemon.status.Status
import com.cobblemon.mod.common.battles.pokemon.BattlePokemon
import com.cobblemon.mod.common.block.BerryBlock
import com.cobblemon.mod.common.item.BerryItem
import com.cobblemon.mod.common.item.battle.BagItem
import com.cobblemon.mod.common.pokemon.Pokemon
import net.minecraft.entity.player.PlayerEntity
@@ -14,6 +14,7 @@ import com.cobblemon.mod.common.api.battles.model.actor.BattleActor
import com.cobblemon.mod.common.api.item.PokemonSelectingItem
import com.cobblemon.mod.common.battles.pokemon.BattlePokemon
import com.cobblemon.mod.common.block.BerryBlock
import com.cobblemon.mod.common.item.BerryItem
import com.cobblemon.mod.common.item.battle.BagItem
import com.cobblemon.mod.common.pokemon.Pokemon
import net.minecraft.item.ItemStack
@@ -19,7 +19,7 @@ class LinkCableItem : CobblemonItem(Settings()), PokemonEntityInteraction {
override val accepted = setOf(PokemonEntityInteraction.Ownership.OWNER)
override fun processInteraction(player: ServerPlayerEntity, entity: PokemonEntity, stack: ItemStack): Boolean {
val pokemon = entity.pokemon
pokemon.lockedEvolutions.filterIsInstance<TradeEvolution>().forEach { evolution ->
pokemon.evolutions.filterIsInstance<TradeEvolution>().forEach { evolution ->
// If an evolution is possible non-optional or has been successfully queued we will consume the item and stop
// validate requirements to respect required held items and such.
if (evolution.requirements.all { it.check(pokemon) } && evolution.evolve(pokemon)) {
@@ -39,7 +39,6 @@ class SpawnPokemonPacket(
private val hideLabel: Boolean,
private val caughtBall: Identifier,
private val spawnYaw: Float,
private val friendship: Int,
vanillaSpawnPacket: EntitySpawnS2CPacket
) : SpawnExtraDataEntityPacket<SpawnPokemonPacket, PokemonEntity>(vanillaSpawnPacket) {
@@ -61,7 +60,6 @@ class SpawnPokemonPacket(
entity.dataTracker.get(PokemonEntity.HIDE_LABEL),
entity.pokemon.caughtBall.name,
entity.dataTracker.get(PokemonEntity.SPAWN_DIRECTION),
entity.dataTracker.get(PokemonEntity.FRIENDSHIP),
vanillaSpawnPacket
)
@@ -81,7 +79,6 @@ class SpawnPokemonPacket(
buffer.writeBoolean(this.hideLabel)
buffer.writeIdentifier(this.caughtBall)
buffer.writeFloat(this.spawnYaw)
buffer.writeInt(this.friendship)
}
override fun applyData(entity: PokemonEntity) {
@@ -104,7 +101,6 @@ class SpawnPokemonPacket(
entity.dataTracker.set(PokemonEntity.UNBATTLEABLE, unbattlable)
entity.dataTracker.set(PokemonEntity.HIDE_LABEL, hideLabel)
entity.dataTracker.set(PokemonEntity.SPAWN_DIRECTION, spawnYaw)
entity.dataTracker.set(PokemonEntity.FRIENDSHIP, friendship)
}
override fun checkType(entity: Entity): Boolean = entity is PokemonEntity
@@ -128,10 +124,9 @@ class SpawnPokemonPacket(
val hideLabel = buffer.readBoolean()
val caughtBall = buffer.readIdentifier()
val spawnAngle = buffer.readFloat()
val friendship = buffer.readInt()
val vanillaPacket = decodeVanillaPacket(buffer)
return SpawnPokemonPacket(ownerId, scaleModifier, species, form, aspects, battleId, phasingTargetId, beamModeEmitter, nickname, labelLevel, poseType, unbattlable, hideLabel, caughtBall, spawnAngle, friendship, vanillaPacket)
return SpawnPokemonPacket(ownerId, scaleModifier, species, form, aspects, battleId, phasingTargetId, beamModeEmitter, nickname, labelLevel, poseType, unbattlable, hideLabel, caughtBall, spawnAngle, vanillaPacket)
}
}
@@ -426,8 +426,6 @@ open class Pokemon : ShowdownIdentifiable {
// We want non-optional evolutions to trigger first to avoid unnecessary packets and any cost associate with an optional one that would just be lost
val evolutions: Iterable<Evolution> get() = this.form.evolutions.sortedBy { evolution -> evolution.optional }
val lockedEvolutions: Iterable<Evolution>
get() = evolutions.filter { it !in evolutionProxy.current() }
val preEvolution: PreEvolution? get() = this.form.preEvolution
@@ -43,8 +43,7 @@ object CobblemonRequirementAdapter : RequirementAdapter {
this.registerType(TimeRangeRequirement.ADAPTER_VARIANT, TimeRangeRequirement::class)
this.registerType(LevelRequirement.ADAPTER_VARIANT, LevelRequirement::class)
this.registerType(WeatherRequirement.ADAPTER_VARIANT, WeatherRequirement::class)
this.registerType(StatCompareRequirement.ADAPTER_VARIANT, StatCompareRequirement::class)
this.registerType(StatEqualRequirement.ADAPTER_VARIANT, StatEqualRequirement::class)
this.registerType(AttackDefenceRatioRequirement.ADAPTER_VARIANT, AttackDefenceRatioRequirement::class)
this.registerType(BattleCriticalHitsRequirement.ADAPTER_VARIANT, BattleCriticalHitsRequirement::class)
this.registerType(DamageTakenRequirement.ADAPTER_VARIANT, DamageTakenRequirement::class)
this.registerType(UseMoveRequirement.ADAPTER_VARIANT, UseMoveRequirement::class)
@@ -9,18 +9,24 @@
package com.cobblemon.mod.common.pokemon.evolution.requirements
import com.cobblemon.mod.common.api.pokemon.evolution.requirement.EvolutionRequirement
import com.cobblemon.mod.common.api.pokemon.stats.Stats
import com.cobblemon.mod.common.pokemon.Pokemon
class StatCompareRequirement : EvolutionRequirement {
class AttackDefenceRatioRequirement : EvolutionRequirement {
companion object {
const val ADAPTER_VARIANT = "stat_compare"
const val ADAPTER_VARIANT = "attack_defence_ratio"
}
enum class AttackDefenceRatio {
ATTACK_HIGHER,
DEFENCE_HIGHER,
EQUAL
}
val highStat = Stats.ATTACK.name
val lowStat = Stats.DEFENCE.name
val ratio = AttackDefenceRatio.ATTACK_HIGHER
override fun check(pokemon: Pokemon): Boolean {
return pokemon.getStat(Stats.getStat(highStat)) > pokemon.getStat(Stats.getStat(lowStat))
return when (ratio) {
AttackDefenceRatio.ATTACK_HIGHER -> pokemon.attack > pokemon.defence
AttackDefenceRatio.DEFENCE_HIGHER -> pokemon.defence > pokemon.attack
AttackDefenceRatio.EQUAL -> pokemon.attack == pokemon.defence
}
}
}
@@ -1,26 +0,0 @@
/*
* 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.pokemon.evolution.requirements
import com.cobblemon.mod.common.api.pokemon.evolution.requirement.EvolutionRequirement
import com.cobblemon.mod.common.api.pokemon.stats.Stats
import com.cobblemon.mod.common.pokemon.Pokemon
class StatEqualRequirement : EvolutionRequirement {
companion object {
const val ADAPTER_VARIANT = "stat_equal"
}
val statOne = Stats.ATTACK.name
val statTwo = Stats.DEFENCE.name
override fun check(pokemon: Pokemon): Boolean {
return pokemon.getStat(Stats.getStat(statOne)) == pokemon.getStat(Stats.getStat(statTwo))
}
}
@@ -98,11 +98,11 @@ object TradeManager {
party2.add(pokemon1)
party1.add(pokemon2)
pokemon1.lockedEvolutions.filterIsInstance<TradeEvolution>().firstOrNull {
pokemon1.evolutions.filterIsInstance<TradeEvolution>().firstOrNull {
it.attemptEvolution(pokemon1, pokemon2)
}
pokemon2.lockedEvolutions.filterIsInstance<TradeEvolution>().firstOrNull {
pokemon2.evolutions.filterIsInstance<TradeEvolution>().firstOrNull {
it.attemptEvolution(pokemon2, pokemon1)
}
CobblemonEvents.TRADE_COMPLETED.post(TradeCompletedEvent(player1, pokemon2, player2, pokemon1))
@@ -134,7 +134,6 @@ object DataKeys {
// Features
const val CAN_BE_MILKED = "milkable"
const val HAS_BEEN_SHEARED = "sheared"
const val CAN_BE_COLORED = "color"
// Variants
const val IS_MOOSHTANK = "mooshtank"
@@ -24,7 +24,7 @@ inline fun <reified T> Gson.fromJson(string: String) = fromJson(string, T::class
* the list value identified by the plural name. During runtime only the plural exists, but when
* configuring the JSON the user can use the singular form for a cleaner document.
*/
fun JsonObject.singularToPluralList(rootName: String, pluralName: String = "${rootName}s"): JsonObject {
fun JsonObject.singularToPluralList(rootName: String, pluralName: String = "${rootName}s") {
if (has(rootName)) {
if (!has(pluralName)) {
add(pluralName, JsonArray())
@@ -32,7 +32,6 @@ fun JsonObject.singularToPluralList(rootName: String, pluralName: String = "${ro
get(pluralName).asJsonArray.add(get(rootName))
remove(rootName)
}
return this
}
fun JsonElement.normalizeToArray(): JsonArray {
@@ -1,60 +0,0 @@
package com.cobblemon.mod.common.world.foliage
import com.cobblemon.mod.common.util.cobblemonResource
import com.mojang.serialization.codecs.RecordCodecBuilder
import net.minecraft.util.math.intprovider.IntProvider
import net.minecraft.util.math.random.Random
import net.minecraft.world.TestableWorld
import net.minecraft.world.gen.feature.TreeFeatureConfig
import net.minecraft.world.gen.foliage.FoliagePlacer
class ApricornFoliagePlacer(
val radius: IntProvider,
val offset: IntProvider
) : FoliagePlacer(radius, offset) {
override fun getType() = CobblemonFoliagePlacers.APRICORN_FOLIAGE_PLACER_TYPE
override fun generate(
world: TestableWorld?,
placer: BlockPlacer?,
random: Random?,
config: TreeFeatureConfig?,
trunkHeight: Int,
treeNode: TreeNode?,
foliageHeight: Int,
radius: Int,
offset: Int
) {
println("Generating Apricorn Foliage")
}
override fun getRandomHeight(
random: Random?,
trunkHeight: Int,
config: TreeFeatureConfig?
): Int {
return 0
}
override fun isInvalidForLeaves(
random: Random?,
dx: Int,
y: Int,
dz: Int,
radius: Int,
giantTrunk: Boolean
): Boolean {
return false
}
companion object {
val CODEC = RecordCodecBuilder.mapCodec {
it.group(
IntProvider.createValidatingCodec(0, 16).fieldOf("radius").forGetter<ApricornFoliagePlacer> {it.radius},
IntProvider.createValidatingCodec(0, 16).fieldOf("offset").forGetter<ApricornFoliagePlacer> {it.offset}
).apply(it, ::ApricornFoliagePlacer)
}
val ID = cobblemonResource("apricorn_foliage_placer")
}
}
@@ -1,21 +0,0 @@
package com.cobblemon.mod.common.world.foliage
import com.cobblemon.mod.common.platform.PlatformRegistry
import net.minecraft.registry.Registries
import net.minecraft.registry.Registry
import net.minecraft.registry.RegistryKey
import net.minecraft.registry.RegistryKeys
import net.minecraft.world.gen.foliage.FoliagePlacerType
/**
* Wow what a cool class
*
* @author Apion
* @since May 23, 2024
*/
object CobblemonFoliagePlacers : PlatformRegistry<Registry<FoliagePlacerType<*>>, RegistryKey<Registry<FoliagePlacerType<*>>>, FoliagePlacerType<*>>() {
val APRICORN_FOLIAGE_PLACER_TYPE = this.create("apricorn_foliage_placer", FoliagePlacerType(ApricornFoliagePlacer.CODEC.codec()))
override val registry = Registries.FOLIAGE_PLACER_TYPE
override val registryKey = RegistryKeys.FOLIAGE_PLACER_TYPE
}
@@ -5,32 +5,30 @@
"identifier": "cobblemon:ancientoriginball/ballsparkle",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/balls/originball/originballsparkle"
"texture": "textures/particles/balls/pokeball/ballsparkle"
}
},
"components": {
"minecraft:emitter_rate_steady": {
"spawn_rate": 22,
"max_particles": 24
"spawn_rate": 16,
"max_particles": 16
},
"minecraft:emitter_lifetime_once": {
"active_time": 0.5
},
"minecraft:emitter_shape_sphere": {
"offset": [0, 2, 0],
"offset": [0, 1.5, 0],
"radius": "math.random(0.5,1.5)*1.5",
"surface_only": true,
"direction": ["math.random(-9,9)", "math.random(4,7)", "math.random(-9,9)"]
"direction": [0, 1, 0]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 1
},
"minecraft:particle_initial_speed": 0.75,
"minecraft:particle_motion_dynamic": {
"linear_acceleration": [0, 2, 0]
},
"minecraft:particle_motion_dynamic": {},
"minecraft:particle_appearance_billboard": {
"size": [0.175, 0.175],
"size": [0.2, 0.2],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 36,
@@ -5,30 +5,25 @@
"identifier": "cobblemon:ancientoriginball/battle/ballsendsparkle",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/balls/originball/originballsendsparkle"
"texture": "textures/particles/balls/pokeball/ballsendsparkle"
}
},
"components": {
"minecraft:emitter_initialization": {
"per_update_expression": "variable.radius = 0.6;"
},
"minecraft:emitter_rate_steady": {
"spawn_rate": 100,
"max_particles": 16
"minecraft:emitter_rate_instant": {
"num_particles": 8
},
"minecraft:emitter_lifetime_once": {
"active_time": 1
},
"minecraft:emitter_shape_sphere": {
"radius": "variable.radius*math.cos(variable.emitter_age*2080)",
"direction": ["math.random(-5,5)*1.75", "math.random(-0.05,6)*3+0.5", "math.random(-5,5)*1.75"]
"direction": ["math.random(-10,10)", "math.random(-0.05,4)*4+0.5", "math.random(-10,10)"]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 1
},
"minecraft:particle_initial_speed": "math.random(3,7)*4",
"minecraft:particle_initial_speed": "math.random(4,7)*3",
"minecraft:particle_motion_dynamic": {
"linear_acceleration": [0, "-math.random(5,8)", 0],
"linear_acceleration": [0, -5, 0],
"linear_drag_coefficient": 4
},
"minecraft:particle_appearance_billboard": {
@@ -5,52 +5,38 @@
"identifier": "cobblemon:ancientoriginball/battle/ballsparks",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/balls/originball/originballsparks"
}
},
"curves": {
"variable.sizefunny": {
"type": "linear",
"input": "v.particle_age",
"horizontal_range": "v.particle_lifetime",
"nodes": [1, 1, 1, 0.98, 0.93, 0.83, 0.58, -0.01, 0, 0]
"texture": "textures/particles/balls/pokeball/ballsparks"
}
},
"components": {
"minecraft:emitter_rate_instant": {
"num_particles": 20
"num_particles": 10
},
"minecraft:emitter_lifetime_once": {
"active_time": 0.5
"active_time": 1
},
"minecraft:emitter_shape_sphere": {
"direction": ["math.random(-10,10)", "math.random(-0.1,4)*3+0.25", "math.random(-10,10)"]
"direction": ["math.random(-10,10)", "math.random(-0.1,4)*3+0.5", "math.random(-10,10)"]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 1
},
"minecraft:particle_initial_speed": "math.random(3.1,4.8)*3.5",
"minecraft:particle_initial_speed": "math.random(4,7)*3.5",
"minecraft:particle_motion_dynamic": {
"linear_acceleration": ["math.random(-3.5,3.5)*10", "math.random(-2.5,2.5)*10", "math.random(-3.5,3.5)*10"],
"linear_drag_coefficient": 3.5
"linear_drag_coefficient": 4.5
},
"minecraft:particle_appearance_billboard": {
"size": ["(0.225-(variable.particle_random_3*0.1))*v.sizefunny", "(0.225-(variable.particle_random_3*0.1))*v.sizefunny"],
"size": [0.15, 0.15],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 90,
"texture_height": 9,
"uv": ["math.floor(v.particle_random_3*10)*9", 0],
"uv_size": [9, 9]
}
},
"minecraft:particle_appearance_tinting": {
"color": {
"interpolant": "v.particle_age / v.particle_lifetime",
"gradient": {
"0.14": "#ffffffff",
"0.43": "#FFFF0000",
"0.71": "#FF7B0000"
"texture_width": 80,
"texture_height": 8,
"flipbook": {
"base_UV": [0, 0],
"size_UV": [8, 8],
"step_UV": [8, 0],
"frames_per_second": 18,
"max_frame": 10
}
}
}
@@ -5,7 +5,7 @@
"identifier": "cobblemon:ancientoriginball/battle/sendflash",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/balls/originball/battle/originsendflash"
"texture": "textures/particles/balls/pokeball/battle/sendflash"
}
},
"components": {
@@ -27,14 +27,14 @@
"size": [2.25, 2.25],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 1088,
"texture_width": 1024,
"texture_height": 64,
"flipbook": {
"base_UV": [0, 0],
"size_UV": [64, 64],
"step_UV": [64, 0],
"frames_per_second": 24,
"max_frame": 17
"max_frame": 16
}
}
}
@@ -5,12 +5,12 @@
"identifier": "cobblemon:ancientoriginball/casual/ballsendsparkle",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/balls/originball/originballsendsparkle"
"texture": "textures/particles/balls/pokeball/ballsendsparkle"
}
},
"components": {
"minecraft:emitter_rate_instant": {
"num_particles": 6
"num_particles": 4
},
"minecraft:emitter_lifetime_once": {
"active_time": 1
@@ -21,7 +21,7 @@
"minecraft:particle_lifetime_expression": {
"max_lifetime": 1
},
"minecraft:particle_initial_speed": "math.random(3,6)*3",
"minecraft:particle_initial_speed": "math.random(4,6)*2.5",
"minecraft:particle_motion_dynamic": {
"linear_acceleration": [0, -6, 0],
"linear_drag_coefficient": 4
@@ -5,52 +5,38 @@
"identifier": "cobblemon:ancientoriginball/casual/ballsparks",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/balls/originball/originballsparks"
}
},
"curves": {
"variable.sizefunny": {
"type": "linear",
"input": "v.particle_age",
"horizontal_range": "v.particle_lifetime",
"nodes": [1, 1, 1, 0.98, 0.93, 0.83, 0.58, -0.01, 0, 0, 0]
"texture": "textures/particles/balls/pokeball/ballsparks"
}
},
"components": {
"minecraft:emitter_rate_instant": {
"num_particles": 10
"num_particles": 5
},
"minecraft:emitter_lifetime_once": {
"active_time": 0.5
"active_time": 1
},
"minecraft:emitter_shape_sphere": {
"direction": ["math.random(-10,10)", "math.random(-0.1,4)*3+0.25", "math.random(-10,10)"]
"direction": ["math.random(-10,10)", "math.random(-0.1,4)*3+0.5", "math.random(-10,10)"]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 1
},
"minecraft:particle_initial_speed": "math.random(3.1,4.8)*2.5",
"minecraft:particle_initial_speed": "math.random(4,7)*2.1",
"minecraft:particle_motion_dynamic": {
"linear_acceleration": ["math.random(-3.5,3.5)*10", "math.random(-2.5,2.5)*10", "math.random(-3.5,3.5)*10"],
"linear_drag_coefficient": 3.5
},
"minecraft:particle_appearance_billboard": {
"size": ["(0.225-(variable.particle_random_3*0.1))*v.sizefunny", "(0.225-(variable.particle_random_3*0.1))*v.sizefunny"],
"size": [0.1, 0.1],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 90,
"texture_height": 9,
"uv": ["math.floor(v.particle_random_3*10)*9", 0],
"uv_size": [9, 9]
}
},
"minecraft:particle_appearance_tinting": {
"color": {
"interpolant": "v.particle_age / v.particle_lifetime",
"gradient": {
"0.14": "#ffffffff",
"0.33": "#FFFF0000",
"0.61": "#FF7B0000"
"texture_width": 80,
"texture_height": 8,
"flipbook": {
"base_UV": [0, 0],
"size_UV": [8, 8],
"step_UV": [8, 0],
"frames_per_second": 18,
"max_frame": 10
}
}
}
@@ -5,7 +5,7 @@
"identifier": "cobblemon:ancientoriginball/casual/sendflash",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/balls/originball/casual/originsendcasual"
"texture": "textures/particles/balls/pokeball/casual/sendcasual"
}
},
"components": {
@@ -27,14 +27,14 @@
"size": [1.25, 1.25],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 416,
"texture_width": 384,
"texture_height": 32,
"flipbook": {
"base_UV": [0, 0],
"size_UV": [32, 32],
"step_UV": [32, 0],
"frames_per_second": 24,
"max_frame": 13
"max_frame": 12
}
}
}
@@ -5,32 +5,30 @@
"identifier": "cobblemon:beastball/ballsparkle",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/balls/beastball/beastballsparkle"
"texture": "textures/particles/balls/pokeball/ballsparkle"
}
},
"components": {
"minecraft:emitter_rate_steady": {
"spawn_rate": 24,
"max_particles": 18
"spawn_rate": 16,
"max_particles": 16
},
"minecraft:emitter_lifetime_once": {
"active_time": 0.5
},
"minecraft:emitter_shape_sphere": {
"offset": [0, 1.75, 0],
"radius": 1.25,
"offset": [0, 1.5, 0],
"radius": "math.random(0.5,1.5)*1.5",
"surface_only": true,
"direction": ["math.random(-9,9)", "math.random(4,7)", "math.random(-9,9)"]
"direction": [0, 1, 0]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 1
},
"minecraft:particle_initial_speed": 0.75,
"minecraft:particle_motion_dynamic": {
"linear_acceleration": [0, 2, 0]
},
"minecraft:particle_motion_dynamic": {},
"minecraft:particle_appearance_billboard": {
"size": [0.15, 0.15],
"size": [0.2, 0.2],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 36,
@@ -5,12 +5,12 @@
"identifier": "cobblemon:beastball/battle/ballsendsparkle",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/balls/beastball/beastballsendsparkle"
"texture": "textures/particles/balls/pokeball/ballsendsparkle"
}
},
"components": {
"minecraft:emitter_rate_instant": {
"num_particles": 14
"num_particles": 8
},
"minecraft:emitter_lifetime_once": {
"active_time": 1
@@ -21,13 +21,13 @@
"minecraft:particle_lifetime_expression": {
"max_lifetime": 1
},
"minecraft:particle_initial_speed": "math.random(4,7)*4.5",
"minecraft:particle_initial_speed": "math.random(4,7)*3",
"minecraft:particle_motion_dynamic": {
"linear_acceleration": [0, -6, 0],
"linear_drag_coefficient": 5
"linear_acceleration": [0, -5, 0],
"linear_drag_coefficient": 4
},
"minecraft:particle_appearance_billboard": {
"size": [0.125, 0.125],
"size": [0.15, 0.15],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 99,
@@ -5,32 +5,28 @@
"identifier": "cobblemon:beastball/battle/ballsparks",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/balls/beastball/beastballsparks"
"texture": "textures/particles/balls/pokeball/ballsparks"
}
},
"components": {
"minecraft:emitter_rate_instant": {
"num_particles": 20
"num_particles": 10
},
"minecraft:emitter_lifetime_once": {
"active_time": 1
},
"minecraft:emitter_shape_sphere": {
"direction": ["math.random(-10,10)", "math.random(-0.5,5)*5+0.5", "math.random(-10,10)"]
"direction": ["math.random(-10,10)", "math.random(-0.1,4)*3+0.5", "math.random(-10,10)"]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 1
},
"minecraft:particle_initial_spin": {
"rotation": "math.random_integer(0,3)*90"
},
"minecraft:particle_initial_speed": "math.random(3,6)*3",
"minecraft:particle_initial_speed": "math.random(4,7)*3.5",
"minecraft:particle_motion_dynamic": {
"linear_acceleration": [0, -20, 0],
"linear_drag_coefficient": 2
"linear_drag_coefficient": 4.5
},
"minecraft:particle_appearance_billboard": {
"size": ["0.075+0.075*v.particle_random_2", "0.075+0.075*v.particle_random_2"],
"size": [0.15, 0.15],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 80,
@@ -5,7 +5,7 @@
"identifier": "cobblemon:beastball/battle/sendflash",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/balls/beastball/battle/beastsendflash"
"texture": "textures/particles/balls/pokeball/battle/sendflash"
}
},
"components": {
@@ -27,14 +27,14 @@
"size": [2.25, 2.25],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 1088,
"texture_width": 1024,
"texture_height": 64,
"flipbook": {
"base_UV": [0, 0],
"size_UV": [64, 64],
"step_UV": [64, 0],
"frames_per_second": 24,
"max_frame": 17
"max_frame": 16
}
}
}
@@ -5,12 +5,12 @@
"identifier": "cobblemon:beastball/casual/ballsendsparkle",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/balls/beastball/beastballsendsparkle"
"texture": "textures/particles/balls/pokeball/ballsendsparkle"
}
},
"components": {
"minecraft:emitter_rate_instant": {
"num_particles": 6
"num_particles": 4
},
"minecraft:emitter_lifetime_once": {
"active_time": 1
@@ -21,7 +21,7 @@
"minecraft:particle_lifetime_expression": {
"max_lifetime": 1
},
"minecraft:particle_initial_speed": "math.random(3,6)*3",
"minecraft:particle_initial_speed": "math.random(4,6)*2.5",
"minecraft:particle_motion_dynamic": {
"linear_acceleration": [0, -6, 0],
"linear_drag_coefficient": 4
@@ -5,32 +5,28 @@
"identifier": "cobblemon:beastball/casual/ballsparks",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/balls/beastball/beastballsparks"
"texture": "textures/particles/balls/pokeball/ballsparks"
}
},
"components": {
"minecraft:emitter_rate_instant": {
"num_particles": 12
"num_particles": 5
},
"minecraft:emitter_lifetime_once": {
"active_time": 1
},
"minecraft:emitter_shape_sphere": {
"direction": ["math.random(-10,10)", "math.random(-0.5,5)*5+0.5", "math.random(-10,10)"]
"direction": ["math.random(-10,10)", "math.random(-0.1,4)*3+0.5", "math.random(-10,10)"]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 1
},
"minecraft:particle_initial_spin": {
"rotation": "math.random_integer(0,3)*90"
},
"minecraft:particle_initial_speed": "math.random(3,7)*2",
"minecraft:particle_initial_speed": "math.random(4,7)*2.1",
"minecraft:particle_motion_dynamic": {
"linear_acceleration": [0, -15, 0],
"linear_drag_coefficient": 2
"linear_drag_coefficient": 3.5
},
"minecraft:particle_appearance_billboard": {
"size": ["0.05+0.075*v.particle_random_2", "0.05+0.075*v.particle_random_2"],
"size": [0.1, 0.1],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 80,
@@ -5,7 +5,7 @@
"identifier": "cobblemon:beastball/casual/sendflash",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/balls/beastball/casual/beastsendcasual"
"texture": "textures/particles/balls/pokeball/casual/sendcasual"
}
},
"components": {
@@ -5,32 +5,30 @@
"identifier": "cobblemon:cherishball/ballsparkle",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/balls/cherishball/cherishballsparkle"
"texture": "textures/particles/balls/pokeball/ballsparkle"
}
},
"components": {
"minecraft:emitter_rate_steady": {
"spawn_rate": 24,
"max_particles": 18
"spawn_rate": 16,
"max_particles": 16
},
"minecraft:emitter_lifetime_once": {
"active_time": 0.5
},
"minecraft:emitter_shape_sphere": {
"offset": [0, 1.75, 0],
"radius": 1.25,
"offset": [0, 1.5, 0],
"radius": "math.random(0.5,1.5)*1.5",
"surface_only": true,
"direction": ["math.random(-9,9)", "math.random(4,7)", "math.random(-9,9)"]
"direction": [0, 1, 0]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 1
},
"minecraft:particle_initial_speed": 0.75,
"minecraft:particle_motion_dynamic": {
"linear_acceleration": [0, 2, 0]
},
"minecraft:particle_motion_dynamic": {},
"minecraft:particle_appearance_billboard": {
"size": [0.15, 0.15],
"size": [0.2, 0.2],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 36,
@@ -43,15 +41,6 @@
"max_frame": 4
}
}
},
"minecraft:particle_appearance_tinting": {
"color": {
"interpolant": "v.particle_age / v.particle_lifetime",
"gradient": {
"0.0": "#FFFFFFFF",
"0.19": "#FFFF8845"
}
}
}
}
}
@@ -5,12 +5,12 @@
"identifier": "cobblemon:cherishball/battle/ballsendsparkle",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/balls/cherishball/cherishballsendsparkle"
"texture": "textures/particles/balls/pokeball/ballsendsparkle"
}
},
"components": {
"minecraft:emitter_rate_instant": {
"num_particles": 14
"num_particles": 8
},
"minecraft:emitter_lifetime_once": {
"active_time": 1
@@ -21,13 +21,13 @@
"minecraft:particle_lifetime_expression": {
"max_lifetime": 1
},
"minecraft:particle_initial_speed": "math.random(4,7)*4.5",
"minecraft:particle_initial_speed": "math.random(4,7)*3",
"minecraft:particle_motion_dynamic": {
"linear_acceleration": [0, -6, 0],
"linear_drag_coefficient": 5
"linear_acceleration": [0, -5, 0],
"linear_drag_coefficient": 4
},
"minecraft:particle_appearance_billboard": {
"size": [0.125, 0.125],
"size": [0.15, 0.15],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 99,
@@ -40,17 +40,6 @@
"max_frame": 11
}
}
},
"minecraft:particle_appearance_tinting": {
"color": {
"interpolant": "v.particle_age / v.particle_lifetime",
"gradient": {
"0.0": "#FF8DFFC6",
"0.2": "#ffffffff",
"0.35": "#ffffffff",
"0.53": "#FFFF8845"
}
}
}
}
}
@@ -5,12 +5,12 @@
"identifier": "cobblemon:cherishball/battle/ballsparks",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/balls/cherishball/cherishballsparks"
"texture": "textures/particles/balls/pokeball/ballsparks"
}
},
"components": {
"minecraft:emitter_rate_instant": {
"num_particles": 8
"num_particles": 10
},
"minecraft:emitter_lifetime_once": {
"active_time": 1
@@ -21,9 +21,9 @@
"minecraft:particle_lifetime_expression": {
"max_lifetime": 1
},
"minecraft:particle_initial_speed": "math.random(3,6)*3.75",
"minecraft:particle_initial_speed": "math.random(4,7)*3.5",
"minecraft:particle_motion_dynamic": {
"linear_drag_coefficient": 5
"linear_drag_coefficient": 4.5
},
"minecraft:particle_appearance_billboard": {
"size": [0.15, 0.15],
@@ -39,17 +39,6 @@
"max_frame": 10
}
}
},
"minecraft:particle_appearance_tinting": {
"color": {
"interpolant": "v.particle_age / v.particle_lifetime",
"gradient": {
"0.0": "#FF8DFFC6",
"0.2": "#ffffffff",
"0.35": "#ffffffff",
"0.53": "#FFFF8845"
}
}
}
}
}
@@ -5,7 +5,7 @@
"identifier": "cobblemon:cherishball/battle/sendflash",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/balls/cherishball/battle/cherishsendflash"
"texture": "textures/particles/balls/pokeball/battle/sendflash"
}
},
"components": {
@@ -27,25 +27,14 @@
"size": [2.25, 2.25],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 1088,
"texture_width": 1024,
"texture_height": 64,
"flipbook": {
"base_UV": [0, 0],
"size_UV": [64, 64],
"step_UV": [64, 0],
"frames_per_second": 24,
"max_frame": 17
}
}
},
"minecraft:particle_appearance_tinting": {
"color": {
"interpolant": "v.particle_age / v.particle_lifetime",
"gradient": {
"0.0": "#FF8DFFC6",
"0.2": "#ffffffff",
"0.35": "#ffffffff",
"0.53": "#FFFF8845"
"max_frame": 16
}
}
}
@@ -5,12 +5,12 @@
"identifier": "cobblemon:cherishball/casual/ballsendsparkle",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/balls/cherishball/cherishballsendsparkle"
"texture": "textures/particles/balls/pokeball/ballsendsparkle"
}
},
"components": {
"minecraft:emitter_rate_instant": {
"num_particles": 6
"num_particles": 4
},
"minecraft:emitter_lifetime_once": {
"active_time": 1
@@ -21,7 +21,7 @@
"minecraft:particle_lifetime_expression": {
"max_lifetime": 1
},
"minecraft:particle_initial_speed": "math.random(3,6)*3",
"minecraft:particle_initial_speed": "math.random(4,6)*2.5",
"minecraft:particle_motion_dynamic": {
"linear_acceleration": [0, -6, 0],
"linear_drag_coefficient": 4
@@ -40,17 +40,6 @@
"max_frame": 11
}
}
},
"minecraft:particle_appearance_tinting": {
"color": {
"interpolant": "v.particle_age / v.particle_lifetime",
"gradient": {
"0.0": "#FF8DFFC6",
"0.2": "#ffffffff",
"0.35": "#ffffffff",
"0.53": "#FFFF8845"
}
}
}
}
}
@@ -5,7 +5,7 @@
"identifier": "cobblemon:cherishball/casual/ballsparks",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/balls/cherishball/cherishballsparks"
"texture": "textures/particles/balls/pokeball/ballsparks"
}
},
"components": {
@@ -21,9 +21,9 @@
"minecraft:particle_lifetime_expression": {
"max_lifetime": 1
},
"minecraft:particle_initial_speed": "math.random(3,7)*2",
"minecraft:particle_initial_speed": "math.random(4,7)*2.1",
"minecraft:particle_motion_dynamic": {
"linear_drag_coefficient": 3
"linear_drag_coefficient": 3.5
},
"minecraft:particle_appearance_billboard": {
"size": [0.1, 0.1],
@@ -39,17 +39,6 @@
"max_frame": 10
}
}
},
"minecraft:particle_appearance_tinting": {
"color": {
"interpolant": "v.particle_age / v.particle_lifetime",
"gradient": {
"0.0": "#FF8DFFC6",
"0.2": "#ffffffff",
"0.35": "#ffffffff",
"0.53": "#FFFF8845"
}
}
}
}
}
@@ -5,7 +5,7 @@
"identifier": "cobblemon:cherishball/casual/sendflash",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/balls/cherishball/casual/cherishsendcasual"
"texture": "textures/particles/balls/pokeball/casual/sendcasual"
}
},
"components": {
@@ -27,25 +27,14 @@
"size": [1.25, 1.25],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 416,
"texture_width": 384,
"texture_height": 32,
"flipbook": {
"base_UV": [0, 0],
"size_UV": [32, 32],
"step_UV": [32, 0],
"frames_per_second": 24,
"max_frame": 13
}
}
},
"minecraft:particle_appearance_tinting": {
"color": {
"interpolant": "v.particle_age / v.particle_lifetime",
"gradient": {
"0.0": "#FF8DFFC6",
"0.2": "#ffffffff",
"0.35": "#ffffffff",
"0.53": "#FFFF8845"
"max_frame": 12
}
}
}
@@ -5,22 +5,22 @@
"identifier": "cobblemon:dreamball/ballsparkle",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/balls/dreamball/dreamballsparkle"
"texture": "textures/particles/balls/pokeball/ballsparkle"
}
},
"components": {
"minecraft:emitter_rate_steady": {
"spawn_rate": 20,
"max_particles": 14
"spawn_rate": 16,
"max_particles": 16
},
"minecraft:emitter_lifetime_once": {
"active_time": 0.5
},
"minecraft:emitter_shape_sphere": {
"offset": [0, 1.25, 0],
"radius": "1.25",
"offset": [0, 1.5, 0],
"radius": "math.random(0.5,1.5)*1.5",
"surface_only": true,
"direction": "outwards"
"direction": [0, 1, 0]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 1
@@ -5,12 +5,12 @@
"identifier": "cobblemon:dreamball/battle/ballsendsparkle",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/balls/dreamball/dreamballsendsparkle"
"texture": "textures/particles/balls/pokeball/ballsendsparkle"
}
},
"components": {
"minecraft:emitter_rate_instant": {
"num_particles": 14
"num_particles": 8
},
"minecraft:emitter_lifetime_once": {
"active_time": 1
@@ -21,13 +21,13 @@
"minecraft:particle_lifetime_expression": {
"max_lifetime": 1
},
"minecraft:particle_initial_speed": "math.random(4,7)*4.5",
"minecraft:particle_initial_speed": "math.random(4,7)*3",
"minecraft:particle_motion_dynamic": {
"linear_acceleration": [0, -6, 0],
"linear_drag_coefficient": 5
"linear_acceleration": [0, -5, 0],
"linear_drag_coefficient": 4
},
"minecraft:particle_appearance_billboard": {
"size": [0.125, 0.125],
"size": [0.15, 0.15],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 99,
@@ -5,12 +5,12 @@
"identifier": "cobblemon:dreamball/battle/ballsparks",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/balls/dreamball/dreamballsparks"
"texture": "textures/particles/balls/pokeball/ballsparks"
}
},
"components": {
"minecraft:emitter_rate_instant": {
"num_particles": 8
"num_particles": 10
},
"minecraft:emitter_lifetime_once": {
"active_time": 1
@@ -21,9 +21,9 @@
"minecraft:particle_lifetime_expression": {
"max_lifetime": 1
},
"minecraft:particle_initial_speed": "math.random(3,6)*3.75",
"minecraft:particle_initial_speed": "math.random(4,7)*3.5",
"minecraft:particle_motion_dynamic": {
"linear_drag_coefficient": 5
"linear_drag_coefficient": 4.5
},
"minecraft:particle_appearance_billboard": {
"size": [0.15, 0.15],
@@ -5,7 +5,7 @@
"identifier": "cobblemon:dreamball/battle/sendflash",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/balls/dreamball/battle/dreamsendflash"
"texture": "textures/particles/balls/pokeball/battle/sendflash"
}
},
"components": {
@@ -27,14 +27,14 @@
"size": [2.25, 2.25],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 1088,
"texture_width": 1024,
"texture_height": 64,
"flipbook": {
"base_UV": [0, 0],
"size_UV": [64, 64],
"step_UV": [64, 0],
"frames_per_second": 24,
"max_frame": 17
"max_frame": 16
}
}
}
@@ -5,12 +5,12 @@
"identifier": "cobblemon:dreamball/casual/ballsendsparkle",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/balls/dreamball/dreamballsendsparkle"
"texture": "textures/particles/balls/pokeball/ballsendsparkle"
}
},
"components": {
"minecraft:emitter_rate_instant": {
"num_particles": 6
"num_particles": 4
},
"minecraft:emitter_lifetime_once": {
"active_time": 1
@@ -21,7 +21,7 @@
"minecraft:particle_lifetime_expression": {
"max_lifetime": 1
},
"minecraft:particle_initial_speed": "math.random(3,6)*3",
"minecraft:particle_initial_speed": "math.random(4,6)*2.5",
"minecraft:particle_motion_dynamic": {
"linear_acceleration": [0, -6, 0],
"linear_drag_coefficient": 4
@@ -5,7 +5,7 @@
"identifier": "cobblemon:dreamball/casual/ballsparks",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/balls/dreamball/dreamballsparks"
"texture": "textures/particles/balls/pokeball/ballsparks"
}
},
"components": {
@@ -21,9 +21,9 @@
"minecraft:particle_lifetime_expression": {
"max_lifetime": 1
},
"minecraft:particle_initial_speed": "math.random(3,7)*2",
"minecraft:particle_initial_speed": "math.random(4,7)*2.1",
"minecraft:particle_motion_dynamic": {
"linear_drag_coefficient": 3
"linear_drag_coefficient": 3.5
},
"minecraft:particle_appearance_billboard": {
"size": [0.1, 0.1],
@@ -5,7 +5,7 @@
"identifier": "cobblemon:dreamball/casual/sendflash",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/balls/dreamball/casual/dreamsendcasual"
"texture": "textures/particles/balls/pokeball/casual/sendcasual"
}
},
"components": {
@@ -231,7 +231,7 @@
],
"position": [0, "(math.clamp(math.sin(q.anim_time*90*4-110+180)*1,0.5,1)-0.5)*0.7", 0]
},
"wool_shearable": {
"wool": {
"position": [0, "0.5+Math.sin((query.anim_time-0.3) * 90 * 8) * 0.3", 0]
},
"tail": {
@@ -419,10 +419,10 @@
},
"position": {
"0.0": [0, 0, 0],
"0.1667": [0, -1, -1],
"0.3333": [0, -3, 0],
"1.6667": [0, -3, 0],
"1.8333": [0, -1, -1],
"0.1667": [0, -2, -1],
"0.3333": [0, -4, 0],
"1.6667": [0, -4, 0],
"1.8333": [0, -2, -1],
"2.0": [0, 0, 0]
}
},
@@ -544,28 +544,26 @@
},
"ear_left": {
"rotation": {
"0.0": [0, 0, 0],
"0.2917": [-5, 10, -10],
"0.4583": [-12.5, 11, -5],
"0.6667": [-14, 12.3, 0],
"1.0": [-15, 11.53, 0],
"1.6667": [-10, 10, 0],
"1.9167": [0, 10, 10],
"2.0417": [0, -5, -5],
"2.1667": [0, 0, 0]
"0.0": [0, -10, 0],
"0.2917": [0, -10, -10],
"0.4583": [0, -5, 5],
"0.6667": [0, -10, 0],
"1.6667": [0, -10, 0],
"1.9167": [0, 0, 10],
"2.0417": [0, -15, -5],
"2.1667": [0, -10, 0]
}
},
"ear_right": {
"rotation": {
"0.0": [0, 0, 0],
"0.2917": [-5, -10, 10],
"0.4583": [-12.5, -11, 5],
"0.6667": [-14, -12.3, 0],
"1.0": [-15, -11.53, 0],
"1.6667": [-10, -10, 0],
"1.9167": [0, -10, -10],
"2.0417": [0, 5, 5],
"2.1667": [0, 0, 0]
"0.0": [0, 10, 0],
"0.2917": [0, 10, 10],
"0.4583": [0, 5, -5],
"0.6667": [0, 10, 0],
"1.6667": [0, 10, 0],
"1.9167": [0, 0, -10],
"2.0417": [0, 15, 5],
"2.1667": [0, 10, 0]
}
},
"neck": {
@@ -23,16 +23,16 @@
{
"name": "torso",
"parent": "body",
"pivot": [0, 7.5, 3.75],
"pivot": [0, 8.5, 3.75],
"cubes": [
{"origin": [-3, 5.75, 0], "size": [6, 6, 6], "uv": [24, 26]},
{"origin": [-3, 5.75, -5], "size": [6, 6, 6], "inflate": 0.01, "uv": [0, 26]}
{"origin": [-3, 6.75, 0], "size": [6, 6, 6], "uv": [24, 26]},
{"origin": [-3, 6.75, -5], "size": [6, 6, 6], "inflate": 0.01, "uv": [0, 26]}
]
},
{
"name": "wool_shearable",
"name": "wool",
"parent": "torso",
"pivot": [6.5, 1.75, -5],
"pivot": [6.5, 2.75, -5],
"cubes": [
{"origin": [-6.5, 2.75, -5.5], "size": [13, 13, 13], "inflate": 0.02, "uv": [0, 0]}
]
@@ -58,201 +58,177 @@
{
"name": "neck",
"parent": "torso",
"pivot": [0, 7.65, -1.5],
"pivot": [0, 8.65, -1.5],
"cubes": [
{"origin": [-2, 7.65, -5.5], "size": [4, 4, 4], "inflate": 0.01, "uv": [8, 56]}
{"origin": [-2, 8.65, -5.5], "size": [4, 4, 4], "inflate": 0.01, "uv": [8, 56]}
]
},
{
"name": "head",
"parent": "torso",
"pivot": [0.1, 9.75, -5],
"pivot": [0.1, 10.75, -5],
"cubes": [
{"origin": [-2.5, 7.75, -10.5], "size": [5, 4, 6], "uv": [0, 39]},
{"origin": [-1, 9, -10.5], "size": [2, 1, 0], "inflate": 0.01, "uv": [0, 30]}
]
},
{
"name": "horn_right",
"parent": "head",
"pivot": [-2, 12.75, -7.75],
"rotation": [-15, 0, -5],
"cubes": [
{"origin": [-2.5, 11.75, -8.25], "size": [1, 2, 1], "pivot": [-2, 12.75, -7.75], "rotation": [0, 47.5, 0], "uv": [39, 0]}
]
},
{
"name": "horn_left",
"parent": "head",
"pivot": [2, 12.75, -7.75],
"rotation": [-15, 0, 5],
"cubes": [
{"origin": [1.5, 11.75, -8.25], "size": [1, 2, 1], "pivot": [2, 12.75, -7.75], "rotation": [0, -47.5, 0], "uv": [9, 0]}
{"origin": [-2.5, 8.75, -10.5], "size": [5, 4, 6], "uv": [0, 39]},
{"origin": [-1, 10, -10.5], "size": [2, 1, 0], "inflate": 0.01, "uv": [0, 30]},
{"origin": [-1.9, 12.75, -8.25], "size": [1, 2, 1], "pivot": [-1.9, 12.75, -7.25], "rotation": [0, -5, -5], "uv": [39, 0]},
{"origin": [0.9, 12.75, -8.25], "size": [1, 2, 1], "pivot": [1.9, 12.75, -7.25], "rotation": [0, 5, 5], "uv": [9, 0]}
]
},
{
"name": "eyes",
"parent": "head",
"pivot": [-0.15, 9.75, -9]
"pivot": [-0.15, 10.75, -9]
},
{
"name": "eye_right",
"parent": "eyes",
"pivot": [-3.6, 9, -8.5],
"pivot": [-3.6, 10, -8.5],
"cubes": [
{"origin": [-2.51, 8.75, -9.5], "size": [0, 2, 1], "uv": [18, 25], "mirror": true},
{"origin": [-2.451, 8.75, -9.5], "size": [0, 2, 1], "inflate": 0.05, "uv": [0, 0], "mirror": true},
{"origin": [-2.52, 9.25, -9.5], "size": [0, 1, 1], "uv": [8, 9], "mirror": true}
{"origin": [-2.51, 9.75, -9.5], "size": [0, 2, 1], "uv": [18, 25], "mirror": true},
{"origin": [-2.401, 9.75, -9.5], "size": [0, 2, 1], "inflate": 0.1, "uv": [0, 0], "mirror": true},
{"origin": [-2.52, 10.25, -9.5], "size": [0, 1, 1], "uv": [8, 9], "mirror": true}
]
},
{
"name": "eyelid_right",
"parent": "eye_right",
"pivot": [-1.8645, 9.75, -9.01],
"pivot": [-1.82, 10.75, -9],
"cubes": [
{"origin": [-2.3645, 8.75, -10.01], "size": [1, 2, 2], "inflate": 0.06, "uv": [54, 39]}
{"origin": [-2.32, 9.75, -9.5], "size": [1, 2, 1], "inflate": 0.11, "uv": [54, 39]}
]
},
{
"name": "eye_left",
"parent": "eyes",
"pivot": [3.75, 9, -8.5],
"pivot": [3.75, 10, -8.5],
"cubes": [
{"origin": [2.51, 8.75, -9.5], "size": [0, 2, 1], "uv": [24, 25], "mirror": true},
{"origin": [2.452, 8.75, -9.5], "size": [0, 2, 1], "inflate": 0.05, "uv": [0, 7], "mirror": true},
{"origin": [2.52, 9.25, -9.5], "size": [0, 1, 1], "uv": [8, 10], "mirror": true}
{"origin": [2.51, 9.75, -9.5], "size": [0, 2, 1], "uv": [24, 25], "mirror": true},
{"origin": [2.402, 9.75, -9.5], "size": [0, 2, 1], "inflate": 0.1, "uv": [0, 7], "mirror": true},
{"origin": [2.52, 10.25, -9.5], "size": [0, 1, 1], "uv": [8, 10], "mirror": true}
]
},
{
"name": "eyelid_left",
"parent": "eye_left",
"pivot": [1.8645, 9.75, -9.01],
"pivot": [1.82, 10.75, -9],
"cubes": [
{"origin": [1.3645, 8.75, -10.01], "size": [1, 2, 2], "inflate": 0.06, "uv": [56, 32], "mirror": true}
{"origin": [1.32, 9.75, -9.5], "size": [1, 2, 1], "inflate": 0.11, "uv": [52, 36], "mirror": true}
]
},
{
"name": "mouth_open",
"parent": "head",
"pivot": [-0.05, 9, -9.5],
"pivot": [-0.05, 10, -9.5],
"cubes": [
{"origin": [-1.05, 7.75, -10.41], "size": [2, 1, 0], "uv": [8, 12]}
{"origin": [-1.05, 8.75, -10.41], "size": [2, 1, 0], "uv": [8, 12]}
]
},
{
"name": "head_wool",
"parent": "head",
"pivot": [-2.3928, 12.73889, -6.69372],
"pivot": [-2.3928, 13.73889, -6.69372],
"cubes": [
{"origin": [-2.025, 11, -9.19785], "size": [2, 2, 2], "pivot": [-1.05693, 11.8315, -8.01133], "rotation": [0, 5, 0], "uv": [50, 24]},
{"origin": [-2.5, 7.5, -7.5], "size": [5, 5, 3], "inflate": 0.01, "uv": [24, 56]},
{"origin": [0.025, 11, -9.19785], "size": [2, 2, 2], "pivot": [1.06611, 11.8315, -8.01133], "rotation": [0, -5, 0], "uv": [52, 10]},
{"origin": [-3.75, 10.75, -8.5], "size": [2, 2, 2], "uv": [8, 49]},
{"origin": [1.75, 10.75, -8.5], "size": [2, 2, 2], "uv": [16, 39]}
]
},
{
"name": "head_wool_shearable",
"parent": "head_wool",
"pivot": [0, -1, 0],
"cubes": [
{"origin": [-2.5, 9.5, -7.5], "size": [5, 4, 4], "inflate": 0.02, "uv": [39, 0]}
{"origin": [-2.025, 12, -9.19785], "size": [2, 2, 2], "pivot": [-1.05693, 12.8315, -8.01133], "rotation": [0, 5, 0], "uv": [50, 24]},
{"origin": [-2.5, 8.5, -7.5], "size": [5, 6, 4], "inflate": 0.01, "uv": [39, 0]},
{"origin": [0.025, 12, -9.19785], "size": [2, 2, 2], "pivot": [1.06611, 12.8315, -8.01133], "rotation": [0, -5, 0], "uv": [52, 10]},
{"origin": [-3.75, 11.5, -8.25], "size": [2, 2, 2], "uv": [8, 49]},
{"origin": [1.75, 11.5, -8.25], "size": [2, 2, 2], "uv": [16, 39]}
]
},
{
"name": "braid_right",
"parent": "head_wool",
"pivot": [-3, 10.75, -7.5],
"pivot": [-3, 11.5, -7.5],
"cubes": [
{"origin": [-3.5, 10, -8], "size": [1, 1, 1], "uv": [0, 39]},
{"origin": [-4, 8.25, -8.5], "size": [2, 2, 2], "uv": [0, 49]}
{"origin": [-3.5, 10.75, -8], "size": [1, 1, 1], "uv": [0, 39]},
{"origin": [-4, 9, -8.5], "size": [2, 2, 2], "uv": [0, 49]}
]
},
{
"name": "braid_middle_right",
"parent": "braid_right",
"pivot": [-3, 8.25, -7.5],
"pivot": [-3, 9, -7.5],
"cubes": [
{"origin": [-3.5, 7.5, -8], "size": [1, 1, 1], "uv": [0, 41]},
{"origin": [-4, 5.75, -8.5], "size": [2, 2, 2], "uv": [36, 48]}
{"origin": [-3.5, 8.25, -8], "size": [1, 1, 1], "uv": [0, 41]},
{"origin": [-4, 6.5, -8.5], "size": [2, 2, 2], "uv": [36, 48]}
]
},
{
"name": "braid_bottom_right",
"parent": "braid_middle_right",
"pivot": [-3, 5.75, -7.5],
"pivot": [-3, 6.5, -7.5],
"cubes": [
{"origin": [-3.5, 5, -8], "size": [1, 1, 1], "uv": [0, 43]},
{"origin": [-4, 3.25, -8.5], "size": [2, 2, 2], "uv": [28, 48]},
{"origin": [-4, 3, -8.5], "size": [2, 1, 0], "pivot": [-3, 4, -8.5], "rotation": [-12.5, 0, 0], "uv": [0, 61]},
{"origin": [-4, 3, -8.5], "size": [0, 1, 2], "pivot": [-4, 4, -7.5], "rotation": [0, 0, 12.5], "uv": [0, 60]},
{"origin": [-2, 3, -8.5], "size": [0, 1, 2], "pivot": [-2, 4, -7.5], "rotation": [0, 0, -12.5], "uv": [0, 61]},
{"origin": [-4, 3, -6.5], "size": [2, 1, 0], "pivot": [-3, 4, -6.5], "rotation": [12.5, 0, 0], "uv": [0, 60]}
{"origin": [-3.5, 5.75, -8], "size": [1, 1, 1], "uv": [0, 43]},
{"origin": [-4, 4, -8.5], "size": [2, 2, 2], "uv": [28, 48]},
{"origin": [-4, 3.75, -8.5], "size": [2, 1, 0], "pivot": [-3, 4.75, -8.5], "rotation": [-12.5, 0, 0], "uv": [0, 61]},
{"origin": [-4, 3.75, -8.5], "size": [0, 1, 2], "pivot": [-4, 4.75, -7.5], "rotation": [0, 0, 12.5], "uv": [0, 60]},
{"origin": [-2, 3.75, -8.5], "size": [0, 1, 2], "pivot": [-2, 4.75, -7.5], "rotation": [0, 0, -12.5], "uv": [0, 61]},
{"origin": [-4, 3.75, -6.5], "size": [2, 1, 0], "pivot": [-3, 4.75, -6.5], "rotation": [12.5, 0, 0], "uv": [0, 60]}
]
},
{
"name": "braid_left",
"parent": "head_wool",
"pivot": [3, 10.75, -7.5],
"pivot": [3, 11.5, -7.5],
"cubes": [
{"origin": [2.5, 10, -8], "size": [1, 1, 1], "uv": [26, 26]},
{"origin": [2, 8.25, -8.5], "size": [2, 2, 2], "uv": [48, 30]}
{"origin": [2.5, 10.75, -8], "size": [1, 1, 1], "uv": [26, 26]},
{"origin": [2, 9, -8.5], "size": [2, 2, 2], "uv": [48, 30]}
]
},
{
"name": "braid_middle_left",
"parent": "braid_left",
"pivot": [3, 8.25, -7.5],
"pivot": [3, 9, -7.5],
"cubes": [
{"origin": [2.5, 7.5, -8], "size": [1, 1, 1], "uv": [26, 28]},
{"origin": [2, 5.75, -8.5], "size": [2, 2, 2], "uv": [32, 39]}
{"origin": [2.5, 8.25, -8], "size": [1, 1, 1], "uv": [26, 28]},
{"origin": [2, 6.5, -8.5], "size": [2, 2, 2], "uv": [32, 39]}
]
},
{
"name": "braid_bottom_left",
"parent": "braid_middle_left",
"pivot": [3, 5.75, -7.5],
"pivot": [3, 6.5, -7.5],
"cubes": [
{"origin": [2.5, 5, -8], "size": [1, 1, 1], "uv": [26, 30]},
{"origin": [2, 3.25, -8.5], "size": [2, 2, 2], "uv": [0, 8]},
{"origin": [2, 3, -8.5], "size": [2, 1, 0], "pivot": [3, 4, -8.5], "rotation": [-12.5, 0, 0], "uv": [4, 61], "mirror": true},
{"origin": [2, 3, -8.5], "size": [0, 1, 2], "pivot": [2, 4, -7.5], "rotation": [0, 0, 12.5], "uv": [4, 61], "mirror": true},
{"origin": [4, 3, -8.5], "size": [0, 1, 2], "pivot": [4, 4, -7.5], "rotation": [0, 0, -12.5], "uv": [4, 60], "mirror": true},
{"origin": [2, 3, -6.5], "size": [2, 1, 0], "pivot": [3, 4, -6.5], "rotation": [12.5, 0, 0], "uv": [4, 60], "mirror": true}
{"origin": [2.5, 5.75, -8], "size": [1, 1, 1], "uv": [26, 30]},
{"origin": [2, 4, -8.5], "size": [2, 2, 2], "uv": [0, 8]},
{"origin": [2, 3.75, -8.5], "size": [2, 1, 0], "pivot": [3, 4.75, -8.5], "rotation": [-12.5, 0, 0], "uv": [4, 61], "mirror": true},
{"origin": [2, 3.75, -8.5], "size": [0, 1, 2], "pivot": [2, 4.75, -7.5], "rotation": [0, 0, 12.5], "uv": [4, 61], "mirror": true},
{"origin": [4, 3.75, -8.5], "size": [0, 1, 2], "pivot": [4, 4.75, -7.5], "rotation": [0, 0, -12.5], "uv": [4, 60], "mirror": true},
{"origin": [2, 3.75, -6.5], "size": [2, 1, 0], "pivot": [3, 4.75, -6.5], "rotation": [12.5, 0, 0], "uv": [4, 60], "mirror": true}
]
},
{
"name": "ear_left",
"parent": "head",
"pivot": [2.5, 10.75, -6.5],
"pivot": [2.5, 11.75, -6.5],
"rotation": [0, 0, 15],
"cubes": [
{"origin": [2.25, 9, -6.5], "size": [4, 2, 0], "uv": [48, 34]}
{"origin": [2.25, 10, -6.5], "size": [4, 2, 0], "uv": [48, 34]}
]
},
{
"name": "ear_right",
"parent": "head",
"pivot": [-2.5, 10.75, -6.5],
"pivot": [-2.5, 11.75, -6.5],
"rotation": [0, 0, -15],
"cubes": [
{"origin": [-6.25, 9, -6.5], "size": [4, 2, 0], "uv": [39, 10]}
{"origin": [-6.25, 10, -6.5], "size": [4, 2, 0], "uv": [39, 10]}
]
},
{
"name": "leg_front_right",
"parent": "body",
"pivot": [2.25, 7.5, -3],
"pivot": [2.25, 8.5, -3],
"cubes": [
{"origin": [0.75, 4, -4.5], "size": [3, 5, 3], "uv": [0, 0]}
{"origin": [0.75, 5, -4.5], "size": [3, 5, 3], "uv": [0, 0]}
]
},
{
"name": "leg_front_right2",
"parent": "leg_front_right",
"pivot": [2.25, 5, -3.75],
"pivot": [2.25, 6, -3.75],
"cubes": [
{"origin": [1.25, 1.25, -3.75], "size": [2, 3, 2], "uv": [18, 26]}
{"origin": [1.25, 1.25, -3.75], "size": [2, 4, 2], "uv": [18, 26]}
]
},
{
@@ -266,17 +242,17 @@
{
"name": "leg_front_left",
"parent": "body",
"pivot": [-2.25, 7.5, -3],
"pivot": [-2.25, 8.5, -3],
"cubes": [
{"origin": [-3.75, 4, -4.5], "size": [3, 5, 3], "uv": [47, 45]}
{"origin": [-3.75, 5, -4.5], "size": [3, 5, 3], "uv": [47, 45]}
]
},
{
"name": "leg_front_left2",
"parent": "leg_front_left",
"pivot": [-2.25, 4, -3.75],
"pivot": [-2.25, 5, -3.75],
"cubes": [
{"origin": [-3.25, 1.25, -3.75], "size": [2, 3, 2], "uv": [42, 26]}
{"origin": [-3.25, 1.25, -3.75], "size": [2, 4, 2], "uv": [42, 26]}
]
},
{
@@ -290,17 +266,17 @@
{
"name": "leg_back_right",
"parent": "body",
"pivot": [2.25, 7.5, 3.5],
"pivot": [2.25, 8.5, 3.5],
"cubes": [
{"origin": [0.75, 4, 1.5], "size": [3, 5, 4], "uv": [22, 39]}
{"origin": [0.75, 5, 1.5], "size": [3, 5, 4], "uv": [22, 39]}
]
},
{
"name": "leg_back_right2",
"parent": "leg_back_right",
"pivot": [2.25, 4, 5],
"pivot": [2.25, 5, 5],
"cubes": [
{"origin": [1.25, 1.25, 3.75], "size": [2, 3, 2], "uv": [46, 37]}
{"origin": [1.25, 1.25, 3.75], "size": [2, 4, 2], "uv": [46, 37]}
]
},
{
@@ -314,17 +290,17 @@
{
"name": "leg_back_left",
"parent": "body",
"pivot": [-2.25, 7.5, 3.5],
"pivot": [-2.25, 8.5, 3.5],
"cubes": [
{"origin": [-3.75, 4, 1.5], "size": [3, 5, 4], "uv": [36, 39]}
{"origin": [-3.75, 5, 1.5], "size": [3, 5, 4], "uv": [36, 39]}
]
},
{
"name": "leg_back_left2",
"parent": "leg_back_left",
"pivot": [-2.25, 4, 5],
"pivot": [-2.25, 5, 5],
"cubes": [
{"origin": [-3.25, 1.25, 3.75], "size": [2, 3, 2], "uv": [20, 48]}
{"origin": [-3.25, 1.25, 3.75], "size": [2, 4, 2], "uv": [20, 48]}
]
},
{
@@ -30,7 +30,7 @@
]
},
{
"name": "wool_shearable",
"name": "wool",
"parent": "torso",
"pivot": [0, 12.75, 0.25],
"cubes": [
@@ -47,7 +47,7 @@
]
},
{
"name": "neck_wool_shearable",
"name": "neck_wool",
"parent": "neck",
"pivot": [0, 15.5, -9.5],
"rotation": [-62.5, 0, 0],
@@ -57,7 +57,7 @@
},
{
"name": "neck_wool_middle_right",
"parent": "neck_wool_shearable",
"parent": "neck_wool",
"pivot": [0.25, 13.75, -9.5],
"rotation": [7.5, 0, 12.5],
"cubes": [
@@ -66,7 +66,7 @@
},
{
"name": "neck_wool_middle_left",
"parent": "neck_wool_shearable",
"parent": "neck_wool",
"pivot": [-0.25, 13.75, -9.5],
"rotation": [7.5, 0, -12.5],
"cubes": [
@@ -75,7 +75,7 @@
},
{
"name": "neck_wool_right",
"parent": "neck_wool_shearable",
"parent": "neck_wool",
"pivot": [-1.75, 13.75, -9.5],
"rotation": [12.5, 0, 25],
"cubes": [
@@ -84,7 +84,7 @@
},
{
"name": "neck_wool_left",
"parent": "neck_wool_shearable",
"parent": "neck_wool",
"pivot": [1.75, 13.75, -9.5],
"rotation": [12.5, 0, -25],
"cubes": [
@@ -324,19 +324,19 @@
{
"name": "tail",
"parent": "torso",
"pivot": [0, 14, 7],
"pivot": [0, 15, 7],
"rotation": [-42.5, 0, 0],
"cubes": [
{"origin": [-0.5, 13, 7], "size": [1, 1, 3], "inflate": 0.01, "uv": [102, 1]}
{"origin": [-0.5, 14, 7], "size": [1, 1, 3], "inflate": 0.01, "uv": [102, 1]}
]
},
{
"name": "tail2",
"parent": "tail",
"pivot": [0, 13, 10],
"pivot": [0, 14, 10],
"rotation": [35, 0, 0],
"cubes": [
{"origin": [-0.5, 13, 10], "size": [1, 1, 3], "uv": [98, 26]}
{"origin": [-0.5, 14, 10], "size": [1, 1, 3], "uv": [98, 26]}
]
},
{
@@ -14,210 +14,6 @@
"shiny"
],
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_shiny.png"
},
{
"aspects": [
"color-black"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_black.png",
"emissive": false
}
]
},
{
"aspects": [
"color-blue"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_blue.png",
"emissive": false
}
]
},
{
"aspects": [
"color-brown"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_brown.png",
"emissive": false
}
]
},
{
"aspects": [
"color-cyan"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_cyan.png",
"emissive": false
}
]
},
{
"aspects": [
"color-gray"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_gray.png",
"emissive": false
}
]
},
{
"aspects": [
"color-green"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_green.png",
"emissive": false
}
]
},
{
"aspects": [
"color-light_blue"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_light_blue.png",
"emissive": false
}
]
},
{
"aspects": [
"color-light_gray"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_light_gray.png",
"emissive": false
}
]
},
{
"aspects": [
"color-lime"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_lime.png",
"emissive": false
}
]
},
{
"aspects": [
"color-magenta"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_magenta.png",
"emissive": false
}
]
},
{
"aspects": [
"color-orange"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_orange.png",
"emissive": false
}
]
},
{
"aspects": [
"color-pink"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_pink.png",
"emissive": false
}
]
},
{
"aspects": [
"color-purple"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_purple.png",
"emissive": false
}
]
},
{
"aspects": [
"color-red"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_red.png",
"emissive": false
}
]
},
{
"aspects": [
"color-white"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool.png",
"emissive": false
}
]
},
{
"aspects": [
"color-white shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-yellow"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0831_wooloo/wooloo_wool_yellow.png",
"emissive": false
}
]
}
]
}
@@ -14,390 +14,6 @@
"shiny"
],
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_shiny.png"
},
{
"aspects": [
"color-black"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_black.png",
"emissive": false
}
]
},
{
"aspects": [
"color-blue"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_blue.png",
"emissive": false
}
]
},
{
"aspects": [
"color-brown"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_brown.png",
"emissive": false
}
]
},
{
"aspects": [
"color-cyan"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_cyan.png",
"emissive": false
}
]
},
{
"aspects": [
"color-gray"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_gray.png",
"emissive": false
}
]
},
{
"aspects": [
"color-green"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_green.png",
"emissive": false
}
]
},
{
"aspects": [
"color-light_blue"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_light_blue.png",
"emissive": false
}
]
},
{
"aspects": [
"color-light_gray"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_light_gray.png",
"emissive": false
}
]
},
{
"aspects": [
"color-lime"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_lime.png",
"emissive": false
}
]
},
{
"aspects": [
"color-magenta"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_magenta.png",
"emissive": false
}
]
},
{
"aspects": [
"color-orange"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_orange.png",
"emissive": false
}
]
},
{
"aspects": [
"color-pink"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_pink.png",
"emissive": false
}
]
},
{
"aspects": [
"color-purple"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_purple.png",
"emissive": false
}
]
},
{
"aspects": [
"color-red"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_red.png",
"emissive": false
}
]
},
{
"aspects": [
"color-white"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_white.png",
"emissive": false
}
]
},
{
"aspects": [
"color-yellow"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_yellow.png",
"emissive": false
}
]
},
{
"aspects": [
"color-black shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_black_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-blue shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_blue_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-brown shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_brown_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-cyan shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_cyan_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-gray shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_gray_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-green shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_green_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-light_blue shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_light_blue_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-light_gray shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_light_gray_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-lime shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_lime_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-magenta shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_magenta_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-orange shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_orange_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-pink shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_pink_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-purple shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_purple_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-red shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_red_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-white shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_white_shiny.png",
"emissive": false
}
]
},
{
"aspects": [
"color-yellow shiny"
],
"layers": [
{
"name": "color",
"texture": "cobblemon:textures/pokemon/0832_dubwool/dubwool_wool_yellow_shiny.png",
"emissive": false
}
]
}
]
}
@@ -2,14 +2,7 @@
"multipart": [
{
"when": {
"AND": [
{
"age": 0
},
{
"rooted": false
}
]
"age": "0"
},
"apply": {
"model": "cobblemon:block/berries/planted",
@@ -18,62 +11,16 @@
},
{
"when": {
"AND": [
{
"age": 0
},
{
"rooted": true
}
]
"age": "1"
},
"apply": {
"model": "cobblemon:block/berries/planted_bound",
"model": "cobblemon:block/berries/sprout",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 1
},
{
"rooted": false
}
]
},
"apply": {
"model": "cobblemon:block/berries/aguav_sprout",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 1
},
{
"rooted": true
}
]
},
"apply": {
"model": "cobblemon:block/berries/aguav_sprout",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 2
},
{
"rooted": false
}
]
"age": "2"
},
"apply": {
"model": "cobblemon:block/berries/aguav_young",
@@ -82,30 +29,7 @@
},
{
"when": {
"AND": [
{
"age": 2
},
{
"rooted": true
}
]
},
"apply": {
"model": "cobblemon:block/berries/aguav_young",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 3
},
{
"rooted": false
}
]
"age": "3"
},
"apply": {
"model": "cobblemon:block/berries/aguav_mature",
@@ -114,14 +38,7 @@
},
{
"when": {
"AND": [
{
"age": 3
},
{
"rooted": true
}
]
"age": "4"
},
"apply": {
"model": "cobblemon:block/berries/aguav_mature",
@@ -130,62 +47,7 @@
},
{
"when": {
"AND": [
{
"age": 4
},
{
"rooted": false
}
]
},
"apply": {
"model": "cobblemon:block/berries/aguav_mature",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 4
},
{
"rooted": true
}
]
},
"apply": {
"model": "cobblemon:block/berries/aguav_mature",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 5
},
{
"rooted": false
}
]
},
"apply": {
"model": "cobblemon:block/berries/aguav_mature",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 5
},
{
"rooted": true
}
]
"age": "5"
},
"apply": {
"model": "cobblemon:block/berries/aguav_mature",
@@ -2,14 +2,7 @@
"multipart": [
{
"when": {
"AND": [
{
"age": 0
},
{
"rooted": false
}
]
"age": "0"
},
"apply": {
"model": "cobblemon:block/berries/planted",
@@ -18,62 +11,16 @@
},
{
"when": {
"AND": [
{
"age": 0
},
{
"rooted": true
}
]
"age": "1"
},
"apply": {
"model": "cobblemon:block/berries/planted_bound",
"model": "cobblemon:block/berries/sprout",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 1
},
{
"rooted": false
}
]
},
"apply": {
"model": "cobblemon:block/berries/apicot_sprout",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 1
},
{
"rooted": true
}
]
},
"apply": {
"model": "cobblemon:block/berries/apicot_sprout",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 2
},
{
"rooted": false
}
]
"age": "2"
},
"apply": {
"model": "cobblemon:block/berries/apicot_young",
@@ -82,30 +29,7 @@
},
{
"when": {
"AND": [
{
"age": 2
},
{
"rooted": true
}
]
},
"apply": {
"model": "cobblemon:block/berries/apicot_young",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 3
},
{
"rooted": false
}
]
"age": "3"
},
"apply": {
"model": "cobblemon:block/berries/apicot_mature",
@@ -114,14 +38,7 @@
},
{
"when": {
"AND": [
{
"age": 3
},
{
"rooted": true
}
]
"age": "4"
},
"apply": {
"model": "cobblemon:block/berries/apicot_mature",
@@ -130,62 +47,7 @@
},
{
"when": {
"AND": [
{
"age": 4
},
{
"rooted": false
}
]
},
"apply": {
"model": "cobblemon:block/berries/apicot_mature",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 4
},
{
"rooted": true
}
]
},
"apply": {
"model": "cobblemon:block/berries/apicot_mature",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 5
},
{
"rooted": false
}
]
},
"apply": {
"model": "cobblemon:block/berries/apicot_mature",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 5
},
{
"rooted": true
}
]
"age": "5"
},
"apply": {
"model": "cobblemon:block/berries/apicot_mature",
@@ -2,14 +2,7 @@
"multipart": [
{
"when": {
"AND": [
{
"age": 0
},
{
"rooted": false
}
]
"age": "0"
},
"apply": {
"model": "cobblemon:block/berries/planted",
@@ -18,62 +11,16 @@
},
{
"when": {
"AND": [
{
"age": 0
},
{
"rooted": true
}
]
"age": "1"
},
"apply": {
"model": "cobblemon:block/berries/planted_bound",
"model": "cobblemon:block/berries/sprout",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 1
},
{
"rooted": false
}
]
},
"apply": {
"model": "cobblemon:block/berries/aspear_sprout",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 1
},
{
"rooted": true
}
]
},
"apply": {
"model": "cobblemon:block/berries/aspear_sprout",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 2
},
{
"rooted": false
}
]
"age": "2"
},
"apply": {
"model": "cobblemon:block/berries/aspear_young",
@@ -82,30 +29,7 @@
},
{
"when": {
"AND": [
{
"age": 2
},
{
"rooted": true
}
]
},
"apply": {
"model": "cobblemon:block/berries/aspear_young",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 3
},
{
"rooted": false
}
]
"age": "3"
},
"apply": {
"model": "cobblemon:block/berries/aspear_mature",
@@ -114,14 +38,7 @@
},
{
"when": {
"AND": [
{
"age": 3
},
{
"rooted": true
}
]
"age": "4"
},
"apply": {
"model": "cobblemon:block/berries/aspear_mature",
@@ -130,62 +47,7 @@
},
{
"when": {
"AND": [
{
"age": 4
},
{
"rooted": false
}
]
},
"apply": {
"model": "cobblemon:block/berries/aspear_mature",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 4
},
{
"rooted": true
}
]
},
"apply": {
"model": "cobblemon:block/berries/aspear_mature",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 5
},
{
"rooted": false
}
]
},
"apply": {
"model": "cobblemon:block/berries/aspear_mature",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 5
},
{
"rooted": true
}
]
"age": "5"
},
"apply": {
"model": "cobblemon:block/berries/aspear_mature",
@@ -2,14 +2,7 @@
"multipart": [
{
"when": {
"AND": [
{
"age": 0
},
{
"rooted": false
}
]
"age": "0"
},
"apply": {
"model": "cobblemon:block/berries/planted",
@@ -18,62 +11,16 @@
},
{
"when": {
"AND": [
{
"age": 0
},
{
"rooted": true
}
]
"age": "1"
},
"apply": {
"model": "cobblemon:block/berries/planted_bound",
"model": "cobblemon:block/berries/sprout",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 1
},
{
"rooted": false
}
]
},
"apply": {
"model": "cobblemon:block/berries/babiri_sprout",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 1
},
{
"rooted": true
}
]
},
"apply": {
"model": "cobblemon:block/berries/babiri_sprout",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 2
},
{
"rooted": false
}
]
"age": "2"
},
"apply": {
"model": "cobblemon:block/berries/babiri_young",
@@ -82,30 +29,7 @@
},
{
"when": {
"AND": [
{
"age": 2
},
{
"rooted": true
}
]
},
"apply": {
"model": "cobblemon:block/berries/babiri_young",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 3
},
{
"rooted": false
}
]
"age": "3"
},
"apply": {
"model": "cobblemon:block/berries/babiri_mature",
@@ -114,14 +38,7 @@
},
{
"when": {
"AND": [
{
"age": 3
},
{
"rooted": true
}
]
"age": "4"
},
"apply": {
"model": "cobblemon:block/berries/babiri_mature",
@@ -130,62 +47,7 @@
},
{
"when": {
"AND": [
{
"age": 4
},
{
"rooted": false
}
]
},
"apply": {
"model": "cobblemon:block/berries/babiri_mature",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 4
},
{
"rooted": true
}
]
},
"apply": {
"model": "cobblemon:block/berries/babiri_mature",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 5
},
{
"rooted": false
}
]
},
"apply": {
"model": "cobblemon:block/berries/babiri_mature",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 5
},
{
"rooted": true
}
]
"age": "5"
},
"apply": {
"model": "cobblemon:block/berries/babiri_mature",
@@ -2,14 +2,7 @@
"multipart": [
{
"when": {
"AND": [
{
"age": 0
},
{
"rooted": false
}
]
"age": "0"
},
"apply": {
"model": "cobblemon:block/berries/planted",
@@ -18,62 +11,16 @@
},
{
"when": {
"AND": [
{
"age": 0
},
{
"rooted": true
}
]
"age": "1"
},
"apply": {
"model": "cobblemon:block/berries/planted_bound",
"model": "cobblemon:block/berries/sprout",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 1
},
{
"rooted": false
}
]
},
"apply": {
"model": "cobblemon:block/berries/belue_sprout",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 1
},
{
"rooted": true
}
]
},
"apply": {
"model": "cobblemon:block/berries/belue_sprout",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 2
},
{
"rooted": false
}
]
"age": "2"
},
"apply": {
"model": "cobblemon:block/berries/belue_young",
@@ -82,30 +29,7 @@
},
{
"when": {
"AND": [
{
"age": 2
},
{
"rooted": true
}
]
},
"apply": {
"model": "cobblemon:block/berries/belue_young",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 3
},
{
"rooted": false
}
]
"age": "3"
},
"apply": {
"model": "cobblemon:block/berries/belue_mature",
@@ -114,14 +38,7 @@
},
{
"when": {
"AND": [
{
"age": 3
},
{
"rooted": true
}
]
"age": "4"
},
"apply": {
"model": "cobblemon:block/berries/belue_mature",
@@ -130,62 +47,7 @@
},
{
"when": {
"AND": [
{
"age": 4
},
{
"rooted": false
}
]
},
"apply": {
"model": "cobblemon:block/berries/belue_mature",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 4
},
{
"rooted": true
}
]
},
"apply": {
"model": "cobblemon:block/berries/belue_mature",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 5
},
{
"rooted": false
}
]
},
"apply": {
"model": "cobblemon:block/berries/belue_mature",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 5
},
{
"rooted": true
}
]
"age": "5"
},
"apply": {
"model": "cobblemon:block/berries/belue_mature",
@@ -2,14 +2,7 @@
"multipart": [
{
"when": {
"AND": [
{
"age": 0
},
{
"rooted": false
}
]
"age": "0"
},
"apply": {
"model": "cobblemon:block/berries/planted",
@@ -18,62 +11,16 @@
},
{
"when": {
"AND": [
{
"age": 0
},
{
"rooted": true
}
]
"age": "1"
},
"apply": {
"model": "cobblemon:block/berries/planted_bound",
"model": "cobblemon:block/berries/sprout",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 1
},
{
"rooted": false
}
]
},
"apply": {
"model": "cobblemon:block/berries/bluk_sprout",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 1
},
{
"rooted": true
}
]
},
"apply": {
"model": "cobblemon:block/berries/bluk_sprout",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 2
},
{
"rooted": false
}
]
"age": "2"
},
"apply": {
"model": "cobblemon:block/berries/bluk_young",
@@ -82,30 +29,7 @@
},
{
"when": {
"AND": [
{
"age": 2
},
{
"rooted": true
}
]
},
"apply": {
"model": "cobblemon:block/berries/bluk_young",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 3
},
{
"rooted": false
}
]
"age": "3"
},
"apply": {
"model": "cobblemon:block/berries/bluk_mature",
@@ -114,14 +38,7 @@
},
{
"when": {
"AND": [
{
"age": 3
},
{
"rooted": true
}
]
"age": "4"
},
"apply": {
"model": "cobblemon:block/berries/bluk_mature",
@@ -130,62 +47,7 @@
},
{
"when": {
"AND": [
{
"age": 4
},
{
"rooted": false
}
]
},
"apply": {
"model": "cobblemon:block/berries/bluk_mature",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 4
},
{
"rooted": true
}
]
},
"apply": {
"model": "cobblemon:block/berries/bluk_mature",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 5
},
{
"rooted": false
}
]
},
"apply": {
"model": "cobblemon:block/berries/bluk_mature",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 5
},
{
"rooted": true
}
]
"age": "5"
},
"apply": {
"model": "cobblemon:block/berries/bluk_mature",
@@ -2,14 +2,7 @@
"multipart": [
{
"when": {
"AND": [
{
"age": 0
},
{
"rooted": false
}
]
"age": "0"
},
"apply": {
"model": "cobblemon:block/berries/planted",
@@ -18,62 +11,16 @@
},
{
"when": {
"AND": [
{
"age": 0
},
{
"rooted": true
}
]
"age": "1"
},
"apply": {
"model": "cobblemon:block/berries/planted_bound",
"model": "cobblemon:block/berries/sprout",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 1
},
{
"rooted": false
}
]
},
"apply": {
"model": "cobblemon:block/berries/charti_sprout",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 1
},
{
"rooted": true
}
]
},
"apply": {
"model": "cobblemon:block/berries/charti_sprout",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 2
},
{
"rooted": false
}
]
"age": "2"
},
"apply": {
"model": "cobblemon:block/berries/charti_young",
@@ -82,30 +29,7 @@
},
{
"when": {
"AND": [
{
"age": 2
},
{
"rooted": true
}
]
},
"apply": {
"model": "cobblemon:block/berries/charti_young",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 3
},
{
"rooted": false
}
]
"age": "3"
},
"apply": {
"model": "cobblemon:block/berries/charti_mature",
@@ -114,14 +38,7 @@
},
{
"when": {
"AND": [
{
"age": 3
},
{
"rooted": true
}
]
"age": "4"
},
"apply": {
"model": "cobblemon:block/berries/charti_mature",
@@ -130,62 +47,7 @@
},
{
"when": {
"AND": [
{
"age": 4
},
{
"rooted": false
}
]
},
"apply": {
"model": "cobblemon:block/berries/charti_mature",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 4
},
{
"rooted": true
}
]
},
"apply": {
"model": "cobblemon:block/berries/charti_mature",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 5
},
{
"rooted": false
}
]
},
"apply": {
"model": "cobblemon:block/berries/charti_mature",
"uvlock": false
}
},
{
"when": {
"AND": [
{
"age": 5
},
{
"rooted": true
}
]
"age": "5"
},
"apply": {
"model": "cobblemon:block/berries/charti_mature",
Loaded 100 of 494 files, more files were not shown because too many files have changed in this diff. Show more