Compare commits

..
Author SHA1 Message Date
jackowes 1da7f76656 walk speed changes 2026-10-05 19:24:58 -05:00
ewwww 3e5733ceaf GREAVARD EMISSIVES 2026-10-05 19:29:25 -04:00
ewwww af29c99b03 properly defined vivillon's pattern forms as forms viewable in the pokedex with form names and dex entries 2026-10-05 18:42:09 -04:00
ewwww 60d596a24f riolu + lucario remodels 2026-10-05 17:14:24 -04:00
ewwww 4003456e5c slakoth animations + minor model tweaks 2026-10-05 05:41:06 -04:00
ewwww 1d21a52d28 shinx, luxio, and luxray remodels 2026-10-05 05:38:23 -04:00
ewwww 2d49c62f85 froakie, frogadier, greninja, & ash-greninja remodels + greninja animations 2026-10-05 05:38:23 -04:00
Kenji_64 da18b082a6 Fixed Alolan Bias Pichu and Pikachu referring to the wrong models and removed the old ones 2026-10-04 12:49:46 +02:00
ewwww f8a16e5081 Merge remote-tracking branch 'origin/implement_pokemon' into implement_pokemon 2026-10-03 22:23:06 -04:00
Polymeta cad39d8802 Merge branch 'form-move-fix' into 'implement_pokemon'
Form Move Fix

See merge request cable-mc/cobblemon!2420
2026-10-03 22:33:27 +00:00
Kenji_64 00905b8c32 Oops, fixed Pikachu's walk 2026-10-03 21:54:11 +02:00
ewwww 79b3cb8611 Merge remote-tracking branch 'origin/implement_pokemon' into implement_pokemon 2026-10-03 15:47:45 -04:00
ewwww 797e908621 restored placeholder animations for chespin and quilladin 2026-10-03 15:47:40 -04:00
Kenji_64 3df3c395de Cap Animations for the entire Pikachu line, updated Raichu animations, added faint to Pikachu and 1 new cosmetic for Pikachu!!! 2026-10-03 21:25:11 +02:00
Konoha 89bba8a67a Quick fix changelog and sneaky Spinda fix 2026-10-02 20:51:52 -04:00
Jerzykv 6d6e13be83 Changelog 2026-10-02 09:29:46 +02:00
Jerzykv 899bec77b6 Implemented Fennekin, Braixen and Delphox remodels 2026-10-02 09:28:58 +02:00
Jerzykv 6dd8325772 Implemented Chespin, Quilladin and Chesnaught remodels 2026-10-02 09:28:39 +02:00
Jakotens 79faadef59 Slight texture updates to Sudowoodo.
Signed-off-by: Jakotens <jjakobdupuyy@gmail.com>
2026-09-30 19:54:48 -06:00
ewwww d9ca7b483d tweaked sudowoodo textures 2026-09-30 19:40:29 -04:00
Instrafe 708f7fc1b8 Merge remote-tracking branch 'origin/implement_pokemon' into implement_pokemon 2026-09-30 18:59:11 -04:00
Instrafe 621db85845 The evolution knows where it is because it knows where it isn't 2026-09-30 18:59:01 -04:00
Instrafe b09066c580 Added negate tags to regional and Vivillon evolutions to prevent biome overlap 2026-09-30 18:58:23 -04:00
ewwww 7c45f28827 ekans remodel + animations 2026-09-30 13:39:45 -04:00
ewwww 9c1b2cae22 vikavolt fixed placeholder animations 2026-09-30 08:59:25 -04:00
ewwww 16b2f81bd4 arbok animations 2026-09-30 08:57:47 -04:00
Konoha 6e0c005587 Changelog 2026-09-29 16:25:13 -04:00
RedGenesectNinja db0fb8e287 Added implemented flag to Tympole, Palpitoad and Seismitoad 2026-09-28 15:06:55 -05:00
Jerzykv dae36a67d1 Merge remote-tracking branch 'origin/implement_pokemon' into implement_pokemon 2026-09-28 19:11:43 +02:00
Jakotens 6f99862288 Fixed some small texture issues on Pidgeot.
Signed-off-by: Jakotens <jjakobdupuyy@gmail.com>
2026-09-28 19:11:27 +02:00
Jerzykv 0377747e1e implemented flag 2026-09-28 19:11:26 +02:00
Jakotens 154b653c57 Fixed some small texture issues on Pidgeot.
Signed-off-by: Jakotens <jjakobdupuyy@gmail.com>
2026-09-27 17:33:09 -06:00
Jerzykv 04489bc969 changelog 2026-09-27 12:39:00 +02:00
Jerzykv 25499b3e7a Fixed #2106 2026-09-27 12:37:49 +02:00
Instrafe bb6bda54dc Updated Changelog 2026-09-26 14:17:30 -04:00
Instrafe 9f3dbdc2d8 Implemented remodel for Shroomish 2026-09-26 14:13:33 -04:00
Jakotens 932148338c Added animations for Treecko and Bonsly. Added remodel and animations for Sudowoodo.
Signed-off-by: Jakotens <jjakobdupuyy@gmail.com>
2026-09-25 23:05:21 -06:00
Jerzykv 309f674853 Implemented Minior 2026-09-24 13:38:30 +02:00
Jerzykv dc705c7720 Fixed Alolan Diglett's cry 2026-09-24 09:48:23 +02:00
ewwww 9bfc577444 oddish, gloom, vileplume, and bellossom remodels + animations 2026-09-22 04:35:07 -04:00
ewwww 3ca6d350fe these were forgotten 2026-09-21 11:40:14 -04:00
Instrafe 2997ce8457 Updated Changelog 2026-09-21 09:54:23 -04:00
Instrafe ff279d8310 Poliwag and Politoed now have remodels + Implemented gender differences for Politoed 2026-09-21 09:53:53 -04:00
Konoha f445c05333 fix: Quick-fix For #updateMovesOnFormChange 2026-09-17 17:38:02 -04:00
Konoha a62485fc1f Fix Calyrex form moves 2026-09-17 15:14:27 -04:00
Konoha 044f3080ff Fix Hoopa form moves 2026-09-17 15:09:43 -04:00
Konoha 28b0cab906 Adjust Form Change moves for Kyurem's level-gated ones. 2026-09-17 14:35:15 -04:00
Konoha 82f34d651c Add Kyurem's form moves 2026-09-17 14:32:47 -04:00
1056 changed files with 182703 additions and 43692 deletions

No files matched your search

-3
View File
@@ -157,9 +157,6 @@ build:
paths:
- neoforge/build/libs
- fabric/build/libs
exclude:
- neoforge/build/libs/*-dev-shadow.jar
- fabric/build/libs/*-dev-shadow.jar
publish:
stage: deploy
+51 -5
View File
@@ -13,7 +13,11 @@
- Galarica Wreath, Cleanse Tag, Spell Tag, Sharp Beak, Covert Cloak, Shell Helmet, and Never-Melt Ice.
- Wearable items can now be equipped by a player by holding it and right-clicking (or rebound use/interact)
- Wearable items that can be placed down are exempt from this behaviour.
- New Cosmetic Item for Pikachu: Paper
### Fixes
- Fixed #updateMovesOnFormChange not properly initializing a form-swapped Pokemon's non-form_change moves.
### TEST
### Pokémon Added
#### Generation 4
- Snover
@@ -35,12 +39,18 @@
- Grubbin
- Charjabug
- Vikavolt
- Minior
#### Generation 8
- Eternatus
#### Generation 9
- Greavard
- Houndstone
### Model updates for the following Pokémon
- Sudowoodo
- Spheal
- Cacnea
- Cacturne
- Binacle
@@ -50,17 +60,54 @@
- Deerling
- Sawsbuck (All forms)
- Absol
- Poliwag
- Politoed
- Ekans
- Oddish
- Gloom
- Vileplume
- Bellossom
- Shroomish
- Chespin
- Quilladin
- Chesnaught
- Fennekin
- Braixen
- Delphox
- Froakie
- Frogadier
- Greninja
- Shinx
- Luxio
- Luxray
- Slakoth
- Riolu
- Lucario
### Animation updates for the following Pokémon
- Treecko (New Shoulder Mount!)
- Bonsly (New Shoulder Mount!)
- Sudowoodo
- Cacnea
- Cacturne
- Ekans
- Arbok
- Oddish
- Gloom
- Vileplume
- Bellossom
- Pichu
- Pikachu
- Raichu (+ Alolan)
- Greninja
- Slakoth
### Changes
- Updated various recipes to display in Recipe Groups within the Recipe Book
- Updated most recipes to display more logically/consistently within the Recipe Book's categories
- Make ride rotations less jittery in multiplayer.
- Changes tm shelf discs to use textures instead of tinting and overlays to line up with item display
- Blank TM can now be inserted into the Disc Shelf
- Made regional and Vivillon split-evo locations now mutually exclusive
- Vivillon's patterns are now viewable as forms with form names and unique Pokedex entries displayed.
### Fixes
- Correctly grants "They're Minerals!" advancement when planting a type gem
@@ -82,12 +129,11 @@
- Fixed Duraludon line not having any sleep animations
- Fixed Diglett line not having their faint animations
- Fixed Kingambit moving its legs while walking
- Fixed Alolan Diglett's cry not playing
- Fixed shiny alpha Snorlax using the non-shiny texture
- Various Structure fixes
- Fixed shiny pokemon under certain circumstances forgetting taught TMs
### Developer
- Fixed wrong order of operations in the code flow prior to the `FOSSIL_REVIVED` event causing pokemon to appear without entity link
- Fixed TestPartySlot command not correctly comparing the provided spec with the target Pokémon
### Molang & Datapacks
- A new `negate` variant for evolution requirements has been added, which will negate (invert) the provided inner condition.
-2
View File
@@ -1,2 +0,0 @@
Spec Doc: https://docs.google.com/document/d/1hEKKrT4JEagJBykx-k9K2BoeNxiMGahUWXnf8YQ85xo/edit?tab=t.0
Marshal: dhi_holo
+2 -5
View File
@@ -1,6 +1,3 @@
import utilities.gitBranch
import utilities.gitShortCommit
plugins {
id("cobblemon.root-conventions")
}
@@ -9,6 +6,6 @@ version = "${project.property("mod_version")}+${project.property("mc_version")}"
val isSnapshot = project.property("snapshot")?.equals("true") == true
if (isSnapshot) {
val fixedBranchName = gitBranch().substringAfter("/")
version = "$version-${fixedBranchName}-${gitShortCommit()}"
val fixedBranchName = versioning.info.branch.substringAfter("/")
version = "$version-${fixedBranchName}-${versioning.info.build}"
}
+6 -15
View File
@@ -1,8 +1,9 @@
import utilities.isSnapshot
import utilities.version
import utilities.gitBranch
import utilities.gitCommit
import java.time.OffsetDateTime
import java.time.ZoneOffset
import java.time.format.DateTimeFormatter
/*
*
@@ -71,14 +72,6 @@ tasks.withType<Test> {
}
}
// Git info lives in its own output dir (not processResources) so a new commit only rewrites this one file.
val writeGitInfo by tasks.registering(WriteProperties::class) {
destinationFile = layout.buildDirectory.file("generated/gitInfo/cobblemon-git.properties")
property("commit", gitCommit())
property("branch", gitBranch())
}
sourceSets.main { output.dir(mapOf("builtBy" to writeGitInfo), layout.buildDirectory.dir("generated/gitInfo")) }
tasks.processResources {
exclude("data/**/README.md")
}
@@ -105,13 +98,11 @@ sourceSets {
property("modid", "cobblemon")
property("version", project.version())
property("isSnapshot", if(rootProject.isSnapshot()) "true" else "false")
property("gitCommit", versioning.info.commit)
property("branch", versioning.info.branch)
System.getProperty("buildNumber")?.let { property("buildNumber", it) }
property("timestamp", OffsetDateTime.now(ZoneOffset.UTC).format(DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm:ss")) + " UTC")
}
}
}
}
// The platform jars are built from :common:jar, so the remapped common jars are only needed by `publish`
tasks.assemble {
setDependsOn(dependsOn.filterNot { (it as? TaskProvider<*>)?.name in setOf("remapJar", "remapSourcesJar") })
}
@@ -8,12 +8,8 @@ object CobblemonBuildDetails {
const val VERSION = "{{ version }}"
const val SNAPSHOT = {{ isSnapshot }}
// Read at runtime rather than templated in, so a new commit doesn't invalidate compiled code.
private val git = java.util.Properties().apply {
CobblemonBuildDetails::class.java.getResourceAsStream("/cobblemon-git.properties")?.use(::load)
}
@JvmField val GIT_COMMIT: String = git.getProperty("commit", "Not Specified")
@JvmField val BRANCH: String = git.getProperty("branch", "Not Specified")
const val GIT_COMMIT = "{{ gitCommit | default("Not Specified") }}"
const val BRANCH = "{{ branch | default("Not Specified") }}"
fun smallCommitHash(): String {
return this.GIT_COMMIT.substring(0, 7)
@@ -12,7 +12,6 @@ import com.cobblemon.mod.common.api.apricorn.Apricorn
import com.cobblemon.mod.common.api.pokemon.stats.Stats
import com.cobblemon.mod.common.block.*
import com.cobblemon.mod.common.block.LecternBlock
import com.cobblemon.mod.common.block.appliances.*
import com.cobblemon.mod.common.block.MintBlock.MintType
import com.cobblemon.mod.common.block.campfirepot.CampfireBlock
import com.cobblemon.mod.common.block.campfirepot.CampfirePotBlock
@@ -29,7 +28,12 @@ import com.cobblemon.mod.common.block.sign.CobblemonSignBlock
import com.cobblemon.mod.common.block.sign.CobblemonWallHangingSignBlock
import com.cobblemon.mod.common.block.sign.CobblemonWallSignBlock
import com.cobblemon.mod.common.block.tmmachine.TMMachineBlock
import com.cobblemon.mod.common.mixin.invoker.*
import com.cobblemon.mod.common.mixin.invoker.BlocksInvoker
import com.cobblemon.mod.common.mixin.invoker.DoorBlockInvoker
import com.cobblemon.mod.common.mixin.invoker.FireBlockInvoker
import com.cobblemon.mod.common.mixin.invoker.PressurePlateBlockInvoker
import com.cobblemon.mod.common.mixin.invoker.StairsBlockInvoker
import com.cobblemon.mod.common.mixin.invoker.TrapdoorBlockInvoker
import com.cobblemon.mod.common.platform.PlatformRegistry
import com.cobblemon.mod.common.util.cobblemonResource
import net.minecraft.core.BlockPos
@@ -805,93 +809,6 @@ object CobblemonBlocks : PlatformRegistry<Registry<Block>, ResourceKey<Registry<
@JvmField
val DISPLAY_CASE = create("display_case", DisplayCaseBlock(BlockBehaviour.Properties.of().sound(CobblemonSounds.DISPLAY_CASE_SOUNDS).noOcclusion().pushReaction(PushReaction.BLOCK).mapColor(MapColor.STONE).strength(0.3F).requiresCorrectToolForDrops()))
//Rotom Blocks
//Oven
@JvmField
val COPPER_OVEN = create("copper_oven", WeatheringCopperOvenBlock(WeatheringCopper.WeatherState.UNAFFECTED, BlockBehaviour.Properties.of().mapColor(MapColor.COLOR_ORANGE).requiresCorrectToolForDrops().strength(3.0f, 6.0f).sound(SoundType.COPPER).pushReaction(PushReaction.BLOCK)))
@JvmField
val EXPOSED_COPPER_OVEN = create("exposed_copper_oven", WeatheringCopperOvenBlock(WeatheringCopper.WeatherState.EXPOSED, BlockBehaviour.Properties.ofFullCopy(COPPER_OVEN).mapColor(MapColor.TERRACOTTA_LIGHT_GRAY)))
@JvmField
val WEATHERED_COPPER_OVEN = create("weathered_copper_oven", WeatheringCopperOvenBlock(WeatheringCopper.WeatherState.WEATHERED, BlockBehaviour.Properties.ofFullCopy(COPPER_OVEN).mapColor(MapColor.WARPED_STEM)))
@JvmField
val OXIDIZED_COPPER_OVEN = create("oxidized_copper_oven", WeatheringCopperOvenBlock(WeatheringCopper.WeatherState.OXIDIZED, BlockBehaviour.Properties.ofFullCopy(COPPER_OVEN).mapColor(MapColor.WARPED_NYLIUM)))
@JvmField
val WAXED_COPPER_OVEN = create("waxed_copper_oven", CopperOvenBlock(BlockBehaviour.Properties.ofFullCopy(COPPER_OVEN)))
@JvmField
val WAXED_EXPOSED_COPPER_OVEN = create("waxed_exposed_copper_oven", CopperOvenBlock(BlockBehaviour.Properties.ofFullCopy(EXPOSED_COPPER_OVEN)))
@JvmField
val WAXED_WEATHERED_COPPER_OVEN = create("waxed_weathered_copper_oven", CopperOvenBlock(BlockBehaviour.Properties.ofFullCopy(WEATHERED_COPPER_OVEN)))
@JvmField
val WAXED_OXIDIZED_COPPER_OVEN = create("waxed_oxidized_copper_oven", CopperOvenBlock(BlockBehaviour.Properties.ofFullCopy(OXIDIZED_COPPER_OVEN)))
//Washer
@JvmField
val COPPER_WASHER = create("copper_washer", WeatheringCopperWasherBlock(WeatheringCopper.WeatherState.UNAFFECTED, BlockBehaviour.Properties.of().mapColor(MapColor.COLOR_ORANGE).requiresCorrectToolForDrops().strength(3.0f, 6.0f).sound(SoundType.COPPER).pushReaction(PushReaction.BLOCK)))
@JvmField
val EXPOSED_COPPER_WASHER = create("exposed_copper_washer", WeatheringCopperWasherBlock(WeatheringCopper.WeatherState.EXPOSED, BlockBehaviour.Properties.ofFullCopy(COPPER_WASHER).mapColor(MapColor.TERRACOTTA_LIGHT_GRAY)))
@JvmField
val WEATHERED_COPPER_WASHER = create("weathered_copper_washer", WeatheringCopperWasherBlock(WeatheringCopper.WeatherState.WEATHERED, BlockBehaviour.Properties.ofFullCopy(COPPER_WASHER).mapColor(MapColor.WARPED_STEM)))
@JvmField
val OXIDIZED_COPPER_WASHER = create("oxidized_copper_washer", WeatheringCopperWasherBlock(WeatheringCopper.WeatherState.OXIDIZED, BlockBehaviour.Properties.ofFullCopy(COPPER_WASHER).mapColor(MapColor.WARPED_NYLIUM)))
@JvmField
val WAXED_COPPER_WASHER = create("waxed_copper_washer", CopperWasherBlock(BlockBehaviour.Properties.ofFullCopy(COPPER_WASHER)))
@JvmField
val WAXED_EXPOSED_COPPER_WASHER = create("waxed_exposed_copper_washer", CopperWasherBlock(BlockBehaviour.Properties.ofFullCopy(EXPOSED_COPPER_WASHER)))
@JvmField
val WAXED_WEATHERED_COPPER_WASHER = create("waxed_weathered_copper_washer", CopperWasherBlock(BlockBehaviour.Properties.ofFullCopy(WEATHERED_COPPER_WASHER)))
@JvmField
val WAXED_OXIDIZED_COPPER_WASHER = create("waxed_oxidized_copper_washer", CopperWasherBlock(BlockBehaviour.Properties.ofFullCopy(OXIDIZED_COPPER_WASHER)))
//Fan
@JvmField
val COPPER_FAN = create("copper_fan", WeatheringCopperFanBlock(WeatheringCopper.WeatherState.UNAFFECTED, BlockBehaviour.Properties.of().mapColor(MapColor.COLOR_ORANGE).requiresCorrectToolForDrops().strength(3.0f, 6.0f).sound(SoundType.COPPER).pushReaction(PushReaction.DESTROY)))
@JvmField
val EXPOSED_COPPER_FAN = create("exposed_copper_fan", WeatheringCopperFanBlock(WeatheringCopper.WeatherState.EXPOSED, BlockBehaviour.Properties.ofFullCopy(COPPER_FAN).mapColor(MapColor.TERRACOTTA_LIGHT_GRAY)))
@JvmField
val WEATHERED_COPPER_FAN = create("weathered_copper_fan", WeatheringCopperFanBlock(WeatheringCopper.WeatherState.WEATHERED, BlockBehaviour.Properties.ofFullCopy(COPPER_FAN).mapColor(MapColor.WARPED_STEM)))
@JvmField
val OXIDIZED_COPPER_FAN = create("oxidized_copper_fan", WeatheringCopperFanBlock(WeatheringCopper.WeatherState.OXIDIZED, BlockBehaviour.Properties.ofFullCopy(COPPER_FAN).mapColor(MapColor.WARPED_NYLIUM)))
@JvmField
val WAXED_COPPER_FAN = create("waxed_copper_fan", CopperFanBlock(BlockBehaviour.Properties.ofFullCopy(COPPER_FAN)))
@JvmField
val WAXED_EXPOSED_COPPER_FAN = create("waxed_exposed_copper_fan", CopperFanBlock(BlockBehaviour.Properties.ofFullCopy(EXPOSED_COPPER_FAN)))
@JvmField
val WAXED_WEATHERED_COPPER_FAN = create("waxed_weathered_copper_fan", CopperFanBlock(BlockBehaviour.Properties.ofFullCopy(WEATHERED_COPPER_FAN)))
@JvmField
val WAXED_OXIDIZED_COPPER_FAN = create("waxed_oxidized_copper_fan", CopperFanBlock(BlockBehaviour.Properties.ofFullCopy(OXIDIZED_COPPER_FAN)))
//Mower
@JvmField
val COPPER_MOWER = create("copper_mower", WeatheringCopperMowerBlock(WeatheringCopper.WeatherState.UNAFFECTED, BlockBehaviour.Properties.of().mapColor(MapColor.COLOR_ORANGE).requiresCorrectToolForDrops().strength(3.0f, 6.0f).sound(SoundType.COPPER).pushReaction(PushReaction.NORMAL)))
@JvmField
val EXPOSED_COPPER_MOWER = create("exposed_copper_mower", WeatheringCopperMowerBlock(WeatheringCopper.WeatherState.EXPOSED, BlockBehaviour.Properties.ofFullCopy(COPPER_MOWER).mapColor(MapColor.TERRACOTTA_LIGHT_GRAY)))
@JvmField
val WEATHERED_COPPER_MOWER = create("weathered_copper_mower", WeatheringCopperMowerBlock(WeatheringCopper.WeatherState.WEATHERED, BlockBehaviour.Properties.ofFullCopy(COPPER_MOWER).mapColor(MapColor.WARPED_STEM)))
@JvmField
val OXIDIZED_COPPER_MOWER = create("oxidized_copper_mower", WeatheringCopperMowerBlock(WeatheringCopper.WeatherState.OXIDIZED, BlockBehaviour.Properties.ofFullCopy(COPPER_MOWER).mapColor(MapColor.WARPED_NYLIUM)))
@JvmField
val WAXED_COPPER_MOWER = create("waxed_copper_mower", CopperMowerBlock(BlockBehaviour.Properties.ofFullCopy(COPPER_MOWER)))
@JvmField
val WAXED_EXPOSED_COPPER_MOWER = create("waxed_exposed_copper_mower", CopperMowerBlock(BlockBehaviour.Properties.ofFullCopy(EXPOSED_COPPER_MOWER)))
@JvmField
val WAXED_WEATHERED_COPPER_MOWER = create("waxed_weathered_copper_mower", CopperMowerBlock(BlockBehaviour.Properties.ofFullCopy(WEATHERED_COPPER_MOWER)))
@JvmField
val WAXED_OXIDIZED_COPPER_MOWER = create("waxed_oxidized_copper_mower", CopperMowerBlock(BlockBehaviour.Properties.ofFullCopy(OXIDIZED_COPPER_MOWER)))
//Fridge
@JvmField
val COPPER_FRIDGE = create("copper_fridge", WeatheringCopperFridgeBlock(WeatheringCopper.WeatherState.UNAFFECTED, BlockBehaviour.Properties.of().mapColor(MapColor.COLOR_ORANGE).requiresCorrectToolForDrops().strength(3.0f, 6.0f).sound(SoundType.COPPER).pushReaction(PushReaction.BLOCK)))
@JvmField
val EXPOSED_COPPER_FRIDGE = create("exposed_copper_fridge", WeatheringCopperFridgeBlock(WeatheringCopper.WeatherState.EXPOSED, BlockBehaviour.Properties.ofFullCopy(COPPER_FRIDGE).mapColor(MapColor.TERRACOTTA_LIGHT_GRAY)))
@JvmField
val WEATHERED_COPPER_FRIDGE = create("weathered_copper_fridge", WeatheringCopperFridgeBlock(WeatheringCopper.WeatherState.WEATHERED, BlockBehaviour.Properties.ofFullCopy(COPPER_FRIDGE).mapColor(MapColor.WARPED_STEM)))
@JvmField
val OXIDIZED_COPPER_FRIDGE = create("oxidized_copper_fridge", WeatheringCopperFridgeBlock(WeatheringCopper.WeatherState.OXIDIZED, BlockBehaviour.Properties.ofFullCopy(COPPER_FRIDGE).mapColor(MapColor.WARPED_NYLIUM)))
@JvmField
val WAXED_COPPER_FRIDGE = create("waxed_copper_fridge", CopperFridgeBlock(BlockBehaviour.Properties.ofFullCopy(COPPER_FRIDGE)))
@JvmField
val WAXED_EXPOSED_COPPER_FRIDGE = create("waxed_exposed_copper_fridge", CopperFridgeBlock(BlockBehaviour.Properties.ofFullCopy(EXPOSED_COPPER_FRIDGE)))
@JvmField
val WAXED_WEATHERED_COPPER_FRIDGE = create("waxed_weathered_copper_fridge", CopperFridgeBlock(BlockBehaviour.Properties.ofFullCopy(WEATHERED_COPPER_FRIDGE)))
@JvmField
val WAXED_OXIDIZED_COPPER_FRIDGE = create("waxed_oxidized_copper_fridge", CopperFridgeBlock(BlockBehaviour.Properties.ofFullCopy(OXIDIZED_COPPER_FRIDGE)))
// TODO after 1.7
// @JvmField
// val INCENSE_SWEET = create("incense_sweet", SweetIncenseBlock(BlockBehaviour.Properties.of().sound(CobblemonSounds.DISPLAY_CASE_SOUNDS).noOcclusion().pushReaction(PushReaction.BLOCK).mapColor(MapColor.STONE).strength(0.3F)))
@@ -959,57 +876,6 @@ object CobblemonBlocks : PlatformRegistry<Registry<Block>, ResourceKey<Registry<
SACCHARINE_LOG to STRIPPED_SACCHARINE_LOG,
SACCHARINE_LOG_SLATHERED to STRIPPED_SACCHARINE_LOG
)
/**Same idea as above, but for Copper Oxidation over time (or when inverted, scraping with an axe)*/
fun oxidizingBlocks(): Map<Block, Block> = mapOf(
//Ovens
COPPER_OVEN to EXPOSED_COPPER_OVEN,
EXPOSED_COPPER_OVEN to WEATHERED_COPPER_OVEN,
WEATHERED_COPPER_OVEN to OXIDIZED_COPPER_OVEN,
//Washers
COPPER_WASHER to EXPOSED_COPPER_WASHER,
EXPOSED_COPPER_WASHER to WEATHERED_COPPER_WASHER,
WEATHERED_COPPER_WASHER to OXIDIZED_COPPER_WASHER,
//Fans
COPPER_FAN to EXPOSED_COPPER_FAN,
EXPOSED_COPPER_FAN to WEATHERED_COPPER_FAN,
WEATHERED_COPPER_FAN to OXIDIZED_COPPER_FAN,
//Fridges
COPPER_FRIDGE to EXPOSED_COPPER_FRIDGE,
EXPOSED_COPPER_FRIDGE to WEATHERED_COPPER_FRIDGE,
WEATHERED_COPPER_FRIDGE to OXIDIZED_COPPER_FRIDGE,
//Mowers
COPPER_MOWER to EXPOSED_COPPER_MOWER,
EXPOSED_COPPER_MOWER to WEATHERED_COPPER_MOWER,
WEATHERED_COPPER_MOWER to OXIDIZED_COPPER_MOWER
)
/**Same idea as above, but for waxing blocks with Honeycomb (or unwaxing them with an axe)*/
fun waxingBlocks(): Map<Block, Block> = mapOf(
//Ovens
COPPER_OVEN to WAXED_COPPER_OVEN,
EXPOSED_COPPER_OVEN to WAXED_EXPOSED_COPPER_OVEN,
WEATHERED_COPPER_OVEN to WAXED_WEATHERED_COPPER_OVEN,
OXIDIZED_COPPER_OVEN to WAXED_OXIDIZED_COPPER_OVEN,
//Washers
COPPER_WASHER to WAXED_COPPER_WASHER,
EXPOSED_COPPER_WASHER to WAXED_EXPOSED_COPPER_WASHER,
WEATHERED_COPPER_WASHER to WAXED_WEATHERED_COPPER_WASHER,
OXIDIZED_COPPER_WASHER to WAXED_OXIDIZED_COPPER_WASHER,
//Fans
COPPER_FAN to WAXED_COPPER_FAN,
EXPOSED_COPPER_FAN to WAXED_EXPOSED_COPPER_FAN,
WEATHERED_COPPER_FAN to WAXED_WEATHERED_COPPER_FAN,
OXIDIZED_COPPER_FAN to WAXED_OXIDIZED_COPPER_FAN,
//Fridges
COPPER_FRIDGE to WAXED_COPPER_FRIDGE,
EXPOSED_COPPER_FRIDGE to WAXED_EXPOSED_COPPER_FRIDGE,
WEATHERED_COPPER_FRIDGE to WAXED_WEATHERED_COPPER_FRIDGE,
OXIDIZED_COPPER_FRIDGE to WAXED_OXIDIZED_COPPER_FRIDGE,
//Mowers
COPPER_MOWER to WAXED_COPPER_MOWER,
EXPOSED_COPPER_MOWER to WAXED_EXPOSED_COPPER_MOWER,
WEATHERED_COPPER_MOWER to WAXED_WEATHERED_COPPER_MOWER,
OXIDIZED_COPPER_MOWER to WAXED_OXIDIZED_COPPER_MOWER
)
private fun apricornBlock(name: String, apricorn: Apricorn): ApricornBlock = this.create(name, ApricornBlock(BlockBehaviour.Properties.of().mapColor(apricorn.mapColor()).randomTicks().strength(Blocks.OAK_LOG.defaultDestroyTime(), Blocks.OAK_LOG.explosionResistance).sound(SoundType.WOOD).noOcclusion(), apricorn))
@@ -12,7 +12,6 @@ import com.cobblemon.mod.common.api.net.NetworkPacket
import com.mojang.brigadier.arguments.ArgumentType
import kotlin.reflect.KClass
import net.minecraft.commands.synchronization.ArgumentTypeInfo
import net.minecraft.core.HolderLookup
import net.minecraft.resources.ResourceKey
import net.minecraft.resources.ResourceLocation
import net.minecraft.server.MinecraftServer
@@ -169,16 +168,12 @@ interface CobblemonImplementation {
* TODO
*
* @param identifier
* @param reloaderFactory
* @param reloader
* @param type
* @param dependencies
*/
fun registerResourceReloader(
identifier: ResourceLocation,
type: PackType,
dependencies: Collection<ResourceLocation>,
reloaderFactory: (HolderLookup.Provider) -> PreparableReloadListener
)
fun registerResourceReloader(identifier: ResourceLocation, reloader: PreparableReloadListener, type: PackType, dependencies: Collection<ResourceLocation>)
/**
* TODO
*
@@ -1517,87 +1517,6 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
@JvmField
val BLANK_TM = this.create("blank_tm", CobblemonItem(Item.Properties()))
@JvmField
val COPPER_OVEN = this.create("copper_oven", BlockItem(CobblemonBlocks.COPPER_OVEN, Item.Properties()))
@JvmField
val EXPOSED_COPPER_OVEN = this.create("exposed_copper_oven", BlockItem(CobblemonBlocks.EXPOSED_COPPER_OVEN, Item.Properties()))
@JvmField
val WEATHERED_COPPER_OVEN = this.create("weathered_copper_oven", BlockItem(CobblemonBlocks.WEATHERED_COPPER_OVEN, Item.Properties()))
@JvmField
val OXIDIZED_COPPER_OVEN = this.create("oxidized_copper_oven", BlockItem(CobblemonBlocks.OXIDIZED_COPPER_OVEN, Item.Properties()))
@JvmField
val WAXED_COPPER_OVEN = this.create("waxed_copper_oven", BlockItem(CobblemonBlocks.WAXED_COPPER_OVEN, Item.Properties()))
@JvmField
val WAXED_EXPOSED_COPPER_OVEN = this.create("waxed_exposed_copper_oven", BlockItem(CobblemonBlocks.WAXED_EXPOSED_COPPER_OVEN, Item.Properties()))
@JvmField
val WAXED_WEATHERED_COPPER_OVEN = this.create("waxed_weathered_copper_oven", BlockItem(CobblemonBlocks.WAXED_WEATHERED_COPPER_OVEN, Item.Properties()))
@JvmField
val WAXED_OXIDIZED_COPPER_OVEN = this.create("waxed_oxidized_copper_oven", BlockItem(CobblemonBlocks.WAXED_OXIDIZED_COPPER_OVEN, Item.Properties()))
@JvmField
val COPPER_WASHER = this.create("copper_washer", BlockItem(CobblemonBlocks.COPPER_WASHER, Item.Properties()))
@JvmField
val EXPOSED_COPPER_WASHER = this.create("exposed_copper_washer", BlockItem(CobblemonBlocks.EXPOSED_COPPER_WASHER, Item.Properties()))
@JvmField
val WEATHERED_COPPER_WASHER = this.create("weathered_copper_washer", BlockItem(CobblemonBlocks.WEATHERED_COPPER_WASHER, Item.Properties()))
@JvmField
val OXIDIZED_COPPER_WASHER = this.create("oxidized_copper_washer", BlockItem(CobblemonBlocks.OXIDIZED_COPPER_WASHER, Item.Properties()))
@JvmField
val WAXED_COPPER_WASHER = this.create("waxed_copper_washer", BlockItem(CobblemonBlocks.WAXED_COPPER_WASHER, Item.Properties()))
@JvmField
val WAXED_EXPOSED_COPPER_WASHER = this.create("waxed_exposed_copper_washer", BlockItem(CobblemonBlocks.WAXED_EXPOSED_COPPER_WASHER, Item.Properties()))
@JvmField
val WAXED_WEATHERED_COPPER_WASHER = this.create("waxed_weathered_copper_washer", BlockItem(CobblemonBlocks.WAXED_WEATHERED_COPPER_WASHER, Item.Properties()))
@JvmField
val WAXED_OXIDIZED_COPPER_WASHER = this.create("waxed_oxidized_copper_washer", BlockItem(CobblemonBlocks.WAXED_OXIDIZED_COPPER_WASHER, Item.Properties()))
@JvmField
val COPPER_FAN = this.create("copper_fan", BlockItem(CobblemonBlocks.COPPER_FAN, Item.Properties()))
@JvmField
val EXPOSED_COPPER_FAN = this.create("exposed_copper_fan", BlockItem(CobblemonBlocks.EXPOSED_COPPER_FAN, Item.Properties()))
@JvmField
val WEATHERED_COPPER_FAN = this.create("weathered_copper_fan", BlockItem(CobblemonBlocks.WEATHERED_COPPER_FAN, Item.Properties()))
@JvmField
val OXIDIZED_COPPER_FAN = this.create("oxidized_copper_fan", BlockItem(CobblemonBlocks.OXIDIZED_COPPER_FAN, Item.Properties()))
@JvmField
val WAXED_COPPER_FAN = this.create("waxed_copper_fan", BlockItem(CobblemonBlocks.WAXED_COPPER_FAN, Item.Properties()))
@JvmField
val WAXED_EXPOSED_COPPER_FAN = this.create("waxed_exposed_copper_fan", BlockItem(CobblemonBlocks.WAXED_EXPOSED_COPPER_FAN, Item.Properties()))
@JvmField
val WAXED_WEATHERED_COPPER_FAN = this.create("waxed_weathered_copper_fan", BlockItem(CobblemonBlocks.WAXED_WEATHERED_COPPER_FAN, Item.Properties()))
@JvmField
val WAXED_OXIDIZED_COPPER_FAN = this.create("waxed_oxidized_copper_fan", BlockItem(CobblemonBlocks.WAXED_OXIDIZED_COPPER_FAN, Item.Properties()))
@JvmField
val COPPER_MOWER = this.create("copper_mower", BlockItem(CobblemonBlocks.COPPER_MOWER, Item.Properties()))
@JvmField
val EXPOSED_COPPER_MOWER = this.create("exposed_copper_mower", BlockItem(CobblemonBlocks.EXPOSED_COPPER_MOWER, Item.Properties()))
@JvmField
val WEATHERED_COPPER_MOWER = this.create("weathered_copper_mower", BlockItem(CobblemonBlocks.WEATHERED_COPPER_MOWER, Item.Properties()))
@JvmField
val OXIDIZED_COPPER_MOWER = this.create("oxidized_copper_mower", BlockItem(CobblemonBlocks.OXIDIZED_COPPER_MOWER, Item.Properties()))
@JvmField
val WAXED_COPPER_MOWER = this.create("waxed_copper_mower", BlockItem(CobblemonBlocks.WAXED_COPPER_MOWER, Item.Properties()))
@JvmField
val WAXED_EXPOSED_COPPER_MOWER = this.create("waxed_exposed_copper_mower", BlockItem(CobblemonBlocks.WAXED_EXPOSED_COPPER_MOWER, Item.Properties()))
@JvmField
val WAXED_WEATHERED_COPPER_MOWER = this.create("waxed_weathered_copper_mower", BlockItem(CobblemonBlocks.WAXED_WEATHERED_COPPER_MOWER, Item.Properties()))
@JvmField
val WAXED_OXIDIZED_COPPER_MOWER = this.create("waxed_oxidized_copper_mower", BlockItem(CobblemonBlocks.WAXED_OXIDIZED_COPPER_MOWER, Item.Properties()))
@JvmField
val COPPER_FRIDGE = this.create("copper_fridge", BlockItem(CobblemonBlocks.COPPER_FRIDGE, Item.Properties()))
@JvmField
val EXPOSED_COPPER_FRIDGE = this.create("exposed_copper_fridge", BlockItem(CobblemonBlocks.EXPOSED_COPPER_FRIDGE, Item.Properties()))
@JvmField
val WEATHERED_COPPER_FRIDGE = this.create("weathered_copper_fridge", BlockItem(CobblemonBlocks.WEATHERED_COPPER_FRIDGE, Item.Properties()))
@JvmField
val OXIDIZED_COPPER_FRIDGE = this.create("oxidized_copper_fridge", BlockItem(CobblemonBlocks.OXIDIZED_COPPER_FRIDGE, Item.Properties()))
@JvmField
val WAXED_COPPER_FRIDGE = this.create("waxed_copper_fridge", BlockItem(CobblemonBlocks.WAXED_COPPER_FRIDGE, Item.Properties()))
@JvmField
val WAXED_EXPOSED_COPPER_FRIDGE = this.create("waxed_exposed_copper_fridge", BlockItem(CobblemonBlocks.WAXED_EXPOSED_COPPER_FRIDGE, Item.Properties()))
@JvmField
val WAXED_WEATHERED_COPPER_FRIDGE = this.create("waxed_weathered_copper_fridge", BlockItem(CobblemonBlocks.WAXED_WEATHERED_COPPER_FRIDGE, Item.Properties()))
@JvmField
val WAXED_OXIDIZED_COPPER_FRIDGE = this.create("waxed_oxidized_copper_fridge", BlockItem(CobblemonBlocks.WAXED_OXIDIZED_COPPER_FRIDGE, Item.Properties()))
// Type Gems
@JvmField
val NORMAL_GEM = this.create("normal_gem", GemItem(Item.Properties(), CobblemonBlocks.TYPE_GEM_CLUSTER_NORMAL))
@@ -1,93 +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.data
import com.cobblemon.mod.common.util.endsWith
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import net.minecraft.core.HolderLookup
import java.io.BufferedReader
import java.io.File
import java.util.concurrent.ExecutionException
import net.minecraft.resources.ResourceLocation
import net.minecraft.server.packs.PackType
import net.minecraft.server.packs.resources.ResourceManager
/**
* A [DataRegistry] that consumes JSON files.
* Every deserialized instance is attached to an [Identifier].
* For example a file under data/mymod/[resourcePath]/entry.json would be backed by the identifier modid:entry.
*
* @param T The type of the data consumed by this registry.
*
* @author Licious
* @since August 5th, 2022
*/
interface ServerJsonDataRegistry<T> : DataRegistry {
/**
* The [TypeToken] of type [T].
*/
val typeToken: TypeToken<T>
/**
* The folder location for the data this registry will consume.
*/
val resourcePath: String
override val type: PackType
get() = PackType.SERVER_DATA
override fun reload(manager: ResourceManager) {
//NO-OP, handled by reload(manager, registry)
}
fun reload(manager: ResourceManager, registry: HolderLookup.Provider) {
val gson = setupParser(registry)
val data = hashMapOf<ResourceLocation, T>()
manager.listResources(resourcePath) { path -> path.endsWith(JSON_EXTENSION) }.forEach { (identifier, resource) ->
if (identifier.namespace == "pixelmon") {
return@forEach
}
resource.open().use { stream ->
stream.bufferedReader().use { reader ->
val resolvedIdentifier = ResourceLocation.fromNamespaceAndPath(identifier.namespace, File(identifier.path).nameWithoutExtension)
data[resolvedIdentifier] = parse(reader, resolvedIdentifier, gson)
}
}
}
reload(data, registry)
}
fun parse(reader: BufferedReader, identifier: ResourceLocation, gson: Gson): T {
return try {
gson.fromJson(reader, typeToken.type)
} catch (exception: Exception) {
throw ExecutionException("Error loading JSON for data: $identifier", exception)
}
}
/**
* Allows the creation of [Gson] instances which have adapters that are registry-aware, e.g. [com.cobblemon.mod.common.pokemon.evolution.adapters.LegacyItemConditionWrapperAdapter]
*/
fun setupParser(registry: HolderLookup.Provider): Gson
/**
* Reloads this registry from the deserialized data.
*
* @param data A map of the data associating an instance to the respective identifier from the [ResourceManager].
*/
fun reload(data: Map<ResourceLocation, T>, registry: HolderLookup.Provider)
companion object {
const val JSON_EXTENSION = ".json"
}
}
@@ -40,7 +40,7 @@ object Fossils: JsonDataRegistry<Fossil> {
.registerTypeAdapter(ResourceLocation::class.java, IdentifierAdapter)
.registerTypeAdapter(PokemonProperties::class.java, pokemonPropertiesShortAdapter)
.registerTypeAdapter(TypeToken.getParameterized(RegistryLikeCondition::class.java, Item::class.java).type, ItemLikeConditionAdapter)
.registerTypeAdapter(ItemPredicate::class.java, LegacyItemConditionWrapperAdapter())
.registerTypeAdapter(ItemPredicate::class.java, LegacyItemConditionWrapperAdapter)
.create()
override val typeToken: TypeToken<Fossil> = TypeToken.get(Fossil::class.java)
@@ -10,7 +10,7 @@ package com.cobblemon.mod.common.api.interaction
import com.cobblemon.mod.common.Cobblemon
import com.cobblemon.mod.common.api.conditional.RegistryLikeCondition
import com.cobblemon.mod.common.api.data.ServerJsonDataRegistry
import com.cobblemon.mod.common.api.data.JsonDataRegistry
import com.cobblemon.mod.common.api.molang.ExpressionLike
import com.cobblemon.mod.common.api.pokemon.PokemonProperties
import com.cobblemon.mod.common.api.pokemon.requirement.Requirement
@@ -26,7 +26,6 @@ import com.google.gson.Gson
import com.google.gson.GsonBuilder
import com.google.gson.reflect.TypeToken
import net.minecraft.advancements.critereon.ItemPredicate
import net.minecraft.core.HolderLookup
import net.minecraft.resources.ResourceLocation
import net.minecraft.server.level.ServerPlayer
import net.minecraft.server.packs.PackType
@@ -37,31 +36,28 @@ import net.minecraft.world.level.block.Block
import net.minecraft.world.level.levelgen.structure.Structure
import net.minecraft.world.level.material.Fluid
object PokemonInteractions : ServerJsonDataRegistry<PokemonInteractionSet> {
object PokemonInteractions : JsonDataRegistry<PokemonInteractionSet> {
override val id = cobblemonResource("pokemon_interactions")
override val type = PackType.SERVER_DATA
override fun setupParser(registry: HolderLookup.Provider): Gson {
return GsonBuilder()
.registerTypeAdapter(ResourceLocation::class.java, IdentifierAdapter)
.registerTypeAdapter(PokemonProperties::class.java, pokemonPropertiesShortAdapter)
.registerTypeAdapter(ItemPredicate::class.java, LegacyItemConditionWrapperAdapter(registry))
.registerTypeAdapter(Requirement::class.java, CobblemonRequirementAdapter)
.registerTypeAdapter(InteractionEffect::class.java, InteractionEffectAdapter)
.registerTypeAdapter(ExpressionLike::class.java, ExpressionLikeAdapter)
.registerTypeAdapter(TypeToken.getParameterized(RegistryLikeCondition::class.java, Biome::class.java).type, BiomeLikeConditionAdapter)
.registerTypeAdapter(TypeToken.getParameterized(RegistryLikeCondition::class.java, Block::class.java).type, BlockLikeConditionAdapter)
.registerTypeAdapter(TypeToken.getParameterized(RegistryLikeCondition::class.java, Item::class.java).type, ItemLikeConditionAdapter)
.registerTypeAdapter(TypeToken.getParameterized(RegistryLikeCondition::class.java, Structure::class.java).type, StructureLikeConditionAdapter)
.registerTypeAdapter(TypeToken.getParameterized(RegistryLikeCondition::class.java, Fluid::class.java).type, FluidLikeConditionAdapter)
.registerTypeAdapter(IntRange::class.java, IntRangeAdapter)
.registerTypeAdapterFactory(LowerCaseEnumTypeAdapterFactory())
.setPrettyPrinting()
.create()
}
override val observable = SimpleObservable<PokemonInteractions>()
override val typeToken: TypeToken<PokemonInteractionSet> = TypeToken.get(PokemonInteractionSet::class.java)
override val resourcePath = "pokemon_interactions"
override val gson: Gson = GsonBuilder()
.registerTypeAdapter(ResourceLocation::class.java, IdentifierAdapter)
.registerTypeAdapter(PokemonProperties::class.java, pokemonPropertiesShortAdapter)
.registerTypeAdapter(ItemPredicate::class.java, LegacyItemConditionWrapperAdapter)
.registerTypeAdapter(Requirement::class.java, CobblemonRequirementAdapter)
.registerTypeAdapter(InteractionEffect::class.java, InteractionEffectAdapter)
.registerTypeAdapter(ExpressionLike::class.java, ExpressionLikeAdapter)
.registerTypeAdapter(TypeToken.getParameterized(RegistryLikeCondition::class.java, Biome::class.java).type, BiomeLikeConditionAdapter)
.registerTypeAdapter(TypeToken.getParameterized(RegistryLikeCondition::class.java, Block::class.java).type, BlockLikeConditionAdapter)
.registerTypeAdapter(TypeToken.getParameterized(RegistryLikeCondition::class.java, Item::class.java).type, ItemLikeConditionAdapter)
.registerTypeAdapter(TypeToken.getParameterized(RegistryLikeCondition::class.java, Structure::class.java).type, StructureLikeConditionAdapter)
.registerTypeAdapter(TypeToken.getParameterized(RegistryLikeCondition::class.java, Fluid::class.java).type, FluidLikeConditionAdapter)
.registerTypeAdapter(IntRange::class.java, IntRangeAdapter)
.registerTypeAdapterFactory(LowerCaseEnumTypeAdapterFactory())
.setPrettyPrinting()
.create()
val interactions = mutableListOf<PokemonInteractionSet>()
@@ -69,7 +65,7 @@ object PokemonInteractions : ServerJsonDataRegistry<PokemonInteractionSet> {
PokemonInteractionsSyncPacket(interactions).sendToPlayer(player)
}
override fun reload(data: Map<ResourceLocation, PokemonInteractionSet>, registry: HolderLookup.Provider) {
override fun reload(data: Map<ResourceLocation, PokemonInteractionSet>) {
interactions.clear()
val split = data.entries
.partition {
@@ -91,4 +87,4 @@ object PokemonInteractions : ServerJsonDataRegistry<PokemonInteractionSet> {
.flatMap { it.interactions }
.firstOrNull(interactionCheck)
}
}
}
@@ -128,7 +128,7 @@ object PokemonSpecies : JsonDataRegistry<Species> {
.registerTypeAdapter(TypeToken.getParameterized(RegistryLikeCondition::class.java, Fluid::class.java).type, FluidLikeConditionAdapter)
.registerTypeAdapter(EggGroup::class.java, EggGroupAdapter)
.registerTypeAdapter(MobEffect::class.java, RegistryElementAdapter<MobEffect>(BuiltInRegistries::MOB_EFFECT))
.registerTypeAdapter(ItemPredicate::class.java, LegacyItemConditionWrapperAdapter())
.registerTypeAdapter(ItemPredicate::class.java, LegacyItemConditionWrapperAdapter)
.registerTypeAdapter(RidingBehaviourSettings::class.java, RidingBehaviourSettingsAdapter)
.registerTypeAdapter(RideSoundSettingsList::class.java, RideSoundSettingsListAdapter)
.registerTypeAdapter(ObtainableItemCondition::class.java, ObtainableItemConditionAdapter)
@@ -1,87 +0,0 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.block.appliances
import com.cobblemon.mod.common.util.rotateShape
import com.mojang.serialization.MapCodec
import com.mojang.serialization.codecs.RecordCodecBuilder
import net.minecraft.core.BlockPos
import net.minecraft.core.Direction
import net.minecraft.world.item.context.BlockPlaceContext
import net.minecraft.world.level.BlockGetter
import net.minecraft.world.level.LevelAccessor
import net.minecraft.world.level.block.*
import net.minecraft.world.level.block.state.BlockState
import net.minecraft.world.level.block.state.StateDefinition
import net.minecraft.world.level.block.state.properties.BlockStateProperties
import net.minecraft.world.level.block.state.properties.BlockStateProperties.HORIZONTAL_FACING
import net.minecraft.world.level.block.state.properties.BlockStateProperties.WATERLOGGED
import net.minecraft.world.level.block.state.properties.BooleanProperty
import net.minecraft.world.level.material.FluidState
import net.minecraft.world.level.material.Fluids
import net.minecraft.world.phys.shapes.CollisionContext
import net.minecraft.world.phys.shapes.Shapes
import net.minecraft.world.phys.shapes.VoxelShape
//TODO: All the Fan appliance stuff
//TODO: Able to place the Fan on Walls, models and hitbox are there (blockstate would need edits to support it)
open class CopperFanBlock(settings: Properties) : HorizontalDirectionalBlock(settings), SimpleWaterloggedBlock {
companion object {
val CODEC: MapCodec<CopperFanBlock> = RecordCodecBuilder.mapCodec {
it.group(propertiesCodec()).apply(it, ::CopperFanBlock) }
//val FACE = //TODO: Floor/Wall
val POWER = BlockStateProperties.POWER;
val PUSH = BooleanProperty.create("push")
val FLOOR_HITBOX = Shapes.or(
Shapes.box(0.0625, 0.125, 0.4375, 0.9375, 1.0, 0.5625),
Shapes.box(0.375, 0.0, 0.375, 0.625, 0.125, 0.625))
val WALL_HITBOX = Shapes.box(0.0625, 0.0625, 0.875, 0.9375, 0.9375, 1.0)
}
init {
registerDefaultState(stateDefinition.any()
.setValue(HORIZONTAL_FACING, Direction.NORTH)
.setValue(WATERLOGGED, false)
//.setValue(FACE, AttachFace.FLOOR)
.setValue(POWER, 0)
.setValue(PUSH, true) //If True, fan pushes entities, If False, fan is cosmetic only
)
}
override fun codec(): MapCodec<CopperFanBlock> = CODEC
override fun createBlockStateDefinition(builder: StateDefinition.Builder<Block, BlockState>) {
builder.add(HORIZONTAL_FACING, WATERLOGGED, /*FACE,*/ POWER, PUSH)
}
override fun getFluidState(blockState: BlockState): FluidState? = if (blockState.getValue(WATERLOGGED)) Fluids.WATER.getSource(false) else super.getFluidState(blockState)
override fun updateShape(state: BlockState, direction: Direction, neighborState: BlockState, world: LevelAccessor, pos: BlockPos, neighborPos: BlockPos): BlockState {
if (state.getValue(WATERLOGGED)) {
world.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world))
}
return if (state.getValue(HORIZONTAL_FACING).opposite == direction && !state.canSurvive(world, pos)) Blocks.AIR.defaultBlockState()
else super.updateShape(state, direction, neighborState, world, pos, neighborPos)
}
override fun getCollisionShape(state: BlockState, level: BlockGetter, pos: BlockPos, context: CollisionContext): VoxelShape {
val direction = state.getValue(HORIZONTAL_FACING)
return rotateShape(Direction.NORTH, direction, FLOOR_HITBOX)
}
override fun getShape(state: BlockState, level: BlockGetter, pos: BlockPos, context: CollisionContext): VoxelShape {
return getCollisionShape(state, level, pos, context)
}
override fun getStateForPlacement(context: BlockPlaceContext): BlockState? {
val fluidState = context.level.getFluidState(context.clickedPos)
return super.getStateForPlacement(context)?.setValue(HORIZONTAL_FACING, context.horizontalDirection.opposite)?.setValue(WATERLOGGED, fluidState.type === Fluids.WATER)
}
}
@@ -1,153 +0,0 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.block.appliances
import com.cobblemon.mod.common.util.rotateShape
import com.mojang.serialization.MapCodec
import com.mojang.serialization.codecs.RecordCodecBuilder
import net.minecraft.core.BlockPos
import net.minecraft.core.Direction
import net.minecraft.util.StringRepresentable
import net.minecraft.world.entity.LivingEntity
import net.minecraft.world.entity.player.Player
import net.minecraft.world.item.ItemStack
import net.minecraft.world.item.context.BlockPlaceContext
import net.minecraft.world.level.BlockGetter
import net.minecraft.world.level.Level
import net.minecraft.world.level.LevelAccessor
import net.minecraft.world.level.LevelReader
import net.minecraft.world.level.block.*
import net.minecraft.world.level.block.state.BlockState
import net.minecraft.world.level.block.state.StateDefinition
import net.minecraft.world.level.block.state.properties.BlockStateProperties
import net.minecraft.world.level.block.state.properties.BlockStateProperties.HORIZONTAL_FACING
import net.minecraft.world.level.block.state.properties.BlockStateProperties.WATERLOGGED
import net.minecraft.world.level.block.state.properties.BooleanProperty
import net.minecraft.world.level.block.state.properties.DoubleBlockHalf
import net.minecraft.world.level.block.state.properties.EnumProperty
import net.minecraft.world.level.material.FluidState
import net.minecraft.world.level.material.Fluids
import net.minecraft.world.phys.shapes.CollisionContext
import net.minecraft.world.phys.shapes.Shapes
import net.minecraft.world.phys.shapes.VoxelShape
//TODO: Oxidation/Waxing/Scraping not breaking the blocks
//TODO: All the Fridge appliance stuff
open class CopperFridgeBlock(settings: Properties) : HorizontalDirectionalBlock(settings), SimpleWaterloggedBlock {
companion object {
val CODEC: MapCodec<CopperFridgeBlock> = RecordCodecBuilder.mapCodec {
it.group(propertiesCodec()).apply(it, ::CopperFridgeBlock) }
val HALF: EnumProperty<DoubleBlockHalf> = BlockStateProperties.DOUBLE_BLOCK_HALF
val POWERED = BooleanProperty.create("powered")
val LOWER_HITBOX = Shapes.or(
Shapes.box(0.0625, 0.0, 0.125, 0.9375, 0.0625, 0.9375),
Shapes.box(0.0, 0.0625, 0.0625, 1.0, 1.0, 1.0))
val UPPER_HITBOX = Shapes.or(
Shapes.box(0.0, 0.0, 0.0625, 1.0, 1.0, 1.0),
Shapes.box(0.25, 0.125, 0.0, 0.375, 0.3125, 0.0625),
Shapes.box(0.625, 0.125, 0.0, 0.75, 0.3125, 0.0625))
val UPPER_COLLISSIONBOX = Shapes.box(0.0, 0.0, 0.0625, 1.0, 1.0, 1.0)
//The handles get ignored by entity collission, because it feels nicer, but still count as part of the hitbox
}
init {
registerDefaultState(stateDefinition.any()
.setValue(HORIZONTAL_FACING, Direction.NORTH)
.setValue(HALF, DoubleBlockHalf.LOWER)
.setValue(WATERLOGGED, false)
.setValue(POWERED, false)
)
}
override fun codec(): MapCodec<CopperFridgeBlock> = CODEC
override fun createBlockStateDefinition(builder: StateDefinition.Builder<Block, BlockState>) {
builder.add(HORIZONTAL_FACING, HALF, WATERLOGGED, POWERED)
}
override fun getFluidState(blockState: BlockState): FluidState? = if (blockState.getValue(WATERLOGGED)) Fluids.WATER.getSource(false) else super.getFluidState(blockState)
override fun updateShape(state: BlockState, direction: Direction, neighborState: BlockState, world: LevelAccessor, pos: BlockPos, neighborPos: BlockPos): BlockState {
if (state.getValue(WATERLOGGED)) {
world.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world))
}
val isFridge = neighborState.`is`(this)
val half = state.getValue(HALF)
if (!isFridge && half == DoubleBlockHalf.UPPER && neighborPos == pos.below()) {
return Blocks.AIR.defaultBlockState()
} else if (!isFridge && half == DoubleBlockHalf.LOWER && neighborPos == pos.above()) {
return Blocks.AIR.defaultBlockState()
}
return state
}
override fun getCollisionShape(state: BlockState, level: BlockGetter, pos: BlockPos, context: CollisionContext): VoxelShape {
val direction = state.getValue(HORIZONTAL_FACING)
return if (state.getValue(HALF) == DoubleBlockHalf.LOWER) {
rotateShape(Direction.NORTH, direction, LOWER_HITBOX)
} else {
rotateShape(Direction.NORTH, direction, UPPER_COLLISSIONBOX)
}
}
override fun getShape(state: BlockState, level: BlockGetter, pos: BlockPos, context: CollisionContext): VoxelShape {
val direction = state.getValue(HORIZONTAL_FACING)
return if (state.getValue(HALF) == DoubleBlockHalf.LOWER) {
rotateShape(Direction.NORTH, direction, LOWER_HITBOX)
} else {
rotateShape(Direction.NORTH, direction, UPPER_HITBOX)
}
}
override fun setPlacedBy(world: Level, pos: BlockPos, state: BlockState, placer: LivingEntity?, itemStack: ItemStack) {
world.setBlock(pos.above(),
state
.setValue(HALF, DoubleBlockHalf.UPPER)
.setValue(WATERLOGGED, world.getFluidState((pos.above())).type == Fluids.WATER)
, 3)
world.blockUpdated(pos, Blocks.AIR)
state.updateNeighbourShapes(world, pos, 3)
}
override fun getStateForPlacement(blockPlaceContext: BlockPlaceContext): BlockState? {
val abovePosition = blockPlaceContext.clickedPos.above()
val world = blockPlaceContext.level
if (world.getBlockState(abovePosition).canBeReplaced(blockPlaceContext) && !world.isOutsideBuildHeight(abovePosition)) {
return defaultBlockState()
.setValue(FACING, blockPlaceContext.horizontalDirection.opposite)
.setValue(HALF, DoubleBlockHalf.LOWER)
.setValue(WATERLOGGED, blockPlaceContext.level.getFluidState(blockPlaceContext.clickedPos).type == Fluids.WATER)
}
return null
}
override fun canSurvive(state: BlockState, world: LevelReader, pos: BlockPos): Boolean {
val blockPos = pos.below()
val blockState = world.getBlockState(blockPos)
return if (state.getValue(HALF) == DoubleBlockHalf.LOWER) blockState.isFaceSturdy(world, blockPos, Direction.UP) else blockState.`is`(this)
}
override fun playerWillDestroy(world: Level, pos: BlockPos, state: BlockState, player: Player): BlockState {
if (!world.isClientSide && player.isCreative) {
var blockPos: BlockPos = BlockPos.ZERO
var blockState: BlockState = state
val half = state.getValue(HALF)
if (half == DoubleBlockHalf.UPPER && world.getBlockState(pos.below().also { blockPos = it }).also { blockState = it }.`is`(state.block) && blockState.getValue(
HALF
) == DoubleBlockHalf.LOWER) {
val blockState2 = if (blockState.fluidState.`is`(Fluids.WATER)) Blocks.WATER.defaultBlockState() else Blocks.AIR.defaultBlockState()
world.setBlock(blockPos, blockState2, UPDATE_ALL or UPDATE_SUPPRESS_DROPS)
world.levelEvent(player, LevelEvent.PARTICLES_DESTROY_BLOCK, blockPos, getId(blockState))
}
}
return super.playerWillDestroy(world, pos, state, player)
}
}
@@ -1,92 +0,0 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.block.appliances
import com.cobblemon.mod.common.util.rotateShape
import com.mojang.serialization.MapCodec
import com.mojang.serialization.codecs.RecordCodecBuilder
import net.minecraft.core.BlockPos
import net.minecraft.core.Direction
import net.minecraft.world.item.context.BlockPlaceContext
import net.minecraft.world.level.BlockGetter
import net.minecraft.world.level.LevelAccessor
import net.minecraft.world.level.block.*
import net.minecraft.world.level.block.state.BlockState
import net.minecraft.world.level.block.state.StateDefinition
import net.minecraft.world.level.block.state.properties.BlockStateProperties.HORIZONTAL_FACING
import net.minecraft.world.level.block.state.properties.BlockStateProperties.WATERLOGGED
import net.minecraft.world.level.block.state.properties.BooleanProperty
import net.minecraft.world.level.material.FluidState
import net.minecraft.world.level.material.Fluids
import net.minecraft.world.phys.shapes.CollisionContext
import net.minecraft.world.phys.shapes.Shapes
import net.minecraft.world.phys.shapes.VoxelShape
//TODO: All the Mower appliance stuff
open class CopperMowerBlock(settings: Properties) : HorizontalDirectionalBlock(settings), SimpleWaterloggedBlock {
companion object {
val CODEC: MapCodec<CopperMowerBlock> = RecordCodecBuilder.mapCodec {
it.group(propertiesCodec()).apply(it, ::CopperMowerBlock) }
val TRIGGERED = BooleanProperty.create("triggered")
val COLLISIONBOX = Shapes.or(
Shapes.box(0.1875, 0.0, 0.0, 0.8125, 0.375, 0.625),
Shapes.box(0.0625, 0.0, 0.625, 0.9375, 0.625, 1.0),
Shapes.box(0.125, 0.0, 0.1875, 0.875, 0.3125, 0.5),
//The next three lines are just so the handle does have collision, it feels awkward without it but it looks bad as hitbox
Shapes.box(0.375, 0.375, 0.375, 0.625, 0.625, 0.5625),
Shapes.box(0.4375, 0.5625, 0.5, 0.5625, 0.875, 0.625),
Shapes.box(0.25, 0.875, 0.5625, 0.75, 1.0, 0.6875)
)
val HITBOX = Shapes.or(
Shapes.box(0.1875, 0.0, 0.0, 0.8125, 0.375, 0.625),
Shapes.box(0.0625, 0.0, 0.625, 0.9375, 0.625, 1.0),
Shapes.box(0.125, 0.0, 0.1875, 0.875, 0.3125, 0.5)
)
}
init {
registerDefaultState(stateDefinition.any()
.setValue(HORIZONTAL_FACING, Direction.NORTH)
.setValue(WATERLOGGED, false)
.setValue(TRIGGERED, false)
)
}
override fun codec(): MapCodec<CopperMowerBlock> = CODEC
override fun createBlockStateDefinition(builder: StateDefinition.Builder<Block, BlockState>) {
builder.add(HORIZONTAL_FACING, WATERLOGGED, TRIGGERED)
}
override fun getFluidState(blockState: BlockState): FluidState? = if (blockState.getValue(WATERLOGGED)) Fluids.WATER.getSource(false) else super.getFluidState(blockState)
override fun updateShape(state: BlockState, direction: Direction, neighborState: BlockState, world: LevelAccessor, pos: BlockPos, neighborPos: BlockPos): BlockState {
if (state.getValue(WATERLOGGED)) {
world.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world))
}
return if (state.getValue(HORIZONTAL_FACING).opposite == direction && !state.canSurvive(world, pos)) Blocks.AIR.defaultBlockState()
else super.updateShape(state, direction, neighborState, world, pos, neighborPos)
}
override fun getCollisionShape(state: BlockState, level: BlockGetter, pos: BlockPos, context: CollisionContext): VoxelShape {
val direction = state.getValue(HORIZONTAL_FACING)
return rotateShape(Direction.NORTH, direction, COLLISIONBOX)
}
override fun getShape(state: BlockState, level: BlockGetter, pos: BlockPos, context: CollisionContext): VoxelShape {
val direction = state.getValue(HORIZONTAL_FACING)
return rotateShape(Direction.NORTH, direction, HITBOX)
}
override fun getStateForPlacement(context: BlockPlaceContext): BlockState? {
val fluidState = context.level.getFluidState(context.clickedPos)
return super.getStateForPlacement(context)?.setValue(HORIZONTAL_FACING, context.horizontalDirection)?.setValue(WATERLOGGED, fluidState.type === Fluids.WATER)
}
}
@@ -1,88 +0,0 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.block.appliances
import com.cobblemon.mod.common.util.rotateShape
import com.mojang.serialization.MapCodec
import com.mojang.serialization.codecs.RecordCodecBuilder
import net.minecraft.core.BlockPos
import net.minecraft.core.Direction
import net.minecraft.util.StringRepresentable
import net.minecraft.world.item.context.BlockPlaceContext
import net.minecraft.world.level.BlockGetter
import net.minecraft.world.level.LevelAccessor
import net.minecraft.world.level.block.*
import net.minecraft.world.level.block.state.BlockState
import net.minecraft.world.level.block.state.StateDefinition
import net.minecraft.world.level.block.state.properties.BlockStateProperties.HORIZONTAL_FACING
import net.minecraft.world.level.block.state.properties.BlockStateProperties.WATERLOGGED
import net.minecraft.world.level.block.state.properties.BooleanProperty
import net.minecraft.world.level.block.state.properties.EnumProperty
import net.minecraft.world.level.material.FluidState
import net.minecraft.world.level.material.Fluids
import net.minecraft.world.phys.shapes.CollisionContext
import net.minecraft.world.phys.shapes.Shapes
import net.minecraft.world.phys.shapes.VoxelShape
//TODO: All the Oven appliance stuff - Good Luck Coders
open class CopperOvenBlock(settings: Properties) : HorizontalDirectionalBlock(settings), SimpleWaterloggedBlock {
companion object {
val CODEC: MapCodec<CopperOvenBlock> = RecordCodecBuilder.mapCodec {
it.group(propertiesCodec()).apply(it, ::CopperOvenBlock) }
val EJECTING = BooleanProperty.create("ejecting")
val COOKING = EnumProperty.create("cooking", CookingState::class.java)
val HITBOX = Shapes.box(0.0625, 0.0, 0.3125, 0.9375, 0.625, 0.9375)
}
init {
registerDefaultState(stateDefinition.any()
.setValue(HORIZONTAL_FACING, Direction.NORTH)
.setValue(WATERLOGGED, false)
.setValue(COOKING, CookingState.CLOSED)
.setValue(EJECTING, false)
)
}
enum class CookingState : StringRepresentable {
CLOSED, //Door is closed
OPEN, //Door is open
COOKING; //Door is locked closed and the light level is cranked up, as long as the block is powered by redstone. Acts as closed lid in the original Campfire Pot
override fun getSerializedName(): String = this.name.lowercase()
}
override fun codec(): MapCodec<CopperOvenBlock> = CODEC
override fun createBlockStateDefinition(builder: StateDefinition.Builder<Block, BlockState>) {
builder.add(HORIZONTAL_FACING, WATERLOGGED, COOKING, EJECTING)
}
override fun getFluidState(blockState: BlockState): FluidState? = if (blockState.getValue(WATERLOGGED)) Fluids.WATER.getSource(false) else super.getFluidState(blockState)
override fun updateShape(state: BlockState, direction: Direction, neighborState: BlockState, world: LevelAccessor, pos: BlockPos, neighborPos: BlockPos): BlockState {
if (state.getValue(WATERLOGGED)) {
world.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world))
}
return if (state.getValue(HORIZONTAL_FACING).opposite == direction && !state.canSurvive(world, pos)) Blocks.AIR.defaultBlockState()
else super.updateShape(state, direction, neighborState, world, pos, neighborPos)
}
override fun getCollisionShape(state: BlockState, level: BlockGetter, pos: BlockPos, context: CollisionContext): VoxelShape {
val direction = state.getValue(HORIZONTAL_FACING)
return rotateShape(Direction.NORTH, direction, HITBOX)
}
override fun getShape(state: BlockState, level: BlockGetter, pos: BlockPos, context: CollisionContext): VoxelShape {
return getCollisionShape(state, level, pos, context).singleEncompassing()
}
override fun getStateForPlacement(context: BlockPlaceContext): BlockState? {
val fluidState = context.level.getFluidState(context.clickedPos)
return super.getStateForPlacement(context)?.setValue(HORIZONTAL_FACING, context.horizontalDirection.opposite)?.setValue(WATERLOGGED, fluidState.type === Fluids.WATER)
}
}
@@ -1,78 +0,0 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.block.appliances
import com.cobblemon.mod.common.util.rotateShape
import com.mojang.serialization.MapCodec
import com.mojang.serialization.codecs.RecordCodecBuilder
import net.minecraft.core.BlockPos
import net.minecraft.core.Direction
import net.minecraft.world.item.context.BlockPlaceContext
import net.minecraft.world.level.BlockGetter
import net.minecraft.world.level.LevelAccessor
import net.minecraft.world.level.block.*
import net.minecraft.world.level.block.state.BlockState
import net.minecraft.world.level.block.state.StateDefinition
import net.minecraft.world.level.block.state.properties.BlockStateProperties.HORIZONTAL_FACING
import net.minecraft.world.level.block.state.properties.BlockStateProperties.WATERLOGGED
import net.minecraft.world.level.block.state.properties.BooleanProperty
import net.minecraft.world.level.material.FluidState
import net.minecraft.world.level.material.Fluids
import net.minecraft.world.phys.shapes.CollisionContext
import net.minecraft.world.phys.shapes.Shapes
import net.minecraft.world.phys.shapes.VoxelShape
open class CopperWasherBlock(settings: Properties) : HorizontalDirectionalBlock(settings), SimpleWaterloggedBlock {
companion object {
val CODEC: MapCodec<CopperWasherBlock> = RecordCodecBuilder.mapCodec {
it.group(propertiesCodec()).apply(it, ::CopperWasherBlock) }
val POWERED = BooleanProperty.create("powered")
val HITBOX = Shapes.box(0.0625, 0.0, 0.125, 0.9375, 1.0, 1.0)
}
init {
registerDefaultState(stateDefinition.any()
.setValue(HORIZONTAL_FACING, Direction.NORTH)
.setValue(WATERLOGGED, false)
.setValue(POWERED, false)
)
}
override fun codec(): MapCodec<CopperWasherBlock> = CODEC
override fun createBlockStateDefinition(builder: StateDefinition.Builder<Block, BlockState>) {
builder.add(HORIZONTAL_FACING, WATERLOGGED, POWERED)
}
override fun getFluidState(blockState: BlockState): FluidState? = if (blockState.getValue(WATERLOGGED)) Fluids.WATER.getSource(false) else super.getFluidState(blockState)
override fun updateShape(state: BlockState, direction: Direction, neighborState: BlockState, world: LevelAccessor, pos: BlockPos, neighborPos: BlockPos): BlockState {
if (state.getValue(WATERLOGGED)) {
world.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world))
}
return if (state.getValue(HORIZONTAL_FACING).opposite == direction && !state.canSurvive(world, pos)) Blocks.AIR.defaultBlockState()
else super.updateShape(state, direction, neighborState, world, pos, neighborPos)
}
override fun getCollisionShape(state: BlockState, level: BlockGetter, pos: BlockPos, context: CollisionContext): VoxelShape {
val direction = state.getValue(HORIZONTAL_FACING)
return rotateShape(Direction.NORTH, direction, HITBOX)
}
override fun getShape(state: BlockState, level: BlockGetter, pos: BlockPos, context: CollisionContext): VoxelShape {
return getCollisionShape(state, level, pos, context).singleEncompassing()
}
override fun getStateForPlacement(context: BlockPlaceContext): BlockState? {
val fluidState = context.level.getFluidState(context.clickedPos)
return super.getStateForPlacement(context)?.setValue(HORIZONTAL_FACING, context.horizontalDirection.opposite)?.setValue(WATERLOGGED, fluidState.type === Fluids.WATER)
}
}
@@ -1,31 +0,0 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.block.appliances
import net.minecraft.core.BlockPos
import net.minecraft.server.level.ServerLevel
import net.minecraft.util.RandomSource
import net.minecraft.world.level.block.WeatheringCopper
import net.minecraft.world.level.block.state.BlockState
class WeatheringCopperFanBlock(val weatherState: WeatheringCopper.WeatherState, properties: Properties) :
CopperFanBlock(properties), WeatheringCopper {
override fun randomTick(state: BlockState?, level: ServerLevel?, pos: BlockPos?, random: RandomSource?) {
this.changeOverTime(state, level, pos, random)
}
override fun isRandomlyTicking(state: BlockState): Boolean {
return WeatheringCopper.getNext(state.getBlock()).isPresent()
}
override fun getAge(): WeatheringCopper.WeatherState {
return this.weatherState
}
}
@@ -1,34 +0,0 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.block.appliances
import net.minecraft.core.BlockPos
import net.minecraft.server.level.ServerLevel
import net.minecraft.util.RandomSource
import net.minecraft.world.level.block.WeatheringCopper
import net.minecraft.world.level.block.state.BlockState
import net.minecraft.world.level.block.state.properties.DoubleBlockHalf
class WeatheringCopperFridgeBlock(val weatherState: WeatheringCopper.WeatherState, properties: Properties) :
CopperFridgeBlock(properties), WeatheringCopper {
override fun randomTick(state: BlockState, level: ServerLevel?, pos: BlockPos?, random: RandomSource?) {
if (state.getValue(HALF) == DoubleBlockHalf.LOWER) {
this.changeOverTime(state, level, pos, random)
}
}
override fun isRandomlyTicking(state: BlockState): Boolean {
return WeatheringCopper.getNext(state.getBlock()).isPresent()
}
override fun getAge(): WeatheringCopper.WeatherState {
return this.weatherState
}
}
@@ -1,31 +0,0 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.block.appliances
import net.minecraft.core.BlockPos
import net.minecraft.server.level.ServerLevel
import net.minecraft.util.RandomSource
import net.minecraft.world.level.block.WeatheringCopper
import net.minecraft.world.level.block.state.BlockState
class WeatheringCopperMowerBlock(val weatherState: WeatheringCopper.WeatherState, properties: Properties) :
CopperMowerBlock(properties), WeatheringCopper {
override fun randomTick(state: BlockState?, level: ServerLevel?, pos: BlockPos?, random: RandomSource?) {
this.changeOverTime(state, level, pos, random)
}
override fun isRandomlyTicking(state: BlockState): Boolean {
return WeatheringCopper.getNext(state.getBlock()).isPresent()
}
override fun getAge(): WeatheringCopper.WeatherState {
return this.weatherState
}
}
@@ -1,31 +0,0 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.block.appliances
import net.minecraft.core.BlockPos
import net.minecraft.server.level.ServerLevel
import net.minecraft.util.RandomSource
import net.minecraft.world.level.block.WeatheringCopper
import net.minecraft.world.level.block.state.BlockState
class WeatheringCopperOvenBlock(val weatherState: WeatheringCopper.WeatherState, properties: Properties) :
CopperOvenBlock(properties), WeatheringCopper {
override fun randomTick(state: BlockState?, level: ServerLevel?, pos: BlockPos?, random: RandomSource?) {
this.changeOverTime(state, level, pos, random)
}
override fun isRandomlyTicking(state: BlockState): Boolean {
return WeatheringCopper.getNext(state.getBlock()).isPresent()
}
override fun getAge(): WeatheringCopper.WeatherState {
return this.weatherState
}
}
@@ -1,31 +0,0 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.block.appliances
import net.minecraft.core.BlockPos
import net.minecraft.server.level.ServerLevel
import net.minecraft.util.RandomSource
import net.minecraft.world.level.block.WeatheringCopper
import net.minecraft.world.level.block.state.BlockState
class WeatheringCopperWasherBlock(val weatherState: WeatheringCopper.WeatherState, properties: Properties) :
CopperWasherBlock(properties), WeatheringCopper {
override fun randomTick(state: BlockState?, level: ServerLevel?, pos: BlockPos?, random: RandomSource?) {
this.changeOverTime(state, level, pos, random)
}
override fun isRandomlyTicking(state: BlockState): Boolean {
return WeatheringCopper.getNext(state.getBlock()).isPresent()
}
override fun getAge(): WeatheringCopper.WeatherState {
return this.weatherState
}
}
@@ -128,7 +128,6 @@ class DiscShelfBlockEntity(pos: BlockPos, state: BlockState) : BlockEntity(Cobbl
fun isValidItem(stack: ItemStack): Boolean {
return stack.item is TechnicalMachineItem
|| stack.item == CobblemonItems.BLANK_TM
|| stack.item == CobblemonItems.UPGRADE
|| stack.item == CobblemonItems.DUBIOUS_DISC
|| stack.has(DataComponents.JUKEBOX_PLAYABLE)
@@ -31,7 +31,6 @@ import com.cobblemon.mod.common.client.sound.instances.CancellableSoundInstance
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
import com.cobblemon.mod.common.item.PokeBallItem
import com.cobblemon.mod.common.pokemon.Pokemon
import com.cobblemon.mod.common.pokemon.activestate.SentOutState
import com.cobblemon.mod.common.util.DataKeys
import com.cobblemon.mod.common.util.giveOrDropItemStack
import com.cobblemon.mod.common.util.lang
@@ -236,7 +235,6 @@ class FossilMultiblockStructure (
entity.setPos(fixedPosition.center.subtract(0.0, 0.5, 0.0))
// TODO: Find a correct way to set the new entity's Yaw rotation. (Face away from the machine)
if (world.addFreshEntity(entity)) {
pokemon.state = SentOutState(entity)
CobblemonEvents.FOSSIL_REVIVED.post(FossilRevivedEvent(pokemon, null))
return true
} else {
@@ -414,16 +414,7 @@ object CobblemonClient {
CobblemonBlocks.NEVER_MELT_ICE,
CobblemonBlocks.WIDE_LENS,
CobblemonBlocks.ZOOM_LENS,
CobblemonBlocks.SCOPE_LENS,
CobblemonBlocks.COPPER_FAN,
CobblemonBlocks.EXPOSED_COPPER_FAN,
CobblemonBlocks.WEATHERED_COPPER_FAN,
CobblemonBlocks.OXIDIZED_COPPER_FAN,
CobblemonBlocks.WAXED_COPPER_FAN,
CobblemonBlocks.WAXED_EXPOSED_COPPER_FAN,
CobblemonBlocks.WAXED_WEATHERED_COPPER_FAN,
CobblemonBlocks.WAXED_OXIDIZED_COPPER_FAN
CobblemonBlocks.SCOPE_LENS
)
this.createBoatModelLayers()
@@ -8,9 +8,9 @@
package com.cobblemon.mod.common.client.render.block
import com.cobblemon.mod.common.CobblemonItemComponents
import com.cobblemon.mod.common.block.entity.DiscShelfBlockEntity
import com.cobblemon.mod.common.CobblemonItems
import com.cobblemon.mod.common.client.render.color.TechnicalMachineItemColorProvider
import com.cobblemon.mod.common.util.cobblemonResource
import com.mojang.blaze3d.vertex.PoseStack
import com.mojang.blaze3d.vertex.VertexConsumer
@@ -37,15 +37,15 @@ class DiscShelfBlockEntityRenderer(ctx: BlockEntityRendererProvider.Context) :
private val slotHeightPixels = 2
private val textureSize = 16f
private val slotUMax = slotWidthPixels / textureSize
private val slotVMax = slotHeightPixels / textureSize
private val leftMargin = 1f
private val rightMargin = 1f
private val topMargin = 1f
private val interRowSpacing = 0f
private val tmOverlayDepthOffset = -0.0002f
private val slotBrightnessMultiplier = 0.65f
private val tmBaseTexture = cobblemonResource("textures/block/disc_shelf/technical_machine_base.png")
private val tmOverlayTexture = cobblemonResource("textures/block/disc_shelf/technical_machine_overlay.png")
private val musicDiscUnknownTexture = cobblemonResource("textures/block/disc_shelf/music_disc_unknown.png")
override fun render(
@@ -98,19 +98,35 @@ class DiscShelfBlockEntityRenderer(ctx: BlockEntityRendererProvider.Context) :
poseStack.translate(posX, posY, -0.001f)
if (item.item == CobblemonItems.TECHNICAL_MACHINE) {
val elementId = item.components.get(CobblemonItemComponents.TM_MOVE)!!.move.elementalType.showdownId
val texture = cobblemonResource("textures/block/disc_shelf/${elementId}_tm.png")
val baseColor = TechnicalMachineItemColorProvider.getColor(item, 0)
val overlayColor = TechnicalMachineItemColorProvider.getColor(item, 1)
renderSlotQuad(
poseStack,
buffer,
texture,
0xFFFFFF,
tmBaseTexture,
baseColor,
packedLight,
slotWidth,
slotHeight,
tint = true,
useTextRenderType = true
)
poseStack.pushPose()
poseStack.translate(0.0, 0.0, tmOverlayDepthOffset.toDouble())
renderSlotQuad(
poseStack,
buffer,
tmOverlayTexture,
overlayColor,
packedLight,
slotWidth,
slotHeight,
tint = true,
useTextRenderType = true
)
poseStack.popPose()
} else {
val tex = getItemTexture(item)
renderSlotQuad(
@@ -160,15 +176,13 @@ class DiscShelfBlockEntityRenderer(ctx: BlockEntityRendererProvider.Context) :
val g = (gBase * slotBrightnessMultiplier).coerceIn(0f, 1f)
val b = (bBase * slotBrightnessMultiplier).coerceIn(0f, 1f)
// The quad faces -Z, so a viewer looking at it sees +X on their left.
// U runs from slotUMax at x = 0 to 0 at x = width so the art is not mirrored.
consumer.addVertex(matrix, 0f, 0f, 0f).setColor(r, g, b, a).setUv(slotUMax, slotVMax)
consumer.addVertex(matrix, 0f, 0f, 0f).setColor(r, g, b, a).setUv(0f, 1f)
.setUv1(0, 0).setUv2(light and 0xFFFF, light shr 16).setNormal(0f, 0f, -1f)
consumer.addVertex(matrix, 0f, height, 0f).setColor(r, g, b, a).setUv(slotUMax, 0f)
consumer.addVertex(matrix, 0f, height, 0f).setColor(r, g, b, a).setUv(0f, 0f)
.setUv1(0, 0).setUv2(light and 0xFFFF, light shr 16).setNormal(0f, 0f, -1f)
consumer.addVertex(matrix, width, height, 0f).setColor(r, g, b, a).setUv(0f, 0f)
consumer.addVertex(matrix, width, height, 0f).setColor(r, g, b, a).setUv(1f, 0f)
.setUv1(0, 0).setUv2(light and 0xFFFF, light shr 16).setNormal(0f, 0f, -1f)
consumer.addVertex(matrix, width, 0f, 0f).setColor(r, g, b, a).setUv(0f, slotVMax)
consumer.addVertex(matrix, width, 0f, 0f).setColor(r, g, b, a).setUv(1f, 1f)
.setUv1(0, 0).setUv2(light and 0xFFFF, light shr 16).setNormal(0f, 0f, -1f)
}
@@ -0,0 +1,27 @@
/*
* 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.color
import com.cobblemon.mod.common.api.types.ElementalTypes
import com.cobblemon.mod.common.item.components.TMMoveComponent.Companion.getTMMove
import net.minecraft.client.color.item.ItemColor
import net.minecraft.util.FastColor
import net.minecraft.world.item.ItemStack
object TechnicalMachineItemColorProvider : ItemColor {
override fun getColor(itemStack: ItemStack, layer: Int): Int {
val moveType = getTMMove(itemStack)?.elementalType ?: ElementalTypes.NORMAL
val color = when (layer) {
0 -> moveType.primaryColor
1 -> moveType.secondaryColor
else -> 0xFFFFFF
}
return FastColor.ARGB32.opaque(color)
}
}
@@ -1,104 +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.gen1
import com.cobblemon.mod.common.client.render.models.blockbench.PosableState
import com.cobblemon.mod.common.client.render.models.blockbench.animation.WaveAnimation
import com.cobblemon.mod.common.client.render.models.blockbench.animation.WaveSegment
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
import com.cobblemon.mod.common.client.render.models.blockbench.pose.ModelPartTransformation.Companion.X_AXIS
import com.cobblemon.mod.common.client.render.models.blockbench.pose.ModelPartTransformation.Companion.Y_AXIS
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
import com.cobblemon.mod.common.client.render.models.blockbench.wavefunction.sineFunction
import com.cobblemon.mod.common.entity.PoseType
import com.cobblemon.mod.common.entity.PoseType.Companion.MOVING_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.STATIONARY_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.UI_POSES
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class EkansModel(root: ModelPart) : PokemonPosableModel(root), HeadedFrame {
override val rootPart = root.registerChildWithAllChildren("ekans")
private val body = getPart("body")
override val head = getPart("head")
private val tail = getPart("tail")
private val tail2 = getPart("tail2")
private val tail3 = getPart("tail3")
private val tail4 = getPart("tail4")
private val tail5 = getPart("tail5")
private val tail6 = getPart("tail6")
val tailSegment = WaveSegment(modelPart = tail, length = 9F)
val tail2Segment = WaveSegment(modelPart = tail2, length = 9F)
val tail3Segment = WaveSegment(modelPart = tail3, length = 9F)
val tail4Segment = WaveSegment(modelPart = tail4, length = 9F)
val tail5Segment = WaveSegment(modelPart = tail5, length = 10F)
val tail6Segment = WaveSegment(modelPart = tail6, length = 10F)
override var portraitScale = 1.7F
override var portraitTranslation = Vec3(-0.3, -0.45, 0.0)
override var profileScale = 0.7F
override var profileTranslation = Vec3(-0.05, 0.6, 0.0)
lateinit var sleep: Pose
override val cryAnimation = CryProvider { bedrockStateful("ekans", "cry") }
override fun registerPoses() {
sleep = registerPose(
poseType = PoseType.SLEEP,
animations = arrayOf(bedrock("ekans", "sleep"))
)
val blink = quirk { bedrockStateful("ekans", "blink") }
registerPose(
poseName = "normal",
poseTypes = STATIONARY_POSES + MOVING_POSES,
quirks = arrayOf(blink),
animations = arrayOf(
singleBoneLook(),
bedrock("ekans", "ground_idle"),
WaveAnimation(
waveFunction = sineFunction(
period = 8F,
amplitude = 0.8F
),
basedOnLimbSwing = true,
oscillationsScalar = 5F,
head = head,
rotationAxis = Y_AXIS,
motionAxis = X_AXIS,
moveHead = false,
headLength = 16F,
segments = arrayOf(
tailSegment,
tail2Segment,
tail3Segment,
tail4Segment,
tail5Segment,
tail6Segment
)
)
)
)
registerPose(
poseName = "portrait",
poseTypes = UI_POSES,
quirks = arrayOf(blink),
animations = arrayOf(bedrock("ekans", "summary_idle"))
)
}
override fun getFaintAnimation(state: PosableState) = bedrockStateful("ekans", "faint")
}
@@ -1,63 +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.gen1
import com.cobblemon.mod.common.client.render.models.blockbench.PosableState
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
import com.cobblemon.mod.common.entity.PoseType
import com.cobblemon.mod.common.entity.PoseType.Companion.MOVING_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.STATIONARY_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.UI_POSES
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class GloomModel(root: ModelPart) : PokemonPosableModel(root) {
override val rootPart = root.registerChildWithAllChildren("gloom")
override var portraitScale = 1.8F
override var portraitTranslation = Vec3(-0.0, -1.0, 0.0)
override var profileScale = 1.05F
override var profileTranslation = Vec3(0.0, 0.19, 0.0)
lateinit var sleep: Pose
lateinit var standing: Pose
lateinit var walk: Pose
override val cryAnimation = CryProvider { bedrockStateful("gloom", "cry") }
override fun registerPoses() {
standing = registerPose(
poseName = "standing",
poseTypes = STATIONARY_POSES + UI_POSES,
transformTicks = 10,
animations = arrayOf(
bedrock("gloom", "ground_idle")
)
)
sleep = registerPose(
poseType = PoseType.SLEEP,
animations = arrayOf(bedrock("gloom", "sleep"))
)
walk = registerPose(
poseName = "walk",
poseTypes = MOVING_POSES,
transformTicks = 10,
animations = arrayOf(
bedrock("gloom", "ground_walk")
)
)
}
override fun getFaintAnimation(state: PosableState) = bedrockStateful("gloom", "faint")
}
@@ -1,66 +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.gen1
import com.cobblemon.mod.common.client.render.models.blockbench.PosableState
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
import com.cobblemon.mod.common.entity.PoseType
import com.cobblemon.mod.common.entity.PoseType.Companion.MOVING_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.STATIONARY_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.UI_POSES
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class OddishModel(root: ModelPart) : PokemonPosableModel(root) {
override val rootPart = root.registerChildWithAllChildren("oddish")
override var portraitScale = 2.0F
override var portraitTranslation = Vec3(-0.0, -1.0, 0.0)
override var profileScale = 0.85F
override var profileTranslation = Vec3(0.0, 0.5, 0.0)
lateinit var sleep: Pose
lateinit var standing: Pose
lateinit var walk: Pose
override val cryAnimation = CryProvider { bedrockStateful("oddish", "cry") }
override fun registerPoses() {
val blink = quirk { bedrockStateful("oddish", "blink")}
standing = registerPose(
poseName = "standing",
poseTypes = STATIONARY_POSES + UI_POSES,
transformTicks = 10,
quirks = arrayOf(blink),
animations = arrayOf(
bedrock("oddish", "ground_idle")
)
)
sleep = registerPose(
poseType = PoseType.SLEEP,
animations = arrayOf(bedrock("oddish", "sleep"))
)
walk = registerPose(
poseName = "walk",
poseTypes = MOVING_POSES,
transformTicks = 10,
quirks = arrayOf(blink),
animations = arrayOf(
bedrock("oddish", "ground_walk")
)
)
}
override fun getFaintAnimation(state: PosableState) = bedrockStateful("oddish", "faint")
}
@@ -1,75 +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.gen1
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
import com.cobblemon.mod.common.entity.PoseType
import com.cobblemon.mod.common.entity.PoseType.Companion.STANDING_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.UI_POSES
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class PoliwagModel(root: ModelPart) : PokemonPosableModel(root) {
override val rootPart = root.registerChildWithAllChildren("poliwag")
override var portraitScale = 1.8F
override var portraitTranslation = Vec3(0.0, -0.7, 0.0)
override var profileScale = 0.9F
override var profileTranslation = Vec3(0.0, 0.38, 0.0)
lateinit var sleep: Pose
lateinit var standing: Pose
lateinit var float: Pose
lateinit var swim: Pose
override val cryAnimation = CryProvider { bedrockStateful("poliwag", "cry") }
override fun registerPoses() {
val blink = quirk { bedrockStateful("poliwag", "blink")}
standing = registerPose(
poseName = "standing",
poseTypes = STANDING_POSES + UI_POSES,
quirks = arrayOf(blink),
animations = arrayOf(
bedrock("poliwag", "ground_idle")
)
)
sleep = registerPose(
poseType = PoseType.SLEEP,
animations = arrayOf(bedrock("poliwag", "sleep"))
)
float = registerPose(
poseName = "float",
poseType = PoseType.FLOAT,
quirks = arrayOf(blink),
animations = arrayOf(
bedrock("poliwag", "water_idle")
)
)
swim = registerPose(
poseName = "swim",
poseType = PoseType.SWIM,
quirks = arrayOf(blink),
animations = arrayOf(
bedrock("poliwag", "water_swim")
)
)
}
// override fun getFaintAnimation(
// ) = if (state.isPosedIn(standing, walk)) bedrockStateful("poliwag", "faint") else null
// pokemonEntity: PokemonEntity,
// state: PosableState<PokemonEntity>
}
@@ -1,66 +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.gen1
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
import com.cobblemon.mod.common.client.render.models.blockbench.PosableState
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
import com.cobblemon.mod.common.entity.PoseType
import com.cobblemon.mod.common.entity.PoseType.Companion.MOVING_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.STATIONARY_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.UI_POSES
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class VileplumeModel(root: ModelPart) : PokemonPosableModel(root) {
override val rootPart = root.registerChildWithAllChildren("vileplume")
override var portraitScale = 1.8F
override var portraitTranslation = Vec3(-0.35, -0.8, 0.0)
override var profileScale = 0.8F
override var profileTranslation = Vec3(0.0, 0.53, 0.0)
lateinit var sleep: Pose
lateinit var standing: Pose
lateinit var walk: Pose
override val cryAnimation = CryProvider { bedrockStateful("vileplume", "cry") }
override fun registerPoses() {
val blink = quirk { bedrockStateful("vileplume", "blink")}
standing = registerPose(
poseName = "standing",
poseTypes = STATIONARY_POSES + UI_POSES,
transformTicks = 10,
quirks = arrayOf(blink),
animations = arrayOf(
bedrock("vileplume", "idle")
)
)
sleep = registerPose(
poseType = PoseType.SLEEP,
animations = arrayOf(bedrock("vileplume", "sleep"))
)
walk = registerPose(
poseName = "walk",
poseTypes = MOVING_POSES,
transformTicks = 10,
quirks = arrayOf(blink),
animations = arrayOf(
bedrock("vileplume", "ground_walk")
)
)
}
override fun getFaintAnimation(state: PosableState) = bedrockStateful("vileplume", "faint")
}
@@ -1,95 +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.createTransformation
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
import com.cobblemon.mod.common.client.render.models.blockbench.pose.ModelPartTransformation
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
import com.cobblemon.mod.common.entity.PoseType
import com.cobblemon.mod.common.entity.PoseType.Companion.MOVING_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.SHOULDER_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.STATIONARY_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.UI_POSES
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class BellossomModel(root: ModelPart) : PokemonPosableModel(root), HeadedFrame {
override val rootPart = root.registerChildWithAllChildren("bellossom")
override val head = getPart("head")
override var portraitScale = 1.8F
override var portraitTranslation = Vec3(0.0, -0.2, 0.0)
override var profileScale = 1.0F
override var profileTranslation = Vec3(0.0, 0.21, 0.0)
lateinit var standing: Pose
lateinit var walk: Pose
lateinit var shoulderLeft: Pose
lateinit var shoulderRight: Pose
val shoulderOffset = 5
override fun registerPoses() {
val blink = quirk { bedrockStateful("bellossom", "blink") }
standing = registerPose(
poseName = "standing",
poseTypes = STATIONARY_POSES + UI_POSES,
transformTicks = 10,
quirks = arrayOf(blink),
animations = arrayOf(
bedrock("bellossom", "ground_idle"),
singleBoneLook()
)
)
walk = registerPose(
poseName = "walk",
poseTypes = MOVING_POSES,
transformTicks = 10,
quirks = arrayOf(blink),
animations = arrayOf(
bedrock("bellossom", "ground_idle"),
bedrock("bellossom", "ground_walk"),
singleBoneLook()
)
)
shoulderLeft = registerPose(
poseType = PoseType.SHOULDER_LEFT,
quirks = arrayOf(blink),
animations = arrayOf(
singleBoneLook(),
bedrock("bellossom", "ground_idle")
),
transformedParts = arrayOf(
rootPart.createTransformation().addPosition(ModelPartTransformation.X_AXIS, shoulderOffset)
)
)
shoulderRight = registerPose(
poseType = PoseType.SHOULDER_RIGHT,
quirks = arrayOf(blink),
animations = arrayOf(
singleBoneLook(),
bedrock("bellossom", "ground_idle")
),
transformedParts = arrayOf(
rootPart.createTransformation().addPosition(ModelPartTransformation.X_AXIS, -shoulderOffset)
)
)
}
// override fun getFaintAnimation(
// pokemonEntity: PokemonEntity,
// state: PosableState<PokemonEntity>
// ) = if (state.isPosedIn(standing, walk)) bedrockStateful("bellossom", "faint") else null
}
@@ -1,80 +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.frame.BipedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
import com.cobblemon.mod.common.entity.PoseType
import com.cobblemon.mod.common.entity.PoseType.Companion.UI_POSES
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class PolitoedModel(root: ModelPart) : PokemonPosableModel(root), HeadedFrame, BipedFrame {
override val rootPart = root.registerChildWithAllChildren("politoed")
override val head = getPart("head")
override val leftLeg = getPart("leftleg")
override val rightLeg = getPart("rightleg")
override var portraitScale = 2.4F
override var portraitTranslation = Vec3(-0.04, -0.55, 0.0)
override var profileScale = 1.1F
override var profileTranslation = Vec3(0.0, 0.1, 0.0)
lateinit var standing: Pose
lateinit var walking: Pose
lateinit var float: Pose
lateinit var swim: Pose
override fun registerPoses() {
standing = registerPose(
poseName = "standing",
poseTypes = UI_POSES + PoseType.STAND,
animations = arrayOf(
singleBoneLook(),
bedrock("politoed", "ground_idle")
)
)
walking = registerPose(
poseName = "walking",
poseType = PoseType.WALK,
animations = arrayOf(
singleBoneLook(),
bedrock("politoed", "ground_idle")
)
)
float = registerPose(
poseName = "float",
poseTypes = setOf(PoseType.FLOAT, PoseType.HOVER),
animations = arrayOf(
singleBoneLook(),
bedrock("politoed", "water_idle")
)
)
swim = registerPose(
poseName = "swim",
poseTypes = setOf(PoseType.SWIM, PoseType.FLY),
animations = arrayOf(
singleBoneLook(),
bedrock("politoed", "water_swim")
)
)
}
// override fun getFaintAnimation(
// pokemonEntity: PokemonEntity,
// state: PosableState<PokemonEntity>
// ) = if (state.isPosedIn(standing, walk)) bedrockStateful("politoed", "faint") else null
}
@@ -1,72 +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.animation.BimanualSwingAnimation
import com.cobblemon.mod.common.client.render.models.blockbench.animation.BipedWalkAnimation
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BimanualFrame
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BipedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
import com.cobblemon.mod.common.entity.PoseType.Companion.MOVING_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.STATIONARY_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.UI_POSES
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class SudowoodoModel(root: ModelPart) : PokemonPosableModel(root), HeadedFrame, BipedFrame, BimanualFrame {
override val rootPart = root.registerChildWithAllChildren("sudowoodo")
override val head = getPart("head")
override val leftArm = getPart("arm_left")
override val rightArm = getPart("arm_right")
override val leftLeg = getPart("leg_left")
override val rightLeg = getPart("leg_right")
override var portraitScale = 1.9F
override var portraitTranslation = Vec3(-0.7, 1.6, 0.0)
override var profileScale = 0.5F
override var profileTranslation = Vec3(-0.1, 0.95, 0.0)
lateinit var standing: Pose
lateinit var walk: Pose
override fun registerPoses() {
val blink = quirk { bedrockStateful("sudowoodo", "blink") }
standing = registerPose(
poseName = "standing",
poseTypes = STATIONARY_POSES + UI_POSES,
quirks = arrayOf(blink),
animations = arrayOf(
singleBoneLook(yawMultiplier = 0F),
bedrock("sudowoodo", "ground_idle")
)
)
walk = registerPose(
poseName = "walk",
poseTypes = MOVING_POSES,
quirks = arrayOf(blink),
animations = arrayOf(
singleBoneLook(yawMultiplier = 0F),
bedrock("sudowoodo", "ground_idle"),
BipedWalkAnimation(this, periodMultiplier = 0.6F, amplitudeMultiplier = 0.9F),
BimanualSwingAnimation(this, swingPeriodMultiplier = 0.6F, amplitudeMultiplier = 0.9F)
//bedrock("sudowoodo", "ground_walk")
)
)
}
// override fun getFaintAnimation(
// pokemonEntity: PokemonEntity,
// state: PosableState<PokemonEntity>
// ) = if (state.isPosedIn(standing, walk)) bedrockStateful("sudowoodo", "faint") else null
}
@@ -1,91 +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.gen3
import com.cobblemon.mod.common.client.render.models.blockbench.PosableState
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BipedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
import com.cobblemon.mod.common.entity.PoseType
import com.cobblemon.mod.common.entity.PoseType.Companion.MOVING_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.STATIONARY_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.UI_POSES
import com.cobblemon.mod.common.util.isBattling
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class ShroomishModel(root: ModelPart) : PokemonPosableModel(root), HeadedFrame, BipedFrame {
override val rootPart = root.registerChildWithAllChildren("shroomish")
override val head = getPart("torso")
override val leftLeg = getPart("foot_left")
override val rightLeg = getPart("foot_right")
override var portraitScale = 2.0F
override var portraitTranslation = Vec3(-0.1, -1.2, 0.0)
override var profileScale = 1.0F
override var profileTranslation = Vec3(0.0, 0.3, 0.0)
lateinit var standing: Pose
lateinit var battling: Pose
lateinit var sleeping: Pose
lateinit var walk: Pose
override val cryAnimation = CryProvider { bedrockStateful("shroomish", "cry") }
override fun registerPoses() {
val blink = quirk { bedrockStateful("shroomish", "blink") }
standing = registerPose(
poseName = "standing",
poseTypes = STATIONARY_POSES + UI_POSES,
quirks = arrayOf(blink),
condition = { !it.isBattling },
animations = arrayOf(
singleBoneLook(pitchMultiplier = 0.5F),
bedrock("shroomish", "ground_idle")
)
)
walk = registerPose(
poseName = "walk",
poseTypes = MOVING_POSES,
quirks = arrayOf(blink),
animations = arrayOf(
singleBoneLook(pitchMultiplier = 0.5F),
bedrock("shroomish", "ground_walk")
)
)
battling = registerPose(
poseName = "battlestanding",
poseTypes = STATIONARY_POSES,
transformTicks = 10,
quirks = arrayOf(blink),
condition = { it.isBattling },
animations = arrayOf(
singleBoneLook(pitchMultiplier = 0.5F),
bedrock("shroomish", "battle_idle")
)
)
sleeping = registerPose(
poseName = "sleeping",
poseType = PoseType.SLEEP,
transformTicks = 10,
animations = arrayOf(
bedrock("shroomish", "sleep")
)
)
}
override fun getFaintAnimation(state: PosableState) = if (state.isPosedIn(standing, walk, battling, sleeping)) bedrockStateful("shroomish", "faint") else null
}
@@ -1,102 +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.gen4
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BipedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
import com.cobblemon.mod.common.entity.PoseType
import com.cobblemon.mod.common.entity.PoseType.Companion.MOVING_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.STATIONARY_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.UI_POSES
import com.cobblemon.mod.common.util.isBattling
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class BonslyModel(root: ModelPart) : PokemonPosableModel(root), HeadedFrame, BipedFrame {
override val rootPart = root.registerChildWithAllChildren("bonsly")
override val head = getPart("torso")
override val leftLeg = getPart("leg_left")
override val rightLeg = getPart("leg_right")
override var portraitScale = 2.2F
override var portraitTranslation = Vec3(-0.2, -0.8, 0.0)
override var profileScale = 0.72F
override var profileTranslation = Vec3(0.0, 0.65, 0.0)
lateinit var standing: Pose
lateinit var walk: Pose
lateinit var battleidle: Pose
lateinit var sleep: Pose
lateinit var battlesleep: Pose
override fun registerPoses() {
val blink = quirk { bedrockStateful("bonsly", "blink") }
standing = registerPose(
poseName = "standing",
poseTypes = STATIONARY_POSES + UI_POSES,
quirks = arrayOf(blink),
condition = { !it.isBattling },
animations = arrayOf(
singleBoneLook(),
bedrock("bonsly", "ground_idle")
)
)
walk = registerPose(
poseName = "walk",
poseTypes = MOVING_POSES,
quirks = arrayOf(blink),
animations = arrayOf(
singleBoneLook(),
bedrock("bonsly", "ground_walk")
)
)
sleep = registerPose(
poseName = "sleep",
poseType = PoseType.SLEEP,
condition = { !it.isBattling },
animations = arrayOf(
bedrock("bonsly", "sleep_pot")
)
)
battlesleep = registerPose(
poseName = "battlesleep",
poseType = PoseType.SLEEP,
condition = { it.isBattling },
animations = arrayOf(
bedrock("bonsly", "sleep")
)
)
battleidle = registerPose(
poseName = "battle_idle",
poseTypes = PoseType.STATIONARY_POSES,
transformTicks = 10,
quirks = arrayOf(blink),
condition = { it.isBattling },
animations = arrayOf(
singleBoneLook(),
bedrock("bonsly", "battle_idle")
)
)
}
// override fun getFaintAnimation(
// pokemonEntity: PokemonEntity,
// state: PosableState<PokemonEntity>
// ) = if (state.isPosedIn(standing, walk))
// bedrockStateful("bonsly", "faint")
// else null
}
@@ -1,72 +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.gen4
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
import com.cobblemon.mod.common.client.render.models.blockbench.animation.QuadrupedWalkAnimation
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.frame.QuadrupedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
import com.cobblemon.mod.common.entity.PoseType
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class LuxioModel (root: ModelPart) : PokemonPosableModel(root), HeadedFrame, QuadrupedFrame {
override val rootPart = root.registerChildWithAllChildren("luxio")
override val head = getPart("head")
override val foreLeftLeg = getPart("front_leg_left")
override val foreRightLeg = getPart("front_leg_right")
override val hindLeftLeg = getPart("back_leg_left")
override val hindRightLeg = getPart("back_leg_right")
override var portraitScale = 1.8F
override var portraitTranslation = Vec3(-0.6, -0.25, 0.0)
override var profileScale = 0.7F
override var profileTranslation = Vec3(0.0, 0.7, 0.0)
lateinit var standing: Pose
lateinit var walk: Pose
lateinit var sleep: Pose
override fun registerPoses() {
// val blink = quirk { bedrockStateful("luxio", "blink") }
sleep = registerPose(
poseType = PoseType.SLEEP,
animations = arrayOf(bedrock("luxio", "sleep"))
)
standing = registerPose(
poseName = "standing",
poseTypes = PoseType.UI_POSES + PoseType.STATIONARY_POSES,
// quirks = arrayOf(blink),
animations = arrayOf(
singleBoneLook(),
bedrock("luxio", "idle")
)
)
walk = registerPose(
poseName = "walk",
poseTypes = PoseType.MOVING_POSES,
// quirks = arrayOf(blink),
animations = arrayOf(
QuadrupedWalkAnimation(this, periodMultiplier = 1.1F),
singleBoneLook(),
bedrock("luxio", "idle")
)
)
}
// override fun getFaintAnimation(
// pokemonEntity: PokemonEntity,
// state: PosableState<PokemonEntity>
// ) = if (state.isPosedIn(standing, walk)) bedrockStateful("luxio", "faint") else null
}
@@ -1,67 +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.gen4
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
import com.cobblemon.mod.common.client.render.models.blockbench.animation.QuadrupedWalkAnimation
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.frame.QuadrupedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
import com.cobblemon.mod.common.entity.PoseType
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class LuxrayModel (root: ModelPart) : PokemonPosableModel(root), HeadedFrame, QuadrupedFrame {
override val rootPart = root.registerChildWithAllChildren("luxray")
override val head = getPart("head")
override val foreLeftLeg = getPart("front_leg_left")
override val foreRightLeg = getPart("front_leg_right")
override val hindLeftLeg = getPart("back_leg_left")
override val hindRightLeg = getPart("back_leg_right")
override var portraitScale = 1.8F
override var portraitTranslation = Vec3(-0.9, 0.6, 0.0)
override var profileScale = 0.66F
override var profileTranslation = Vec3(0.0, 0.7, 0.0)
lateinit var standing: Pose
lateinit var walk: Pose
override fun registerPoses() {
// val blink = quirk { bedrockStateful("luxray", "blink") }
standing = registerPose(
poseName = "standing",
poseTypes = PoseType.UI_POSES + PoseType.STATIONARY_POSES,
// quirks = arrayOf(blink),
animations = arrayOf(
singleBoneLook(),
bedrock("luxray", "ground_idle")
)
)
walk = registerPose(
poseName = "walk",
poseTypes = PoseType.MOVING_POSES,
// quirks = arrayOf(blink),
animations = arrayOf(
QuadrupedWalkAnimation(this, periodMultiplier = 1.1F),
bedrock("luxray", "ground_idle"),
singleBoneLook()
// bedrock("luxray", "idle")
)
)
}
// override fun getFaintAnimation(
// pokemonEntity: PokemonEntity,
// state: PosableState<PokemonEntity>
// ) = if (state.isPosedIn(standing, walk)) bedrockStateful("luxray", "faint") else null
}
@@ -1,66 +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.gen4
import com.cobblemon.mod.common.client.render.models.blockbench.animation.QuadrupedWalkAnimation
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.frame.QuadrupedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
import com.cobblemon.mod.common.entity.PoseType
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class ShinxModel (root: ModelPart) : PokemonPosableModel(root), HeadedFrame, QuadrupedFrame {
override val rootPart = root.registerChildWithAllChildren("shinx")
override val head = getPart("head")
override val foreLeftLeg = getPart("leg_left")
override val foreRightLeg = getPart("leg_right")
override val hindLeftLeg = getPart("back_leg_left")
override val hindRightLeg = getPart("back_leg_right")
override var portraitScale = 1.8F
override var portraitTranslation = Vec3(-0.6, -0.25, 0.0)
override var profileScale = 0.66F
override var profileTranslation = Vec3(0.0, 0.7, 0.0)
lateinit var standing: Pose
lateinit var walk: Pose
override fun registerPoses() {
// val blink = quirk { bedrockStateful("shinx", "blink") }
standing = registerPose(
poseName = "standing",
poseTypes = PoseType.UI_POSES + PoseType.STATIONARY_POSES,
// quirks = arrayOf(blink),
animations = arrayOf(
singleBoneLook(),
bedrock("shinx", "ground_idle")
)
)
walk = registerPose(
poseName = "walk",
poseTypes = PoseType.MOVING_POSES,
// quirks = arrayOf(blink),
animations = arrayOf(
QuadrupedWalkAnimation(this, periodMultiplier = 1.1F),
singleBoneLook(),
bedrock("shinx", "ground_idle")
)
)
}
// override fun getFaintAnimation(
// pokemonEntity: PokemonEntity,
// state: PosableState<PokemonEntity>
// ) = if (state.isPosedIn(standing, walk)) bedrockStateful("shinx", "faint") else null
}
@@ -1,70 +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.gen6
import com.cobblemon.mod.common.client.render.models.blockbench.animation.BimanualSwingAnimation
import com.cobblemon.mod.common.client.render.models.blockbench.animation.BipedWalkAnimation
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BimanualFrame
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BipedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
import com.cobblemon.mod.common.entity.PoseType.Companion.MOVING_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.STATIONARY_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.UI_POSES
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class ChesnaughtModel (root: ModelPart) : PokemonPosableModel(root), HeadedFrame, BipedFrame, BimanualFrame {
override val rootPart = root.registerChildWithAllChildren("chesnaught")
override val head = getPart("head")
override val rightArm = getPart("arm_right")
override val leftArm = getPart("arm_left")
override val leftLeg = getPart("leg_left")
override val rightLeg = getPart("leg_right")
override var portraitScale = 2.2F
override var portraitTranslation = Vec3(-1.0, 1.65, 0.0)
override var profileScale = 0.6F
override var profileTranslation = Vec3(0.0, 0.85, 0.0)
lateinit var standing: Pose
lateinit var walk: Pose
override val cryAnimation = CryProvider { bedrockStateful("chesnaught", "cry") }
override fun registerPoses() {
val blink = quirk { bedrockStateful("chesnaught", "blink")}
standing = registerPose(
poseName = "standing",
poseTypes = STATIONARY_POSES + UI_POSES,
quirks = arrayOf(blink),
animations = arrayOf(
singleBoneLook(),
bedrock("chesnaught", "ground_idle")
)
)
walk = registerPose(
poseName = "walk",
poseTypes = MOVING_POSES,
quirks = arrayOf(blink),
animations = arrayOf(
singleBoneLook(),
BimanualSwingAnimation(this),
BipedWalkAnimation(this),
bedrock("chesnaught", "ground_idle")
)
)
}
}
@@ -1,70 +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.gen6
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BimanualFrame
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BipedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
import com.cobblemon.mod.common.entity.PoseType
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class ChespinModel (root: ModelPart) : PokemonPosableModel(root), HeadedFrame, BipedFrame, BimanualFrame {
override val rootPart = root.registerChildWithAllChildren("chespin")
override val head = getPart("head")
override val rightArm = getPart("arm_right")
override val leftArm = getPart("arm_left")
override val leftLeg = getPart("leg_left")
override val rightLeg = getPart("leg_right")
override var portraitScale = 2.03F
override var portraitTranslation = Vec3(-0.12, -0.44, 0.0)
override var profileScale = 0.77F
override var profileTranslation = Vec3(0.0, 0.6, 0.0)
lateinit var standing: Pose
lateinit var walk: Pose
lateinit var sleep: Pose
override val cryAnimation = CryProvider { bedrockStateful("chespin", "cry") }
override fun registerPoses() {
val blink = quirk { bedrockStateful("chespin", "blink")}
standing = registerPose(
poseName = "standing",
poseTypes = PoseType.STATIONARY_POSES + PoseType.UI_POSES,
quirks = arrayOf(blink),
animations = arrayOf(
singleBoneLook(),
bedrock("chespin", "ground_idle")
)
)
walk = registerPose(
poseName = "walk",
poseTypes = PoseType.MOVING_POSES,
quirks = arrayOf(blink),
animations = arrayOf(
singleBoneLook(),
bedrock("chespin", "ground_walk")
)
)
sleep = registerPose(
poseType = PoseType.SLEEP,
transformTicks = 10,
animations = arrayOf(bedrock("chespin", "sleep"))
)
}
}
@@ -1,118 +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.gen6
import com.cobblemon.mod.common.client.render.models.blockbench.PosableState
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BimanualFrame
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BipedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
import com.cobblemon.mod.common.entity.PoseType
import com.cobblemon.mod.common.util.isBattling
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class FroakieModel(root: ModelPart) : PokemonPosableModel(root), HeadedFrame, BipedFrame, BimanualFrame {
override val rootPart = root.registerChildWithAllChildren("froakie")
override val head = getPart("head")
override val rightArm = getPart("arm_right")
override val leftArm = getPart("arm_left")
override val rightLeg = getPart("leg_right")
override val leftLeg = getPart("leg_left")
override var portraitScale = 1.86F
override var portraitTranslation = Vec3(-0.25, -0.51, 0.0)
override var profileScale = 0.75F
override var profileTranslation = Vec3(0.0, 0.56, 0.0)
lateinit var sleep: Pose
lateinit var standing: Pose
lateinit var float: Pose
lateinit var swim: Pose
lateinit var walk: Pose
lateinit var battleidle: Pose
override val cryAnimation = CryProvider { bedrockStateful("froakie", "cry") }
override fun registerPoses() {
val blink = quirk { bedrockStateful("froakie", "blink")}
sleep = registerPose(
poseType = PoseType.SLEEP,
transformTicks = 10,
quirks = arrayOf(blink),
animations = arrayOf(bedrock("froakie", "sleep"))
)
standing = registerPose(
poseName = "standing",
poseTypes = PoseType.UI_POSES + PoseType.STATIONARY_POSES - PoseType.FLOAT,
transformTicks = 10,
quirks = arrayOf(blink),
condition = { !it.isBattling },
animations = arrayOf(
singleBoneLook(),
bedrock("froakie", "ground_idle")
)
)
walk = registerPose(
poseName = "walk",
poseType = PoseType.WALK,
transformTicks = 10,
quirks = arrayOf(blink),
condition = { !it.isBattling },
animations = arrayOf(
singleBoneLook(),
bedrock("froakie", "ground_walk")
)
)
float = registerPose(
poseName = "swim_idle",
poseTypes = setOf(PoseType.FLOAT, PoseType.HOVER),
transformTicks = 10,
quirks = arrayOf(blink),
condition = { !it.isBattling },
animations = arrayOf(
singleBoneLook(),
bedrock("froakie", "water_idle")
)
)
swim = registerPose(
poseName = "swim",
poseTypes = setOf(PoseType.SWIM, PoseType.FLY),
transformTicks = 10,
quirks = arrayOf(blink),
condition = { !it.isBattling },
animations = arrayOf(
singleBoneLook(),
bedrock("froakie", "water_swim")
)
)
battleidle = registerPose(
poseName = "battle_idle",
poseTypes = PoseType.STATIONARY_POSES,
transformTicks = 10,
quirks = arrayOf(blink),
condition = { it.isBattling },
animations = arrayOf(
singleBoneLook(),
bedrock("froakie", "battle_idle")
)
)
}
override fun getFaintAnimation(state: PosableState) = if (state.isPosedIn(standing, walk, battleidle, swim, float, sleep)) bedrockStateful("froakie", "faint") else null
}
@@ -1,118 +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.gen6
import com.cobblemon.mod.common.client.render.models.blockbench.PosableState
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BimanualFrame
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BipedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
import com.cobblemon.mod.common.entity.PoseType
import com.cobblemon.mod.common.util.isBattling
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class FrogadierModel(root: ModelPart) : PokemonPosableModel(root), HeadedFrame, BipedFrame, BimanualFrame {
override val rootPart = root.registerChildWithAllChildren("frogadier")
override val head = getPart("head")
override val rightArm = getPart("arm_right")
override val leftArm = getPart("arm_left")
override val rightLeg = getPart("leg_right")
override val leftLeg = getPart("leg_left")
override var portraitScale = 1.9F
override var portraitTranslation = Vec3(-0.1, 1.4, 0.0)
override var profileScale = 0.7F
override var profileTranslation = Vec3(0.0, 0.7, 0.0)
lateinit var sleep: Pose
lateinit var standing: Pose
lateinit var float: Pose
lateinit var swim: Pose
lateinit var walk: Pose
lateinit var battleidle: Pose
override val cryAnimation = CryProvider { bedrockStateful("frogadier", "cry") }
override fun registerPoses() {
val blink = quirk { bedrockStateful("frogadier", "blink")}
sleep = registerPose(
poseType = PoseType.SLEEP,
transformTicks = 10,
quirks = arrayOf(blink),
animations = arrayOf(bedrock("frogadier", "sleep"))
)
standing = registerPose(
poseName = "standing",
poseTypes = PoseType.UI_POSES + PoseType.STATIONARY_POSES - PoseType.FLOAT,
transformTicks = 10,
quirks = arrayOf(blink),
condition = { !it.isBattling },
animations = arrayOf(
singleBoneLook(),
bedrock("frogadier", "ground_idle")
)
)
walk = registerPose(
poseName = "walk",
poseType = PoseType.WALK,
transformTicks = 10,
quirks = arrayOf(blink),
condition = { !it.isBattling },
animations = arrayOf(
singleBoneLook(),
bedrock("frogadier", "ground_walk")
)
)
float = registerPose(
poseName = "swim_idle",
poseTypes = setOf(PoseType.FLOAT, PoseType.HOVER),
transformTicks = 10,
quirks = arrayOf(blink),
condition = { !it.isBattling },
animations = arrayOf(
singleBoneLook(),
bedrock("frogadier", "water_idle")
)
)
swim = registerPose(
poseName = "swim",
poseTypes = setOf(PoseType.SWIM, PoseType.FLY),
transformTicks = 10,
quirks = arrayOf(blink),
condition = { !it.isBattling },
animations = arrayOf(
singleBoneLook(),
bedrock("frogadier", "water_swim")
)
)
battleidle = registerPose(
poseName = "battle_idle",
poseTypes = PoseType.STATIONARY_POSES,
transformTicks = 10,
quirks = arrayOf(blink),
condition = { it.isBattling },
animations = arrayOf(
singleBoneLook(),
bedrock("frogadier", "battle_idle")
)
)
}
override fun getFaintAnimation(state: PosableState) = if (state.isPosedIn(standing, walk, battleidle, swim, float, sleep)) bedrockStateful("frogadier", "faint") else null
}
@@ -1,142 +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.gen6
import com.cobblemon.mod.common.client.render.models.blockbench.PosableState
import com.cobblemon.mod.common.client.render.models.blockbench.createTransformation
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BimanualFrame
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BipedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
import com.cobblemon.mod.common.entity.PoseType
import com.cobblemon.mod.common.util.isBattling
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class GreninjaModel(root: ModelPart) : PokemonPosableModel(root), HeadedFrame, BipedFrame, BimanualFrame {
override val rootPart = root.registerChildWithAllChildren("greninja")
override val head = getPart("head")
override val rightArm = getPart("arm_right")
override val leftArm = getPart("arm_left")
override val rightLeg = getPart("leg_right")
override val leftLeg = getPart("leg_left")
val shurikenright = getPart("hand_shuriken_right")
val shurikenleft = getPart("hand_shuriken_left")
override var portraitScale = 2.2F
override var portraitTranslation = Vec3(-0.1, 1.34, 0.0)
override var profileScale = 0.7F
override var profileTranslation = Vec3(0.0, 0.7, 0.0)
lateinit var sleep: Pose
lateinit var standing: Pose
lateinit var float: Pose
lateinit var swim: Pose
lateinit var walk: Pose
lateinit var battleidle: Pose
override val cryAnimation = CryProvider { bedrockStateful("greninja", "cry") }
override fun registerPoses() {
val blink = quirk { bedrockStateful("greninja", "blink")}
sleep = registerPose(
poseType = PoseType.SLEEP,
transformTicks = 10,
transformedParts = arrayOf(
shurikenleft.createTransformation().withVisibility(visibility = false),
shurikenright.createTransformation().withVisibility(visibility = false)
),
animations = arrayOf(bedrock("greninja", "sleep"))
)
standing = registerPose(
poseName = "standing",
poseTypes = PoseType.UI_POSES + PoseType.STATIONARY_POSES - PoseType.FLOAT,
transformTicks = 10,
quirks = arrayOf(blink),
condition = { !it.isBattling },
transformedParts = arrayOf(
shurikenleft.createTransformation().withVisibility(visibility = false),
shurikenright.createTransformation().withVisibility(visibility = false)
),
animations = arrayOf(
singleBoneLook(),
bedrock("greninja", "ground_idle")
)
)
walk = registerPose(
poseName = "walk",
poseType = PoseType.WALK,
transformTicks = 10,
quirks = arrayOf(blink),
transformedParts = arrayOf(
shurikenleft.createTransformation().withVisibility(visibility = false),
shurikenright.createTransformation().withVisibility(visibility = false)
),
animations = arrayOf(
singleBoneLook(),
bedrock("greninja", "ground_walk")
)
)
float = registerPose(
poseName = "swim_idle",
poseTypes = setOf(PoseType.FLOAT, PoseType.HOVER),
transformTicks = 10,
quirks = arrayOf(blink),
condition = { !it.isBattling },
transformedParts = arrayOf(
shurikenleft.createTransformation().withVisibility(visibility = false),
shurikenright.createTransformation().withVisibility(visibility = false)
),
animations = arrayOf(
singleBoneLook(),
bedrock("greninja", "water_idle")
)
)
swim = registerPose(
poseName = "swim",
poseTypes = setOf(PoseType.SWIM, PoseType.FLY),
transformTicks = 10,
quirks = arrayOf(blink),
condition = { !it.isBattling },
transformedParts = arrayOf(
shurikenleft.createTransformation().withVisibility(visibility = false),
shurikenright.createTransformation().withVisibility(visibility = false)
),
animations = arrayOf(
singleBoneLook(),
bedrock("greninja", "water_swim")
)
)
battleidle = registerPose(
poseName = "battle_idle",
poseTypes = PoseType.STATIONARY_POSES,
transformTicks = 10,
quirks = arrayOf(blink),
condition = { it.isBattling },
transformedParts = arrayOf(
shurikenleft.createTransformation().withVisibility(visibility = false),
shurikenright.createTransformation().withVisibility(visibility = false)
),
animations = arrayOf(
singleBoneLook(),
bedrock("greninja", "battle_idle")
)
)
}
override fun getFaintAnimation(state: PosableState) = if (state.isPosedIn(standing, walk, battleidle, swim, float, sleep)) bedrockStateful("greninja", "faint") else null
}
@@ -1,73 +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.gen6
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BimanualFrame
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BipedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
import com.cobblemon.mod.common.entity.PoseType
import com.cobblemon.mod.common.entity.PoseType.Companion.MOVING_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.STATIONARY_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.UI_POSES
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class QuilladinModel (root: ModelPart) : PokemonPosableModel(root), HeadedFrame, BipedFrame, BimanualFrame {
override val rootPart = root.registerChildWithAllChildren("quilladin")
override val head = getPart("torso")
override val rightArm = getPart("arm_right")
override val leftArm = getPart("arm_left")
override val leftLeg = getPart("leg_left")
override val rightLeg = getPart("leg_right")
override var portraitScale = 2F
override var portraitTranslation = Vec3(-0.3, 0.1, 0.0)
override var profileScale = 0.7F
override var profileTranslation = Vec3(0.0, 0.7, 0.0)
lateinit var standing: Pose
lateinit var walk: Pose
lateinit var sleep: Pose
override val cryAnimation = CryProvider { bedrockStateful("quilladin", "cry") }
override fun registerPoses() {
val blink = quirk { bedrockStateful("quilladin", "blink")}
standing = registerPose(
poseName = "standing",
poseTypes = STATIONARY_POSES + UI_POSES,
quirks = arrayOf(blink),
animations = arrayOf(
singleBoneLook(),
bedrock("quilladin", "ground_idle")
)
)
walk = registerPose(
poseName = "walk",
poseTypes = MOVING_POSES,
quirks = arrayOf(blink),
animations = arrayOf(
singleBoneLook(),
bedrock("quilladin", "ground_walk")
)
)
sleep = registerPose(
poseType = PoseType.SLEEP,
transformTicks = 10,
animations = arrayOf(bedrock("quilladin", "sleep"))
)
}
}
@@ -29,7 +29,7 @@ class VivillonModel(root: ModelPart) : PokemonPosableModel(root), HeadedFrame, B
override var portraitTranslation = Vec3(-0.3, 0.2, 0.0)
override var profileScale = 0.7F
override var profileTranslation = Vec3(0.1, 0.8, 0.0)
override var profileTranslation = Vec3(0.0, 0.8, 0.0)
lateinit var standing: Pose
lateinit var walk: Pose
@@ -231,13 +231,8 @@ object VaryingModelRepository {
inbuilt("paras", ::ParasModel)
inbuilt("mankey", ::MankeyModel)
inbuilt("primeape", ::PrimeapeModel)
inbuilt("oddish", ::OddishModel)
inbuilt("gloom", ::GloomModel)
inbuilt("vileplume", ::VileplumeModel)
inbuilt("bellossom", ::BellossomModel)
inbuilt("voltorb", ::VoltorbModel)
inbuilt("electrode", ::ElectrodeModel)
inbuilt("ekans", ::EkansModel)
inbuilt("machop", ::MachopModel)
inbuilt("machoke", ::MachokeModel)
inbuilt("machamp", ::MachampModel)
@@ -266,8 +261,6 @@ object VaryingModelRepository {
inbuilt("nidorino", ::NidorinoModel)
inbuilt("persian", ::PersianModel)
inbuilt("pinsir", ::PinsirModel)
inbuilt("poliwag", ::PoliwagModel)
inbuilt("politoed", ::PolitoedModel)
inbuilt("ponyta", ::PonytaModel)
inbuilt("psyduck", ::PsyduckModel)
inbuilt("rapidash", ::RapidashModel)
@@ -318,9 +311,6 @@ object VaryingModelRepository {
inbuilt("morelull", :: MorelullModel)
inbuilt("shiinotic", :: ShiinoticModel)
inbuilt("spiritomb", :: SpiritombModel)
inbuilt("chespin", :: ChespinModel)
inbuilt("quilladin", :: QuilladinModel)
inbuilt("chesnaught", :: ChesnaughtModel)
inbuilt("pineco", :: PinecoModel)
inbuilt("lotad", :: LotadModel)
inbuilt("lombre", :: LombreModel)
@@ -348,9 +338,6 @@ object VaryingModelRepository {
inbuilt("walkingwake", ::WalkingwakeModel)
inbuilt("ironleaves", ::IronleavesModel)
inbuilt("miltank", ::MiltankModel)
inbuilt("froakie", ::FroakieModel)
inbuilt("frogadier", ::FrogadierModel)
inbuilt("greninja", ::GreninjaModel)
inbuilt("grookey", ::GrookeyModel)
inbuilt("thwackey", ::ThwackeyModel)
inbuilt("rillaboom", ::RillaboomModel)
@@ -375,7 +362,6 @@ object VaryingModelRepository {
inbuilt("gliscor", ::GliscorModel)
inbuilt("poochyena", ::PoochyenaModel)
inbuilt("mightyena", ::MightyenaModel)
inbuilt("shroomish", ::ShroomishModel)
inbuilt("breloom", ::BreloomModel)
inbuilt("charcadet", ::CharcadetModel)
inbuilt("flittle", ::FlittleModel)
@@ -397,8 +383,6 @@ object VaryingModelRepository {
inbuilt("sirfetchd", ::SirfetchdModel)
inbuilt("duskull", ::DuskullModel)
inbuilt("dusclops", ::DusclopsModel)
inbuilt("bonsly", ::BonslyModel)
inbuilt("sudowoodo", ::SudowoodoModel)
inbuilt("cetoddle", ::CetoddleModel)
inbuilt("cetitan", ::CetitanModel)
inbuilt("aipom", ::AipomModel)
@@ -406,9 +390,6 @@ object VaryingModelRepository {
inbuilt("hoothoot", ::HoothootModel)
inbuilt("wingull", ::WingullModel)
inbuilt("pelipper", ::PelipperModel)
inbuilt("shinx", ::ShinxModel)
inbuilt("luxio", ::LuxioModel)
inbuilt("luxray", ::LuxrayModel)
inbuilt("numel", ::NumelModel)
inbuilt("roggenrola", ::RoggenrolaModel)
inbuilt("boldore", ::BoldoreModel)
@@ -9,6 +9,7 @@
package com.cobblemon.mod.common.command
import com.cobblemon.mod.common.api.permission.CobblemonPermissions
import com.cobblemon.mod.common.api.pokemon.PokemonPropertyExtractor
import com.cobblemon.mod.common.command.argument.PokemonPropertiesArgumentType
import com.cobblemon.mod.common.util.party
import com.cobblemon.mod.common.util.permission
@@ -44,7 +45,7 @@ object TestPartySlotCommand {
val player = context.player(PLAYER)
val slot = IntegerArgumentType.getInteger(context, SLOT)
val properties = PokemonPropertiesArgumentType.getPokemonProperties(context, PROPERTIES)
val target = player.party().get(slot - 1) ?: return NO_SUCCESS
return if (properties.matches(target)) Command.SINGLE_SUCCESS else NO_SUCCESS
return if (player.party().get(slot - 1)?.createPokemonProperties(PokemonPropertyExtractor.ALL)
?.let { properties.isSubSetOf(it) } == true) Command.SINGLE_SUCCESS else NO_SUCCESS
}
}
@@ -15,7 +15,6 @@ import com.cobblemon.mod.common.api.berry.Berries
import com.cobblemon.mod.common.api.cooking.Seasonings
import com.cobblemon.mod.common.api.data.DataProvider
import com.cobblemon.mod.common.api.data.DataRegistry
import com.cobblemon.mod.common.api.data.ServerJsonDataRegistry
import com.cobblemon.mod.common.api.dialogue.Dialogues
import com.cobblemon.mod.common.api.events.CobblemonEvents
import com.cobblemon.mod.common.api.fishing.PokeRods
@@ -52,7 +51,6 @@ import com.cobblemon.mod.common.pokemon.properties.PropertiesCompletionProvider
import com.cobblemon.mod.common.util.cobblemonResource
import com.cobblemon.mod.common.util.ifClient
import com.cobblemon.mod.common.util.server
import net.minecraft.core.HolderLookup
import java.util.UUID
import net.minecraft.resources.ResourceLocation
import net.minecraft.server.level.ServerPlayer
@@ -73,7 +71,8 @@ object CobblemonDataProvider : DataProvider {
// client is public only so we can use it cross-module. maybe a more elegant solution exists, but this works
@ApiStatus.Internal
val clientResourceReloader: PreparableReloadListener = ClientResourceReloader()
val clientResourceReloader: PreparableReloadListener = SimpleResourceReloader(PackType.CLIENT_RESOURCES)
private val serverResourceReloader: PreparableReloadListener = SimpleResourceReloader(PackType.SERVER_DATA)
fun registerDefaults() {
this.register(CobblemonScripts, reloadable = true)
@@ -127,9 +126,9 @@ object CobblemonDataProvider : DataProvider {
}
ifClient {
Cobblemon.implementation.registerResourceReloader(cobblemonResource("client_resources"), PackType.CLIENT_RESOURCES, emptyList()) { clientResourceReloader }
Cobblemon.implementation.registerResourceReloader(cobblemonResource("client_resources"), clientResourceReloader, PackType.CLIENT_RESOURCES, emptyList())
}
Cobblemon.implementation.registerResourceReloader(cobblemonResource("data_resources"), PackType.SERVER_DATA, emptyList()) { ServerResourceReloader(it) }
Cobblemon.implementation.registerResourceReloader(cobblemonResource("data_resources"), serverResourceReloader, PackType.SERVER_DATA, emptyList())
}
override fun <T : DataRegistry> register(registry: T, reloadable: Boolean): T {
@@ -168,25 +167,12 @@ object CobblemonDataProvider : DataProvider {
}
}
private class ClientResourceReloader : ResourceManagerReloadListener {
override fun onResourceManagerReload(manager: ResourceManager) {
registries.filter { it.type == PackType.CLIENT_RESOURCES }.forEach { it.reload(manager) }
}
}
private class ServerResourceReloader(private val registryAccess: HolderLookup.Provider) : ResourceManagerReloadListener {
private class SimpleResourceReloader(private val type: PackType) : ResourceManagerReloadListener {
override fun onResourceManagerReload(manager: ResourceManager) {
// Check for a server running, this is due to the create a world screen triggering datapack reloads, these are fine to happen as many times as needed as players may be in the process of adding their datapacks.
val reloadAllowed = server()?.isReady != true
registries
.filter { it.type == PackType.SERVER_DATA && (reloadAllowed || it in reloadableRegistries) }
.forEach {
if (it is ServerJsonDataRegistry<*>) {
it.reload(manager, registryAccess)
} else {
it.reload(manager)
}
}
registries.filter { it.type == this.type && (reloadAllowed || it in reloadableRegistries) }
.forEach { it.reload(manager) }
}
}
}
@@ -487,47 +487,6 @@ object CobblemonItemGroups {
entries.accept(CobblemonItems.PINK_PLAQUE)
CobblemonItems.campfire_pots.forEach(entries::accept)
entries.accept(CobblemonItems.COPPER_OVEN)
entries.accept(CobblemonItems.COPPER_WASHER)
entries.accept(CobblemonItems.COPPER_FAN)
entries.accept(CobblemonItems.COPPER_MOWER)
entries.accept(CobblemonItems.COPPER_FRIDGE)
entries.accept(CobblemonItems.EXPOSED_COPPER_OVEN)
entries.accept(CobblemonItems.EXPOSED_COPPER_WASHER)
entries.accept(CobblemonItems.EXPOSED_COPPER_FAN)
entries.accept(CobblemonItems.EXPOSED_COPPER_MOWER)
entries.accept(CobblemonItems.EXPOSED_COPPER_FRIDGE)
entries.accept(CobblemonItems.WEATHERED_COPPER_OVEN)
entries.accept(CobblemonItems.WEATHERED_COPPER_WASHER)
entries.accept(CobblemonItems.WEATHERED_COPPER_FAN)
entries.accept(CobblemonItems.WEATHERED_COPPER_MOWER)
entries.accept(CobblemonItems.WEATHERED_COPPER_FRIDGE)
entries.accept(CobblemonItems.OXIDIZED_COPPER_OVEN)
entries.accept(CobblemonItems.OXIDIZED_COPPER_WASHER)
entries.accept(CobblemonItems.OXIDIZED_COPPER_FAN)
entries.accept(CobblemonItems.OXIDIZED_COPPER_MOWER)
entries.accept(CobblemonItems.OXIDIZED_COPPER_FRIDGE)
entries.accept(CobblemonItems.WAXED_COPPER_OVEN)
entries.accept(CobblemonItems.WAXED_COPPER_WASHER)
entries.accept(CobblemonItems.WAXED_COPPER_FAN)
entries.accept(CobblemonItems.WAXED_COPPER_MOWER)
entries.accept(CobblemonItems.WAXED_COPPER_FRIDGE)
entries.accept(CobblemonItems.WAXED_EXPOSED_COPPER_OVEN)
entries.accept(CobblemonItems.WAXED_EXPOSED_COPPER_WASHER)
entries.accept(CobblemonItems.WAXED_EXPOSED_COPPER_FAN)
entries.accept(CobblemonItems.WAXED_EXPOSED_COPPER_MOWER)
entries.accept(CobblemonItems.WAXED_EXPOSED_COPPER_FRIDGE)
entries.accept(CobblemonItems.WAXED_WEATHERED_COPPER_OVEN)
entries.accept(CobblemonItems.WAXED_WEATHERED_COPPER_WASHER)
entries.accept(CobblemonItems.WAXED_WEATHERED_COPPER_FAN)
entries.accept(CobblemonItems.WAXED_WEATHERED_COPPER_MOWER)
entries.accept(CobblemonItems.WAXED_WEATHERED_COPPER_FRIDGE)
entries.accept(CobblemonItems.WAXED_OXIDIZED_COPPER_OVEN)
entries.accept(CobblemonItems.WAXED_OXIDIZED_COPPER_WASHER)
entries.accept(CobblemonItems.WAXED_OXIDIZED_COPPER_FAN)
entries.accept(CobblemonItems.WAXED_OXIDIZED_COPPER_MOWER)
entries.accept(CobblemonItems.WAXED_OXIDIZED_COPPER_FRIDGE)
}
private fun consumableEntries(displayContext: ItemDisplayParameters, entries: Output) {
@@ -211,8 +211,9 @@ open class Pokemon : ShowdownIdentifiable {
// Species updates already update HP but just a form change may require it
// Moved to before the field was set else it won't actually do the hp calc proper <3
val quotient = clamp(currentHealth / maxHealth.toFloat(), 0F, 1F)
val oldForm = field
field = value
this.updateMovesOnFormChange(value)
this.updateMovesOnFormChange(oldForm)
// Evo proxy is already cleared on species update but the form may be changed by itself, this is fine and no unnecessary packets will be sent out
this.evolutionProxy.current().clear()
checkGender()
@@ -2301,15 +2302,16 @@ open class Pokemon : ShowdownIdentifiable {
*
* E.g, Removing Overheat from Rotom when it is no longer Rotom-Heat and the target form is not compatible with Overheat.
*/
private fun updateMovesOnFormChange(newForm: FormData) {
private fun updateMovesOnFormChange(oldForm: FormData) {
if (this.isClient) return
val oldFormChangeMoves = this.form.moves.formChangeMoves.toSet()
val newForm = this.form
val oldFormChangeMoves = oldForm.moves.formChangeMoves.toSet()
// Only remove moves that were provided by the old form's form-change moves AND are not learnable by the new form
for (i in 0 until MoveSet.MOVE_COUNT) {
val move = this.moveSet[i]
if (move != null && move.template in oldFormChangeMoves) {
if (move != null && move.template in oldFormChangeMoves && !LearnsetQuery.ANY.canLearn(move.template, newForm.moves)) {
this.moveSet.setMove(i, null)
}
}
@@ -2322,16 +2324,8 @@ open class Pokemon : ShowdownIdentifiable {
}
}
// Add new form's form-change moves
newForm.moves.formChangeMoves.forEach { move ->
if (this.moveSet.filterNotNull().none { it.template == move }) {
if (this.moveSet.hasSpace()) {
this.moveSet.add(move.create())
} else {
this.benchedMoves.add(BenchedMove(move, 0))
}
}
}
// Add the new form's form-change moves (skipping any the Pokémon isn't high enough level for yet).
grantEligibleFormChangeMoves()
// If moveset is empty try to find one valid move to fill it
if (this.moveSet.filterNotNull().isEmpty()) {
@@ -2343,6 +2337,30 @@ open class Pokemon : ShowdownIdentifiable {
}
}
/**
* Grants any of the current form's `form_change` moves that this Pokémon doesn't already know and is high
* enough level for (form-change moves that are also level-up moves, e.g. Glaciate on Kyurem, shouldn't be
* granted until that level is reached).
*/
private fun grantEligibleFormChangeMoves() {
if (this.isClient) return
this.form.moves.formChangeMoves.forEach { move ->
if (this.moveSet.filterNotNull().none { it.template == move } && this.benchedMoves.none { it.moveTemplate == move }) {
val requiredLevel = this.form.moves.levelUpMoves.entries.firstOrNull { move in it.value }?.key
if (requiredLevel != null && this.level < requiredLevel) {
return@forEach
}
if (this.moveSet.hasSpace()) {
this.moveSet.add(move.create())
} else {
this.benchedMoves.add(BenchedMove(move, 0))
}
}
}
}
companion object {
/**
* The [FriendshipMutationCalculator] used when a Pokémon levels up.
@@ -9,7 +9,6 @@
package com.cobblemon.mod.common.pokemon.evolution.adapters
import com.cobblemon.mod.common.util.adapters.CodecBackedAdapter
import com.cobblemon.mod.common.util.adapters.RegistryAccessResolver
import com.google.gson.JsonDeserializationContext
import com.google.gson.JsonDeserializer
import com.google.gson.JsonElement
@@ -20,7 +19,6 @@ import net.minecraft.advancements.critereon.ItemCustomDataPredicate
import net.minecraft.advancements.critereon.ItemPredicate
import net.minecraft.advancements.critereon.ItemSubPredicates
import net.minecraft.advancements.critereon.NbtPredicate
import net.minecraft.core.HolderLookup
import net.minecraft.core.registries.BuiltInRegistries
import net.minecraft.core.registries.Registries
import net.minecraft.resources.ResourceLocation
@@ -28,16 +26,13 @@ import net.minecraft.tags.TagKey
import java.lang.reflect.Type
// This is an ugly adapter because breaking changes are scary and people would ;(
class LegacyItemConditionWrapperAdapter(val registryAccess: HolderLookup.Provider = RegistryAccessResolver.getAccess())
: JsonDeserializer<ItemPredicate>, JsonSerializer<ItemPredicate> {
object LegacyItemConditionWrapperAdapter : JsonDeserializer<ItemPredicate>, JsonSerializer<ItemPredicate> {
companion object {
private const val TAG_PREFIX = "#"
private const val LEGACY_ITEM = "item"
private const val LEGACY_NBT = "nbt"
}
private const val TAG_PREFIX = "#"
private const val LEGACY_ITEM = "item"
private const val LEGACY_NBT = "nbt"
private val codecAdapter = CodecBackedAdapter(ItemPredicate.CODEC, registryAccess)
private val codecAdapter = CodecBackedAdapter(ItemPredicate.CODEC)
override fun deserialize(json: JsonElement, typeOfT: Type, context: JsonDeserializationContext): ItemPredicate {
if (json.isJsonPrimitive) {
@@ -69,9 +64,7 @@ class LegacyItemConditionWrapperAdapter(val registryAccess: HolderLookup.Provide
{ id ->
if (isTag) {
val tag = TagKey.create(Registries.ITEM, id)
registryAccess.lookup(Registries.ITEM)
.map { builder.of(tag) }
.orElseGet { builder }
builder.of(tag)
} else {
BuiltInRegistries.ITEM.getOptional(id)
.map { builder.of(it) }
@@ -82,4 +75,4 @@ class LegacyItemConditionWrapperAdapter(val registryAccess: HolderLookup.Provide
)
}
}
}
@@ -10,19 +10,16 @@ package com.cobblemon.mod.common.util.adapters
import com.google.gson.*
import com.mojang.serialization.Codec
import com.mojang.serialization.JsonOps
import net.minecraft.core.HolderLookup
import net.minecraft.resources.RegistryOps
import java.lang.reflect.Type
class CodecBackedAdapter<T>(val codec: Codec<T>, val registryAccess: HolderLookup.Provider = RegistryAccessResolver.getAccess()) : JsonDeserializer<T>, JsonSerializer<T> {
class CodecBackedAdapter<T>(val codec: Codec<T>) : JsonDeserializer<T>, JsonSerializer<T> {
override fun deserialize(
jElement: JsonElement,
typeOfT: Type,
context: JsonDeserializationContext
): T {
val ops = RegistryOps.create(JsonOps.INSTANCE, registryAccess)
val ops = RegistryOpsProvider.getOpsWithDefaultFallback()
val result = ops.withDecoder(codec).apply(jElement)
return result.result().orElseThrow {
IllegalStateException("Failed to deserialize $jElement: ${result.error().orElse(null)}")
@@ -34,7 +31,7 @@ class CodecBackedAdapter<T>(val codec: Codec<T>, val registryAccess: HolderLooku
typeOfSrc: Type?,
context: JsonSerializationContext?
): JsonElement {
val ops = RegistryOps.create(JsonOps.INSTANCE, registryAccess)
val ops = RegistryOpsProvider.getOpsWithDefaultFallback()
val result = ops.withEncoder(codec).apply(src)
return result.result().orElseThrow {
IllegalStateException("Failed to serialize $src: ${result.error().orElse(null)}")
@@ -15,33 +15,27 @@ import com.google.gson.JsonElement
import com.mojang.serialization.DynamicOps
import com.mojang.serialization.JsonOps
import net.minecraft.client.Minecraft
import net.minecraft.core.RegistryAccess
import net.minecraft.resources.RegistryOps
/**
* Utility for getting RegistryAccess with the correct client/server registry access.
* Used when as a fallback when manually encoding/decoding registry-backed values (e.g., items, predicates).
* Utility for obtaining RegistryOps with the correct client/server registry access.
* Used when manually encoding/decoding registry-backed values (e.g., items, predicates).
*/
object RegistryAccessResolver {
fun getAccess(): RegistryAccess {
try {
Cobblemon.implementation
} catch (e: UninitializedPropertyAccessException) {
return RegistryAccess.EMPTY
}
object RegistryOpsProvider {
fun getOpsWithDefaultFallback(): DynamicOps<JsonElement> {
if (Cobblemon.implementation.environment() == Environment.CLIENT) {
val minecraft = Minecraft.getInstance()
if (minecraft != null && minecraft.level != null)
return minecraft.level!!.registryAccess()
return RegistryOps.create(JsonOps.INSTANCE, minecraft.level!!.registryAccess())
}
if (Cobblemon.implementation.environment() == Environment.SERVER) {
val server = server()
if (server != null)
return server.registryAccess()
return RegistryOps.create(JsonOps.INSTANCE, server.registryAccess())
}
return RegistryAccess.EMPTY
return JsonOps.INSTANCE
}
}
@@ -13,7 +13,6 @@ import com.cobblemon.mod.common.api.abilities.Abilities
import com.cobblemon.mod.common.api.abilities.Ability
import com.cobblemon.mod.common.api.moves.BenchedMoves
import com.cobblemon.mod.common.api.moves.MoveSet
import com.cobblemon.mod.common.api.pokemon.feature.SpeciesFeatures
import com.cobblemon.mod.common.pokemon.EVs
import com.cobblemon.mod.common.pokemon.FormData
import com.cobblemon.mod.common.pokemon.Gender
@@ -22,22 +21,20 @@ import com.cobblemon.mod.common.pokemon.Pokemon
import com.cobblemon.mod.common.pokemon.Species
import com.cobblemon.mod.common.util.DataKeys
import com.cobblemon.mod.common.util.codec.CodecUtils
import com.cobblemon.mod.common.util.codec.internal.ClientPokemonP1.Companion.FEATURES
import com.cobblemon.mod.common.util.codec.internal.ClientPokemonP1.Companion.FEATURE_ID
import com.mojang.serialization.Codec
import com.mojang.serialization.MapCodec
import com.mojang.serialization.codecs.RecordCodecBuilder
import java.util.Optional
import java.util.UUID
import net.minecraft.core.UUIDUtil
import net.minecraft.nbt.CompoundTag
import net.minecraft.nbt.StringTag
import net.minecraft.nbt.Tag
import net.minecraft.network.chat.Component
import net.minecraft.network.chat.ComponentSerialization
internal class PokemonP1(
val uuid: UUID,
val species: Species,
val form: FormData,
val features: List<CompoundTag>,
val nickname: Optional<Component>,
val level: Int,
val experience: Int,
val friendship: Int,
@@ -58,22 +55,7 @@ internal class PokemonP1(
other.ability = this.ability
other.species = this.species
other.form = this.form
this.features.forEach { featureNbt ->
val featureId = featureNbt.getString(FEATURE_ID)
if (featureId.isEmpty()) {
return@forEach
}
val speciesFeatureProviders = SpeciesFeatures.getFeaturesFor(other.species)
val feature = speciesFeatureProviders.firstNotNullOfOrNull { provider -> provider(featureNbt) } ?: return@forEach
if (
featureNbt.contains("keys", Tag.TAG_STRING.toInt()) &&
!featureNbt.getList("keys", Tag.TAG_STRING.toInt()).contains(StringTag.valueOf(featureId))
) {
return@forEach
}
other.features.removeIf { it.name == feature.name }
other.features.add(feature)
}
this.nickname.ifPresent { other.nickname = it.copy() }
other.level = this.level
other.experience = this.experience
other.setFriendship(this.friendship)
@@ -109,7 +91,7 @@ internal class PokemonP1(
UUIDUtil.LENIENT_CODEC.fieldOf(DataKeys.POKEMON_UUID).forGetter(PokemonP1::uuid),
Species.BY_IDENTIFIER_CODEC.fieldOf(DataKeys.POKEMON_SPECIES_IDENTIFIER).forGetter(PokemonP1::species),
Codec.STRING.fieldOf(DataKeys.POKEMON_FORM_ID).forGetter { pokemon -> pokemon.form.formOnlyShowdownId() },
Codec.list(CompoundTag.CODEC).optionalFieldOf(FEATURES, emptyList()).forGetter(PokemonP1::features),
ComponentSerialization.CODEC.optionalFieldOf(DataKeys.POKEMON_NICKNAME).forGetter(PokemonP1::nickname),
CodecUtils.dynamicIntRange(1) { Cobblemon.config.maxPokemonLevel }.fieldOf(DataKeys.POKEMON_LEVEL).forGetter(PokemonP1::level),
Codec.intRange(0, Int.MAX_VALUE).fieldOf(DataKeys.POKEMON_EXPERIENCE).forGetter(PokemonP1::experience),
CodecUtils.dynamicIntRange(0) { Cobblemon.config.maxPokemonFriendship }.fieldOf(DataKeys.POKEMON_FRIENDSHIP).forGetter(PokemonP1::friendship),
@@ -122,9 +104,9 @@ internal class PokemonP1(
Codec.FLOAT.fieldOf(DataKeys.POKEMON_SCALE_MODIFIER).forGetter(PokemonP1::scaleModifier),
Codec.BOOL.fieldOf(DataKeys.POKEMON_SHINY).forGetter(PokemonP1::shiny),
Ability.CODEC.fieldOf(DataKeys.POKEMON_ABILITY).forGetter(PokemonP1::ability)
).apply(instance) { uuid, species, formId, features, level, experience, friendship, currentHealth, gender, ivs, evs, moveSet, benchedMoves, scaleModifier, shiny, ability ->
).apply(instance) { uuid, species, formId, nickname, level, experience, friendship, currentHealth, gender, ivs, evs, moveSet, benchedMoves, scaleModifier, shiny, ability ->
val form = species.forms.firstOrNull { it.formOnlyShowdownId() == formId } ?: species.standardForm
PokemonP1(uuid, species, form, features, level, experience, friendship, currentHealth, gender, ivs, evs, moveSet, benchedMoves, scaleModifier, shiny, ability)
PokemonP1(uuid, species, form, nickname, level, experience, friendship, currentHealth, gender, ivs, evs, moveSet, benchedMoves, scaleModifier, shiny, ability)
}
}
@@ -132,11 +114,7 @@ internal class PokemonP1(
pokemon.uuid,
pokemon.species,
pokemon.form,
pokemon.features.map { feature ->
val nbt = CompoundTag()
nbt.putString(FEATURE_ID, feature.name)
feature.saveToNBT(nbt)
},
Optional.ofNullable(pokemon.nickname),
pokemon.level,
pokemon.experience,
pokemon.friendship,
@@ -14,12 +14,15 @@ import com.cobblemon.mod.common.api.riding.stats.RidingStat
import com.cobblemon.mod.common.pokemon.OriginalTrainerType
import com.cobblemon.mod.common.pokemon.Pokemon
import com.cobblemon.mod.common.util.DataKeys
import com.cobblemon.mod.common.util.codec.internal.ClientPokemonP1.Companion.FEATURES
import com.cobblemon.mod.common.util.codec.internal.ClientPokemonP1.Companion.FEATURE_ID
import com.cobblemon.mod.common.util.codec.optionalFieldOfWithDefault
import com.mojang.serialization.Codec
import com.mojang.serialization.MapCodec
import com.mojang.serialization.codecs.RecordCodecBuilder
import net.minecraft.network.chat.Component
import net.minecraft.network.chat.ComponentSerialization
import net.minecraft.nbt.CompoundTag
import net.minecraft.nbt.StringTag
import net.minecraft.nbt.Tag
import net.minecraft.resources.ResourceLocation
import net.minecraft.world.item.ItemStack
import java.util.*
@@ -28,7 +31,7 @@ internal data class PokemonP3(
val originalTrainerType: OriginalTrainerType,
val originalTrainer: Optional<String>,
val forcedAspects: Set<String>,
val nickname: Optional<Component>,
val features: List<CompoundTag>,
val heldItemVisible: Optional<Boolean>,
val canDropHeldItem: Optional<Boolean>,
val cosmeticItem: ItemStack,
@@ -48,7 +51,22 @@ internal data class PokemonP3(
this.originalTrainer.ifPresent { other.originalTrainer = it }
other.refreshOriginalTrainer()
other.forcedAspects = this.forcedAspects
this.nickname.ifPresent { other.nickname = it.copy() }
this.features.forEach { featureNbt ->
val featureId = featureNbt.getString(FEATURE_ID)
if (featureId.isEmpty()) {
return@forEach
}
val speciesFeatureProviders = SpeciesFeatures.getFeaturesFor(other.species)
val feature = speciesFeatureProviders.firstNotNullOfOrNull { provider -> provider(featureNbt) } ?: return@forEach
if (
featureNbt.contains("keys", Tag.TAG_STRING.toInt()) &&
!featureNbt.getList("keys", Tag.TAG_STRING.toInt()).contains(StringTag.valueOf(featureId))
) {
return@forEach
}
other.features.removeIf { it.name == feature.name }
other.features.add(feature)
}
this.heldItemVisible.ifPresent { other.heldItemVisible = it }
this.canDropHeldItem.ifPresent { other.canDropHeldItem = it }
this.cosmeticItem.let { other.cosmeticItem = it }
@@ -74,7 +92,7 @@ internal data class PokemonP3(
OriginalTrainerType.CODEC.optionalFieldOfWithDefault(DataKeys.POKEMON_ORIGINAL_TRAINER_TYPE, OriginalTrainerType.NONE).forGetter(PokemonP3::originalTrainerType),
Codec.STRING.optionalFieldOf(DataKeys.POKEMON_ORIGINAL_TRAINER).forGetter(PokemonP3::originalTrainer),
Codec.list(Codec.STRING).optionalFieldOf(DataKeys.POKEMON_FORCED_ASPECTS, emptyList()).forGetter { it.forcedAspects.toMutableList() },
ComponentSerialization.CODEC.optionalFieldOf(DataKeys.POKEMON_NICKNAME).forGetter(PokemonP3::nickname),
Codec.list(CompoundTag.CODEC).optionalFieldOf(FEATURES, emptyList()).forGetter(PokemonP3::features),
Codec.BOOL.optionalFieldOf(DataKeys.HELD_ITEM_VISIBLE).forGetter(PokemonP3::heldItemVisible),
Codec.BOOL.optionalFieldOf(DataKeys.HELD_ITEM_AI_DROPPABLE).forGetter(PokemonP3::canDropHeldItem),
ItemStack.CODEC.optionalFieldOf(DataKeys.POKEMON_COSMETIC_ITEM).forGetter { Optional.ofNullable(it.cosmeticItem.takeIf { !it.isEmpty }) },
@@ -91,7 +109,7 @@ internal data class PokemonP3(
originalTrainerType,
originalTrainer,
forcedAspects,
nickname,
features,
heldItemVisible,
canDropHeldItem,
cosmeticItem,
@@ -107,7 +125,7 @@ internal data class PokemonP3(
originalTrainerType,
originalTrainer,
forcedAspects.toSet(),
nickname,
features,
heldItemVisible,
canDropHeldItem,
cosmeticItem.orElse(ItemStack.EMPTY),
@@ -128,7 +146,11 @@ internal data class PokemonP3(
pokemon.originalTrainerType,
Optional.ofNullable(pokemon.originalTrainer),
pokemon.forcedAspects,
Optional.ofNullable(pokemon.nickname),
pokemon.features.map { feature ->
val nbt = CompoundTag()
nbt.putString(FEATURE_ID, feature.name)
feature.saveToNBT(nbt)
},
Optional.ofNullable(pokemon.heldItemVisible),
Optional.ofNullable(pokemon.canDropHeldItem),
pokemon.cosmeticItem,
@@ -0,0 +1,75 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:greninja_cloud",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particle/vanilla/big_smoke_white"
}
},
"events": {
"cloudfade": {
"particle_effect": {
"effect": "cobblemon:greninja_cloud_fade",
"type": "particle_with_velocity"
}
}
},
"components": {
"minecraft:emitter_rate_instant": {
"num_particles": "math.random_integer(10,12)"
},
"minecraft:emitter_lifetime_once": {
"active_time": 1
},
"minecraft:emitter_shape_box": {
"offset": [0, 1, 0],
"half_dimensions": [0.35, 0.75, 0.35],
"direction": ["math.round(math.random(-1,1))", 0, "math.round(math.random(-1,1))"]
},
"minecraft:particle_initialization": {
"per_render_expression": "v.smoke_color = v.particle_random_3;v.smoke_rotation = math.round(v.particle_random_2)*90;"
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": "0.7+(0.1*math.round(v.particle_random_4))"
},
"minecraft:particle_lifetime_events": {
"expiration_event": "cloudfade"
},
"minecraft:particle_initial_spin": {
"rotation": "v.smoke_rotation"
},
"minecraft:particle_initial_speed": 0.85,
"minecraft:particle_motion_dynamic": {
"linear_acceleration": [0, "0.75+(0.75*math.round(v.particle_random_4))", 0],
"linear_drag_coefficient": 2
},
"minecraft:particle_appearance_billboard": {
"size": [0.4, 0.4],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 16,
"texture_height": 192,
"flipbook": {
"base_UV": [0, 160],
"size_UV": [16, 16],
"step_UV": [0, -16],
"frames_per_second": 28,
"max_frame": 7
}
}
},
"minecraft:particle_appearance_lighting": {},
"minecraft:particle_appearance_tinting": {
"color": {
"interpolant": "v.smoke_color",
"gradient": {
"0.0": "#FFE8E8E8",
"1.0": "#FFC1C1C1"
}
}
}
}
}
}
@@ -0,0 +1,57 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:greninja_cloud_fade",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particle/vanilla/big_smoke_white"
}
},
"components": {
"minecraft:emitter_rate_instant": {
"num_particles": 1
},
"minecraft:emitter_lifetime_once": {
"active_time": 1
},
"minecraft:emitter_shape_point": {},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 0.2
},
"minecraft:particle_initial_spin": {
"rotation": "v.smoke_rotation"
},
"minecraft:particle_initial_speed": 0.85,
"minecraft:particle_motion_dynamic": {
"linear_acceleration": [0, 1.5, 0],
"linear_drag_coefficient": 2
},
"minecraft:particle_appearance_billboard": {
"size": [0.3, 0.3],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 16,
"texture_height": 192,
"flipbook": {
"base_UV": [0, 80],
"size_UV": [16, 16],
"step_UV": [0, 16],
"frames_per_second": 32,
"max_frame": 7
}
}
},
"minecraft:particle_appearance_lighting": {},
"minecraft:particle_appearance_tinting": {
"color": {
"interpolant": "v.smoke_color",
"gradient": {
"0.0": "#FFE8E8E8",
"1.0": "#FFC1C1C1"
}
}
}
}
}
}
@@ -0,0 +1,82 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:greninja_smoke",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particle/vanilla/generic"
}
},
"curves": {
"variable.smokesize": {
"type": "linear",
"input": "v.particle_age",
"horizontal_range": "v.particle_lifetime",
"nodes": [0.37, 0.85, 1, 1, 1, 0.88, 0.55, 0]
}
},
"events": {
"cloud": {
"particle_effect": {
"effect": "cobblemon:greninja_cloud",
"type": "particle"
}
}
},
"components": {
"minecraft:emitter_rate_steady": {
"spawn_rate": 150,
"max_particles": 200
},
"minecraft:emitter_lifetime_once": {
"active_time": 0.15
},
"minecraft:emitter_lifetime_events": {
"creation_event": "cloud"
},
"minecraft:emitter_shape_disc": {
"offset": [0, "v.particle_random_4*0.75", 0],
"radius": 0.35,
"direction": "outwards"
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": "math.random(0.55,0.65)"
},
"minecraft:particle_initial_spin": {
"rotation": "math.round(v.particle_random_4*3)*90"
},
"minecraft:particle_initial_speed": 2,
"minecraft:particle_motion_dynamic": {
"linear_acceleration": [0, "math.random(0.75,1)", 0],
"linear_drag_coefficient": 0.85
},
"minecraft:particle_appearance_billboard": {
"size": ["(0.13*v.smokesize)-(v.particle_random_3*0.07)", "(0.13*v.smokesize)-(v.particle_random_3*0.07)"],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 64,
"texture_height": 8,
"flipbook": {
"base_UV": [56, 0],
"size_UV": [8, 8],
"step_UV": [-8, 0],
"frames_per_second": 10,
"max_frame": 8
}
}
},
"minecraft:particle_appearance_lighting": {},
"minecraft:particle_appearance_tinting": {
"color": {
"interpolant": "v.particle_random_3",
"gradient": {
"0.0": "#FFBDBDBD",
"0.5": "#FF8F8F8F",
"1.0": "#FF666666"
}
}
}
}
}
}
@@ -5,396 +5,722 @@
"loop": true,
"bones": {
"body": {
"rotation": [-5, 0, 0],
"position": [0, "(math.sin(q.anim_time*90*2+90)*1-1)*0.15", 0]
"position": [0, 0, -8]
},
"head": {
"rotation": ["5-(math.sin(q.anim_time*90*2+90)*1-0.5)*0.5", 0, 0]
"rotation": ["72.5-math.sin(q.anim_time*90*2-180)*1.25", -2.5, -10],
"position": [0, 0, 0]
},
"neck2": {
"rotation": ["7.5-math.sin(q.anim_time*90*2-90)", -5, -2.5],
"position": [0, -0.4, 0]
},
"tail": {
"rotation": ["-2.5-(math.sin(q.anim_time*90*2+90)*1-1)*1", 0, 0]
"rotation": [0, 52.5, 0]
},
"tail2": {
"rotation": ["5+(math.sin(q.anim_time*90*2+90)*1-1)*1", 0, 0]
"rotation": [0, -45, 0],
"position": [0.7, 0, -0.55]
},
"tail3": {
"rotation": [2.5, 0, 0]
"rotation": [0, -70, 0],
"position": [1.6, 0, -1.2]
},
"jaw": {
"rotation": ["5-(math.sin(q.anim_time*90*2+90)*1-0.5)*1", 0, 0]
"tail4": {
"rotation": [0, -55, 0],
"position": [0.95, 0, -0.8]
},
"tail5": {
"rotation": [0, "57.5-math.sin(q.anim_time*90*2-120)*0.75", 0],
"position": [-1, 0, -0.75]
},
"tail6": {
"rotation": [0, "57.5-math.sin(q.anim_time*90*2-180)", 0],
"position": [-0.7, 0, -0.8]
},
"tail7": {
"rotation": ["5-math.sin(q.anim_time*90-240)*2", "45-math.sin(q.anim_time*90*2-240)*1.25", 0],
"position": [-0.3, 0, -0.1]
},
"tail8": {
"rotation": ["12.5-math.sin(q.anim_time*90-300)*2.5", "37.5-math.sin(q.anim_time*90*2-300)*1.5", 7.5],
"position": [0, 0.25, 0]
},
"tail9": {
"rotation": ["22.5-math.sin(q.anim_time*90-360)*3", "40-math.sin(q.anim_time*90*2-360)*2", 5]
},
"tail_rattle": {
"rotation": ["22.5-math.sin(q.anim_time*90-30)*4", "-math.sin(q.anim_time*90*2-10)*4", 0]
},
"tail_rattle2": {
"rotation": ["6.4956-math.sin(q.anim_time*90-70)*6", "-math.sin(q.anim_time*90*2-70)*6", 0]
},
"coiled_body": {
"scale": 0
},
"neck": {
"rotation": ["-70-math.sin(q.anim_time*90*2)*0.5", 17.5, -2.5],
"position": [0.2, -0.4, -0.3]
}
}
},
"animation.ekans.summary_idle": {
"animation.ekans.battle_idle": {
"loop": true,
"bones": {
"ekans": {
"position": [0, -0.5, 0]
},
"body": {
"position": [0, 9, 12]
"position": [0, 6, 0]
},
"head": {
"rotation": ["7.5-math.sin(q.anim_time*90*2-45)*0.5", 0, 0]
"rotation": ["35-math.sin(q.anim_time*90*3-180)*2", -11.5, -8.5],
"position": [0.75, 0, -1.1]
},
"neck2": {
"rotation": ["42.5-math.sin(q.anim_time*90*3-60)*1.25", -7.5, -5],
"position": [0, -0.3, 0]
},
"tail": {
"rotation": [-37.5, 0, 0]
"rotation": [90, -32, -272.5],
"position": [-3, -0.5, 1],
"scale": 0
},
"tail2": {
"rotation": [91.18096, -64.66751, -112.80195]
"rotation": [-176.62147, -67.38079, 169.49348]
},
"tail3": {
"rotation": [56.22229, -69.76781, -69.82589]
"rotation": [160, -85, -180]
},
"tail8": {
"rotation": [77.80887, 32.27264, 55.07287],
"position": [-1, -1.1, -2]
},
"tail9": {
"rotation": [18.4215, -23.19625, -12.13932]
},
"tail4": {
"rotation": [0, -65, 0]
"rotation": [87.73292, -75.69796, -92.26708]
},
"tail5": {
"rotation": [0, "-52.5+math.sin(q.anim_time*90*2-120)*1", 0]
"rotation": [-2.5, -87.5, 0]
},
"tail6": {
"rotation": ["8.5+(math.sin(q.anim_time*90*2+90)*1-1)*0.5", "-57.5+math.sin(q.anim_time*90*2-90)*0.5", "-math.sin(q.anim_time*90*2)*0.25"]
"rotation": [0, -62.5, 0]
},
"rattle": {
"rotation": [40, "-10-math.sin(q.anim_time*90*32)*2", 0]
},
"rattle2": {
"rotation": [12.5, "-math.sin(q.anim_time*90*32-30)*2", 0]
},
"rattle3": {
"rotation": [12.5, "-math.sin(q.anim_time*90*32-30*2)*2", 0]
},
"rattle4": {
"rotation": [5, "-math.sin(q.anim_time*90*32-30*3)*2", 0]
},
"rattle5": {
"rotation": [5, "-math.sin(q.anim_time*90*32-30*4)*2", 0]
"tail7": {
"rotation": [-1.41397, -67.50536, -1.13438]
},
"jaw": {
"rotation": ["5-math.sin(q.anim_time*90*2-45)*1", 0, 0]
"rotation": ["12.5-math.sin(q.anim_time*90*3-150)*1.5", 0, 0],
"position": [0, -0.55, 0.25]
},
"coiled_body": {
"rotation": [0, "30-math.sin(q.anim_time*90*3-120)*0.25", 0],
"position": [0, 0, -5]
},
"coiled_body_top": {
"rotation": ["-math.sin(q.anim_time*90*3-60)*0.5", "math.sin(q.anim_time*90*3-60)*0.25", "-2.5-math.sin(q.anim_time*90*1.5+45)*0.5"]
},
"tail_rattle2": {
"rotation": [9.09308, -27.20461, 4.52273]
},
"head_ai": {
"rotation": [0, -5, 5]
},
"neck": {
"rotation": ["-67.5-math.sin(q.anim_time*90*3)", 27.5, "-6.5+math.sin(q.anim_time*90*1.5-90)*1.5"],
"position": [-2, 0, 1.5]
},
"coiled_tail": {
"rotation": ["25+math.sin(q.anim_time*90*1.5-30)*1.5", "-10+math.sin(q.anim_time*90*12-30)*0.75", 7.5]
},
"coiled_tail2": {
"rotation": ["27.5+math.sin(q.anim_time*90*1.5-60)*2", "-22.5+math.sin(q.anim_time*90*12-90)*2.25", 0]
},
"coiled_tail_rattle": {
"rotation": ["27.5+math.sin(q.anim_time*90*1.5-90)*3", "-12.5+math.sin(q.anim_time*90*24-150)*3", -2.5]
},
"coiled_tail_rattle2": {
"rotation": ["math.sin(q.anim_time*90*1.5-120)*3", "math.sin(q.anim_time*90*24-210)*6", 0]
},
"coiled_tail_rattle3": {
"rotation": ["math.sin(q.anim_time*90*1.5-150)*4", "math.sin(q.anim_time*90*24-270)*8", 0]
}
}
},
"animation.ekans.faint": {
"animation_length": 3,
"animation.ekans.ground_walk": {
"loop": true,
"bones": {
"body": {
"rotation": {
"0.0": [-32.5, 0, 0],
"0.05": [-42.5, 0, 0],
"0.2": [-65.02089, -1.05627, 2.26603],
"0.35": [-90, 0, 5],
"0.7": [-97.10022, 0, 5],
"1.0": [-102.1, 0, 5],
"1.1": [-95.59, -0.25, 4.03],
"1.3": [-8.5468, -1.25885, 0.16067],
"1.45": [-7.0468, -1.25885, 0.16067]
},
"position": {
"0.0": [0, "-4.4+(math.sin(q.anim_time*90*2+90)*1-1)*0.15", -1.6],
"0.05": [0, "-2.6+(math.sin(q.anim_time*90*2+90)*1-1)*0.15", -1.1],
"0.2": [0, "-3.6+(math.sin(q.anim_time*90*2+90)*1-1)*0.15", -2.7],
"0.3": [0, -4.83, -6.77],
"0.35": [0, "-4.9+(math.sin(q.anim_time*90*2+90)*1-1)*0.15", -8.8],
"0.7": [0, "-3.8+(math.sin(q.anim_time*90*2+90)*1-1)*0.15", -9.6],
"1.0": [0, "-3.4+(math.sin(q.anim_time*90*2+90)*1-1)*0.15", -10.2],
"1.1": [0, -4, -9.26],
"1.15": [0, "-5.6+(math.sin(q.anim_time*90*2+90)*1-1)*0.15", -5.73],
"1.25": [0, -4.59, -2.31],
"1.3": [0, "-2.45+(math.sin(q.anim_time*90*2+90)*1-1)*0.15", -0.7],
"1.45": [0, "-2.25+(math.sin(q.anim_time*90*2+90)*1-1)*0.05", -0.7]
}
"position": ["-math.sin(q.anim_time*90*3-60)*3", 0, -13]
},
"head": {
"rotation": {
"0.0": ["65-(math.sin(q.anim_time*90*2+90)*1-0.5)*0.5", 0, 0],
"0.1": ["75-(math.sin(q.anim_time*90*2+90)*1-0.5)*0.5", 0, 0],
"0.25": ["15.1228-(math.sin(q.anim_time*90*2+90)*1-0.5)*0.5", 7.24656, 1.9384],
"0.4": ["-21.1683-(math.sin(q.anim_time*90*2+90)*1-0.5)*0.5", 18.759, -7.06381],
"0.5": [-22.32668, 16.91862, -6.3202],
"0.9": ["-25.7603-(math.sin(q.anim_time*90*2+90)*1-0.5)*0.5", -13.61143, 6.36351],
"0.95": ["-26.04-(math.sin(q.anim_time*90*2+90)*1-0.5)*0.5", -15.87438, 7.46234],
"1.0": ["-26.04-(math.sin(q.anim_time*90*2+90)*1-0.5)*0.5", -15.87, 7.46],
"1.15": ["-51.04-(math.sin(q.anim_time*90*2+90)*1-0.5)*0.5", -15.87, 7.46],
"1.3": ["-51.04-(math.sin(q.anim_time*90*2+90)*1-0.5)*0.5", -15.87, 7.46],
"1.35": ["19.4806-(math.sin(q.anim_time*90*2+90)*1-0.5)*0.5", -11.956, -14.52],
"1.4": ["10.9676-(math.sin(q.anim_time*90*2+90)*1-0.5)*0.5", -19.92467, 13.66498],
"1.45": ["20.3399-(math.sin(q.anim_time*90*2+90)*1-0.5)*0.1", -14.86025, -1.19814]
},
"position": {
"1.3": [0, 0, 0],
"1.45": [0, 0.5, 0]
}
"rotation": [55, "math.sin(q.anim_time*90*3+270)*16", "math.sin(q.anim_time*90*3+240)*10"]
},
"neck2": {
"rotation": [-25, "math.sin(q.anim_time*90*3+180)*16", 0]
},
"tail": {
"rotation": {
"0.0": ["5-(math.sin(q.anim_time*90*2+90)*1-1)*1", 0, 0],
"0.05": ["-7.5-(math.sin(q.anim_time*90*2+90)*1-1)*1", 0, 0],
"0.2": ["-7.5-(math.sin(q.anim_time*90*2+90)*1-1)*1", 0, 0],
"0.35": ["7.5-(math.sin(q.anim_time*90*2+90)*1-1)*1", 0, 0],
"1.0": ["7.5-(math.sin(q.anim_time*90*2+90)*1-1)*1", 0, 0],
"1.15": ["7.5-(math.sin(q.anim_time*90*2+90)*1-1)*1", 0, 0],
"1.35": ["7.5-(math.sin(q.anim_time*90*2+90)*1-1)*0.25", 0, 0]
}
"rotation": [0, "math.sin(q.anim_time*90*3)*14", 0]
},
"tail2": {
"rotation": {
"0.0": ["20+(math.sin(q.anim_time*90*2+90)*1-1)*1", 0, 0],
"0.05": ["32.5+(math.sin(q.anim_time*90*2+90)*1-1)*1", 0, 0],
"0.2": ["45+(math.sin(q.anim_time*90*2+90)*1-1)*1", 0, 0],
"0.35": ["55+(math.sin(q.anim_time*90*2+90)*1-1)*1", 0, 0],
"0.95": ["60+(math.sin(q.anim_time*90*2+90)*1-1)*1", 0, 0],
"1.0": ["60+(math.sin(q.anim_time*90*2+90)*1-1)*1", 0, 0],
"1.1": [50.55, 0, 0],
"1.3": ["(math.sin(q.anim_time*90*2+90)*1-1)*0.5", 0, 0]
}
"rotation": [0, "math.sin(q.anim_time*90*3-60)*8", 0]
},
"tail3": {
"rotation": [0, "math.sin(q.anim_time*90*3-120)*12", 0]
},
"tail4": {
"rotation": [0, "math.sin(q.anim_time*90*3-180)*16", 0]
},
"tail5": {
"rotation": [0, "math.sin(q.anim_time*90*3-210)*16", 0]
},
"tail6": {
"rotation": [0, "math.sin(q.anim_time*90*3-240)*14", 0]
},
"tail7": {
"rotation": [0, "math.sin(q.anim_time*90*3-270)*12", 0]
},
"tail8": {
"rotation": [0, "math.sin(q.anim_time*90*3-300)*14", 0]
},
"tail9": {
"rotation": [0, "math.sin(q.anim_time*90*3-330)*18", 0]
},
"tail_rattle": {
"rotation": [0, "math.sin(q.anim_time*90*3-10)*20", 0]
},
"coiled_body": {
"scale": 0
},
"neck": {
"rotation": [-30, "math.sin(q.anim_time*90*3+60)*20", 0],
"position": [0, 0, 0.25]
}
}
},
"animation.ekans.ground_run": {
"loop": true,
"bones": {
"body": {
"position": ["-math.sin(q.anim_time*90*5-60)*3", 0, -13]
},
"head": {
"rotation": [0, "math.sin(q.anim_time*90*5+270)*18", 0]
},
"neck2": {
"rotation": [0, "math.sin(q.anim_time*90*5+180)*16", 0]
},
"tail": {
"rotation": [0, "math.sin(q.anim_time*90*5)*16", 0]
},
"tail2": {
"rotation": [0, "math.sin(q.anim_time*90*5-60)*12", 0]
},
"tail3": {
"rotation": [0, "math.sin(q.anim_time*90*5-120)*14", 0]
},
"tail4": {
"rotation": [0, "math.sin(q.anim_time*90*5-180)*16", 0]
},
"tail5": {
"rotation": [0, "math.sin(q.anim_time*90*5-210)*18", 0]
},
"tail6": {
"rotation": [0, "math.sin(q.anim_time*90*5-240)*18", 0]
},
"tail7": {
"rotation": [0, "math.sin(q.anim_time*90*5-270)*16", 0]
},
"tail8": {
"rotation": [0, "math.sin(q.anim_time*90*5-300)*14", 0]
},
"tail9": {
"rotation": [0, "math.sin(q.anim_time*90*5-330)*12", 0]
},
"tail_rattle": {
"rotation": [0, "math.sin(q.anim_time*90*5-10)*18", 0]
},
"coiled_body": {
"scale": 0
},
"neck": {
"rotation": [0, "math.sin(q.anim_time*90*5+60)*18", 0]
}
}
},
"animation.ekans.snake_ground_walk": {
"loop": true,
"bones": {
"body": {
"position": ["-q.r.yaw_change(3)*1", 0, 0]
},
"head": {
"rotation": [0, 0, "q.r.yaw_change(0)*5"],
"position": ["-q.r.yaw_change(0)*-0.2", "q.r.yaw_change(0)*0.25", 0]
},
"neck2": {
"rotation": [0, "-q.r.yaw_change(0)*-15", 0],
"position": ["-q.r.yaw_change(0)*0.3", 0, 0]
},
"tail": {
"rotation": [0, "-q.r.yaw_change(3)*-7.5", 0],
"position": ["-q.r.yaw_change(3)*-0.15", 0, "math.abs(q.r.yaw_change(3)*0.5)"]
},
"tail2": {
"rotation": [0, "-q.r.yaw_change(5)*5", 0]
},
"tail3": {
"rotation": [0, "-q.r.yaw_change(10)*2.5", 0]
},
"tail4": {
"rotation": [0, "-q.r.yaw_change(12)*7.5", 0]
},
"tail5": {
"rotation": [0, "-q.r.yaw_change(15)*7.5", 0]
},
"tail6": {
"rotation": [0, "-q.r.yaw_change(17)*10", 0]
},
"tail7": {
"rotation": [0, "-q.r.yaw_change(20)*7.5", 0]
},
"tail8": {
"rotation": [0, "-q.r.yaw_change(22)*5", 0]
},
"tail9": {
"rotation": [0, "-q.r.yaw_change(24)*5", 0]
},
"tail_rattle": {
"rotation": [0, "-q.r.yaw_change(26)*2.5", 0]
},
"neck": {
"rotation": [0, "-q.r.yaw_change(0)*-25", 0],
"position": ["-q.r.yaw_change(0)*0.25", 0, 0]
}
}
},
"animation.ekans.snake_ground_run": {
"loop": true,
"bones": {
"body": {
"position": ["-q.r.yaw_change(3)*2", 0, 0]
},
"head": {
"rotation": [0, "-q.r.yaw_change(0)*-10", 0],
"position": ["-q.r.yaw_change(0)*-0.2", "q.r.yaw_change(0)*0.25", 0]
},
"neck2": {
"rotation": [0, "-q.r.yaw_change(0)*-15", 0],
"position": ["-q.r.yaw_change(0)*0.25", 0, 0]
},
"tail": {
"rotation": [0, "-q.r.yaw_change(3)*-10", 0],
"position": ["-q.r.yaw_change(3)*-0.15", 0, 0]
},
"tail2": {
"rotation": [0, "-q.r.yaw_change(5)*5", 0]
},
"tail3": {
"rotation": [0, "-q.r.yaw_change(10)*5", 0]
},
"tail4": {
"rotation": [0, "-q.r.yaw_change(12)*7.5", 0]
},
"tail5": {
"rotation": [0, "-q.r.yaw_change(15)*10", 0]
},
"tail6": {
"rotation": [0, "-q.r.yaw_change(17)*7.5", 0]
},
"tail7": {
"rotation": [0, "-q.r.yaw_change(20)*10", 0]
},
"tail8": {
"rotation": [0, "-q.r.yaw_change(22)*5", 0]
},
"tail9": {
"rotation": [0, "-q.r.yaw_change(24)*5", 0]
},
"tail_rattle": {
"rotation": [0, "-q.r.yaw_change(26)*2.5", 0]
},
"neck": {
"rotation": [0, "-q.r.yaw_change(0)*-35", 0]
}
}
},
"animation.ekans.cry": {
"animation_length": 1.5,
"bones": {
"head": {
"rotation": {
"0.0": [7.5, 0, 0],
"0.05": [17.5, 0, 0],
"0.2": [27.5, 0, 0],
"0.7": [35, 0, 0],
"1.0": [35, 0, 0],
"1.6": [34.96463, -9.99962, 0.08301],
"2.0": [0.01002, 0.32522, 0.69041]
"0.0": [0, 0, 0],
"0.0833": {
"pre": [5, 0, 0],
"post": [5, 0, 0],
"lerp_mode": "catmullrom"
},
"0.2083": {
"post": ["-40-math.sin(q.anim_time*90*30)*1.5", 0, 0],
"lerp_mode": "catmullrom"
},
"0.625": {
"post": [-35, 0, 0],
"lerp_mode": "catmullrom"
},
"1.125": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"1.375": [0, 0, 0]
},
"position": {
"0.0": [0, 0, 0],
"0.0833": [0, 0, 0],
"0.2083": {
"pre": [0, 0, -0.25],
"post": [0, 0, -0.25],
"lerp_mode": "catmullrom"
},
"1.125": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"1.375": [0, 0, 0]
}
},
"jaw": {
"rotation": {
"0.0": ["5-(math.sin(q.anim_time*90*2+90)*1-0.5)*1", 0, 0],
"0.05": ["-35-(math.sin(q.anim_time*90*2+90)*1-0.5)*1", 0, 0],
"0.5": ["27.5-(math.sin(q.anim_time*90*2+90)*1-0.5)*1", 0, 0],
"0.85": ["27.5-(math.sin(q.anim_time*90*2+90)*1-0.5)*1", 0, 0],
"1.1": ["-25-(math.sin(q.anim_time*90*2+90)*1-0.5)*1", 0, 0],
"1.15": ["-15-(math.sin(q.anim_time*90*2+90)*1-0.5)*0.5", 0, 0]
"0.0": [0, 0, 0],
"0.0833": {
"pre": [-5, 0, 0],
"post": [-5, 0, 0],
"lerp_mode": "catmullrom"
},
"0.2083": {
"post": [37.5, 0, 0],
"lerp_mode": "catmullrom"
},
"0.5833": {
"post": [11.5, 0, 0],
"lerp_mode": "catmullrom"
},
"0.7083": {
"post": [7.26, 0, 0],
"lerp_mode": "catmullrom"
},
"0.875": {
"post": [1, 0, 0],
"lerp_mode": "catmullrom"
},
"1.375": [0, 0, 0]
}
},
"eyelid_right": {
"position": {
"0.0": [-0.1, 0, 0],
"0.1": [-0.1, 0, 0],
"0.15": [0, 0, 0],
"1.1": [0, 0, 0],
"1.15": [-0.1, 0, 0]
}
},
"eyelid_left": {
"position": {
"0.0": [0.1, 0, 0],
"0.1": [0.1, 0, 0],
"0.15": [0, 0, 0],
"1.1": [0, 0, 0],
"1.15": [0.1, 0, 0]
}
},
"tail4": {
"neck2": {
"rotation": {
"0.0": [0, 0, 0],
"0.5": [22.5, 0, 0],
"0.65": [25, 0, 0],
"0.95": [32.5, 0, 0],
"1.0": [32.5, 0, 0],
"1.35": [39.56059, -8.33248, 5.56948],
"2.15": [0.00946, 0.60916, 0.36323]
"0.0833": {
"pre": [7.5, 0, 0],
"post": [7.5, 0, 0],
"lerp_mode": "catmullrom"
},
"0.2083": {
"post": [-5, 0, 0],
"lerp_mode": "catmullrom"
},
"0.5": [-5, 0, 0],
"1.125": {
"pre": [0, 0, 0],
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"1.375": [0, 0, 0]
}
},
"tail5": {
"rotation": {
"0.0": [5, 0, 0],
"0.1": [15, 0, 0],
"0.2": [25, 0, 0],
"0.5": [42.82744, -9.23501, -8.46088],
"0.55": [45.68718, -8.80348, -8.90928],
"0.65": [48.18718, -8.80348, -8.90928],
"1.0": [47.64681, 4.67606, 5.90982],
"1.45": [54.85234, 2.05205, 11.11128],
"2.3": [-0.0412, 8.51931, 0.3767]
}
},
"tail6": {
"neck": {
"rotation": {
"0.0": [0, 0, 0],
"0.05": [0, 0, 0],
"0.3": [22.5, 0, 0],
"0.65": [45, 0, 0],
"1.0": [45, 0, 0],
"1.55": [51.77676, 2.80672, 7.84455],
"2.45": [-1.96924, -1.43601, -6.55108]
}
},
"rattle": {
"rotation": {
"0.0": [0, 0, 0],
"0.05": [-10, 0, 0],
"0.75": [15, 0, 0],
"1.0": [15, 0, 0],
"1.65": [20, 10, 5],
"2.55": [0, -2.5, -2.5]
}
},
"rattle4": {
"rotation": {
"0.0": [0, 0, 0],
"0.1": [-10, 0, 0],
"0.55": [10, 0, 0],
"1.0": [15, 0, 0],
"1.75": [20, 10, 5],
"2.65": [2.5, -5, 0]
}
},
"rattle2": {
"rotation": {
"0.0": [0, 0, 0],
"0.05": [-20, 0, 0],
"1.0": [20, 0, 0],
"1.25": [15, 0, 0],
"1.9": [20, 10, 5],
"2.55": [-2.5, -2.5, -2.5]
}
},
"rattle3": {
"rotation": {
"0.0": [0, 0, 0],
"0.05": [-20, 0, 0],
"1.25": [25, 0, 0],
"1.5": [15, 0, 0],
"2.15": [20, 10, 5],
"2.55": [0, -2.5, -2.5]
}
},
"rattle5": {
"rotation": {
"0.0": [0, 0, 0],
"0.1": [-10, 0, 0],
"0.8": [20, 0, 0],
"1.25": [10, 0, 0],
"2.0": [15, 10, 5],
"2.65": [2.5, -5, 0]
"0.0833": {
"pre": [2.5, 0, 0],
"post": [2.5, 0, 0],
"lerp_mode": "catmullrom"
},
"0.2083": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"0.5": [0, 0, 0],
"1.125": {
"pre": [0, 0, 0],
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"1.375": [0, 0, 0]
}
}
},
"sound_effects": {
"0.1667": {
"effect": "pokemon.ekans.cry"
}
}
},
"animation.ekans.sleep": {
"loop": true,
"bones": {
"ekans": {
"position": [0, 3, 7]
"body": {
"position": [0, 6, 0]
},
"head": {
"rotation": [42.91333, 68.7346, 43.12956]
"rotation": ["17.5-math.sin(q.anim_time*90-180)", -49, -6]
},
"jaw": {
"rotation": [-10, 0, 0]
},
"eyelid_right": {
"position": [-0.1, 0, 0]
},
"eyelid_left": {
"position": [0.1, 0, 0]
"neck2": {
"rotation": ["15-math.sin(q.anim_time*90-60)*0.75", -50, -7.5],
"position": [-0.25, 0, 0.5]
},
"tail": {
"rotation": [-7.5, 55, 0]
"rotation": [90, -32, -272.5],
"position": [-3, -0.5, 1],
"scale": 0
},
"tail2": {
"rotation": [-3.9416, -55.3577, -4.33386]
"rotation": [-176.62147, -67.38079, 169.49348]
},
"tail3": {
"rotation": [20.41084, -54.0129, -21.47388]
"rotation": [160, -85, -180]
},
"tail8": {
"rotation": [77.80887, 32.27264, 55.07287],
"position": [-1, -1.1, -2]
},
"tail9": {
"rotation": [18.4215, -23.19625, -12.13932]
},
"tail4": {
"rotation": [0, -62.5, 0]
"rotation": [87.73292, -75.69796, -92.26708]
},
"tail5": {
"rotation": [0, -55, 0]
"rotation": [-2.5, -87.5, 0]
},
"tail6": {
"rotation": [0, -57.5, 0]
"rotation": [0, -62.5, 0]
},
"rattle": {
"rotation": [-7.5, -62.5, 0]
"tail7": {
"rotation": [-1.41397, -67.50536, -1.13438]
},
"coiled_body": {
"rotation": [0, "-math.sin(q.anim_time*90-120)*0.25", 0],
"position": [0, 0, -3]
},
"coiled_body_top": {
"rotation": ["-math.sin(q.anim_time*90-60)*0.5", "math.sin(q.anim_time*90-60)*0.25", "-2.5-math.sin(q.anim_time*90*0.5+45)*0.5"]
},
"tail_rattle2": {
"rotation": [9.09308, -27.20461, 4.52273]
},
"eyelid_right": {
"position": [-1, 0, 0]
},
"neck": {
"rotation": ["-5-math.sin(q.anim_time*90)*0.75", 17.5, "-6.5+math.sin(q.anim_time*90*0.5-90)*0.5"],
"position": [-3.5, -0.75, 3.5]
},
"eyelid_left": {
"position": [1, 0, 0]
},
"coiled_tail": {
"rotation": [-2.5, "-40+math.sin(q.anim_time*90-30)", 0],
"position": [1, 0, 0]
},
"coiled_tail2": {
"rotation": [0, "-30+math.sin(q.anim_time*90-90)", 0]
},
"coiled_tail_rattle": {
"rotation": [-10, "-27.5+math.sin(q.anim_time*90-150)", 0]
},
"coiled_tail_rattle2": {
"rotation": [5, "math.sin(q.anim_time*90-210)", 0]
},
"coiled_tail_rattle3": {
"rotation": [0, "math.sin(q.anim_time*90-270)", 0]
}
}
},
"animation.ekans.cry": {
"animation_length": 0.95833,
"animation.ekans.recoil": {
"animation_length": 1,
"bones": {
"head": {
"rotation": {
"0.0": {
"0.0": [0, 0, 0],
"0.0833": {
"pre": [2.5, 0, 0],
"post": [2.5, 0, 0],
"lerp_mode": "catmullrom"
},
"0.2083": {
"post": [5, 0, 0],
"lerp_mode": "catmullrom"
},
"0.4583": {
"post": [-1, 0, 0],
"lerp_mode": "catmullrom"
},
"0.7083": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"0.0833": {
"post": [-5, 0, 0],
"0.9583": [0, 0, 0]
},
"position": {
"0.0": [0, 0, 0],
"0.0833": [0, 0, 0],
"0.2083": {
"pre": [0, 0, -0.25],
"post": [0, 0, -0.25],
"lerp_mode": "catmullrom"
},
"0.5833": {
"0.4583": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"0.7083": [0, 0, 0]
}
},
"jaw": {
"rotation": {
"0.0": [0, 0, 0],
"0.0833": {
"pre": [-2.5, 0, 0],
"post": [-2.5, 0, 0],
"lerp_mode": "catmullrom"
},
"0.1667": {
"post": [15, 0, 0],
"lerp_mode": "catmullrom"
},
"0.4583": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"0.7083": [0, 0, 0]
}
},
"neck2": {
"rotation": {
"0.0": [0, 0, 0],
"0.0833": {
"pre": [15, 0, 0],
"post": [15, 0, 0],
"lerp_mode": "catmullrom"
},
"0.2083": {
"post": [7.5, 0, 0],
"lerp_mode": "catmullrom"
},
"0.4583": {
"post": [-2.5, 0, 0],
"lerp_mode": "catmullrom"
},
"0.7083": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"0.9583": [0, 0, 0]
}
},
"jaw": {
"pupil_right": {
"position": {
"0.0": [0, 0, 0],
"0.125": {"pre": [0, 0, 0], "post": [1, 0, 0]},
"0.5417": {"pre": [1, 0, 0], "post": [0, 0, 0]}
}
},
"eyelid_right": {
"position": {
"0.0": [-1, 0, 0],
"0.125": {"pre": [-1, 0, 0], "post": [0, 0, 0]}
}
},
"pupil_surprised_right": {
"position": {
"0.0": [0, 0, 0],
"0.125": {"pre": [0, 0, 0], "post": [-1, 0, 0]},
"0.5417": {"pre": [-1, 0, 0], "post": [0, 0, 0]}
}
},
"neck": {
"rotation": {
"0.0": {
"0.0": [0, 0, 0],
"0.0833": {
"pre": [0, 0, 0],
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"0.125": {
"post": [12.5, 0, 0],
"lerp_mode": "catmullrom"
},
"0.1667": {
"post": [14.79, 0, 0],
"lerp_mode": "catmullrom"
},
"0.2083": {
"post": [12.5, 0, 0],
"post": [-10, 0, 0],
"lerp_mode": "catmullrom"
},
"0.25": {
"post": [14.79, 0, 0],
"0.4583": {
"post": [-2.5, 0, 0],
"lerp_mode": "catmullrom"
},
"0.2917": {
"post": [12.5, 0, 0],
"lerp_mode": "catmullrom"
},
"0.3333": {
"post": [14.79, 0, 0],
"lerp_mode": "catmullrom"
},
"0.6667": {
"0.7083": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"0.9583": [0, 0, 0]
}
},
"eyelid_left": {
"position": {
"0.0": [1, 0, 0],
"0.125": {"pre": [1, 0, 0], "post": [0, 0, 0]}
}
},
"pupil_left": {
"position": {
"0.0": [0, 0, 0],
"0.125": {"pre": [0, 0, 0], "post": [-1, 0, 0]},
"0.5417": {"pre": [-1, 0, 0], "post": [0, 0, 0]}
}
},
"pupil_surprised_left": {
"position": {
"0.0": [0, 0, 0],
"0.125": {"pre": [0, 0, 0], "post": [1, 0, 0]},
"0.5417": {"pre": [1, 0, 0], "post": [0, 0, 0]}
}
}
},
"sound_effects": {
"0.0833": {
"effect": "pokemon.ekans.cry"
}
},
"animation.ekans.walkspeedtest": {
"loop": true,
"bones": {
"body": {
"position": [0, 0, "120-q.anim_time*16*1.5"]
}
}
},
"animation.ekans.runspeedtest": {
"loop": true,
"bones": {
"body": {
"position": [0, 0, "120-q.anim_time*16*3.5"]
}
}
},
"animation.ekans.blink": {
"animation_length": 0.16667,
"animation_length": 0.1667,
"bones": {
"eyelid_right": {
"position": {
"0.0": [-0.1, 0, 0],
"0.125": [-0.1, 0, 0],
"0.1667": [0, 0, 0]
"0.0": [-1, 0, 0],
"0.1667": {"pre": [-1, 0, 0], "post": [0, 0, 0]}
}
},
"eyelid_left": {
"position": {
"0.0": [0.1, 0, 0],
"0.125": [0.1, 0, 0],
"0.1667": [0, 0, 0]
"0.0": [1, 0, 0],
"0.1667": {"pre": [1, 0, 0], "post": [0, 0, 0]}
}
}
}
@@ -833,7 +833,7 @@
},
"sound_effects": {
"0.125": {
"effect": "pokemon.diglett_alolan.cry"
"effect": "pokemon.diglett.cry"
}
}
}
@@ -1,10 +1,10 @@
{
"format_version": "1.8.0",
"animations": {
"animation.poliwag.ground_idle": {
"animation.poliwag.ground_idle_placeholder": {
"loop": true,
"bones": {
"tail1": {
"tail": {
"rotation": [30, 0, 0]
},
"tail2": {
@@ -15,32 +15,28 @@
}
}
},
"animation.poliwag.ground_walk": {
"animation.poliwag.ground_walk_placeholder": {
"loop": true,
"bones": {
"body": {
"position": [0, "0 - (6/11) + math.abs(math.sin(((query.anim_time) - (1/3)) * 90 * 3) * (6/11))", 0]
},
"head": {
"rotation": ["0 - (0 * 1.5)", "math.sin(((query.anim_time) - (0.5/3)) * 90 * 3) * (4 * 1.5)", 0],
"position": [0, 0, "0 - (0 / 10)"]
},
"arm_left": {
"rotation": [0, "0 - math.sin(((query.anim_time) - (0.5/3)) * 90 * 3) * 28", "0 - -48"]
},
"arm_left2": {
"rotation": [0, "math.clamp(math.sin(((query.anim_time) + (0.75/3)) * 90 * 3) * 28, 0, 28)", 0]
},
"arm_right": {
"rotation": [0, "0 - math.sin(((query.anim_time) - (0.5/3)) * 90 * 3) * 28", -48]
},
"arm_right2": {
"rotation": [0, "0 - math.clamp(math.sin(((query.anim_time) - (0.75/3)) * 90 * 3) * 28, 0, 28)", 0]
},
"torso2": {
"rotation": [0, "0 - math.sin(((query.anim_time) - (0.5/3)) * 90 * 3) * 4", 0]
"body": {
"position": [0, "0 - (6/11) + math.abs(math.sin(((query.anim_time) - (1/3)) * 90 * 3) * (6/11))", 0]
},
"leg_left": {
"torso": {
"rotation": [0, "0 - math.sin(((query.anim_time) - (0.25/3)) * 90 * 3) * 4", 0]
},
"tail": {
"rotation": [30, 0, 0]
},
"tail2": {
"rotation": [15, 0, 0]
},
"tail3": {
"rotation": [15, 0, 0]
},
"left_leg": {
"rotation": [
"0 -math.sin((query.anim_time) * 90 * 3) * 6",
0,
@@ -48,10 +44,10 @@
],
"position": [0, "math.clamp(math.sin(((query.anim_time) + (1/3)) * 90 * 3) * 1, 0, 1)", 0]
},
"leg_left2": {
"rotation": ["0 - math.clamp(math.sin(((query.anim_time) - (0.75/3)) * 90 * 3) * 0, -0, 0)", 0, 0]
"left_foot": {
"rotation": ["0 - math.clamp(math.sin(((query.anim_time) - (0.75/3)) * 90 * 3) * v.foot, -v.foot, 0)", 0, 0]
},
"leg_right": {
"right_leg": {
"rotation": [
"math.sin((query.anim_time) * 90 * 3) * 6",
0,
@@ -59,39 +55,19 @@
],
"position": [0, "math.clamp(math.sin(((query.anim_time) - (1/3)) * 90 * 3) * 1, 0, 1)", 0]
},
"leg_right2": {
"rotation": ["math.clamp(math.sin(((query.anim_time) - (0.75/3)) * 90 * 3) * 0, 0, 0)", 0, 0]
},
"foot_left": {
"rotation": ["0 - math.clamp(math.sin(((query.anim_time) - (0.75/3)) * 90 * 3) * v.foot, -v.foot, 0)", 0, 0]
},
"foot_right": {
"right_foot": {
"rotation": ["math.clamp(math.sin(((query.anim_time) - (0.75/3)) * 90 * 3) * v.foot, 0, v.foot)", 0, 0]
},
"hand_right": {
"rotation": [0, -70, 0]
},
"hand_left": {
"rotation": [0, 70, 0]
},
"tail1": {
"rotation": [30, 0, 0]
},
"tail2": {
"rotation": [15, 0, 0]
},
"tail3": {
"rotation": [15, 0, 0]
},
"torso": {
"rotation": [0, "0 - math.sin(((query.anim_time) - (0.25/3)) * 90 * 3) * 4", 0]
}
}
},
"animation.poliwag.water_idle": {
"animation.poliwag.water_idle_placeholder": {
"loop": true,
"animation_length": 0.4583,
"bones": {
"tail1": {
"body": {
"rotation": [15, 0, 0]
},
"tail": {
"rotation": [-15, 0, 0]
},
"tail2": {
@@ -100,27 +76,27 @@
"tail3": {
"rotation": [15, 0, 0]
},
"body": {
"left_leg": {
"rotation": [15, 0, 0]
},
"leg_right": {
"left_foot": {
"rotation": [15, 0, 0]
},
"foot_right1": {
"right_leg": {
"rotation": [15, 0, 0]
},
"leg_left": {
"rotation": [15, 0, 0]
},
"foot_left1": {
"right_foot": {
"rotation": [15, 0, 0]
}
}
},
"animation.poliwag.water_swim": {
"animation.poliwag.water_swim_placeholder": {
"loop": true,
"bones": {
"tail1": {
"body": {
"rotation": [45, 0, 0]
},
"tail": {
"rotation": [-45, 0, 0]
},
"tail2": {
@@ -129,43 +105,54 @@
"tail3": {
"rotation": [5, 0, 0]
},
"body": {
"rotation": [45, 0, 0]
},
"leg_right": {
"left_leg": {
"rotation": [15, 0, 0]
},
"leg_left": {
"left_foot": {
"rotation": [15, 0, 0]
},
"foot_right1": {
"right_leg": {
"rotation": [15, 0, 0]
},
"foot_left1": {
"right_foot": {
"rotation": [15, 0, 0]
}
}
},
"animation.poliwag.blink": {
"animation_length": 0.16667,
"animation.poliwag.blink_placeholder": {
"animation_length": 0.1667,
"bones": {
"eyelid_left": {
"left_eyelid": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": [0, 0, -0.1],
"0.1667": [0, 0, 0]
}
},
"eyelid_right": {
"right_eyelid": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": [0, 0, -0.1],
"0.1667": [0, 0, 0]
}
},
"left_pupil": {
"position": {
"0.0": [0, 0, 0.1],
"0.125": [0, 0, 0.1],
"0.1667": [0, 0, 0]
}
},
"right_pupil": {
"position": {
"0.0": [0, 0, 0.1],
"0.125": [0, 0, 0.1],
"0.1667": [0, 0, 0]
}
}
}
},
"animation.poliwag.sleep": {
"animation.poliwag.sleep_placeholder": {
"loop": true,
"bones": {
"body": {
@@ -175,29 +162,6 @@
"eyelids": {
"position": [0, 0, -0.1]
},
"leg_right": {
"rotation": [-56.86824, 13.96782, -1.24205],
"position": [0, 0.25, -0.75]
},
"foot_right1": {
"rotation": [45, 0, 0]
},
"foot_right2": {
"rotation": [10, 0, 0]
},
"leg_left": {
"rotation": [-27.43103, -15.68951, 1.9062],
"position": [0, 0.5, -0.75]
},
"foot_left1": {
"rotation": [12.5, 0, 0]
},
"foot_left2": {
"rotation": [10, 0, 0]
},
"tail1": {
"rotation": [-0.16127, 25.11621, 5.5184]
},
"tail2": {
"rotation": [12.30936, 7.61658, -1.09051],
"position": [0, 0, -0.35]
@@ -206,52 +170,129 @@
"rotation": [10, 7.5, 0],
"position": [0, 0, -0.5]
},
"eyelid_left": {
"left_eyelid2": {
"position": [0, 0, -0.1]
},
"eyelid_right": {
"right_eyelid2": {
"position": [0, 0, -0.1]
}
}
},
"animation.poliwag.render": {
"loop": true,
"bones": {
"body": {
"rotation": [-5, 0, -10],
"position": [0, 6, 0]
},
"leg_right": {
"rotation": [24.26391, -14.269, 7.17267]
"tail": {
"rotation": [-0.16127, 25.11621, 5.5184]
},
"foot_right2": {
"left_leg": {
"rotation": [-27.43103, -15.68951, 1.9062],
"position": [0, 0.5, -0.75]
},
"left_foot": {
"rotation": [12.5, 0, 0]
},
"leg_left": {
"rotation": [17.44401, 5.64135, -19.34918]
"left_toe": {
"rotation": [10, 0, 0]
},
"foot_left2": {
"rotation": [-7.5, 0, 0]
"right_leg": {
"rotation": [-56.86824, 13.96782, 1.24205],
"position": [0, 0.25, -0.75]
},
"tail1": {
"rotation": [-63.87343, -4.37224, -50.6695]
"right_foot": {
"rotation": [45, 0, 0]
},
"tail2": {
"rotation": [0, 7.5, 0],
"position": [0, 0, -0.3]
},
"tail3": {
"rotation": [0, 0, 0]
"right_toe": {
"rotation": [10, 0, 0]
}
}
},
"animation.poliwag.cry": {
"animation_length": 1.25,
"sound_effects": {
"0.0417": {
"effect": "pokemon.poliwag.cry"
}
}
}
"animation.poliwag.cry": {
"animation_length": 1.25,
"sound_effects": {
"0.0417": {
"effect": "pokemon.poliwag.cry"
}
}
},
"animation.poliwag.test": {
"animation_length": 4,
"bones": {
"torso": {
"rotation": [-2.4905, 0.21782, 4.99527],
"position": [0, 0.25, 0]
},
"left_eye": {
"rotation": [0, 0, 0]
},
"right_eye": {
"rotation": [0, 0, 0]
},
"left_leg": {
"rotation": [20.22183, -9.6955, -1.73294],
"position": [0, 0, 0.25]
},
"left_foot": {
"rotation": [24.63136, -5.82612, 3.55184]
},
"right_leg": {
"rotation": [-32.29039, 6.33954, 2.12126],
"position": [-0.5, 0.5, -2]
},
"right_foot": {
"rotation": [2.92249, 12.46442, 1.89155]
},
"tail": {
"rotation": [34.30897, -18.48624, -45.57625]
},
"tail2": {
"rotation": [20, 0, 0]
},
"tail3": {
"rotation": [17.5, 0, 0]
},
"poliwag": {
"position": [0, 1, 0]
},
"mouth": {
"position": {
"0.0": [0, 0, 2],
"2.0": {"pre": [0, 0, 2], "post": [0, 0, 0]}
}
},
"left_toe": {
"rotation": [-45, 0, 0]
},
"right_toe": {
"rotation": [7.5, 0, 0],
"position": [0, 0, 0.15]
},
"mouth_open": {
"position": {
"0.0": [0, 0, -2],
"2.0": {"pre": [0, 0, -2], "post": [0, 0, 0]}
}
},
"eyelids": {
"position": {
"0.0": [0, 0, 0],
"1.5": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.6667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"left_eyelid": {
"position": [0.25, 0, 0]
},
"left_pupil": {
"position": {
"0.0": [0, 0, 0],
"1.5": {"pre": [0, 0, 0], "post": [0, 0, 0.1]},
"1.6667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
},
"scale": [-1, 1, 1]
},
"right_pupil": {
"position": {
"0.0": [0, 0, 0],
"1.5": {"pre": [0, 0, 0], "post": [0, 0, 0.1]},
"1.6667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
}
}
}
}
}
@@ -4,93 +4,937 @@
"animation.politoed.ground_idle": {
"loop": true,
"bones": {
"leftleg": {
"left_thigh": {
"rotation": [0, -5, 0]
},
"rightleg": {
"rotation": [0, 5, 0]
},
"leftarm": {
"left_arm": {
"rotation": [0, 0, 45]
},
"leftforearm": {
"left_lower_arm": {
"rotation": [0, 0, 15]
},
"rightarm": {
"right_thigh": {
"rotation": [0, 5, 0]
},
"right_arm": {
"rotation": [0, 0, -45]
},
"rightforearm": {
"right_lower_arm": {
"rotation": [0, 0, -15]
},
"tongue_long_base": {
"scale": 0
}
}
},
"animation.politoed.water_idle": {
"loop": true,
"bones": {
"leftleg": {
"rotation": [7.5, -5, 0]
},
"rightleg": {
"rotation": [7.5, 5, 0]
},
"leftarm": {
"rotation": [0, -10, 30]
},
"leftforearm": {
"rotation": [0, 0, 15]
},
"rightarm": {
"rotation": [0, 10, -30]
},
"rightforearm": {
"rotation": [0, 0, -15]
},
"body": {
"rotation": [30, 0, 0]
},
"head": {
"rotation": [-25, 0, 0]
},
"leftfoot": {
"left_thigh": {
"rotation": [7.5, -5, 0]
},
"left_foot": {
"rotation": [15, 0, 0]
},
"rightfoot": {
"left_arm": {
"rotation": [0, -10, 30]
},
"left_lower_arm": {
"rotation": [0, 0, 15]
},
"right_thigh": {
"rotation": [7.5, 5, 0]
},
"right_foot": {
"rotation": [15, 0, 0]
},
"right_arm": {
"rotation": [0, 10, -30]
},
"right_lower_arm": {
"rotation": [0, 0, -15]
},
"tongue_long_base": {
"scale": 0
}
}
},
"animation.politoed.water_swim": {
"loop": true,
"bones": {
"leftleg": {
"rotation": [15, -5, 0]
},
"rightleg": {
"rotation": [15, 5, 0]
},
"leftarm": {
"rotation": [0, -10, 45]
},
"leftforearm": {
"rotation": [0, 0, 15]
},
"rightarm": {
"rotation": [0, 10, -45]
},
"rightforearm": {
"rotation": [0, 0, -15]
},
"body": {
"rotation": [60, 0, 0]
},
"head": {
"rotation": [-55, 0, 0]
},
"leftfoot": {
"left_thigh": {
"rotation": [15, -5, 0]
},
"left_foot": {
"rotation": [30, 0, 0]
},
"rightfoot": {
"left_arm": {
"rotation": [0, -10, 45]
},
"left_lower_arm": {
"rotation": [0, 0, 15]
},
"right_thigh": {
"rotation": [15, 5, 0]
},
"right_foot": {
"rotation": [30, 0, 0]
},
"right_arm": {
"rotation": [0, 10, -45]
},
"right_lower_arm": {
"rotation": [0, 0, -15]
},
"tongue_long_base": {
"scale": 0
}
}
},
"animation.politoed.test": {
"loop": true,
"bones": {
"body": {
"position": [0, -0.5, 0]
},
"undefined": {
"rotation": [-30, 0, 0]
},
"torso": {
"position": [0, 0, 0]
},
"legs": {
"position": [0, -0.6, 0]
},
"left_thigh": {
"rotation": [-22, -31, -12.5],
"position": [0, 0, 0]
},
"left_leg": {
"rotation": [72.5, -10, 5]
},
"left_foot": {
"rotation": [-43, 0, 2.75],
"position": [0, 0.25, -0.25]
},
"head": {
"rotation": [-5, 0, 0]
},
"jaw": {
"rotation": [30, 0, 0]
},
"left_arm": {
"rotation": [0, 0, 42.5]
},
"left_lower_arm": {
"rotation": [0, 40, 0]
},
"left_hand": {
"rotation": [0, 0, 22.5],
"position": [-0.35, 0, 0]
},
"right_thigh": {
"rotation": [-22, 31, 12.5]
},
"right_leg": {
"rotation": [72.5, 10, -5]
},
"right_foot": {
"rotation": [-43, 0, -2.75],
"position": [0, 0.25, -0.25]
},
"right_arm": {
"rotation": [0, 0, -42.5]
},
"right_lower_arm": {
"rotation": [0, -40, 0]
},
"right_hand": {
"rotation": [0, 0, -22.5],
"position": [0.35, 0, 0]
},
"tongue_long_base": {
"rotation": [-27.5, 0, 0]
},
"tongue_long_mid": {
"rotation": [32.5, 0, 0]
},
"tongue_long_mid_bend": {
"rotation": [27.5, 0, 0]
},
"tongue_long_end": {
"rotation": [-20, 0, 0]
},
"tongue_long_tip": {
"rotation": [-37.5, 0, 0]
},
"left_leg_correction": {
"position": [0, 1, 0]
},
"right_leg_correction": {
"position": [0, 1, 0]
}
}
},
"animation.politoed.test2": {
"animation_length": 0.0417,
"bones": {
"body": {
"position": [0, -1.1, 0]
},
"undefined": {
"rotation": [-30, 0, 0]
},
"torso": {
"position": [0, 0, 0]
},
"legs": {
"position": [0, -0.6, 0]
},
"left_thigh": {
"rotation": [-58.0984, -35.5329, -3.9636],
"position": [0, 0, -0.25]
},
"left_leg": {
"rotation": [100.2268, -0.2874, 2.6377],
"position": [0, 0, 0.25]
},
"left_foot": {
"rotation": [-40, 0, 2.25],
"position": [0, 0.1, -0.25]
},
"jaw": {
"position": [0, 0, 0]
},
"left_arm": {
"rotation": [0, 0, 42.5]
},
"left_lower_arm": {
"rotation": [0, 40, 0]
},
"left_hand": {
"rotation": [0, 0, 22.5],
"position": [-0.35, 0, 0]
},
"right_thigh": {
"rotation": [-58.0984, 35.5329, 3.9636],
"position": [0, 0, -0.25]
},
"right_leg": {
"rotation": [100.2268, 0.2874, -2.6377],
"position": [0, 0, 0.25]
},
"right_foot": {
"rotation": [-40, 0, -2.25],
"position": [0, 0.1, -0.25]
},
"right_arm": {
"rotation": [0, 0, -42.5]
},
"right_lower_arm": {
"rotation": [0, -40, 0]
},
"right_hand": {
"rotation": [0, 0, -22.5],
"position": [0.35, 0, 0]
},
"tongue_long_base": {
"rotation": [-22.5, 0, 0]
},
"tongue_long_mid": {
"rotation": [32.5, 0, 0]
},
"tongue_long_mid_bend": {
"rotation": [27.5, 0, 0]
},
"tongue_long_end": {
"rotation": [-20, 0, 0]
},
"tongue_long_tip": {
"rotation": [-37.5, 0, 0]
},
"left_leg_correction": {
"position": [0, 1, 0]
},
"right_leg_correction": {
"position": [0, 1, 0]
}
}
},
"animation.politoed.test_walk": {
"loop": true,
"animation_length": 1,
"bones": {
"body": {
"position": [0, -0.5, 0]
},
"undefined": {
"rotation": [-30, 0, 0]
},
"torso": {
"rotation": ["-0+math.sin(q.anim_time*90*8-75)*3", "-0+math.sin(q.anim_time*90*4-240)*15", "0-math.sin(q.anim_time*90*4-240)*12.5"],
"position": [0, "0-math.sin(q.anim_time*90*8-75)*0.333", 0]
},
"legs": {
"position": [0, -0.6, 0]
},
"left_thigh": {
"rotation": {
"0.0": {
"post": [-45.8077, -17.7622, -4.8184],
"lerp_mode": "catmullrom"
},
"0.25": {
"post": [-22, -31, -12.5],
"lerp_mode": "catmullrom"
},
"0.5": {
"post": [10.3458, -11.4389, -7.9978],
"lerp_mode": "catmullrom"
},
"0.5833": {
"post": [11.7107, -12.7343, -7.9808],
"lerp_mode": "catmullrom"
},
"0.875": {
"post": [-71.94, -14.4638, -6.2564],
"lerp_mode": "catmullrom"
},
"1.0": {
"post": [-45.8077, -17.7622, -4.8184],
"lerp_mode": "catmullrom"
}
},
"position": {
"0.0": {
"post": [0, 0, -1.25],
"lerp_mode": "catmullrom"
},
"0.0833": {
"post": [0, 0.41, -1.06],
"lerp_mode": "catmullrom"
},
"0.25": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"0.5": {
"post": [0, -0.5, 2.5],
"lerp_mode": "catmullrom"
},
"0.7083": {
"post": [0, 1.5, 0],
"lerp_mode": "catmullrom"
},
"1.0": {
"post": [0, 0, -1.25],
"lerp_mode": "catmullrom"
}
}
},
"left_leg": {
"rotation": {
"0.0": {
"post": [11.153, -10.4048, 4.5735],
"lerp_mode": "catmullrom"
},
"0.25": {
"post": [72.5, -10, 5],
"lerp_mode": "catmullrom"
},
"0.5": {
"post": [64.434, -4.5354, 10.7584],
"lerp_mode": "catmullrom"
},
"0.5833": {
"post": [87.0283, -5.4462, 9.7987],
"lerp_mode": "catmullrom"
},
"0.7083": {
"post": [109.717, -7.2677, 7.8792],
"lerp_mode": "catmullrom"
},
"0.875": {
"post": [37.5, -10, 5],
"lerp_mode": "catmullrom"
},
"1.0": {
"post": [11.153, -10.4048, 4.5735],
"lerp_mode": "catmullrom"
}
}
},
"left_foot": {
"rotation": {
"0.0": {
"post": [4.441, -0.809, -3.8795],
"lerp_mode": "catmullrom"
},
"0.25": {
"post": [-43, 0, 2.75],
"lerp_mode": "catmullrom"
},
"0.5": {
"post": [-73.5885, -4.6063, 14.7348],
"lerp_mode": "catmullrom"
},
"0.625": {
"post": [-62.2404, -3.8386, 12.7373],
"lerp_mode": "catmullrom"
},
"0.7083": {
"post": [-57.0442, -2.3032, 8.7424],
"lerp_mode": "catmullrom"
},
"0.875": {
"post": [4.4957, 0.1961, 0.2577],
"lerp_mode": "catmullrom"
},
"1.0": {
"post": [4.441, -0.809, -3.8795],
"lerp_mode": "catmullrom"
}
},
"position": {
"0.0": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"0.25": {
"post": [0, 0.25, -0.25],
"lerp_mode": "catmullrom"
},
"0.5": {
"post": [0, 0.25, -1],
"lerp_mode": "catmullrom"
},
"0.7083": {
"post": [0, -0.12, -0.75],
"lerp_mode": "catmullrom"
},
"0.875": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"1.0": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
}
}
},
"left_toes": {
"rotation": {
"0.0": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"0.5": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"0.5833": {
"post": [-34.9753, 1.3429, 2.1089],
"lerp_mode": "catmullrom"
},
"0.7083": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"1.0": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
}
}
},
"head": {
"rotation": ["-0+math.sin(q.anim_time*90*8-105)*1.5", "-0+math.sin(q.anim_time*90*4-90)*7.5", "0-math.sin(q.anim_time*90*4-90)*5"]
},
"left_arm": {
"rotation": [0, "10+math.sin(q.anim_time*90*4-60)*22.5", "45-math.sin(q.anim_time*90*4+90)*15"]
},
"left_lower_arm": {
"rotation": [0, "25+math.sin(q.anim_time*90*4-90)*10", 0]
},
"left_hand": {
"rotation": [0, "2.5+math.sin(q.anim_time*90*4-120)*5", "22.5-math.sin(q.anim_time*90*4+450)*10"],
"position": [-0.35, 0, 0]
},
"right_thigh": {
"rotation": {
"0.0": {
"post": [10.3458, 11.4389, 7.9978],
"lerp_mode": "catmullrom"
},
"0.0833": {
"post": [11.7107, 12.7343, 7.9808],
"lerp_mode": "catmullrom"
},
"0.375": {
"post": [-71.94, 14.4638, 6.2564],
"lerp_mode": "catmullrom"
},
"0.5": {
"post": [-45.8077, 17.7622, 4.8184],
"lerp_mode": "catmullrom"
},
"0.75": {
"post": [-22, 31, 12.5],
"lerp_mode": "catmullrom"
},
"1.0": {
"post": [10.3458, 11.4389, 7.9978],
"lerp_mode": "catmullrom"
}
},
"position": {
"0.0": {
"post": [0, -0.5, 2.5],
"lerp_mode": "catmullrom"
},
"0.2083": {
"post": [0, 1.5, 0],
"lerp_mode": "catmullrom"
},
"0.5": {
"post": [0, 0, -1.25],
"lerp_mode": "catmullrom"
},
"0.5833": {
"post": [0, 0.41, -1.06],
"lerp_mode": "catmullrom"
},
"0.75": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"1.0": {
"post": [0, -0.5, 2.5],
"lerp_mode": "catmullrom"
}
}
},
"right_leg": {
"rotation": {
"0.0": {
"post": [64.434, 4.5354, -10.7584],
"lerp_mode": "catmullrom"
},
"0.0833": {
"post": [87.0283, 5.4462, -9.7987],
"lerp_mode": "catmullrom"
},
"0.2083": {
"post": [109.717, 7.2677, -7.8792],
"lerp_mode": "catmullrom"
},
"0.375": {
"post": [37.5, 10, -5],
"lerp_mode": "catmullrom"
},
"0.5": {
"post": [11.153, 10.4048, -4.5735],
"lerp_mode": "catmullrom"
},
"0.75": {
"post": [72.5, 10, -5],
"lerp_mode": "catmullrom"
},
"1.0": {
"post": [64.434, 4.5354, -10.7584],
"lerp_mode": "catmullrom"
}
}
},
"right_foot": {
"rotation": {
"0.0": {
"post": [-73.5885, 4.6063, -14.7348],
"lerp_mode": "catmullrom"
},
"0.125": {
"post": [-62.2404, 3.8386, -12.7373],
"lerp_mode": "catmullrom"
},
"0.2083": {
"post": [-57.0442, 2.3032, -8.7424],
"lerp_mode": "catmullrom"
},
"0.375": {
"post": [4.4957, -0.1961, -0.2577],
"lerp_mode": "catmullrom"
},
"0.5": {
"post": [4.441, 0.809, 3.8795],
"lerp_mode": "catmullrom"
},
"0.75": {
"post": [-43, 0, -2.75],
"lerp_mode": "catmullrom"
},
"1.0": {
"post": [-73.5885, 4.6063, -14.7348],
"lerp_mode": "catmullrom"
}
},
"position": {
"0.0": {
"post": [0, 0.25, -1],
"lerp_mode": "catmullrom"
},
"0.2083": {
"post": [0, -0.12, -0.75],
"lerp_mode": "catmullrom"
},
"0.375": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"0.5": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"0.75": {
"post": [0, 0.25, -0.25],
"lerp_mode": "catmullrom"
},
"1.0": {
"post": [0, 0.25, -1],
"lerp_mode": "catmullrom"
}
}
},
"right_toes": {
"rotation": {
"0.0": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"0.0833": {
"post": [-34.9753, -1.3429, -2.1089],
"lerp_mode": "catmullrom"
},
"0.2083": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"0.5": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"1.0": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
}
}
},
"hair": {
"rotation": ["-0+math.sin(q.anim_time*90*8-135)*2.5", "-0+math.sin(q.anim_time*90*4-300)*10", "0-math.sin(q.anim_time*90*4-300)*5"]
},
"right_arm": {
"rotation": [0, "-10+math.sin(q.anim_time*90*4-60)*22.5", "-45-math.sin(q.anim_time*90*4+90)*15"]
},
"right_lower_arm": {
"rotation": [0, "-25+math.sin(q.anim_time*90*4-90)*10", 0]
},
"right_hand": {
"rotation": [0, "-2.5+math.sin(q.anim_time*90*4-120)*5", "-22.5-math.sin(q.anim_time*90*4+450)*10"],
"position": [0.35, 0, 0]
},
"tongue_long_base": {
"rotation": [-27.5, 0, 0]
},
"tongue_long_mid": {
"rotation": [32.5, 0, 0]
},
"tongue_long_mid_bend": {
"rotation": [27.5, 0, 0]
},
"tongue_long_end": {
"rotation": [-20, 0, 0]
},
"tongue_long_tip": {
"rotation": [-37.5, 0, 0]
},
"left_leg_correction": {
"position": {
"0.0": {
"post": [0, 0.1, 0],
"lerp_mode": "catmullrom"
},
"0.25": {
"post": [0, 1, 0],
"lerp_mode": "catmullrom"
},
"0.5": {
"post": [0, 1, 0],
"lerp_mode": "catmullrom"
},
"0.7083": {
"post": [0, 1, 0],
"lerp_mode": "catmullrom"
},
"0.875": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"1.0": {
"post": [0, 0.1, 0],
"lerp_mode": "catmullrom"
}
}
},
"right_leg_correction": {
"position": {
"0.0": {
"post": [0, 1, 0],
"lerp_mode": "catmullrom"
},
"0.2083": {
"post": [0, 1, 0],
"lerp_mode": "catmullrom"
},
"0.375": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"0.5": {
"post": [0, 0.1, 0],
"lerp_mode": "catmullrom"
},
"0.75": {
"post": [0, 1, 0],
"lerp_mode": "catmullrom"
},
"1.0": {
"post": [0, 1, 0],
"lerp_mode": "catmullrom"
}
}
}
}
},
"animation.politoed.pose": {
"loop": true,
"bones": {
"body": {
"rotation": [-15, 0, 0],
"position": [0, 2, -2]
},
"left_thigh": {
"rotation": [-109.8093, -19.9813, 14.4472],
"position": [0.25, -1, 0.25]
},
"left_leg": {
"rotation": [62.5, 0, 0]
},
"left_foot": {
"rotation": [-15, 2.5, 0]
},
"head": {
"rotation": [10, 0, 0],
"position": [0, 0, -0.25]
},
"left_arm": {
"rotation": [-52.5, 0, 0],
"position": [0, -0.75, 0.25]
},
"left_lower_arm": {
"rotation": [0, 45, 0]
},
"left_hand": {
"rotation": [0, 0, 17.5],
"position": [-0.2, 0, 0]
},
"right_thigh": {
"rotation": [-109.8093, 19.9813, -14.4472],
"position": [-0.25, -1, 0.25]
},
"right_leg": {
"rotation": [62.5, 0, 0]
},
"right_foot": {
"rotation": [-15, -2.5, 0]
},
"left_pupil": {
"position": [0, -0.5, 0]
},
"right_pupil": {
"position": [0, -0.5, 0]
},
"right_arm": {
"rotation": [-52.5, 0, 0],
"position": [0, -0.75, 0.25]
},
"right_lower_arm": {
"rotation": [0, -45, 0]
},
"right_hand": {
"rotation": [0, 0, -17.5],
"position": [0.2, 0, 0]
},
"tongue_long_base": {
"scale": 0
}
}
},
"animation.politoed.blink": {
"animation_length": 0.2083,
"bones": {
"left_eye": {
"position": {
"0.0": [-0.1, 0, 0.1],
"0.1667": {
"pre": [-0.1, 0, 0.1],
"post": [-0.1, 0, 0.1]
},
"0.2083": {
"pre": [-0.1, 0, 0.1],
"post": [0, 0, 0]
}
}
},
"right_eye": {
"position": {
"0.0": [0.1, 0, 0.1],
"0.1667": {
"pre": [0.1, 0, 0.1],
"post": [0.1, 0, 0.1]
},
"0.2083": {
"pre": [0.1, 0, 0.1],
"post": [0, 0, 0]
}
}
},
"left_eyelid": {
"position": {
"0.0": [0.1, 0, -0.1],
"0.1667": {
"pre": [0.1, 0, -0.1],
"post": [0.1, 0, -0.1]
},
"0.2083": {
"pre": [0.1, 0, -0.1],
"post": [0, 0, 0]
}
}
},
"right_eyelid": {
"position": {
"0.0": [-0.1, 0, -0.1],
"0.1667": {
"pre": [-0.1, 0, -0.1],
"post": [-0.1, 0, -0.1]
},
"0.2083": {
"pre": [-0.1, 0, -0.1],
"post": [0, 0, 0]
}
}
}
}
},
"animation.politoed.happy": {
"loop": true,
"bones": {
"jaw": {
"rotation": [30, 0, 0]
},
"left_pupil": {
"position": [0, 0, 0]
},
"left_eyelid_happy": {
"position": [0.1, 0, -0.1]
},
"right_eyelid_happy": {
"position": [-0.1, 0, -0.1]
}
}
},
"animation.politoed.sad": {
"loop": true,
"bones": {
"left_eyelid_sad": {
"position": [0.1, 0, 0]
},
"right_eyelid_sad": {
"position": [-0.1, 0, 0]
}
}
},
"animation.politoed.angry": {
"loop": true,
"bones": {
"left_eyelid_angry": {
"position": [0.1, 0, -0.1]
},
"right_eyelid_angry": {
"position": [-0.1, 0, -0.1]
}
}
},
"animation.politoed.shocked": {
"loop": true,
"bones": {
"jaw": {
"rotation": [30, 0, 0]
},
"left_pupil": {
"position": [-0.1, 0, 0.3]
},
"right_pupil": {
"position": [0.1, 0, 0.3]
},
"left_pupil_shocked": {
"position": [0.1, 0, 0]
},
"right_pupil_shocked": {
"position": [-0.1, 0, 0]
}
}
},
"animation.politoed.unamused": {
"loop": true,
"bones": {
"left_eyelid_unamused": {
"position": [0.1, 0, -0.1]
},
"right_eyelid_unamused": {
"position": [-0.1, 0, -0.1]
}
}
},
"animation.politoed.hurt": {
"loop": true,
"bones": {
"jaw": {
"rotation": [30, 0, 0]
},
"left_eyelid_hurt": {
"position": [0.1, 0, -0.1]
},
"right_eyelid_hurt": {
"position": [-0.1, 0, -0.1]
}
}
},
"animation.politoed.cry": {
"animation_length": 1.25,
"sound_effects": {
"0.04": {
"effect": "pokemon.politoed.cry"
}
}
}
@@ -62,7 +62,7 @@
"body": {
"rotation": [0, -7.5, 0]
},
"Eyebrow": {
"eyebrows": {
"rotation": [0, 0, 0]
}
}
@@ -240,7 +240,7 @@
"1.5": [0, 0, 0]
}
},
"Eyebrow": {
"eyebrows": {
"position": {
"0.0": [0, 0, 0],
"0.25": {
@@ -282,31 +282,31 @@
"skirt_back": {
"rotation": ["0-math.cos(q.anim_time*90*2-30)*5", 0, 0]
},
"eyelid_left": {
"eyelid_annoyed_right": {
"position": [0, 0, -0.1]
},
"eyelid_right": {
"position": [0, 0, -0.1]
},
"Eyebrow": {
"eyebrows": {
"position": [0, "0+math.sin(q.anim_time*90*2-30)*0.05", 0]
},
"hair": {
"rotation": ["12.5+math.cos(q.anim_time*90*2-30)*3", 0, 0]
},
"eyelid_annoyed_left": {
"position": [0, 0, -0.1]
}
}
},
"animation.shroomish.blink": {
"animation_length": 0.1667,
"bones": {
"eyelid_left": {
"eyelid_annoyed_right": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": [0, 0, -0.1],
"0.1667": [0, 0, 0]
}
},
"eyelid_right": {
"eyelid_annoyed_left": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": [0, 0, -0.1],
@@ -591,7 +591,7 @@
"2.5833": [1, 1, 1]
}
},
"Eyebrow": {
"eyebrows": {
"rotation": [0, 0, 0],
"position": {
"0.0": [0, 0, 0],
@@ -603,17 +603,7 @@
"2.25": [0, 0, 0]
}
},
"eyelid_left": {
"position": {
"0.0": [0, 0, 0],
"0.0833": [0, 0, -0.1],
"1.875": [0, 0, -0.1],
"1.9167": [0, 0, 0],
"2.1667": [0, 0, 0],
"2.2083": [0, 0, -0.1]
}
},
"eyelid_right": {
"eyelid_annoyed_right": {
"position": {
"0.0": [0, 0, 0],
"0.0833": [0, 0, -0.1],
@@ -636,6 +626,16 @@
"0.25": [0, 0, 0],
"0.2917": [0, 0, -0.1]
}
},
"eyelid_annoyed_left": {
"position": {
"0.0": [0, 0, 0],
"0.0833": [0, 0, -0.1],
"1.875": [0, 0, -0.1],
"1.9167": [0, 0, 0],
"2.1667": [0, 0, 0],
"2.2083": [0, 0, -0.1]
}
}
}
}
@@ -1,67 +1,6 @@
{
"format_version": "1.8.0",
"animations": {
"animation.shinx.new": {
"loop": true,
"bones": {
"waist": {
"rotation": [-32.5, 0, 0]
},
"tail_1": {
"rotation": [-9.00717, 20.70481, 65.85133]
},
"tail_2": {
"rotation": [67.5, 0, 0]
},
"tail_3": {
"rotation": [45, 45, 0]
},
"head": {
"rotation": [-4.11405, -22.13991, 10.80524]
},
"eye_left": {
"position": [0, 0, 1]
},
"eyelid_right2": {
"position": [0, 0, -3]
},
"ear_left": {
"rotation": [0, 0, 12.5]
},
"ear_right": {
"rotation": [0, 0, -12.5]
},
"fluff": {
"rotation": [0, 0, 20]
},
"open_mouth": {
"position": [0, 0, -2]
},
"closed_mouth": {
"position": [0, 0, 1]
},
"back_leg_right": {
"rotation": [-40.08019, 31.37238, 1.3824],
"position": [0, -1.5, -1]
},
"knee_right": {
"rotation": [45, 0, 0]
},
"front_foot_right": {
"rotation": [0, -5, 0]
},
"back_leg_left": {
"rotation": [-40.08019, -31.37238, -1.3824],
"position": [0, -1.5, -1]
},
"knee_left": {
"rotation": [45, 0, 0]
},
"front_foot_left": {
"rotation": [0, 5, 0]
}
}
},
"animation.shinx.ground_idle": {
"loop": true,
"bones": {
@@ -75,6 +14,71 @@
"tail_3": {
"rotation": [-37.5, 0, 0],
"position": [0, 0.1, -0.3]
},
"leg_front_right": {
"rotation": [0, 2.5, 0]
},
"leg_front_left": {
"rotation": [0, -2.5, 0]
},
"leg_back_right": {
"rotation": [0, 7.5, 2.5]
},
"leg_back_left": {
"rotation": [0, -7.5, 0]
}
}
},
"animation.shinx.blink": {
"animation_length": 0.1667,
"bones": {
"eye_right": {
"position": {
"0.0": [0.1, 0, 0.1],
"0.1667": {"pre": [0.1, 0, 0.1], "post": [0, 0, 0]}
}
},
"eye_left": {
"position": {
"0.0": [-0.1, 0, 0.1],
"0.1667": {"pre": [-0.1, 0, 0.1], "post": [0, 0, 0]}
}
},
"eyelid_right": {
"position": {
"0.0": [-0.1, 0, -0.1],
"0.1667": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]}
}
},
"eyelid_left": {
"position": {
"0.0": [0.1, 0, -0.1],
"0.1667": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]}
}
},
"eyes_ditto": {
"position": {
"0.0": [0, 0, 0.1],
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"eyes_blink_ditto": {
"position": {
"0.0": [0, 0, -0.1],
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
}
}
},
"animation.shinx.ditto_face": {
"loop": true,
"bones": {
"face": {
"position": [0, 0, 0.1],
"scale": 0
},
"face_ditto": {
"position": [0, 0, -0.1]
}
}
}
@@ -1,133 +1,94 @@
{
"format_version": "1.8.0",
"animations": {
"animation.luxio.idle": {
"animation.luxio.ground_idle": {
"loop": true,
"bones": {
"ear_right": {
"rotation": [0, 0, -22.5]
},
"ear_left": {
"rotation": [0, 0, 22.5]
},
"cheek_fluff_left": {
"rotation": [0, 0, 22.5]
},
"cheek_fluff_right": {
"rotation": [0, 0, -22.5]
},
"tail": {
"rotation": [37.5, 0, 0]
"rotation": [35, 0, 0]
},
"tail_2": {
"rotation": [-17.5, 0, 0]
"tail2": {
"rotation": [-30, 0, 0]
},
"tail_3": {
"rotation": [-32.5, 0, 0]
"tail3": {
"rotation": [-30, 0, 0]
},
"tail_4": {
"rotation": [-32.5, 0, 0]
"tail4": {
"rotation": [-25, 0, 0]
},
"tail_fluff_top": {
"rotation": [5, 0, 0]
},
"leg_back_right": {
"rotation": [0, 7.5, 5]
},
"foot_back_right2": {
"rotation": [0, 0, -5]
},
"leg_back_left": {
"rotation": [0, -7.5, -5]
},
"foot_back_left2": {
"rotation": [0, 0, 5]
},
"leg_front_right": {
"rotation": [0, 5, 0]
},
"leg_front_left": {
"rotation": [0, -5, 0]
}
}
},
"animation.luxio.sleep": {
"loop": true,
"animation.luxio.blink": {
"animation_length": 0.1667,
"bones": {
"body": {
"position": [0, -4, 0]
"eye_right": {
"position": {
"0.0": [0, 0, 0.1],
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"back_leg_right": {
"rotation": [-90, 45, 0],
"position": [4, 1, 1]
},
"knee_right": {
"rotation": [90, 0, 0],
"position": [0, 1, 1]
},
"back_paw_right": {
"position": [0, 1, 0]
},
"back_leg_left": {
"rotation": [-90, 45, 0],
"position": [4, 1, -3]
},
"knee_left": {
"rotation": [90, 0, 0],
"position": [0, 1, 1]
},
"back_paw_left": {
"position": [0, 1, 0]
},
"front_leg_right": {
"rotation": [-45, 0, 0]
},
"elbow_right": {
"rotation": [-42.73421, -15.69986, -16.32495]
},
"front_paw_right": {
"rotation": [90, 0, 0]
},
"front_leg_left": {
"rotation": [-47.41981, -31.37238, 1.3824]
},
"elbow_left": {
"rotation": [-42.73421, 15.69986, 16.32495]
},
"front_paw_left": {
"rotation": [90, 0, 0]
},
"head": {
"rotation": [-7.5, -22.5, 0],
"position": [0, -1.25, -1.25]
},
"waist": {
"rotation": [0, 45, 0]
},
"tail": {
"rotation": [-22.5, 22.5, 0],
"position": [0, -0.75, 0]
},
"tail_2": {
"rotation": [0, 67.5, 0]
},
"tail_3": {
"rotation": [7.86119, 40.78947, 20.94102]
},
"tail_4": {
"rotation": [0, 22.5, 0]
},
"tail_5": {
"rotation": [22.5, 0, 0]
},
"neck": {
"rotation": [22.5, 0, 0]
},
"ear_right": {
"rotation": [0, 0, -22.5]
},
"ear_left": {
"rotation": [0, 0, 22.5]
},
"head_fluff_top": {
"rotation": [0, 0, -45]
},
"eyelid_l": {
"position": [0, 0, -3]
},
"eyelid_r": {
"position": [0, 0, -2]
},
"cheek_fluff_left": {
"rotation": [0, 22.5, 22.5]
},
"cheek_fluff_right": {
"rotation": [22.5, 0, -22.5]
"eyelid_right": {
"position": {
"0.0": [0, 0, -0.1],
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"eye_left": {
"position": [0, 0, 1]
"position": {
"0.0": [0, 0, 0.1],
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"eye_right": {
"position": [0, 0, 1]
"eyelid_left": {
"position": {
"0.0": [0, 0, -0.1],
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"eyes_ditto": {
"position": {
"0.0": [0, 0, 0.1],
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"eyes_blink_ditto": {
"position": {
"0.0": [0, 0, -0.1],
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
}
}
},
"animation.luxio.ditto_face": {
"loop": true,
"bones": {
"face": {
"position": [0, 0, 0.1],
"scale": 0
},
"face_ditto": {
"position": [0, 0, -0.1]
}
}
}
@@ -1,161 +1,103 @@
{
"format_version": "1.8.0",
"animations": {
"animation.luxray.new": {
"loop": true,
"bones": {
"body": {
"rotation": [22.5, 0, 0],
"position": [0, -2, 0]
},
"torso": {
"rotation": [-22.5, 0, 0]
},
"waist": {
"rotation": [24.14867, -20.70481, -9.00717]
},
"hips": {
"rotation": [-22.81179, 9.23186, -3.86032]
},
"tail_1": {
"rotation": [49.98844, 27.36694, 17.18133]
},
"tail_2": {
"rotation": [-22.5, 22.5, 0]
},
"tail_3": {
"rotation": [-53.52293, 35.66466, -17.31806]
},
"tail_4": {
"rotation": [45, 45, 0]
},
"tail_5": {
"rotation": [45, 45, 0]
},
"tail_6": {
"rotation": [0, 22.5, 0]
},
"neck": {
"rotation": [62.26579, -15.69986, -16.32495],
"position": [0, -1, 0]
},
"head": {
"rotation": [-48.75474, -3.08149, 16.32258],
"position": [0, -0.75, 0]
},
"mouth": {
"rotation": [55, 0, 0]
},
"head_fluff_center_2": {
"rotation": [0, 0, 22.5]
},
"head_fluff_center_3": {
"rotation": [0, 22.5, 0]
},
"head_fluff_top_right": {
"rotation": [0, 22.5, 0]
},
"head_fluff_top_2_right": {
"rotation": [0, 22.5, 0]
},
"head_fluff_top_left": {
"rotation": [0, 0, 0]
},
"head_fluff_top_2_left": {
"rotation": [0, 22.5, 0]
},
"head_fluff_bottom_right": {
"rotation": [0, 22.5, 0]
},
"head_fluff_bottom_left": {
"rotation": [0, 22.5, 0]
},
"head_fluff_bottom_2_left": {
"rotation": [0, 22.5, 0]
},
"ear_right": {
"rotation": [0, 0, -17.5]
},
"ear_left": {
"rotation": [0, 0, 17.5]
},
"front_leg_right": {
"rotation": [-44.56145, 7.05302, 7.10708],
"position": [0, -0.31732, -0.92388]
},
"elbow_right": {
"rotation": [-42.73421, -15.69986, -16.32495]
},
"front_foot_right": {
"rotation": [67.5, 0, 0]
},
"front_leg_left": {
"rotation": [22.5, 0, 0],
"position": [1.25, 1, 0]
},
"elbow_left": {
"rotation": [-47.26579, -15.69986, 16.32495],
"position": [-0.5, 0, 0]
},
"front_foot_left": {
"rotation": [0, 10, 0]
},
"back_leg_right": {
"rotation": [-46.64867, -20.70481, 9.00717],
"position": [-5, -2.38896, -2.07193]
},
"knee_right": {
"rotation": [67.5, 0, 0],
"position": [0.76537, 0.33755, 1.86018]
},
"leg_right": {
"rotation": [10, 0, 0]
},
"back_foot_right": {
"rotation": [-57.5, 0, 0]
},
"back_leg_left": {
"rotation": [-19.83264, -18.43795, -6.24926]
},
"knee_left": {
"rotation": [0, 0, 12.5]
},
"leg_left": {
"rotation": [7.5, 0, 0]
},
"back_foot_left": {
"rotation": [-7.5, 0, 0]
}
}
},
"animation.luxray.ground_idle": {
"loop": true,
"bones": {
"tail_1": {
"rotation": [43, 0, 0]
"tail": {
"rotation": [30, 0, 0]
},
"tail_2": {
"rotation": [22.5, 0, 0],
"position": [0, 0, -0.2]
"tail2": {
"rotation": [25, 0, 0]
},
"tail_3": {
"rotation": [-45, 0, 0],
"position": [0, 0.1, -0.3]
"tail3": {
"rotation": [-45, 0, 0]
},
"tail_4": {
"rotation": [-52.68932, -2.64422, -1.88999],
"position": [0, 0.2, -0.4]
"tail4": {
"rotation": [-45, 0, 0]
},
"tail_5": {
"rotation": [-30, 0, 0],
"position": [0, 0.1, -0.2]
"tail5": {
"rotation": [-35, 0, 0]
},
"tail_6": {
"rotation": [20, 0, 0],
"position": [0, 0, -0.1]
},
"tail_fluff": {
"tail_fluff_top": {
"rotation": [5, 0, 0]
},
"tail6": {
"rotation": [35, 0, 0]
},
"tail7": {
"rotation": [20, 0, 0]
},
"leg_front_left": {
"rotation": [0, 0, 0]
},
"leg_front_right": {
"rotation": [0, 5, 0]
},
"leg_back_left": {
"rotation": [0, -7.5, -2.5]
},
"foot_back_left2": {
"rotation": [0, 0, 2.5]
},
"leg_back_right": {
"rotation": [0, 7.5, 2.5]
},
"foot_back_right2": {
"rotation": [0, 0, -2.5]
}
}
},
"animation.luxray.blink": {
"animation_length": 0.1667,
"bones": {
"eye_left": {
"position": {
"0.0": [-0.1, 0, 0.1],
"0.1667": {"pre": [-0.1, 0, 0.1], "post": [0, 0, 0]}
}
},
"eye_right": {
"position": {
"0.0": [0.1, 0, 0.1],
"0.1667": {"pre": [0.1, 0, 0.1], "post": [0, 0, 0]}
}
},
"eyelid_left": {
"position": {
"0.0": [0.1, 0, -0.1],
"0.1667": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]}
}
},
"eyelid_right": {
"position": {
"0.0": [-0.1, 0, -0.1],
"0.1667": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]}
}
},
"eyes_ditto": {
"position": {
"0.0": [0, 0, 0.1],
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"eyes_blink_ditto": {
"position": {
"0.0": [0, 0, -0.1],
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
}
}
},
"animation.luxray.ditto_face": {
"loop": true,
"bones": {
"face": {
"position": [0, 0, 0.1],
"scale": 0
},
"face_ditto": {
"position": [0, 0, -0.1]
}
}
}
@@ -319,6 +319,144 @@
"position": [1, 1, 0]
}
}
},
"animation.bonsly.shoulder_left": {
"loop": true,
"animation_length": 4,
"bones": {
"body": {
"rotation": [0, -30, 0]
},
"torso": {
"rotation": ["-10+math.sin(q.anim_time*90*2-90)*1.5", 0, "math.sin(q.anim_time*90*2/2-180)*1.5"],
"position": [0, 0, 0]
},
"stem": {
"rotation": ["math.sin(q.anim_time*90*2-90-90)*1", 0, 0]
},
"stem2": {
"rotation": ["math.sin(q.anim_time*90*2-150)*4", 0, 0]
},
"mouth_closed": {
"rotation": [0, 0, 180],
"position": [0, 0.75, 0]
},
"leg_left": {
"rotation": ["-66.956-math.sin(q.anim_time*90*3-90)*3.5", -37.4642, 3.1596],
"position": [0.5, "math.sin(q.anim_time*90*2/2-180)*-0.25", -1.25]
},
"leg_left2": {
"rotation": ["20-math.sin(q.anim_time*90*3-150)*15.5", 0, 0]
},
"foot_left": {
"rotation": ["40-math.sin(q.anim_time*90*3-210)*7.5", 0, 0]
},
"leg_right": {
"rotation": ["-58.8106+math.sin(q.anim_time*90*3-90)*3.5", 15.095, 8.959],
"position": [-0.25, "math.sin(q.anim_time*90*2/2-180)*0.1", -1.5]
},
"leg_right2": {
"rotation": ["20+math.sin(q.anim_time*90*3-150)*15.5", 0, 0]
},
"foot_right": {
"rotation": ["40+math.sin(q.anim_time*90*3-210)*7.5", 0, 0]
},
"pupil_left": {
"position": [-0.2, -0.1, 0]
},
"pupil_right": {
"position": [-0.1, -0.1, 0]
}
}
},
"animation.bonsly.shoulder_right": {
"loop": true,
"animation_length": 4,
"bones": {
"body": {
"rotation": [0, 30, 0]
},
"torso": {
"rotation": ["-10+math.sin(q.anim_time*90*2-90)*1.5", 0, "-math.sin(q.anim_time*90*2/2-180)*1.5"],
"position": [0, 0, 0]
},
"stem": {
"rotation": ["math.sin(q.anim_time*90*2-90-90)*1", 0, 0]
},
"stem2": {
"rotation": ["math.sin(q.anim_time*90*2-150)*4", 0, 0]
},
"mouth_closed": {
"rotation": [0, 0, -180],
"position": [0, 0.75, 0]
},
"leg_left": {
"rotation": ["-58.8106+math.sin(q.anim_time*90*3-90)*3.5", -15.095, -8.959],
"position": [0.25, "math.sin(q.anim_time*90*2/2-180)*0.1", -1.5]
},
"leg_left2": {
"rotation": ["20+math.sin(q.anim_time*90*3-150)*15.5", 0, 0]
},
"foot_left": {
"rotation": ["40+math.sin(q.anim_time*90*3-210)*7.5", 0, 0]
},
"leg_right": {
"rotation": ["-66.956-math.sin(q.anim_time*90*3-90)*3.5", 37.4642, -3.1596],
"position": [-0.5, "math.sin(q.anim_time*90*2/2-180)*-0.25", -1.25]
},
"leg_right2": {
"rotation": ["20-math.sin(q.anim_time*90*3-150)*15.5", 0, 0]
},
"foot_right": {
"rotation": ["40-math.sin(q.anim_time*90*3-210)*7.5", 0, 0]
},
"pupil_left": {
"position": [0.1, -0.1, 0]
},
"pupil_right": {
"position": [0.2, -0.1, 0]
}
}
},
"animation.bonsly.shoulder_left_position": {
"loop": true,
"bones": {
"body": {
"position": [2.75, -4, -0.5]
}
}
},
"animation.bonsly.shoulder_right_position": {
"loop": true,
"bones": {
"body": {
"position": [-2.75, -4, -0.5]
}
}
},
"animation.bonsly.looktest": {
"loop": true,
"bones": {
"torso": {
"rotation": [0, 0, 0]
}
}
},
"animation.bonsly.scaletest": {
"loop": true,
"bones": {
"bonsly": {
"scale": 0.6
}
}
},
"animation.bonsly.walkspeedtest": {
"loop": true,
"bones": {
"bonsly": {
"position": [0, 0, "40-q.anim_time*90*0.2"]
}
}
}
}
}
@@ -1,6 +1,179 @@
{
"format_version": "1.8.0",
"animations": {
"animation.chespin.blink": {
"animation_length": 0.1667,
"bones": {
"eye_left": {
"position": {
"0.0": [0, 0, 0.1],
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"eyelid_left": {
"position": {
"0.0": [0, 0, -0.1],
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"eye_right": {
"position": {
"0.0": [0, 0, 0.1],
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"eyelid_right": {
"position": {
"0.0": [0, 0, -0.1],
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"eyes_ditto": {
"position": {
"0.0": [0, 0, 0.1],
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"eyes_blink_ditto": {
"position": {
"0.0": [0, 0, -0.1],
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
}
}
},
"animation.chespin.cry": {
"animation_length": 1,
"bones": {
"head": {
"rotation": {
"0.0": [0, 0, 0],
"0.125": {
"pre": [-12, 0, 0],
"post": [-12, 0, 0],
"lerp_mode": "catmullrom"
},
"0.2917": {
"post": [-5, 0, 0],
"lerp_mode": "catmullrom"
},
"0.5833": {
"post": [-12, 0, 0],
"lerp_mode": "catmullrom"
},
"1.0": [0, 0, 0]
}
},
"mouth_closed_smile": {
"position": {
"0.0": [0, 0, 0],
"0.25": {"pre": [0, 0, 0], "post": [0, 0, 0.1]},
"0.75": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"mouth_open_smile": {
"position": {
"0.0": [0, 0, 0],
"0.25": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"0.75": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"mouth_ditto": {
"position": {
"0.0": [0, 0, 0],
"0.25": {"pre": [0, 0, 0], "post": [0, 0, 0.1]},
"0.75": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"mouth_open_ditto": {
"position": {
"0.0": [0, 0, 0],
"0.25": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"0.75": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
}
},
"sound_effects": {
"0.1667": {
"effect": "pokemon.chespin.cry"
}
}
},
"animation.chespin.ditto_face": {
"loop": true,
"bones": {
"face": {
"scale": 0
},
"face_ditto": {
"position": [0, 0, -0.1]
}
}
},
"animation.chespin.pose": {
"loop": true,
"bones": {
"body": {
"rotation": [0, -37.5, 0],
"position": [0, 0.5, 0]
},
"torso": {
"rotation": [15, 0, 0]
},
"torso2": {
"rotation": [-12.5, 0, 0]
},
"head": {
"rotation": [-13.89157, 20.57373, -10.30286]
},
"arm_right": {
"rotation": [4.68184, 16.2524, -29.6444]
},
"hand_right": {
"rotation": [0, 0, 15]
},
"arm_left": {
"rotation": [34.92019, 17.2337, 20.34505]
},
"hand_left": {
"rotation": [0, 0, -17.5]
},
"tail": {
"rotation": [-51.63554, -16.76559, 11.06517],
"position": [-1, 0, 0]
},
"tail2": {
"rotation": [0, -37.5, 0]
},
"leg_right": {
"rotation": [0, 22.5, 0]
},
"foot_right": {
"rotation": [22.5, 0, 0]
},
"toes_right": {
"rotation": [-22.5, 0, 0]
},
"leg_left": {
"rotation": [7.53535, -3.55508, -21.73761]
},
"foot_left": {
"rotation": [17.45752, -7.82184, 22.22986]
},
"toes_left": {
"rotation": [-22.5, 0, 0]
},
"head_spikes_sharp": {
"scale": 0
},
"pupil_left": {
"position": [0, 0.2, 0]
},
"pupil_right": {
"position": [-0.2, 0.2, 0]
}
}
},
"animation.chespin.ground_idle": {
"loop": true,
"bones": {
@@ -52,6 +225,9 @@
},
"head": {
"rotation": ["math.sin(q.anim_time*90*3-60)*1.5", "-math.sin(q.anim_time*90*1.5-90)*6.5", 0]
},
"head_spikes_sharp": {
"scale": 0
}
}
},
@@ -106,6 +282,9 @@
},
"toe_right": {
"rotation": ["math.clamp(math.sin(q.anim_time*90*5+40)*40,-180,0)", 0, 0]
},
"head_spikes_sharp": {
"scale": 0
}
}
},
@@ -134,14 +313,14 @@
"mouth_open": {
"position": [0, 0, -0.1]
},
"spike_head_left": {
"head_spike_left": {
"rotation": ["-5+math.sin(q.anim_time*90*1-90)*5", 0, -22.5]
},
"spike_head_right": {
"head_spike_right": {
"rotation": ["-5+math.sin(q.anim_time*90*1-90)*5", 0, 45],
"position": [0, 0.5, 0]
},
"spikes_back": {
"head_spikes_back": {
"rotation": ["math.sin(q.anim_time*90*1-135)*5", 0, 0]
},
"arm_left": {
@@ -173,79 +352,21 @@
},
"foot_right": {
"rotation": [35.02686, -1.60667, -1.91561]
}
}
},
"animation.chespin.blink": {
"animation_length": 0.16667,
"bones": {
"eyelid_right": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": [0, 0, -0.1],
"0.1667": [0, 0, 0]
}
},
"eyelid_left": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": [0, 0, -0.1],
"0.1667": [0, 0, 0]
}
}
}
},
"animation.chespin.cry": {
"animation_length": 0.91667,
"bones": {
"head": {
"rotation": {
"0.0": ["-5+math.sin(q.anim_time*90*6+45)*8", 0, 0],
"0.1667": ["-5+math.sin(q.anim_time*90*6+45)*8", 0, 0],
"0.8333": [0, 0, 0]
}
},
"mouth_open3": {
"eye_left": {
"position": [0, 0, 0.1]
},
"mouth_closed": {
"position": {
"0.0833": [0, 0, 0],
"0.1667": [0, 0, 0.1],
"0.4167": [0, 0, 0.1],
"0.5": [0, 0, 0]
}
"eye_right": {
"position": [0, 0, 0.2]
},
"mouth_open": {
"position": {
"0.0833": [0, 0, 0],
"0.1667": [0, 0, -0.1],
"0.4167": [0, 0, -0.1],
"0.5": [0, 0, 0]
}
"mouth_closed_smile": {
"position": [0, 0, 0.2]
},
"spike_head_left": {
"rotation": {
"0.0": [0, 0, "-10+math.sin(q.anim_time*90*6+45)*8"],
"0.1667": [0, 0, "-10+math.sin(q.anim_time*90*6+45)*8"],
"0.3333": [0, 0, "-20+math.sin(q.anim_time*90*3+95)*8"],
"0.5833": [0, 0, "-20+math.sin(q.anim_time*90*3+95)*8"],
"0.8333": [0, 0, 0]
}
"mouth_closed_neutral": {
"position": [0, 0, -0.2]
},
"spike_head_right": {
"rotation": {
"0.0": [0, 0, "10-math.sin(q.anim_time*90*6+45)*8"],
"0.1667": [0, 0, "10-math.sin(q.anim_time*90*6+45)*8"],
"0.3333": [0, 0, "20-math.sin(q.anim_time*90*3+95)*8"],
"0.5833": [0, 0, "20-math.sin(q.anim_time*90*3+95)*8"],
"0.9167": [0, 0, 0]
}
}
},
"sound_effects": {
"0.0833": {
"effect": "pokemon.chespin.cry"
"head_spikes_sharp": {
"scale": 0
}
}
}
@@ -1,6 +1,205 @@
{
"format_version": "1.8.0",
"animations": {
"animation.quilladin.blink": {
"animation_length": 0.1667,
"bones": {
"eye_left": {
"position": {
"0.0": [0, 0, 0.1],
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"eyelid_left": {
"position": {
"0.0": [0, 0, -0.1],
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"eyelid_right": {
"position": {
"0.0": [0, 0, -0.1],
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"eye_right": {
"position": {
"0.0": [0, 0, 0.1],
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"eyes_ditto": {
"position": {
"0.0": [0, 0, 0.1],
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"eyes_blink_ditto": {
"position": {
"0.0": [0, 0, -0.1],
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
}
}
},
"animation.quilladin.cry": {
"animation_length": 1.5,
"bones": {
"torso2": {
"rotation": {
"0.0": [0, 0, 0],
"0.0833": {
"pre": [2, 0, 0],
"post": [2, 0, 0],
"lerp_mode": "catmullrom"
},
"0.2917": {
"post": [-2.5, 0, 0],
"lerp_mode": "catmullrom"
},
"0.5833": {
"post": [-2.5, 0, 0],
"lerp_mode": "catmullrom"
},
"1.0833": {
"post": [1, 0, 0],
"lerp_mode": "catmullrom"
},
"1.4167": [0, 0, 0]
}
},
"mouth_closed_smile": {
"position": {
"0.0": [0, 0, 0],
"0.1667": {"pre": [0, 0, 0], "post": [0, 0, 0.1]},
"1.3333": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"mouth_open_smile": {
"position": {
"0.0": [0, 0, 0],
"0.375": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.0417": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"mouth_open_o": {
"position": {
"0.0": [0, 0, 0],
"0.1667": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"0.375": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"1.0417": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.3333": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"mouth_ditto": {
"position": {
"0.0": [0, 0, 0],
"0.1667": {"pre": [0, 0, 0], "post": [0, 0, 0.1]},
"1.3333": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"mouth_open_ditto": {
"position": {
"0.0": [0, 0, 0],
"0.1667": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.3333": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
}
},
"sound_effects": {
"0.1667": {
"effect": "pokemon.quilladin.cry"
}
}
},
"animation.quilladin.ditto_face": {
"loop": true,
"bones": {
"face": {
"scale": 0
},
"face_ditto": {
"position": [0, 0, -0.1]
}
}
},
"animation.quilladin.pose": {
"loop": true,
"bones": {
"body": {
"position": [0, 2, 0]
},
"torso": {
"rotation": [-27.43745, 1.50179, 4.76968]
},
"tail": {
"rotation": [-15.02687, 1.91486, -1.60757],
"position": [0, -1, 0]
},
"tail2": {
"rotation": [7.56397, 7.43547, 0.98448]
},
"tail3": {
"rotation": [10.08453, 7.38542, 1.30962]
},
"torso2": {
"rotation": [7.49294, -0.32621, -2.52136]
},
"pupil_left": {
"position": [0.1, 0.1, 0]
},
"mouth_closed_smile": {
"position": [0, 0, 0.1]
},
"mouth_open_smile": {
"position": [0, 0, -0.1]
},
"hair": {
"rotation": [-27.5, 0, 0]
},
"arm_left": {
"rotation": [-73.6118, 1.34454, -14.51378]
},
"finger_front_left": {
"rotation": [0, 12.5, 0]
},
"finger_back_left": {
"rotation": [0, -15, 0]
},
"finger_thumb_left": {
"rotation": [0, -20, 0]
},
"arm_right": {
"rotation": [-73.51921, -6.14051, 13.09658]
},
"finger_front_right": {
"rotation": [0, -5, 0]
},
"finger_back_right": {
"rotation": [0, 10, 0]
},
"finger_thumb_right": {
"rotation": [0, 25, 0]
},
"leg_left": {
"rotation": [-97.62567, -25.77605, 9.45845],
"position": [1.1, 1.65, -5]
},
"leg_left2": {
"rotation": [17.5, 0, 0]
},
"leg_right": {
"rotation": [-66.51084, 28.74673, 11.67459],
"position": [0, 2, -4]
},
"leg_right2": {
"rotation": [15, 0, 0]
},
"pupil_right": {
"position": [0, 0.1, 0]
}
}
},
"animation.quilladin.ground_idle": {
"loop": true,
"bones": {
@@ -197,166 +396,18 @@
},
"foot_right": {
"rotation": [15, 0, 0]
}
}
},
"animation.quilladin.blink": {
"animation_length": 0.16667,
"bones": {
"eyelid_right": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": [0, 0, -0.1],
"0.1667": [0, 0, 0]
}
},
"eyelid_left": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": [0, 0, -0.1],
"0.1667": [0, 0, 0]
}
}
}
},
"animation.quilladin.cry": {
"animation_length": 1.5,
"bones": {
"neck": {
"rotation": {
"0.0": [0, 0, 0],
"0.25": [10, 0, 0],
"1.25": [10, 0, 0],
"1.5": [0, 0, 0]
}
"eye_left": {
"position": [0, 0, 0.1]
},
"mouth": {
"position": {
"0.0": [0, 0, 0],
"0.25": [0, -2, 0],
"1.25": [0, -2, 0],
"1.5": [0, 0, 0]
}
"eye_right": {
"position": [0, 0, 0.1]
},
"mouth2": {
"position": {
"0.0": [0, 0, 0],
"0.25": [0, -5, 0],
"1.25": [0, -5, 0],
"1.5": [0, 0, 0]
}
"mouth_closed_smile": {
"position": [0, 0, 0.1]
},
"jaw": {
"position": {
"0.0": [0, 0, 0],
"0.25": [0, -3, 0],
"1.25": [0, -3, 0],
"1.5": [0, 0, 0]
}
},
"head": {
"rotation": {
"0.0": [0, 0, 0],
"0.25": [-15, 0, 0],
"1.25": [-15, 0, 0],
"1.5": [0, 0, 0]
}
},
"head2": {
"rotation": {
"0.0": [0, 0, 0],
"0.25": [-15, 0, 0],
"1.25": [-15, 0, 0],
"1.5": [0, 0, 0]
}
},
"mouth_closed2": {
"position": {
"0.25": [0, 0, -0.1],
"0.3333": [0, 0, 0],
"1.1667": [0, 0, 0],
"1.25": [0, 0, -0.1]
}
},
"mouth_open2": {
"position": {
"0.0": [0, 0, 0.1],
"0.25": [0, 0, 0],
"1.25": [0, 0, 0],
"1.5": [0, 0, 0.1]
}
},
"head3": {
"rotation": {
"0.0": [0, 0, 0],
"0.25": [-15, 0, 0],
"1.25": [-15, 0, 0],
"1.5": [0, 0, 0]
}
},
"mouth_closed3": {
"position": {
"0.25": [0, 0, -0.1],
"0.3333": [0, 0, 0],
"1.1667": [0, 0, 0],
"1.25": [0, 0, -0.1]
}
},
"mouth_open3": {
"position": {
"0.0": [0, 0, 0.1],
"0.25": [0, 0, 0],
"1.25": [0, 0, 0],
"1.5": [0, 0, 0.1]
}
},
"mouth_closed": {
"position": {
"0.25": [0, 0, 0],
"0.3333": [0, 0, 0.1],
"1.1667": [0, 0, 0.1],
"1.25": [0, 0, 0]
}
},
"mouth_open": {
"position": {
"0.0": [0, 0, 0],
"0.25": [0, 0, -0.1],
"1.25": [0, 0, -0.1],
"1.5": [0, 0, 0]
}
},
"torso": {
"rotation": {
"0.0": ["-5+math.sin(q.anim_time*90*6+45)*8", 0, 0],
"0.25": ["-5+math.sin(q.anim_time*90*6+45)*8", 0, 0],
"0.3333": ["-8.29+math.sin(q.anim_time*90*3+95)*6", 0, 0],
"1.0": ["-8.29+math.sin(q.anim_time*90*3)*2", 0, 0],
"1.5": [0, 0, 0]
}
},
"spike_left": {
"rotation": {
"0.0": [0, 0, "-10+math.sin(q.anim_time*90*6+45)*8"],
"0.25": [0, 0, "-10+math.sin(q.anim_time*90*6+45)*8"],
"0.3333": [0, 0, "-20+math.sin(q.anim_time*90*3+95)*8"],
"1.0": [0, 0, "-20+math.sin(q.anim_time*90*3+95)*8"],
"1.5": [0, 0, 0]
}
},
"spike_right": {
"rotation": {
"0.0": [0, 0, "10-math.sin(q.anim_time*90*6+45)*8"],
"0.25": [0, 0, "10-math.sin(q.anim_time*90*6+45)*8"],
"0.3333": [0, 0, "20-math.sin(q.anim_time*90*3+95)*8"],
"1.0": [0, 0, "20-math.sin(q.anim_time*90*3+95)*8"],
"1.5": [0, 0, 0]
}
}
},
"sound_effects": {
"0.1667": {
"effect": "pokemon.quilladin.cry"
"mouth_closed_neutral": {
"position": [0, 0, -0.1]
}
}
}
@@ -147,21 +147,54 @@
}
},
"animation.fennekin.blink": {
"animation_length": 0.125,
"animation_length": 0.1667,
"bones": {
"eyelid_right": {
"position": {
"0.0": [-0.1, 0, -0.1],
"0.0417": [-0.1, 0, -0.1],
"0.0833": [0, 0, 0]
"0.1667": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]}
}
},
"eyelid_left": {
"position": {
"0.0": [0.1, 0, -0.1],
"0.0417": [0.1, 0, -0.1],
"0.0833": [0, 0, 0]
"0.1667": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]}
}
},
"eye_left": {
"position": {
"0.0": [-0.1, 0, 0.1],
"0.1667": {"pre": [-0.1, 0, 0.1], "post": [0, 0, 0]}
}
},
"eye_right": {
"position": {
"0.0": [0.1, 0, 0.1],
"0.1667": {"pre": [0.1, 0, 0.1], "post": [0, 0, 0]}
}
},
"eyes_ditto": {
"position": {
"0.0": [0, 0, 0.1],
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"eyes_blink_ditto": {
"position": {
"0.0": [0, 0, -0.1],
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
}
}
},
"animation.fennekin.ditto_face": {
"loop": true,
"bones": {
"face": {
"scale": 0
},
"face_ditto": {
"position": [0, 0, -0.1]
}
}
},
@@ -182,27 +215,31 @@
"0.5833": [0, 0, 0]
}
},
"jaw": {
"rotation": {
"0.0": [0, 0, 0],
"0.0833": [64.27, 0, 0],
"0.125": [70, 0, 0],
"0.1667": [38.9, 0, 0],
"0.2083": [35, 0, 0],
"0.25": [38.75, 0, 0],
"0.2917": [65.58, 0, 0],
"0.3333": [70, 0, 0],
"0.4167": [65.76, 0, 0],
"0.5417": [3.9, 0, 0],
"0.5833": [0, 0, 0]
}
},
"mouth_top": {
"mouth_open": {
"position": {
"0.0": [0, 0, 0],
"0.0417": [0, -1, 0],
"0.5": [0, -1, 0],
"0.5417": [0, 0, 0]
"0.0417": {"pre": [0, 0, 0], "post": [0, -1, 0]},
"0.1667": {"pre": [0, -1, 0], "post": [0, 0, 0]},
"0.2083": {"pre": [0, 0, 0], "post": [0, -1, 0]},
"0.5417": {"pre": [0, -1, 0], "post": [0, 0, 0]}
}
},
"mouth_ditto": {
"position": {
"0.0": [0, 0, 0],
"0.0417": {"pre": [0, 0, 0], "post": [0, 0, 0.1]},
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]},
"0.2083": {"pre": [0, 0, 0], "post": [0, 0, 0.1]},
"0.5417": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"mouth_open_ditto": {
"position": {
"0.0": [0, 0, 0],
"0.0417": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"0.2083": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"0.5417": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
}
},
@@ -238,23 +275,30 @@
},
"ear_ruff_shock_left": {
"rotation": [0, 0, 0]
},
"ear_ruff_right": {
"rotation": [0, 0, -2.5]
}
}
},
"animation.fennekin.shock": {
"loop": true,
"bones": {
"pupil_left2": {
"scale": [0.7, 0.7, 1]
"pupil_left": {
"rotation": [-2.1, 0, 0],
"position": [0, 0.75, 0.028],
"scale": [0.7, 0.8, 1]
},
"mouth_top": {
"mouth_open": {
"position": [0, -1, 0]
},
"jaw": {
"rotation": [65, 0, 0]
},
"pupil_right2": {
"scale": [0.7, 0.7, 1]
"pupil_right": {
"rotation": [-2.1, 0, 0],
"position": [0, 0.75, 0.028],
"scale": [0.7, 0.8, 1]
}
}
},
@@ -272,6 +316,12 @@
},
"ear_ruff_shock_right": {
"scale": 0
},
"eye_neutral_left": {
"position": [-0.1, 0, 0.1]
},
"eye_neutral_right": {
"position": [0.1, 0, 0.1]
}
}
},
@@ -289,6 +339,12 @@
},
"ear_ruff_shock_right": {
"scale": 0
},
"eye_neutral_left": {
"position": [-0.1, 0, 0.1]
},
"eye_neutral_right": {
"position": [0.1, 0, 0.1]
}
}
},
@@ -298,7 +354,7 @@
"eyelid_happy_left": {
"position": [0.1, 0, -0.1]
},
"mouth_top": {
"mouth_open": {
"position": [0, -1, 0]
},
"jaw": {
@@ -312,23 +368,12 @@
},
"ear_ruff_shock_right": {
"scale": 0
}
}
},
"animation.fennekin.blush": {
"loop": true,
"bones": {
"blush_left": {
"position": [0.1, 0, 0]
},
"blush_right": {
"position": [-0.1, 0, 0]
"eye_neutral_left": {
"position": [-0.1, 0, 0.1]
},
"ear_ruff_shock_left": {
"scale": 0
},
"ear_ruff_shock_right": {
"scale": 0
"eye_neutral_right": {
"position": [0.1, 0, 0.1]
}
}
},
@@ -346,6 +391,12 @@
},
"ear_ruff_shock_right": {
"scale": 0
},
"eye_neutral_left": {
"position": [-0.1, 0, 0.1]
},
"eye_neutral_right": {
"position": [0.1, 0, 0.1]
}
}
}
@@ -4,36 +4,85 @@
"animation.braixen.ground_idle": {
"loop": true,
"bones": {
"torso": {
"rotation": [2.5, 0, 0]
"neck": {
"rotation": ["10-math.sin(q.anim_time*90*2.5)*2", 0, 0]
},
"head": {
"rotation": ["2.5+math.sin(q.anim_time*90*2.5+45)*2", 0, 0]
},
"ear_ruff_right": {
"rotation": [0, 5, "-1-math.sin(q.anim_time*90*2.5+45)*1"]
},
"ear_ruff_right2": {
"rotation": [0, 10, "-math.sin(q.anim_time*90*2.5)*1"]
},
"ear_ruff_right3": {
"rotation": [0, 10, "-math.sin(q.anim_time*90*2.5-45)*1"]
},
"ear_ruff_left": {
"rotation": [0, -2.5, "1+math.sin(q.anim_time*90*2.5+45)*1"]
},
"ear_ruff_left2": {
"rotation": [0, -10, "math.sin(q.anim_time*90*2.5)*1"]
},
"ear_ruff_left3": {
"rotation": [0, -10, "math.sin(q.anim_time*90*2.5-45)*1"]
},
"arm_right": {
"rotation": [0.95384, "12.1536-math.sin(q.anim_time*90*2.5+45)*2", -42.42961]
},
"arm_right2": {
"rotation": [-0.02642, -32.49865, 0.04926]
},
"arm_left": {
"rotation": [0.95384, "-12.1536+math.sin(q.anim_time*90*2.5+45)*2", 42.42961]
},
"arm_left2": {
"rotation": [-0.02642, 32.49865, -0.04926]
},
"tail": {
"rotation": ["5+math.sin(q.anim_time*90*2.5)*2", "math.sin(q.anim_time*90*1.25-90)*4", "math.sin(q.anim_time*90*1.25-90)*2"],
"position": [0, 0, 0.5]
},
"tail2": {
"rotation": [0, 0, "math.sin(q.anim_time*90*1.25-45)*4"]
},
"tail3": {
"rotation": ["math.sin(q.anim_time*90*2.5-90)*2", 0, 0]
},
"tail4": {
"rotation": ["math.sin(q.anim_time*90*2.5-135)*2", 0, 0]
},
"finger_middle_right": {
"rotation": [0, 0, -10]
},
"finger_middle_left": {
"rotation": [0, 0, 10]
},
"waist": {
"rotation": [-5, 0, 0]
},
"chest": {
"rotation": [2.5, 0, 0]
},
"arm_left": {
"rotation": [0, 7.5, 70]
},
"arm_left2": {
"rotation": [-5, 37.5, -2.5]
},
"hand_left": {
"rotation": [57.5, -10, 7.5]
"rotation": [0, 0, -25]
},
"neck": {
"rotation": [-5, 0, 0]
"finger_front_left": {
"rotation": [0, 0, 25]
},
"head": {
"rotation": [12.5, 0, 0]
"finger_back_left": {
"rotation": [0, 0, 22.5]
},
"tail": {
"hand_right": {
"rotation": [0, 0, 25]
},
"finger_front_right": {
"rotation": [0, 0, -25]
},
"finger_back_right": {
"rotation": [0, 0, -22.5]
},
"skirt_front2": {
"rotation": [5, 0, 0]
},
"stick_tail": {
"rotation": [-5, 0, 0]
},
"leg_left": {
"rotation": [0.88045, -9.96156, -5.07673]
},
@@ -49,93 +98,41 @@
"leg_right3": {
"rotation": [0.00039, 5.00185, -5.99069]
},
"finger_front_left": {
"rotation": [9.99527, 9.84653, 30.20756]
},
"finger_back_left": {
"rotation": [-4.26175, -9.05478, 25.33761]
},
"finger_middle_left": {
"rotation": [0, 0, 27.5]
},
"arm_right": {
"rotation": [65, 22.5, -45],
"position": [0, 0, 0.5]
},
"arm_right2": {
"rotation": [-15, -82.5, 15]
},
"hand_right": {
"rotation": [-10, -22.5, 70]
},
"finger_front_right": {
"rotation": [9.99527, -9.84653, -30.20756]
},
"finger_middle_right": {
"rotation": [0, 0, -27.5]
},
"finger_back_right": {
"rotation": [-4.26175, 9.05478, -25.33761]
},
"ear_ruff_left2": {
"rotation": [0, -7.5, 0]
},
"ear_ruff_left3": {
"rotation": [0, -7.5, 0]
},
"ear_ruff_left4": {
"rotation": [0, -7.5, 0]
},
"skirt_front2": {
"rotation": [-2.5, 0, 0]
},
"foot_right": {
"rotation": [1, 0, 0]
},
"ear_ruff_left": {
"rotation": [0, -7.5, 0]
"skirt_left2": {
"rotation": [0, 0, 15]
},
"ear_ruff_right": {
"rotation": [0, 7.5, 0]
"skirt_right2": {
"rotation": [0, 0, -15]
},
"ear_ruff_right2": {
"rotation": [0, 7.5, 0]
"wand": {
"scale": 0
},
"ear_ruff_right3": {
"rotation": [0, 7.5, 0]
},
"ear_ruff_right4": {
"rotation": [0, 7.5, 0]
},
"skirt_front_left": {
"rotation": [0, 0, 10]
},
"skirt_front_right": {
"rotation": [0, 0, -10]
"wand_tail": {
"rotation": [-10, 0, 0]
},
"ear_ruff_shock_left": {
"scale": 0
},
"ear_ruff_shock_right": {
"scale": 0
},
"wand": {
"scale": 0
}
}
},
"animation.braixen.battle_idle": {
"loop": true,
"animation_length": 0.875,
"bones": {
"body": {
"rotation": [0, -52.5, 0],
"position": [-0.5, -2.05, 0]
},
"torso": {
"rotation": [15, -10, 0]
},
"waist": {
"rotation": [-2.5, -2.5, 0]
"rotation": [5, 0, 0]
},
"chest": {
"rotation": [-5, 2.5, 0]
@@ -162,10 +159,10 @@
"rotation": [0, -10, 0]
},
"arm_right": {
"rotation": [-60.09473, -14.92923, -20.56425]
"rotation": [-35.09473, -47.42923, -40.56425]
},
"arm_right2": {
"rotation": [0, -45, 0]
"rotation": [0, -40, 0]
},
"hand_right": {
"rotation": [0, 27.5, 15]
@@ -180,10 +177,10 @@
"rotation": [0, 0, -77.5]
},
"neck": {
"rotation": [0, 32.5, -7.5]
"rotation": [0, 5, 0]
},
"head": {
"rotation": [-7.5, 20, -5]
"rotation": [-10, 0, 0]
},
"ear_ruff_left2": {
"rotation": [0, -12.5, 0]
@@ -216,32 +213,28 @@
"scale": 0
},
"leg_left": {
"rotation": [-0.5, -35, -26],
"position": [1, 0, 0]
"rotation": [5.38152, -19.291, -15.91527]
},
"leg_left2": {
"rotation": [10, 0, 0]
"rotation": [25, 0, 0]
},
"leg_left3": {
"rotation": [-22.5, 0, 0]
"rotation": [-16.28567, 14.26008, -10.25103]
},
"foot_left": {
"rotation": [29.78634, -18.01295, 11.28749],
"position": [0, -0.5, 0]
"rotation": [-12.32417, 1.61888, 12.39638]
},
"leg_right": {
"rotation": [-7.80674, 36.44232, 19.22515],
"position": [-1, -0.75, -0.75]
"rotation": [-27.5, 0, 0]
},
"leg_right2": {
"rotation": [29.75489, -5.05904, 8.04401]
"rotation": [27.25489, -5.05904, 5.54401]
},
"leg_right3": {
"rotation": [-30.5, -2, -1]
"rotation": [-25, 0, 0]
},
"foot_right": {
"rotation": [22.5, 20, -10],
"position": [0, -0.5, 0]
"rotation": [24.78729, 3.74196, -6.50446]
},
"ear_ruff_right2": {
"rotation": [0, 12.5, 0]
@@ -252,111 +245,31 @@
"ear_ruff_right4": {
"rotation": [0, 17.5, 0]
},
"stick_hand": {
"rotation": [90, 10, 0],
"position": [6.5, -1, -0.5]
},
"skirt_front_left": {
"rotation": [0, 0, 7.5]
},
"skirt_front_right": {
"rotation": [0, 0, -2.5]
},
"fire": {
"rotation": [-7.24721, -1.93597, -14.87738]
},
"wand": {
"rotation": [22.01816, -4.75113, 11.57518],
"position": [14, -7, -11.5]
},
"wand_tail": {
"scale": 0
},
"ear_ruff_shock_left": {
"scale": 0
},
"ear_ruff_shock_right": {
"scale": 0
},
"skirt": {
"rotation": [-5, 0, 0]
},
"body_wand": {
"rotation": [0, -52.5, 0],
"position": [-0.5, -2.05, 0]
},
"torso_wand": {
"rotation": [15, -10, 0]
},
"waist_wand": {
"rotation": [-2.5, -2.5, 0]
},
"chest_wand": {
"rotation": [-5, 2.5, 0]
},
"arm_wand": {
"rotation": [-60.09473, -14.92923, -20.56425]
},
"arm2_wand": {
"rotation": [0, -45, 0]
},
"hand_wand": {
"rotation": [0, 27.5, 15]
},
"wand": {
"rotation": [90, 10, 0],
"position": [6.5, -1, -0.5]
}
}
},
"animation.braixen.blink": {
"animation_length": 0.1667,
"bones": {
"eyelid_left": {
"position": {
"0.0": [0.1, 0, -0.1],
"0.125": {"pre": [0.1, 0, -0.1], "post": [0.1, 0, -0.1]},
"0.1667": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]}
}
},
"eyelid_right": {
"position": {
"0.0": [-0.1, 0, -0.1],
"0.125": {"pre": [-0.1, 0, -0.1], "post": [-0.1, 0, -0.1]},
"0.1667": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]}
}
}
}
},
"animation.braixen.cry": {
"animation_length": 1,
"bones": {
"head": {
"rotation": {
"0.0": [0, 0, 0],
"0.0417": [-2.05, 0, 0],
"0.0833": [-2.7, 0, 0],
"0.1667": [4, 0, 0],
"0.2083": [3.72, 0, 0],
"0.375": [-2.38, 0, 0],
"0.4167": [-2.7, 0, 0],
"0.5": [-2.4, 0, 0],
"0.6667": [-0.3, 0, 0],
"0.75": [0, 0, 0]
}
},
"jaw": {
"rotation": {
"0.0": [0, 0, 0],
"0.0417": [27.2, 0, 0],
"0.0833": [30, 0, 0],
"0.1667": [19, 0, 0],
"0.2083": [17.65, 0, 0],
"0.3333": [57.56, 0, 0],
"0.375": [60, 0, 0],
"0.4167": [56.99, 0, 0],
"0.7083": [4.23, 0, 0],
"0.7917": [0, 0, 0]
}
},
"fangs": {
"position": {
"0.0": [0, 0, 0],
"0.0417": [0, -0.5, 0],
"0.625": [0, -0.5, 0],
"0.6667": [0, 0, 0]
}
}
},
"sound_effects": {
"0.0": {
"effect": "pokemon.braixen.cry"
}
}
},
@@ -478,20 +391,255 @@
"finger_back_right": {
"rotation": [0, 0, -22.5]
},
"stick_hand": {
"scale": 0
},
"ear_ruff_left4": {
"rotation": [0, 12.5, 0]
},
"ear_ruff_right4": {
"rotation": [0, -12.5, 0]
},
"wand": {
"scale": 0
},
"ear_ruff_shock_left": {
"scale": 0
},
"ear_ruff_shock_right": {
"scale": 0
}
}
},
"animation.braixen.blink": {
"animation_length": 0.1667,
"bones": {
"eyelid_left": {
"position": {
"0.0": [0.1, 0, -0.1],
"0.1667": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]}
}
},
"eyelid_right": {
"position": {
"0.0": [-0.1, 0, -0.1],
"0.1667": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]}
}
},
"eye_left": {
"position": {
"0.0": [-0.1, 0, 0.1],
"0.1667": {"pre": [-0.1, 0, 0.1], "post": [0, 0, 0]}
}
},
"eye_right": {
"position": {
"0.0": [0.1, 0, 0.1],
"0.1667": {"pre": [0.1, 0, 0.1], "post": [0, 0, 0]}
}
}
}
},
"animation.braixen.cry": {
"animation_length": 1,
"bones": {
"head": {
"rotation": {
"0.0": [0, 0, 0],
"0.0417": [-2.05, 0, 0],
"0.0833": [-2.7, 0, 0],
"0.1667": [4, 0, 0],
"0.2083": [3.72, 0, 0],
"0.375": [-2.38, 0, 0],
"0.4167": [-2.7, 0, 0],
"0.5": [-2.4, 0, 0],
"0.6667": [-0.3, 0, 0],
"0.75": [0, 0, 0]
}
},
"jaw": {
"rotation": {
"0.0": [0, 0, 0],
"0.0417": [27.2, 0, 0],
"0.0833": [30, 0, 0],
"0.1667": [19, 0, 0],
"0.2083": [17.65, 0, 0],
"0.3333": [57.56, 0, 0],
"0.375": [60, 0, 0],
"0.4167": [56.99, 0, 0],
"0.7083": [4.23, 0, 0],
"0.7917": [0, 0, 0]
}
},
"mouth_ditto": {
"position": {
"0.0": [0, 0, 0],
"0.0417": {"pre": [0, 0, 0], "post": [0, 0, 0.1]},
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]},
"0.25": {"pre": [0, 0, 0], "post": [0, 0, 0.1]},
"0.8333": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"mouth_open_ditto": {
"position": {
"0.0": [0, 0, 0],
"0.0417": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"0.25": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"0.8333": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
}
},
"sound_effects": {
"0.0": {
"effect": "pokemon.braixen.cry"
}
}
},
"animation.braixen.ditto_face": {
"loop": true,
"bones": {
"face": {
"scale": 0
},
"face_ditto": {
"position": [0, 0, -0.1]
}
}
},
"animation.braixen.pose": {
"loop": true,
"bones": {
"body": {
"rotation": [-12.5, -30, 0]
},
"waist": {
"rotation": [0, 5, 0]
},
"chest": {
"rotation": [5, 0, 0]
},
"arm_left": {
"rotation": [12.25294, -38.3808, 35.72104]
},
"arm_left2": {
"rotation": [0, 5, -15]
},
"hand_left": {
"rotation": [0, 0, -15]
},
"neck": {
"rotation": [10, 0, 0]
},
"head": {
"rotation": [12.48848, -0.54094, 2.44081]
},
"jaw": {
"rotation": [70, 0, 0]
},
"ear_ruff_left2": {
"rotation": [0, -12.5, 0]
},
"ear_ruff_left3": {
"rotation": [0, -7.5, 0]
},
"ear_ruff_left4": {
"rotation": [0, 12.5, 0]
"rotation": [0, -22.5, 0]
},
"tail": {
"rotation": [7.08681, -3.21132, 14.65993]
},
"tail2": {
"rotation": [10, 0, 0]
},
"leg_left": {
"rotation": [13.9042, 5.68422, -21.80633]
},
"leg_left3": {
"rotation": [17.5, 0, 0]
},
"foot_left": {
"rotation": [47.5, 0, 0],
"position": [0, 0, -1]
},
"ear_ruff_right": {
"rotation": [0, -12.5, 0]
},
"ear_ruff_right2": {
"rotation": [0, 7.5, 0]
},
"ear_ruff_right3": {
"rotation": [0, 7.5, 0]
},
"ear_ruff_right4": {
"rotation": [0, 5, 0]
},
"arm_right": {
"rotation": [41.62332, 22.64192, -3.4873]
},
"arm_right2": {
"rotation": [-26.43596, -58.95768, 35.12627]
},
"hand_right": {
"rotation": [2.5, 0, 17.5]
},
"finger_front_right": {
"rotation": [0, -7.5, -65]
},
"finger_middle_right": {
"rotation": [0, 0, -62.5]
},
"finger_back_right": {
"rotation": [0, 12.5, -67.5]
},
"body_wand": {
"rotation": [-12.5, -30, 0]
},
"waist_wand": {
"rotation": [0, 5, 0]
},
"chest_wand": {
"rotation": [5, 0, 0]
},
"arm_wand": {
"rotation": [41.62332, 22.64192, -3.4873]
},
"arm2_wand": {
"rotation": [-26.43596, -58.95768, 35.12627]
},
"hand_wand": {
"rotation": [2.5, 0, 17.5]
},
"wand": {
"rotation": [-87.5, 0, 0],
"position": [6, -1, -6]
},
"fire": {
"rotation": [47.5, 0, 0]
},
"wand_tail": {
"scale": 0
},
"leg_right": {
"rotation": [-16.24074, 6.60796, 21.55613]
},
"leg_right2": {
"rotation": [35, 0, 0]
},
"leg_right3": {
"rotation": [-47.5, 0, 0]
},
"foot_right": {
"rotation": [27.5, 0, 0]
},
"pupil_right": {
"position": [-1, 0, 0]
},
"ear_ruff_shock_left": {
"scale": 0
},
"ear_ruff_shock_right": {
"scale": 0
},
"ear_ruff_right4": {
"rotation": [0, -12.5, 0]
}
}
}
@@ -6,22 +6,22 @@
"bones": {
"arm_left": {
"rotation": [62.63351, "69.9361+Math.cos((query.anim_time-0.3) * 90 * 2) * 3", 54.27769],
"position": [0, "Math.cos((query.anim_time-0.1) * 90 * 2) * 0.1", "-1+Math.sin((query.anim_time-0.1) * 90 * 2) * 0.1"]
"position": [0, "Math.cos((query.anim_time-0.1) * 90 * 2) * 0.1", 0]
},
"arm_left2": {
"rotation": [0, 10, 0]
},
"leg_left": {
"rotation": [-119.85791, -37.10567, 15.80757]
"rotation": [-123.90298, -35.73903, 18.40939]
},
"leg_left2": {
"rotation": [102.79362, 12.19908, 2.74715],
"position": [0, 0.1, 0]
},
"foot_left": {
"rotation": [2.5, 0, 0]
"rotation": [4.99527, -0.21782, 2.4905]
},
"finger_index_left": {
"finger_front_left": {
"rotation": [0, 0, 10]
},
"wrist_left": {
@@ -30,62 +30,63 @@
"head": {
"rotation": ["-25+Math.cos((query.anim_time-0.4) * 90 * 2) * -5", 0, 0]
},
"torso": {
"rotation": ["15+Math.cos((query.anim_time-0.2) * 90 * 2) * 2", 0, 0],
"position": [0, "-1+Math.cos((query.anim_time) * 90 * 2) * 0.2", 0]
},
"chest": {
"torso2": {
"rotation": ["7.5+Math.cos((query.anim_time-0.3) * 90 * 2) * 2", 0, 0]
},
"leg_right": {
"rotation": [-118.93803, 29.14089, -15.06885]
"rotation": [-123.90298, 35.73903, -18.40939]
},
"leg_right2": {
"rotation": [102.79362, -12.19908, -2.74715],
"position": [0, 0.1, 0]
},
"foot_right": {
"rotation": [2.5, 0, 0]
"rotation": [4.99527, 0.21782, -2.4905]
},
"body": {
"rotation": [7.5, 0, 0],
"position": [0, -5.2, 0]
"position": [0, -4.2, 0]
},
"arm_right": {
"rotation": [62.63351, "-69.9361+Math.cos((query.anim_time-0.3) * 90 * 2) * -3", -54.27769],
"position": [0, "Math.cos((query.anim_time-0.1) * 90 * 2) * 0.1", "-1+Math.sin((query.anim_time-0.1) * 90 * 2) * 0.1"]
"position": [0, "Math.cos((query.anim_time-0.1) * 90 * 2) * 0.1", 0]
},
"arm_right2": {
"rotation": [0, -10, 0]
},
"finger_index_right": {
"finger_front_right": {
"rotation": [0, 0, -10]
},
"froakie": {
"position": [0, 1, 0]
},
"eyelid_right": {
"position": [0, 0, -0.125]
},
"pupil_eyelid_right": {
"rotation": [0, 0, -5],
"position": [0, 0.5, 0]
},
"eyelid_right2": {
"position": [0, 0, 0.125]
},
"eyelid_left": {
"position": [0, 0, -0.175]
"position": [0, 0.5, -0.1]
},
"pupil_eyelid_left": {
"rotation": [0, 0, 5],
"position": [0, 0.5, 0]
},
"eyelid_left2": {
"position": [0, 0, 0.05]
"position": [0, 0.5, -0.1]
},
"wrist_right": {
"rotation": [0, 0, 20]
},
"iris_left": {
"position": [0, 0, 0.1]
},
"iris_right": {
"position": [0, 0, 0.1]
},
"bubble_hoodie": {
"scale": 0
},
"chest_bubble_front": {
"rotation": [22.5, 0, 0]
},
"back_bubbles": {
"rotation": [-25, 0, 0]
},
"waist": {
"rotation": ["15+Math.cos((query.anim_time-0.2) * 90 * 2) * 2", 0, 0],
"position": [0, "-1+Math.cos((query.anim_time) * 90 * 2) * 0.2", 0]
},
"ftorso2": {
"rotation": ["7.5+Math.cos((query.anim_time-0.3) * 90 * 2) * 2", 0, 0]
}
}
},
@@ -96,37 +97,18 @@
"body": {
"position": {
"0.0": [0, -4.5, -1.5],
"0.2917": [0, -4.5, 4],
"0.25": [0, -4.5, 3.21],
"0.2917": [0, -3.4, 4],
"0.375": [0, 0.25, 0.5],
"0.5": [0, 1.75, -3],
"0.5833": [0, 1.62, -4.8],
"0.6667": [0, 1, -5.5],
"0.7917": [0, -4.5, -6],
"0.7917": [0, -3.7, -6],
"0.875": [0, -4.5, -3.2],
"1.0": [0, -4.5, -1.5]
}
},
"torso": {
"rotation": {
"0.0": [37.5, 0, 0],
"0.2917": [35, 0, 0],
"0.5": [57.5, 0, 0],
"0.625": [60, 0, 0],
"0.7083": [52.5, 0, 0],
"0.7917": [37.5, 0, 0]
},
"position": {
"0.0": [0, 0, 0],
"0.25": [0, 0, 0],
"0.2917": [0, -1, 0],
"0.5": [0, 0, 0],
"0.7083": [0, 0, 0],
"0.7917": [0, -0.5, -0.5],
"0.8333": [0, -0.37, -0.325],
"0.875": [0, 0, 0]
}
},
"chest": {
"torso2": {
"rotation": {
"0.0": [12.25, 0, 0],
"0.125": [11.42, 0, 0],
@@ -159,14 +141,12 @@
"position": [0, 0, 0.1]
},
"pupil_eyelid_right": {
"rotation": [0, 0, -5],
"position": [0, 0.5, -0.1]
},
"iris_left": {
"position": [0, 0, 0.1]
},
"pupil_eyelid_left": {
"rotation": [0, 0, 5],
"position": [0, 0.5, -0.1]
},
"chest_bubble": {
@@ -264,7 +244,7 @@
"0.5": [16.7402, 0.13182, 9.04799],
"0.5417": [9.7402, 0.13182, 9.04799],
"0.75": [-80.7598, 0.13182, 9.04799],
"0.7917": [-102.39241, 5.22351, 7.24834],
"0.7917": [-111.19241, 5.22351, 7.24834],
"1.0": [-120.5555, 30.68198, -1.74989]
},
"position": {
@@ -306,7 +286,7 @@
"0.5": [16.7402, -0.13182, -9.04799],
"0.5417": [9.7402, -0.13182, -9.04799],
"0.75": [-80.7598, -0.13182, -9.04799],
"0.7917": [-102.39241, -5.22351, -7.24834],
"0.7917": [-111.19241, -5.22351, -7.24834],
"1.0": [-120.5555, -30.68198, 1.74989]
},
"position": {
@@ -339,6 +319,43 @@
"0.75": [-17.5, 0, 0],
"1.0": [0, 0, 0]
}
},
"bubble_hoodie": {
"scale": 0
},
"waist": {
"rotation": {
"0.0": [37.5, 0, 0],
"0.2917": [35, 0, 0],
"0.5": [57.5, 0, 0],
"0.625": [60, 0, 0],
"0.7083": [52.5, 0, 0],
"0.7917": [37.5, 0, 0]
},
"position": {
"0.0": [0, 0, 0],
"0.25": [0, 0, 0],
"0.2917": [0, -1, 0],
"0.5": [0, 0, 0],
"0.7083": [0, 0, 0],
"0.7917": [0, -0.5, -0.5],
"0.8333": [0, -0.37, -0.325],
"0.875": [0, 0, 0]
}
},
"ftorso2": {
"rotation": {
"0.0": [12.25, 0, 0],
"0.125": [11.42, 0, 0],
"0.25": [8.25, 0, 0],
"0.375": [0, 0, 0],
"0.5": [-2.5, 0, 0],
"0.625": [0, 0, 0],
"0.75": [8.25, 0, 0],
"0.8333": [16.81, 0, 0],
"0.9167": [13.17, 0, 0],
"1.0": [12.25, 0, 0]
}
}
}
},
@@ -349,10 +366,7 @@
"rotation": [55, 0, 0],
"position": [0, "-8+Math.cos((query.anim_time) * 90 * 2) * 0.2", -1]
},
"torso": {
"rotation": [10, 0, 0]
},
"chest": {
"torso2": {
"rotation": ["-12.5+Math.cos((query.anim_time-0.4) * 90 * 2) * 2", 0, 0]
},
"head": {
@@ -393,6 +407,15 @@
},
"leg_left2": {
"rotation": [40, 0, 0]
},
"bubble_hoodie": {
"scale": 0
},
"waist": {
"rotation": [10, 0, 0]
},
"ftorso2": {
"rotation": ["-12.5+Math.cos((query.anim_time-0.4) * 90 * 2) * 2", 0, 0]
}
}
},
@@ -415,10 +438,7 @@
"1.5": [0, "-9+Math.cos((query.anim_time) * 90 * (2+2/3)) * 0.2", -1.5]
}
},
"torso": {
"rotation": ["10+Math.cos((query.anim_time+0.2) * 90 * (2+2/3)) * 5", 0, 0]
},
"chest": {
"torso2": {
"rotation": [-7.5, 0, 0]
},
"head": {
@@ -523,6 +543,15 @@
"1.0833": [5, 0, 0],
"1.5": [45, 0, 0]
}
},
"bubble_hoodie": {
"scale": 0
},
"waist": {
"rotation": ["10+Math.cos((query.anim_time+0.2) * 90 * (2+2/3)) * 5", 0, 0]
},
"ftorso2": {
"rotation": [-7.5, 0, 0]
}
}
},
@@ -530,13 +559,9 @@
"loop": true,
"bones": {
"body": {
"position": [0, -4, 0]
"position": [0, -3.75, 0]
},
"torso": {
"rotation": ["34.9055+Math.cos((query.anim_time-0.3) * 90 * 2) * 3", 2.49762, -4.33287],
"position": [0, "-0.5+Math.cos((query.anim_time) * 90 * 2) * 0.2", 0]
},
"chest": {
"torso2": {
"rotation": ["-12.4539+Math.cos((query.anim_time-0.5) * 90 * 2) * 2", 1.08089, 4.88206]
},
"head": {
@@ -568,19 +593,19 @@
"rotation": [-95.27946, 39.63389, 12.13638]
},
"leg_right2": {
"rotation": [102.5, 0, 0]
"rotation": [105, 0, 0]
},
"foot_right": {
"rotation": [0, 0, -5]
"rotation": [0, 0, -7.5]
},
"leg_left": {
"rotation": [-76.73021, -74.12482, -31.13382]
"rotation": [-106.55899, -73.36545, 5.05162]
},
"leg_left2": {
"rotation": [92.5, 0, 0]
},
"foot_left": {
"rotation": [15, 0, 0]
"rotation": [7.5, 0, 0]
},
"iris_right": {
"position": [0, -0.3, 0]
@@ -593,26 +618,22 @@
},
"pupil_left": {
"position": [-0.1, 0, 0]
},
"bubble_hoodie": {
"scale": 0
},
"waist": {
"rotation": ["34.9055+Math.cos((query.anim_time-0.3) * 90 * 2) * 3", 2.49762, -4.33287],
"position": [0, "-0.5+Math.cos((query.anim_time) * 90 * 2) * 0.2", 0]
},
"ftorso2": {
"rotation": ["-12.4539+Math.cos((query.anim_time-0.5) * 90 * 2) * 2", 1.08089, 4.88206]
}
}
},
"animation.froakie.blink": {
"animation_length": 0.16667,
"animation_length": 0.1667,
"bones": {
"eyelid_left": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": [0, 0, -0.1],
"0.1667": [-0.1, 0, 0]
}
},
"eyelid_right": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": [0, 0, -0.1],
"0.1667": [0.1, 0, 0]
}
},
"iris_right": {
"position": {
"0.0": [0, 0, 0.1],
@@ -626,6 +647,79 @@
"0.125": [0, 0, 0.1],
"0.1667": [0, 0, 0]
}
},
"pupil_eyelid_left": {
"position": {
"0.0": [0, 0.5, -0.1],
"0.125": [0, 0.5, -0.1],
"0.1667": [-0.1, 0, 0]
}
},
"pupil_eyelid_right": {
"position": {
"0.0": [0, 0.5, -0.1],
"0.125": [0, 0.5, -0.1],
"0.1667": [-0.1, 0, 0]
}
},
"eye_ditto_left": {
"position": {
"0.0": [0, 0, 0.1],
"0.1667": {
"pre": [0, 0, 0.1],
"post": [0, 0, 0.1]
}
}
},
"eye_closed_ditto_left": {
"position": {
"0.0": [0, 0, -0.1],
"0.1667": {
"pre": [0, 0, -0.1],
"post": [0, 0, -0.1]
}
}
},
"eye_ditto_right": {
"position": {
"0.0": [0, 0, 0.1],
"0.1667": {
"pre": [0, 0, 0.1],
"post": [0, 0, 0.1]
}
}
},
"eye_closed_ditto_right": {
"position": {
"0.0": [0, 0, -0.1],
"0.1667": {
"pre": [0, 0, -0.1],
"post": [0, 0, -0.1]
}
}
}
}
},
"animation.froakie.ditto_face": {
"loop": true,
"bones": {
"eye_left": {
"scale": 0
},
"eye_right": {
"scale": 0
},
"mouth": {
"scale": 0
},
"face_ditto_left": {
"position": [0, 0, -0.1]
},
"face_ditto_right": {
"position": [0, 0, -0.1]
},
"face_ditto_mouth": {
"position": [0, 0, -0.1]
}
}
},
@@ -667,17 +761,7 @@
"1.9583": [0, -8.5, 18.25]
}
},
"torso": {
"rotation": {
"0.0": [17.5, 0, 0],
"0.3333": [15.55, 0, 0],
"0.4583": [33.5, 0, 0],
"0.5833": [29.06, 0, 0],
"0.6667": [19, 0, 0],
"0.8333": [14, 0, 0]
}
},
"chest": {
"torso2": {
"rotation": {
"0.0": [10, 0, 0],
"0.2083": [27.5, 0, 0],
@@ -709,22 +793,6 @@
"2.2917": [11.5, -46, 0]
}
},
"eyelid_right": {
"position": {
"0.4583": [0, 0, -0.15],
"0.5": [0, 0, 0.05],
"0.9583": [0, 0, 0.05],
"1.0": [0, 0, -0.15]
}
},
"eyelid_left": {
"position": {
"0.4583": [0, 0, -0.125],
"0.5": [0, 0, -0.03],
"0.9583": [0, 0, -0.03],
"1.0": [0, 0, -0.125]
}
},
"arm_right": {
"rotation": {
"0.0": [78.30408, -64.53645, -79.41322],
@@ -771,7 +839,7 @@
"2.4167": [35, 0, 15]
}
},
"finger_index_right": {
"finger_front_right": {
"rotation": {
"1.875": [0, 0, 0],
"2.2083": [-1.88975, 6.7809, -38.71695]
@@ -783,7 +851,7 @@
"2.2083": [0, 0, -20]
}
},
"finger_ring_right": {
"finger_back_right": {
"rotation": {
"1.875": [0, 0, 0],
"2.2083": [0, 0, -30]
@@ -835,7 +903,7 @@
"2.4167": [35, 0, -15]
}
},
"finger_index_left": {
"finger_front_left": {
"rotation": {
"1.875": [0, 0, 0],
"2.2083": [-1.88975, -6.7809, 38.71695]
@@ -847,7 +915,7 @@
"2.2083": [0, 0, 20]
}
},
"finger_ring_left": {
"finger_back_left": {
"rotation": {
"1.875": [0, 0, 0],
"2.2083": [0, 0, 30]
@@ -976,6 +1044,67 @@
"2.1667": [34, 0, 0],
"2.3333": [47.5, 0, 0]
}
},
"iris_left": {
"position": {
"0.0": [0, 0, 0.1],
"0.4583": [0, 0, 0.1],
"0.5": [0, 0, 0],
"0.9583": [0, 0, 0],
"1.0": [0, 0, 0.1]
}
},
"pupil_eyelid_left": {
"position": {
"0.4583": [0, 0.5, -0.125],
"0.5": [0, 0, -0.03],
"0.9583": [0, 0, -0.03],
"1.0": [0, 0.5, -0.125]
}
},
"iris_right": {
"position": {
"0.0": [0, 0, 0.1],
"0.4583": [0, 0, 0.1],
"0.5": [0, 0, 0],
"0.9583": [0, 0, 0],
"1.0": [0, 0, 0.1]
}
},
"pupil_eyelid_right": {
"position": {
"0.4583": [0, 0.5, -0.125],
"0.5": [0, 0, -0.03],
"0.9583": [0, 0, -0.03],
"1.0": [0, 0.5, -0.125]
}
},
"bubble_hoodie": {
"scale": 0
},
"waist": {
"rotation": {
"0.0": [17.5, 0, 0],
"0.3333": [15.55, 0, 0],
"0.4583": [33.5, 0, 0],
"0.5833": [29.06, 0, 0],
"0.6667": [19, 0, 0],
"0.8333": [14, 0, 0]
}
},
"ftorso2": {
"rotation": {
"0.0": [10, 0, 0],
"0.2083": [27.5, 0, 0],
"0.4583": [28.93, 0, 0],
"0.7917": [25, 0, 0],
"1.2083": [0, 0, 0],
"1.5417": [10, 0, 0],
"1.75": [27.5, 0, 0],
"1.875": [15, 0, 0],
"2.0": [19, 0, 0],
"2.1667": [20.175, 0, 0]
}
}
}
},
@@ -984,25 +1113,16 @@
"bones": {
"body": {
"rotation": [-20, 0, 0],
"position": [0, -6.75, 0]
"position": [0, -6.5, 0]
},
"torso": {
"rotation": ["30+Math.cos((query.anim_time) * 90 * 1) * 2", 0, 0]
},
"chest": {
"torso2": {
"rotation": [15, 0, 0]
},
"head": {
"rotation": ["Math.cos((query.anim_time-0.3) * 90 * 1) * 4", 0, 0]
},
"eyelid_right": {
"position": [0, 0, -0.2]
},
"eyelid_left": {
"position": [0, 0, -0.125]
},
"arm_right": {
"rotation": [84.59842, "-62.3954+Math.cos((query.anim_time) * 90 * 1) * -2", -85.2103]
"rotation": [84.0524, "-64.8832+Math.cos((query.anim_time) * 90 * 1) * -2", -84.61105]
},
"arm_right2": {
"rotation": [0, 0, 22.5]
@@ -1011,7 +1131,7 @@
"rotation": [0, 0, 17.5]
},
"arm_left": {
"rotation": [84.59842, "62.3954+Math.cos((query.anim_time) * 90 * 1) * 2", 85.2103]
"rotation": [83.37018, "67.3682+Math.cos((query.anim_time) * 90 * 1) * 2", 83.87609]
},
"arm_left2": {
"rotation": [0, 0, -20]
@@ -1023,38 +1143,106 @@
"rotation": [-131.83574, 27.83165, -2.25974]
},
"leg_right2": {
"rotation": [105, 0, 0]
"rotation": [100, 0, 0]
},
"leg_left": {
"rotation": [-131.83574, -27.83165, 2.25974]
},
"leg_left2": {
"rotation": [107.5, 0, 0]
"rotation": [100, 0, 0]
},
"foot_left": {
"rotation": [27.5, 0, 0]
"rotation": [45, 0, 0]
},
"iris_left": {
"position": [0, 0, 0.1]
},
"pupil_eyelid_left": {
"position": [0, 0, -0.125]
},
"iris_right": {
"position": [0, 0, 0.1]
},
"pupil_eyelid_right": {
"position": [0, 0, -0.2]
},
"bubble_hoodie": {
"scale": 0
},
"foot_right": {
"rotation": [45, 0, 0]
},
"waist": {
"rotation": ["30+Math.cos((query.anim_time) * 90 * 1) * 2", 0, 0]
},
"ftorso2": {
"rotation": [15, 0, 0]
}
}
},
"animation.froakie.cry": {
"animation_length": 1,
"animation_length": 1.1667,
"bones": {
"head": {
"rotation": {
"0.0": [0, 0, 0],
"0.2083": [-12.5, 0, 0],
"0.4167": [-14, 0, 0],
"0.625": [-14.18, 0, 0],
"0.7917": [-12.5, 0, 0],
"1.0": [0, 0, 0]
"0.4583": [-14, 0, 0],
"0.7083": [-14.18, 0, 0],
"0.9167": [-12.5, 0, 0],
"1.1667": [0, 0, 0]
}
},
"mouth_open": {
"position": {
"0.0": [0, 0, 0],
"0.0417": [0, 0, -0.125],
"0.6667": [0, 0, -0.125],
"0.7083": [0, 0, 0]
"0.0417": {
"pre": [0, 0, 0],
"post": [0, 0, -0.125]
},
"1.0417": {
"pre": [0, 0, -0.125],
"post": [0, 0, 0]
}
}
},
"mouth_closed": {
"position": {
"0.0": [0, 0, 0],
"0.0417": {
"pre": [0, 0, 0],
"post": [0, 0, 0.1]
},
"1.0417": {
"pre": [0, 0, 0.1],
"post": [0, 0, 0]
}
}
},
"mouth_ditto": {
"position": {
"0.0": [0, 0, 0],
"0.0417": {
"pre": [0, 0, 0],
"post": [0, 0, 0.1]
},
"1.0417": {
"pre": [0, 0, 0.1],
"post": [0, 0, 0]
}
}
},
"mouth_open_ditto": {
"position": {
"0.0": [0, 0, 0],
"0.0417": {
"pre": [0, 0, 0],
"post": [0, 0, -0.1]
},
"1.0417": {
"pre": [0, 0, -0.1],
"post": [0, 0, 0]
}
}
}
},
@@ -1063,6 +1251,143 @@
"effect": "pokemon.froakie.cry"
}
}
},
"animation.froakie.hoodie": {
"animation_length": 1,
"bones": {
"eye_left": {
"position": {
"0.0": [0, 0, 0],
"0.4583": [0, 0, 0],
"0.5": {
"pre": [0, 0, 0],
"post": [0, -0.85, -3.65]
}
}
},
"eye_right": {
"position": {
"0.0": [0, 0, 0],
"0.4583": [0, 0, 0],
"0.5": {
"pre": [0, 0, 0],
"post": [0, -0.85, -3.65]
}
}
},
"bubble_hoodie": {
"rotation": {
"0.0": [-140, 0, 0],
"0.25": [-140, 0, 0],
"0.5": [0, 0, 0]
},
"position": {
"0.0": [0, -1, -1],
"0.25": [0, -1, -1],
"0.5": [0, 0, 0]
},
"scale": {
"0.0": [0, 0, 0],
"0.25": [1, 0.5, 0.5],
"0.5": [1, 1, 1]
}
},
"back_bubbles": {
"scale": {
"0.0": [1, 1, 1],
"0.2083": [0, 0, 0],
"0.5": [0, 0, 0]
}
},
"eye_ditto_left": {
"position": {
"0.0": [0, 0, 0],
"0.4583": [0, 0, 0],
"0.5": {
"pre": [0, 0, 0],
"post": [0, -0.85, -3.65]
}
}
},
"eye_ditto_right": {
"position": {
"0.0": [0, 0, 0],
"0.4583": [0, 0, 0],
"0.5": {
"pre": [0, 0, 0],
"post": [0, -0.85, -3.65]
}
}
}
}
},
"animation.froakie.pose": {
"loop": true,
"bones": {
"torso2": {
"rotation": [2.5, 0, 0]
},
"head": {
"rotation": [-10, 0, 0]
},
"iris_left": {
"position": [-0.25, 0, 0]
},
"iris_right": {
"position": [-1, 0, 0]
},
"chest_bubble_front": {
"rotation": [10, 0, 0]
},
"arm_left": {
"rotation": [72.75378, 58.72996, 59.37871],
"position": [0, 0, -1]
},
"arm_left2": {
"rotation": [0, 22.5, 0]
},
"arm_right": {
"rotation": [72.75378, -58.72996, -59.37871],
"position": [0, 0, -1]
},
"arm_right2": {
"rotation": [0, -22.5, 0]
},
"leg_left": {
"rotation": [-110, -45, 0],
"position": [0.5, -0.5, 0]
},
"leg_left2": {
"rotation": [140, 0, 0],
"position": [0, 0, 1.5]
},
"foot_left": {
"rotation": [-32.5, 0, 0]
},
"leg_right": {
"rotation": [-110, 45, 0],
"position": [-0.5, -0.5, 0]
},
"leg_right2": {
"rotation": [140, 0, 0],
"position": [0, 0, 1.5]
},
"foot_right": {
"rotation": [-32.5, 0, 0]
},
"body": {
"position": [0, -3.25, 0]
},
"bubble_hoodie": {
"scale": 0
},
"waist": {
"rotation": [15, 0, 0]
},
"ftorso2": {
"rotation": [2.5, 0, 0]
}
}
}
}
}
@@ -5,7 +5,7 @@
"loop": true,
"bones": {
"body": {
"position": [0, -0.5, 0]
"position": [0, -0.8, 0]
},
"torso": {
"rotation": ["-12.5+Math.cos((query.anim_time) * 90 * 1) * 3", 0, 0]
@@ -25,27 +25,12 @@
"eyelid_right": {
"position": [-0.1, 0, 0]
},
"pupil_eyelid_right": {
"eyelid_right2": {
"position": [0.05, 0, 0]
},
"eyelid_right2": {
"pupil_eyelid_right": {
"position": [0, 0.5, 0]
},
"eye_left": {
"position": [0, 0, 0]
},
"pupil_left": {
"position": [-0.075, 0, 0]
},
"eyelid_left": {
"position": [0.1, 0, 0]
},
"pupil_eyelid_left": {
"position": [0.075, 0.5, 0]
},
"eyelid_left2": {
"position": [-0.125, 0, 0]
},
"bubble": {
"rotation": ["-30+Math.cos((query.anim_time-0.5) * 90 * 1) * 6", 0, 0]
},
@@ -58,9 +43,6 @@
"bubble4": {
"rotation": ["5.2207+Math.cos((query.anim_time-1.1) * 90 * 1) * 7", 9.65594, 2.61298]
},
"bubble5": {
"rotation": ["Math.cos((query.anim_time-1.3) * 90 * 1) * 7", 20, 0]
},
"arm_right": {
"rotation": [32.60614, "12.24+Math.cos((query.anim_time-0.5) * 90 * 1) * 3", -61.27652]
},
@@ -98,7 +80,7 @@
"rotation": [25, 0, 0]
},
"foot_right": {
"rotation": [-7.5, 0, 0]
"rotation": [-9.99628, -0.36741, -1.45595]
},
"leg_left": {
"rotation": [-13.31673, -34.50311, -4.50012]
@@ -107,7 +89,58 @@
"rotation": [30, 0, 0]
},
"foot_left": {
"rotation": [-10, 0, 0]
"rotation": [-6.97816, 0.79759, 3.92399]
},
"bubbles_hoodie": {
"scale": 0
},
"bubble5": {
"rotation": ["5.2207+Math.cos((query.anim_time-1.6) * 90 * 1) * 7", 9.65594, 2.61298]
},
"finger_index_left2": {
"rotation": [0, 0, 25]
},
"finger_middle_left2": {
"rotation": [0, 0, 7.5]
},
"finger_ring_left2": {
"rotation": [0, 0, 17.5]
},
"finger_index_right2": {
"rotation": [0, 0, -25]
},
"finger_middle_right2": {
"rotation": [0, 0, -7.5]
},
"finger_ring_right2": {
"rotation": [0, 0, -17.5]
},
"foot_left2": {
"rotation": [-5.5, 0, 0]
},
"eye_right": {
"position": [0.1, 0, 0]
},
"eye_left": {
"position": [-0.1, 0, 0]
},
"pupil_left": {
"position": [-0.05, 0, 0]
},
"eyelid_left": {
"position": [0.1, 0, 0]
},
"pupil_eyelid_left": {
"position": [0, 0.5, 0]
},
"eyelid_left2": {
"position": [-0.05, 0, 0]
},
"frubble_right": {
"scale": 0
},
"frubble_left": {
"scale": 0
}
}
},
@@ -128,21 +161,12 @@
"eyelid_right": {
"position": [-0.1, 0, 0]
},
"pupil_eyelid_right": {
"position": [0.1, 0, 0]
},
"eyelid_right2": {
"position": [0.05, 0, 0]
},
"pupil_eyelid_right": {
"position": [0, 0.5, 0]
},
"eyelid_left": {
"position": [0.1, 0, 0]
},
"pupil_eyelid_left": {
"position": [0, 0.5, 0]
},
"eyelid_left2": {
"position": [-0.025, 0, 0]
},
"bubble": {
"rotation": ["-20+Math.cos((query.anim_time-0.5) * 90 * (2+2/3)*2) * -4", 0, 0]
},
@@ -155,9 +179,6 @@
"bubble4": {
"rotation": ["-15+Math.cos((query.anim_time-0.8) * 90 * (2+2/3)*2) * -5", 0, 0]
},
"bubble5": {
"rotation": [-17.5, 0, 0]
},
"arm_right": {
"rotation": [0, "(Math.cos((query.anim_time) * 90 * (2+2/3)) * -10)", -65]
},
@@ -233,6 +254,57 @@
},
"foot_left": {
"rotation": [0, 0, 10]
},
"bubbles_hoodie": {
"scale": 0
},
"bubble5": {
"rotation": ["-2.918+Math.cos((query.anim_time-1.3) * 90 * (2+2/3)*2) * -5", -3.21935, -0.08661]
},
"finger_index_left2": {
"rotation": [0, 0, 12.5]
},
"finger_middle_left2": {
"rotation": [0, 0, 7.5]
},
"finger_ring_left2": {
"rotation": [0, 0, 17.5]
},
"finger_index_right2": {
"rotation": [0, 0, -12.5]
},
"finger_middle_right2": {
"rotation": [0, 0, -7.5]
},
"finger_ring_right2": {
"rotation": [0, 0, -17.5]
},
"eye_right": {
"position": [0.1, 0, 0]
},
"pupil_right": {
"position": [0.05, 0, 0]
},
"eye_left": {
"position": [-0.1, 0, 0]
},
"pupil_left": {
"position": [-0.05, 0, 0]
},
"eyelid_left": {
"position": [0.1, 0, 0]
},
"pupil_eyelid_left": {
"position": [0, 0.5, 0]
},
"eyelid_left2": {
"position": [-0.05, 0, 0]
},
"frubble_right": {
"scale": 0
},
"frubble_left": {
"scale": 0
}
}
},
@@ -259,21 +331,12 @@
"eyelid_right": {
"position": [-0.1, 0, 0]
},
"pupil_eyelid_right": {
"position": [0.075, 0, 0]
},
"eyelid_right2": {
"position": [0.05, 0, 0]
},
"pupil_eyelid_right": {
"position": [0, 0.5, 0]
},
"eyelid_left": {
"position": [0.1, 0, 0]
},
"pupil_eyelid_left": {
"position": [0, 0.5, 0]
},
"eyelid_left2": {
"position": [-0.05, 0, 0]
},
"bubble": {
"rotation": ["-42.5+Math.cos((query.anim_time-0.6) * 90 * 1) * 4", 0, 0]
},
@@ -286,9 +349,6 @@
"bubble4": {
"rotation": ["-7.5283+Math.cos((query.anim_time-1.1) * 90 * 1) * 8", -4.95712, 0.65426]
},
"bubble5": {
"rotation": ["-12.6044+Math.cos((query.anim_time-1.3) * 90 * 1) * 8", -7.32123, 1.63219]
},
"arm_right": {
"rotation": [-59.02395, -19.49124, "8.0938+Math.cos((query.anim_time-0.4) * 90 * 1) * -4"]
},
@@ -324,6 +384,39 @@
},
"foot_left": {
"rotation": [40, 0, 0]
},
"bubbles_hoodie": {
"scale": 0
},
"bubble5": {
"rotation": [-15, 0, 0]
},
"eye_right": {
"position": [0.1, 0, 0]
},
"pupil_right": {
"position": [0.05, 0, 0]
},
"eye_left": {
"position": [-0.1, 0, 0]
},
"pupil_left": {
"position": [-0.05, 0, 0]
},
"eyelid_left": {
"position": [0.1, 0, 0]
},
"pupil_eyelid_left": {
"position": [0, 0.5, 0]
},
"eyelid_left2": {
"position": [-0.05, 0, 0]
},
"frubble_right": {
"scale": 0
},
"frubble_left": {
"scale": 0
}
}
},
@@ -351,21 +444,12 @@
"eyelid_right": {
"position": [-0.1, 0, 0]
},
"pupil_eyelid_right": {
"position": [0.075, 0, 0]
},
"eyelid_right2": {
"position": [0.05, 0, 0]
},
"pupil_eyelid_right": {
"position": [0, 0.5, 0]
},
"eyelid_left": {
"position": [0.1, 0, 0]
},
"pupil_eyelid_left": {
"position": [0, 0.5, 0]
},
"eyelid_left2": {
"position": [-0.05, 0, 0]
},
"bubble": {
"rotation": ["-42.5+Math.cos((query.anim_time-0.6) * 90 * (2+2/3)) * 4", 0, 0]
},
@@ -378,9 +462,6 @@
"bubble4": {
"rotation": ["-7.5283+Math.cos((query.anim_time-1.1) * 90 * (8/3)) * 8", -4.95712, 0.65426]
},
"bubble5": {
"rotation": ["-12.6044+Math.cos((query.anim_time-1.3) * 90 * (8/3)) * 8", -7.32123, 1.63219]
},
"arm_right": {
"rotation": [-57.88953, -0.0813, "-51.5519+Math.cos((query.anim_time-0.35) * 90 * (2+2/3)) * 6"]
},
@@ -469,6 +550,39 @@
},
"foot_left2": {
"rotation": [0, 0, 0]
},
"bubbles_hoodie": {
"scale": 0
},
"bubble5": {
"rotation": ["-7.5283+Math.cos((query.anim_time-1.8) * 90 * (8/3)) * 8", -4.95712, 0.65426]
},
"eye_right": {
"position": [0.1, 0, 0]
},
"pupil_right": {
"position": [0.05, 0, 0]
},
"eye_left": {
"position": [-0.1, 0, 0]
},
"pupil_left": {
"position": [-0.05, 0, 0]
},
"eyelid_left": {
"position": [0.1, 0, 0]
},
"pupil_eyelid_left": {
"position": [0, 0.5, 0]
},
"eyelid_left2": {
"position": [-0.05, 0, 0]
},
"frubble_right": {
"scale": 0
},
"frubble_left": {
"scale": 0
}
}
},
@@ -503,9 +617,6 @@
"bubble4": {
"rotation": ["Math.cos((query.anim_time-0.7) * 90 * 2) * -10", 0, 0]
},
"bubble5": {
"rotation": ["Math.cos((query.anim_time-0.9) * 90 * 2) * -5", 0, 0]
},
"arm_right": {
"rotation": [
"50.3607+Math.cos((query.anim_time) * 90 * 2) * -3",
@@ -574,25 +685,18 @@
},
"foot_left": {
"rotation": [-28.24912, 16.7796, 28.24912]
}
}
},
"animation.frogadier.blink": {
"animation_length": 0.1667,
"bones": {
"eyelid_right": {
"position": {
"0.0": [-0.1, 0, 0],
"0.12": [-0.1, 0, 0],
"0.16": [0, 0, 0]
}
},
"eyelid_left": {
"position": {
"0.0": [0.1, 0, 0],
"0.12": [0.1, 0, 0],
"0.16": [0, 0, 0]
}
"bubble5": {
"rotation": [-22.5, 0, 0]
},
"bubbles_hoodie": {
"scale": 0
},
"frubble_right": {
"scale": 0
},
"frubble_left": {
"scale": 0
}
}
},
@@ -616,14 +720,14 @@
"0.0": [0, -5, 0],
"0.25": [0, -6.25, 1.5],
"0.5": [0, -6.52, 2.18],
"0.75": [0, -6.06, 2.97],
"0.9583": [0, -5.4, 3.83],
"1.0833": [0, -5, 4],
"1.2917": [0, -5.57, 2.585],
"1.4583": [0, -8.82, 0.32],
"1.5417": [0, -14, -2.75],
"1.5833": [0, -14.5, -3.25],
"1.6667": [0, -14, -2.75]
"0.75": [0, -6.06, 2.07],
"0.9583": [0, -5.4, 2.13],
"1.0833": [0, -5, 2.1],
"1.2917": [0, -5.57, -0.615],
"1.4583": [0, -8.82, -4.68],
"1.5417": [0, -14, -6.85],
"1.5833": [0, -14.5, -7.35],
"1.6667": [0, -14, -6.85]
}
},
"torso": {
@@ -694,19 +798,6 @@
"1.5": [-0.125, 0, 0]
}
},
"eyelid_left": {
"position": {
"0.0": [0.15, 0, 0],
"0.625": [0.15, 0, 0],
"0.6667": [0, 0, 0],
"0.7917": [0, 0, 0],
"0.8333": [0.15, 0, 0],
"0.875": [0.15, 0, 0],
"0.9167": [0, 0, 0],
"1.4167": [0, 0, 0],
"1.4583": [0.15, 0, 0]
}
},
"bubble": {
"rotation": {
"0.0": [-25, 0, 0],
@@ -747,13 +838,6 @@
"1.9583": [-27.5, 0, 0]
}
},
"bubble5": {
"rotation": {
"0.0": [-10, 0, 0],
"1.625": [-28.4, 0, 0],
"1.9583": [10, 0, 0]
}
},
"arm_right": {
"rotation": {
"0.0": [0, 0, -22.5],
@@ -904,6 +988,28 @@
"1.9167": [-0.56754, 7.64427, 6.46635],
"2.125": [1.93246, 7.64427, 6.46635]
}
},
"bubbles_hoodie": {
"scale": 0
},
"eyelid_left": {
"position": {
"0.0": [0.125, 0, 0],
"0.625": [0.125, 0, 0],
"0.6667": [-0.03, 0, 0],
"0.7917": [-0.03, 0, 0],
"0.8333": [0.125, 0, 0],
"0.875": [0.125, 0, 0],
"0.9167": [-0.03, 0, 0],
"1.4583": [-0.03, 0, 0],
"1.5": [0.125, 0, 0]
}
},
"frubble_right": {
"scale": 0
},
"frubble_left": {
"scale": 0
}
}
},
@@ -928,10 +1034,7 @@
"position": [0, -0.75, -1.25]
},
"eyelid_right": {
"position": [-0.125, 0, 0]
},
"eyelid_left": {
"position": [0.15, 0, 0]
"position": [-0.1, 0, 0]
},
"bubble": {
"rotation": ["-57.5+Math.cos((query.anim_time-0.3) * 90 * 1) * 3", 0, 0]
@@ -945,9 +1048,6 @@
"bubble4": {
"rotation": ["-20+Math.cos((query.anim_time-0.8) * 90 * 1) * 3", 0, 0]
},
"bubble5": {
"rotation": [-22.5, 0, 0]
},
"arm_right": {
"rotation": [-80.93413, "-22.0118+Math.cos((query.anim_time) * 90 * 1) * 4", 12.47776]
},
@@ -979,18 +1079,113 @@
"rotation": [-97.04431, -75.92487, 21.99572]
},
"leg_left2": {
"rotation": [90, 0, 0]
"rotation": [95, 0, 0]
},
"foot_left": {
"rotation": [6.74942, 34.96182, -51.94901]
},
"foot_left2": {
"rotation": [30, 0, 0]
},
"bubbles_hoodie": {
"scale": 0
},
"eye_right": {
"position": [0.1, 0, 0]
},
"eye_left": {
"position": [-0.1, 0, 0]
},
"eyelid_left": {
"position": [0.1, 0, 0]
},
"frubble_right": {
"scale": 0
},
"frubble_left": {
"scale": 0
}
}
},
"animation.frogadier.blink": {
"animation_length": 0.1667,
"bones": {
"eyelid_right": {
"position": {
"0.0": [-0.1, 0, 0],
"0.16": {
"pre": [-0.1, 0, 0],
"post": [0, 0, 0]
}
}
},
"eye_right": {
"position": {
"0.0": [0.1, 0, 0],
"0.16": {
"pre": [0.1, 0, 0],
"post": [0, 0, 0]
}
}
},
"eye_left": {
"position": {
"0.0": [-0.1, 0, 0],
"0.16": {
"pre": [-0.1, 0, 0],
"post": [0, 0, 0]
}
}
},
"eyelid_left": {
"position": {
"0.0": [0.1, 0, 0],
"0.16": {
"pre": [0.1, 0, 0],
"post": [0, 0, 0]
}
}
},
"eye_ditto_right": {
"position": {
"0.0": [0.1, 0, 0],
"0.16": {
"pre": [0.1, 0, 0],
"post": [0, 0, 0]
}
}
},
"eye_closed_ditto_right": {
"position": {
"0.0": [-0.1, 0, 0],
"0.16": {
"pre": [-0.1, 0, 0],
"post": [0, 0, 0]
}
}
},
"eye_ditto_left": {
"position": {
"0.0": [-0.1, 0, 0],
"0.16": {
"pre": [-0.1, 0, 0],
"post": [0, 0, 0]
}
}
},
"eye_closed_ditto_left": {
"position": {
"0.0": [0.1, 0, 0],
"0.16": {
"pre": [0.1, 0, 0],
"post": [0, 0, 0]
}
}
}
}
},
"animation.frogadier.cry": {
"animation_length": 1.16667,
"animation_length": 1.1667,
"bones": {
"head": {
"rotation": {
@@ -1017,6 +1212,45 @@
"effect": "pokemon.frogadier.cry"
}
}
},
"animation.frogadier.ditto_face": {
"loop": true,
"bones": {
"eye_right": {
"scale": 0
},
"eyelid_right": {
"scale": 0
},
"eye_left": {
"scale": 0
},
"eyelid_left": {
"scale": 0
},
"face_ditto_right": {
"position": [-0.1, 0, 0]
},
"face_ditto_left": {
"position": [0.1, 0, 0]
}
}
},
"animation.frogadier.bubble_hoodie": {
"loop": true,
"bones": {
"bubbles": {
"position": [0, 2, 0]
},
"bubbles_front": {
"scale": 0
},
"bubbles_hoodie": {
"rotation": [2.5, 0, 0],
"position": [0, 0, 0],
"scale": 1
}
}
}
}
}
Loaded 100 of 1056 files, more files were not shown because too many files have changed in this diff. Show more