Compare commits

..
Author SHA1 Message Date
SplashOfAzure 51976262d3 update move data for gigaton hammer & play rough 2026-10-01 12:27:19 -07:00
SplashOfAzure 211232a81f Updated Gigaton Hammer SFX, resolve sounds grammar 2026-09-24 14:10:36 -07:00
SplashOfAzure e6352acb61 Added SFX for Gigaton Hammer (Tinkaton)
"BONK" - scout tf2
2026-09-24 12:40:27 -07:00
SplashOfAzure 766b101722 Rework Timing for Play Rough SFX 2026-09-13 14:36:53 -07:00
SplashOfAzure 34adb0d7a0 Adjust positioning & timing for Play Rough SFX 2026-09-05 13:24:32 -07:00
SplashOfAzure 562418e324 Added Cry SFX for Surskit, Duskull, Dusclops, Applin, Flapple, Duraludon (w/ bonk), Dipplin, Archaludon, & Hydrapple. Added Move SFX for Play Rough. 2026-09-03 21:37:41 -07:00
SplashOfAzure 016db10de7 Added Sound for Light Screen 2026-09-03 13:41:46 -07:00
Sterrezo 61d01d3731 Added sounds for Hydro Pump, updated Kinesis 2026-09-03 22:14:07 +02:00
Sterrezo 0319ac9a87 Added sounds to Sucker Punch 2026-08-10 22:09:17 +02:00
Sterrezo a5aea7a75f Added sounds to Leaf Storm 2026-08-10 21:30:08 +02:00
Polymeta 058c06f56b Merge branch 'implement_pokemon' into 'main'
some ride stats and other stuff

See merge request cable-mc/cobblemon!2341
2026-08-08 19:14:42 +00:00
Carmendar 28bee4189a Merge branch 'main' into implement_pokemon 2026-08-07 23:30:54 -05:00
Carmendar 3f0e21b6b3 some minor ride stat adjustments 2026-08-07 23:10:53 -05:00
Jerzykv 9ca2d47562 Fixed Metagross idle loop yet again 2026-08-06 18:13:30 +02:00
Jakotens 94f0914aa8 Poser fixes to Pidgey, Pidgeotto, Pidgeot, Aerodactyl, and Snivy. Animation and walk speed fixes to Pidgey, Pidgeotto, and Pidgeot. Added a new neck_ai bone to Pidgeotto. 2026-08-05 13:09:05 -06:00
Jakotens 60101876b5 Merge remote-tracking branch 'origin/implement_pokemon' into implement_pokemon 2026-08-05 11:29:44 -06:00
RedGenesectNinja b8a4dfbcb4 Adjusted Bidoof's scale again 2026-08-05 03:45:24 -05:00
RedGenesectNinja fbc5959c67 Adjusted Bidoof's scale 2026-08-05 03:14:10 -05:00
Kenji_64 49f20fe1a4 Several cry/poser related fixes 2026-08-04 15:17:35 +02:00
Jerzykv 3c4288d7fc More alpha eyes 2026-08-04 14:55:54 +02:00
Jerzykv e03bb51a74 Substitute animation fix 2026-08-04 14:55:43 +02:00
Jerzykv 8545de321f Lanturn poser fixes 2026-08-04 14:55:31 +02:00
Jerzykv 5e353e9a6d Chinchou json poser conversion 2026-08-04 14:55:21 +02:00
Jerzykv c1fd257f63 Merge remote-tracking branch 'origin/implement_pokemon' into implement_pokemon 2026-08-04 13:56:38 +02:00
Jerzykv ea0ff3bfb9 Komala can no longer walk 2026-08-04 13:56:30 +02:00
Hiroku d4b6e36aab Merge branch 'gamemasters' into 'main'
Interaction Fix

See merge request cable-mc/cobblemon!2339
2026-08-03 08:49:25 +00:00
dhi_holo 0fb721702d Interaction Fix
Solves interaction problem reported https://discord.com/channels/725110639554592879/1481053968716009493/1533385403170820148

Habitat Block acts like a block without interactions if right clicked by a player in survival, or without operator permissions of level 2 or higher (same as command blocks, known as Gamemaster)
With those permissions, it works as usual

Also removed Habitat Block from the Cobblemon Blocks tab, leaving it solely in the Operator Items Tab, like Command Blocks.
2026-08-02 21:08:13 +10:00
Polymeta 0e5053b787 Merge branch 'config-screen-scrolling-labels' into 'main'
Labels on the config screen now scroll instead of overflowing

See merge request cable-mc/cobblemon!2338
2026-08-01 22:09:46 +00:00
lionandPolymeta f3867e0b1d Labels on the config screen now scroll instead of overflowing 2026-08-01 22:09:46 +00:00
Hiroku a4fcd1ae7b Merge branch 'transparent-occlusion' into 'main'
Fix translucent draw order

See merge request cable-mc/cobblemon!2337
2026-08-01 01:56:58 +00:00
JordanandHiroku ed9aff2448 Fix translucent draw order 2026-08-01 01:56:57 +00:00
Nick 8497a2a083 Merge branch 'trade-dupe-fix' into 'main'
Trade dupe fix

