Compare commits

..
190 changed files with 1343 additions and 1142 deletions
+8 -1
View File
@@ -2,6 +2,14 @@
## [1.8.0 (MONTH Xth, 2026)](#1-8-0)
### Additions
- Added riding statistics: `Distance by Pokémon on Land`, `Distance by Pokémon in Air` and `Distance by Pokémon in Liquid`.
- Added the Partner Mark, which party Pokémon have a very small chance to earn as the player walks, provided they have enough friendship.
- Added trades for Saccharine Saplings, Hearty Grains, Chipped Pot, and Masterpiece Teacup to the Wandering Trader.
- Added brewing recipe for Throat Spray.
- Added mood particles! Pokémon now visually react to certain actions:
- Angry particles when attacking a mob.
- Annoyed particles when a player tries to feed them while they’re already full.
- Sweat droplets when they run out of stamina while being ridden.
- Added config options to award experience to fainted Pokémon for opponents they helped defeat (`awardExperienceToFaintedPokemon`) and to still award experience for defeated enemies even after battle loss/forfeit (`awardExperienceOnBattleLoss`)
- Party Overlay Exp Gained Animation will now display the amount of EXP the Pokémon gained
- Added a toast to notify players of how they can scroll through their party. Did you know you can hold R and scroll instead of using arrow keys??!
@@ -396,7 +404,6 @@
- Fixed `/giveallpokemon` not respecting the min and max parameters
- Fixed the choose starter toast not disappearing when capturing a Pokémon instead of opening the starter selection screen
- Fixed an issue where certain Sinister Tea seasonings were only applying as instant effects and would not apply over time
- Long config option labels now scroll instead of overflowing
### Developer
- Added `PokeSnackSpawnerFactory` which allows influence registration on PokeSnack encounters
@@ -92,13 +92,17 @@ interface PokemonAndMoveSelectingItem {
}
fun canUseOnPokemon(stack: ItemStack, pokemon: Pokemon): Boolean {
if (stack.`is`(CobblemonItemTags.POKE_FOOD)) {
return !pokemon.isFull()
if (pokemon.entity == null && stack.`is`(CobblemonItemTags.POKE_FOOD) && pokemon.isFull()) {
return false
}
return true
}
fun canUseOnBattlePokemon(stack: ItemStack, battlePokemon: BattlePokemon): Boolean = bagItem!!.canUse(stack, battlePokemon.actor.battle, battlePokemon)
fun canUseOnBattlePokemon(stack: ItemStack, battlePokemon: BattlePokemon): Boolean {
return bagItem!!.canUse(stack, battlePokemon.actor.battle, battlePokemon)
}
fun canUseOnMove(stack: ItemStack, pokemon: Pokemon, move: Move): Boolean = canUseOnMove(stack, move)
fun canUseOnMove(stack: ItemStack, move: Move): Boolean
@@ -107,13 +107,16 @@ interface PokemonSelectingItem {
}
fun canUseOnPokemon(stack: ItemStack, pokemon: Pokemon): Boolean {
if (stack.`is`(CobblemonItemTags.POKE_FOOD)) {
return !pokemon.isFull()
if (pokemon.entity == null && stack.`is`(CobblemonItemTags.POKE_FOOD) && pokemon.isFull()) {
return false
}
return true
}
fun canUseOnBattlePokemon(stack: ItemStack, battlePokemon: BattlePokemon): Boolean = bagItem!!.canUse(stack, battlePokemon.actor.battle, battlePokemon)
fun canUseOnBattlePokemon(stack: ItemStack, battlePokemon: BattlePokemon): Boolean {
return bagItem!!.canUse(stack, battlePokemon.actor.battle, battlePokemon)
}
fun interactWithSpecificBattle(player: ServerPlayer, stack: ItemStack, battlePokemon: BattlePokemon): InteractionResultHolder<ItemStack> {
return if (canUseOnBattlePokemon(stack, battlePokemon)) {
@@ -54,8 +54,9 @@ object PokemonMoLangFunctions : AbstractMoLangFunctionHolder<Pokemon>() {
}
map["feed_pokemon"] = { params ->
val amount = params.getDouble(0)
val playSound = params.getBooleanOrNull(1) ?: true
pokemon.feedPokemon(amount.toInt(), playSound)
val playSound = params.getBooleanOrNull(1) != false
val playMoodParticles = params.getBooleanOrNull(2) != false
DoubleValue(pokemon.feedPokemon(amount.toInt(), playSound, playMoodParticles))
}
map["behaviour"] = { pokemon.form.behaviour.struct }
map["behavior"] = { pokemon.form.behaviour.struct } // Inferior
@@ -44,6 +44,7 @@ object ActionEffects : JsonDataRegistry<ActionEffectTimeline> {
ActionEffectKeyframe.register<EntityMoLangActionEffectKeyframe>("entity_molang")
ActionEffectKeyframe.register<MoLangActionEffectKeyframe>("molang")
ActionEffectKeyframe.register<ParallelActionEffectKeyframe>("parallel")
ActionEffectKeyframe.register<LoopActionEffectKeyframe>("loop")
ActionEffectKeyframe.register<CanInterruptActionEffectKeyframe>("can_interrupt")
ActionEffectKeyframe.register<CannotInterruptActionEffectKeyframe>("cannot_interrupt")
ActionEffectKeyframe.register<RemoveHoldsActionEffectKeyframe>("remove_holds")
@@ -0,0 +1,39 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.api.moves.animations.keyframes
import com.cobblemon.mod.common.api.moves.animations.ActionEffectContext
import java.util.concurrent.CompletableFuture
class LoopActionEffectKeyframe(
val keyframe: ActionEffectKeyframe = PauseActionEffectKeyframe()
) : ConditionalActionEffectKeyframe() {
override fun playWhenTrue(context: ActionEffectContext): CompletableFuture<Unit> {
val future = CompletableFuture<Unit>()
runIteration(context, future)
return future
}
private fun runIteration(context: ActionEffectContext, future: CompletableFuture<Unit>) {
context.currentKeyframes.add(keyframe)
keyframe.play(context)
.thenRun { context.currentKeyframes.remove(keyframe) }
.thenAccept {
if (condition.resolveBoolean(context.runtime)) {
runIteration(context, future)
} else {
future.complete(Unit)
}
}
.exceptionally {
future.completeExceptionally(it)
null
}
}
}
@@ -25,7 +25,6 @@ import net.minecraft.world.level.block.SoundType
import net.minecraft.world.level.block.entity.BlockEntity
import net.minecraft.world.level.block.entity.BlockEntityTicker
import net.minecraft.world.level.block.entity.BlockEntityType
import net.minecraft.world.level.block.entity.CommandBlockEntity
import net.minecraft.world.level.block.state.BlockState
import net.minecraft.world.level.block.state.StateDefinition
import net.minecraft.world.level.block.state.properties.BooleanProperty
@@ -81,13 +80,11 @@ class HabitatBlock(properties: Properties) : Block(properties), EntityBlock {
}
override fun useWithoutItem(state: BlockState, level: Level, pos: BlockPos, player: Player, hitResult: BlockHitResult): InteractionResult {
val blockEntity = level.getBlockEntity(pos)
val be = level.getBlockEntity(pos) as? HabitatBlockEntity ?: return InteractionResult.PASS
return if (blockEntity is HabitatBlockEntity && player.canUseGameMasterBlocks()) {
be.onUse(player, hitResult)
} else {
InteractionResult.PASS
if (!level.isClientSide) {
val be = level.getBlockEntity(pos) as? HabitatBlockEntity ?: return InteractionResult.PASS
return be.onUse(player, hitResult)
}
return InteractionResult.SUCCESS
}
override fun getDrops(state: BlockState, params: LootParams.Builder): MutableList<ItemStack> {
@@ -41,7 +41,6 @@ class CobblemonConfigScreen(
const val WIDGET_HEIGHT = SLOT_HEIGHT - PADDING
const val LABEL_Y_OFFSET = 4
const val WIDGET_Y_OFFSET = 0
const val LABEL_MAX_WIDTH = SLOT_WIDTH - RESET_SLOT_WIDTH - WIDGET_WIDTH - PADDING * 2
}
val clonedConfig = Cobblemon.config.clone()
@@ -8,18 +8,17 @@
package com.cobblemon.mod.common.client.gui.config.variable
import com.cobblemon.mod.common.client.gui.config.CobblemonConfigScreen.Companion.LABEL_MAX_WIDTH
import com.cobblemon.mod.common.client.gui.config.CobblemonConfigScreen.Companion.LABEL_Y_OFFSET
import com.cobblemon.mod.common.client.gui.config.CobblemonConfigScreen.Companion.RESET_SLOT_WIDTH
import com.cobblemon.mod.common.client.gui.config.CobblemonConfigScreen.Companion.SLOT_WIDTH
import com.cobblemon.mod.common.client.gui.config.CobblemonConfigScreen.Companion.WIDGET_HEIGHT
import com.cobblemon.mod.common.client.gui.config.CobblemonConfigScreen.Companion.WIDGET_Y_OFFSET
import com.cobblemon.mod.common.client.gui.config.CobblemonConfigVariableList
import com.cobblemon.mod.common.client.gui.config.CobblemonConfigVariableList.CobblemonConfigVariableListEntry
import com.cobblemon.mod.common.client.render.drawScrollingText
import com.cobblemon.mod.common.client.render.drawScaledText
import com.cobblemon.mod.common.config.CobblemonConfig
import com.cobblemon.mod.common.config.CobblemonConfigField
import com.cobblemon.mod.common.util.lang
import net.minecraft.client.Minecraft
import net.minecraft.client.gui.GuiGraphics
import net.minecraft.client.gui.components.Button
import net.minecraft.client.gui.components.Tooltip
@@ -92,15 +91,12 @@ abstract class CobblemonConfigVariable(
val x = getX(left)
val y = getY(top)
drawScrollingText(
context,
Minecraft.getInstance().font,
labelLang,
x,
y + WIDGET_Y_OFFSET,
x + LABEL_MAX_WIDTH,
y + WIDGET_Y_OFFSET + WIDGET_HEIGHT,
-1
drawScaledText(
context = context,
text = labelLang,
x = getX(left),
y = getY(top) + LABEL_Y_OFFSET,
shadow = true
)
resetButton.x = x + SLOT_WIDTH - RESET_SLOT_WIDTH
@@ -18,23 +18,17 @@ import com.mojang.blaze3d.systems.RenderSystem
import com.mojang.blaze3d.vertex.PoseStack
import com.mojang.blaze3d.vertex.VertexConsumer
import com.mojang.math.Axis
import net.minecraft.Util
import net.minecraft.client.Minecraft
import net.minecraft.client.gui.Font
import net.minecraft.client.gui.GuiGraphics
import net.minecraft.client.renderer.MultiBufferSource
import net.minecraft.client.renderer.RenderType
import net.minecraft.client.renderer.texture.OverlayTexture
import net.minecraft.client.renderer.texture.TextureAtlas
import net.minecraft.network.chat.Component
import net.minecraft.network.chat.MutableComponent
import net.minecraft.resources.ResourceLocation
import net.minecraft.util.FormattedCharSequence
import net.minecraft.util.Mth
import net.minecraft.world.item.ItemDisplayContext
import net.minecraft.world.item.ItemStack
import kotlin.math.cos
import kotlin.math.sin
fun renderScaledGuiItemIcon(itemStack: ItemStack, x: Double, y: Double, scale: Double = 1.0, zTranslation: Float = 100.0F, matrixStack: PoseStack? = null) {
val itemRenderer = Minecraft.getInstance().itemRenderer
@@ -103,55 +97,6 @@ fun getDepletableRedGreen(
return r.toFloat() to g.toFloat()
}
fun drawScrollingText(
context: GuiGraphics,
font: Font,
text: Component,
minX: Int,
minY: Int,
maxX: Int,
maxY: Int,
colour: Int,
minScrollVelocity: Double? = 10.0
) {
val textWidth = font.width(text)
val fittedMaxX = if (textWidth <= maxX - minX) minX + textWidth else maxX
renderScrollingString(context, font, text, minX, minY, fittedMaxX, maxY, colour, minScrollVelocity)
}
/** Copied from [net.minecraft.client.gui.components.AbstractWidget.renderScrollingString] **/
fun renderScrollingString(
context: GuiGraphics,
font: Font,
text: Component,
minX: Int,
minY: Int,
maxX: Int,
maxY: Int,
colour: Int,
minScrollVelocity: Double? = 10.0
) {
val textWidth = font.width(text)
val centerY = (minY + maxY - 9) / 2 + 1
val boxWidth = maxX - minX
if (textWidth <= boxWidth) {
val centerX = Mth.clamp((minX + maxX) / 2, minX + textWidth / 2, maxX - textWidth / 2)
context.drawCenteredString(font, text, centerX, centerY, colour)
return
}
val overflow = textWidth - boxWidth
var period = (overflow * 0.5).coerceAtLeast(3.0)
if (minScrollVelocity != null) {
period = period.coerceAtMost(2 * overflow / minScrollVelocity)
}
val time = Util.getMillis() / 1000.0
val easedProgress = sin((Math.PI / 2) * cos(2 * Math.PI * time / period)) / 2.0 + 0.5
val offset = Mth.lerp(easedProgress, 0.0, overflow.toDouble())
context.enableScissor(minX, minY, maxX, maxY)
context.drawString(font, text, minX - offset.toInt(), centerY, colour)
context.disableScissor()
}
fun drawScaledText(
context: GuiGraphics,
@@ -34,6 +34,7 @@ import com.cobblemon.mod.common.client.render.models.blockbench.quirk.ModelQuirk
import com.cobblemon.mod.common.client.render.models.blockbench.quirk.SimpleQuirk
import com.cobblemon.mod.common.client.render.models.blockbench.repository.RenderContext
import com.cobblemon.mod.common.client.render.models.blockbench.wavefunction.WaveFunction
import com.cobblemon.mod.common.client.util.exists
import com.cobblemon.mod.common.entity.PosableEntity
import com.cobblemon.mod.common.entity.PoseType
import com.cobblemon.mod.common.entity.generic.GenericBedrockEntity
@@ -255,7 +256,7 @@ open class PosableModel(@Transient override val rootPart: Bone) : ModelFrame {
}
fun setLayerContext(buffer: MultiBufferSource, state: PosableState, layers: Iterable<ModelLayer>) {
currentLayers = layers.sortedBy { it.translucent }
currentLayers = layers
bufferProvider = buffer
currentState = state
}
@@ -0,0 +1,127 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen2
import com.cobblemon.mod.common.client.render.models.blockbench.PosableState
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
import com.cobblemon.mod.common.client.render.models.blockbench.pose.CobblemonPose
import com.cobblemon.mod.common.entity.PoseType
import com.cobblemon.mod.common.util.isBattling
import com.cobblemon.mod.common.util.isUnderWater
import com.cobblemon.mod.common.util.isInWater
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class ChinchouModel (root: ModelPart) : PokemonPosableModel(root) {
override val rootPart = root.registerChildWithAllChildren("chinchou")
override var portraitScale = 1.75F
override var portraitTranslation = Vec3(-0.3, -0.8, 0.0)
override var profileScale = 0.65F
override var profileTranslation = Vec3(-0.05, 0.45, 0.0)
lateinit var standing: CobblemonPose
lateinit var walk: CobblemonPose
lateinit var floating: CobblemonPose
lateinit var swimming: CobblemonPose
lateinit var sleep: CobblemonPose
lateinit var watersleep: CobblemonPose
lateinit var battleidle: CobblemonPose
lateinit var waterbattleidle: CobblemonPose
// override val cryAnimation = CryProvider { bedrockStateful("chinchou", "cry") }
override fun registerPoses() {
val blink = quirk { bedrockStateful("chinchou", "blink")}
val idleQuirk = quirk(secondsBetweenOccurrences = 60F to 120F) { bedrockStateful("chinchou", "ground_quirk")}
val waterQuirk = quirk(secondsBetweenOccurrences = 60F to 120F) { bedrockStateful("chinchou", "water_idle_quirk")}
sleep = registerPose(
poseName = "sleeping",
poseType = PoseType.SLEEP,
condition = { !it.isInWater },
animations = arrayOf(bedrock("chinchou", "sleep"))
)
watersleep = registerPose(
poseName = "water_sleeping",
poseType = PoseType.SLEEP,
condition = { it.isInWater },
animations = arrayOf(bedrock("chinchou", "water_sleep"))
)
standing = registerPose(
poseName = "standing",
poseTypes = PoseType.UI_POSES + PoseType.STAND,
transformTicks = 10,
condition = { !it.isBattling && !it.isInWater && !it.isUnderWater},
quirks = arrayOf(blink, idleQuirk),
animations = arrayOf(
bedrock("chinchou", "ground_idle")
)
)
walk = registerPose(
poseName = "walk",
transformTicks = 10,
poseType = PoseType.WALK,
condition = { !it.isInWater && !it.isUnderWater},
quirks = arrayOf(blink),
animations = arrayOf(
bedrock("chinchou", "ground_walk")
)
)
floating = registerPose(
poseName = "floating",
transformTicks = 10,
poseType = PoseType.FLOAT,
condition = { it.isInWater },
quirks = arrayOf(blink, waterQuirk),
animations = arrayOf(
bedrock("chinchou", "water_idle")
)
)
swimming = registerPose(
poseName = "swimming",
transformTicks = 10,
condition = { it.isInWater },
poseTypes = PoseType.MOVING_POSES,
quirks = arrayOf(blink),
animations = arrayOf(
bedrock("chinchou", "water_swim"),
)
)
battleidle = registerPose(
poseName = "battle_idle",
poseTypes = PoseType.STATIONARY_POSES,
transformTicks = 10,
quirks = arrayOf(blink),
condition = { it.isBattling && !it.isInWater },
animations = arrayOf(
bedrock("chinchou", "battle_idle")
)
)
waterbattleidle = registerPose(
poseName = "water_battle_idle",
poseTypes = PoseType.STATIONARY_POSES,
transformTicks = 10,
quirks = arrayOf(blink),
condition = { it.isBattling && it.isInWater },
animations = arrayOf(
bedrock("chinchou", "water_battle_idle")
)
)
}
override fun getFaintAnimation(state: PosableState) = if (state.isPosedIn(standing, walk, battleidle, sleep)) bedrockStateful("chinchou", "faint") else if (state.isPosedIn( waterbattleidle, watersleep, floating, swimming )) bedrockStateful("chinchou", "water_faint") else null
}
@@ -368,6 +368,7 @@ object VaryingModelRepository {
inbuilt("magcargo", ::MagcargoModel)
inbuilt("slugma_shiny", ::SlugmaShinyModel)
inbuilt("magcargo_shiny", ::MagcargoShinyModel)
inbuilt("chinchou", ::ChinchouModel)
inbuilt("clamperl", ::ClamperlModel)
inbuilt("huntail", ::HuntailModel)
inbuilt("gorebyss", ::GorebyssModel)
@@ -9,7 +9,10 @@
package com.cobblemon.mod.common.entity.ai
import com.bedrockk.molang.Expression
import com.cobblemon.mod.common.CobblemonMemories
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asMostSpecificMoLangValue
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
import com.cobblemon.mod.common.util.getMemorySafely
import com.cobblemon.mod.common.util.mainThreadRuntime
import com.cobblemon.mod.common.util.resolveInt
import com.cobblemon.mod.common.util.withQueryValue
@@ -29,12 +32,23 @@ object FleeFromAttackerTask {
Trigger { _, entity, _ ->
val hurtByEntity = it.get(hurtByEntity)
val avoidTarget = it.tryGet(avoidTarget).orElse(null)
if (avoidTarget != null && avoidTarget == hurtByEntity.uuid) {
if (avoidTarget != null && avoidTarget == hurtByEntity) {
return@Trigger false
}
mainThreadRuntime.withQueryValue("entity", entity.asMostSpecificMoLangValue())
val avoidDurationTicks = mainThreadRuntime.resolveInt(avoidDurationTicks)
val pokemonEntity = entity as? PokemonEntity
pokemonEntity?.let {
it.after(1.0f) {
it.playMoodParticle("mood_stress")
}
}
entity.brain.setMemoryWithExpiry(MemoryModuleType.AVOID_TARGET, hurtByEntity, avoidDurationTicks.toLong())
return@Trigger true
}
}
@@ -8,6 +8,7 @@
package com.cobblemon.mod.common.entity.ai
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
import net.minecraft.world.entity.LivingEntity
import net.minecraft.world.entity.ai.behavior.OneShot
import net.minecraft.world.entity.ai.behavior.declarative.BehaviorBuilder
@@ -24,10 +25,16 @@ object GetAngryAtAttackerTask {
Trigger { _, entity, _ ->
val hurtByEntity = it.get(hurtByEntity)
val angryAt = it.tryGet(angryAt).orElse(null)
if (angryAt != null && angryAt == hurtByEntity.uuid) {
return@Trigger false
}
val becomingAngry = angryAt == null
entity.brain.setMemory(MemoryModuleType.ANGRY_AT, hurtByEntity.uuid)
if (becomingAngry) {
(entity as PokemonEntity?)?.playMoodParticle("mood_anger_steam")
}
return@Trigger true
}
}
@@ -34,6 +34,9 @@ import com.cobblemon.mod.common.api.molang.MoLangFunctions.addPokemonFunctions
import com.cobblemon.mod.common.api.molang.MoLangFunctions.addStandardFunctions
import com.cobblemon.mod.common.api.molang.MoLangFunctions.setup
import com.cobblemon.mod.common.api.molang.ObjectValue
import com.cobblemon.mod.common.api.moves.animations.ActionEffectContext
import com.cobblemon.mod.common.api.moves.animations.ActionEffects
import com.cobblemon.mod.common.api.moves.animations.UsersProvider
import com.cobblemon.mod.common.api.net.serializers.PlatformTypeDataSerializer
import com.cobblemon.mod.common.api.net.serializers.PoseTypeDataSerializer
import com.cobblemon.mod.common.api.net.serializers.RideBoostsDataSerializer
@@ -425,6 +428,9 @@ open class PokemonEntity(
var occupiedSeats = mutableMapOf<Seat, Entity>()
var moodParticleLock = false
var playedZeroStaminaParticle = false
init {
delegate.initialize(this)
delegate.changePokemon(pokemon)
@@ -904,6 +910,27 @@ open class PokemonEntity(
return future
}
fun playMoodParticle(particleName: String) {
if (moodParticleLock) return
val actionEffect = ActionEffects.actionEffects[cobblemonResource(particleName)] ?: return
cry()
val context = ActionEffectContext(
actionEffect = actionEffect,
providers = mutableListOf(UsersProvider(this)),
runtime = runtime,
level = level()
)
actionEffect.run(context)
moodParticleLock = true
after(5.0f) {
moodParticleLock = false
}
}
override fun saveWithoutId(nbt: CompoundTag): CompoundTag {
val tethering = this.tethering
if (tethering != null) {
@@ -2300,6 +2327,8 @@ open class PokemonEntity(
ifRidingAvailable { _, _, state ->
state.stamina.set(entityData.get(RIDE_STAMINA))
}
playedZeroStaminaParticle = false
}
}
@@ -2328,12 +2357,26 @@ open class PokemonEntity(
override fun tickRidden(driver: Player, movementInput: Vec3) {
super.tickRidden(driver, movementInput)
ifRidingAvailable { behaviour, settings, state ->
behaviour.tick(settings, state, this, driver, movementInput)
if (entityData.get(RIDE_STAMINA) == -1F) {
state.stamina.set(1F, forced = true)
}
if (!level().isClientSide) {
val stamina = state.stamina.get()
if (stamina <= 0f) {
if (!playedZeroStaminaParticle) {
playMoodParticle("mood_stress")
playedZeroStaminaParticle = true
}
} else {
playedZeroStaminaParticle = false
}
}
if (!this.level().isClientSide) {
val pose = behaviour.pose(settings, state, this)
if (pose != this.entityData.get(POSE_TYPE)) {
@@ -44,6 +44,11 @@ class DefendOwnerSensor : Sensor<PokemonEntity>(10) {
return@findClosest false
}.map { mob -> mob as LivingEntity }
val previousAttacker = entity.brain.getMemorySafely(CobblemonMemories.NEAREST_VISIBLE_ATTACKER)
val isNewAttacker = nearestAttacker.isPresent && previousAttacker.isEmpty
entity.brain.setMemory(CobblemonMemories.NEAREST_VISIBLE_ATTACKER, nearestAttacker)
if (isNewAttacker) {
entity.playMoodParticle("mood_anger_steam")
}
}
}
@@ -9,6 +9,7 @@
package com.cobblemon.mod.common.entity.pokemon.ai.tasks
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
import com.cobblemon.mod.common.util.getMemorySafely
import net.minecraft.world.entity.LivingEntity
import net.minecraft.world.entity.Mob
import net.minecraft.world.entity.ai.behavior.OneShot
@@ -60,7 +61,12 @@ object AttackHostileMobsTask {
}
if (hostile != null) {
val isNewTarget = currentTarget == null
entity.brain.setMemory(MemoryModuleType.ATTACK_TARGET, hostile)
if (isNewTarget) {
(entity as? PokemonEntity)?.playMoodParticle("mood_anger_steam")
}
true
} else {
false
@@ -91,7 +91,7 @@ class EatHeldItemTask(entity: PokemonEntity) : Behavior<PokemonEntity>(
}
this.timelastEaten = time
if (itemConfig != null && itemConfig.fullnessValue > 0) {
entity.pokemon.feedPokemon(itemConfig.fullnessValue, false)
entity.pokemon.feedPokemon(itemConfig.fullnessValue, false, false)
}
// Check if the result item is something that should be dropped
resultItemStack = entity.pokemon.heldItem()
@@ -13,7 +13,9 @@ import com.cobblemon.mod.common.api.apricorn.Apricorn
import com.cobblemon.mod.common.api.item.PokemonSelectingItem
import com.cobblemon.mod.common.api.riding.stats.RidingStat
import com.cobblemon.mod.common.client.pot.CookingQuality
import com.cobblemon.mod.common.net.messages.client.effect.SpawnSnowstormEntityParticlePacket
import com.cobblemon.mod.common.pokemon.Pokemon
import com.cobblemon.mod.common.util.cobblemonResource
import net.minecraft.network.chat.Component
import net.minecraft.server.level.ServerLevel
import net.minecraft.server.level.ServerPlayer
@@ -92,7 +94,9 @@ class AprijuiceItem(val type: Apricorn): CobblemonItem(Properties().stacksTo(16)
return InteractionResultHolder.fail(stack)
}
pokemon.feedPokemon(1)
if (!pokemon.feedPokemon(1)) {
return InteractionResultHolder.fail(stack)
}
val boosts = getBoosts(stack)
pokemon.addRideBoosts(boosts.mapValues { it.value.toFloat() })
@@ -96,8 +96,9 @@ class PokePuffItem : Item(Properties().stacksTo(64)), PokemonSelectingItem {
return InteractionResultHolder.fail(stack)
}
// Feed the Pokémon 4 fullness points
pokemon.feedPokemon(4)
if (!pokemon.feedPokemon(4)) {
return InteractionResultHolder.fail(stack)
}
val friendshipChange = PokePuffUtils.calculateFriendshipChange(stack, pokemon.nature)
@@ -54,14 +54,16 @@ class FriendshipRaisingBerryItem(block: BerryBlock, val stat: Stat) : BerryItem(
val evLowerAmount = max(genericRuntime.resolveInt(CobblemonMechanics.berries.evLowerAmount), 0)
val decreasedEVs = pokemon.evs.add(stat, -evLowerAmount, ItemEvSource(player, stack, pokemon)) != 0
return if (increasedFriendship || decreasedEVs) {
pokemon.feedPokemon(1)
stack.consume(1, player)
InteractionResultHolder.success(stack)
} else {
InteractionResultHolder.pass(stack)
if (!increasedFriendship && !decreasedEVs) {
return InteractionResultHolder.pass(stack)
}
if (!pokemon.feedPokemon(1)) {
return InteractionResultHolder.fail(stack)
}
stack.consume(1, player)
return InteractionResultHolder.success(stack)
}
override fun use(world: Level, user: Player, hand: InteractionHand): InteractionResultHolder<ItemStack> {
@@ -54,7 +54,10 @@ class HealingBerryItem(block: BerryBlock, val amount: () -> ExpressionLike): Ber
return InteractionResultHolder.fail(stack)
}
pokemon.feedPokemon(1)
if (!pokemon.feedPokemon(1)) {
return InteractionResultHolder.fail(stack)
}
pokemon.currentHealth = Integer.min(pokemon.currentHealth + genericRuntime.resolveInt(amount(), pokemon), pokemon.maxHealth)
stack.consume(1, player)
return InteractionResultHolder.success(stack)
@@ -62,7 +65,7 @@ class HealingBerryItem(block: BerryBlock, val amount: () -> ExpressionLike): Ber
override fun applyToBattlePokemon(player: ServerPlayer, stack: ItemStack, battlePokemon: BattlePokemon) {
super.applyToBattlePokemon(player, stack, battlePokemon)
battlePokemon.originalPokemon.feedPokemon(1)
battlePokemon.originalPokemon.feedPokemon(1, playMoodParticle = false)
}
override fun use(world: Level, user: Player, hand: InteractionHand): InteractionResultHolder<ItemStack> {
@@ -48,21 +48,26 @@ class PPRestoringBerryItem(block: BerryBlock, val amount: () -> ExpressionLike):
&& super.canUseOnPokemon(stack, pokemon)
override fun applyToPokemon(player: ServerPlayer, stack: ItemStack, pokemon: Pokemon, move: Move) {
if (canUseOnPokemon(stack, pokemon) && canUseOnMove(stack, move)) {
pokemon.feedPokemon(1)
val moveToRecover = pokemon.moveSet.find { it.template == move.template }
if (moveToRecover != null && moveToRecover.currentPp < moveToRecover.maxPp) {
moveToRecover.currentPp =
min(moveToRecover.maxPp, moveToRecover.currentPp + genericRuntime.resolveInt(amount(), pokemon))
if (!canUseOnPokemon(stack, pokemon) && canUseOnMove(stack, move)) {
return
}
stack.consume(1, player)
}
if (!pokemon.feedPokemon(1)) {
return
}
val moveToRecover = pokemon.moveSet.find { it.template == move.template }
if (moveToRecover != null && moveToRecover.currentPp < moveToRecover.maxPp) {
moveToRecover.currentPp =
min(moveToRecover.maxPp, moveToRecover.currentPp + genericRuntime.resolveInt(amount(), pokemon))
stack.consume(1, player)
}
}
override fun applyToBattlePokemon(player: ServerPlayer, stack: ItemStack, battlePokemon: BattlePokemon, move: Move) {
super.applyToBattlePokemon(player, stack, battlePokemon, move)
battlePokemon.originalPokemon.feedPokemon(1)
battlePokemon.originalPokemon.feedPokemon(1, playMoodParticle = false)
}
override fun use(world: Level, user: Player, hand: InteractionHand): InteractionResultHolder<ItemStack> {
@@ -59,7 +59,9 @@ class PortionHealingBerryItem(block: BerryBlock, val canCauseConfusion: Boolean,
}
// count these berries as multiple feedings due to the amount they heal
pokemon.feedPokemon(5)
if (!pokemon.feedPokemon(5)) {
return InteractionResultHolder.fail(stack)
}
var amount = Integer.min(pokemon.currentHealth + (genericRuntime.resolveFloat(portion(), pokemon) * pokemon.maxHealth).toInt(), pokemon.maxHealth)
CobblemonEvents.POKEMON_HEALED.postThen(PokemonHealedEvent(pokemon, amount, this), { cancelledEvent -> return InteractionResultHolder.fail(stack)}) { event ->
@@ -73,7 +75,7 @@ class PortionHealingBerryItem(block: BerryBlock, val canCauseConfusion: Boolean,
override fun applyToBattlePokemon(player: ServerPlayer, stack: ItemStack, battlePokemon: BattlePokemon) {
super.applyToBattlePokemon(player, stack, battlePokemon)
battlePokemon.originalPokemon.feedPokemon(5)
battlePokemon.originalPokemon.feedPokemon(5, playMoodParticle = false)
}
override fun use(world: Level, user: Player, hand: InteractionHand): InteractionResultHolder<ItemStack> {
@@ -58,19 +58,23 @@ class StatusCuringBerryItem(block: BerryBlock, vararg val status: Status): Berry
stack: ItemStack,
pokemon: Pokemon
): InteractionResultHolder<ItemStack>? {
return if (canUseOnPokemon(stack, pokemon)) {
pokemon.feedPokemon(1)
pokemon.status = null
stack.consume(1, player)
InteractionResultHolder.success(stack)
} else {
InteractionResultHolder.fail(stack)
if (!canUseOnPokemon(stack, pokemon)) {
return InteractionResultHolder.fail(stack)
}
if (!pokemon.feedPokemon(1)) {
return InteractionResultHolder.fail(stack)
}
pokemon.status = null
stack.consume(1, player)
return InteractionResultHolder.success(stack)
}
override fun applyToBattlePokemon(player: ServerPlayer, stack: ItemStack, battlePokemon: BattlePokemon) {
super.applyToBattlePokemon(player, stack, battlePokemon)
battlePokemon.originalPokemon.feedPokemon(1)
battlePokemon.originalPokemon.feedPokemon(1, playMoodParticle = false)
}
override fun use(world: Level, user: Player, hand: InteractionHand): InteractionResultHolder<ItemStack> {
@@ -316,6 +316,7 @@ object CobblemonItemGroups {
entries.accept(CobblemonItems.PASTURE)
entries.accept(CobblemonItems.TM_MACHINE)
entries.accept(CobblemonItems.DISC_SHELF)
entries.accept(CobblemonItems.HABITAT_BLOCK)
entries.accept(CobblemonItems.GILDED_CHEST)
entries.accept(CobblemonItems.YELLOW_GILDED_CHEST)
@@ -53,7 +53,10 @@ class BerryJuiceItem : CobblemonItem(Properties()), PokemonSelectingItem, Healin
if (!canUseOnPokemon(stack, pokemon)) {
return InteractionResultHolder.fail(stack)
}
pokemon.feedPokemon(1)
if (!pokemon.feedPokemon(1)) {
return InteractionResultHolder.fail(stack)
}
var amount = Integer.min(pokemon.currentHealth + 20, pokemon.maxHealth)
CobblemonEvents.POKEMON_HEALED.postThen(PokemonHealedEvent(pokemon, amount, this), { cancelledEvent -> return InteractionResultHolder.fail(stack)}) { event ->
@@ -74,7 +77,9 @@ class BerryJuiceItem : CobblemonItem(Properties()), PokemonSelectingItem, Healin
override fun applyToBattlePokemon(player: ServerPlayer, stack: ItemStack, battlePokemon: BattlePokemon) {
super.applyToBattlePokemon(player, stack, battlePokemon)
battlePokemon.originalPokemon.feedPokemon(1)
battlePokemon.originalPokemon.feedPokemon(1, playMoodParticle = false)
if (!player.hasInfiniteMaterials()) {
val woodenBowlItemStack = ItemStack(Items.BOWL)
if (!player.inventory.add(woodenBowlItemStack)) {
@@ -33,7 +33,9 @@ class FreshStartMochiItem : CobblemonItem(Properties()), PokemonSelectingItem {
return InteractionResultHolder.fail(stack)
}
pokemon.feedPokemon(1)
if (!pokemon.feedPokemon(1)) {
return InteractionResultHolder.fail(stack)
}
pokemon.evs.forEach {
pokemon.setEV(it.key, 0)
@@ -24,7 +24,9 @@ class MochiItem(stat: Stats): EVIncreaseItem(stat, 4) {
return InteractionResultHolder.fail(stack)
}
pokemon.feedPokemon(1)
if (!pokemon.feedPokemon(1)) {
return InteractionResultHolder.fail(stack)
}
return super.applyToPokemon(player, stack, pokemon)
}
@@ -985,6 +985,10 @@ open class Pokemon : ShowdownIdentifiable {
this.recall()
}
fun playMoodParticle(particleName: String) {
entity?.playMoodParticle(particleName)
}
fun heal() {
CobblemonEvents.POKEMON_HEALED.postThen(PokemonHealedEvent(this)) { event ->
this.currentHealth = maxHealth
@@ -1056,23 +1060,13 @@ open class Pokemon : ShowdownIdentifiable {
else -> 0 // For weights less than 0.1
}
fun feedPokemon(feedCount: Int, playSound: Boolean = true) {
// play sounds from the entity first (itemstack is consumed outside of this function)
if (this.entity != null && playSound) {
val fullnessPercent = ((this.currentFullness).toFloat() / (this.getMaxFullness()).toFloat()) * (.5f)
if (this.currentFullness >= this.getMaxFullness()) {
this.entity?.playSound(CobblemonSounds.BERRY_EAT_FULL, 1F, 1F)
}
else {
this.entity?.playSound(CobblemonSounds.BERRY_EAT, 1F, 1F + fullnessPercent)
}
}
fun feedPokemon(feedCount: Int, playSound: Boolean = true, playMoodParticle: Boolean = true): Boolean {
playFullnessEffects(playSound, playMoodParticle)
// if it is already full we don't need to do anything
// TODO this can happen when feeding in battle since we are temporarily ignoring fullness checks for pp/hp/status berries
if (isFull()) {
return
return false
}
this.currentFullness = (this.currentFullness + feedCount).coerceIn(0, this.getMaxFullness())
@@ -1081,6 +1075,31 @@ open class Pokemon : ShowdownIdentifiable {
if (this.currentFullness == 1) {
this.resetMetabolismCycle()
}
return true
}
private fun playFullnessEffects(playSound: Boolean = true, playMoodParticle: Boolean = true) {
if (!playSound && !playMoodParticle) return
val pokemonEntity = entity ?: return
val fullnessPercent = ((this.currentFullness).toFloat() / (this.getMaxFullness()).toFloat()) * (.5f)
if (!isFull()) {
if (playSound) {
pokemonEntity.playSound(CobblemonSounds.BERRY_EAT, 1F, 1F + fullnessPercent)
}
return
}
if (playSound) {
pokemonEntity.playSound(CobblemonSounds.BERRY_EAT_FULL, 1F, 1F)
if (playMoodParticle) {
pokemonEntity.playMoodParticle("mood_annoyed")
}
}
}
// decrease a pokemon's Fullness value by a certain amount
@@ -115,26 +115,8 @@ object TradeManager : RequestManager<TradeManager.TradeRequest>() {
}
CobblemonEvents.TRADE_EVENT_PRE.postThen(TradeEvent.Pre(player1, pokemon2, player2, pokemon1)) {
val party1 = player1.party
val party2 = player2.party
val player1Removed = party1.remove(pokemon1)
val player2Removed = party2.remove(pokemon2)
if (!player1Removed || !player2Removed) {
if (!player1Removed) {
Cobblemon.LOGGER.warn("Failed to remove traded Pokémon ${pokemon1.species.resourceIdentifier} from ${player1.name.string}(${player1.uuid}). Aborting trade with ${player2.name.string}(${player2.uuid}), potential exploit abused.")
}
if (!player2Removed) {
Cobblemon.LOGGER.warn("Failed to remove traded Pokémon ${pokemon2.species.resourceIdentifier} from ${player2.name.string}(${player2.uuid}). Aborting trade with ${player1.name.string}(${player1.uuid}), potential exploit abused.")
}
// Revert any changes if one of the removals failed
if (player1Removed) party1.add(pokemon1)
if (player2Removed) party2.add(pokemon2)
return@postThen
}
party1.remove(pokemon1)
party2.remove(pokemon2)
// If player1 is the OT, keep track of the friendship
pokemon1.cacheFriendship(player1.uuid)
@@ -1575,6 +1575,470 @@
}
}
},
"animation.substitute.destroy_burst": {
"animation_length": 3,
"bones": {
"body": {
"rotation": ["-0.3*Math.cos((query.anim_time-0) * 90 * 0.5+90) *0.3", 0, "0.3*Math.cos((query.anim_time-0) * 90 * 0.5) *0.3"],
"position": {
"0.0": [0, 0, 0],
"0.125": [0, 0, 0],
"0.1667": {
"pre": [0, 0.25, 5],
"post": [0, 0.25, 5],
"lerp_mode": "catmullrom"
},
"0.2083": {
"post": [0, 0.25, 9.9],
"lerp_mode": "catmullrom"
},
"0.2917": {
"post": [0, 0.25, 12.4],
"lerp_mode": "catmullrom"
},
"0.375": {
"post": [0, 0, 13.3],
"lerp_mode": "catmullrom"
},
"0.4583": [0, 0, 13.3]
},
"scale": {
"0.0": {
"post": [1, 1, 1],
"lerp_mode": "catmullrom"
},
"0.0417": {
"post": [1, 1, 1],
"lerp_mode": "catmullrom"
},
"0.125": {
"post": [1.11, 1.05, 0.9],
"lerp_mode": "catmullrom"
},
"0.25": {
"post": [0.855, 1.025, 1.05],
"lerp_mode": "catmullrom"
},
"0.375": {
"post": [1, 1, 1],
"lerp_mode": "catmullrom"
}
}
},
"arm_left": {
"rotation": {
"0.0": ["-2.5-3*Math.cos((query.anim_time-0.25) * 90 * 1) *0.05", 7.5, 0],
"0.0833": [-2.54822, 7.5, 0],
"0.125": {
"pre": [19.95178, 10, 0],
"post": [19.95178, 10, 0],
"lerp_mode": "catmullrom"
},
"0.25": {
"post": [-2.05, -90, -17],
"lerp_mode": "catmullrom"
},
"0.375": {
"post": [-21.03, -80.89, -17.09],
"lerp_mode": "catmullrom"
},
"0.5": {
"post": [32.35, -50.6, -22],
"lerp_mode": "catmullrom"
},
"0.625": {
"post": [28.45, -46.5, -26],
"lerp_mode": "catmullrom"
},
"0.7917": [28.45, -46.5, -26],
"0.9583": {
"pre": [32.01, -45.83, -30.71],
"post": [32.01, -45.83, -30.71],
"lerp_mode": "catmullrom"
},
"1.25": {
"post": [54.92, -41.5, -61],
"lerp_mode": "catmullrom"
},
"1.5": [54.92, -41.5, -61]
},
"position": {
"0.0": [0, 0, 0],
"0.125": [0, 0, 0],
"0.1667": {
"pre": [0, 0.5, 0.25],
"post": [0, 0.5, 0.25],
"lerp_mode": "catmullrom"
},
"0.2083": [0, 0.5, 0.25],
"0.3333": {
"pre": [0, -0.25, 0.25],
"post": [0, -0.25, 0.25],
"lerp_mode": "catmullrom"
},
"0.7917": [0, -0.25, 0.25],
"1.25": {
"pre": [0, 0, 0.25],
"post": [0, 0, 0.25],
"lerp_mode": "catmullrom"
},
"1.5": [0, 0, 0.25]
}
},
"tail": {
"rotation": {
"0.0": ["2.5+2*Math.cos((query.anim_time-0.5) * 90 * 1) *0.025", 0, 0],
"0.0833": [2.5, 0, 0],
"0.1667": {
"pre": [6, -2.5, 2.5],
"post": [6, -2.5, 2.5],
"lerp_mode": "catmullrom"
},
"0.2083": [6, -2.5, 2.5],
"0.2917": {
"pre": [6.5, 0, 0],
"post": [6.5, 0, 0],
"lerp_mode": "catmullrom"
},
"0.375": {
"post": [4, 0, 0],
"lerp_mode": "catmullrom"
},
"0.5": {
"post": [-11.8, 0, 0],
"lerp_mode": "catmullrom"
},
"0.6667": {
"post": [-14.6, 0, 0],
"lerp_mode": "catmullrom"
},
"0.9583": {
"post": [-17.14, 0, -1.02],
"lerp_mode": "catmullrom"
},
"1.25": [-29.5, 0, -4.5]
},
"position": {
"0.0": [0, 0, 0],
"0.6667": [0, 0, 0],
"1.25": [0, -0.3, 0]
}
},
"tail2": {
"rotation": {
"0.0": ["15+2*Math.cos((query.anim_time-0.75) * 90 * 1) *0.025", 0, 0],
"0.0417": [15.04735, 0, 0],
"0.125": {
"pre": [20, 0, 0],
"post": [20, 0, 0],
"lerp_mode": "catmullrom"
},
"0.2083": [0, 0, 0],
"0.2917": {
"pre": [-2.95, 0, 0],
"post": [-2.95, 0, 0],
"lerp_mode": "catmullrom"
},
"0.375": {
"post": [-2.5, 0, 0],
"lerp_mode": "catmullrom"
},
"0.4583": {
"post": [12.5, 0, 0],
"lerp_mode": "catmullrom"
},
"0.5833": [7.5, 0, 0]
}
},
"leg_left": {
"rotation": {
"0.0": [5, 5, 0],
"0.0833": [5, 5, 0],
"0.125": {
"pre": [5, 12.5, 0],
"post": [5, 12.5, 0],
"lerp_mode": "catmullrom"
},
"0.2917": {
"post": [-7.5, -10, 0],
"lerp_mode": "catmullrom"
},
"0.4167": {
"post": [2.5, -7.5, -5],
"lerp_mode": "catmullrom"
},
"0.5": [2.5, -7.5, -5],
"0.6667": [2.5, -7.5, -5],
"1.0": {
"pre": [0.5, -7.5, 1.5],
"post": [0.5, -7.5, 1.5],
"lerp_mode": "catmullrom"
},
"1.25": [0.5, -7.5, 1.5]
},
"position": {
"0.0": [0, 0, 0],
"0.0417": {
"pre": [0, 0, 0],
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"0.0833": [0, 0, 0],
"0.4167": [0, -0.5, -0.08],
"1.0": [0.25, -0.75, -0.25]
},
"scale": 1
},
"leg_right": {
"rotation": {
"0.0": [5, -5, 0],
"0.0833": [5, -5, 0],
"0.125": {
"pre": [5, -12.5, 0],
"post": [5, -12.5, 0],
"lerp_mode": "catmullrom"
},
"0.2917": {
"post": [-7.5, 10, 0],
"lerp_mode": "catmullrom"
},
"0.4167": {
"post": [2.5, 7.5, 5],
"lerp_mode": "catmullrom"
},
"0.5": [2.5, 7.5, 5],
"0.6667": [2.5, 7.5, 5],
"1.0": {
"pre": [2.5, 7.5, 2.5],
"post": [2.5, 7.5, 2.5],
"lerp_mode": "catmullrom"
},
"1.25": [2.5, 7.5, 2.5]
},
"position": {
"0.0": [0, 0, 0],
"0.0417": {
"pre": [0, 0, 0],
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"0.0833": [0, 0, 0],
"0.4167": [0, -0.5, -0.08]
}
},
"arm_right": {
"rotation": {
"0.0": ["-2.5-3*Math.cos((query.anim_time-0.25) * 90 * 1) *0.05", -7.5, 0],
"0.0833": [-2.54822, -7.5, 0],
"0.125": {
"pre": [19.95178, -10, 0],
"post": [19.95178, -10, 0],
"lerp_mode": "catmullrom"
},
"0.25": {
"post": [-2.05, 90, 17],
"lerp_mode": "catmullrom"
},
"0.375": {
"post": [-21.03, 80.89, 17.09],
"lerp_mode": "catmullrom"
},
"0.5": {
"post": [32.35, 50.6, 22],
"lerp_mode": "catmullrom"
},
"0.625": {
"post": [28.45, 46.5, 26],
"lerp_mode": "catmullrom"
},
"0.7917": [28.45, 46.5, 26],
"1.0417": {
"pre": [40.18, 36.5, 36.67],
"post": [40.18, 36.5, 36.67],
"lerp_mode": "catmullrom"
},
"1.25": {
"post": [72.42, 9, 66],
"lerp_mode": "catmullrom"
},
"1.5": [72.42, 9, 66]
},
"position": {
"0.0": [0, 0, 0],
"0.125": [0, 0, 0],
"0.1667": {
"pre": [0, 0.5, 0.25],
"post": [0, 0.5, 0.25],
"lerp_mode": "catmullrom"
},
"0.2083": [0, 0.5, 0.25],
"0.3333": {
"pre": [0, -0.25, 0.25],
"post": [0, -0.25, 0.25],
"lerp_mode": "catmullrom"
},
"0.7917": [0, -0.25, 0.25],
"1.25": {
"pre": [0, 0.25, 0.25],
"post": [0, 0.25, 0.25],
"lerp_mode": "catmullrom"
},
"1.5": [0, 0.25, 0.25]
}
},
"torso": {
"rotation": {
"0.0": {
"post": [3.47, 0, 1.13],
"lerp_mode": "catmullrom"
},
"0.0833": {
"post": [-7, 0.3, -2.4],
"lerp_mode": "catmullrom"
},
"0.25": {
"post": [-12, 0, -3.2],
"lerp_mode": "catmullrom"
},
"0.3333": {
"post": [-2.89, 0, -1.77],
"lerp_mode": "catmullrom"
},
"0.4167": {
"post": [3, 0, 0],
"lerp_mode": "catmullrom"
},
"0.7917": {
"post": [6.12, 0, 1.57],
"lerp_mode": "catmullrom"
},
"1.0": {
"post": [8.28, 0, 3.68],
"lerp_mode": "catmullrom"
},
"1.25": [15.78, 0, 4.18]
},
"position": {
"0.0": [0, 0, 0],
"0.125": [0, 0, 0],
"0.25": {
"pre": [0, 0.25, 0.25],
"post": [0, 0.25, 0.25],
"lerp_mode": "catmullrom"
},
"0.2917": {
"post": [0, 0.15, 0.15],
"lerp_mode": "catmullrom"
},
"0.3333": [0, 0, 0],
"0.6667": [0, 0, 0],
"0.7917": [0, 0, 0],
"0.9167": {
"pre": [0.05, 0, 0],
"post": [0.05, 0, 0],
"lerp_mode": "catmullrom"
},
"1.25": [0.25, -0.6, 0]
},
"scale": {
"0.0": [1, 1, 1],
"0.875": [1, 1, 1],
"1.1667": {
"pre": [1, 0.92, 1],
"post": [1, 0.92, 1],
"lerp_mode": "catmullrom"
},
"1.5": {
"post": [1, 0.92, 1],
"lerp_mode": "catmullrom"
}
}
},
"head": {
"relative_to": {
"rotation": "entity"
},
"rotation": {
"0.0": [0, 0, 0.01],
"0.0833": {
"pre": [12.17, 0, 5.33],
"post": [12.17, 0, 5.33],
"lerp_mode": "catmullrom"
},
"0.125": {
"post": [-7.5, 2.5, 7.5],
"lerp_mode": "catmullrom"
},
"0.25": {
"post": [-5, "5-2*math.sin(q.anim_time*90*20+60)", "12.5+1*math.sin(q.anim_time*90*40+60)"],
"lerp_mode": "catmullrom"
}
},
"position": {
"0.0": [0, 0, 0],
"0.0833": {
"pre": [0, 0, 0.5],
"post": [0, 0, 0.5],
"lerp_mode": "catmullrom"
},
"0.2083": {
"post": [0, 0.5, 0.5],
"lerp_mode": "catmullrom"
},
"0.25": [0, 0, 0]
},
"scale": {
"0.0": [1, 1, 1],
"0.0833": {
"pre": [1.05, 0.9, 1.05],
"post": [1.05, 0.9, 1.05],
"lerp_mode": "catmullrom"
},
"0.125": [0.95, 1.2, 0.95],
"0.1667": [0, 0, 0]
}
},
"stuffing_neck": {
"position": {
"0.0": [0, 0, 0],
"0.2083": {"pre": [0, 0, 0], "post": [0, 0.3, 0]}
}
},
"locator_neck_fluff": {
"rotation": [-180, 0, 0]
},
"stuffing_shoulder_left": {
"position": {
"0.0": [0, 0, 0],
"0.2083": {"pre": [0, 0, 0], "post": [0.25, 0, 0]}
}
},
"stuffing_arm_left": {
"position": {
"0.0": [0, 0, 0],
"0.2083": {"pre": [0, 0, 0], "post": [-0.25, 0, 0]}
}
},
"stuffing_arm_right": {
"position": {
"0.0": [0, 0, 0],
"0.2083": {"pre": [0, 0, 0], "post": [0.25, 0, 0]}
}
},
"stuffing_shoulder_right": {
"position": {
"0.0": [0, 0, 0],
"0.2083": {"pre": [0, 0, 0], "post": [-0.25, 0, 0]}
}
}
},
"particle_effects": {
"0.1667": {
"effect": "substitute_fluff",
"locator": "neck_fluff"
}
}
},
"animation.substitute.flop_WIP": {
"animation_length": 1.5,
"bones": {
@@ -0,0 +1,43 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:mood_anger_steam",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/mood/steam_center_double"
}
},
"components": {
"minecraft:emitter_rate_instant": {
"num_particles": 1
},
"minecraft:emitter_lifetime_once": {
"active_time": 1
},
"minecraft:emitter_shape_point": {
"offset": [0, "math.clamp((v.entity_radius*1.2),0.48,0.96)*0.75", 0]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 1
},
"minecraft:particle_initial_speed": 0,
"minecraft:particle_motion_dynamic": {},
"minecraft:particle_appearance_billboard": {
"size": ["math.clamp((v.entity_radius*1.5),0.9,2.4)", "math.clamp((v.entity_radius*0.5),0.3,0.8)"],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 48,
"texture_height": 176,
"flipbook": {
"base_UV": [0, 0],
"size_UV": [48, 16],
"step_UV": [0, 16],
"max_frame": 11,
"stretch_to_lifetime": true
}
}
}
}
}
}
@@ -0,0 +1,64 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:mood_anger_veins",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/mood/vein_red"
}
},
"components": {
"minecraft:emitter_initialization": {
"creation_expression": "v.particle_size = math.clamp((v.entity_radius*0.75),0.15,0.4);"
},
"minecraft:emitter_rate_instant": {
"num_particles": 1
},
"minecraft:emitter_lifetime_once": {
"active_time": 1
},
"minecraft:emitter_shape_point": {
"direction": ["math.random(-1,1)", 1.5, "math.random(-1,1)"]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 1.25
},
"minecraft:particle_initial_spin": {
"rotation": "math.random_integer(-1,2)*90"
},
"minecraft:particle_initial_speed": "v.particle_size*13",
"minecraft:particle_motion_dynamic": {
"linear_acceleration": [0, 0.75, 0],
"linear_drag_coefficient": "v.particle_size*15"
},
"minecraft:particle_appearance_billboard": {
"size": ["math.clamp((v.entity_radius*0.75),0.15,0.3)", "math.clamp((v.entity_radius*0.75),0.15,0.3)"],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 22,
"texture_height": 11,
"flipbook": {
"base_UV": [0, 0],
"size_UV": [11, 11],
"step_UV": [11, 0],
"frames_per_second": 6,
"max_frame": 2,
"loop": true
}
}
},
"minecraft:particle_motion_collision": {},
"minecraft:particle_appearance_lighting": {},
"minecraft:particle_appearance_tinting": {
"color": {
"interpolant": "v.particle_age/v.particle_lifetime",
"gradient": {
"0.86": "#ffffffff",
"1.0": "#FF000000"
}
}
}
}
}
}
@@ -0,0 +1,49 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:mood_annoyed",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/mood/scribble_purple"
}
},
"components": {
"minecraft:emitter_initialization": {
"creation_expression": "v.particle_size = math.clamp((v.entity_radius*0.75),0.2,0.5);"
},
"minecraft:emitter_rate_instant": {
"num_particles": 1
},
"minecraft:emitter_lifetime_once": {
"active_time": 2
},
"minecraft:emitter_shape_point": {
"direction": [0, 1, 0]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 1
},
"minecraft:particle_initial_speed": "v.particle_size*10",
"minecraft:particle_motion_dynamic": {
"linear_drag_coefficient": 3
},
"minecraft:particle_appearance_billboard": {
"size": ["math.clamp((v.entity_radius*0.75),0.2,0.5)", "math.clamp((v.entity_radius*0.75),0.2,0.5)"],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 168,
"texture_height": 14,
"flipbook": {
"base_UV": [0, 0],
"size_UV": [14, 14],
"step_UV": [14, 0],
"frames_per_second": 10,
"max_frame": 12
}
}
},
"minecraft:particle_appearance_lighting": {}
}
}
}
@@ -0,0 +1,47 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:mood_stress",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/mood/sweat_blue"
}
},
"components": {
"minecraft:emitter_initialization": {
"creation_expression": "v.particle_height = math.clamp((v.entity_radius*1.2),0.48,0.96);"
},
"minecraft:emitter_rate_instant": {
"num_particles": 1
},
"minecraft:emitter_lifetime_looping": {
"active_time": 1
},
"minecraft:emitter_shape_point": {
"offset": [0, "math.clamp((v.entity_radius*1.2),0.48,0.96)*0.75", 0]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 0.45
},
"minecraft:particle_initial_speed": 0,
"minecraft:particle_motion_dynamic": {},
"minecraft:particle_appearance_billboard": {
"size": ["math.clamp((v.entity_radius*1.2),0.48,0.96)", "math.clamp((v.entity_radius*0.65),0.26,0.52)"],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 216,
"texture_height": 13,
"flipbook": {
"base_UV": [0, 0],
"size_UV": [24, 13],
"step_UV": [24, 0],
"max_frame": 9,
"stretch_to_lifetime": true
}
}
},
"minecraft:particle_appearance_lighting": {}
}
}
}
@@ -1222,7 +1222,7 @@
"position": [0, 0, "-0.2+math.cos(q.anim_time*90*16/3*2)*0.3"]
},
"hair2": {
"rotation": ["-1-math.cos(q.anim_time*90*16/3*2+30)*6", 0, 0]
"rotation": ["-2.5-math.cos(q.anim_time*90*16/3*2+30)*9", 0, 0]
},
"wings_closed": {
"rotation": ["-math.cos(q.anim_time*90*16/3*2-45)*2", 0, "math.sin(q.anim_time*90*16/3)*-1"]
@@ -1462,6 +1462,9 @@
"bones": {
"pidgey": {
"position": [0, 0, "20-q.anim_time*16*0.95"]
},
"head": {
"position": [0, 0, -0.1]
}
}
},
@@ -152,9 +152,6 @@
},
"claw_outer_right": {
"rotation": [10, 0, 0]
},
"wings_open": {
"scale": 0
}
}
},
@@ -207,9 +207,6 @@
},
"seat_1": {
"rotation": [22.5, 0, 0]
},
"wings_open": {
"scale": 0
}
}
},
@@ -1811,9 +1808,6 @@
},
"seat_1": {
"rotation": [22.5, 0, 0]
},
"wings_open": {
"scale": 0
}
}
},
@@ -2023,9 +2017,6 @@
},
"seat_1": {
"rotation": [22.5, 0, 0]
},
"wings_open": {
"scale": 0
}
}
},
@@ -3627,9 +3618,6 @@
},
"seat_1": {
"rotation": [22.5, 0, 0]
},
"wings_open": {
"scale": 0
}
}
},
@@ -4938,14 +4926,8 @@
},
"scale": {
"0.0": [0, 0, 0],
"0.24": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
},
"2.12": {
"pre": [1, 1, 1],
"post": [0, 0, 0]
}
"0.24": {"pre": [0, 0, 0], "post": [1, 1, 1]},
"2.12": {"pre": [1, 1, 1], "post": [0, 0, 0]}
}
},
"wing_open_left2": {
@@ -5637,27 +5619,15 @@
"pupil_left": {
"position": {
"0.0": [-0.25, 0, 0],
"0.4": {
"pre": [-0.25, 0, 0],
"post": [0, 0, 0]
},
"1.4": {
"pre": [0, 0, 0],
"post": [-0.25, 0, 0]
}
"0.4": {"pre": [-0.25, 0, 0], "post": [0, 0, 0]},
"1.4": {"pre": [0, 0, 0], "post": [-0.25, 0, 0]}
}
},
"eyelid_left": {
"position": {
"0.0": [0, 0, 0],
"0.32": {
"pre": [0, 0, 0],
"post": [0.1, 0, -0.1]
},
"1.4": {
"pre": [0.1, 0, -0.1],
"post": [0, 0, 0]
}
"0.32": {"pre": [0, 0, 0], "post": [0.1, 0, -0.1]},
"1.4": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]}
}
},
"jaw": {
@@ -5928,14 +5898,8 @@
},
"scale": {
"0.0": [1, 1, 1],
"0.24": {
"pre": [1, 1, 1],
"post": [0, 0, 0]
},
"2.12": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
}
"0.24": {"pre": [1, 1, 1], "post": [0, 0, 0]},
"2.12": {"pre": [0, 0, 0], "post": [1, 1, 1]}
}
},
"wing_closed_left1": {
@@ -6177,27 +6141,15 @@
"pupil_right": {
"position": {
"0.0": [-0.65, 0, 0],
"0.4": {
"pre": [-0.65, 0, 0],
"post": [0, 0, 0]
},
"1.4": {
"pre": [0, 0, 0],
"post": [-0.65, 0, 0]
}
"0.4": {"pre": [-0.65, 0, 0], "post": [0, 0, 0]},
"1.4": {"pre": [0, 0, 0], "post": [-0.65, 0, 0]}
}
},
"eyelid_right": {
"position": {
"0.0": [0, 0, 0],
"0.32": {
"pre": [0, 0, 0],
"post": [-0.1, 0, -0.1]
},
"1.4": {
"pre": [-0.1, 0, -0.1],
"post": [0, 0, 0]
}
"0.32": {"pre": [0, 0, 0], "post": [-0.1, 0, -0.1]},
"1.4": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]}
}
},
"head_angle": {
@@ -6209,69 +6161,33 @@
"eyes_ditto": {
"position": {
"0.0": [0, 0, 0],
"0.32": {
"pre": [0, 0, 0],
"post": [0, 0, 0.1]
},
"1.4": {
"pre": [0, 0, 0.1],
"post": [0, 0, 0]
}
"0.32": {"pre": [0, 0, 0], "post": [0, 0, 0.1]},
"1.4": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"eyes_blink_ditto": {
"position": {
"0.0": [0, 0, 0],
"0.32": {
"pre": [0, 0, 0],
"post": [0, 0, -0.1]
},
"1.4": {
"pre": [0, 0, -0.1],
"post": [0, 0, 0]
}
"0.32": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.4": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"mouth_ditto": {
"scale": {
"0.92": [1, 1, 1],
"1.32": {
"pre": [1, 1, 1],
"post": [0, 0, 0]
},
"1.68": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
},
"1.76": {
"pre": [1, 1, 1],
"post": [0, 0, 0]
},
"2.04": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
}
"1.32": {"pre": [1, 1, 1], "post": [0, 0, 0]},
"1.68": {"pre": [0, 0, 0], "post": [1, 1, 1]},
"1.76": {"pre": [1, 1, 1], "post": [0, 0, 0]},
"2.04": {"pre": [0, 0, 0], "post": [1, 1, 1]}
}
},
"mouth_open_ditto": {
"position": {
"0.92": [0, 0, 0],
"1.32": {
"pre": [0, 0, 0],
"post": [0, 0, -0.1]
},
"1.68": {
"pre": [0, 0, -0.1],
"post": [0, 0, 0]
},
"1.76": {
"pre": [0, 0, 0],
"post": [0, 0, -0.1]
},
"2.04": {
"pre": [0, 0, -0.1],
"post": [0, 0, 0]
}
"1.32": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.68": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"1.76": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"2.04": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"seat_1": {
@@ -6582,14 +6498,8 @@
},
"scale": {
"0.0": [0, 0, 0],
"0.24": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
},
"2.12": {
"pre": [1, 1, 1],
"post": [0, 0, 0]
}
"0.24": {"pre": [0, 0, 0], "post": [1, 1, 1]},
"2.12": {"pre": [1, 1, 1], "post": [0, 0, 0]}
}
},
"wing_open_left2": {
@@ -7281,27 +7191,15 @@
"pupil_left": {
"position": {
"0.0": [-0.25, 0, 0],
"0.4": {
"pre": [-0.25, 0, 0],
"post": [0, 0, 0]
},
"1.4": {
"pre": [0, 0, 0],
"post": [-0.25, 0, 0]
}
"0.4": {"pre": [-0.25, 0, 0], "post": [0, 0, 0]},
"1.4": {"pre": [0, 0, 0], "post": [-0.25, 0, 0]}
}
},
"eyelid_left": {
"position": {
"0.0": [0, 0, 0],
"0.32": {
"pre": [0, 0, 0],
"post": [0.1, 0, -0.1]
},
"1.4": {
"pre": [0.1, 0, -0.1],
"post": [0, 0, 0]
}
"0.32": {"pre": [0, 0, 0], "post": [0.1, 0, -0.1]},
"1.4": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]}
}
},
"hair2": {
@@ -7549,14 +7447,8 @@
},
"scale": {
"0.0": [1, 1, 1],
"0.24": {
"pre": [1, 1, 1],
"post": [0, 0, 0]
},
"2.12": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
}
"0.24": {"pre": [1, 1, 1], "post": [0, 0, 0]},
"2.12": {"pre": [0, 0, 0], "post": [1, 1, 1]}
}
},
"wing_closed_left1": {
@@ -7798,27 +7690,15 @@
"pupil_right": {
"position": {
"0.0": [-0.65, 0, 0],
"0.4": {
"pre": [-0.65, 0, 0],
"post": [0, 0, 0]
},
"1.4": {
"pre": [0, 0, 0],
"post": [-0.65, 0, 0]
}
"0.4": {"pre": [-0.65, 0, 0], "post": [0, 0, 0]},
"1.4": {"pre": [0, 0, 0], "post": [-0.65, 0, 0]}
}
},
"eyelid_right": {
"position": {
"0.0": [0, 0, 0],
"0.32": {
"pre": [0, 0, 0],
"post": [-0.1, 0, -0.1]
},
"1.4": {
"pre": [-0.1, 0, -0.1],
"post": [0, 0, 0]
}
"0.32": {"pre": [0, 0, 0], "post": [-0.1, 0, -0.1]},
"1.4": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]}
}
},
"head_angle": {
@@ -7830,53 +7710,29 @@
"eyes_ditto": {
"position": {
"0.0": [0, 0, 0],
"0.32": {
"pre": [0, 0, 0],
"post": [0, 0, 0.1]
},
"1.4": {
"pre": [0, 0, 0.1],
"post": [0, 0, 0]
}
"0.32": {"pre": [0, 0, 0], "post": [0, 0, 0.1]},
"1.4": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"eyes_blink_ditto": {
"position": {
"0.0": [0, 0, 0],
"0.32": {
"pre": [0, 0, 0],
"post": [0, 0, -0.1]
},
"1.4": {
"pre": [0, 0, -0.1],
"post": [0, 0, 0]
}
"0.32": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.4": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"mouth_ditto": {
"scale": {
"0.92": [1, 1, 1],
"1.32": {
"pre": [1, 1, 1],
"post": [0, 0, 0]
},
"2.04": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
}
"1.32": {"pre": [1, 1, 1], "post": [0, 0, 0]},
"2.04": {"pre": [0, 0, 0], "post": [1, 1, 1]}
}
},
"mouth_open_ditto": {
"position": {
"0.92": [0, 0, 0],
"1.32": {
"pre": [0, 0, 0],
"post": [0, 0, -0.1]
},
"2.04": {
"pre": [0, 0, -0.1],
"post": [0, 0, 0]
}
"1.32": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"2.04": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"seat_1": {
@@ -12932,43 +12788,19 @@
"mouth_ditto": {
"scale": {
"0.0": [1, 1, 1],
"0.4167": {
"pre": [1, 1, 1],
"post": [0, 0, 0]
},
"0.75": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
},
"0.8333": {
"pre": [1, 1, 1],
"post": [0, 0, 0]
},
"1.125": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
}
"0.4167": {"pre": [1, 1, 1], "post": [0, 0, 0]},
"0.75": {"pre": [0, 0, 0], "post": [1, 1, 1]},
"0.8333": {"pre": [1, 1, 1], "post": [0, 0, 0]},
"1.125": {"pre": [0, 0, 0], "post": [1, 1, 1]}
}
},
"mouth_open_ditto": {
"position": {
"0.0": [0, 0, 0],
"0.4167": {
"pre": [0, 0, 0],
"post": [0, 0, -0.1]
},
"0.75": {
"pre": [0, 0, -0.1],
"post": [0, 0, 0]
},
"0.8333": {
"pre": [0, 0, 0],
"post": [0, 0, -0.1]
},
"1.125": {
"pre": [0, 0, -0.1],
"post": [0, 0, 0]
}
"0.4167": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"0.75": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"0.8333": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.125": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
}
},
@@ -13072,10 +12904,7 @@
"eyelid_left": {
"position": {
"0.0": [0.1, 0, -0.1],
"0.2083": {
"pre": [0.1, 0, -0.1],
"post": [0, 0, 0]
}
"0.2083": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]}
}
},
"jaw": {
@@ -13356,10 +13185,7 @@
"eyelid_right": {
"position": {
"0.0": [-0.1, 0, -0.1],
"0.2083": {
"pre": [-0.1, 0, -0.1],
"post": [0, 0, 0]
}
"0.2083": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]}
}
},
"wings": {
@@ -13385,19 +13211,13 @@
"eyes_ditto": {
"position": {
"0.0": [0, 0, 0.1],
"0.2083": {
"pre": [0, 0, 0.1],
"post": [0, 0, 0]
}
"0.2083": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"eyes_blink_ditto": {
"position": {
"0.0": [0, 0, -0.1],
"0.2083": {
"pre": [0, 0, -0.1],
"post": [0, 0, 0]
}
"0.2083": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
}
}
@@ -13408,37 +13228,25 @@
"eyelid_left": {
"position": {
"0.0": [0.1, 0, -0.1],
"0.2083": {
"pre": [0.1, 0, -0.1],
"post": [0, 0, 0]
}
"0.2083": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]}
}
},
"eyelid_right": {
"position": {
"0.0": [-0.1, 0, -0.1],
"0.2083": {
"pre": [-0.1, 0, -0.1],
"post": [0, 0, 0]
}
"0.2083": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]}
}
},
"eyes_ditto": {
"position": {
"0.0": [0, 0, 0.1],
"0.2083": {
"pre": [0, 0, 0.1],
"post": [0, 0, 0]
}
"0.2083": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"eyes_blink_ditto": {
"position": {
"0.0": [0, 0, -0.1],
"0.2083": {
"pre": [0, 0, -0.1],
"post": [0, 0, 0]
}
"0.2083": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
}
}
@@ -162,7 +162,7 @@
},
"animation.chinchou.ground_walk": {
"loop": true,
"animation_length": 0.7917,
"animation_length": 0.79167,
"bones": {
"stem_left": {
"rotation": ["73.8265-0.5*math.sin(q.anim_time*90*10-30)*1", "-21.6937-3*math.sin(q.anim_time*90*5-150)*1", 6.1191]
@@ -2294,7 +2294,7 @@
}
},
"animation.chinchou.water_idle_quirk": {
"animation_length": 3.7917,
"animation_length": 3.79167,
"bones": {
"body": {
"rotation": {
@@ -2754,7 +2754,7 @@
}
},
"animation.chinchou.blink": {
"animation_length": 0.1667,
"animation_length": 0.16667,
"bones": {
"eyelid_left": {
"position": {
@@ -2879,10 +2879,29 @@
"1.25": [0, 0, 0]
}
}
},
"sound_effects": {
"0.0833": {
"effect": "pokemon.chinchou.cry"
}
},
"animation.chinchou.ground_walk speed test": {
"loop": true,
"bones": {
"chinchou": {
"position": [0, 0, "-q.anim_time*90*0.12"]
}
}
},
"animation.chinchou.ground_run speed test": {
"loop": true,
"bones": {
"chinchou": {
"position": [0, 0, "-q.anim_time*90*0.2"]
}
}
},
"animation.chinchou.water_swim speed test": {
"loop": true,
"bones": {
"chinchou": {
"position": [0, 0, "-q.anim_time*90*0.2"]
}
}
}
@@ -3,7 +3,7 @@
"animations": {
"animation.metagross.ground_idle": {
"loop": true,
"animation_length": 8,
"animation_length": 0,
"bones": {
"body2": {
"position": [0, -11.9, 0]
@@ -54,7 +54,8 @@
},
"torso": {
"rotation": {
"0.0": ["2+1*math.sin(q.anim_time*90*0.5)", "0.1*math.sin(q.anim_time*90*1-60)", "0.1*math.sin(q.anim_time*90*2-60)"]
"0.0": ["2+1*math.sin(q.anim_time*90*0.5)", "0.1*math.sin(q.anim_time*90*1-60)", "0.1*math.sin(q.anim_time*90*2-60)"],
"11.4167": ["2.5796+1*math.sin(q.anim_time*90*0.5)", "0.3148+0.1*math.sin(q.anim_time*90*1-60)", "2.4153+0.1*math.sin(q.anim_time*90*2-60)"]
},
"position": [0, "0.2*math.sin(q.anim_time*90*0.5-60)", 0]
}
@@ -74,19 +74,14 @@
"name": "neck",
"parent": "torso2",
"pivot": [0, 5.25, -7.5],
"rotation": [52.5, 0, 0]
},
{
"name": "neck_ai",
"parent": "neck",
"pivot": [0, 5.25, -7.5],
"rotation": [52.5, 0, 0],
"cubes": [
{"origin": [-2.5, 4.75, -9], "size": [5, 5, 5], "inflate": -0.01, "uv": [22, 32]}
]
},
{
"name": "head",
"parent": "neck_ai",
"parent": "neck",
"pivot": [0, 10, -6.5]
},
{
@@ -26,9 +26,9 @@
{
"name": "locator_root",
"parent": "pidgeot",
"pivot": [0, 0, 0],
"pivot": [0, 32, 0],
"locators": {
"root": [0, 0, 0]
"root": [0, 32, 0]
}
},
{
@@ -69,9 +69,9 @@
{
"name": "locator_seat_1",
"parent": "torso",
"pivot": [0, 22, 2],
"pivot": [0, 25, 2],
"locators": {
"seat_1": [0, 22, 2]
"seat_1": [0, 25, 2]
}
},
{
@@ -119,8 +119,8 @@
"cubes": [
{"origin": [19, 50, 0], "size": [2, 2, 2], "inflate": 0.01, "uv": [0, 45]},
{"origin": [21, 49.5, -0.5], "size": [8, 3, 3], "inflate": 0.01, "uv": [8, 45]},
{"origin": [-21, 50, 0], "size": [2, 2, 2], "inflate": 0.01, "uv": [0, 49], "mirror": true},
{"origin": [-29, 49.5, -0.5], "size": [8, 3, 3], "inflate": 0.01, "uv": [8, 51], "mirror": true},
{"origin": [-21, 50, 0], "size": [2, 2, 2], "inflate": 0.01, "pivot": [0, 51, 3.5], "rotation": [0, 0, 0], "uv": [0, 49], "mirror": true},
{"origin": [-29, 49.5, -0.5], "size": [8, 3, 3], "inflate": 0.01, "pivot": [0, 51, 3], "rotation": [0, 0, 0], "uv": [8, 51], "mirror": true},
{"origin": [18, 50, 0], "size": [2, 2, 2], "inflate": 0.01, "pivot": [0, 51, 3], "rotation": [0, 0, -55], "uv": [0, 53]},
{"origin": [-20, 50, 0], "size": [2, 2, 2], "inflate": 0.01, "pivot": [0, 51, 3.5], "rotation": [0, 0, 55], "uv": [30, 43], "mirror": true},
{"origin": [-28, 49.5, -0.5], "size": [8, 3, 3], "inflate": 0.01, "pivot": [0, 51, 3], "rotation": [0, 0, 55], "uv": [58, 46], "mirror": true},
@@ -447,6 +447,14 @@
"cubes": [
{"origin": [0, -24.5, -8], "size": [0, 12, 7], "uv": [98, 109]}
]
},
{
"name": "locator_seat_1",
"parent": "body",
"pivot": [0, 54, -10],
"locators": {
"seat_1": [0, 54, -10]
}
}
]
}
@@ -12,8 +12,7 @@
"standing": {
"poseTypes": ["PORTRAIT", "PROFILE", "STAND", "NONE"],
"animations": [
"q.look('neck', 1, 1, 35, -12.5, 7.5, -7.5)",
"q.look('head_ai', 1, 1, 1.5, -12.5, 2.5, -2.5)",
"q.look('head_ai')",
"q.bedrock('pidgey', 'ground_idle')"
],
"transformedParts": [
@@ -42,8 +41,7 @@
"walk": {
"poseTypes": ["WALK"],
"animations": [
"q.look('neck', 1, 1, 35, -12.5, 7.5, -7.5)",
"q.look('head_ai', 1, 1, 1.5, -12.5, 2.5, -2.5)",
"q.look('head_ai')",
"q.bedrock('pidgey', 'ground_walk')"
],
"transformedParts": [
@@ -72,8 +70,7 @@
"poseTypes": ["HOVER", "FLOAT"],
"animations": [
"q.pitch_tilt('body')",
"q.look('neck', 1, 1, 35, -12.5, 7.5, -7.5)",
"q.look('head_ai', 1, 1, 1.5, -12.5, 2.5, -2.5)",
"q.look('head_ai')",
"q.bedrock('pidgey', 'air_idle')"
],
"transformedParts": [
@@ -185,8 +182,7 @@
"shoulder_left": {
"poseTypes": ["SHOULDER_LEFT"],
"animations": [
"q.look('neck', 1, 1, 35, -12.5, 7.5, -7.5)",
"q.look('head_ai', 1, 1, 1.5, -12.5, 2.5, -2.5)",
"q.look('head_ai')",
"q.bedrock('pidgey', 'shoulder_left')"],
"quirks": ["q.bedrock_quirk('pidgey', 'blink')"],
"transformedParts": [
@@ -215,8 +211,7 @@
"shoulder_right": {
"poseTypes": ["SHOULDER_RIGHT"],
"animations": [
"q.look('neck', 1, 1, 35, -12.5, 7.5, -7.5)",
"q.look('head_ai', 1, 1, 1.5, -12.5, 2.5, -2.5)",
"q.look('head_ai')",
"q.bedrock('pidgey', 'shoulder_right')"],
"quirks": ["q.bedrock_quirk('pidgey', 'blink')"],
"transformedParts": [
@@ -18,10 +18,27 @@
"standing": {
"poseTypes": ["PORTRAIT", "PROFILE", "STAND", "NONE"],
"animations": [
"q.look('neck_ai', 1, 1, 30, -20, 7.5, -7.5)",
"q.look('head_ai', 1, 1, 3.5, -7.5, 1.5, -1.5)",
"q.look('head_ai')",
"q.bedrock('pidgeotto', 'ground_idle')"
],
"transformedParts": [
{
"part": "wing_open_left",
"isVisible": false
},
{
"part": "wing_open_right",
"isVisible": false
},
{
"part": "wing_closed_left",
"isVisible": true
},
{
"part": "wing_closed_right",
"isVisible": true
}
],
"quirks": [
"q.bedrock_quirk('pidgeotto', 'blink')",
"q.bedrock_primary_quirk('pidgeotto', 'ground_quirk', 10, 30, 1, q.curve('symmetrical'))"
@@ -30,8 +47,7 @@
"walk": {
"poseTypes": ["WALK"],
"animations": [
"q.look('neck_ai', 1, 1, 30, -20, 7.5, -7.5)",
"q.look('head_ai', 1, 1, 3.5, -7.5, 1.5, -1.5)",
"q.look('head_ai')",
"q.bedrock('pidgeotto', 'ground_walk')"
],
"transformedParts": [
@@ -60,8 +76,7 @@
"poseTypes": ["HOVER", "FLOAT"],
"animations": [
"q.pitch_tilt('body')",
"q.look('neck_ai', 1, 1, 30, -20, 7.5, -7.5)",
"q.look('head_ai', 1, 1, 3.5, -7.5, 1.5, -1.5)",
"q.look('head_ai')",
"q.bedrock('pidgeotto', 'air_idle')"
],
"transformedParts": [
@@ -24,9 +24,8 @@
"isBattle": false,
"condition": "!q.is_ridden",
"animations": [
"q.look('neck2', 1, 1, 12.5, -15, 10, -10)",
"q.look('head_ai', 1, 1, 1, -7.5, 2.5, -2.5)",
"q.look('hair3', -1, 1, 10, -20, 0, 0)",
"q.look('head_ai')",
"q.look('hair3', -1, 1, 30, -60, 0, 0)",
"q.bedrock('pidgeot', 'ground_idle')"
],
"transformedParts": [
@@ -55,14 +54,31 @@
"poseTypes": ["STAND"],
"isBattle": true,
"animations": [
"q.look('neck2', 1, 1, 12.5, -15, 10, -10)",
"q.look('head_ai', 1, 1, 1, -7.5, 2.5, -2.5)",
"q.look('hair3', -1, 1, 10, -20, 0, 0)",
"q.look('head_ai')",
"q.look('hair3', -1, 1, 30, -60, 0, 0)",
"q.bedrock('pidgeot', 'battle_idle')"
],
"namedAnimations": {
"cry": "q.bedrock_primary('pidgeot', 'battle_cry', q.curve('symmetrical_wide'))"
},
"transformedParts": [
{
"part": "wing_open_left",
"isVisible": false
},
{
"part": "wing_open_right",
"isVisible": false
},
{
"part": "wing_closed_left",
"isVisible": true
},
{
"part": "wing_closed_right",
"isVisible": true
}
],
"quirks": [
"q.bedrock_quirk('pidgeot', 'blink')"
]
@@ -71,9 +87,8 @@
"poseTypes": ["WALK"],
"condition": "!q.is_ridden",
"animations": [
"q.look('neck2', 1, 1, 12.5, -15, 10, -10)",
"q.look('head_ai', 1, 1, 1, -7.5, 2.5, -2.5)",
"q.look('hair3', -1, 1, 10, -20, 0, 0)",
"q.look('head_ai')",
"q.look('hair3', -1, 1, 30, -60, 0, 0)",
"q.bedrock('pidgeot', 'ground_walk')"
],
"transformedParts": [
@@ -103,9 +118,8 @@
"condition": "!q.is_ridden",
"animations": [
"q.pitch_tilt('body')",
"q.look('neck2', 1, 1, 12.5, -15, 10, -10)",
"q.look('head_ai', 1, 1, 1, -7.5, 2.5, -2.5)",
"q.look('hair3', -1, 1, 10, -20, 0, 0)",
"q.look('head_ai')",
"q.look('hair3', -1, 1, 30, -60, 0, 0)",
"q.bedrock('pidgeot', 'air_idle')"
],
"transformedParts": [
@@ -249,9 +263,8 @@
"poseTypes": ["STAND"],
"isBattle": false,
"animations": [
"q.look('neck2', 1, 1, 12.5, -15, 10, -10)",
"q.look('head_ai', 1, 1, 1, -7.5, 2.5, -2.5)",
"q.look('hair3', -1, 1, 10, -20, 0, 0)",
"q.look('head_ai')",
"q.look('hair3', -1, 1, 30, -60, 0, 0)",
"q.bedrock('pidgeot', 'mount_ground_idle')"
],
"condition": "q.has_entity && q.is_ridden && !q.in_air",
@@ -280,9 +293,8 @@
"isBattle": false,
"condition": "q.is_ridden && !q.is_air && q.has_entity",
"animations": [
"q.look('neck2', 1, 1, 12.5, -15, 10, -10)",
"q.look('head_ai', 1, 1, 1, -7.5, 2.5, -2.5)",
"q.look('hair3', -1, 1, 10, -20, 0, 0)",
"q.look('head_ai')",
"q.look('hair3', -1, 1, 30, -60, 0, 0)",
"q.bedrock('pidgeot', 'ride_ground_walk')",
"q.bedrock('pidgeot', 'mount_ground_walk')"
],
@@ -310,9 +322,8 @@
"poseTypes": ["HOVER"],
"condition": "!q.is_gliding && q.is_ridden && q.has_entity",
"animations": [
"q.look('neck2', 1, 1, 12.5, -15, 10, -10)",
"q.look('head_ai', 1, 1, 1, -7.5, 2.5, -2.5)",
"q.look('hair3', -1, 1, 10, -20, 0, 0)",
"q.look('head_ai')",
"q.look('hair3', -1, 1, 30, -60, 0, 0)",
"q.bedrock('pidgeot', 'ride_air_idle')",
"q.bedrock('pidgeot', 'mount_air_idle')"
],
@@ -342,9 +353,8 @@
"poseTypes": ["FLY"],
"condition": "!q.is_gliding && q.is_ridden && q.has_entity",
"animations": [
"q.look('neck2', 1, 1, 12.5, -15, 10, -10)",
"q.look('head_ai', 1, 1, 1, -7.5, 2.5, -2.5)",
"q.look('hair3', -1, 1, 10, -20, 0, 0)",
"q.look('head_ai')",
"q.look('hair3', -1, 1, 30, -60, 0, 0)",
"q.bedrock('pidgeot', 'ride_air_fly')",
"q.bedrock('pidgeot', 'mount_air_fly')"
],
@@ -375,9 +385,8 @@
"condition": "q.is_gliding",
"isBattle": false,
"animations": [
"q.look('neck2', 1, 1, 12.5, -15, 10, -10)",
"q.look('head_ai', 1, 1, 1, -7.5, 2.5, -2.5)",
"q.look('hair3', -1, 1, 10, -20, 0, 0)",
"q.look('head_ai')",
"q.look('hair3', -1, 1, 30, -60, 0, 0)",
"q.bedrock('pidgeot', 'air_glide')",
{
"condition": "q.is_ridden",
@@ -24,8 +24,7 @@
"poseTypes": ["STAND"],
"isBattle": true,
"animations": [
"q.look('neck', 1, 1, 25, -20, 20, -20)",
"q.look('head', 1, 1, 22.5, -10, 15, -15)",
"q.look('head_ai')",
"q.bedrock('aerodactyl', 'battle_idle')"
],
"quirks": [
@@ -39,8 +38,7 @@
"poseTypes": ["HOVER"],
"isBattle": true,
"animations": [
"q.look('neck', 1, 1, 25, -20, 20, -20)",
"q.look('head', 1, 1, 22.5, -10, 15, -15)",
"q.look('head_ai')",
"q.bedrock('aerodactyl', 'battle_air_idle')"
],
"quirks": [
@@ -55,8 +53,7 @@
"condition": "q.has_entity ? !q.in_air : 1.0",
"isBattle": false,
"animations": [
"q.look('neck', 1, 1, 25, -20, 20, -20)",
"q.look('head', 1, 1, 22.5, -10, 15, -15)",
"q.look('head_ai')",
"q.bedrock('aerodactyl', 'ground_idle')",
{
"condition": "q.is_ridden",
@@ -80,8 +77,7 @@
"poseTypes": ["WALK", "SWIM"],
"condition": "q.has_entity ? !q.in_air && !q.is_sprinting : 1.0",
"animations": [
"q.look('neck', 1, 1, 25, -20, 20, -20)",
"q.look('head', 1, 1, 22.5, -10, 15, -15)",
"q.look('head_ai')",
"q.bedrock('aerodactyl', 'ground_walk')",
{
"condition": "q.is_ridden",
@@ -94,8 +90,7 @@
"poseTypes": ["WALK", "SWIM"],
"condition": "q.has_entity ? !q.in_air && q.is_sprinting : 0.0",
"animations": [
"q.look('neck', 1, 1, 25, -20, 20, -20)",
"q.look('head', 1, 1, 22.5, -10, 15, -15)",
"q.look('head_ai')",
"q.bedrock('aerodactyl', 'ground_run')",
{
"condition": "q.is_ridden",
@@ -111,8 +106,7 @@
"isBattle": false,
"condition": "!q.is_ridden",
"animations": [
"q.look('neck', 1, 1, 25, -20, 20, -20)",
"q.look('head', 1, 1, 22.5, -10, 15, -15)",
"q.look('head_ai')",
"q.bedrock('aerodactyl', 'air_idle')"
],
"quirks": [
@@ -124,8 +118,7 @@
"isBattle": false,
"condition": "q.is_ridden",
"animations": [
"q.look('neck', 1, 1, 25, -20, 20, -20)",
"q.look('head', 1, 1, 22.5, -10, 15, -15)",
"q.look('head_ai')",
"q.bedrock('aerodactyl', 'air_idle')"
],
"quirks": [
@@ -138,8 +131,7 @@
"isBattle": false,
"condition": "!q.is_gliding && !q.is_ridden",
"animations": [
"q.look('neck', 1, 1, 25, -20, 20, -20)",
"q.look('head', 1, 1, 22.5, -10, 15, -15)",
"q.look('head_ai')",
"q.bedrock('aerodactyl', 'air_fly')"
],
"quirks": [
@@ -151,8 +143,7 @@
"isBattle": false,
"condition": "!q.is_gliding && q.is_ridden",
"animations": [
"q.look('neck', 1, 1, 25, -20, 20, -20)",
"q.look('head', 1, 1, 22.5, -10, 15, -15)",
"q.look('head_ai')",
"q.bedrock('aerodactyl', 'air_fly')",
"q.bedrock('aerodactyl', 'ride_air_fly')"
],
@@ -166,8 +157,7 @@
"isBattle": false,
"condition": "q.is_gliding",
"animations": [
"q.look('neck', 1, 1, 25, -20, 20, -20)",
"q.look('head', 1, 1, 22.5, -10, 15, -15)",
"q.look('head_ai')",
"q.bedrock('aerodactyl', 'air_glide')",
"q.bedrock('aerodactyl', 'air_dive')",
{
@@ -1,88 +0,0 @@
{
"portraitScale": 1.75,
"portraitTranslation": [-0.3, -0.8, 0],
"profileScale": 0.65,
"profileTranslation": [-0.05, 0.45, 0],
"rootBone": "chinchou",
"animations": {
"cry": "q.bedrock_stateful('chinchou', 'cry')"
},
"poses": {
"portrait": {
"poseTypes": ["PORTRAIT", "PROFILE"],
"animations": ["q.bedrock('chinchou', 'water_idle')"]
},
"battle-standing": {
"poseTypes": ["STAND"],
"isBattle": true,
"animations": ["q.bedrock('chinchou', 'battle_idle')"],
"quirks": [
"q.bedrock_quirk('chinchou', 'blink')"
]
},
"water-battle-standing": {
"poseTypes": ["FLOAT"],
"isBattle": true,
"animations": ["q.bedrock('chinchou', 'water_battle_idle')"],
"namedAnimations": {
"faint": "q.bedrock('chinchou', 'water_faint', q.curve('one'))"
},
"quirks": [
"q.bedrock_quirk('chinchou', 'blink')"
]
},
"standing": {
"poseTypes": ["STAND", "NONE"],
"isTouchingWater": false,
"animations": ["q.bedrock('chinchou', 'ground_idle')"],
"quirks": [
"q.bedrock_quirk('chinchou', 'blink')",
"q.bedrock_quirk('chinchou', 'ground_quirk')"
]
},
"walking": {
"poseTypes": ["WALK"],
"isTouchingWater": false,
"animations": ["q.bedrock('chinchou', 'water_swim')"],
"quirks": [
"q.bedrock_quirk('chinchou', 'blink')"
]
},
"floating": {
"poseTypes": ["FLOAT"],
"isTouchingWater": true,
"isUnderWater": true,
"animations": ["q.bedrock('chinchou', 'water_idle')"],
"quirks": [
"q.bedrock_quirk('chinchou', 'blink')",
"q.bedrock_quirk('chinchou', 'water_idle_quirk')"
]
},
"swimming": {
"poseTypes": ["SWIM"],
"isTouchingWater": true,
"isUnderWater": true,
"animations": ["q.bedrock('chinchou', 'water_swim')"],
"quirks": [
"q.bedrock_quirk('chinchou', 'blink')"
]
},
"water-sleeping": {
"poseTypes": ["SLEEP"],
"isTouchingWater": true,
"namedAnimations": {
"cry": "q.bedrock_stateful('dummy', 'cry')"
},
"animations": ["q.bedrock('chinchou', 'water_sleep')"]
},
"sleeping": {
"poseTypes": ["SLEEP"],
"isTouchingWater": false,
"namedAnimations": {
"cry": "q.bedrock_stateful('dummy', 'cry')"
},
"animations": ["q.bedrock('chinchou', 'sleep')"]
}
}
}
@@ -26,17 +26,15 @@
"battle-standing": {
"poseTypes": ["STAND"],
"isBattle": true,
"isTouchingWater": false,
"animations": ["q.bedrock('lanturn', 'ground_battle_idle')"],
"animations": ["q.bedrock('lanturn', 'battle_idle')"],
"quirks": ["q.bedrock_quirk('lanturn', 'blink')"]
},
"water-battle-standing": {
"poseTypes": ["FLOAT"],
"isBattle": true,
"isTouchingWater": true,
"animations": ["q.bedrock('lanturn', 'water_battle_idle')"],
"namedAnimations": {
"faint": "q.bedrock('lanturn', 'water_faint', q.curve('one'))"
"sleep": "q.bedrock('lanturn', 'water_faint', q.curve('one'))"
},
"quirks": ["q.bedrock_quirk('lanturn', 'blink')"]
},
@@ -44,49 +42,42 @@
"poseTypes": ["STAND", "WALK"],
"condition": "q.in_air",
"animations": ["q.bedrock('lanturn', 'water_swim')"],
"quirks": ["q.bedrock_quirk('lanturn', 'blink')"],
"transformTicks": 3,
"transformToTicks": 3
},
"standing": {
"poseTypes": ["STAND", "NONE"],
"isTouchingWater": false,
"animations": ["q.bedrock('lanturn', 'water_idle')"],
"quirks": ["q.bedrock_quirk('lanturn', 'blink')"]
"animations": ["q.bedrock('lanturn', 'water_idle')"]
},
"walking": {
"poseTypes": ["WALK"],
"isTouchingWater": false,
"animations": ["q.bedrock('lanturn', 'water_swim')"],
"quirks": ["q.bedrock_quirk('lanturn', 'blink')"]
"animations": ["q.bedrock('lanturn', 'water_swim')"]
},
"surface-floating": {
"poseTypes": ["STAND"],
"isTouchingWater": true,
"isUnderWater": false,
"animations": ["q.bedrock('lanturn', 'water_idle')"],
"quirks": ["q.bedrock_quirk('lanturn', 'blink')"]
"animations": ["q.bedrock('lanturn', 'water_idle')"]
},
"surface-swimming": {
"poseTypes": ["WALK"],
"isTouchingWater": true,
"isUnderWater": false,
"animations": ["q.bedrock('lanturn', 'water_swim')"],
"quirks": ["q.bedrock_quirk('lanturn', 'blink')"]
"animations": ["q.bedrock('lanturn', 'water_swim')"]
},
"floating": {
"poseTypes": ["FLOAT"],
"isTouchingWater": true,
"isUnderWater": true,
"animations": ["q.bedrock('lanturn', 'water_idle')"],
"quirks": ["q.bedrock_quirk('lanturn', 'blink')"]
"animations": ["q.bedrock('lanturn', 'water_idle')"]
},
"swimming": {
"poseTypes": ["SWIM"],
"isTouchingWater": true,
"isUnderWater": true,
"animations": ["q.bedrock('lanturn', 'water_swim')"],
"quirks": ["q.bedrock_quirk('lanturn', 'blink')"]
"animations": ["q.bedrock('lanturn', 'water_swim')"]
},
"water-sleeping": {
"poseTypes": ["SLEEP"],
@@ -17,7 +17,7 @@
"poseTypes": ["STAND"],
"isBattle": true,
"namedAnimations": {
"cry": "q.bedrock_primary('smeargle', 'battle_cry', q.curve('symmetrical_wide'))"
"cry": "q.bedrock_primary('smeargle', 'battle_cry')"
},
"animations": ["q.look('head')", "q.bedrock('smeargle', 'battle_idle')"],
"quirks": ["q.bedrock_quirk('smeargle', 'blink')"]
@@ -10,6 +10,7 @@
"poses": {
"standing": {
"poseTypes": ["STAND", "NONE", "PORTRAIT", "PROFILE"],
"isBattle": false,
"animations": ["q.look('head_ai')", "q.bedrock('snivy', 'ground_idle')"],
"quirks": ["q.bedrock_quirk('snivy', 'blink')"]
},
@@ -10,6 +10,7 @@
"poses": {
"standing": {
"poseTypes": ["STAND", "NONE", "PORTRAIT", "PROFILE"],
"isBattle": true,
"animations": ["q.bedrock('dewpider', 'ground_idle')"]
},
"walking": {
@@ -10,6 +10,7 @@
"poses": {
"standing": {
"poseTypes": ["STAND", "NONE", "PORTRAIT", "PROFILE"],
"isBattle": true,
"animations": ["q.bedrock('araquanid', 'ground_idle')"]
},
"walking": {
@@ -6,7 +6,6 @@
"rootBone": "tadbulb",
"animations": {
"faint": "q.bedrock_primary('tadbulb', 'faint', q.curve('one'))",
"cry": "q.bedrock_stateful('tadbulb', 'cry')",
"recoil": "q.bedrock_stateful('tadbulb', 'recoil')",
"physical": "q.bedrock_primary('tadbulb', 'physical', q.curve('symmetrical_wide'))",
"special": "q.bedrock_primary('tadbulb', 'special', q.curve('symmetrical'))",
@@ -6,7 +6,6 @@
"rootBone": "bellibolt",
"animations": {
"faint": "q.bedrock_primary('bellibolt', 'faint', q.curve('one'))",
"cry": "q.bedrock_stateful('bellibolt', 'cry')",
"recoil": "q.bedrock_stateful('bellibolt', 'recoil')",
"physical": "q.bedrock_primary('bellibolt', 'physical', q.curve('symmetrical_wide'))",
"special": "q.bedrock_primary('bellibolt', 'special', q.curve('symmetrical_wide'))",
@@ -14,18 +14,6 @@
"shiny"
],
"texture": "cobblemon:textures/pokemon/0475_gallade/gallade_shiny.png"
},
{
"aspects": [
"alpha_eyes"
],
"layers": [
{
"name": "alpha_eyes",
"texture": "cobblemon:textures/pokemon/0475_gallade/gallade_alpha.png",
"emissive": true
}
]
}
]
}
@@ -27,18 +27,6 @@
"texture": "cobblemon:textures/pokemon/0486_regigigas/regigigas_emissive.png"
}
]
},
{
"aspects": [
"alpha_eyes"
],
"layers": [
{
"name": "alpha_eyes",
"texture": "cobblemon:textures/pokemon/0486_regigigas/regigigas_alpha.png",
"emissive": true
}
]
}
]
}
@@ -16,8 +16,7 @@
{
"name": "translucent",
"texture": "cobblemon:textures/pokemon/0751_dewpider/dewpider_translucent.png",
"translucent": true,
"translucent_cull": true
"translucent": true
}
]
},
@@ -16,8 +16,7 @@
{
"name": "translucent",
"texture": "cobblemon:textures/pokemon/0752_araquanid/araquanid_translucent.png",
"translucent": true,
"translucent_cull": true
"translucent": true
}
]
},
@@ -977,176 +977,6 @@
{ "name": "cobblemon:block/item_block/paper_large_break_3", "volume": 0.6 }
]
},
"block.bright_powder.use": {
"subtitle": "cobblemon.subtitle.item.bright_powder.use",
"sounds": [
{ "name": "cobblemon:block/bright_powder/bright_powder_use_1", "volume": 0.35 },
{ "name": "cobblemon:block/bright_powder/bright_powder_use_2", "volume": 0.35 },
{ "name": "cobblemon:block/bright_powder/bright_powder_use_3", "volume": 0.35 }
]
},
"block.item_block.bottle_liquid.place": {
"subtitle": "subtitles.block.generic.place",
"sounds": [
{ "name": "cobblemon:block/item_block/bottle_liquid_place_1", "volume": 0.4 },
{ "name": "cobblemon:block/item_block/bottle_liquid_place_2", "volume": 0.4 },
{ "name": "cobblemon:block/item_block/bottle_liquid_place_3", "volume": 0.4 },
{ "name": "cobblemon:block/item_block/bottle_liquid_place_4", "volume": 0.4 }
]
},
"block.item_block.bottle_liquid.break": {
"subtitle": "subtitles.block.generic.break",
"sounds": [
{ "name": "cobblemon:block/item_block/bottle_liquid_break_1", "volume": 0.5 },
{ "name": "cobblemon:block/item_block/bottle_liquid_break_2", "volume": 0.5 },
{ "name": "cobblemon:block/item_block/bottle_liquid_break_3", "volume": 0.5 },
{ "name": "cobblemon:block/item_block/bottle_liquid_break_4", "volume": 0.5 }
]
},
"block.item_block.bottle_liquid.step": {
"subtitle": "subtitles.block.generic.footsteps",
"sounds": [
{ "name": "cobblemon:block/item_block/bottle_liquid_step_1", "volume": 0.2 },
{ "name": "cobblemon:block/item_block/bottle_liquid_step_2", "volume": 0.2 },
{ "name": "cobblemon:block/item_block/bottle_liquid_step_3", "volume": 0.2 },
{ "name": "cobblemon:block/item_block/bottle_liquid_step_4", "volume": 0.2 }
]
},
"block.item_block.bottle_pills.place": {
"subtitle": "subtitles.block.generic.place",
"sounds": [
{ "name": "cobblemon:block/item_block/bottle_pills_place_1", "volume": 0.4 },
{ "name": "cobblemon:block/item_block/bottle_pills_place_2", "volume": 0.4 },
{ "name": "cobblemon:block/item_block/bottle_pills_place_3", "volume": 0.4 },
{ "name": "cobblemon:block/item_block/bottle_pills_place_4", "volume": 0.4 }
]
},
"block.item_block.bottle_pills.break": {
"subtitle": "subtitles.block.generic.break",
"sounds": [
{ "name": "cobblemon:block/item_block/bottle_pills_break_1", "volume": 0.5 },
{ "name": "cobblemon:block/item_block/bottle_pills_break_2", "volume": 0.5 },
{ "name": "cobblemon:block/item_block/bottle_pills_break_3", "volume": 0.5 },
{ "name": "cobblemon:block/item_block/bottle_pills_break_4", "volume": 0.5 }
]
},
"block.item_block.bottle_pills.step": {
"subtitle": "subtitles.block.generic.footsteps",
"sounds": [
{ "name": "cobblemon:block/item_block/bottle_pills_step_1", "volume": 0.2 },
{ "name": "cobblemon:block/item_block/bottle_pills_step_2", "volume": 0.2 },
{ "name": "cobblemon:block/item_block/bottle_pills_step_3", "volume": 0.2 },
{ "name": "cobblemon:block/item_block/bottle_pills_step_4", "volume": 0.2 }
]
},
"block.item_block.powder.place": {
"subtitle": "subtitles.block.generic.place",
"sounds": [
{ "name": "cobblemon:block/item_block/powder_place_1", "volume": 0.3 },
{ "name": "cobblemon:block/item_block/powder_place_2", "volume": 0.3 },
{ "name": "cobblemon:block/item_block/powder_place_3", "volume": 0.3 },
{ "name": "cobblemon:block/item_block/powder_place_4", "volume": 0.3 }
]
},
"block.item_block.powder.break": {
"subtitle": "subtitles.block.generic.break",
"sounds": [
{ "name": "cobblemon:block/item_block/powder_break_1", "volume": 0.4 },
{ "name": "cobblemon:block/item_block/powder_break_2", "volume": 0.4 },
{ "name": "cobblemon:block/item_block/powder_break_3", "volume": 0.4 },
{ "name": "cobblemon:block/item_block/powder_break_4", "volume": 0.4 }
]
},
"block.item_block.powder.step": {
"subtitle": "subtitles.block.generic.footsteps",
"sounds": [
{ "name": "cobblemon:block/item_block/powder_step_1", "volume": 0.2 },
{ "name": "cobblemon:block/item_block/powder_step_2", "volume": 0.2 },
{ "name": "cobblemon:block/item_block/powder_step_3", "volume": 0.2 },
{ "name": "cobblemon:block/item_block/powder_step_4", "volume": 0.2 }
]
},
"block.item_block.dice.place": {
"subtitle": "subtitles.block.generic.place",
"sounds": [
{ "name": "cobblemon:block/item_block/dice_place_1", "volume": 0.3 },
{ "name": "cobblemon:block/item_block/dice_place_2", "volume": 0.3 },
{ "name": "cobblemon:block/item_block/dice_place_3", "volume": 0.3 },
{ "name": "cobblemon:block/item_block/dice_place_4", "volume": 0.3 }
]
},
"block.item_block.dice.break": {
"subtitle": "subtitles.block.generic.break",
"sounds": [
{ "name": "cobblemon:block/item_block/dice_break_1", "volume": 0.4 },
{ "name": "cobblemon:block/item_block/dice_break_2", "volume": 0.4 },
{ "name": "cobblemon:block/item_block/dice_break_3", "volume": 0.4 },
{ "name": "cobblemon:block/item_block/dice_break_4", "volume": 0.4 }
]
},
"block.item_block.dice.step": {
"subtitle": "subtitles.block.generic.footsteps",
"sounds": [
{ "name": "cobblemon:block/item_block/dice_step_1", "volume": 0.2 },
{ "name": "cobblemon:block/item_block/dice_step_2", "volume": 0.2 },
{ "name": "cobblemon:block/item_block/dice_step_3", "volume": 0.2 },
{ "name": "cobblemon:block/item_block/dice_step_4", "volume": 0.2 }
]
},
"block.item_block.metal_can.place": {
"subtitle": "subtitles.block.generic.place",
"sounds": [
{ "name": "cobblemon:block/item_block/metal_can_place_1", "volume": 0.3 },
{ "name": "cobblemon:block/item_block/metal_can_place_2", "volume": 0.3 },
{ "name": "cobblemon:block/item_block/metal_can_place_3", "volume": 0.3 },
{ "name": "cobblemon:block/item_block/metal_can_place_4", "volume": 0.3 }
]
},
"block.item_block.metal_can.break": {
"subtitle": "subtitles.block.generic.break",
"sounds": [
{ "name": "cobblemon:block/item_block/metal_can_break_1", "volume": 0.4 },
{ "name": "cobblemon:block/item_block/metal_can_break_2", "volume": 0.4 },
{ "name": "cobblemon:block/item_block/metal_can_break_3", "volume": 0.4 },
{ "name": "cobblemon:block/item_block/metal_can_break_4", "volume": 0.4 }
]
},
"block.item_block.metal_can.step": {
"subtitle": "subtitles.block.generic.footsteps",
"sounds": [
{ "name": "cobblemon:block/item_block/metal_can_step_1", "volume": 0.2 },
{ "name": "cobblemon:block/item_block/metal_can_step_2", "volume": 0.2 },
{ "name": "cobblemon:block/item_block/metal_can_step_3", "volume": 0.2 },
{ "name": "cobblemon:block/item_block/metal_can_step_4", "volume": 0.2 }
]
},
"block.item_block.jar_glass_liquid.place": {
"subtitle": "subtitles.block.generic.place",
"sounds": [
{ "name": "cobblemon:block/item_block/jar_glass_liquid_place_1", "volume": 0.3 },
{ "name": "cobblemon:block/item_block/jar_glass_liquid_place_2", "volume": 0.3 },
{ "name": "cobblemon:block/item_block/jar_glass_liquid_place_3", "volume": 0.3 },
{ "name": "cobblemon:block/item_block/jar_glass_liquid_place_4", "volume": 0.3 }
]
},
"block.item_block.jar_glass_liquid.break": {
"subtitle": "subtitles.block.generic.break",
"sounds": [
{ "name": "cobblemon:block/item_block/jar_glass_liquid_break_1", "volume": 0.4 },
{ "name": "cobblemon:block/item_block/jar_glass_liquid_break_2", "volume": 0.4 },
{ "name": "cobblemon:block/item_block/jar_glass_liquid_break_3", "volume": 0.4 },
{ "name": "cobblemon:block/item_block/jar_glass_liquid_break_4", "volume": 0.4 }
]
},
"block.item_block.jar_glass_liquid.step": {
"subtitle": "subtitles.block.generic.footsteps",
"sounds": [
{ "name": "cobblemon:block/item_block/jar_glass_liquid_step_1", "volume": 0.2 },
{ "name": "cobblemon:block/item_block/jar_glass_liquid_step_2", "volume": 0.2 },
{ "name": "cobblemon:block/item_block/jar_glass_liquid_step_3", "volume": 0.2 },
{ "name": "cobblemon:block/item_block/jar_glass_liquid_step_4", "volume": 0.2 }
]
},
"move.absorb.actor": {
"sounds": [ { "name": "cobblemon:move/absorb/absorb_actor", "volume": 0.3 } ]
},
@@ -1516,7 +1346,7 @@
"sounds": [ { "name": "cobblemon:move/icebeam/icebeam_target_1", "volume": 0.8 } ]
},
"move.icebeam.target_2": {
"sounds": [ { "name": "cobblemon:move/icebeam/icebeam_target_2", "volume": 0.5 } ]
"sounds": [ { "name": "cobblemon:move/icebeam/icebeam_target_2", "volume": 0.8 } ]
},
"move.infestation.actor": {
"sounds": [ { "name": "cobblemon:move/infestation/infestation_actor", "volume": 0.8 } ]
@@ -1623,57 +1453,6 @@
"move.waterpulse.target": {
"sounds": [ { "name": "cobblemon:move/waterpulse/waterpulse_target", "volume": 0.8 } ]
},
"move.leafstorm.actor": {
"sounds": [ { "name": "cobblemon:move/leafstorm/leafstorm_actor", "volume": 1.0 } ]
},
"move.leafstorm.target": {
"sounds": [ { "name": "cobblemon:move/leafstorm/leafstorm_target", "volume": 1.0 } ]
},
"move.suckerpunch.target": {
"sounds": [ { "name": "cobblemon:move/suckerpunch/suckerpunch_target", "volume": 1.0 } ]
},
"move.blizzard.actor": {
"sounds": [ { "name": "cobblemon:move/blizzard/blizzard_actor", "volume": 1.0 } ]
},
"move.blizzard.target": {
"sounds": [ { "name": "cobblemon:move/blizzard/blizzard_target", "volume": 1.0 } ]
},
"move.hydropump.actor": {
"sounds": [ { "name": "cobblemon:move/hydropump/hydropump_actor", "volume": 1.0 } ]
},
"move.hydropump.target": {
"sounds": [ { "name": "cobblemon:move/hydropump/hydropump_target", "volume": 1.0 } ]
},
"move.lightscreen.actor": {
"sounds": [ { "name": "cobblemon:move/lightscreen/lightscreen_actor", "volume": 1.0 } ]
},
"move.horndrill.target_1": {
"sounds": [ { "name": "cobblemon:move/horndrill/horndrill_target_1", "volume": 0.8 } ]
},
"move.horndrill.target_2": {
"sounds": [ { "name": "cobblemon:move/horndrill/horndrill_target_2", "volume": 1.0 } ]
},
"move.playrough.actor_1": {
"sounds": [ { "name": "cobblemon:move/playrough/playrough_actor_1", "volume": 1.0 } ]
},
"move.playrough.actor_2": {
"sounds": [ { "name": "cobblemon:move/playrough/playrough_actor_2", "volume": 1.0 } ]
},
"move.playrough.actor_3": {
"sounds": [ { "name": "cobblemon:move/playrough/playrough_actor_3", "volume": 1.0 } ]
},
"move.playrough.target": {
"sounds": [ { "name": "cobblemon:move/playrough/playrough_target", "volume": 1.0 } ]
},
"move.pyroball.actor": {
"sounds": [ { "name": "cobblemon:move/pyroball/pyroball_actor", "volume": 1.0 } ]
},
"move.pyroball.actor_cinderace": {
"sounds": [ { "name": "cobblemon:move/pyroball/pyroball_actor_cinderace", "volume": 1.0 } ]
},
"move.pyroball.target": {
"sounds": [ { "name": "cobblemon:move/pyroball/pyroball_target", "volume": 1.0 } ]
},
"impact.normal": {
"sounds": [
{ "name": "cobblemon:move/impact_generic/impact_generic_fighting_1", "volume": 0.8 },
@@ -6601,9 +6380,6 @@
"pokemon.cherrim.cry": {
"sounds": [ { "name": "cobblemon:pokemon/cherrim/cherrim_cry", "volume": 0.8 } ]
},
"pokemon.cherrim_sunshine.cry": {
"sounds": [ { "name": "cobblemon:pokemon/cherrim/cherrim_sunshine_cry", "volume": 0.8 } ]
},
"pokemon.shellos.cry": {
"sounds": [ { "name": "cobblemon:pokemon/shellos/shellos_cry", "volume": 0.8 } ]
},
@@ -7627,14 +7403,8 @@
"pokemon.rockruff.cry": {
"sounds": [ { "name": "cobblemon:pokemon/rockruff/rockruff_cry", "volume": 0.8 } ]
},
"pokemon.lycanroc_midday.cry": {
"sounds": [ { "name": "cobblemon:pokemon/lycanroc/lycanroc_midday_cry", "volume": 0.8 } ]
},
"pokemon.lycanroc_midnight.cry": {
"sounds": [ { "name": "cobblemon:pokemon/lycanroc/lycanroc_midnight_cry", "volume": 0.8 } ]
},
"pokemon.lycanroc_dusk.cry": {
"sounds": [ { "name": "cobblemon:pokemon/lycanroc/lycanroc_dusk_cry", "volume": 0.8 } ]
"pokemon.lycanroc.cry": {
"sounds": [ { "name": "cobblemon:pokemon/lycanroc/lycanroc_cry", "volume": 0.8 } ]
},
"pokemon.wishiwashi.cry": {
"sounds": [ { "name": "cobblemon:pokemon/wishiwashi/wishiwashi_cry", "volume": 0.8 } ]
@@ -8056,9 +7826,6 @@
"pokemon.duraludon.cry": {
"sounds": [ { "name": "cobblemon:pokemon/duraludon/duraludon_cry", "volume": 0.8 } ]
},
"pokemon.duraludon.bonk": {
"sounds": [ { "name": "cobblemon:pokemon/duraludon/duraludon_bonk", "volume": 0.8 } ]
},
"pokemon.dreepy.cry": {
"sounds": [ { "name": "cobblemon:pokemon/dreepy/dreepy_cry", "volume": 0.8 } ]
},
@@ -8506,4 +8273,4 @@
"pokemon.pecharunt.cry": {
"sounds": [ { "name": "cobblemon:pokemon/pecharunt/pecharunt_cry", "volume": 0.8 } ]
}
},
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 979 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 744 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 589 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 290 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 414 B

After

Width:  |  Height:  |  Size: 109 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 496 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 596 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 563 B

@@ -0,0 +1,27 @@
{
"timeline": [
{
"type": "entity_particles",
"effect": "cobblemon:mood_anger_steam",
"locators": ["head", "top"]
},
{
"type": "loop",
"condition": "q.entity.has_memory_value('minecraft:angry_at') || q.entity.has_memory_value('minecraft:attack_target') || q.entity.has_memory_value('cobblemon:nearest_visible_attacker')",
"keyframe": {
"type": "sequence",
"keyframes": [
{
"type": "entity_particles",
"effect": "cobblemon:mood_anger_veins",
"locators": ["head", "top"]
},
{
"type": "pause",
"pause": 1
}
]
}
}
]
}

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