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
185 changed files with 444 additions and 1389 deletions
-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
@@ -234,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))
@@ -415,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
))
@@ -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() }
@@ -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() }
@@ -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()
}
}
@@ -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)
}
}
}
@@ -480,19 +480,15 @@ class FossilMultiblockStructure (
}
fun updateProgress(world: World) {
val screenID = if (protectionTime > 0F) {
val screenID = if(protectionTime > 0F ) {
MonitorBlock.MonitorScreen.GREEN_PROGRESS_9
} else if (timeRemaining <= 0) {
MonitorBlock.MonitorScreen.OFF
} else {
getProgressScreen((TIME_TO_TAKE - timeRemaining) / TIME_PER_STAGE)
}
val monitorState = world.getBlockState(monitorPos)
if (monitorState.contains(MonitorBlock.SCREEN)) {
world.setBlockState(monitorPos, monitorState.with(MonitorBlock.SCREEN, screenID))
}
world.setBlockState(monitorPos, monitorState.with(MonitorBlock.SCREEN, screenID))
}
fun getProgressScreen(progress:Int) : MonitorBlock.MonitorScreen {
@@ -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())
}
))
}
@@ -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)
}
}
}
}
@@ -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 {
@@ -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
}
]
}
]
}
@@ -1130,7 +1130,6 @@
"cobblemon.battle.cant.shelltrap": "%1$s's shell trap didn't work!",
"cobblemon.battle.cant.taunt": "%1$s can't use %2$s after the taunt!",
"cobblemon.battle.cant.throatchop": "The effects of Throat Chop prevent %1$s from using certain moves!",
"cobblemon.battle.cant.nopp": "%1$s can't use %2$s because it is out of PP!",
"cobblemon.battle.activate.confusion": "%1$s is confused!",
"cobblemon.battle.activate.happyhour": "Everyone is caught up in the happy atmosphere!",
@@ -159,36 +159,36 @@
"gimmighoul.reveal": {
"sounds": [ "cobblemon:gimmighoul_reveal" ]
},
"relic_coin_sack.break": {
"coin_pouch.break": {
"sounds": [
"cobblemon:block/relic_coin_sack/relic_coin_sack_break_1",
"cobblemon:block/relic_coin_sack/relic_coin_sack_break_2",
"cobblemon:block/relic_coin_sack/relic_coin_sack_break_3",
"cobblemon:block/relic_coin_sack/relic_coin_sack_break_4"
"cobblemon:block/coin_pouch/coin_pouch_block_break_1",
"cobblemon:block/coin_pouch/coin_pouch_block_break_2",
"cobblemon:block/coin_pouch/coin_pouch_block_break_3",
"cobblemon:block/coin_pouch/coin_pouch_block_break_4"
]
},
"relic_coin_sack.hit": {
"coin_pouch.hit": {
"sounds": [
{ "name": "cobblemon:block/relic_coin_sack/relic_coin_sack_hit_1", "volume": 0.5 },
{ "name": "cobblemon:block/relic_coin_sack/relic_coin_sack_hit_2", "volume": 0.5 },
{ "name": "cobblemon:block/relic_coin_sack/relic_coin_sack_hit_3", "volume": 0.5 },
{ "name": "cobblemon:block/relic_coin_sack/relic_coin_sack_hit_4", "volume": 0.5 }
{ "name": "cobblemon:block/coin_pouch/coin_pouch_block_hit_1", "volume": 0.6 },
{ "name": "cobblemon:block/coin_pouch/coin_pouch_block_hit_2", "volume": 0.6 },
{ "name": "cobblemon:block/coin_pouch/coin_pouch_block_hit_3", "volume": 0.6 },
{ "name": "cobblemon:block/coin_pouch/coin_pouch_block_hit_4", "volume": 0.6 }
]
},
"relic_coin_sack.place": {
"coin_pouch.place": {
"sounds": [
"cobblemon:block/relic_coin_sack/relic_coin_sack_place_1",
"cobblemon:block/relic_coin_sack/relic_coin_sack_place_2",
"cobblemon:block/relic_coin_sack/relic_coin_sack_place_3",
"cobblemon:block/relic_coin_sack/relic_coin_sack_place_4"
"cobblemon:block/coin_pouch/coin_pouch_block_place_1",
"cobblemon:block/coin_pouch/coin_pouch_block_place_2",
"cobblemon:block/coin_pouch/coin_pouch_block_place_3",
"cobblemon:block/coin_pouch/coin_pouch_block_place_4"
]
},
"relic_coin_sack.step": {
"coin_pouch.step": {
"sounds": [
"cobblemon:block/relic_coin_sack/relic_coin_sack_step_1",
"cobblemon:block/relic_coin_sack/relic_coin_sack_step_2",
"cobblemon:block/relic_coin_sack/relic_coin_sack_step_3",
"cobblemon:block/relic_coin_sack/relic_coin_sack_step_4"
"cobblemon:block/coin_pouch/coin_pouch_block_step_1",
"cobblemon:block/coin_pouch/coin_pouch_block_step_2",
"cobblemon:block/coin_pouch/coin_pouch_block_step_3",
"cobblemon:block/coin_pouch/coin_pouch_block_step_4"
]
},
"tumblestone.break": {
@@ -199,22 +199,6 @@
"cobblemon:block/tumblestone/tumblestone_break_4"
]
},
"relic_coin_pouch.break": {
"sounds": [
"cobblemon:block/relic_coin_pouch/relic_coin_pouch_break_1",
"cobblemon:block/relic_coin_pouch/relic_coin_pouch_break_2",
"cobblemon:block/relic_coin_pouch/relic_coin_pouch_break_3",
"cobblemon:block/relic_coin_pouch/relic_coin_pouch_break_4"
]
},
"relic_coin_pouch.place": {
"sounds": [
"cobblemon:block/relic_coin_pouch/relic_coin_pouch_place_1",
"cobblemon:block/relic_coin_pouch/relic_coin_pouch_place_2",
"cobblemon:block/relic_coin_pouch/relic_coin_pouch_place_3",
"cobblemon:block/relic_coin_pouch/relic_coin_pouch_place_4"
]
},
"tumblestone.block_break": {
"sounds": [
"cobblemon:block/tumblestone/tumblestone_block_break_1",

Some files were not shown because too many files have changed in this diff Show More