See merge request cable-mc/cobblemon!2336
2026-07-31 15:22:15 -07:00
Deltric b389a95b5e Trade dupe fix 2026-07-31 17:03:33 -05:00
Polymeta c310027ce1 Merge branch 'Habitat-Bug-Fixes' into 'main'
Fixin some things

See merge request cable-mc/cobblemon!2335
2026-07-31 20:34:24 +00:00
Slippy 5ddb01df36 More Bug Fixes 2026-07-31 14:25:33 -05:00
Slippy 5a6f49aad5 found one more thing 2026-07-31 02:54:16 -05:00
Slippy 793efcfa3d Fixin some things 2026-07-31 02:49:24 -05:00
ewwww f785c5405f a variety of tiny tweaks 2026-07-29 02:20:57 -04:00
ewwww 2dfca3ff89 a variety of tiny tweaks 2026-07-27 05:17:44 -04:00
185 changed files with 916 additions and 1337 deletions
+1 -8
View File
@@ -2,14 +2,6 @@
## [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??!
@@ -404,6 +396,7 @@
- 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,17 +92,13 @@ interface PokemonAndMoveSelectingItem {
}
fun canUseOnPokemon(stack: ItemStack, pokemon: Pokemon): Boolean {
if (pokemon.entity == null && stack.`is`(CobblemonItemTags.POKE_FOOD) && pokemon.isFull()) {
return false
if (stack.`is`(CobblemonItemTags.POKE_FOOD)) {
return !pokemon.isFull()
}
return true
}
fun canUseOnBattlePokemon(stack: ItemStack, battlePokemon: BattlePokemon): Boolean {
return bagItem!!.canUse(stack, battlePokemon.actor.battle, battlePokemon)
}
fun canUseOnBattlePokemon(stack: ItemStack, battlePokemon: BattlePokemon): Boolean = 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,16 +107,13 @@ interface PokemonSelectingItem {
}
fun canUseOnPokemon(stack: ItemStack, pokemon: Pokemon): Boolean {
if (pokemon.entity == null && stack.`is`(CobblemonItemTags.POKE_FOOD) && pokemon.isFull()) {
return false
if (stack.`is`(CobblemonItemTags.POKE_FOOD)) {
return !pokemon.isFull()
}
return true
}
fun canUseOnBattlePokemon(stack: ItemStack, battlePokemon: BattlePokemon): Boolean {
return bagItem!!.canUse(stack, battlePokemon.actor.battle, battlePokemon)
}
fun canUseOnBattlePokemon(stack: ItemStack, battlePokemon: BattlePokemon): Boolean = bagItem!!.canUse(stack, battlePokemon.actor.battle, battlePokemon)
fun interactWithSpecificBattle(player: ServerPlayer, stack: ItemStack, battlePokemon: BattlePokemon): InteractionResultHolder<ItemStack> {
return if (canUseOnBattlePokemon(stack, battlePokemon)) {
@@ -54,9 +54,8 @@ object PokemonMoLangFunctions : AbstractMoLangFunctionHolder<Pokemon>() {
}
map["feed_pokemon"] = { params ->
val amount = params.getDouble(0)
val playSound = params.getBooleanOrNull(1) != false
val playMoodParticles = params.getBooleanOrNull(2) != false
DoubleValue(pokemon.feedPokemon(amount.toInt(), playSound, playMoodParticles))
val playSound = params.getBooleanOrNull(1) ?: true
pokemon.feedPokemon(amount.toInt(), playSound)
}
map["behaviour"] = { pokemon.form.behaviour.struct }
map["behavior"] = { pokemon.form.behaviour.struct } // Inferior
@@ -44,7 +44,6 @@ 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")
@@ -1,39 +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.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,6 +25,7 @@ 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
@@ -80,11 +81,13 @@ class HabitatBlock(properties: Properties) : Block(properties), EntityBlock {
}
override fun useWithoutItem(state: BlockState, level: Level, pos: BlockPos, player: Player, hitResult: BlockHitResult): InteractionResult {
if (!level.isClientSide) {
val be = level.getBlockEntity(pos) as? HabitatBlockEntity ?: return InteractionResult.PASS
return be.onUse(player, hitResult)
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
}
return InteractionResult.SUCCESS
}
override fun getDrops(state: BlockState, params: LootParams.Builder): MutableList<ItemStack> {
@@ -41,6 +41,7 @@ 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,17 +8,18 @@
package com.cobblemon.mod.common.client.gui.config.variable
import com.cobblemon.mod.common.client.gui.config.CobblemonConfigScreen.Companion.LABEL_Y_OFFSET
import com.cobblemon.mod.common.client.gui.config.CobblemonConfigScreen.Companion.LABEL_MAX_WIDTH
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.drawScaledText
import com.cobblemon.mod.common.client.render.drawScrollingText
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
@@ -91,12 +92,15 @@ abstract class CobblemonConfigVariable(
val x = getX(left)
val y = getY(top)
drawScaledText(
context = context,
text = labelLang,
x = getX(left),
y = getY(top) + LABEL_Y_OFFSET,
shadow = true
drawScrollingText(
context,
Minecraft.getInstance().font,
labelLang,
x,
y + WIDGET_Y_OFFSET,
x + LABEL_MAX_WIDTH,
y + WIDGET_Y_OFFSET + WIDGET_HEIGHT,
-1
)
resetButton.x = x + SLOT_WIDTH - RESET_SLOT_WIDTH
@@ -18,17 +18,23 @@ 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
@@ -97,6 +103,55 @@ 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,7 +34,6 @@ 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
@@ -256,7 +255,7 @@ open class PosableModel(@Transient override val rootPart: Bone) : ModelFrame {
}
fun setLayerContext(buffer: MultiBufferSource, state: PosableState, layers: Iterable<ModelLayer>) {
currentLayers = layers
currentLayers = layers.sortedBy { it.translucent }
bufferProvider = buffer
currentState = state
}
@@ -1,127 +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.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,7 +368,6 @@ 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,10 +9,7 @@
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
@@ -32,23 +29,12 @@ object FleeFromAttackerTask {
Trigger { _, entity, _ ->
val hurtByEntity = it.get(hurtByEntity)
val avoidTarget = it.tryGet(avoidTarget).orElse(null)
if (avoidTarget != null && avoidTarget == hurtByEntity) {
if (avoidTarget != null && avoidTarget == hurtByEntity.uuid) {
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,7 +8,6 @@
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
@@ -25,16 +24,10 @@ 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,9 +34,6 @@ 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
@@ -428,9 +425,6 @@ open class PokemonEntity(
var occupiedSeats = mutableMapOf<Seat, Entity>()
var moodParticleLock = false
var playedZeroStaminaParticle = false
init {
delegate.initialize(this)
delegate.changePokemon(pokemon)
@@ -910,27 +904,6 @@ 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) {
@@ -2327,8 +2300,6 @@ open class PokemonEntity(
ifRidingAvailable { _, _, state ->
state.stamina.set(entityData.get(RIDE_STAMINA))
}
playedZeroStaminaParticle = false
}
}
@@ -2357,26 +2328,12 @@ 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,11 +44,6 @@ 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,7 +9,6 @@
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
@@ -61,12 +60,7 @@ 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, false)
entity.pokemon.feedPokemon(itemConfig.fullnessValue, false)
}
// Check if the result item is something that should be dropped
resultItemStack = entity.pokemon.heldItem()
@@ -13,9 +13,7 @@ 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
@@ -94,9 +92,7 @@ class AprijuiceItem(val type: Apricorn): CobblemonItem(Properties().stacksTo(16)
return InteractionResultHolder.fail(stack)
}
if (!pokemon.feedPokemon(1)) {
return InteractionResultHolder.fail(stack)
}
pokemon.feedPokemon(1)
val boosts = getBoosts(stack)
pokemon.addRideBoosts(boosts.mapValues { it.value.toFloat() })
@@ -96,9 +96,8 @@ class PokePuffItem : Item(Properties().stacksTo(64)), PokemonSelectingItem {
return InteractionResultHolder.fail(stack)
}
if (!pokemon.feedPokemon(4)) {
return InteractionResultHolder.fail(stack)
}
// Feed the Pokémon 4 fullness points
pokemon.feedPokemon(4)
val friendshipChange = PokePuffUtils.calculateFriendshipChange(stack, pokemon.nature)
@@ -54,16 +54,14 @@ 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
if (!increasedFriendship && !decreasedEVs) {
return InteractionResultHolder.pass(stack)
}
return if (increasedFriendship || decreasedEVs) {
pokemon.feedPokemon(1)
if (!pokemon.feedPokemon(1)) {
return InteractionResultHolder.fail(stack)
stack.consume(1, player)
InteractionResultHolder.success(stack)
} else {
InteractionResultHolder.pass(stack)
}
stack.consume(1, player)
return InteractionResultHolder.success(stack)
}
override fun use(world: Level, user: Player, hand: InteractionHand): InteractionResultHolder<ItemStack> {
@@ -54,10 +54,7 @@ class HealingBerryItem(block: BerryBlock, val amount: () -> ExpressionLike): Ber
return InteractionResultHolder.fail(stack)
}
if (!pokemon.feedPokemon(1)) {
return InteractionResultHolder.fail(stack)
}
pokemon.feedPokemon(1)
pokemon.currentHealth = Integer.min(pokemon.currentHealth + genericRuntime.resolveInt(amount(), pokemon), pokemon.maxHealth)
stack.consume(1, player)
return InteractionResultHolder.success(stack)
@@ -65,7 +62,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, playMoodParticle = false)
battlePokemon.originalPokemon.feedPokemon(1)
}
override fun use(world: Level, user: Player, hand: InteractionHand): InteractionResultHolder<ItemStack> {
@@ -48,26 +48,21 @@ 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)) {
return
}
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 (!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)
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, playMoodParticle = false)
battlePokemon.originalPokemon.feedPokemon(1)
}
override fun use(world: Level, user: Player, hand: InteractionHand): InteractionResultHolder<ItemStack> {
@@ -59,9 +59,7 @@ class PortionHealingBerryItem(block: BerryBlock, val canCauseConfusion: Boolean,
}
// count these berries as multiple feedings due to the amount they heal
if (!pokemon.feedPokemon(5)) {
return InteractionResultHolder.fail(stack)
}
pokemon.feedPokemon(5)
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 ->
@@ -75,7 +73,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, playMoodParticle = false)
battlePokemon.originalPokemon.feedPokemon(5)
}
override fun use(world: Level, user: Player, hand: InteractionHand): InteractionResultHolder<ItemStack> {
@@ -58,23 +58,19 @@ class StatusCuringBerryItem(block: BerryBlock, vararg val status: Status): Berry
stack: ItemStack,
pokemon: Pokemon
): InteractionResultHolder<ItemStack>? {
if (!canUseOnPokemon(stack, pokemon)) {
return InteractionResultHolder.fail(stack)
return if (canUseOnPokemon(stack, pokemon)) {
pokemon.feedPokemon(1)
pokemon.status = null
stack.consume(1, player)
InteractionResultHolder.success(stack)
} else {
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, playMoodParticle = false)
battlePokemon.originalPokemon.feedPokemon(1)
}
override fun use(world: Level, user: Player, hand: InteractionHand): InteractionResultHolder<ItemStack> {
@@ -316,7 +316,6 @@ 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,10 +53,7 @@ class BerryJuiceItem : CobblemonItem(Properties()), PokemonSelectingItem, Healin
if (!canUseOnPokemon(stack, pokemon)) {
return InteractionResultHolder.fail(stack)
}
if (!pokemon.feedPokemon(1)) {
return InteractionResultHolder.fail(stack)
}
pokemon.feedPokemon(1)
var amount = Integer.min(pokemon.currentHealth + 20, pokemon.maxHealth)
CobblemonEvents.POKEMON_HEALED.postThen(PokemonHealedEvent(pokemon, amount, this), { cancelledEvent -> return InteractionResultHolder.fail(stack)}) { event ->
@@ -77,9 +74,7 @@ class BerryJuiceItem : CobblemonItem(Properties()), PokemonSelectingItem, Healin
override fun applyToBattlePokemon(player: ServerPlayer, stack: ItemStack, battlePokemon: BattlePokemon) {
super.applyToBattlePokemon(player, stack, battlePokemon)
battlePokemon.originalPokemon.feedPokemon(1, playMoodParticle = false)
battlePokemon.originalPokemon.feedPokemon(1)
if (!player.hasInfiniteMaterials()) {
val woodenBowlItemStack = ItemStack(Items.BOWL)
if (!player.inventory.add(woodenBowlItemStack)) {
@@ -33,9 +33,7 @@ class FreshStartMochiItem : CobblemonItem(Properties()), PokemonSelectingItem {
return InteractionResultHolder.fail(stack)
}
if (!pokemon.feedPokemon(1)) {
return InteractionResultHolder.fail(stack)
}
pokemon.feedPokemon(1)
pokemon.evs.forEach {
pokemon.setEV(it.key, 0)
@@ -24,9 +24,7 @@ class MochiItem(stat: Stats): EVIncreaseItem(stat, 4) {
return InteractionResultHolder.fail(stack)
}
if (!pokemon.feedPokemon(1)) {
return InteractionResultHolder.fail(stack)
}
pokemon.feedPokemon(1)
return super.applyToPokemon(player, stack, pokemon)
}
@@ -985,10 +985,6 @@ 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
@@ -1060,13 +1056,23 @@ open class Pokemon : ShowdownIdentifiable {
else -> 0 // For weights less than 0.1
}
fun feedPokemon(feedCount: Int, playSound: Boolean = true, playMoodParticle: Boolean = true): Boolean {
playFullnessEffects(playSound, playMoodParticle)
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)
}
}
// 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 false
return
}
this.currentFullness = (this.currentFullness + feedCount).coerceIn(0, this.getMaxFullness())
@@ -1075,31 +1081,6 @@ 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,8 +115,26 @@ object TradeManager : RequestManager<TradeManager.TradeRequest>() {
}
CobblemonEvents.TRADE_EVENT_PRE.postThen(TradeEvent.Pre(player1, pokemon2, player2, pokemon1)) {
party1.remove(pokemon1)
party2.remove(pokemon2)
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
}
// If player1 is the OT, keep track of the friendship
pokemon1.cacheFriendship(player1.uuid)
@@ -1575,470 +1575,6 @@
}
}
},
"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": {
@@ -1,43 +0,0 @@
{
"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
}
}
}
}
}
}
@@ -1,64 +0,0 @@
{
"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"
}
}
}
}
}
}
@@ -1,49 +0,0 @@
{
"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": {}
}
}
}
@@ -1,47 +0,0 @@
{
"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": ["-2.5-math.cos(q.anim_time*90*16/3*2+30)*9", 0, 0]
"rotation": ["-1-math.cos(q.anim_time*90*16/3*2+30)*6", 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,9 +1462,6 @@
"bones": {
"pidgey": {
"position": [0, 0, "20-q.anim_time*16*0.95"]
},
"head": {
"position": [0, 0, -0.1]
}
}
},
@@ -152,6 +152,9 @@
},
"claw_outer_right": {
"rotation": [10, 0, 0]
},
"wings_open": {
"scale": 0
}
}
},
@@ -207,6 +207,9 @@
},
"seat_1": {
"rotation": [22.5, 0, 0]
},
"wings_open": {
"scale": 0
}
}
},
@@ -1808,6 +1811,9 @@
},
"seat_1": {
"rotation": [22.5, 0, 0]
},
"wings_open": {
"scale": 0
}
}
},
@@ -2017,6 +2023,9 @@
},
"seat_1": {
"rotation": [22.5, 0, 0]
},
"wings_open": {
"scale": 0
}
}
},
@@ -3618,6 +3627,9 @@
},
"seat_1": {
"rotation": [22.5, 0, 0]
},
"wings_open": {
"scale": 0
}
}
},
@@ -4926,8 +4938,14 @@
},
"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": {
@@ -5619,15 +5637,27 @@
"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": {
@@ -5898,8 +5928,14 @@
},
"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": {
@@ -6141,15 +6177,27 @@
"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": {
@@ -6161,33 +6209,69 @@
"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": {
@@ -6498,8 +6582,14 @@
},
"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": {
@@ -7191,15 +7281,27 @@
"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": {
@@ -7447,8 +7549,14 @@
},
"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": {
@@ -7690,15 +7798,27 @@
"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": {
@@ -7710,29 +7830,53 @@
"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": {
@@ -12788,19 +12932,43 @@
"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]
}
}
}
},
@@ -12904,7 +13072,10 @@
"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": {
@@ -13185,7 +13356,10 @@
"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": {
@@ -13211,13 +13385,19 @@
"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]
}
}
}
}
@@ -13228,25 +13408,37 @@
"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.79167,
"animation_length": 0.7917,
"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.79167,
"animation_length": 3.7917,
"bones": {
"body": {
"rotation": {
@@ -2754,7 +2754,7 @@
}
},
"animation.chinchou.blink": {
"animation_length": 0.16667,
"animation_length": 0.1667,
"bones": {
"eyelid_left": {
"position": {
@@ -2879,29 +2879,10 @@
"1.25": [0, 0, 0]
}
}
}
},
"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"]
},
"sound_effects": {
"0.0833": {
"effect": "pokemon.chinchou.cry"
}
}
}
@@ -3,7 +3,7 @@
"animations": {
"animation.metagross.ground_idle": {
"loop": true,
"animation_length": 0,
"animation_length": 8,
"bones": {
"body2": {
"position": [0, -11.9, 0]
@@ -54,8 +54,7 @@
},
"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)"],
"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)"]
"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)"]
},
"position": [0, "0.2*math.sin(q.anim_time*90*0.5-60)", 0]
}
@@ -74,14 +74,19 @@
"name": "neck",
"parent": "torso2",
"pivot": [0, 5.25, -7.5],
"rotation": [52.5, 0, 0],
"rotation": [52.5, 0, 0]
},
{
"name": "neck_ai",
"parent": "neck",
"pivot": [0, 5.25, -7.5],
"cubes": [
{"origin": [-2.5, 4.75, -9], "size": [5, 5, 5], "inflate": -0.01, "uv": [22, 32]}
]
},
{
"name": "head",
"parent": "neck",
"parent": "neck_ai",
"pivot": [0, 10, -6.5]
},
{
@@ -26,9 +26,9 @@
{
"name": "locator_root",
"parent": "pidgeot",
"pivot": [0, 32, 0],
"pivot": [0, 0, 0],
"locators": {
"root": [0, 32, 0]
"root": [0, 0, 0]
}
},
{
@@ -69,9 +69,9 @@
{
"name": "locator_seat_1",
"parent": "torso",
"pivot": [0, 25, 2],
"pivot": [0, 22, 2],
"locators": {
"seat_1": [0, 25, 2]
"seat_1": [0, 22, 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, "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": [-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": [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,14 +447,6 @@
"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,7 +12,8 @@
"standing": {
"poseTypes": ["PORTRAIT", "PROFILE", "STAND", "NONE"],
"animations": [
"q.look('head_ai')",
"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.bedrock('pidgey', 'ground_idle')"
],
"transformedParts": [
@@ -41,7 +42,8 @@
"walk": {
"poseTypes": ["WALK"],
"animations": [
"q.look('head_ai')",
"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.bedrock('pidgey', 'ground_walk')"
],
"transformedParts": [
@@ -70,7 +72,8 @@
"poseTypes": ["HOVER", "FLOAT"],
"animations": [
"q.pitch_tilt('body')",
"q.look('head_ai')",
"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.bedrock('pidgey', 'air_idle')"
],
"transformedParts": [
@@ -182,7 +185,8 @@
"shoulder_left": {
"poseTypes": ["SHOULDER_LEFT"],
"animations": [
"q.look('head_ai')",
"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.bedrock('pidgey', 'shoulder_left')"],
"quirks": ["q.bedrock_quirk('pidgey', 'blink')"],
"transformedParts": [
@@ -211,7 +215,8 @@
"shoulder_right": {
"poseTypes": ["SHOULDER_RIGHT"],
"animations": [
"q.look('head_ai')",
"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.bedrock('pidgey', 'shoulder_right')"],
"quirks": ["q.bedrock_quirk('pidgey', 'blink')"],
"transformedParts": [
@@ -18,27 +18,10 @@
"standing": {
"poseTypes": ["PORTRAIT", "PROFILE", "STAND", "NONE"],
"animations": [
"q.look('head_ai')",
"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.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'))"
@@ -47,7 +30,8 @@
"walk": {
"poseTypes": ["WALK"],
"animations": [
"q.look('head_ai')",
"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.bedrock('pidgeotto', 'ground_walk')"
],
"transformedParts": [
@@ -76,7 +60,8 @@
"poseTypes": ["HOVER", "FLOAT"],
"animations": [
"q.pitch_tilt('body')",
"q.look('head_ai')",
"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.bedrock('pidgeotto', 'air_idle')"
],
"transformedParts": [
@@ -24,8 +24,9 @@
"isBattle": false,
"condition": "!q.is_ridden",
"animations": [
"q.look('head_ai')",
"q.look('hair3', -1, 1, 30, -60, 0, 0)",
"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.bedrock('pidgeot', 'ground_idle')"
],
"transformedParts": [
@@ -54,31 +55,14 @@
"poseTypes": ["STAND"],
"isBattle": true,
"animations": [
"q.look('head_ai')",
"q.look('hair3', -1, 1, 30, -60, 0, 0)",
"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.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')"
]
@@ -87,8 +71,9 @@
"poseTypes": ["WALK"],
"condition": "!q.is_ridden",
"animations": [
"q.look('head_ai')",
"q.look('hair3', -1, 1, 30, -60, 0, 0)",
"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.bedrock('pidgeot', 'ground_walk')"
],
"transformedParts": [
@@ -118,8 +103,9 @@
"condition": "!q.is_ridden",
"animations": [
"q.pitch_tilt('body')",
"q.look('head_ai')",
"q.look('hair3', -1, 1, 30, -60, 0, 0)",
"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.bedrock('pidgeot', 'air_idle')"
],
"transformedParts": [
@@ -263,8 +249,9 @@
"poseTypes": ["STAND"],
"isBattle": false,
"animations": [
"q.look('head_ai')",
"q.look('hair3', -1, 1, 30, -60, 0, 0)",
"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.bedrock('pidgeot', 'mount_ground_idle')"
],
"condition": "q.has_entity && q.is_ridden && !q.in_air",
@@ -293,8 +280,9 @@
"isBattle": false,
"condition": "q.is_ridden && !q.is_air && q.has_entity",
"animations": [
"q.look('head_ai')",
"q.look('hair3', -1, 1, 30, -60, 0, 0)",
"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.bedrock('pidgeot', 'ride_ground_walk')",
"q.bedrock('pidgeot', 'mount_ground_walk')"
],
@@ -322,8 +310,9 @@
"poseTypes": ["HOVER"],
"condition": "!q.is_gliding && q.is_ridden && q.has_entity",
"animations": [
"q.look('head_ai')",
"q.look('hair3', -1, 1, 30, -60, 0, 0)",
"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.bedrock('pidgeot', 'ride_air_idle')",
"q.bedrock('pidgeot', 'mount_air_idle')"
],
@@ -353,8 +342,9 @@
"poseTypes": ["FLY"],
"condition": "!q.is_gliding && q.is_ridden && q.has_entity",
"animations": [
"q.look('head_ai')",
"q.look('hair3', -1, 1, 30, -60, 0, 0)",
"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.bedrock('pidgeot', 'ride_air_fly')",
"q.bedrock('pidgeot', 'mount_air_fly')"
],
@@ -385,8 +375,9 @@
"condition": "q.is_gliding",
"isBattle": false,
"animations": [
"q.look('head_ai')",
"q.look('hair3', -1, 1, 30, -60, 0, 0)",
"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.bedrock('pidgeot', 'air_glide')",
{
"condition": "q.is_ridden",
@@ -24,7 +24,8 @@
"poseTypes": ["STAND"],
"isBattle": true,
"animations": [
"q.look('head_ai')",
"q.look('neck', 1, 1, 25, -20, 20, -20)",
"q.look('head', 1, 1, 22.5, -10, 15, -15)",
"q.bedrock('aerodactyl', 'battle_idle')"
],
"quirks": [
@@ -38,7 +39,8 @@
"poseTypes": ["HOVER"],
"isBattle": true,
"animations": [
"q.look('head_ai')",
"q.look('neck', 1, 1, 25, -20, 20, -20)",
"q.look('head', 1, 1, 22.5, -10, 15, -15)",
"q.bedrock('aerodactyl', 'battle_air_idle')"
],
"quirks": [
@@ -53,7 +55,8 @@
"condition": "q.has_entity ? !q.in_air : 1.0",
"isBattle": false,
"animations": [
"q.look('head_ai')",
"q.look('neck', 1, 1, 25, -20, 20, -20)",
"q.look('head', 1, 1, 22.5, -10, 15, -15)",
"q.bedrock('aerodactyl', 'ground_idle')",
{
"condition": "q.is_ridden",
@@ -77,7 +80,8 @@
"poseTypes": ["WALK", "SWIM"],
"condition": "q.has_entity ? !q.in_air && !q.is_sprinting : 1.0",
"animations": [
"q.look('head_ai')",
"q.look('neck', 1, 1, 25, -20, 20, -20)",
"q.look('head', 1, 1, 22.5, -10, 15, -15)",
"q.bedrock('aerodactyl', 'ground_walk')",
{
"condition": "q.is_ridden",
@@ -90,7 +94,8 @@
"poseTypes": ["WALK", "SWIM"],
"condition": "q.has_entity ? !q.in_air && q.is_sprinting : 0.0",
"animations": [
"q.look('head_ai')",
"q.look('neck', 1, 1, 25, -20, 20, -20)",
"q.look('head', 1, 1, 22.5, -10, 15, -15)",
"q.bedrock('aerodactyl', 'ground_run')",
{
"condition": "q.is_ridden",
@@ -106,7 +111,8 @@
"isBattle": false,
"condition": "!q.is_ridden",
"animations": [
"q.look('head_ai')",
"q.look('neck', 1, 1, 25, -20, 20, -20)",
"q.look('head', 1, 1, 22.5, -10, 15, -15)",
"q.bedrock('aerodactyl', 'air_idle')"
],
"quirks": [
@@ -118,7 +124,8 @@
"isBattle": false,
"condition": "q.is_ridden",
"animations": [
"q.look('head_ai')",
"q.look('neck', 1, 1, 25, -20, 20, -20)",
"q.look('head', 1, 1, 22.5, -10, 15, -15)",
"q.bedrock('aerodactyl', 'air_idle')"
],
"quirks": [
@@ -131,7 +138,8 @@
"isBattle": false,
"condition": "!q.is_gliding && !q.is_ridden",
"animations": [
"q.look('head_ai')",
"q.look('neck', 1, 1, 25, -20, 20, -20)",
"q.look('head', 1, 1, 22.5, -10, 15, -15)",
"q.bedrock('aerodactyl', 'air_fly')"
],
"quirks": [
@@ -143,7 +151,8 @@
"isBattle": false,
"condition": "!q.is_gliding && q.is_ridden",
"animations": [
"q.look('head_ai')",
"q.look('neck', 1, 1, 25, -20, 20, -20)",
"q.look('head', 1, 1, 22.5, -10, 15, -15)",
"q.bedrock('aerodactyl', 'air_fly')",
"q.bedrock('aerodactyl', 'ride_air_fly')"
],
@@ -157,7 +166,8 @@
"isBattle": false,
"condition": "q.is_gliding",
"animations": [
"q.look('head_ai')",
"q.look('neck', 1, 1, 25, -20, 20, -20)",
"q.look('head', 1, 1, 22.5, -10, 15, -15)",
"q.bedrock('aerodactyl', 'air_glide')",
"q.bedrock('aerodactyl', 'air_dive')",
{
@@ -0,0 +1,88 @@
{
"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,15 +26,17 @@
"battle-standing": {
"poseTypes": ["STAND"],
"isBattle": true,
"animations": ["q.bedrock('lanturn', 'battle_idle')"],
"isTouchingWater": false,
"animations": ["q.bedrock('lanturn', 'ground_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": {
"sleep": "q.bedrock('lanturn', 'water_faint', q.curve('one'))"
"faint": "q.bedrock('lanturn', 'water_faint', q.curve('one'))"
},
"quirks": ["q.bedrock_quirk('lanturn', 'blink')"]
},
@@ -42,42 +44,49 @@
"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')"]
"animations": ["q.bedrock('lanturn', 'water_idle')"],
"quirks": ["q.bedrock_quirk('lanturn', 'blink')"]
},
"walking": {
"poseTypes": ["WALK"],
"isTouchingWater": false,
"animations": ["q.bedrock('lanturn', 'water_swim')"]
"animations": ["q.bedrock('lanturn', 'water_swim')"],
"quirks": ["q.bedrock_quirk('lanturn', 'blink')"]
},
"surface-floating": {
"poseTypes": ["STAND"],
"isTouchingWater": true,
"isUnderWater": false,
"animations": ["q.bedrock('lanturn', 'water_idle')"]
"animations": ["q.bedrock('lanturn', 'water_idle')"],
"quirks": ["q.bedrock_quirk('lanturn', 'blink')"]
},
"surface-swimming": {
"poseTypes": ["WALK"],
"isTouchingWater": true,
"isUnderWater": false,
"animations": ["q.bedrock('lanturn', 'water_swim')"]
"animations": ["q.bedrock('lanturn', 'water_swim')"],
"quirks": ["q.bedrock_quirk('lanturn', 'blink')"]
},
"floating": {
"poseTypes": ["FLOAT"],
"isTouchingWater": true,
"isUnderWater": true,
"animations": ["q.bedrock('lanturn', 'water_idle')"]
"animations": ["q.bedrock('lanturn', 'water_idle')"],
"quirks": ["q.bedrock_quirk('lanturn', 'blink')"]
},
"swimming": {
"poseTypes": ["SWIM"],
"isTouchingWater": true,
"isUnderWater": true,
"animations": ["q.bedrock('lanturn', 'water_swim')"]
"animations": ["q.bedrock('lanturn', 'water_swim')"],
"quirks": ["q.bedrock_quirk('lanturn', 'blink')"]
},
"water-sleeping": {
"poseTypes": ["SLEEP"],
@@ -17,7 +17,7 @@
"poseTypes": ["STAND"],
"isBattle": true,
"namedAnimations": {
"cry": "q.bedrock_primary('smeargle', 'battle_cry')"
"cry": "q.bedrock_primary('smeargle', 'battle_cry', q.curve('symmetrical_wide'))"
},
"animations": ["q.look('head')", "q.bedrock('smeargle', 'battle_idle')"],
"quirks": ["q.bedrock_quirk('smeargle', 'blink')"]
@@ -10,7 +10,6 @@
"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,7 +10,6 @@
"poses": {
"standing": {
"poseTypes": ["STAND", "NONE", "PORTRAIT", "PROFILE"],
"isBattle": true,
"animations": ["q.bedrock('dewpider', 'ground_idle')"]
},
"walking": {
@@ -10,7 +10,6 @@
"poses": {
"standing": {
"poseTypes": ["STAND", "NONE", "PORTRAIT", "PROFILE"],
"isBattle": true,
"animations": ["q.bedrock('araquanid', 'ground_idle')"]
},
"walking": {
@@ -6,6 +6,7 @@
"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,6 +6,7 @@
"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,6 +14,18 @@
"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,6 +27,18 @@
"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,7 +16,8 @@
{
"name": "translucent",
"texture": "cobblemon:textures/pokemon/0751_dewpider/dewpider_translucent.png",
"translucent": true
"translucent": true,
"translucent_cull": true
}
]
},
@@ -16,7 +16,8 @@
{
"name": "translucent",
"texture": "cobblemon:textures/pokemon/0752_araquanid/araquanid_translucent.png",
"translucent": true
"translucent": true,
"translucent_cull": true
}
]
},
@@ -1346,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.8 } ]
"sounds": [ { "name": "cobblemon:move/icebeam/icebeam_target_2", "volume": 0.5 } ]
},
"move.infestation.actor": {
"sounds": [ { "name": "cobblemon:move/infestation/infestation_actor", "volume": 0.8 } ]
@@ -1453,6 +1453,51 @@
"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.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.gigatonhammer.tinkaton": {
"sounds": [ { "name": "cobblemon:move/gigatonhammer/gigatonhammer_actor_tinkaton", "volume": 1.0} ]
},
"move.gigatonhammer.actor": {
"sounds": [ { "name": "cobblemon:move/gigatonhammer/gigatonhammer_actor", "volume": 1.0 } ]
},
"move.gigatonhammer.target": {
"sounds": [ { "name": "cobblemon:move/gigatonhammer/gigatonhammer_target", "volume": 1.0 } ]
},
"impact.normal": {
"sounds": [
{ "name": "cobblemon:move/impact_generic/impact_generic_fighting_1", "volume": 0.8 },
Binary file not shown.

Before

Width:  |  Height:  |  Size: 979 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 744 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 589 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 290 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 109 B

After

Width:  |  Height:  |  Size: 414 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 496 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 596 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 563 B

@@ -1,27 +0,0 @@
{
"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
}
]
}
}
]
}
@@ -1,9 +0,0 @@
{
"timeline": [
{
"type": "entity_particles",
"effect": "cobblemon:mood_annoyed",
"locators": ["head", "top"]
}
]
}
@@ -1,9 +0,0 @@
{
"timeline": [
{
"type": "entity_particles",
"effect": "cobblemon:mood_stress",
"locators": ["head", "top"]
}
]
}
@@ -0,0 +1,44 @@
{
"timeline": [
{
"type": "add_holds",
"holds": ["effects"]
},
{
"type": "animation",
"animation": ["gigatonhammer"],
"delay": 0.3
},
{
"type": "entity_molang",
"entityCondition": "q.entity.is_user == true",
"expressions": ["q.sound('move.gigatonhammer.tinkaton');"]
},
{
"type": "pause",
"pause": 0.73
},
{
"type": "entity_molang",
"entityCondition": "q.entity.is_user == true",
"expressions": ["q.sound('move.gigatonhammer.actor');"]
},
{
"type": "pause",
"pause": 0.49
},
{
"type": "entity_molang",
"entityCondition": "q.entity.is_user == true && q.missed(q.entity.uuid) == false",
"expressions": ["q.sound('move.gigatonhammer.target');"]
},
{
"type": "remove_holds",
"holds": ["effects"]
},
{
"type": "pause",
"pause": 1.5
}
]
}

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