Compare commits

...
Author SHA1 Message Date
dhi_holo 49c22f951d Update copper_fridge.json 2026-09-25 14:59:54 +10:00
dhi_holo a94cbc4eae Merge branch 'main' into applied-appliances 2026-09-25 14:59:00 +10:00
Polymeta a0e732dc6e Merge branch 'perf/build-speed' into 'main'
Speed up the Gradle build

See merge request cable-mc/cobblemon!2429
2026-09-24 14:35:25 +00:00
terrainwax ea20c2aa4c CI: don't upload dev-shadow jars 2026-09-24 10:43:07 +02:00
terrainwax da5272c473 Speed up the Gradle build
- Exclude assets/data (~250MB) from sources jars
- Limit licenser to .kt/.java so it doesn't scan ~29k resource files
- Enable the Gradle daemon and build cache
- The versioning plugin runs a full JGit status (~28s on this repo) in every project replace by ou own helper that use git local or CI env variable
2026-09-24 10:04:35 +02:00
Polymeta a785e574e0 Merge branch 'feature/data-registries' into 'main'
26.1.2 backport of dataregistry

See merge request cable-mc/cobblemon!2285
2026-09-22 21:08:14 +00:00
Polymeta 4b236b0268 Merge branch 'feature/remember-your-tm' into 'main'
load features a lot sooner to avoid form switching

Closes #2085

See merge request cable-mc/cobblemon!2406
2026-09-22 21:07:44 +00:00
Polymeta 1cd86ae5d6 small fixes
Signed-off-by: Polymeta <4726322-polymeta@users.noreply.gitlab.com>
2026-09-22 16:43:33 +01:00
Polymeta b7489a0b14 tidy up changelog
Signed-off-by: Polymeta <4726322-polymeta@users.noreply.gitlab.com>
2026-09-22 15:32:25 +01:00
Polymeta f7554425dc Merge branch 'tm-shelf-mipmap-correction' into 'main'
Fix mip map of TM shelf disc textures to be 16x16

Closes #2081

See merge request cable-mc/cobblemon!2398
2026-09-22 14:26:41 +00:00
Polymeta 858d2e908a I tidied up too well
Signed-off-by: Polymeta <4726322-polymeta@users.noreply.gitlab.com>
2026-09-21 22:12:18 +01:00
Polymeta b61e0b0c82 tidy up changelog
Signed-off-by: Polymeta <4726322-polymeta@users.noreply.gitlab.com>
2026-09-21 22:11:43 +01:00
Polymeta 4d9a6e71c9 use correct texture for upgrade and dubious disc
Signed-off-by: Polymeta <4726322-polymeta@users.noreply.gitlab.com>
2026-09-21 22:07:52 +01:00
Plastered_Crab a0010de504 Merge remote-tracking branch 'origin/tm-shelf-mipmap-correction' into tm-shelf-mipmap-correction
# Conflicts:
#	common/src/main/resources/assets/cobblemon/textures/block/disc_shelf/dubious_disc.png
#	common/src/main/resources/assets/cobblemon/textures/block/disc_shelf/music_disc_11.png
#	common/src/main/resources/assets/cobblemon/textures/block/disc_shelf/music_disc_13.png
#	common/src/main/resources/assets/cobblemon/textures/block/disc_shelf/music_disc_5.png
#	common/src/main/resources/assets/cobblemon/textures/block/disc_shelf/music_disc_blocks.png
#	common/src/main/resources/assets/cobblemon/textures/block/disc_shelf/music_disc_cat.png
#	common/src/main/resources/assets/cobblemon/textures/block/disc_shelf/music_disc_chirp.png
#	common/src/main/resources/assets/cobblemon/textures/block/disc_shelf/music_disc_creator.png
#	common/src/main/resources/assets/cobblemon/textures/block/disc_shelf/music_disc_creator_music_box.png
#	common/src/main/resources/assets/cobblemon/textures/block/disc_shelf/music_disc_far.png
#	common/src/main/resources/assets/cobblemon/textures/block/disc_shelf/music_disc_mall.png
#	common/src/main/resources/assets/cobblemon/textures/block/disc_shelf/music_disc_mellohi.png
#	common/src/main/resources/assets/cobblemon/textures/block/disc_shelf/music_disc_otherside.png
#	common/src/main/resources/assets/cobblemon/textures/block/disc_shelf/music_disc_pigstep.png
#	common/src/main/resources/assets/cobblemon/textures/block/disc_shelf/music_disc_precipice.png
#	common/src/main/resources/assets/cobblemon/textures/block/disc_shelf/music_disc_relic.png
#	common/src/main/resources/assets/cobblemon/textures/block/disc_shelf/music_disc_stal.png
#	common/src/main/resources/assets/cobblemon/textures/block/disc_shelf/music_disc_strad.png
#	common/src/main/resources/assets/cobblemon/textures/block/disc_shelf/music_disc_unknown.png
#	common/src/main/resources/assets/cobblemon/textures/block/disc_shelf/music_disc_wait.png
#	common/src/main/resources/assets/cobblemon/textures/block/disc_shelf/music_disc_ward.png
#	common/src/main/resources/assets/cobblemon/textures/block/disc_shelf/technical_machine.png
#	common/src/main/resources/assets/cobblemon/textures/block/disc_shelf/technical_machine_base.png
#	common/src/main/resources/assets/cobblemon/textures/block/disc_shelf/technical_machine_overlay.png
#	common/src/main/resources/assets/cobblemon/textures/block/disc_shelf/upgrade.png
2026-09-21 10:34:36 -07:00
Plastered_Crab cb73a30e23 changeloguwu 2026-09-21 10:18:50 -07:00
Polymeta 9a7536b068 you were not supposed to be there
Signed-off-by: Polymeta <4726322-polymeta@users.noreply.gitlab.com>
2026-09-21 14:42:23 +01:00
Polymeta bd973e702e per type texture for disc shelf tms
Signed-off-by: Polymeta <4726322-polymeta@users.noreply.gitlab.com>
2026-09-21 14:40:24 +01:00
Plastered_CrabandPolymeta ede1851d34 Fix mip map of TM shelf disc textures to be 16x16 2026-09-21 14:28:14 +01:00
Polymeta cdb8ee0d8e [skip-ci] tidy up changelog
Signed-off-by: Polymeta <4726322-polymeta@users.noreply.gitlab.com>
2026-09-21 12:07:55 +01:00
Polymeta e7d86a382c Merge branch 'dex_molang' into 'main'
Molang: Individual Dex molang

See merge request cable-mc/cobblemon!2273
2026-09-21 09:16:10 +00:00
Konoha DandPolymeta eb911df830 Molang: Individual Dex molang 2026-09-21 09:16:10 +00:00
Polymeta 1c30acc53c Merge branch 'implement_pokemon' into 'main'
implement_pokemon

See merge request cable-mc/cobblemon!2417
2026-09-21 09:14:23 +00:00
Polymeta 32b0699235 load features a lot sooner to avoid form switching
Signed-off-by: Polymeta <4726322-polymeta@users.noreply.gitlab.com>
2026-09-21 10:13:59 +01:00
Polymeta e9c6580230 fix merge conflicts
Signed-off-by: Polymeta <4726322-polymeta@users.noreply.gitlab.com>
2026-09-21 10:13:27 +01:00
Polymeta f893eb48fd fix some errors I forgot about
Signed-off-by: Polymeta <4726322-polymeta@users.noreply.gitlab.com>
2026-09-21 09:38:51 +01:00
Polymeta 232e2f18bf MR feedback
Signed-off-by: Polymeta <4726322-polymeta@users.noreply.gitlab.com>
2026-09-21 09:38:51 +01:00
Polymeta c266c99710 26.1.2 backport of dataregistry
Signed-off-by: Polymeta <4726322-polymeta@users.noreply.gitlab.com>
2026-09-21 09:38:49 +01:00
Polymeta 2a0e8f6d47 [skip-ci] tidy up changelog
Signed-off-by: Polymeta <4726322-polymeta@users.noreply.gitlab.com>
2026-09-21 09:32:44 +01:00
Polymeta e6bd8ec529 Merge branch 'neoforge-reload-fix' into 'main'
Neoforge resource fix

See merge request cable-mc/cobblemon!2333
2026-09-21 08:30:54 +00:00
CraterandPolymeta 911a95e873 Neoforge resource fix 2026-09-21 08:30:53 +00:00
Polymeta 447cfc2ae5 Merge branch 'useful-misc-functions' into 'main'
Smoother ride rotations.

See merge request cable-mc/cobblemon!2407
2026-09-21 08:28:50 +00:00
Polymeta 8dfeb0d260 Merge branch 'no-glass-bottles-in-those' into 'main'
Fixed Mochis and Feathers dropping glass bottles when they shouldn't

See merge request cable-mc/cobblemon!2425
2026-09-21 08:24:28 +00:00
Polymeta caa7b19833 Merge branch 'Snowy-Burrow-Spawns-Fix' into 'main'
Fix Snowy burrows spawns and some floating water in one difting iceberg

See merge request cable-mc/cobblemon!2423
2026-09-21 08:23:17 +00:00
Polymeta 64dd8ae193 fix license header
Signed-off-by: Polymeta <4726322-polymeta@users.noreply.gitlab.com>
2026-09-21 09:17:44 +01:00
Polymeta 156ee6f290 new negate requirement
Signed-off-by: Polymeta <4726322-polymeta@users.noreply.gitlab.com>
2026-09-21 08:23:04 +01:00
Gertimoshka fe433d1417 Fixed Mochis and Feathers dropping glass bottles when they shouldn't 2026-09-20 20:10:25 +02:00
Hiroku 0dc662d295 Merge branch 'starter-screen-fixes' into 'main'
Fixes minor but annoying starter screen fixes

See merge request cable-mc/cobblemon!2424
2026-09-20 09:33:15 +00:00
Gertimoshka 081e370bfd User friendlier changelog 2026-09-20 11:13:08 +02:00
Gertimoshka 3ef0567287 simplifications 2026-09-20 11:05:26 +02:00
Gertimoshka 3cad9e5481 Forgor the Changelog 2026-09-20 11:01:52 +02:00
Gertimoshka dc8b7908be Fixed impropper rendering culling of entries, and random starter not being part of height calculation of the category 2026-09-20 10:52:15 +02:00
Slippy 85085a1eca Decaying Crypt tombstones now will generate with TMs in the gidled chest 2026-09-19 22:40:20 -05:00
Slippy bff59dee6e Fix Snowy burrows spawns and some floating water in one difting iceberg 2026-09-19 22:01:17 -05:00
Hiroku bb5828531a Merge branch 'type-gem-fix' into 'main'
Fix typo and update changelog.

See merge request cable-mc/cobblemon!2422
2026-09-20 02:29:36 +00:00
Deltric cd08e98c28 Fix typo and update changelog. 2026-09-19 21:09:32 -05:00
dhi_holo 5083af626c Fridge Cleaning
Tried changing some stuff to fix the fridge, it failed, but the code is a bit more consistent now so I'll keep what it got to
2026-09-19 18:05:21 +10:00
dhi_holo 137bb37c29 Merge branch 'main' into applied-appliances 2026-09-19 16:26:53 +10:00
dhi_holo eec578b312 I. Am. AN IDIOT!
With a Axe and a Honeycomb.
2026-09-19 16:26:16 +10:00
Jerzykv 331f7ca425 Implemented Burmy, Wormadam and Mothim 2026-09-18 07:15:33 +02:00
RedGenesectNinja 71c9ac0ff0 Updated changelog 2026-09-17 15:15:20 -05:00
GenotypeXD 1404cc0ab5 Sun Lizards Implementation Tags 2026-09-17 15:11:31 -05:00
GenotypeXD 6ca908a91d Implemented Helioptile Line 2026-09-17 13:05:12 -05:00
Jerzykv 0948b8da9a Fixed Dragonair not using its idle correctly 2026-09-17 19:17:29 +02:00
Jerzykv 22e04a53b3 changelog 2026-09-17 18:39:10 +02:00
Jerzykv df3217b41b Fixed Bramblin always sleeping 2026-09-17 18:38:48 +02:00
dhi_holo b6abe9711d Pistons Die Now
Added Piston Reactions, cleaned up comments on Fridge
2026-09-17 15:10:16 +10:00
dhi_holo 38c2e0d194 Merge branch 'main' into applied-appliances 2026-09-17 14:49:34 +10:00
dhi_holo 69566a97ca Oxidation Four of Five
Untested on NeoForge, will test once I fix Fridge

Oven, Washer, Mower, and Fan all oxidize correctly, Fridge breaks instantly when ticking. I've got a couple theories to test on fixing it
2026-09-17 14:49:11 +10:00
Jerzykv 9ff15a1913 Flygon poser fix 2026-09-17 06:43:03 +02:00
dhi_holo 6866e9af9b Data Files
Loot Tables, Recipes, Recipe Advancements and Tags. More could be added, but this is a good starting point
2026-09-16 19:40:34 +10:00
dhi_holo e45f2c6261 Progress
Got a mostly working weathering block class, but the codec is pissing me off
2026-09-16 15:54:05 +10:00
RedGenesectNinja ca58801794 Implemented Tympole, Palpitoad and Seismitoad 2026-09-15 23:36:40 -05:00
Instrafe 38fa5e2628 Updated Changelog 2026-09-15 16:46:25 -04:00
Instrafe fae1ae7124 Implemented Absol's remodel 2026-09-15 16:45:59 -04:00
Jerzykv 3ec5f76c73 Implemented Deerling and Sawsbuck remodels 2026-09-15 14:15:37 +02:00
dhi_holo d9bea49567 Merge branch 'main' into applied-appliances 2026-09-15 20:16:50 +10:00
dhi_holo 235b753a25 Fully Assetted
(Mostly)
Copper Fans still need their wall variant, but this gets everything reasonably testable for trying to get oxidation working
2026-09-15 20:16:33 +10:00
dhi_holo 3d48432390 Fridge Too
Fridge now places both halves and looks right and allat, yay yippee
2026-09-15 19:40:53 +10:00
ewwww 5bb8aaba55 Merge remote-tracking branch 'origin/implement_pokemon' into implement_pokemon 2026-09-15 05:05:08 -04:00
ewwww 23ba41e981 wiglett + wugtrio underwater tweaks 2026-09-15 05:04:40 -04:00
dhi_holo 7b03940dab Checkpoint
Got the basic functions for the Fan, Mower, Washer, and Oven in. Temporarily removed oxidation classes because it wasn't behaving and I'll reinvestigate later. Fridge next, the concerning one
2026-09-15 18:38:40 +10:00
Instrafe 29b049452b Updated Changelog 2026-09-14 19:24:03 -04:00
Instrafe 0b0f665804 Glimmet and Glimmora now have implemented remodels 2026-09-14 19:23:30 -04:00
Kenji_64 5d53fba2ce Fixed Rockruff line missing blinks 2026-09-14 20:47:40 +02:00
dhi_holo 8d5d37c750 Breaking Shit
I'm breaking everything lmao
2026-09-14 20:20:16 +10:00
dhi_holo cdb9c80c0e Commented Out Some Unused Pieces
Trying to slim what's there so I can work out the main things to then reassemble it all together properly later
2026-09-14 18:48:17 +10:00
dhi_holo a77f035617 Oh God Oh Fuck They're Doing Something Weird Again
Began some basic code for the Copper Appliance Blocks. It's uh, not pretty, but the purpose is to be a shell to test the visual behaviours on while the smartypants make the actual appliance work *work*.
2026-09-14 18:33:19 +10:00
FrankTheFarmer 14cc851562 Tweaked Mimikyus poser. Hopefully fixes an issue nobody can replicate 😭 2026-09-14 09:46:55 +10:00
FrankTheFarmer 7223d1fd68 Merge branch 'main' into implement_pokemon 2026-09-14 09:21:43 +10:00
Instrafe 75f52e4cf4 Updated Changelog 2026-09-13 11:10:48 -04:00
Instrafe 55446dd4b1 Implemented remodels for Binacle and Barbaracle 2026-09-13 11:08:58 -04:00
ewwww 8b825d558f cacnea & cacturne remodels + animations 2026-09-13 06:28:57 -04:00
jackowes 9a7f97f11f changelog 2026-09-12 21:52:56 -05:00
jackowes 95b8d62e4a Fix issue with quat spring and replace orientation controller tick slerp with quat spring 2026-09-12 21:45:26 -05:00
Plastered_Crab 4354c3fb03 Fix mip map of TM shelf disc textures to be 16x16 2026-09-10 11:56:30 -07:00
Kenji_64 f25a676bd5 Changelog 2026-09-10 13:26:54 +02:00
Kenji_64 a9906762a0 Fixed head_ai and removed battle condition on Lycanroc (all forms) 2026-09-10 13:23:03 +02:00
Kenji_64 7b5b88eca2 Added head movement to Archaludon and added missing sleep poses to Duraludon line 2026-09-10 13:22:34 +02:00
Kenji_64 291682ba52 Added Diglett line faints (which were in the files, but not implemented) 2026-09-10 12:50:56 +02:00
Kenji_64 546d403b45 Fixed Kingambit waddling its legs around when moving 2026-09-10 12:50:22 +02:00
FrankTheFarmer c9f40e32a1 Changedog 2026-09-09 20:42:39 +10:00
FrankTheFarmer d642b8dd07 Candle dog's dad 🪦 🐶 2026-09-09 20:41:42 +10:00
FrankTheFarmer 549a11116e Candle dog. Dog with the candle. We put candle on him 🕯🐶 2026-09-09 20:39:45 +10:00
Polymeta b5468a4a4f Merge branch 'main' into implement_pokemon 2026-09-09 09:06:51 +01:00
ewwww c5d278ccb7 spheal. 2026-09-09 03:42:50 -04:00
ewwww bf5e15de45 Merge remote-tracking branch 'origin/implement_pokemon' into implement_pokemon 2026-09-09 03:40:21 -04:00
Jerzykvandewwww f4af417267 Fixed Alolan Raticate's cry 2026-09-09 03:40:14 -04:00
FrankTheFarmerandewwww 69c04acaeb ⚡ Vikavolt 2026-09-09 03:40:14 -04:00
FrankTheFarmerandewwww 83a6bb188f 🚎Charjabug💖 2026-09-09 03:40:14 -04:00
FrankTheFarmerandewwww 494a8b5e91 🐛Grubbin 2026-09-09 03:40:14 -04:00
FrankTheFarmerandewwww c8021f2f08 Im putting bugs into cobblemon changelog 2026-09-09 03:40:14 -04:00
Jerzykvandewwww 8cdf3af047 Ampharos now has eye locators 2026-09-09 03:40:14 -04:00
ewwww c90a24e1ab switcheroo part two 2026-09-09 03:40:14 -04:00
FrankTheFarmerandewwww 83e3cfc34e Placeholder idle animation for snover 2026-09-09 03:40:14 -04:00
FrankTheFarmerandewwww 133dd4e5b7 🏔 Added snover line 🌲 2026-09-09 03:40:13 -04:00
FrankTheFarmerandewwww a8cca14b86 Obamasnow 2026-09-09 03:40:13 -04:00
FrankTheFarmerandewwww 9b0f356fa4 Donald Snover 2026-09-09 03:40:13 -04:00
FrankTheFarmerandewwww f2b0a102b6 What if we started implementing pokemon rn rn 2026-09-09 03:40:13 -04:00
FrankTheFarmer a7d01b230a Merge branch 'main' into implement_pokemon 2026-09-09 16:04:20 +10:00
jackowes 2a7db4b9b8 bring in util functions 2026-09-08 20:15:54 -05:00
Jerzykv 77e5f2501d Fixed Alolan Raticate's cry 2026-09-08 19:56:35 +02:00
FrankTheFarmer e6513717bd ⚡ Vikavolt 2026-09-08 21:34:26 +10:00
FrankTheFarmer 0e0c98f693 🚎Charjabug💖 2026-09-08 21:32:56 +10:00
FrankTheFarmer 528bfa4e22 🐛Grubbin 2026-09-08 21:32:09 +10:00
FrankTheFarmer 83c87779d7 Im putting bugs into cobblemon changelog 2026-09-08 21:30:42 +10:00
FrankTheFarmer dc33235144 Merge branch 'refs/heads/main' into implement_pokemon 2026-09-08 21:29:01 +10:00
FrankTheFarmer 935c658c5f Merge branch 'main' into implement_pokemon 2026-09-08 17:59:22 +10:00
Jerzykv 0426f4fbf9 Ampharos now has eye locators 2026-09-07 08:31:09 +02:00
ewwww 46e771a062 Merge remote-tracking branch 'origin/implement_pokemon' into implement_pokemon 2026-09-05 22:07:28 -04:00
ewwww 4c0095844b Merge remote-tracking branch 'origin/implement_pokemon_2' into implement_pokemon 2026-09-05 22:06:39 -04:00
ewwww 10a2ef27d6 switcheroo part two 2026-08-24 15:36:02 -04:00
FrankTheFarmer 3c7637515c Placeholder idle animation for snover 2026-08-10 13:03:00 +10:00
FrankTheFarmer 0a5abdb331 🏔 Added snover line 🌲 2026-08-09 11:15:45 +10:00
FrankTheFarmer 4ed7413dd2 Obamasnow 2026-08-09 11:13:17 +10:00
FrankTheFarmer 40b66c24fc Donald Snover 2026-08-09 11:12:56 +10:00
FrankTheFarmer 20a35de3d8 What if we started implementing pokemon rn rn 2026-08-08 14:58:20 +10:00
668 changed files with 53461 additions and 5153 deletions
+3
View File
@@ -157,6 +157,9 @@ build:
paths:
- neoforge/build/libs
- fabric/build/libs
exclude:
- neoforge/build/libs/*-dev-shadow.jar
- fabric/build/libs/*-dev-shadow.jar
publish:
stage: deploy
+59 -6
View File
@@ -7,38 +7,91 @@
- Iron Ball, Metal Coat, Throat Spray, HP Up, Protein, Iron, Carbos, Calcium, Zinc, PP Up, PP Max, Upgrade, Dubious Disc, and Loaded Dice.
- The following items can now be placed on various surfaces:
- Galarica Wreath, Magnet, Flame Orb, Life Orb, Toxic Orb, Light Ball, and Smoke Ball.
- The following items can now be placed as blocks, and have additional functionality:
- The following items can now be placed as blocks and have additional functionality:
- Ring Target, Metronome, and Eject Button.
- The following items can now be worn by Players and Pokémon:
- 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 rideable Pokémon
### Pokémon Added
#### Generation 4
- Snover
- Abomasnow
- Burmy
- Wormadam
- Mothim
#### Regional Forms
#### Generation 5
- Tympole
- Palpitoad
- Seismitoad
#### Generation 6
- Helioptile
- Heliolisk
#### Generation 7
- Grubbin
- Charjabug
- Vikavolt
#### Generation 9
- Greavard
- Houndstone
### Model updates for the following Pokémon
- Cacnea
- Cacturne
- Binacle
- Barbaracle
- Glimmet
- Glimmora
- Deerling
- Sawsbuck (All forms)
- Absol
### Animation updates for the following Pokémon
#### Added sounds to the following moves
- Cacnea
- Cacturne
### 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
### Fixes
- Correctly grants "They're Minerals!" advancement when planting a type gem
- Type Gem Blocks now have advancements to give you the recipe in the recipe book (the data for the advancements were inside the recipes somehow??)
- Some other recipes without advancements have also been corrected
- Corrected the TM Recipes for Charge Beam and Payday
- Type Gem blocks now properly generate clusters off of the block.
- Starter Screen Categories will no longer stop rendering if they are bigger than the viewport, and you are not viewing top or bottom edges
- Random Starter option now properly handled in height calculation, so now it won't run off into other categories or be un-accessible due to scroll limits if it causes a new row
- Mochi and Feathers no longer drop glass bottles on use
- Fixed a rare set of concurrency bugs related to reloading packs on NeoForge; fixes a ModernFix issue
- Removed unnecessary conditions for Mimikyu's standing pose. Hopefully fixes the rare instance of it using its shoulder animations during battle in multiplayer scenarios.
- Fixed Rockruff line not blinking
- Fixed Flygon sometimes using its running animation instead of walking
- Fixed Bramblin always sleeping outside of battle
- Fixed Dragonair using its battle idle as a normal idle
- Fixed Lycanroc's head movement
- Added head movement to Archaludon
- Fixed Duraludon line not having any sleep animations
- Fixed Diglett line not having their faint animations
- Fixed Kingambit moving its legs while walking
- 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.
- Added Molang functions for individual Pokédex ids, wherein a subdex is passed in as a string to `dex_caught_count` etc.
### Particles
+2
View File
@@ -0,0 +1,2 @@
Spec Doc: https://docs.google.com/document/d/1hEKKrT4JEagJBykx-k9K2BoeNxiMGahUWXnf8YQ85xo/edit?tab=t.0
Marshal: dhi_holo
-9
View File
@@ -1,9 +0,0 @@
- Some kind of particle effect for them? they're meant to have glowing eyes, so maybe some red particles on the eye locator
--- global posers? stacked posers?
--- red texture seems to be what some people wanted.
/- shoulder mounts part of it
- omni boost
- roar when player comes within reach, adjust levels
- Riding settings to control what the min scale is for a pokemon to be ridable.
+5 -2
View File
@@ -1,3 +1,6 @@
import utilities.gitBranch
import utilities.gitShortCommit
plugins {
id("cobblemon.root-conventions")
}
@@ -6,6 +9,6 @@ version = "${project.property("mod_version")}+${project.property("mc_version")}"
val isSnapshot = project.property("snapshot")?.equals("true") == true
if (isSnapshot) {
val fixedBranchName = versioning.info.branch.substringAfter("/")
version = "$version-${fixedBranchName}-${versioning.info.build}"
val fixedBranchName = gitBranch().substringAfter("/")
version = "$version-${fixedBranchName}-${gitShortCommit()}"
}
+15 -6
View File
@@ -1,9 +1,8 @@
import utilities.isSnapshot
import utilities.version
import java.time.OffsetDateTime
import java.time.ZoneOffset
import java.time.format.DateTimeFormatter
import utilities.gitBranch
import utilities.gitCommit
/*
*
@@ -72,6 +71,14 @@ 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")
}
@@ -98,11 +105,13 @@ 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,8 +8,12 @@ object CobblemonBuildDetails {
const val VERSION = "{{ version }}"
const val SNAPSHOT = {{ isSnapshot }}
const val GIT_COMMIT = "{{ gitCommit | default("Not Specified") }}"
const val BRANCH = "{{ branch | default("Not Specified") }}"
// 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")
fun smallCommitHash(): String {
return this.GIT_COMMIT.substring(0, 7)
@@ -12,6 +12,7 @@ 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
@@ -28,12 +29,7 @@ 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.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.mixin.invoker.*
import com.cobblemon.mod.common.platform.PlatformRegistry
import com.cobblemon.mod.common.util.cobblemonResource
import net.minecraft.core.BlockPos
@@ -809,6 +805,93 @@ 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)))
@@ -876,6 +959,57 @@ 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,6 +12,7 @@ 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
@@ -168,12 +169,16 @@ interface CobblemonImplementation {
* TODO
*
* @param identifier
* @param reloader
* @param reloaderFactory
* @param type
* @param dependencies
*/
fun registerResourceReloader(identifier: ResourceLocation, reloader: PreparableReloadListener, type: PackType, dependencies: Collection<ResourceLocation>)
fun registerResourceReloader(
identifier: ResourceLocation,
type: PackType,
dependencies: Collection<ResourceLocation>,
reloaderFactory: (HolderLookup.Provider) -> PreparableReloadListener
)
/**
* TODO
*
@@ -1517,6 +1517,87 @@ 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))
@@ -0,0 +1,93 @@
/*
* 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.JsonDataRegistry
import com.cobblemon.mod.common.api.data.ServerJsonDataRegistry
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,6 +26,7 @@ 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
@@ -36,28 +37,31 @@ import net.minecraft.world.level.block.Block
import net.minecraft.world.level.levelgen.structure.Structure
import net.minecraft.world.level.material.Fluid
object PokemonInteractions : JsonDataRegistry<PokemonInteractionSet> {
object PokemonInteractions : ServerJsonDataRegistry<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>()
@@ -65,7 +69,7 @@ object PokemonInteractions : JsonDataRegistry<PokemonInteractionSet> {
PokemonInteractionsSyncPacket(interactions).sendToPlayer(player)
}
override fun reload(data: Map<ResourceLocation, PokemonInteractionSet>) {
override fun reload(data: Map<ResourceLocation, PokemonInteractionSet>, registry: HolderLookup.Provider) {
interactions.clear()
val split = data.entries
.partition {
@@ -87,4 +91,4 @@ object PokemonInteractions : JsonDataRegistry<PokemonInteractionSet> {
.flatMap { it.interactions }
.firstOrNull(interactionCheck)
}
}
}
@@ -16,6 +16,7 @@ import com.cobblemon.mod.common.api.molang.ObjectValue
import com.cobblemon.mod.common.api.pokedex.AbstractPokedexManager
import com.cobblemon.mod.common.api.pokedex.CaughtCount
import com.cobblemon.mod.common.api.pokedex.CaughtPercent
import com.cobblemon.mod.common.api.pokedex.Dexes
import com.cobblemon.mod.common.api.pokedex.PokedexEntryProgress
import com.cobblemon.mod.common.api.pokedex.PokedexManager
import com.cobblemon.mod.common.api.pokedex.SeenCount
@@ -74,6 +75,27 @@ object PokedexMoLangFunctions : AbstractMoLangFunctionHolder<AbstractPokedexMana
functions["caught_percent"] = { DoubleValue(pokedex.getGlobalCalculatedValue(CaughtPercent)) }
functions["seen_percent"] = { DoubleValue(pokedex.getGlobalCalculatedValue(SeenPercent)) }
functions["dex_caught_count"] = { params ->
val dexId = params.getString(0).asIdentifierDefaultingNamespace()
if (Dexes.dexEntryMap.containsKey(dexId)) DoubleValue(pokedex.getDexCalculatedValue(dexId, CaughtCount))
else DoubleValue.ZERO
}
functions["dex_seen_count"] = { params ->
val dexId = params.getString(0).asIdentifierDefaultingNamespace()
if (Dexes.dexEntryMap.containsKey(dexId)) DoubleValue(pokedex.getDexCalculatedValue(dexId, SeenCount))
else DoubleValue.ZERO
}
functions["dex_caught_percent"] = { params ->
val dexId = params.getString(0).asIdentifierDefaultingNamespace()
if (Dexes.dexEntryMap.containsKey(dexId)) DoubleValue(pokedex.getDexCalculatedValue(dexId, CaughtPercent).toDouble())
else DoubleValue.ZERO
}
functions["dex_seen_percent"] = { params ->
val dexId = params.getString(0).asIdentifierDefaultingNamespace()
if (Dexes.dexEntryMap.containsKey(dexId)) DoubleValue(pokedex.getDexCalculatedValue(dexId, SeenPercent).toDouble())
else DoubleValue.ZERO
}
when (pokedex) {
is PokedexManager -> {
functions["player_id"] = { StringValue(pokedex.uuid.toString()) }
@@ -8,8 +8,10 @@
package com.cobblemon.mod.common.api.orientation
import com.cobblemon.mod.common.util.math.QuatSpring
import com.cobblemon.mod.common.util.math.geometry.toDegrees
import com.cobblemon.mod.common.util.math.geometry.toRadians
import com.cobblemon.mod.common.util.math.simpleSpringDamperQuat
import net.minecraft.client.Minecraft
import net.minecraft.util.Mth
import net.minecraft.world.entity.LivingEntity
@@ -26,6 +28,8 @@ open class OrientationController(val entity: LivingEntity) {
val FORWARDS: Vector3f = Vector3f(0.0f, 0.0f, -1.0f)
val UP: Vector3f = Vector3f(0.0f, 1.0f, 0.0f)
val LEFT: Vector3f = Vector3f(-1.0f, 0.0f, 0.0f)
private const val TICK_DT = 1f / 20f // Minecraft server tick rate
private const val RENDER_SMOOTH_HALFLIFE = 0.1f // seconds to close ~half the gap
}
open var active: Boolean = false
@@ -33,6 +37,8 @@ open class OrientationController(val entity: LivingEntity) {
var orientation: Matrix3f? = null
private set
private val renderSpring = QuatSpring()
private var renderOrientationO: Matrix3f? = null
private var renderOrientation: Matrix3f? = null
@@ -54,6 +60,8 @@ open class OrientationController(val entity: LivingEntity) {
orientation = null
renderOrientationO = null
renderOrientation = null
renderSpring.quat.identity()
renderSpring.angVel.set(0f, 0f, 0f)
active = false
}
@@ -77,18 +85,26 @@ open class OrientationController(val entity: LivingEntity) {
return oldQuat
}
/** Every tick move the current render orientation towards the last known true orientation **/
fun tick() {
if (!active || orientation == null) return
renderOrientationO = renderOrientation
val current = orientation
val renderMatrix = this.renderOrientation ?: current
val renderQuat = Quaternionf().setFromUnnormalized(renderMatrix)
val targetQuat = Quaternionf().setFromUnnormalized(current)
val dampingFactor = 0.66f // Smooth interpolation to reduce jitter of orientations recieved from the server.
renderQuat.slerp(targetQuat, dampingFactor)
val current = orientation!!
val targetQuat = Quaternionf().setFromUnnormalized(current)
if (renderOrientation == null) {
// First tick: snap the spring to the target instead of easing in from identity
renderSpring.quat.set(targetQuat)
renderSpring.angVel.set(0f, 0f, 0f)
}
// Use a "quat spring" to smoothly move the render orientation towards the goal orientation.
// It takes into account the orientations angular velocities and should be much more resilient
// to sharp changes in goal orientation or late/missed packets.
simpleSpringDamperQuat(renderSpring, targetQuat, 0.15f, TICK_DT)
val newRenderOrientation = Matrix3f()
renderQuat.get(newRenderOrientation)
renderSpring.quat.get(newRenderOrientation)
renderOrientation = newRenderOrientation
}
@@ -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)
@@ -0,0 +1,62 @@
/*
* 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.riding.util
import net.minecraft.core.BlockPos
import net.minecraft.world.level.BlockGetter
import net.minecraft.world.phys.AABB
import kotlin.math.floor
/**
* Walks every block position inside [searchBox] and turns each solid block into one
* full-cube [FieldPrimitive].
*
* @author Jackson
* @since July 27th, 2026
*/
fun collectPrimitivesFromBlocks(
level: BlockGetter,
searchBox: AABB,
shape: PrimitiveShape,
includeFluids: Boolean = false
): List<FieldPrimitive> {
val primitives = mutableListOf<FieldPrimitive>()
val minX = floor(searchBox.minX).toInt()
val maxX = floor(searchBox.maxX).toInt()
val minY = floor(searchBox.minY).toInt()
val maxY = floor(searchBox.maxY).toInt()
val minZ = floor(searchBox.minZ).toInt()
val maxZ = floor(searchBox.maxZ).toInt()
val pos = BlockPos.MutableBlockPos()
for (x in minX..maxX) {
for (y in minY..maxY) {
for (z in minZ..maxZ) {
pos.set(x, y, z)
val state = level.getBlockState(pos)
val isSolid = !state.getCollisionShape(level, pos).isEmpty
val isFluid = includeFluids && !state.fluidState.isEmpty
if (!isSolid && !isFluid) continue
primitives.add(
FieldPrimitive(
shape = shape,
centerX = x + 0.5f, centerY = y + 0.5f, centerZ = z + 0.5f,
halfWidth = 0.5f, halfHeight = 0.5f, halfDepth = 0.5f
)
)
}
}
}
return primitives
}
@@ -0,0 +1,155 @@
/*
* 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.riding.util
import net.minecraft.world.phys.Vec3
import kotlin.math.abs
import kotlin.math.max
import kotlin.math.min
import kotlin.math.sqrt
/**
* Helpful Functions when working with signed distance fields/functions.
* https://iquilezles.org/articles/distfunctions/
*
* @author Jackson
* @since July 27th, 2026
*/
/** Which distance formula a primitive uses. */
enum class PrimitiveShape {
BOX,
ROUNDED_BOX,
ELLIPSOID
}
/** Tunable constants for the field. */
data class DistanceFieldTuning(
val smoothingRange: Float = 0.5f,
val roundingRadius: Float = 0.08f
)
/** A single shape in the field - a center position, half-extents, and which formula to use. */
data class FieldPrimitive(
val shape: PrimitiveShape,
val centerX: Float, val centerY: Float, val centerZ: Float,
val halfWidth: Float, val halfHeight: Float, val halfDepth: Float
)
/** Fast approximate 1/sqrt(x) - the Quake III trick, cheaper than a real sqrt + divide. */
fun fastInverseSqrt(value: Float): Float {
var x = value
val halfX = 0.5f * x
var bits = java.lang.Float.floatToIntBits(x)
bits = 0x5f3759df - (bits shr 1)
x = java.lang.Float.intBitsToFloat(bits)
x *= (1.5f - halfX * x * x)
return x
}
/** Exact distance from a point to an axis-aligned box. Inputs are relative to the box's own center. */
fun boxDistance(relX: Float, relY: Float, relZ: Float, halfWidth: Float, halfHeight: Float, halfDepth: Float): Float {
val qx = abs(relX) - halfWidth
val qy = abs(relY) - halfHeight
val qz = abs(relZ) - halfDepth
val ox = max(qx, 0f)
val oy = max(qy, 0f)
val oz = max(qz, 0f)
val outside = sqrt(ox * ox + oy * oy + oz * oz)
val inside = min(max(qx, max(qy, qz)), 0f)
return outside + inside
}
/** Same as boxDistance but with rounded corners/edges https://iquilezles.org/articles/distfunctions/ */
fun roundedBoxDistance(relX: Float, relY: Float, relZ: Float, halfWidth: Float, halfHeight: Float, halfDepth: Float, roundingRadius: Float): Float =
boxDistance(relX, relY, relZ, halfWidth - roundingRadius, halfHeight - roundingRadius, halfDepth - roundingRadius) - roundingRadius
/** Approximate (lower-bound) distance to an ellipsoid https://iquilezles.org/articles/ellipsoids/. */
fun ellipsoidDistance(relX: Float, relY: Float, relZ: Float, halfWidth: Float, halfHeight: Float, halfDepth: Float): Float {
val px = relX / halfWidth
val py = relY / halfHeight
val pz = relZ / halfDepth
val inverseMagnitude = fastInverseSqrt(px * px + py * py + pz * pz)
val trueDistance = sqrt(relX * relX + relY * relY + relZ * relZ)
return trueDistance * (1.0f - inverseMagnitude)
}
/** Distance from a point to one primitive, dispatched by its shape. */
fun distanceToPrimitive(primitive: FieldPrimitive, sampleX: Float, sampleY: Float, sampleZ: Float, tuning: DistanceFieldTuning): Float {
val relX = sampleX - primitive.centerX
val relY = sampleY - primitive.centerY
val relZ = sampleZ - primitive.centerZ
return when (primitive.shape) {
PrimitiveShape.BOX -> boxDistance(relX, relY, relZ, primitive.halfWidth, primitive.halfHeight, primitive.halfDepth)
PrimitiveShape.ROUNDED_BOX -> roundedBoxDistance(relX, relY, relZ, primitive.halfWidth, primitive.halfHeight, primitive.halfDepth, tuning.roundingRadius)
PrimitiveShape.ELLIPSOID -> ellipsoidDistance(relX, relY, relZ, primitive.halfWidth, primitive.halfHeight, primitive.halfDepth)
}
}
///** Normalized quadratic smooth-min https://iquilezles.org/articles/smin/ */
//fun smoothMinimum(a: Float, b: Float, smoothingRange: Float): Float {
// if (smoothingRange <= 0.001f) return min(a, b)
// val k = smoothingRange * 4.0f
// val h = (0.5f + 0.5f * (b - a) / k).coerceIn(0f, 1f)
// return b + (a - b) * h - k * h * (1f - h)
//}
//
///** Folds every primitive's distance together into one field value at a point. */
//fun sampleField(primitives: List<FieldPrimitive>, sampleX: Float, sampleY: Float, sampleZ: Float, tuning: DistanceFieldTuning): Float {
// var result = Float.POSITIVE_INFINITY
// for (primitive in primitives) {
// val distance = distanceToPrimitive(primitive, sampleX, sampleY, sampleZ, tuning)
// result = if (result == Float.POSITIVE_INFINITY) distance else smoothMinimum(result, distance, tuning.smoothingRange)
// }
// return result
//}
/** Normalized quadratic smooth-min https://iquilezles.org/articles/smin/ */
fun smoothMinimum(a: Float, b: Float, smoothingRange: Float): Float {
if (smoothingRange <= 0.001f) return min(a, b)
val k = smoothingRange * 4.0f
val h = (0.5f + 0.5f * (b - a) / k).coerceIn(0f, 1f)
return b + (a - b) * h - k * h * (1f - h)
}
/** Folds nearby primitive distances together into one field value at a point. */
fun sampleField(primitives: List<FieldPrimitive>, sampleX: Float, sampleY: Float, sampleZ: Float, tuning: DistanceFieldTuning): Float {
if (primitives.isEmpty()) return Float.POSITIVE_INFINITY
val distances = FloatArray(primitives.size) { distanceToPrimitive(primitives[it], sampleX, sampleY, sampleZ, tuning) }
val minDistance = distances.min()
if (tuning.smoothingRange <= 0.001f) return minDistance
// Anything more than a few blend-widths past the closest primitive is cut - its
// contribution would be negligible in a correct blend anyway, but left in, it still
// drags the chained result down the more of them there are.
val cutoff = tuning.smoothingRange * 3f
var result = Float.POSITIVE_INFINITY
for (distance in distances) {
if (distance - minDistance > cutoff) continue
result = if (result == Float.POSITIVE_INFINITY) distance else smoothMinimum(result, distance, tuning.smoothingRange)
}
return result
}
/** Finite-difference gradient of the field at a point - points away from the surface, magnitude ~1 for a clean field. */
fun estimateGradient(primitives: List<FieldPrimitive>, point: Vec3, tuning: DistanceFieldTuning, epsilon: Float = 0.05f): Vec3 {
val px = point.x.toFloat()
val py = point.y.toFloat()
val pz = point.z.toFloat()
val dx = sampleField(primitives, px + epsilon, py, pz, tuning) - sampleField(primitives, px - epsilon, py, pz, tuning)
val dy = sampleField(primitives, px, py + epsilon, pz, tuning) - sampleField(primitives, px, py - epsilon, pz, tuning)
val dz = sampleField(primitives, px, py, pz + epsilon, tuning) - sampleField(primitives, px, py, pz - epsilon, tuning)
val gradient = Vec3(dx.toDouble(), dy.toDouble(), dz.toDouble())
return if (gradient.lengthSqr() > 1e-8) gradient.normalize() else Vec3(0.0, 1.0, 0.0)
}
@@ -0,0 +1,105 @@
/*
* 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.riding.util
import net.minecraft.core.particles.DustParticleOptions
import net.minecraft.server.level.ServerLevel
import net.minecraft.world.entity.Entity
import net.minecraft.world.phys.AABB
import net.minecraft.world.phys.Vec3
import org.joml.Vector3f
/** One shell to draw - a target field value, a color, a particle size. */
data class DistanceFieldLayer(
val isoValue: Float,
val color: Vector3f,
val particleSize: Float = 1.0f
)
/**
* Marches a grid of vertical columns through the field around [center] and spawns a
* particle everywhere it crosses one of [layers]' target values. Server-side only.
*/
fun visualizeDistanceField(
referenceEntity: Entity,
center: Vec3,
layers: List<DistanceFieldLayer>,
shape: PrimitiveShape = PrimitiveShape.BOX,
horizontalRadius: Double = 4.0,
verticalRange: Double = 4.0,
sampleSpacing: Double = 0.5,
marchStep: Double = 0.1,
tuning: DistanceFieldTuning = DistanceFieldTuning()
) {
val level = referenceEntity.level()
if (level !is ServerLevel) return
val searchBox = AABB(
center.x - horizontalRadius, center.y - verticalRange, center.z - horizontalRadius,
center.x + horizontalRadius, center.y, center.z + horizontalRadius
)
val primitives = collectPrimitivesFromBlocks(level, searchBox, shape, includeFluids = true)
if (primitives.isEmpty()) return
var x = -horizontalRadius
while (x <= horizontalRadius) {
var z = -horizontalRadius
while (z <= horizontalRadius) {
marchColumn(level, primitives, center, x, z, verticalRange, marchStep, layers, tuning)
z += sampleSpacing
}
x += sampleSpacing
}
}
private fun marchColumn(
level: ServerLevel,
primitives: List<FieldPrimitive>,
center: Vec3,
offsetX: Double,
offsetZ: Double,
verticalRange: Double,
marchStep: Double,
layers: List<DistanceFieldLayer>,
tuning: DistanceFieldTuning
) {
val previousValue = FloatArray(layers.size) { Float.NaN }
var y = verticalRange
while (y >= -verticalRange) {
val worldX = (center.x + offsetX).toFloat()
val worldY = (center.y + y).toFloat()
val worldZ = (center.z + offsetZ).toFloat()
val fieldValue = sampleField(primitives, worldX, worldY, worldZ, tuning)
for (layerIndex in layers.indices) {
val layer = layers[layerIndex]
val previous = previousValue[layerIndex]
if (!previous.isNaN() && crossedTarget(previous, fieldValue, layer.isoValue)) {
val t = (layer.isoValue - previous) / (fieldValue - previous)
val crossingY = (y + marchStep) - marchStep * t
spawnLayerParticle(level, center.add(offsetX, crossingY, offsetZ), layer)
}
previousValue[layerIndex] = fieldValue
}
y -= marchStep
}
}
private fun crossedTarget(previous: Float, current: Float, target: Float): Boolean =
(previous - target) * (current - target) < 0f
private fun spawnLayerParticle(level: ServerLevel, pos: Vec3, layer: DistanceFieldLayer) {
val particle = DustParticleOptions(layer.color, layer.particleSize)
level.sendParticles(particle, pos.x, pos.y, pos.z, 1, 0.0, 0.0, 0.0, 0.0)
}
@@ -0,0 +1,87 @@
/*
* 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)
}
}
@@ -0,0 +1,153 @@
/*
* 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)
}
}
@@ -0,0 +1,92 @@
/*
* 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)
}
}
@@ -0,0 +1,88 @@
/*
* 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)
}
}
@@ -0,0 +1,78 @@
/*
* 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)
}
}
@@ -0,0 +1,31 @@
/*
* 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
}
}
@@ -0,0 +1,34 @@
/*
* 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
}
}
@@ -0,0 +1,31 @@
/*
* 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
}
}
@@ -0,0 +1,31 @@
/*
* 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
}
}
@@ -0,0 +1,31 @@
/*
* 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,6 +128,7 @@ 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,6 +31,7 @@ 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
@@ -235,6 +236,7 @@ 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,7 +414,16 @@ object CobblemonClient {
CobblemonBlocks.NEVER_MELT_ICE,
CobblemonBlocks.WIDE_LENS,
CobblemonBlocks.ZOOM_LENS,
CobblemonBlocks.SCOPE_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
)
this.createBoatModelLayers()
@@ -71,7 +71,7 @@ open class VariableObjectSelectionList(x: Int, y: Int, width: Int, height: Int):
var stackHeight = -scrollAmount.toInt()
guiGraphics.enableScissor(x, y, x + width, y + height)
children.forEachIndexed { index, entry ->
if (stackHeight in 1..<height || stackHeight + entry.height in 1..<height) {
if (stackHeight < height && stackHeight + entry.height > 0) {
entry.render(guiGraphics, index, x, y + stackHeight, mouseX, mouseY, partialTick)
}
stackHeight += entry.height
@@ -8,12 +8,10 @@
package com.cobblemon.mod.common.client.gui.startselection.widgets
import com.cobblemon.mod.common.Cobblemon
import com.cobblemon.mod.common.CobblemonSounds
import com.cobblemon.mod.common.api.gui.blitk
import com.cobblemon.mod.common.api.text.bold
import com.cobblemon.mod.common.client.gui.CobblemonRenderable
import com.cobblemon.mod.common.client.gui.PokemonGUIAnimationStyle
import com.cobblemon.mod.common.client.gui.VariableObjectSelectionList
import com.cobblemon.mod.common.client.gui.drawProfilePokemon
import com.cobblemon.mod.common.client.gui.startselection.StarterSelectionScreen
@@ -29,12 +27,11 @@ import org.joml.Quaternionf
import org.joml.Vector3f
class CategoryList(
private val paneWidth: Int,
private val paneHeight: Int,
paneWidth: Int,
paneHeight: Int,
private val categories: List<RenderableStarterCategory>,
val listX: Int,
val listY: Int,
private val minecraft: Minecraft = Minecraft.getInstance(),
private val starterSelectionScreen: StarterSelectionScreen
) : VariableObjectSelectionList(
listX,
@@ -70,7 +67,8 @@ class CategoryList(
}
private fun createEntries() = categories.map { category ->
val rows = (category.pokemon.size - 1) / 3 + 1
val pokemonCount = category.pokemon.size - if (category.randomStarter) 0 else 1
val rows = pokemonCount / 3 + 1
val height = CONTAINER_BUTTON_SIZE * rows + BUTTON_SEPERATION * (rows + 1) + HEADER_HEIGHT + 3
Category(category, height)
}
@@ -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,35 +98,19 @@ class DiscShelfBlockEntityRenderer(ctx: BlockEntityRendererProvider.Context) :
poseStack.translate(posX, posY, -0.001f)
if (item.item == CobblemonItems.TECHNICAL_MACHINE) {
val baseColor = TechnicalMachineItemColorProvider.getColor(item, 0)
val overlayColor = TechnicalMachineItemColorProvider.getColor(item, 1)
val elementId = item.components.get(CobblemonItemComponents.TM_MOVE)!!.move.elementalType.showdownId
val texture = cobblemonResource("textures/block/disc_shelf/${elementId}_tm.png")
renderSlotQuad(
poseStack,
buffer,
tmBaseTexture,
baseColor,
texture,
0xFFFFFF,
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(
@@ -176,13 +160,15 @@ class DiscShelfBlockEntityRenderer(ctx: BlockEntityRendererProvider.Context) :
val g = (gBase * slotBrightnessMultiplier).coerceIn(0f, 1f)
val b = (bBase * slotBrightnessMultiplier).coerceIn(0f, 1f)
consumer.addVertex(matrix, 0f, 0f, 0f).setColor(r, g, b, a).setUv(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)
.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(0f, 0f)
consumer.addVertex(matrix, 0f, height, 0f).setColor(r, g, b, a).setUv(slotUMax, 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(1f, 0f)
consumer.addVertex(matrix, width, 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, 0f, 0f).setColor(r, g, b, a).setUv(1f, 1f)
consumer.addVertex(matrix, width, 0f, 0f).setColor(r, g, b, a).setUv(0f, slotVMax)
.setUv1(0, 0).setUv2(light and 0xFFFF, light shr 16).setNormal(0f, 0f, -1f)
}
@@ -1,27 +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.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,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.gen5
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 DeerlingModel(root: ModelPart) : PokemonPosableModel(root), HeadedFrame, QuadrupedFrame {
override val rootPart = root.registerChildWithAllChildren("deerling")
override val head = getPart("head")
override var portraitScale = 3.5F
override var portraitTranslation = Vec3(-0.55, -1.1, 0.0)
override var profileScale = 1.0F
override var profileTranslation = Vec3(0.0, 0.25, 0.0)
override val foreLeftLeg= getPart("leg_front_left")
override val foreRightLeg = getPart("leg_front_right")
override val hindLeftLeg = getPart("leg_back_left")
override val hindRightLeg = getPart("leg_back_right")
lateinit var standing: Pose
lateinit var walk: Pose
override fun registerPoses() {
standing = registerPose(
poseName = "standing",
poseTypes = PoseType.STATIONARY_POSES + PoseType.UI_POSES,
animations = arrayOf(
singleBoneLook(),
// bedrock("deerling", "ground_idle")
)
)
walk = registerPose(
poseName = "walk",
poseTypes = PoseType.MOVING_POSES,
animations = arrayOf(
singleBoneLook(),
QuadrupedWalkAnimation(this, periodMultiplier = 0.8F, amplitudeMultiplier = 0.8F)
// bedrock("deerling", "ground_walk")
)
)
}
// override fun getFaintAnimation(
// pokemonEntity: PokemonEntity,
// state: PosableState<PokemonEntity>
// ) = if (state.isPosedIn(standing, walk)) bedrockStateful("deerling", "faint") else null
}
@@ -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.gen5
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 SawsbuckModel(root: ModelPart) : PokemonPosableModel(root), HeadedFrame, QuadrupedFrame {
override val rootPart = root.registerChildWithAllChildren("sawsbuck")
override val head = getPart("head")
override var portraitScale = 2.0F
override var portraitTranslation = Vec3(-0.5, 1.1, 0.0)
override var profileScale = 0.65F
override var profileTranslation = Vec3(0.0, 0.75, 0.0)
override val foreLeftLeg= getPart("leg_front_left")
override val foreRightLeg = getPart("leg_front_right")
override val hindLeftLeg = getPart("leg_back_left")
override val hindRightLeg = getPart("leg_back_right")
lateinit var standing: Pose
lateinit var walk: Pose
override fun registerPoses() {
standing = registerPose(
poseName = "standing",
poseTypes = PoseType.STATIONARY_POSES + PoseType.UI_POSES,
animations = arrayOf(
singleBoneLook(),
// bedrock("sawsbuck", "ground_idle")
)
)
walk = registerPose(
poseName = "walk",
poseTypes = PoseType.MOVING_POSES,
animations = arrayOf(
singleBoneLook(),
QuadrupedWalkAnimation(this, periodMultiplier = 0.9F, amplitudeMultiplier = 0.9F)
// bedrock("sawsbuck", "ground_walk")
)
)
}
// override fun getFaintAnimation(
// pokemonEntity: PokemonEntity,
// state: PosableState<PokemonEntity>
// ) = if (state.isPosedIn(standing, walk)) bedrockStateful("sawsbuck", "faint") else null
}
@@ -1,90 +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.gen9
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.pokemon.CryProvider
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 net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class GlimmetModel (root: ModelPart) : PokemonPosableModel(root) {
override val rootPart = root.registerChildWithAllChildren("glimmet")
override var portraitScale = 2.0F
override var portraitTranslation = Vec3(-0.5, 1.3, 0.0)
override var profileScale = 0.7F
override var profileTranslation = Vec3(0.0, 0.8, 0.0)
lateinit var standing: Pose
lateinit var walk: Pose
lateinit var sleep: Pose
lateinit var shoulderLeft: Pose
lateinit var shoulderRight: Pose
val shoulderOffset = 8
override val cryAnimation = CryProvider { bedrockStateful("glimmet", "cry") }
override fun registerPoses() {
val blink = quirk { bedrockStateful("glimmet", "blink") }
sleep = registerPose(
poseType = PoseType.SLEEP,
animations = arrayOf(bedrock("glimmet", "sleep"))
)
standing = registerPose(
poseName = "standing",
poseTypes = PoseType.STATIONARY_POSES + PoseType.UI_POSES,
transformTicks = 10,
quirks = arrayOf(blink),
animations = arrayOf(
bedrock("glimmet", "ground_idle")
)
)
walk = registerPose(
poseName = "walk",
poseTypes = PoseType.MOVING_POSES,
transformTicks = 10,
quirks = arrayOf(blink),
animations = arrayOf(
bedrock("glimmet", "ground_walk")
)
)
shoulderLeft = registerPose(
poseType = PoseType.SHOULDER_LEFT,
quirks = arrayOf(blink),
animations = arrayOf(
bedrock("glimmet", "ground_idle")
),
transformedParts = arrayOf(
rootPart.createTransformation().addPosition(ModelPartTransformation.X_AXIS, shoulderOffset)
)
)
shoulderRight = registerPose(
poseType = PoseType.SHOULDER_RIGHT,
quirks = arrayOf(blink),
animations = arrayOf(
bedrock("glimmet", "ground_idle")
),
transformedParts = arrayOf(
rootPart.createTransformation().addPosition(ModelPartTransformation.X_AXIS, -shoulderOffset)
)
)
}
override fun getFaintAnimation(state: PosableState) = if (state.isPosedIn(standing, walk)) bedrockStateful("glimmet", "faint") else null
}
@@ -1,79 +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.gen9
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.util.isBattling
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class GlimmoraModel (root: ModelPart) : PokemonPosableModel(root) {
override val rootPart = root.registerChildWithAllChildren("glimmora")
override var portraitScale = 2.0F
override var portraitTranslation = Vec3(-0.6, -0.1, 0.0)
override var profileScale = 0.7F
override var profileTranslation = Vec3(0.0, 0.8, 0.0)
lateinit var standing: Pose
lateinit var walk: Pose
lateinit var sleep: Pose
lateinit var battleidle: Pose
override val cryAnimation = CryProvider { bedrockStateful("glimmora", "cry") }
override fun registerPoses() {
val blink = quirk { bedrockStateful("glimmora", "blink") }
sleep = registerPose(
poseType = PoseType.SLEEP,
animations = arrayOf(bedrock("glimmora", "sleep"))
)
standing = registerPose(
poseName = "standing",
poseTypes = PoseType.STATIONARY_POSES + PoseType.UI_POSES,
transformTicks = 10,
condition = { !it.isBattling },
quirks = arrayOf(blink),
animations = arrayOf(
bedrock("glimmora", "ground_idle")
)
)
walk = registerPose(
poseName = "walk",
poseTypes = PoseType.MOVING_POSES,
transformTicks = 10,
quirks = arrayOf(blink),
animations = arrayOf(
bedrock("glimmora", "ground_walk")
)
)
battleidle = registerPose(
poseName = "battle_idle",
poseTypes = PoseType.STATIONARY_POSES,
transformTicks = 10,
quirks = arrayOf(blink),
condition = { it.isBattling },
animations = arrayOf(
bedrock("glimmora", "battle_idle")
)
)
}
override fun getFaintAnimation(state: PosableState) = if (state.isPosedIn(standing, walk, sleep)) bedrockStateful("glimmora", "faint") else
if (state.isPosedIn(battleidle)) bedrockStateful("glimmora", "faint2")
else null
}
@@ -304,8 +304,6 @@ object VaryingModelRepository {
inbuilt("sizzlipede", ::SizzlipedeModel)
inbuilt("kleavor", ::KleavorModel)
inbuilt("pyukumuku", ::PyukumukuModel)
inbuilt("deerling", ::DeerlingModel)
inbuilt("sawsbuck", ::SawsbuckModel)
inbuilt("natu", ::NatuModel)
inbuilt("xatu", ::XatuModel)
inbuilt("milcery", :: MilceryModel)
@@ -399,8 +397,6 @@ object VaryingModelRepository {
inbuilt("sirfetchd", ::SirfetchdModel)
inbuilt("duskull", ::DuskullModel)
inbuilt("dusclops", ::DusclopsModel)
inbuilt("glimmet", ::GlimmetModel)
inbuilt("glimmora", ::GlimmoraModel)
inbuilt("bonsly", ::BonslyModel)
inbuilt("sudowoodo", ::SudowoodoModel)
inbuilt("cetoddle", ::CetoddleModel)
@@ -9,7 +9,6 @@
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
@@ -45,7 +44,7 @@ object TestPartySlotCommand {
val player = context.player(PLAYER)
val slot = IntegerArgumentType.getInteger(context, SLOT)
val properties = PokemonPropertiesArgumentType.getPokemonProperties(context, PROPERTIES)
return if (player.party().get(slot - 1)?.createPokemonProperties(PokemonPropertyExtractor.ALL)
?.let { properties.isSubSetOf(it) } == true) Command.SINGLE_SUCCESS else NO_SUCCESS
val target = player.party().get(slot - 1) ?: return NO_SUCCESS
return if (properties.matches(target)) Command.SINGLE_SUCCESS else NO_SUCCESS
}
}
@@ -15,6 +15,7 @@ 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
@@ -51,12 +52,15 @@ 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
import net.minecraft.server.packs.PackType
import net.minecraft.server.packs.resources.PreparableReloadListener
import net.minecraft.server.packs.resources.ResourceManager
import net.minecraft.server.packs.resources.ResourceManagerReloadListener
import org.jetbrains.annotations.ApiStatus
object CobblemonDataProvider : DataProvider {
@@ -67,6 +71,10 @@ object CobblemonDataProvider : DataProvider {
private val scheduledActions = mutableMapOf<UUID, MutableList<() -> Unit>>()
// 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()
fun registerDefaults() {
this.register(CobblemonScripts, reloadable = true)
this.register(SpeciesFeatures, reloadable = false)
@@ -119,9 +127,9 @@ object CobblemonDataProvider : DataProvider {
}
ifClient {
Cobblemon.implementation.registerResourceReloader(cobblemonResource("client_resources"), SimpleResourceReloader(PackType.CLIENT_RESOURCES), PackType.CLIENT_RESOURCES, emptyList())
Cobblemon.implementation.registerResourceReloader(cobblemonResource("client_resources"), PackType.CLIENT_RESOURCES, emptyList()) { clientResourceReloader }
}
Cobblemon.implementation.registerResourceReloader(cobblemonResource("data_resources"), SimpleResourceReloader(PackType.SERVER_DATA), PackType.SERVER_DATA, emptyList())
Cobblemon.implementation.registerResourceReloader(cobblemonResource("data_resources"), PackType.SERVER_DATA, emptyList()) { ServerResourceReloader(it) }
}
override fun <T : DataRegistry> register(registry: T, reloadable: Boolean): T {
@@ -160,12 +168,25 @@ object CobblemonDataProvider : DataProvider {
}
}
private class SimpleResourceReloader(private val type: PackType) : ResourceManagerReloadListener {
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 {
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 == this.type && (reloadAllowed || it in reloadableRegistries) }
.forEach { it.reload(manager) }
registries
.filter { it.type == PackType.SERVER_DATA && (reloadAllowed || it in reloadableRegistries) }
.forEach {
if (it is ServerJsonDataRegistry<*>) {
it.reload(manager, registryAccess)
} else {
it.reload(manager)
}
}
}
}
}
@@ -487,6 +487,47 @@ 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) {
@@ -31,8 +31,6 @@ interface EVIncreaseItem: PokemonSelectingItem {
override fun canUseOnPokemon(stack: ItemStack, pokemon: Pokemon) = pokemon.evs.getOrDefault(stat) < EVs.MAX_STAT_VALUE &&
super.canUseOnPokemon(stack, pokemon)
val sound: SoundEvent
override fun applyToPokemon(
player: ServerPlayer,
stack: ItemStack,
@@ -40,14 +38,12 @@ interface EVIncreaseItem: PokemonSelectingItem {
): InteractionResultHolder<ItemStack> {
val evsGained = pokemon.evs.add(stat, evIncreaseAmount, ItemEvSource(player, stack, pokemon))
return if (evsGained > 0) {
pokemon.entity?.playSound(sound, 1F, 1F)
stack.consume(1, player)
if (!player.hasInfiniteMaterials()) {
player.giveOrDropItemStack(ItemStack(Items.GLASS_BOTTLE))
}
onSuccessfulApply(player, stack, pokemon)
InteractionResultHolder.success(stack)
} else {
InteractionResultHolder.fail(stack)
}
}
fun onSuccessfulApply(player: ServerPlayer, stack: ItemStack, pokemon: Pokemon)
}
@@ -11,8 +11,8 @@ package com.cobblemon.mod.common.item.interactive
import com.cobblemon.mod.common.CobblemonSounds
import com.cobblemon.mod.common.api.pokemon.stats.Stat
import com.cobblemon.mod.common.item.CobblemonItem
import com.cobblemon.mod.common.pokemon.Pokemon
import net.minecraft.server.level.ServerPlayer
import net.minecraft.sounds.SoundEvent
import net.minecraft.world.InteractionHand
import net.minecraft.world.InteractionResultHolder
import net.minecraft.world.entity.player.Player
@@ -21,7 +21,6 @@ import net.minecraft.world.level.Level
class FeatherItem(override val stat: Stat): CobblemonItem(Properties()), EVIncreaseItem {
override val evIncreaseAmount: Int = 1
override val sound: SoundEvent = CobblemonSounds.MEDICINE_FEATHER_USE
override fun use(world: Level, user: Player, hand: InteractionHand): InteractionResultHolder<ItemStack> {
if (user is ServerPlayer) {
@@ -29,4 +28,9 @@ class FeatherItem(override val stat: Stat): CobblemonItem(Properties()), EVIncre
}
return InteractionResultHolder.success(user.getItemInHand(hand))
}
override fun onSuccessfulApply(player: ServerPlayer, stack: ItemStack, pokemon: Pokemon) {
pokemon.entity?.playSound(CobblemonSounds.MEDICINE_FEATHER_USE)
stack.consume(1, player)
}
}
@@ -13,7 +13,6 @@ import com.cobblemon.mod.common.api.pokemon.stats.Stat
import com.cobblemon.mod.common.item.CobblemonItem
import com.cobblemon.mod.common.pokemon.Pokemon
import net.minecraft.server.level.ServerPlayer
import net.minecraft.sounds.SoundEvent
import net.minecraft.world.InteractionHand
import net.minecraft.world.InteractionResultHolder
import net.minecraft.world.entity.player.Player
@@ -22,7 +21,6 @@ import net.minecraft.world.level.Level
class MochiItem(override val stat: Stat): CobblemonItem(Properties()), EVIncreaseItem {
override val evIncreaseAmount: Int = 4
override val sound: SoundEvent = CobblemonSounds.MOCHI_USE
override fun applyToPokemon(player: ServerPlayer, stack: ItemStack, pokemon: Pokemon): InteractionResultHolder<ItemStack> {
if (!canUseOnPokemon(stack, pokemon)) {
@@ -40,4 +38,9 @@ class MochiItem(override val stat: Stat): CobblemonItem(Properties()), EVIncreas
}
return InteractionResultHolder.success(user.getItemInHand(hand))
}
override fun onSuccessfulApply(player: ServerPlayer, stack: ItemStack, pokemon: Pokemon) {
pokemon.entity?.playSound(CobblemonSounds.MOCHI_USE)
stack.consume(1, player)
}
}
@@ -10,19 +10,20 @@ package com.cobblemon.mod.common.item.interactive
import com.cobblemon.mod.common.CobblemonSounds
import com.cobblemon.mod.common.api.pokemon.stats.Stat
import com.cobblemon.mod.common.pokemon.Pokemon
import com.cobblemon.mod.common.util.giveOrDropItemStack
import net.minecraft.server.level.ServerPlayer
import net.minecraft.sounds.SoundEvent
import net.minecraft.world.InteractionHand
import net.minecraft.world.InteractionResultHolder
import net.minecraft.world.entity.player.Player
import net.minecraft.world.item.ItemNameBlockItem
import net.minecraft.world.item.ItemStack
import net.minecraft.world.item.Items
import net.minecraft.world.level.Level
import net.minecraft.world.level.block.Block
class VitaminItem(override val stat: Stat, block: Block): ItemNameBlockItem(block, Properties()), EVIncreaseItem {
override val evIncreaseAmount: Int = 10
override val sound: SoundEvent = CobblemonSounds.MEDICINE_PILLS_USE
override fun use(world: Level, user: Player, hand: InteractionHand): InteractionResultHolder<ItemStack> {
if (user is ServerPlayer) {
@@ -30,4 +31,12 @@ class VitaminItem(override val stat: Stat, block: Block): ItemNameBlockItem(bloc
}
return InteractionResultHolder.success(user.getItemInHand(hand))
}
override fun onSuccessfulApply(player: ServerPlayer, stack: ItemStack, pokemon: Pokemon) {
pokemon.entity?.playSound(CobblemonSounds.MEDICINE_PILLS_USE)
stack.consume(1, player)
if (!player.hasInfiniteMaterials()) {
player.giveOrDropItemStack(Items.GLASS_BOTTLE.defaultInstance)
}
}
}
@@ -68,6 +68,7 @@ object CobblemonRequirementAdapter : RequirementAdapter {
this.registerType(AdvancementRequirement.ADAPTER_VARIANT, AdvancementRequirement::class)
this.registerType(OwnerHoldsItemRequirement.ADAPTER_VARIANT, OwnerHoldsItemRequirement::class)
this.registerType(ChanceRequirement.ADAPTER_VARIANT, ChanceRequirement::class)
this.registerType(NegateRequirement.ADAPTER_VARIANT, NegateRequirement::class)
}
val gson: Gson by lazy {
@@ -9,6 +9,7 @@
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
@@ -19,6 +20,7 @@ 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
@@ -26,13 +28,16 @@ import net.minecraft.tags.TagKey
import java.lang.reflect.Type
// This is an ugly adapter because breaking changes are scary and people would ;(
object LegacyItemConditionWrapperAdapter : JsonDeserializer<ItemPredicate>, JsonSerializer<ItemPredicate> {
class LegacyItemConditionWrapperAdapter(val registryAccess: HolderLookup.Provider = RegistryAccessResolver.getAccess())
: JsonDeserializer<ItemPredicate>, JsonSerializer<ItemPredicate> {
private const val TAG_PREFIX = "#"
private const val LEGACY_ITEM = "item"
private const val LEGACY_NBT = "nbt"
companion object {
private const val TAG_PREFIX = "#"
private const val LEGACY_ITEM = "item"
private const val LEGACY_NBT = "nbt"
}
private val codecAdapter = CodecBackedAdapter(ItemPredicate.CODEC)
private val codecAdapter = CodecBackedAdapter(ItemPredicate.CODEC, registryAccess)
override fun deserialize(json: JsonElement, typeOfT: Type, context: JsonDeserializationContext): ItemPredicate {
if (json.isJsonPrimitive) {
@@ -64,7 +69,9 @@ object LegacyItemConditionWrapperAdapter : JsonDeserializer<ItemPredicate>, Json
{ id ->
if (isTag) {
val tag = TagKey.create(Registries.ITEM, id)
builder.of(tag)
registryAccess.lookup(Registries.ITEM)
.map { builder.of(tag) }
.orElseGet { builder }
} else {
BuiltInRegistries.ITEM.getOptional(id)
.map { builder.of(it) }
@@ -75,4 +82,4 @@ object LegacyItemConditionWrapperAdapter : JsonDeserializer<ItemPredicate>, Json
)
}
}
}
@@ -0,0 +1,21 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.pokemon.requirements
import com.cobblemon.mod.common.api.pokemon.requirement.Requirement
import com.cobblemon.mod.common.pokemon.Pokemon
class NegateRequirement(val inner: Requirement) : Requirement {
override fun check(pokemon: Pokemon) = !inner.check(pokemon)
companion object {
const val ADAPTER_VARIANT = "negate"
}
}
@@ -10,16 +10,19 @@ 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>) : JsonDeserializer<T>, JsonSerializer<T> {
class CodecBackedAdapter<T>(val codec: Codec<T>, val registryAccess: HolderLookup.Provider = RegistryAccessResolver.getAccess()) : JsonDeserializer<T>, JsonSerializer<T> {
override fun deserialize(
jElement: JsonElement,
typeOfT: Type,
context: JsonDeserializationContext
): T {
val ops = RegistryOpsProvider.getOpsWithDefaultFallback()
val ops = RegistryOps.create(JsonOps.INSTANCE, registryAccess)
val result = ops.withDecoder(codec).apply(jElement)
return result.result().orElseThrow {
IllegalStateException("Failed to deserialize $jElement: ${result.error().orElse(null)}")
@@ -31,7 +34,7 @@ class CodecBackedAdapter<T>(val codec: Codec<T>) : JsonDeserializer<T>, JsonSeri
typeOfSrc: Type?,
context: JsonSerializationContext?
): JsonElement {
val ops = RegistryOpsProvider.getOpsWithDefaultFallback()
val ops = RegistryOps.create(JsonOps.INSTANCE, registryAccess)
val result = ops.withEncoder(codec).apply(src)
return result.result().orElseThrow {
IllegalStateException("Failed to serialize $src: ${result.error().orElse(null)}")
@@ -15,27 +15,33 @@ 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 obtaining RegistryOps with the correct client/server registry access.
* Used when manually encoding/decoding registry-backed values (e.g., items, predicates).
* 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).
*/
object RegistryOpsProvider {
fun getOpsWithDefaultFallback(): DynamicOps<JsonElement> {
object RegistryAccessResolver {
fun getAccess(): RegistryAccess {
try {
Cobblemon.implementation
} catch (e: UninitializedPropertyAccessException) {
return RegistryAccess.EMPTY
}
if (Cobblemon.implementation.environment() == Environment.CLIENT) {
val minecraft = Minecraft.getInstance()
if (minecraft != null && minecraft.level != null)
return RegistryOps.create(JsonOps.INSTANCE, minecraft.level!!.registryAccess())
return minecraft.level!!.registryAccess()
}
if (Cobblemon.implementation.environment() == Environment.SERVER) {
val server = server()
if (server != null)
return RegistryOps.create(JsonOps.INSTANCE, server.registryAccess())
return server.registryAccess()
}
return JsonOps.INSTANCE
return RegistryAccess.EMPTY
}
}
@@ -13,6 +13,7 @@ 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
@@ -21,20 +22,22 @@ 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.network.chat.Component
import net.minecraft.network.chat.ComponentSerialization
import net.minecraft.nbt.CompoundTag
import net.minecraft.nbt.StringTag
import net.minecraft.nbt.Tag
internal class PokemonP1(
val uuid: UUID,
val species: Species,
val form: FormData,
val nickname: Optional<Component>,
val features: List<CompoundTag>,
val level: Int,
val experience: Int,
val friendship: Int,
@@ -55,7 +58,22 @@ internal class PokemonP1(
other.ability = this.ability
other.species = this.species
other.form = this.form
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)
}
other.level = this.level
other.experience = this.experience
other.setFriendship(this.friendship)
@@ -91,7 +109,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() },
ComponentSerialization.CODEC.optionalFieldOf(DataKeys.POKEMON_NICKNAME).forGetter(PokemonP1::nickname),
Codec.list(CompoundTag.CODEC).optionalFieldOf(FEATURES, emptyList()).forGetter(PokemonP1::features),
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),
@@ -104,9 +122,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, nickname, level, experience, friendship, currentHealth, gender, ivs, evs, moveSet, benchedMoves, scaleModifier, shiny, ability ->
).apply(instance) { uuid, species, formId, features, 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, nickname, level, experience, friendship, currentHealth, gender, ivs, evs, moveSet, benchedMoves, scaleModifier, shiny, ability)
PokemonP1(uuid, species, form, features, level, experience, friendship, currentHealth, gender, ivs, evs, moveSet, benchedMoves, scaleModifier, shiny, ability)
}
}
@@ -114,7 +132,11 @@ internal class PokemonP1(
pokemon.uuid,
pokemon.species,
pokemon.form,
Optional.ofNullable(pokemon.nickname),
pokemon.features.map { feature ->
val nbt = CompoundTag()
nbt.putString(FEATURE_ID, feature.name)
feature.saveToNBT(nbt)
},
pokemon.level,
pokemon.experience,
pokemon.friendship,
@@ -14,15 +14,12 @@ 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.nbt.CompoundTag
import net.minecraft.nbt.StringTag
import net.minecraft.nbt.Tag
import net.minecraft.network.chat.Component
import net.minecraft.network.chat.ComponentSerialization
import net.minecraft.resources.ResourceLocation
import net.minecraft.world.item.ItemStack
import java.util.*
@@ -31,7 +28,7 @@ internal data class PokemonP3(
val originalTrainerType: OriginalTrainerType,
val originalTrainer: Optional<String>,
val forcedAspects: Set<String>,
val features: List<CompoundTag>,
val nickname: Optional<Component>,
val heldItemVisible: Optional<Boolean>,
val canDropHeldItem: Optional<Boolean>,
val cosmeticItem: ItemStack,
@@ -51,22 +48,7 @@ internal data class PokemonP3(
this.originalTrainer.ifPresent { other.originalTrainer = it }
other.refreshOriginalTrainer()
other.forcedAspects = this.forcedAspects
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() }
this.heldItemVisible.ifPresent { other.heldItemVisible = it }
this.canDropHeldItem.ifPresent { other.canDropHeldItem = it }
this.cosmeticItem.let { other.cosmeticItem = it }
@@ -92,7 +74,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() },
Codec.list(CompoundTag.CODEC).optionalFieldOf(FEATURES, emptyList()).forGetter(PokemonP3::features),
ComponentSerialization.CODEC.optionalFieldOf(DataKeys.POKEMON_NICKNAME).forGetter(PokemonP3::nickname),
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 }) },
@@ -109,7 +91,7 @@ internal data class PokemonP3(
originalTrainerType,
originalTrainer,
forcedAspects,
features,
nickname,
heldItemVisible,
canDropHeldItem,
cosmeticItem,
@@ -125,7 +107,7 @@ internal data class PokemonP3(
originalTrainerType,
originalTrainer,
forcedAspects.toSet(),
features,
nickname,
heldItemVisible,
canDropHeldItem,
cosmeticItem.orElse(ItemStack.EMPTY),
@@ -146,11 +128,7 @@ internal data class PokemonP3(
pokemon.originalTrainerType,
Optional.ofNullable(pokemon.originalTrainer),
pokemon.forcedAspects,
pokemon.features.map { feature ->
val nbt = CompoundTag()
nbt.putString(FEATURE_ID, feature.name)
feature.saveToNBT(nbt)
},
Optional.ofNullable(pokemon.nickname),
Optional.ofNullable(pokemon.heldItemVisible),
Optional.ofNullable(pokemon.canDropHeldItem),
pokemon.cosmeticItem,
@@ -53,4 +53,60 @@ fun Quaternionf.toEulerXYZDegrees(): Vector3f {
vector.z = vector.z.toDegrees()
return vector
}
/* // is not allocation free so just inline ".get(AxisAngle4f)" like in the function below this
fun Quaternionf.toScaledAngleAxis(angAxisScaled: Vector3f) {
val axisAng4 = AxisAngle4f()
this.get(axisAng4)
angAxisScaled.x = axisAng4.x
angAxisScaled.y = axisAng4.y
angAxisScaled.z = axisAng4.z
angAxisScaled.mul(axisAng4.angle)
} */
fun Quaternionf.toScaledAngleAxis(dest: Vector3f) {
var x = this.x
var y = this.y
var z = this.z
var w = this.w
if (w > 1.0f) {
val invNorm = 1.0f / kotlin.math.sqrt(x * x + y * y + z * z + w * w)
x *= invNorm
y *= invNorm
z *= invNorm
w *= invNorm
}
val angle = 2.0f * kotlin.math.acos(w)
val s = kotlin.math.sqrt(1.0f - w * w)
if (s < 0.001f) {
dest.x = x * angle
dest.y = y * angle
dest.z = z * angle
} else {
val invS = angle / s
dest.x = x * invS
dest.y = y * invS
dest.z = z * invS
}
}
fun Quaternionf.setFromScaledAngleAxis(angAxisScaled: Vector3f) {
val len = angAxisScaled.length()
if (len > 1e-5f) {
this.rotationAxis(
len,
angAxisScaled.x / len,
angAxisScaled.y / len,
angAxisScaled.z / len
)
} else {
this.identity()
}
}
@@ -0,0 +1,163 @@
/*
* 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.util.math
import net.minecraft.util.Mth
import kotlin.math.max
import kotlin.math.sqrt
import kotlin.math.abs
import org.joml.Quaternionf
import org.joml.Vector3f
/**
* Much of the code here is directly taken or inspired off this great article:
* https://theorangeduck.com/page/spring-roll-call#critical
*
* Very much worth the read.
*
* Util funcitons for using springs to smoothly/naturally approach one value towards a target
*/
/**
* Need to pass in and mutate both a value and a velocity to a spring
*/
class FloatSpring(
var value: Float = 0f,
var velocity: Float = 0f
)
class QuatSpring(
var quat: Quaternionf = Quaternionf(),
var angVel: Vector3f = Vector3f()
)
/**
* Provides a fast negative exponent approximation for e^-x
*/
fun negExp(x: Float): Float {
return 1.0f / (1.0f + x + 0.48f*x*x + 0.235f*x*x*x)
}
fun halflifeToDamping(halflife: Float, eps: Float = 1e-5f): Float {
return (4.0f * 0.69314718056f) / (halflife + eps)
}
fun simpleSpringDamper(
spring: FloatSpring,
goalValue: Float,
halflife: Float,
dt: Float,
isAngle: Boolean = false
) {
val y = halflifeToDamping(halflife) / 2.0f
val j0 = if (isAngle) Mth.wrapDegrees(spring.value - goalValue) else spring.value - goalValue
val j1 = spring.velocity + j0*y;
val eydt = negExp(y*dt);
spring.value = eydt*(j0 + j1*dt) + goalValue;
spring.velocity = eydt*(spring.velocity - j1*y*dt);
}
fun simpleSpringDamperQuat(
spring: QuatSpring,
goalQuat: Quaternionf,
halflife: Float,
dt: Float
) {
val y = halflifeToDamping(halflife) / 2.0f
// Quaternions have double cover q and -q represent the same rotation.
// so an accidentally rotation the long way could be calculated.
// account for that specifically
val goal = if (spring.quat.dot(goalQuat) < 0f) {
Quaternionf(-goalQuat.x, -goalQuat.y, -goalQuat.z, -goalQuat.w)
} else {
goalQuat
}
// Gather the rotation from the goal to the current
val goalToCurrQuat = Quaternionf(spring.quat).mul(Quaternionf(goal).conjugate())
val j0 = Vector3f()
goalToCurrQuat.toScaledAngleAxis(j0)
val j1: Vector3f = Vector3f(spring.angVel).add(Vector3f(j0).mul(y))
val eydt: Float = negExp(y * dt)
val scaledAxis = Vector3f(j0).add(Vector3f(j1).mul(dt)).mul(eydt)
spring.quat.setFromScaledAngleAxis(scaledAxis)
spring.quat.mul(goal)
spring.angVel.sub(j1.mul(y * dt))
spring.angVel.mul(eydt)
}
/**
* Below is essentially the same code as found here: https://github.com/orangeduck/Spring-It-On/blob/main/inertialeasing.c
* https://theorangeduck.com/page/inertial-easing <- the blogpost
*/
// Class to hold the "time" along the curve/function and scale of the function currently
// Held in this class so both can be mutated and returned in one function call
class InertialVals(
var t: Float = 0f,
var s: Float = 0f,
var offset: Float = 0f,
)
// Includes the negative portion
fun smoothstep(t: Float, s: Float): Float {
return s * (if(t > 1.0f) 1.0f else 3*t*t - 2*t*t*t)
}
// Derivative of the above smoothstep
fun smoothstepDt(t: Float, s: Float): Float {
return s * (if(t > 1.0f) 0.0f else 6*t - 6*t*t)
}
// Solve for smoothstep parameters `t` and `s` given new target `x` and velocity `v`
fun smoothstepSolve( //TODO change these names to make more sense
vals: InertialVals,
x: Float, // Target Value x
v: Float, // Goal velocity
overshoot: Float = 0.05f,
eps: Float = 1e-8f
) {
// If velocity is low enough then start from time zero
if (abs(v) < 1e-8f) {
vals.t = 0f
vals.s = x
return
}
// If x is negative then invert signs and re-Solve
if (x < 0f) {
smoothstepSolve(vals, -x, -v, overshoot, eps)
vals.s *= -1f
return
}
// Find the possible times that solve for the given `x` and `v`
// Quadratic formula!
val q: Float = sqrt(max((6*x - v)*(6*x - v) + 8*v*v, eps))
val t0: Float = (v - 6*x + q) / (4*v)
val t1: Float = (v - 6*x - q) / (4*v)
// Overshoot if the alternative time is between -0.5f and -(0.5f + overshoot)
vals.t = if(-0.5f > t1 && t1 > -(0.5f + overshoot)) t1 else t0;
// Find the un-scaled velocity at the fitted time
val vt: Float = smoothstepDt(vals.t, 1f);
// Find the scaling factor so that the velocity at the fitted time matches
vals.s = if(abs(vt) < eps) 0f else v / vt;
}
@@ -43,7 +43,7 @@ class TypeGemFeature : Feature<BlockStateConfiguration>(BlockStateConfiguration.
val coreState = TYPE_GEM_CORE.defaultBlockState()
// Place the gem first then make sure it placed before placing the core.
worldGenLevel.setBlock(origin, coreState, UPDATE_ALL)
worldGenLevel.setBlock(chosenPos, gemState, UPDATE_ALL)
if (!worldGenLevel.getBlockState(chosenPos).`is`(gemBlock)) {
return false
}
@@ -1,192 +1,286 @@
{
"format_version": "1.8.0",
"animations": {
"animation.absol.render": {
"loop": true,
"bones": {
"hips": {
"rotation": [-2.5, 0, 0]
},
"chest": {
"rotation": [12.5, 0, 0]
},
"tail": {
"rotation": [-8.01788, 32.61138, -0.66603]
},
"neck": {
"rotation": [15.34479, -13.10699, 9.18372]
},
"head": {
"rotation": [-25.32307, -13.66763, -4.61603]
},
"hair": {
"rotation": [0, 0, 45]
},
"hair2": {
"rotation": [1.95155, 7.24305, 27.62353]
},
"hair3": {
"rotation": [8.61775, 34.05444, 17.64371]
},
"neck_fur_right2": {
"rotation": [0, 0, -30]
},
"neck_fur_left2": {
"rotation": [0, 0, 40]
},
"neck_fur_back2": {
"rotation": [-45, 0, 0]
},
"chest_fur": {
"rotation": [-42.5, 0, 0]
},
"chest_fur_right": {
"rotation": [0, 35, 0]
},
"chest_fur_left": {
"rotation": [0, -25, 0]
},
"chest_fur_1": {
"rotation": [27.5, 0, 0]
},
"chest_fur_2": {
"rotation": [7.5, 0, 0]
},
"leg_back_left": {
"rotation": [21.9659, -13.44762, -0.11731]
},
"leg_back_left2": {
"rotation": [-10, 0, 0]
},
"leg_back_left3": {
"rotation": [5, 0, 0]
},
"foot__back_left": {
"rotation": [-14.82005, -12.39135, -1.6575]
},
"leg_front_left": {
"rotation": [-25.47479, -17.22575, 3.13388],
"position": [0, -0.25, 0]
},
"leg_front_left2": {
"rotation": [14.61364, 12.22219, 2.52829]
},
"foot_front_left": {
"rotation": [12.15846, -18.26883, -13.36473]
},
"eyes_open": {
"position": [0, 0, 0]
},
"eyes_happy": {
"position": [0, 0, 0]
},
"eyes_closed": {
"position": [0, 0, 0]
},
"eyes_halfclosed": {
"position": [0, 0, 0]
},
"leg_back_right": {
"rotation": [0, -22.5, 0],
"position": [-0.11888, 0, -1.67283]
},
"foot_back_right": {
"rotation": [0, 15, 0]
},
"waist": {
"rotation": [0, -20, 0]
},
"leg_front_right": {
"rotation": [12.5, 0, 0]
},
"leg_front_right2": {
"rotation": [0, 0, -10]
},
"foot_front_right": {
"rotation": [-12.07362, 14.63639, 13.31914]
}
}
},
"animation.absol.ground_idle": {
"loop": true,
"bones": {
"neck": {
"rotation": [20, 0, 0]
"rotation": [30, 0, 0]
},
"head": {
"rotation": [-17.5, 0, 0]
},
"hair": {
"rotation": [0, 0, 47]
"rotation": [0, 0, -2.5]
},
"hair2": {
"rotation": [0, 8.5, 38]
"rotation": [2.5, 10, 0]
},
"hair3": {
"rotation": [9.69368, 25.60466, 13.24197]
"rotation": [1.9544, 7.5589, 12.4168]
},
"neck_fur_right2": {
"rotation": [0, 0, -30]
"neck_fluff_left": {
"rotation": [0, 0, 67.5]
},
"neck_fur_left2": {
"rotation": [0, 0, 40]
},
"neck_fur_back2": {
"neck_fluff_back": {
"rotation": [-45, 0, 0]
},
"chest_fur": {
"rotation": [-30, 0, 0]
"chest_fluff": {
"rotation": [-12.5, 0, 0]
},
"chest_fur_right": {
"rotation": [0, 35, 0]
"chest_fluff_right": {
"rotation": [0, 37.5, 0]
},
"chest_fur_left": {
"rotation": [0, -25, 0]
"chest_fluff_left": {
"rotation": [0, -37.5, 0]
},
"chest_fur_1": {
"rotation": [27.5, 0, 0]
"chest_fluff2": {
"rotation": [-7.5, 0, 0]
},
"chest_fur_2": {
"chest_fluff3": {
"rotation": [7.5, 0, 0]
},
"tail": {
"rotation": [-22.5, 0, 0]
}
}
},
"animation.absol.cry": {
"animation_length": 2,
"bones": {
"mouth": {
"position": {
"0.0": [0, 0, 0.17],
"0.25": {"pre": [0, 0, 0.17], "post": [0, 0, -1]},
"1.7917": {"pre": [0, 0, -1], "post": [0, 0, 0.17]}
}
}
},
"sound_effects": {
"0.04": {
"effect": "pokemon.absol.cry"
"rotation": [10, 0, 0]
},
"neck_fluff_right": {
"rotation": [0, 0, -67.5]
},
"torso": {
"rotation": [2.5, 0, 0]
},
"torso2": {
"rotation": [-5, 0, 0]
},
"head_angle": {
"rotation": [-5, 0, 0]
},
"leg_front_left": {
"rotation": [-4.9083, 1.8509, 2.416]
},
"leg_back_left": {
"rotation": [0, -10, 0]
},
"leg_back_left2": {
"rotation": [5, 0, 0]
},
"leg_back_left3": {
"rotation": [10, 0, 0]
},
"foot_back_left": {
"rotation": [-13.9904, -4.9952, -0.2186]
},
"foot_front_left": {
"rotation": [4.991, -1.4949, -3.2033]
},
"neck_fluff_back2": {
"rotation": [-50, 0, 0]
},
"leg_front_right": {
"rotation": [2.585, -1.6431, -2.3501]
},
"leg_front_right2": {
"rotation": [2.5, 0, 0]
},
"foot_front_right": {
"rotation": [-4.9201, 6.845, 3.7466]
},
"leg_back_right": {
"rotation": [0, 10, 0]
},
"leg_back_right2": {
"rotation": [5, 0, 0]
},
"leg_back_right3": {
"rotation": [10, 0, 0]
},
"foot_back_right": {
"rotation": [-13.9904, 4.9952, 0.2186]
}
}
},
"animation.absol.blink": {
"animation_length": 0.1667,
"bones": {
"eyes_open": {
"eye_left": {
"position": {
"0.0": [0, 0, 1],
"0.125": {"pre": [0, 0, 1], "post": [0, 0, 1]},
"0.1667": {"pre": [0, 0, 1], "post": [0, 0, 0]}
"0.0": [-0.1, 0, 0.1],
"0.1667": {"pre": [-0.1, 0, 0.1], "post": [0, 0, 0]}
}
},
"eyes_closed": {
"eye_right": {
"position": {
"0.0": [0, 0, -1],
"0.125": {"pre": [0, 0, -1], "post": [0, 0, -1]},
"0.1667": {"pre": [0, 0, -1], "post": [0, 0, 0]}
"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.absol.ditto_face": {
"loop": true,
"bones": {
"face": {
"position": [0, 0, 0.1],
"scale": 0
},
"face_ditto": {
"position": [0, 0, -0.1]
}
}
},
"animation.absol.pose": {
"loop": true,
"bones": {
"neck": {
"rotation": [30.3812, -8.6492, -5.0384]
},
"head": {
"rotation": [-17.5, 0, 0]
},
"hair": {
"rotation": [0, 0, -2.5]
},
"hair2": {
"rotation": [2.5, 10, 0]
},
"hair3": {
"rotation": [1.9544, 7.5589, 12.4168]
},
"neck_fluff_left": {
"rotation": [0, 0, 67.5]
},
"neck_fluff_back": {
"rotation": [-45, 0, 0]
},
"chest_fluff": {
"rotation": [-17.5, 0, 0]
},
"chest_fluff_right": {
"rotation": [0, 37.5, 0]
},
"chest_fluff_left": {
"rotation": [0, -37.5, 0]
},
"chest_fluff2": {
"rotation": [-5, 0, 0]
},
"chest_fluff3": {
"rotation": [7.5, 0, 0]
},
"tail": {
"rotation": [-2.2793, -9.656, -2.6129]
},
"horn": {
"rotation": [0, -10, 0]
},
"neck_fluff_right": {
"rotation": [0, 0, -52.5]
},
"body": {
"rotation": [0, 65, 0],
"position": [2, -0.55, 0]
},
"torso": {
"rotation": [9.9864, 0.6469, -2.4149]
},
"torso2": {
"rotation": [-5, 0, 0]
},
"head_angle": {
"rotation": [-5.7686, -29.8743, 2.8806]
},
"leg_front_left": {
"rotation": [16.5711, -9.4592, -13.6836],
"position": [0.75, -2, 0]
},
"leg_front_left2": {
"rotation": [-45, 0, 0]
},
"leg_back_left": {
"rotation": [14.2119, -9.413, -10.1281]
},
"leg_back_left2": {
"rotation": [-2.5, 0, 0]
},
"leg_back_left3": {
"rotation": [17.5, 0, 0]
},
"foot_back_left": {
"rotation": [-27.3943, 4.3233, 8.0916]
},
"iris_left": {
"position": [1, 0, 0]
},
"foot_front_left": {
"rotation": [41.9868, -4.2611, 0.0665],
"position": [0, 0, -0.75]
},
"claw_middle_front_left": {
"rotation": [7.5, 0, 0]
},
"claw_outer_front_left": {
"rotation": [7.5, 0, 0]
},
"claw_inner_front_left": {
"rotation": [7.5, 0, 0]
},
"neck_fluff_back2": {
"rotation": [-50, 0, 0]
},
"leg_front_right": {
"rotation": [-37.5352, -0.064, 9.7291],
"position": [-0.25, -1.75, 0]
},
"leg_front_right2": {
"rotation": [3.5, 0, 0]
},
"foot_front_right": {
"rotation": [34.0275, 7.3656, -7.2548],
"position": [0, 0.3, 0]
},
"leg_back_right": {
"rotation": [-18.2881, 9.413, 10.1281],
"position": [-0.25, 0, 0]
},
"leg_back_right2": {
"rotation": [16.5248, 0.124, 0.1823]
},
"leg_back_right3": {
"rotation": [6, 0, 0]
},
"foot_back_right": {
"rotation": [-2.4124, 5.5284, -9.8095]
}
}
},
"animation.absol.cry": {
"sound_effects": {
"0.04": {
"effect": "pokemon.absol.cry"
}
}
}
@@ -0,0 +1,208 @@
{
"format_version": "1.8.0",
"animations": {
"animation.burmy_plant.ground_idle": {
"loop": true,
"bones": {
"body": {
"rotation": [2.5201, 0.3141, 0.0322],
"position": [0, 6, 0]
},
"body_rotation": {
"rotation": [2.5, 0, 0]
},
"spring2": {
"rotation": [-2.5, 0, 0]
},
"segment1": {
"position": [0, 0.5, 0]
},
"leg_left1": {
"rotation": [0, 15, 0]
},
"leg_right1": {
"rotation": [0, -15, 0]
},
"segment2": {
"position": [0, 0.5, 0]
},
"segment3": {
"position": [0, 0.5, 0]
},
"leg_left2": {
"rotation": [0, 17.5, 0]
},
"leg_left3": {
"rotation": [0, 25, 0]
},
"leg_right2": {
"rotation": [0, -17.5, 0]
},
"leg_right3": {
"rotation": [0, -25, 0]
}
}
},
"animation.burmy_plant.ground_idle_naked": {
"loop": true,
"bones": {
"body_rotation": {
"rotation": [7.5, 0, 0],
"position": [0, 0, -3]
},
"segment1": {
"rotation": [75, 0, 0]
},
"leg_left1": {
"rotation": [0.00002, 0.00005, 0.00002]
},
"cloak_plant": {
"scale": 0
},
"body": {
"rotation": [2.5, 0, 0],
"position": [0, -7.25, 0]
},
"leg_right1": {
"rotation": [0.00002, -0.00005, -0.00002]
},
"segment2": {
"rotation": [5, 0, 0]
},
"segment3": {
"rotation": [2.5781, -0.5734, 0.2485]
},
"leg_left2": {
"rotation": [2.53742, -4.92385, -0.87038]
},
"leg_left3": {
"rotation": [7.53742, -4.92385, -0.87038]
},
"leg_right2": {
"rotation": [2.53742, 4.92385, 0.87038]
},
"leg_right3": {
"rotation": [7.53742, 4.92385, 0.87038]
},
"face": {
"position": [0, 0, 1]
},
"cloaked_face": {
"scale": 0
},
"face_ditto": {
"position": [0, 0, 1]
}
}
},
"animation.burmy_plant.spring": {
"loop": true,
"bones": {
"body": {
"rotation": [2.5201, 0.3141, 0.0322],
"position": [0, 6, 0]
},
"body_rotation": {
"rotation": [2.5, 0, 0],
"position": [0, -3, 0]
},
"spring2": {
"rotation": [35.9366, -29.087, 32.6804]
},
"segment1": {
"position": [0, 0.5, 0]
},
"leg_left1": {
"rotation": [0, 15, 0]
},
"spring": {
"rotation": [-26.941, -5.7358, -11.1249]
},
"spring3": {
"rotation": [-24.3803, 6.6782, -46.9093]
},
"spring4": {
"rotation": [0, 0, -35]
},
"leg_right1": {
"rotation": [0, -15, 0]
},
"segment2": {
"position": [0, 0.5, 0]
},
"segment3": {
"position": [0, 0.5, 0]
},
"leg_left2": {
"rotation": [0, 17.5, 0]
},
"leg_left3": {
"rotation": [0, 25, 0]
},
"leg_right2": {
"rotation": [0, -17.5, 0]
},
"leg_right3": {
"rotation": [0, -25, 0]
}
}
},
"animation.burmy_plant.ditto_face": {
"loop": true,
"bones": {
"face": {
"position": [0, 0, 0.1],
"scale": 0
},
"face_ditto": {
"position": [0, 0, -0.1]
}
}
},
"animation.burmy_plant.blink": {
"animation_length": 0.1667,
"bones": {
"pupil_left": {
"position": {
"0.0": [0, 0, 0.1],
"0.125": {"pre": [0, 0, 0.1], "post": [0, 0, 0.1]},
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"pupil_closed_left": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": {"pre": [0, 0, -0.1], "post": [0, 0, -0.1]},
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"pupil_right": {
"position": {
"0.0": [0, 0, 0.1],
"0.125": {"pre": [0, 0, 0.1], "post": [0, 0, 0.1]},
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"pupil_closed_right": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": {"pre": [0, 0, -0.1], "post": [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]}
}
}
}
}
}
}
@@ -0,0 +1,208 @@
{
"format_version": "1.8.0",
"animations": {
"animation.burmy_sandy.ground_idle": {
"loop": true,
"bones": {
"body": {
"rotation": [2.5201, 0.3141, 0.0322],
"position": [0, 6, 0]
},
"body_rotation": {
"rotation": [2.5, 0, 0]
},
"spring2": {
"rotation": [-2.5, 0, 0]
},
"segment1": {
"position": [0, 0.5, 0]
},
"leg_left1": {
"rotation": [0, 15, 0]
},
"leg_right1": {
"rotation": [0, -15, 0]
},
"segment2": {
"position": [0, 0.5, 0]
},
"segment3": {
"position": [0, 0.5, 0]
},
"leg_left2": {
"rotation": [0, 17.5, 0]
},
"leg_left3": {
"rotation": [0, 25, 0]
},
"leg_right2": {
"rotation": [0, -17.5, 0]
},
"leg_right3": {
"rotation": [0, -25, 0]
}
}
},
"animation.burmy_sandy.ground_idle_naked": {
"loop": true,
"bones": {
"body_rotation": {
"rotation": [7.5, 0, 0],
"position": [0, 0, -3]
},
"segment1": {
"rotation": [75, 0, 0]
},
"leg_left1": {
"rotation": [0.00002, 0.00005, 0.00002]
},
"cloak_plant": {
"scale": 0
},
"body": {
"rotation": [2.5, 0, 0],
"position": [0, -7.25, 0]
},
"leg_right1": {
"rotation": [0.00002, -0.00005, -0.00002]
},
"segment2": {
"rotation": [5, 0, 0]
},
"segment3": {
"rotation": [2.5781, -0.5734, 0.2485]
},
"leg_left2": {
"rotation": [2.53742, -4.92385, -0.87038]
},
"leg_left3": {
"rotation": [7.53742, -4.92385, -0.87038]
},
"leg_right2": {
"rotation": [2.53742, 4.92385, 0.87038]
},
"leg_right3": {
"rotation": [7.53742, 4.92385, 0.87038]
},
"face": {
"position": [0, 0, 1]
},
"cloaked_face": {
"scale": 0
},
"face_ditto": {
"position": [0, 0, 1]
}
}
},
"animation.burmy_sandy.spring": {
"loop": true,
"bones": {
"body": {
"rotation": [2.5201, 0.3141, 0.0322],
"position": [0, 6, 0]
},
"body_rotation": {
"rotation": [2.5, 0, 0],
"position": [0, -3, 0]
},
"spring2": {
"rotation": [35.9366, -29.087, 32.6804]
},
"segment1": {
"position": [0, 0.5, 0]
},
"leg_left1": {
"rotation": [0, 15, 0]
},
"spring": {
"rotation": [-26.941, -5.7358, -11.1249]
},
"spring3": {
"rotation": [-24.3803, 6.6782, -46.9093]
},
"spring4": {
"rotation": [0, 0, -35]
},
"leg_right1": {
"rotation": [0, -15, 0]
},
"segment2": {
"position": [0, 0.5, 0]
},
"segment3": {
"position": [0, 0.5, 0]
},
"leg_left2": {
"rotation": [0, 17.5, 0]
},
"leg_left3": {
"rotation": [0, 25, 0]
},
"leg_right2": {
"rotation": [0, -17.5, 0]
},
"leg_right3": {
"rotation": [0, -25, 0]
}
}
},
"animation.burmy_sandy.ditto_face": {
"loop": true,
"bones": {
"face": {
"position": [0, 0, 0.1],
"scale": 0
},
"face_ditto": {
"position": [0, 0, -0.1]
}
}
},
"animation.burmy_sandy.blink": {
"animation_length": 0.1667,
"bones": {
"pupil_left": {
"position": {
"0.0": [0, 0, 0.1],
"0.125": [0, 0, 0.1],
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"pupil_closed_left": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": [0, 0, -0.1],
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"pupil_right": {
"position": {
"0.0": [0, 0, 0.1],
"0.125": [0, 0, 0.1],
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"pupil_closed_right": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": [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]}
}
}
}
}
}
}
@@ -0,0 +1,208 @@
{
"format_version": "1.8.0",
"animations": {
"animation.burmy_trash.ground_idle": {
"loop": true,
"bones": {
"body": {
"rotation": [2.5201, 0.3141, 0.0322],
"position": [0, 6, 0]
},
"body_rotation": {
"rotation": [2.5, 0, 0]
},
"spring2": {
"rotation": [-2.5, 0, 0]
},
"segment1": {
"position": [0, 0.5, 0]
},
"leg_left1": {
"rotation": [0, 15, 0]
},
"leg_right1": {
"rotation": [0, -15, 0]
},
"segment2": {
"position": [0, 0.5, 0]
},
"segment3": {
"position": [0, 0.5, 0]
},
"leg_left2": {
"rotation": [0, 17.5, 0]
},
"leg_left3": {
"rotation": [0, 25, 0]
},
"leg_right2": {
"rotation": [0, -17.5, 0]
},
"leg_right3": {
"rotation": [0, -25, 0]
}
}
},
"animation.burmy_trash.ground_idle_naked": {
"loop": true,
"bones": {
"body_rotation": {
"rotation": [7.5, 0, 0],
"position": [0, 0, -3]
},
"segment1": {
"rotation": [75, 0, 0]
},
"leg_left1": {
"rotation": [0.00002, 0.00005, 0.00002]
},
"cloak_plant": {
"scale": 0
},
"body": {
"rotation": [2.5, 0, 0],
"position": [0, -7.25, 0]
},
"leg_right1": {
"rotation": [0.00002, -0.00005, -0.00002]
},
"segment2": {
"rotation": [5, 0, 0]
},
"segment3": {
"rotation": [2.5781, -0.5734, 0.2485]
},
"leg_left2": {
"rotation": [2.53742, -4.92385, -0.87038]
},
"leg_left3": {
"rotation": [7.53742, -4.92385, -0.87038]
},
"leg_right2": {
"rotation": [2.53742, 4.92385, 0.87038]
},
"leg_right3": {
"rotation": [7.53742, 4.92385, 0.87038]
},
"face": {
"position": [0, 0, 1]
},
"cloaked_face": {
"scale": 0
},
"face_ditto": {
"position": [0, 0, 1]
}
}
},
"animation.burmy_trash.spring": {
"loop": true,
"bones": {
"body": {
"rotation": [2.5201, 0.3141, 0.0322],
"position": [0, 6, 0]
},
"body_rotation": {
"rotation": [2.5, 0, 0],
"position": [0, -3, 0]
},
"spring2": {
"rotation": [35.9366, -29.087, 32.6804]
},
"segment1": {
"position": [0, 0.5, 0]
},
"leg_left1": {
"rotation": [0, 15, 0]
},
"spring": {
"rotation": [-26.941, -5.7358, -11.1249]
},
"spring3": {
"rotation": [-24.3803, 6.6782, -46.9093]
},
"spring4": {
"rotation": [0, 0, -35]
},
"leg_right1": {
"rotation": [0, -15, 0]
},
"segment2": {
"position": [0, 0.5, 0]
},
"segment3": {
"position": [0, 0.5, 0]
},
"leg_left2": {
"rotation": [0, 17.5, 0]
},
"leg_left3": {
"rotation": [0, 25, 0]
},
"leg_right2": {
"rotation": [0, -17.5, 0]
},
"leg_right3": {
"rotation": [0, -25, 0]
}
}
},
"animation.burmy_trash.ditto_face": {
"loop": true,
"bones": {
"face": {
"position": [0, 0, 0.1],
"scale": 0
},
"face_ditto": {
"position": [0, 0, -0.1]
}
}
},
"animation.burmy_trash.blink": {
"animation_length": 0.1667,
"bones": {
"pupil_left": {
"position": {
"0.0": [0, 0, 0.1],
"0.125": [0, 0, 0.1],
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"pupil_closed_left": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": [0, 0, -0.1],
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"pupil_right": {
"position": {
"0.0": [0, 0, 0.1],
"0.125": [0, 0, 0.1],
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"pupil_closed_right": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": [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]}
}
}
}
}
}
}
@@ -0,0 +1,107 @@
{
"format_version": "1.8.0",
"animations": {
"animation.wormadam_plant.ground_idle": {
"loop": true,
"bones": {
"body": {
"rotation": [5, 0, 0],
"position": [0, 6, 0]
},
"body_rotation": {
"rotation": [0, 0, 0]
},
"antenna": {
"rotation": [-2.5, 0, 0]
},
"ear_left": {
"rotation": [0, -12.5, 0]
},
"ear_left2": {
"rotation": [0, 0, 20]
},
"ear_left3": {
"rotation": [0, 0, 22.5]
},
"ear_back_left": {
"rotation": [-7.5, 0, 25]
},
"ear_left4": {
"rotation": [0, 0, 17.5]
},
"ear_right": {
"rotation": [0, 12.5, 0]
},
"ear_right2": {
"rotation": [0, 0, -20]
},
"ear_right3": {
"rotation": [0, 0, -22.5]
},
"ear_right4": {
"rotation": [0, 0, -17.5]
},
"ear_back_right": {
"rotation": [-7.5, 0, -25]
}
}
},
"animation.wormadam_plant.blink": {
"animation_length": 0.1667,
"bones": {
"pupil_left": {
"position": {
"0.0": [0, 0, 0.1],
"0.125": [0, 0, 0.1],
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"pupil_closed_left": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": [0, 0, -0.1],
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"pupil_right": {
"position": {
"0.0": [0, 0, 0.1],
"0.125": [0, 0, 0.1],
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"pupil_closed_right": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": [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.wormadam_plant.ditto_face": {
"loop": true,
"bones": {
"face": {
"position": [0, 0, 0.1],
"scale": 0
},
"face_ditto": {
"position": [0, 0, -0.1]
}
}
}
}
}
@@ -0,0 +1,107 @@
{
"format_version": "1.8.0",
"animations": {
"animation.wormadam_sandy.ground_idle": {
"loop": true,
"bones": {
"body": {
"rotation": [5, 0, 0],
"position": [0, 6, 0]
},
"body_rotation": {
"rotation": [0, 0, 0]
},
"antenna": {
"rotation": [-2.5, 0, 0]
},
"ear_left": {
"rotation": [0, -12.5, 0]
},
"ear_left2": {
"rotation": [0, 0, 20]
},
"ear_left3": {
"rotation": [0, 0, 22.5]
},
"ear_back_left": {
"rotation": [-7.5, 0, 25]
},
"ear_left4": {
"rotation": [0, 0, 17.5]
},
"ear_right": {
"rotation": [0, 12.5, 0]
},
"ear_right2": {
"rotation": [0, 0, -20]
},
"ear_right3": {
"rotation": [0, 0, -22.5]
},
"ear_right4": {
"rotation": [0, 0, -17.5]
},
"ear_back_right": {
"rotation": [-7.5, 0, -25]
}
}
},
"animation.wormadam_sandy.blink": {
"animation_length": 0.1667,
"bones": {
"pupil_left": {
"position": {
"0.0": [0, 0, 0.1],
"0.125": [0, 0, 0.1],
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"pupil_closed_left": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": [0, 0, -0.1],
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"pupil_right": {
"position": {
"0.0": [0, 0, 0.1],
"0.125": [0, 0, 0.1],
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"pupil_closed_right": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": [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.wormadam_sandy.ditto_face": {
"loop": true,
"bones": {
"face": {
"position": [0, 0, 0.1],
"scale": 0
},
"face_ditto": {
"position": [0, 0, -0.1]
}
}
}
}
}
@@ -0,0 +1,107 @@
{
"format_version": "1.8.0",
"animations": {
"animation.wormadam_trash.ground_idle": {
"loop": true,
"bones": {
"body": {
"rotation": [5, 0, 0],
"position": [0, 6, 0]
},
"body_rotation": {
"rotation": [0, 0, 0]
},
"antenna": {
"rotation": [-2.5, 0, 0]
},
"ear_left": {
"rotation": [0, -12.5, 0]
},
"ear_left2": {
"rotation": [0, 0, 20]
},
"ear_left3": {
"rotation": [0, 0, 22.5]
},
"ear_back_left": {
"rotation": [-7.5, 0, 25]
},
"ear_left4": {
"rotation": [0, 0, 17.5]
},
"ear_right": {
"rotation": [0, 12.5, 0]
},
"ear_right2": {
"rotation": [0, 0, -20]
},
"ear_right3": {
"rotation": [0, 0, -22.5]
},
"ear_right4": {
"rotation": [0, 0, -17.5]
},
"ear_back_right": {
"rotation": [-7.5, 0, -25]
}
}
},
"animation.wormadam_trash.blink": {
"animation_length": 0.1667,
"bones": {
"pupil_left": {
"position": {
"0.0": [0, 0, 0.1],
"0.125": [0, 0, 0.1],
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"pupil_closed_left": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": [0, 0, -0.1],
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"pupil_right": {
"position": {
"0.0": [0, 0, 0.1],
"0.125": [0, 0, 0.1],
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"pupil_closed_right": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": [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.wormadam_trash.ditto_face": {
"loop": true,
"bones": {
"face": {
"position": [0, 0, 0.1],
"scale": 0
},
"face_ditto": {
"position": [0, 0, -0.1]
}
}
}
}
}
@@ -0,0 +1,100 @@
{
"format_version": "1.8.0",
"animations": {
"animation.mothim.ground_idle": {
"loop": true,
"bones": {
"torso": {
"rotation": [5, 0, 0]
},
"wing_upper_left": {
"rotation": [1.3185, -9.9136, -7.6143]
},
"wing_lower_left": {
"rotation": [-2.5, -12.5, 0]
},
"head": {
"rotation": [-5, 0, 0]
},
"antenna_left": {
"rotation": [-22.4229, 1.9113, 4.6211]
},
"antenna_left2": {
"rotation": [-7.5, 0, 0]
},
"tail": {
"rotation": [-12.5, 0, 0]
},
"antenna_right": {
"rotation": [-22.4229, -1.9113, -4.6211]
},
"antenna_right2": {
"rotation": [-7.5, 0, 0]
},
"arm_left": {
"rotation": [-0.9096, 19.9802, 44.8398]
},
"arm_right": {
"rotation": [-0.9096, -19.9802, -44.8398]
},
"leg_left": {
"rotation": [-9.041, -41.7073, 13.4501]
},
"leg_right": {
"rotation": [-9.041, 41.7073, -13.4501]
},
"wing_upper_right": {
"rotation": [1.3185, 9.9136, 7.6143]
},
"wing_lower_right": {
"rotation": [-2.5, 12.5, 0]
}
}
},
"animation.mothim.blink": {
"animation_length": 0.1667,
"bones": {
"eye_open_left": {
"position": {
"0.0": [0, 0, 0.1],
"0.125": {"pre": [0, 0, 0.1], "post": [0, 0, 0.1]},
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"eye_open_right": {
"position": {
"0.0": [0, 0, 0.1],
"0.125": {"pre": [0, 0, 0.1], "post": [0, 0, 0.1]},
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"eye_closed_left": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": {"pre": [0, 0, -0.1], "post": [0, 0, -0.1]},
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, -0.1]}
}
},
"eye_closed_right": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": {"pre": [0, 0, -0.1], "post": [0, 0, -0.1]},
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, -0.1]}
}
},
"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]}
}
}
}
}
}
}
@@ -0,0 +1,104 @@
{
"format_version": "1.8.0",
"animations": {
"animation.snover.ground_idle": {
"loop": true,
"bones": {
"tail": {
"rotation": [-7.44134, 0.07948, 0.53084]
},
"arm_right": {
"rotation": [0, 0, "-32.5-5*Math.sin((query.anim_time-0.5) * 90 * 1)"]
},
"arm_right2": {
"rotation": [0, "-12.5+5*Math.sin((query.anim_time-0.75) * 90 * 1)", 0]
},
"torso": {
"rotation": ["-2.5+2*Math.sin((query.anim_time-0) * 90 * 1)", 0, "-2*Math.sin((query.anim_time-0.8) * 90 * 0.5)"],
"position": [0, "0.1*Math.sin((query.anim_time-0.75) * 90 * 1)", 0]
},
"torso2": {
"rotation": ["5+1*Math.sin((query.anim_time-0.25) * 90 * 1)", 0, 0]
},
"arm_left": {
"rotation": [0, 0, "32.5+5*Math.sin((query.anim_time-0.5) * 90 * 1)"]
},
"arm_left2": {
"rotation": [0, "12.5-5*Math.sin((query.anim_time-0.75) * 90 * 1)", 0]
}
}
},
"animation.snover.blink": {
"animation_length": 0.1667,
"bones": {
"pupil_right": {
"position": {
"0.0": [0, 0, 0.1],
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"pupil_left": {
"position": {
"0.0": [0, 0, 0.1],
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"pupil_closed_right": {
"position": {
"0.0": [0, 0, -0.1],
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"pupil_closed_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.snover.ditto_face": {
"loop": true,
"bones": {
"eyes": {
"scale": 0
},
"face_ditto": {
"position": [0, 0, -0.1]
}
}
},
"animation.snover.berries_female": {
"loop": true,
"bones": {
"berry_front": {
"position": [0, 0, -4]
},
"berry_front_right": {
"position": [-4, 0, -4]
},
"berry_back_right": {
"position": [-4, 0, 4]
},
"berry_front_left": {
"position": [4, 0, -4]
},
"berry_back_left": {
"position": [4, 0, 4]
}
}
}
}
}
@@ -0,0 +1,110 @@
{
"format_version": "1.8.0",
"animations": {
"animation.abomasnow.ground_idle": {
"loop": true,
"bones": {
"torso2": {
"rotation": [2.5, 0, 0]
},
"head": {
"rotation": [-2.5, 0, 0]
},
"arm_left": {
"rotation": [0, 0, 35]
},
"arm_left2": {
"rotation": [4.75346, 32.18826, 8.87221]
},
"finger_front_left": {
"rotation": [-3.96713, -14.47751, 15.50409]
},
"finger_middle_left": {
"rotation": [0, 0, 15]
},
"finger_back_left": {
"rotation": [3.96713, 14.47751, 15.50409]
},
"foot_left": {
"rotation": [0, -15, 0]
},
"tail": {
"rotation": [-15, 0, 0]
},
"tail2": {
"rotation": [5, 0, 0]
},
"tail3": {
"rotation": [5, 0, 0]
},
"arm_right": {
"rotation": [0, 0, -35]
},
"arm_right2": {
"rotation": [4.75346, -32.18826, -8.87221]
},
"finger_front_right": {
"rotation": [-3.96713, 14.47751, -15.50409]
},
"finger_middle_right": {
"rotation": [0, 0, -15]
},
"finger_back_right": {
"rotation": [3.96713, -14.47751, -15.50409]
}
}
},
"animation.abomasnow.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]}
}
},
"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]}
}
},
"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.abomasnow.ditto_face": {
"loop": true,
"bones": {
"eyes": {
"scale": 0
},
"face_ditto": {
"position": [0, 0, -0.1]
}
}
}
}
}
@@ -0,0 +1,279 @@
{
"format_version": "1.8.0",
"animations": {
"animation.tympole.ground_idle": {
"loop": true,
"bones": {
"torso": {
"rotation": [-2.5, 0, 0]
},
"tail": {
"rotation": [-37.5, 0, 0]
},
"tail2": {
"rotation": [35, 0, 0]
},
"tail3": {
"rotation": [10, 0, 0]
}
}
},
"animation.tympole.sleep": {
"loop": true,
"bones": {
"body": {
"rotation": [-95, 0, 0],
"position": [0, 0, 2]
},
"tail": {
"rotation": [-85, 0, 0]
},
"tail2": {
"rotation": [-5, 0, 0]
},
"tail3": {
"rotation": [-12.5, 0, 0]
},
"eye_left": {
"position": [0, 0, 0.1]
},
"eye_right": {
"position": [0, 0, 0.1]
},
"eyelid_right": {
"position": [0, 0, -0.1]
},
"eyelid_left": {
"position": [0, 0, -0.1]
}
}
},
"animation.tympole.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.tympole.ditto_face": {
"loop": true,
"bones": {
"face": {
"scale": 0
},
"face_ditto": {
"position": [0, 0, -0.1]
}
}
},
"animation.tympole.pose": {
"loop": true,
"bones": {
"body": {
"rotation": [-8.5958, -5.68422, 21.80633],
"position": [0, 8, 0]
},
"tail": {
"rotation": [-67.5, -22.5, 0],
"position": [0, -2, 0]
},
"tail2": {
"rotation": [22.5, 0, 0]
},
"tail3": {
"rotation": [22.5, 0, 0]
},
"mouth": {
"position": [0, 0, 0.1]
},
"mouth_open": {
"position": [0, 0, 0]
},
"mouth_open_small": {
"position": [0, 0, -0.1]
}
}
},
"animation.tympole.happy": {
"loop": true,
"bones": {
"eye_left": {
"position": [0, 0, 0.1]
},
"eye_right": {
"position": [0, 0, 0.1]
},
"mouth": {
"position": [0, 0, 0.1]
},
"mouth_open": {
"position": [0, 0, -0.1]
},
"eye_left_happy": {
"position": [0, 0, -0.1]
},
"eye_right_happy": {
"position": [0, 0, -0.1]
}
}
},
"animation.tympole.shock": {
"loop": true,
"bones": {
"mouth": {
"position": [0, 0, 0.1]
},
"mouth_open_tall": {
"position": [0, 0, -0.1]
},
"eyebrow_left": {
"position": [0, 0.5, 0]
},
"eyebrow_right": {
"position": [0, 0.5, 0]
}
}
},
"animation.tympole.angry": {
"loop": true,
"bones": {
"eyebrow_left": {
"rotation": [0, 0, -22.5],
"position": [-0.25, -0.25, -0.04]
},
"eyebrow_right": {
"rotation": [0, 0, 22.5],
"position": [0.25, -0.25, -0.04]
},
"mouth": {
"position": [0, 0, 0.1]
},
"eyelid_left_emote": {
"position": [0, 0, -0.1]
},
"eyelid_right_emote": {
"position": [0, 0, -0.1]
},
"mouth_angry": {
"position": [0, 0, -0.1]
}
}
},
"animation.tympole.sad": {
"loop": true,
"bones": {
"eyebrow_left": {
"rotation": [0, 0, 10],
"position": [0.15, 0, -0.04]
},
"eyebrow_right": {
"rotation": [0, 0, -10],
"position": [-0.15, 0, -0.04]
},
"mouth": {
"position": [0, 0, 0.1]
},
"eyelid_left_emote": {
"position": [0.9, 0, -0.1]
},
"eyelid_right_emote": {
"position": [-0.9, 0, -0.1]
},
"mouth_sad": {
"position": [0, 0, -0.1]
}
}
},
"animation.tympole.hurt": {
"loop": true,
"bones": {
"eyebrow_left": {
"position": [0, -0.25, 0]
},
"eyebrow_right": {
"position": [0, -0.25, 0]
},
"eye_left": {
"position": [0, 0, 0.1]
},
"eye_right": {
"position": [0, 0, 0.1]
},
"mouth": {
"position": [0, 0, 0.1]
},
"mouth_open_frown": {
"position": [0, 0, -0.1]
},
"eye_left_hurt": {
"position": [0, 0, -0.1]
},
"eye_right_hurt": {
"position": [0, 0, -0.1]
}
}
},
"animation.tympole.unamused": {
"loop": true,
"bones": {
"mouth": {
"position": [0, 0, 0.1]
},
"mouth_angry": {
"position": [0, 0, -0.1]
},
"eyelid_left_unamused": {
"position": [0, 0, -0.1]
},
"eyelid_right_unamused": {
"position": [0, 0, -0.1]
}
}
},
"animation.tympole.scale": {
"loop": true,
"bones": {
"tympole": {
"scale": 0.65
},
"ear_left_inside": {
"position": [0, 0, 0]
}
}
}
}
}
@@ -0,0 +1,223 @@
{
"format_version": "1.8.0",
"animations": {
"animation.palpitoad.ground_idle": {
"loop": true,
"bones": {
"palpitoad": {
"scale": 1
},
"torso": {
"rotation": [-2.5, 0, 0]
},
"tail": {
"rotation": [-32.5, 0, 0]
},
"nose": {
"rotation": [-10, 0, 0]
},
"leg_left": {
"rotation": [0, 15, 0]
},
"leg_right": {
"rotation": [0, -15, 0]
},
"tail2": {
"rotation": [20, 0, 0]
},
"tail3": {
"rotation": [12.5, 0, 0]
},
"tongue": {
"rotation": [260, 0, 0]
},
"tongue_2": {
"rotation": [180, 0, 0]
},
"tongue_3": {
"rotation": [180, 0, 0]
},
"tongue_4": {
"rotation": [180, 0, 0]
},
"tongue_5": {
"rotation": [180, 0, 0]
},
"tongue_6": {
"rotation": [180, 0, 0]
},
"tongue_7": {
"rotation": [180, 0, 0]
},
"tongue_8": {
"rotation": [180, 0, 0]
},
"tongue_9": {
"rotation": [180, 0, 0]
},
"tongue_10": {
"rotation": [180, 0, 0]
},
"tongue_11": {
"rotation": [180, 0, 0]
},
"tongue_12": {
"rotation": [180, 0, 0]
},
"head": {
"rotation": [2.5, 0, 0]
}
}
},
"animation.palpitoad.blink": {
"animation_length": 0.1667,
"bones": {
"eye_left": {
"position": {
"0.0": [0, 0, 0.1],
"0.125": [0, 0, 0.1],
"0.1667": [0, 0, 0]
}
},
"shine_left": {
"position": {
"0.0": [0, 0, 0.1],
"0.125": [0, 0, 0.1],
"0.1667": [0, 0, 0]
}
},
"eye_right": {
"position": {
"0.0": [0, 0, 0.1],
"0.125": [0, 0, 0.1],
"0.1667": [0, 0, 0]
}
},
"shine_right": {
"position": {
"0.0": [0, 0, 0.1],
"0.125": [0, 0, 0.1],
"0.1667": [0, 0, 0]
}
},
"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.palpitoad.ditto_face": {
"loop": true,
"bones": {
"mouth_open_big_bottom": {
"scale": 0
},
"face": {
"scale": 0
},
"face_ditto": {
"position": [0, 0, -0.1]
}
}
},
"animation.palpitoad.pose": {
"loop": true,
"bones": {
"body": {
"position": [0, 1, 0]
},
"leg_left": {
"rotation": [20, 25, 0]
},
"toes_left": {
"rotation": [-20, 0, 0]
},
"leg_right": {
"rotation": [20, -25, 0]
},
"toes_right": {
"rotation": [-20, 0, 0]
},
"torso": {
"rotation": [-5, 0, 0]
},
"head_angle": {
"rotation": [5, 10, 0]
},
"mouth": {
"position": [0, 0, 0.1]
},
"nose": {
"rotation": [-10, 0, 0]
},
"tail": {
"rotation": [27.5, -30, 0]
},
"tail2": {
"rotation": [27.5, 0, 0]
},
"tongue": {
"rotation": [-10, -32.5, 0]
},
"tongue_2": {
"rotation": [-42.79487, -18.88952, 16.68541]
},
"tongue_3": {
"rotation": [-38.85707, -12.27659, 12.56853]
},
"tongue_4": {
"rotation": [-25, 0, 0]
},
"tongue_5": {
"rotation": [-10.82756, 27.88369, 21.32202]
},
"tongue_6": {
"rotation": [-10, 42.5, 0]
},
"tongue_7": {
"rotation": [-30.86748, 12.95254, -7.63074]
},
"mouth_open": {
"position": [0, 0, -0.1]
},
"tongue_8": {
"rotation": [-15, 0, 0]
},
"tongue_9": {
"rotation": [-22.5, 0, 0]
},
"tongue_12": {
"rotation": [40, 0, 0]
},
"tongue_11": {
"rotation": [37.5, 0, 0]
},
"tongue_10": {
"rotation": [-15, 0, 0]
},
"shine_left": {
"position": [-0.25, 0, 0]
},
"shine_right": {
"position": [-0.25, 0, 0]
},
"pupil_left": {
"position": [-0.25, 0, 0]
},
"pupil_right": {
"position": [-0.25, 0, 0]
}
}
}
}
}
@@ -0,0 +1,341 @@
{
"format_version": "1.8.0",
"animations": {
"animation.seismitoad.ground_idle": {
"loop": true,
"bones": {
"body": {
"position": [0, -3.2, 0]
},
"torso": {
"rotation": [2.5, 0, 0]
},
"shoulder_left": {
"rotation": [34.3569, -7.1313, 32.7929]
},
"arm_left": {
"rotation": [0, 27.5, 5]
},
"elbow_left": {
"rotation": [-15, 22.5, 0]
},
"hand_left": {
"rotation": [0, 0, 22.5]
},
"leg_left": {
"rotation": [-45, -20, -10],
"position": [-1, 0, 0]
},
"knee_left": {
"rotation": [60, -10, 10]
},
"foot_left": {
"rotation": [-12, 0, -5]
},
"wart_knee_left": {
"rotation": [22.5, 0, 7.5]
},
"neck_rotation": {
"rotation": [2.5, 0, 0]
},
"head": {
"rotation": [-90, 0, 0]
},
"finger_middle_left2": {
"rotation": [0, 0, 15]
},
"finger_front_left": {
"rotation": [0, 0, 7.5]
},
"finger_front_left2": {
"rotation": [0, 0, 15]
},
"finger_back_left": {
"rotation": [0, 0, 7.5]
},
"finger_back_left2": {
"rotation": [0, 0, 15]
},
"shoulder_right": {
"rotation": [34.3569, 7.1313, -32.7929]
},
"arm_right": {
"rotation": [0, -27.5, -5]
},
"elbow_right": {
"rotation": [-15, -22.5, 0]
},
"hand_right": {
"rotation": [0, 0, -22.5]
},
"finger_middle_right2": {
"rotation": [0, 0, -15]
},
"finger_front_right": {
"rotation": [0, 0, -7.5]
},
"finger_front_right2": {
"rotation": [0, 0, -15]
},
"finger_back_right": {
"rotation": [0, 0, -7.5]
},
"finger_back_right2": {
"rotation": [0, 0, -15]
},
"toe_back_left2": {
"rotation": [-10, 0, 0]
},
"toe_out_left2": {
"rotation": [7.5, 0, 0]
},
"toe_in_left2": {
"rotation": [7.5, 0, 0]
},
"leg_right": {
"rotation": [-45, 20, 10],
"position": [1, 0, 0]
},
"knee_right": {
"rotation": [60, 10, -10]
},
"foot_right": {
"rotation": [-12, 0, 5]
},
"toe_out_right2": {
"rotation": [7.5, 0, 0]
},
"toe_in_right2": {
"rotation": [7.5, 0, 0]
},
"toe_back_right2": {
"rotation": [-10, 0, 0]
},
"wart_knee_right": {
"rotation": [22.5, 0, -7.5]
},
"neck": {
"rotation": [-45, 0, 0]
},
"tongue": {
"position": [0, -0.25, 3]
},
"tongue2": {
"position": [0, 0, 5]
},
"tongue3": {
"position": [0, 0, 5]
},
"tongue4": {
"position": [0, 0, 5]
},
"tongue5": {
"position": [0, 0, 5]
},
"tongue_tip": {
"position": [0, -1, 3]
},
"head_angle": {
"rotation": [90, 0, 0]
},
"neck_angle": {
"rotation": [45, 0, 0]
}
}
},
"animation.seismitoad.blink": {
"animation_length": 0.2917,
"bones": {
"eye_left": {
"position": {
"0.0": [0, 0, 0],
"0.0833": {"pre": [0, 0, 0], "post": [0, 0, 0.1]},
"0.2917": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"eye_right": {
"position": {
"0.0": [0, 0, 0.1],
"0.2083": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"eyelid_left": {
"position": {
"0.0": [0, 0, 0],
"0.0833": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"0.2917": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"eyelid_right": {
"position": {
"0.0": [0, 0, -0.1],
"0.2083": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"eyes_ditto": {
"position": {
"0.0": [0, 0, 0.1],
"0.2083": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"eyes_blink_ditto": {
"position": {
"0.0": [0, 0, -0.1],
"0.2083": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
}
}
},
"animation.seismitoad.ditto_face": {
"loop": true,
"bones": {
"face": {
"scale": 0
},
"face_ditto": {
"position": [0, 0, -0.1]
},
"tongue": {
"scale": 0
}
}
},
"animation.seismitoad.pose": {
"loop": true,
"bones": {
"body": {
"rotation": [0, -30, 0],
"position": [0, -2.25, 0]
},
"torso": {
"rotation": [17.5, 0, 0]
},
"jaw": {
"rotation": [42.5, 0, 0]
},
"shoulder_left": {
"rotation": [-5, -7.5, 25]
},
"arm_left": {
"rotation": [0, 5, 0]
},
"elbow_left": {
"rotation": [-12.5, 50, 0]
},
"finger_middle_left": {
"rotation": [0, 0, 7.5]
},
"leg_left": {
"rotation": [-40.6299, -29.1905, -7.6552]
},
"knee_left": {
"rotation": [37.5, 0, 0]
},
"foot_left": {
"rotation": [6.4717, -0.6518, 4.9574]
},
"head": {
"rotation": [-22.0182, -4.7511, -24.0751]
},
"finger_middle_left2": {
"rotation": [0, 0, 20]
},
"finger_front_left2": {
"rotation": [0, 0, 15]
},
"finger_back_left": {
"rotation": [0, 0, 27.5]
},
"finger_back_left2": {
"rotation": [0, 0, 40]
},
"shoulder_right": {
"rotation": [0, 0, -22.5]
},
"arm_right": {
"rotation": [0, -12.5, 0]
},
"elbow_right": {
"rotation": [173.5473, -44.2356, -288.0659]
},
"hand_right": {
"rotation": [0, 0, -15]
},
"finger_middle_right": {
"rotation": [0, 0, -15]
},
"finger_middle_right2": {
"rotation": [0, 0, -5]
},
"finger_front_right": {
"rotation": [20.5765, 31.8072, -73.3068],
"position": [0, 0, -0.5]
},
"finger_front_right2": {
"rotation": [0, 0, -50]
},
"finger_back_right": {
"rotation": [-19.2568, -34.3655, -80.4799],
"position": [0, 0, 0.5]
},
"finger_back_right2": {
"rotation": [0, 0, -50]
},
"toe_back_left2": {
"rotation": [-10, 0, 0]
},
"toe_out_left2": {
"rotation": [7.5, 0, 0]
},
"toe_in_left2": {
"rotation": [7.5, 0, 0]
},
"leg_right": {
"rotation": [-38.922, 39.0907, 8.6174]
},
"knee_right": {
"rotation": [37.5, 0, 0]
},
"foot_right": {
"rotation": [7.4593, 0.7817, -5.949]
},
"toe_out_right2": {
"rotation": [7.5, 0, 0]
},
"toe_in_right2": {
"rotation": [7.5, 0, 0]
},
"toe_back_right2": {
"rotation": [-10, 0, 0]
},
"pupil_right": {
"position": [-0.25, 0, 0]
},
"pupil_left": {
"position": [-0.25, 0, 0]
},
"neck": {
"rotation": [0, -4, 0]
},
"tongue": {
"rotation": [-25, 0, 0]
},
"tongue2": {
"rotation": [-10, 25, 0]
},
"tongue3": {
"rotation": [-5, 32.5, 0]
},
"tongue4": {
"rotation": [-5, 45, 0]
},
"tongue5": {
"rotation": [-22.99, 11.5348, -4.8492]
},
"tongue_tip": {
"rotation": [-25.3376, 9.0548, -4.2618]
}
}
}
}
}
@@ -0,0 +1,105 @@
{
"format_version": "1.8.0",
"animations": {
"animation.deerling.ground_idle": {
"loop": true,
"bones": {
"body": {
"position": [0, -0.1, 0]
},
"torso": {
"rotation": [5, 0, 0]
},
"torso2": {
"rotation": [-5, 0, 0]
},
"neck": {
"rotation": [7.5, 0, 0]
},
"ear_left2": {
"rotation": [0, 0, 7.5]
},
"ear_right2": {
"rotation": [0, 0, -7.5]
},
"tail": {
"rotation": [5, 0, 0]
},
"leg_front_left": {
"rotation": [2.5, 0, 0]
},
"foot_front_left": {
"rotation": [-2.5, 0, 0]
},
"leg_back_left": {
"rotation": [2.5, 0, -2.5]
},
"leg_back_left2": {
"rotation": [-2.5, 0, 0]
},
"foot_back_left": {
"rotation": [0, 0, 2.5]
},
"leg_front_right": {
"rotation": [2.5, 0, 0]
},
"foot_front_right": {
"rotation": [-2.5, 0, 0]
},
"leg_back_right": {
"rotation": [2.5, 0, 2.5]
},
"leg_back_right2": {
"rotation": [-2.5, 0, 0]
},
"foot_back_right": {
"rotation": [0, 0, -2.5]
},
"head": {
"rotation": [-7.5, 0, 0]
}
}
},
"animation.deerling.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]}
}
},
"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_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]}
}
}
}
}
}
}
@@ -0,0 +1,129 @@
{
"format_version": "1.8.0",
"animations": {
"animation.sawsbuck_autumn.ground_idle": {
"loop": true,
"bones": {
"body": {
"position": [0, -0.4, 0]
},
"head": {
"rotation": [-3, 0, 0]
},
"leg_front_left": {
"rotation": [0, -3, -2]
},
"leg_front_left2": {
"rotation": [0, 0, 0]
},
"leg_front_left3": {
"rotation": [2.5, 0, 0]
},
"foot_front_left": {
"rotation": [-0.5, 0, 2]
},
"leg_back_left": {
"rotation": [-5, -3, -2]
},
"leg_back_left2": {
"rotation": [3, 0, 0]
},
"leg_back_left3": {
"rotation": [-5, 0, 0]
},
"foot_back_left": {
"rotation": [7, -1, 2]
},
"leg_front_right": {
"rotation": [0, 3, 2]
},
"leg_front_right2": {
"rotation": [0, 0, 0]
},
"leg_front_right3": {
"rotation": [2.5, 0, 0]
},
"foot_front_right": {
"rotation": [-0.5, 0, -2]
},
"leg_back_right": {
"rotation": [-5, 3, 2]
},
"leg_back_right2": {
"rotation": [3, 0, 0]
},
"leg_back_right3": {
"rotation": [-5, 0, 0]
},
"foot_back_right": {
"rotation": [7, 1, -2]
},
"ear_left": {
"rotation": [0, 0, -10]
},
"ear_right": {
"rotation": [0, 0, 10]
},
"tail1": {
"rotation": [-3, 0, 0]
},
"tail2": {
"rotation": [-5, 0, 0]
},
"torso": {
"rotation": [5, 0, 0]
},
"torso2": {
"rotation": [-5, 0, 0]
},
"neck": {
"rotation": [-5, 0, 0]
},
"ftorso2": {
"rotation": [-2.5, 0, 0]
}
}
},
"animation.sawsbuck_autumn.blink": {
"animation_length": 0.1667,
"bones": {
"eyelid_left": {
"position": {
"0.0": [0.1, -0.1, 0],
"0.1667": {"pre": [0.1, -0.1, 0], "post": [0, 0, 0]}
}
},
"eyelid_right": {
"position": {
"0.0": [-0.1, -0.1, 0],
"0.1667": {"pre": [-0.1, -0.1, 0], "post": [0, 0, 0]}
}
},
"eye_left": {
"position": {
"0.0": [-0.1, 0.1, 0],
"0.1667": {"pre": [-0.1, 0.1, 0], "post": [0, 0, 0]}
}
},
"eyebrow_left": {
"position": {
"0.0": [-0.1, 0.1, 0],
"0.1667": {"pre": [-0.1, 0.1, 0], "post": [0, 0, 0]}
}
},
"eye_right": {
"position": {
"0.0": [0.1, 0.1, 0],
"0.1667": {"pre": [0.1, 0.1, 0], "post": [0, 0, 0]}
}
},
"eyebrow_right": {
"position": {
"0.0": [0.1, 0.1, 0],
"0.1667": {"pre": [0.1, 0.1, 0], "post": [0, 0, 0]}
}
}
}
}
}
}
@@ -0,0 +1,129 @@
{
"format_version": "1.8.0",
"animations": {
"animation.sawsbuck_spring.ground_idle": {
"loop": true,
"bones": {
"body": {
"position": [0, -0.4, 0]
},
"head": {
"rotation": [-3, 0, 0]
},
"leg_front_left": {
"rotation": [0, -3, -2]
},
"leg_front_left2": {
"rotation": [0, 0, 0]
},
"leg_front_left3": {
"rotation": [2.5, 0, 0]
},
"foot_front_left": {
"rotation": [-0.5, 0, 2]
},
"leg_back_left": {
"rotation": [-5, -3, -2]
},
"leg_back_left2": {
"rotation": [3, 0, 0]
},
"leg_back_left3": {
"rotation": [-5, 0, 0]
},
"foot_back_left": {
"rotation": [7, -1, 2]
},
"leg_front_right": {
"rotation": [0, 3, 2]
},
"leg_front_right2": {
"rotation": [0, 0, 0]
},
"leg_front_right3": {
"rotation": [2.5, 0, 0]
},
"foot_front_right": {
"rotation": [-0.5, 0, -2]
},
"leg_back_right": {
"rotation": [-5, 3, 2]
},
"leg_back_right2": {
"rotation": [3, 0, 0]
},
"leg_back_right3": {
"rotation": [-5, 0, 0]
},
"foot_back_right": {
"rotation": [7, 1, -2]
},
"ear_left": {
"rotation": [0, 0, -10]
},
"ear_right": {
"rotation": [0, 0, 10]
},
"tail1": {
"rotation": [-3, 0, 0]
},
"tail2": {
"rotation": [-5, 0, 0]
},
"torso": {
"rotation": [5, 0, 0]
},
"torso2": {
"rotation": [-5, 0, 0]
},
"neck": {
"rotation": [-5, 0, 0]
},
"ftorso2": {
"rotation": [-2.5, 0, 0]
}
}
},
"animation.sawsbuck_spring.blink": {
"animation_length": 0.1667,
"bones": {
"eyelid_left": {
"position": {
"0.0": [0.1, -0.1, 0],
"0.1667": {"pre": [0.1, -0.1, 0], "post": [0, 0, 0]}
}
},
"eyelid_right": {
"position": {
"0.0": [-0.1, -0.1, 0],
"0.1667": {"pre": [-0.1, -0.1, 0], "post": [0, 0, 0]}
}
},
"eye_left": {
"position": {
"0.0": [-0.1, 0.1, 0],
"0.1667": {"pre": [-0.1, 0.1, 0], "post": [0, 0, 0]}
}
},
"eyebrow_left": {
"position": {
"0.0": [-0.1, 0.1, 0],
"0.1667": {"pre": [-0.1, 0.1, 0], "post": [0, 0, 0]}
}
},
"eye_right": {
"position": {
"0.0": [0.1, 0.1, 0],
"0.1667": {"pre": [0.1, 0.1, 0], "post": [0, 0, 0]}
}
},
"eyebrow_right": {
"position": {
"0.0": [0.1, 0.1, 0],
"0.1667": {"pre": [0.1, 0.1, 0], "post": [0, 0, 0]}
}
}
}
}
}
}
@@ -0,0 +1,141 @@
{
"format_version": "1.8.0",
"animations": {
"animation.sawsbuck_summer.ground_idle": {
"loop": true,
"bones": {
"body": {
"position": [0, -0.4, 0]
},
"head": {
"rotation": [-3, 0, 0]
},
"leg_front_left": {
"rotation": [0, -3, -2]
},
"leg_front_left2": {
"rotation": [0, 0, 0]
},
"leg_front_left3": {
"rotation": [2.5, 0, 0]
},
"foot_front_left": {
"rotation": [-0.5, 0, 2]
},
"leg_back_left": {
"rotation": [-5, -3, -2]
},
"leg_back_left2": {
"rotation": [3, 0, 0]
},
"leg_back_left3": {
"rotation": [-5, 0, 0]
},
"foot_back_left": {
"rotation": [7, -1, 2]
},
"leg_front_right": {
"rotation": [0, 3, 2]
},
"leg_front_right2": {
"rotation": [0, 0, 0]
},
"leg_front_right3": {
"rotation": [2.5, 0, 0]
},
"foot_front_right": {
"rotation": [-0.5, 0, -2]
},
"leg_back_right": {
"rotation": [-5, 3, 2]
},
"leg_back_right2": {
"rotation": [3, 0, 0]
},
"leg_back_right3": {
"rotation": [-5, 0, 0]
},
"foot_back_right": {
"rotation": [7, 1, -2]
},
"ear_left": {
"rotation": [0, 0, -10]
},
"ear_right": {
"rotation": [0, 0, 10]
},
"tail1": {
"rotation": [-3, 0, 0]
},
"tail2": {
"rotation": [-5, 0, 0]
},
"torso": {
"rotation": [5, 0, 0]
},
"torso2": {
"rotation": [-5, 0, 0]
},
"neck": {
"rotation": [-5, 0, 0]
},
"ftorso2": {
"rotation": [-2.5, 0, 0]
},
"bush_left3_summer": {
"rotation": [0, 0, -5]
},
"bush_left4_summer": {
"rotation": [0, 0, -7.5]
},
"bush_right3_summer": {
"rotation": [0, 0, 5]
},
"bush_right4_summer": {
"rotation": [0, 0, 7.5]
}
}
},
"animation.sawsbuck_summer.blink": {
"animation_length": 0.1667,
"bones": {
"eyelid_left": {
"position": {
"0.0": [0.1, -0.1, 0],
"0.1667": {"pre": [0.1, -0.1, 0], "post": [0, 0, 0]}
}
},
"eyelid_right": {
"position": {
"0.0": [-0.1, -0.1, 0],
"0.1667": {"pre": [-0.1, -0.1, 0], "post": [0, 0, 0]}
}
},
"eye_left": {
"position": {
"0.0": [-0.1, 0.1, 0],
"0.1667": {"pre": [-0.1, 0.1, 0], "post": [0, 0, 0]}
}
},
"eyebrow_left": {
"position": {
"0.0": [-0.1, 0.1, 0],
"0.1667": {"pre": [-0.1, 0.1, 0], "post": [0, 0, 0]}
}
},
"eye_right": {
"position": {
"0.0": [0.1, 0.1, 0],
"0.1667": {"pre": [0.1, 0.1, 0], "post": [0, 0, 0]}
}
},
"eyebrow_right": {
"position": {
"0.0": [0.1, 0.1, 0],
"0.1667": {"pre": [0.1, 0.1, 0], "post": [0, 0, 0]}
}
}
}
}
}
}
@@ -0,0 +1,141 @@
{
"format_version": "1.8.0",
"animations": {
"animation.sawsbuck_winter.ground_idle": {
"loop": true,
"bones": {
"body": {
"position": [0, -0.4, 0]
},
"head": {
"rotation": [-3, 0, 0]
},
"leg_front_left": {
"rotation": [0, -3, -2]
},
"leg_front_left2": {
"rotation": [0, 0, 0]
},
"leg_front_left3": {
"rotation": [2.5, 0, 0]
},
"foot_front_left": {
"rotation": [-0.5, 0, 2]
},
"leg_back_left": {
"rotation": [-5, -3, -2]
},
"leg_back_left2": {
"rotation": [3, 0, 0]
},
"leg_back_left3": {
"rotation": [-5, 0, 0]
},
"foot_back_left": {
"rotation": [7, -1, 2]
},
"leg_front_right": {
"rotation": [0, 3, 2]
},
"leg_front_right2": {
"rotation": [0, 0, 0]
},
"leg_front_right3": {
"rotation": [2.5, 0, 0]
},
"foot_front_right": {
"rotation": [-0.5, 0, -2]
},
"leg_back_right": {
"rotation": [-5, 3, 2]
},
"leg_back_right2": {
"rotation": [3, 0, 0]
},
"leg_back_right3": {
"rotation": [-5, 0, 0]
},
"foot_back_right": {
"rotation": [7, 1, -2]
},
"ear_left": {
"rotation": [0, 0, -10]
},
"ear_right": {
"rotation": [0, 0, 10]
},
"tail1": {
"rotation": [-3, 0, 0]
},
"tail2": {
"rotation": [-5, 0, 0]
},
"torso": {
"rotation": [5, 0, 0]
},
"torso2": {
"rotation": [-5, 0, 0]
},
"neck": {
"rotation": [-5, 0, 0]
},
"ftorso2": {
"rotation": [-2.5, 0, 0]
},
"bush_left3_summer": {
"rotation": [0, 0, -5]
},
"bush_left4_summer": {
"rotation": [0, 0, -7.5]
},
"bush_right3_summer": {
"rotation": [0, 0, 5]
},
"bush_right4_summer": {
"rotation": [0, 0, 7.5]
}
}
},
"animation.sawsbuck_winter.blink": {
"animation_length": 0.1667,
"bones": {
"eyelid_left": {
"position": {
"0.0": [0.1, -0.1, 0],
"0.1667": {"pre": [0.1, -0.1, 0], "post": [0, 0, 0]}
}
},
"eyelid_right": {
"position": {
"0.0": [-0.1, -0.1, 0],
"0.1667": {"pre": [-0.1, -0.1, 0], "post": [0, 0, 0]}
}
},
"eye_left": {
"position": {
"0.0": [-0.1, 0.1, 0],
"0.1667": {"pre": [-0.1, 0.1, 0], "post": [0, 0, 0]}
}
},
"eyebrow_left": {
"position": {
"0.0": [-0.1, 0.1, 0],
"0.1667": {"pre": [-0.1, 0.1, 0], "post": [0, 0, 0]}
}
},
"eye_right": {
"position": {
"0.0": [0.1, 0.1, 0],
"0.1667": {"pre": [0.1, 0.1, 0], "post": [0, 0, 0]}
}
},
"eyebrow_right": {
"position": {
"0.0": [0.1, 0.1, 0],
"0.1667": {"pre": [0.1, 0.1, 0], "post": [0, 0, 0]}
}
}
}
}
}
}
@@ -5,105 +5,103 @@
"loop": true,
"bones": {
"neck_left": {
"rotation": [0, 0, 17.5]
"rotation": [17.5, 0, 17.5]
},
"neck_left2": {
"rotation": [-7.28217, -2.57594, -9.6658],
"position": [0, 0, 0.1]
"rotation": [-7.28217, -2.57594, -9.6658]
},
"neck_left3": {
"rotation": [-2.5, 0, -12.5]
"rotation": [-2.4786, 0.3262, -5.0071]
},
"head_left": {
"rotation": [-5, 0, 10]
},
"claw_inner_left": {
"inner_claw_left": {
"rotation": [0, 0, -12.5]
},
"claw_outer_left": {
"outer_claw_left": {
"rotation": [0, 0, 12.5]
},
"neck_right": {
"rotation": [0, 0, -25],
"position": [0, 0, 0]
"rotation": [7.5, 0, -17.5],
"position": [0, -2.5, 0]
},
"neck_right2": {
"rotation": [-5, 0, 17.5],
"position": [-0.75, -2, 0]
"rotation": [12.5, 0, 0]
},
"neck_right3": {
"rotation": [-5, 0, 12.5],
"position": [0, -0.75, 0]
"rotation": [-2.5, 0, 10]
},
"head_right": {
"rotation": [-7.43656, -0.9762, -12.43656]
},
"claw_inner_right": {
"inner_claw_right": {
"rotation": [0, 0, 12.5]
},
"claw_outer_right": {
"outer_claw_right": {
"rotation": [0, 0, -12.5]
},
"head_angle_left": {
"rotation": [0, 0, -7.5]
},
"head_angle_right": {
"rotation": [2.5, 0, 20]
}
}
},
"animation.binacle.blink": {
"animation_length": 0.1667,
"bones": {
"eye_open_inner_left": {
"pupil_outer_left": {
"position": {
"0.0": [0, 0, 0.1],
"0.125": {"pre": [0, 0, 0.1], "post": [0, 0, 0.1]},
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"eye_open_outer_left": {
"position": {
"0.0": [0, 0, 0.1],
"0.125": {"pre": [0, 0, 0.1], "post": [0, 0, 0.1]},
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"eyelid_inner_left": {
"pupil_outer_closed_left": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": {"pre": [0, 0, -0.1], "post": [0, 0, -0.1]},
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"eyelid_outer_left": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": {"pre": [0, 0, -0.1], "post": [0, 0, -0.1]},
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
}
}
},
"animation.binacle.blink2": {
"animation_length": 0.1667,
"bones": {
"eye_open_inner_right": {
"pupil_inner_left": {
"position": {
"0.0": [0, 0, 0.1],
"0.125": {"pre": [0, 0, 0.1], "post": [0, 0, 0.1]},
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"eyelid_inner_right": {
"pupil_inner_closed_left": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": {"pre": [0, 0, -0.1], "post": [0, 0, -0.1]},
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"eye_open_outer_right": {
"pupil_outer_right": {
"position": {
"0.0": [0, 0, 0.1],
"0.125": {"pre": [0, 0, 0.1], "post": [0, 0, 0.1]},
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"eyelid_outer_right": {
"pupil_outer_closed_right": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": {"pre": [0, 0, -0.1], "post": [0, 0, -0.1]},
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"pupil_inner_right": {
"position": {
"0.0": [0, 0, 0.1],
"0.125": {"pre": [0, 0, 0.1], "post": [0, 0, 0.1]},
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"pupil_inner_closed_right": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": {"pre": [0, 0, -0.1], "post": [0, 0, -0.1]},
@@ -115,16 +113,9 @@
"animation.binacle.shock": {
"loop": true,
"bones": {
"eyebrow_inner_left": {
"position": [0, 0.35, 0]
},
"eye_open_inner_left": {
"position": [-0.25, -0.1, 0],
"scale": [0.7, 0.7, 1]
},
"eye_open_outer_left": {
"position": [0.25, -0.1, 0],
"scale": [0.7, 0.7, 1]
"pupil_outer_left": {
"position": [0.15, 0, 0],
"scale": [0.6, 0.6, 1]
},
"mouth_closed_left": {
"position": [0, 0, 0.1]
@@ -132,96 +123,69 @@
"mouth_open_left": {
"position": [0, 0, -0.1]
},
"eye_open_inner_right": {
"position": [0.25, -0.1, 0],
"scale": [0.7, 0.7, 1]
},
"eye_open_outer_right": {
"position": [-0.25, -0.1, 0],
"scale": [0.7, 0.7, 1]
},
"eyebrow_inner_right": {
"position": [0, 0.35, 0]
},
"mouth_closed_right": {
"position": [0, 0, 0.1]
},
"mouth_open_right": {
"position": [0, 0, -0.1]
}
}
},
"animation.binacle.angry": {
"loop": true,
"bones": {
"eyebrow_inner_left": {
"position": [0, -0.15, 0]
},
"eyebrow_inner_right": {
"position": [0, -0.15, 0]
}
}
},
"animation.binacle.sad": {
"loop": true,
"bones": {
"eyebrow_left": {
"position": [0, 0, 0]
"pupil_inner_left": {
"position": [-0.05, 0, 0],
"scale": [0.6, 0.6, 1]
},
"eyebrow_inner_left": {
"position": [0, 0.6, 0]
"pupil_outer_right": {
"position": [-0.15, 0, 0],
"scale": [0.6, 0.6, 1]
},
"eyebrow_right": {
"position": [0, 0, 0]
},
"eyebrow_inner_right": {
"position": [0, 0.6, 0]
"pupil_inner_right": {
"position": [0.05, 0, 0],
"scale": [0.6, 0.6, 1]
}
}
},
"animation.binacle.happy": {
"loop": true,
"bones": {
"eyebrow_inner_left": {
"position": [0, 0.35, 0]
},
"eye_open_inner_left": {
"pupil_outer_left": {
"position": [0, 0, 0.1]
},
"eyelid_happy_inner_left": {
"position": [0, 0, -0.1]
},
"eye_open_outer_left": {
"position": [0, 0, 0.1]
},
"eyelid_happy_outer_left": {
"position": [0, 0, -0.1]
},
"mouth_closed_left": {
"position": [0, 0, 0.1]
},
"mouth_open_left": {
"position": [0, 0, -0.1]
},
"eye_open_inner_right": {
"position": [0, 0, 0.1]
"pupil_outer_closed_left": {
"position": [0, 0.3, -0.1]
},
"eyelid_happy_inner_right": {
"pupil_outer_detail_left": {
"position": [0, 0, -0.1]
},
"eye_open_outer_right": {
"pupil_inner_left": {
"position": [0, 0, 0.1]
},
"eyelid_happy_outer_right": {
"pupil_inner_closed_left": {
"position": [0, 0.3, -0.1]
},
"pupil_inner_detail_left": {
"position": [0, 0, -0.1]
},
"eyebrow_inner_right": {
"position": [0, 0.35, 0]
},
"mouth_closed_right": {
"pupil_outer_right": {
"position": [0, 0, 0.1]
},
"mouth_open_right": {
"pupil_outer_closed_right": {
"position": [0, 0.3, -0.1]
},
"pupil_outer_detail_right": {
"position": [0, 0, -0.1]
},
"pupil_inner_right": {
"position": [0, 0, 0.1]
},
"pupil_inner_closed_right": {
"position": [0, 0.3, -0.1]
},
"pupil_inner_detail_right": {
"position": [0, 0, -0.1]
}
}
@@ -229,33 +193,104 @@
"animation.binacle.hurt": {
"loop": true,
"bones": {
"eye_open_inner_left": {
"pupil_outer_left": {
"position": [0, 0, 0.1]
},
"eyelid_inner_left": {
"rotation": [0, 0, 22.5],
"pupil_outer_closed_left": {
"position": [0, 0, -0.1]
},
"eye_open_outer_left": {
"pupil_outer_closed_left2": {
"position": [0, 0.35, 0]
},
"pupil_inner_left": {
"position": [0, 0, 0.1]
},
"eyelid_outer_left": {
"rotation": [0, 0, -22.5],
"pupil_inner_closed_left": {
"position": [0, 0, -0.1]
},
"eye_open_inner_right": {
"pupil_inner_closed_left2": {
"position": [0, 0.35, 0]
},
"pupil_outer_right": {
"position": [0, 0, 0.1]
},
"eyelid_inner_right": {
"rotation": [0, 0, -22.5],
"pupil_outer_closed_right": {
"position": [0, 0, -0.1]
},
"eye_open_outer_right": {
"pupil_outer_closed_right2": {
"position": [0, 0.35, 0]
},
"pupil_inner_right": {
"position": [0, 0, 0.1]
},
"eyelid_outer_right": {
"rotation": [0, 0, 22.5],
"pupil_inner_closed_right": {
"position": [0, 0, -0.1]
},
"pupil_inner_closed_right2": {
"position": [0, 0.35, 0]
}
}
},
"animation.binacle.render": {
"loop": true,
"bones": {
"neck_left": {
"rotation": [29.6217, -4.9809, 26.1822]
},
"neck_left2": {
"rotation": [-2.28217, -2.57594, -9.6658]
},
"neck_left3": {
"rotation": [-9.9786, 0.3262, -5.0071]
},
"head_left": {
"rotation": [-5, 0, 10]
},
"inner_claw_left": {
"rotation": [0, 0, -12.5]
},
"outer_claw_left": {
"rotation": [0, 0, 12.5]
},
"neck_right": {
"rotation": [-15, 0, -17.5],
"position": [0, -2.5, 0]
},
"neck_right2": {
"rotation": [12.2128, 2.6851, -12.2126]
},
"neck_right3": {
"rotation": [10, 0, 10]
},
"head_right": {
"rotation": [-7.43656, -0.9762, -12.43656]
},
"inner_claw_right": {
"rotation": [0, 0, 12.5]
},
"outer_claw_right": {
"rotation": [0, 0, -12.5]
},
"body": {
"rotation": [0, -12.5, 0]
},
"head_angle_left": {
"rotation": [-12.5, 0, -7.5]
},
"head_angle_right": {
"rotation": [5, 0, 20]
},
"mouth_closed_left": {
"position": [0, 0, 0.3]
},
"mouth_open_left": {
"position": [0, 0, -0.1]
},
"pupil_inner_left": {
"position": [-0.5, 0, 0]
},
"pupil_outer_right": {
"position": [-0.5, 0, 0]
}
}
},
@@ -5,183 +5,241 @@
"loop": true,
"bones": {
"body": {
"position": [0, -5.5, 0]
"position": [0, -4.2, 0]
},
"torso": {
"rotation": [0, 0, 0]
"rotation": [-2.5, 0, 0]
},
"torso2": {
"waist": {
"rotation": [5, 0, 0]
},
"torso3": {
"chest": {
"rotation": [7.5, 0, 0]
},
"arm_left": {
"rotation": [0, 22.5, 35]
"rotation": [0, 5, 35]
},
"arm_left2": {
"rotation": [2.18443, 14.90608, 5.09576]
},
"hand_left": {
"rotation": [0, 17.5, 0]
"rotation": [1.5741, 17.4313, 5.2414]
},
"finger_front_left": {
"rotation": [3.61644, 19.6835, 10.62758]
"rotation": [5.38154, 19.291, 15.91518]
},
"finger_middle_left": {
"rotation": [0, 0, 7.5]
},
"finger_back_left": {
"rotation": [-2.66399, -14.76689, 10.34527]
"rotation": [-4.60669, -14.29059, 18.07777]
},
"arm_right": {
"rotation": [0, -22.5, -35]
"rotation": [0, -5, -35]
},
"arm_right2": {
"rotation": [2.18443, -14.90608, -5.09576]
},
"hand_right": {
"rotation": [0, -17.5, 0]
"rotation": [1.5741, -17.4313, -5.2414]
},
"leg_left": {
"rotation": [-45, -50, -0.00001]
"rotation": [-35, -57.5, -0.00001]
},
"leg_left2": {
"rotation": [55, 0, 0]
"rotation": [40, 0, 0]
},
"foot_left": {
"rotation": [-10, 0, 0]
"rotation": [-5, 0, 0]
},
"leg_right": {
"rotation": [-45, 50, 0.00001]
"rotation": [-35, 57.5, 0.00001]
},
"leg_right2": {
"rotation": [55, 0, 0]
"rotation": [40, 0, 0]
},
"foot_right": {
"rotation": [-10, 0, 0]
"rotation": [-5, 0, 0]
},
"shoulder_arm_left": {
"shoulder_left": {
"rotation": [5, 0, 0]
},
"shoulder_arm_left2": {
"shoulder_left2": {
"rotation": [9.96271, -0.86717, 4.92442]
},
"shoulder_hand_left": {
"rotation": [2.5, 0, 0]
"rotation": [5.0285, 0.2162, 5.0048]
},
"finger_middle_right": {
"rotation": [0, 0, -7.5]
},
"finger_back_right": {
"rotation": [-2.66399, 14.76689, -10.34527]
"rotation": [-4.60669, 14.29059, -18.07777]
},
"shoulder_claw_inner_left": {
"claw_inner_left": {
"rotation": [5, 0, -7.5]
},
"shoulder_claw_middle_left": {
"claw_middle_left": {
"rotation": [5, 0, 0]
},
"shoulder_claw_outer_left": {
"claw_outer_left": {
"rotation": [4.95744, 0.65182, 7.52822]
},
"shoulder_arm_right": {
"shoulder_right": {
"rotation": [5, 0, 0]
},
"shoulder_arm_right2": {
"shoulder_right2": {
"rotation": [9.96271, 0.86717, -4.92442]
},
"shoulder_hand_right": {
"rotation": [2.5, 0, 0]
"rotation": [5.0285, -0.2162, -5.0048]
},
"shoulder_claw_inner_right": {
"claw_inner_right": {
"rotation": [5, 0, 7.5]
},
"shoulder_claw_middle_right": {
"claw_middle_right": {
"rotation": [5, 0, 0]
},
"shoulder_claw_outer_right": {
"claw_outer_right": {
"rotation": [4.95744, -0.65182, -7.52822]
},
"head_finger_left1_3": {
"rotation": [5, 0, 0]
},
"head_finger_left2_3": {
"torso2": {
"rotation": [2.5, 0, 0]
},
"head_finger_right1_3": {
"rotation": [7.5, 0, 0]
"torso3": {
"rotation": [2.5, 0, 0]
},
"head_finger_right2_3": {
"shoulder_arm_left": {
"rotation": [7.7366, -33.7446, 3.8487]
},
"shoulder_arm_left2": {
"rotation": [4.9953, -0.2178, 2.4905]
},
"head_angle": {
"rotation": [5, 0, 0]
},
"head_thumb2": {
"rotation": [-2.50238, -2.49762, 0.10912]
"head_thumb": {
"rotation": [-7.5, 0, 0]
},
"head_thumb3": {
"rotation": [0, -2.5, 0]
"arm_left3": {
"rotation": [3.0947, 22.2971, 8.11]
},
"arm_right3": {
"rotation": [3.0947, -22.2971, -8.11]
},
"shoulder_finger_middle_left": {
"rotation": [2.5, 0, 0]
},
"shoulder_finger_inner_left": {
"rotation": [10, 0, -12.5]
},
"finger_front_right": {
"rotation": [5.38154, -19.291, -15.91518]
},
"shoulder_finger_outer_left": {
"rotation": [9.9627, -0.8672, 14.9244]
},
"shoulder_arm_right": {
"rotation": [7.7366, 33.7446, -3.8487]
},
"shoulder_arm_right2": {
"rotation": [4.9953, 0.2178, -2.4905]
},
"shoulder_finger_inner_right": {
"rotation": [10, 0, 12.5]
},
"shoulder_finger_middle_right": {
"rotation": [2.5, 0, 0]
},
"shoulder_finger_outer_right": {
"rotation": [9.9627, 0.8672, -14.9244]
},
"head_thumb2": {
"rotation": [0, -17.5, 0]
}
}
},
"animation.barbaracle.blink": {
"animation_length": 0.1667,
"bones": {
"eyelid_left": {
"pupil_left": {
"position": {
"0.0": [0, 0, 0.1],
"0.125": {"pre": [0, 0, 0.1], "post": [0, 0, 0.1]},
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0.1]}
}
},
"pupil_right": {
"position": {
"0.0": [0, 0, 0.1],
"0.125": {"pre": [0, 0, 0.1], "post": [0, 0, 0.1]},
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0.1]}
}
},
"pupil_closed_left": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": {"pre": [0, 0, -0.1], "post": [0, 0, -0.1]},
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"eyelid_right": {
"pupil_closed_right": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": {"pre": [0, 0, -0.1], "post": [0, 0, -0.1]},
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
}
}
},
"animation.barbaracle.blink2": {
"animation_length": 0.1667,
"bones": {
"shoulder_eyelid_left": {
},
"pupil_shoulder_left": {
"position": {
"0.0": [0, 0, 0.1],
"0.125": {"pre": [0, 0, 0.1], "post": [0, 0, 0.1]},
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0.1]}
}
},
"pupil_shoulder_closed_left": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": {"pre": [0, 0, -0.1], "post": [0, 0, -0.1]},
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
}
}
},
"animation.barbaracle.blink3": {
"animation_length": 0.1667,
"bones": {
"shoulder_eyelid_right": {
},
"pupil_shoulder_right": {
"position": {
"0.0": [0, 0, 0.1],
"0.125": {"pre": [0, 0, 0.1], "post": [0, 0, 0.1]},
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0.1]}
}
},
"pupil_shoulder_closed_right": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": {"pre": [0, 0, -0.1], "post": [0, 0, -0.1]},
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
}
}
},
"animation.barbaracle.blink4": {
"animation_length": 0.1667,
"bones": {
"hand_eyelid_left": {
},
"pupil_hand_left": {
"position": {
"0.0": [0, 0.1, 0],
"0.125": {"pre": [0, 0.1, 0], "post": [0, 0.1, 0]},
"0.1667": {"pre": [0, 0.1, 0], "post": [0, 0, 0]}
}
},
"pupil_hand_closed_left": {
"position": {
"0.0": [0, -0.1, 0],
"0.125": {"pre": [0, -0.1, 0], "post": [0, -0.1, 0]},
"0.1667": {"pre": [0, -0.1, 0], "post": [0, 0, 0]}
}
}
}
},
"animation.barbaracle.blink5": {
"animation_length": 0.1667,
"bones": {
"hand_eyelid_right": {
},
"pupil_hand_right": {
"position": {
"0.0": [0, 0.1, 0],
"0.125": {"pre": [0, 0.1, 0], "post": [0, 0.1, 0]},
"0.1667": {"pre": [0, 0.1, 0], "post": [0, 0, 0]}
}
},
"pupil_hand_closed_right": {
"position": {
"0.0": [0, -0.1, 0],
"0.125": {"pre": [0, -0.1, 0], "post": [0, -0.1, 0]},
@@ -194,80 +252,353 @@
"loop": true,
"bones": {
"pupil_left": {
"position": [0, -0.25, 0],
"scale": [1, 0.4, 1]
"position": [0, -0.4, 0],
"scale": [0.6, 0.6, 1]
},
"pupil_right": {
"position": [0, -0.25, 0],
"scale": [1, 0.4, 1]
"position": [0, -0.4, 0],
"scale": [0.6, 0.6, 1]
},
"pupil_shoulder_left": {
"position": [0, -0.5, 0],
"scale": [0.6, 0.6, 1]
},
"pupil_shoulder_closed_left": {
"scale": [1, 0.9, 1]
},
"pupil_shoulder_right": {
"position": [0, -0.5, 0],
"scale": [0.6, 0.6, 1]
},
"pupil_hand_left": {
"position": [-0.5, 0, 0],
"scale": [0.6, 1, 0.6]
},
"pupil_hand_right": {
"position": [0.5, 0, 0],
"scale": [0.6, 1, 0.6]
},
"mouth_closed": {
"position": [0, 0, 0.1]
},
"mouth_open": {
"position": [0, 0, -0.1]
},
"head_eyebrow": {
"position": [0, 0.5, 0]
}
}
},
"animation.barbaracle.angry": {
"loop": true,
"bones": {
"eye_expression_left": {
"position": [0, 0, -0.1]
},
"head_eyebrow": {
"position": [0, 0.2, 0]
},
"eye_expression_right": {
"position": [0, 0, -0.1]
}
}
},
"animation.barbaracle.sad": {
"loop": true,
"bones": {
"eye_expression_left": {
"position": [1, 0.25, -0.1]
},
"eye_expression_right": {
"position": [-1, 0.25, -0.1]
},
"head_eyebrow": {
"position": [0, 0.25, 0]
}
}
},
"animation.barbaracle.happy": {
"loop": true,
"bones": {
"pupil_left": {
"position": [0, 0, 0.1]
},
"pupil_right": {
"position": [0, 0, 0.1]
},
"pupil_closed_left": {
"position": [0, 0, -0.1]
},
"pupil_closed_left3": {
"position": [0, 0, -0.1]
},
"pupil_closed_right": {
"position": [0, 0, -0.1]
},
"pupil_closed_right3": {
"position": [0, 0, -0.1]
},
"pupil_shoulder_left": {
"position": [0, 0, 0.1]
},
"pupil_shoulder_closed_left": {
"position": [0, 0, -0.1]
},
"pupil_shoulder_closed_left3": {
"position": [0, 0, -0.1]
},
"pupil_shoulder_right": {
"position": [0, 0, 0.1]
},
"pupil_shoulder_closed_right": {
"position": [0, 0, -0.1]
},
"pupil_shoulder_closed_right3": {
"position": [0, 0, -0.1]
},
"pupil_hand_left": {
"position": [0, 0.1, 0]
},
"pupil_hand_closed_left": {
"position": [0, -0.1, 0]
},
"pupil_hand_closed_left3": {
"position": [0, -0.1, 0]
},
"pupil_hand_right": {
"position": [0, 0.1, 0]
},
"pupil_hand_closed_right": {
"position": [0, -0.1, 0]
},
"pupil_hand_closed_right3": {
"position": [0, -0.1, 0]
},
"mouth_closed": {
"position": [0, 0, 0.1]
},
"mouth_open": {
"position": [0, 0, -0.1]
},
"head_eyebrow": {
"position": [0, 0.5, 0]
},
"eyelid_happy_left": {
"position": [0, 0, -0.1]
},
"eyelid_happy_right": {
"position": [0, 0, -0.1]
}
}
},
"animation.barbaracle.hurt": {
"loop": true,
"bones": {
"eyelid_recoil_left": {
"pupil_left": {
"position": [0, 0, 0.1]
},
"pupil_right": {
"position": [0, 0, 0.1]
},
"pupil_closed_left1": {
"position": [0, -0.2, 0]
},
"pupil_closed_left": {
"position": [0, 0, -0.1]
},
"eyelid_recoil_right": {
"pupil_closed_left2": {
"position": [0, 0.1, 0]
},
"pupil_closed_right": {
"position": [0, 0, -0.1]
},
"pupil_closed_right1": {
"position": [0, -0.2, 0]
},
"pupil_closed_right2": {
"position": [0, 0.1, 0]
},
"pupil_shoulder_left": {
"position": [0, 0, 0.1]
},
"pupil_shoulder_closed_left": {
"position": [0, 0, -0.1]
},
"pupil_shoulder_closed_left1": {
"position": [0, -0.2, 0]
},
"pupil_shoulder_closed_left2": {
"position": [0, 0.25, 0]
},
"pupil_shoulder_right": {
"position": [0, 0, 0.1]
},
"pupil_shoulder_closed_right": {
"position": [0, 0, -0.1]
},
"pupil_shoulder_closed_right1": {
"position": [0, -0.2, 0]
},
"pupil_shoulder_closed_right2": {
"position": [0, 0.25, 0]
},
"pupil_hand_left": {
"position": [0, 0.1, 0]
},
"pupil_hand_closed_left": {
"position": [0, -0.1, 0]
},
"pupil_hand_closed_left1": {
"position": [-0.15, 0, 0]
},
"pupil_hand_closed_left2": {
"position": [0.25, 0, 0]
},
"pupil_hand_right": {
"position": [0, 0.1, 0]
},
"pupil_hand_closed_right": {
"position": [0, -0.1, 0]
},
"pupil_hand_closed_right1": {
"position": [0.15, 0, 0]
},
"pupil_hand_closed_right2": {
"position": [-0.25, 0, 0]
}
}
},
"animation.barbaracle.render": {
"loop": true,
"bones": {
"body": {
"rotation": [0, 22.5, 0],
"position": [0, -5.15, 0]
},
"torso": {
"rotation": [5, 0, 0]
},
"waist": {
"rotation": [5, 0, 0]
},
"chest": {
"rotation": [7.5, 0, 0]
},
"arm_left": {
"rotation": [11.5511, 18.5668, 36.0517]
},
"arm_left2": {
"rotation": [1.51733, 14.98688, 2.50956]
},
"hand_left": {
"rotation": [2.3567, 17.3455, 7.8596]
},
"finger_front_left": {
"rotation": [-0.00006, 20, -0.00002]
},
"finger_middle_left": {
"rotation": [0, 0, -5]
},
"finger_back_left": {
"rotation": [-4.89709, -24.25639, 18.95427]
},
"arm_right": {
"rotation": [23.7134, 28.0591, -56.9661]
},
"arm_right2": {
"rotation": [0.81923, -20.29228, 10.12704]
},
"hand_right": {
"rotation": [-6.1549, -16.4136, 20.8884]
},
"leg_left": {
"rotation": [-16.2776, -74.3753, -32.88211]
},
"leg_left2": {
"rotation": [40, 0, 0]
},
"foot_left": {
"rotation": [7.4365, -0.9762, 7.4365]
},
"leg_right": {
"rotation": [-32.3785, 61.2987, 14.81371]
},
"leg_right2": {
"rotation": [45, 0, 0]
},
"foot_right": {
"rotation": [0, 0, -7.5]
},
"shoulder_left": {
"rotation": [5, 0, 0]
},
"shoulder_left2": {
"rotation": [9.96271, -0.86717, 4.92442]
},
"shoulder_hand_left": {
"rotation": [5.0285, 0.2162, 5.0048]
},
"finger_middle_right": {
"rotation": [0, 0, -7.5]
},
"finger_back_right": {
"rotation": [-4.60669, 14.29059, -18.07777]
},
"claw_inner_left": {
"rotation": [5, 0, -7.5]
},
"claw_middle_left": {
"rotation": [5, 0, 0]
},
"claw_outer_left": {
"rotation": [4.95744, 0.65182, 7.52822]
},
"shoulder_right": {
"rotation": [5, 0, 0]
},
"shoulder_right2": {
"rotation": [9.96271, 0.86717, -4.92442]
},
"shoulder_hand_right": {
"rotation": [0.0285, -0.2162, -5.0048]
},
"claw_inner_right": {
"rotation": [5, 0, 7.5]
},
"claw_middle_right": {
"rotation": [5, 0, 0]
},
"claw_outer_right": {
"rotation": [4.95744, -0.65182, -7.52822]
},
"torso2": {
"rotation": [0, 0, 0]
},
"torso3": {
"rotation": [-2.5096, -4.9952, 0.2186]
},
"shoulder_arm_left": {
"rotation": [17.5227, -34.4394, 21.9663]
},
"shoulder_arm_left2": {
"rotation": [4.9953, -0.2178, 2.4905]
},
"head_angle": {
"rotation": [5.0047, -2.4905, -0.218]
},
"head_thumb": {
"rotation": [-7.5, 0, 0]
},
"arm_left3": {
"rotation": [2.0675, 22.4097, 5.4096]
},
"arm_right3": {
"rotation": [4.2903, -17.8334, 7.1016]
},
"shoulder_finger_middle_left": {
"rotation": [2.5, 0, 0]
},
"shoulder_finger_inner_left": {
"rotation": [10, 0, -12.5]
},
"finger_front_right": {
"rotation": [5.38154, -19.291, -15.91518]
},
"shoulder_finger_outer_left": {
"rotation": [9.9627, -0.8672, 14.9244]
},
"shoulder_arm_right": {
"rotation": [34.2917, 46.109, -1.4401]
},
"shoulder_arm_right2": {
"rotation": [2.4953, 0.2178, -2.4905]
},
"shoulder_finger_inner_right": {
"rotation": [0, 0, 12.5]
},
"shoulder_finger_middle_right": {
"rotation": [2.5, 0, 0]
},
"shoulder_finger_outer_right": {
"rotation": [9.9627, 0.8672, -14.9244]
},
"head_thumb2": {
"rotation": [0, -17.5, 0]
},
"pupil_right": {
"position": [0.25, 0, 0]
},
"pupil_shoulder_left": {
"position": [-0.5, 0, 0]
},
"pupil_shoulder_right": {
"position": [0.5, 0, 0]
},
"pupil_hand_left": {
"position": [0, 0, -0.5]
},
"pupil_hand_right": {
"position": [0, 0, -0.5]
}
}
},
@@ -0,0 +1,405 @@
{
"format_version": "1.8.0",
"animations": {
"animation.helioptile.ground_idle": {
"loop": true,
"bones": {
"body": {
"position": [0, -0.25, 0]
},
"torso": {
"rotation": ["-2*Math.cos((query.anim_time-0.25) * 90 * 2) *0.5", 0, 0],
"position": [0, 0, "0.25*Math.cos((query.anim_time-0) * 90 * 2) *0.5"]
},
"torso2": {
"rotation": ["-52.5-2*Math.cos((query.anim_time-0.5) * 90 * 2) *0.5", 0, 0]
},
"head": {
"rotation": ["-5-4*Math.cos((query.anim_time-0.75) * 90 * 2) *0.5", 0, 0]
},
"tail": {
"rotation": [
"15-6*Math.cos((query.anim_time-0.25) * 90 * 2) *0.5",
"-4*Math.cos((query.anim_time-0.5) * 90 * 1) *0.5",
"-12*Math.cos((query.anim_time-0.0) * 90 * 1) *0.5"
]
},
"tail2": {
"rotation": ["10-8*Math.cos((query.anim_time-0.5) * 90 * 2) *0.5", 0, "-22*Math.cos((query.anim_time-0.25) * 90 * 1) *0.5"]
},
"leg_right": {
"rotation": [0, 0, "-25-3*Math.cos((query.anim_time-0) * 90 * 2) *0.5"]
},
"leg_right2": {
"rotation": [0, 0, "-70+3*Math.cos((query.anim_time-0) * 90 * 2) *0.5"]
},
"foot_right": {
"rotation": [2.4148, -0.6468, 4.9863]
},
"arm_left": {
"rotation": [43.6985, 41.9981, "54.9995-4*Math.cos((query.anim_time-0.75) * 90 * 2) *0.5"]
},
"arm_left2": {
"rotation": [0, "22.5+3*Math.cos((query.anim_time-0.0) * 90 * 2) *0.5", 0]
},
"hand_left": {
"rotation": [0, 0, 25]
},
"finger_front_left": {
"rotation": [0, 0, 25]
},
"finger_middle_left": {
"rotation": [0, 0, 25]
},
"finger_back_left": {
"rotation": [0, 0, 25]
},
"tail3": {
"rotation": [22.5, 0, "-32*Math.cos((query.anim_time-0.0) * 90 * 1) *0.5"]
},
"tail4": {
"rotation": [27.5, 0, "-42*Math.cos((query.anim_time-0.5) * 90 * 1) *0.5"]
},
"neck": {
"rotation": [-22.5, 0, 0]
},
"arm_right": {
"rotation": [43.6985, -41.9981, "-54.9995+4*Math.cos((query.anim_time-0.75) * 90 * 2) *0.5"]
},
"arm_right2": {
"rotation": [0, "-22.5-3*Math.cos((query.anim_time-0.0) * 90 * 2) *0.5", 0]
},
"hand_right": {
"rotation": [0, 0, -25]
},
"finger_front_right": {
"rotation": [0, 0, -25]
},
"finger_middle_right": {
"rotation": [0, 0, -25]
},
"finger_back_right": {
"rotation": [0, 0, -25]
},
"leg_left": {
"rotation": [0, 0, "25+3*Math.cos((query.anim_time-0) * 90 * 2) *0.5"]
},
"leg_left2": {
"rotation": [0, 0, "70-3*Math.cos((query.anim_time-0) * 90 * 2) *0.5"]
},
"foot_left": {
"rotation": [2.4148, 0.6468, -4.9863]
},
"frill_right": {
"rotation": [0, "-0-6*Math.cos((query.anim_time-0.0) * 90 * 2) *0.5", "-60+4*Math.cos((query.anim_time-0.0) * 90 * 2) *0.5"]
},
"ear_right2": {
"rotation": [0, 0, "-20+4*Math.cos((query.anim_time-0.25) * 90 * 2) *0.5"]
},
"ear_right3": {
"rotation": [0, 0, "-25+4*Math.cos((query.anim_time-0.5) * 90 * 2) *0.5"]
},
"frill_left": {
"rotation": [0, "0+6*Math.cos((query.anim_time-0.0) * 90 * 2) *0.5", "60-4*Math.cos((query.anim_time-0.0) * 90 * 2) *0.5"]
},
"ear_left2": {
"rotation": [0, 0, "20-4*Math.cos((query.anim_time-0.25) * 90 * 2) *0.5"]
},
"ear_left3": {
"rotation": [0, 0, "25-4*Math.cos((query.anim_time-0.5) * 90 * 2) *0.5"]
},
"frill_open_right": {
"scale": 0
},
"frill_open_left": {
"scale": 0
},
"waist": {
"rotation": [82.5, 0, 0]
},
"leg_left_rotation": {
"rotation": [0, 30, 0],
"position": ["0.04*Math.cos((query.anim_time-0) * 90 * 2) *0.5", "0.2*Math.cos((query.anim_time-0) * 90 * 2) *0.5", 0]
},
"leg_right_rotation": {
"rotation": [0, -30, 0],
"position": ["-0.04*Math.cos((query.anim_time-0) * 90 * 2) *0.5", "0.2*Math.cos((query.anim_time-0) * 90 * 2) *0.5", 0]
}
}
},
"animation.helioptile.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]}
}
},
"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]}
}
},
"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.1]
},
"eyes_blink_ditto": {
"position": [0, 0, -0.1]
}
}
},
"animation.helioptile.ditto_face": {
"loop": true,
"bones": {
"face": {
"position": [0, 0, 0.1],
"scale": 0
},
"face_ditto": {
"position": [0, 0, -0.1]
}
}
},
"animation.helioptile.pose": {
"loop": true,
"bones": {
"body": {
"rotation": [0, -55, 0]
},
"torso": {
"rotation": [75, 0, 0]
},
"torso2": {
"rotation": [-40, 0, 0]
},
"head": {
"rotation": [-34.3534, 66.6292, -32.4468]
},
"tail": {
"rotation": [27.5, 0, 0]
},
"tail2": {
"rotation": [22.5, 0, 0]
},
"leg_right": {
"rotation": [-2.4616, 6.9887, -30.9789]
},
"leg_right2": {
"rotation": [0, 0, -72.5]
},
"foot_right": {
"rotation": [0, -1, 12.5]
},
"arm_left": {
"rotation": [17.9474, 14.645, 52.325]
},
"arm_left2": {
"rotation": [0, 30, 0]
},
"hand_left": {
"rotation": [0, 0, 27.5]
},
"finger_front_left": {
"rotation": [0, 0, 25]
},
"finger_middle_left": {
"rotation": [0, 0, 25]
},
"finger_back_left": {
"rotation": [0, 0, 25]
},
"tail3": {
"rotation": [-12.5, 0, 0]
},
"tail4": {
"rotation": [-22.5, 0, 0]
},
"neck": {
"rotation": [-27.5, 0, 0]
},
"arm_right": {
"rotation": [17.9474, -14.645, -52.325]
},
"arm_right2": {
"rotation": [0, -30, 0]
},
"hand_right": {
"rotation": [0, 0, -27.5]
},
"finger_front_right": {
"rotation": [0, 0, -25]
},
"finger_middle_right": {
"rotation": [0, 0, -25]
},
"finger_back_right": {
"rotation": [0, 0, -25]
},
"leg_left": {
"rotation": [12.1245, 16.4236, 31.3082]
},
"leg_left2": {
"rotation": [0, 0, 72.5]
},
"foot_left": {
"rotation": [0, 1, -12.5]
},
"frill_right": {
"rotation": [10.8923, -5.1377, -51.2382]
},
"ear_right3": {
"rotation": [0, 0, -17.5]
},
"ear_right2": {
"rotation": [0, 0, -17.5]
},
"frill_left": {
"rotation": [0, 0, 60]
},
"ear_left2": {
"rotation": [0, 0, 20]
},
"ear_left3": {
"rotation": [0, 0, 20]
},
"frill_open_right": {
"scale": 0
},
"frills": {
"scale": 1
},
"frill_open_left": {
"scale": 0
}
}
},
"animation.helioptile.happy": {
"loop": true,
"bones": {
"eye_left": {
"position": [0, 0, 0.1]
},
"eye_right": {
"position": [0, 0, 0.1]
},
"mouth_closed": {
"position": [0, 0, 0.1]
},
"eyelid_happy_right": {
"position": [0, 0, -0.1]
},
"eyelid_happy_left": {
"position": [0, 0, -0.1]
},
"mouth_open_smile": {
"position": [0, 0, -0.1]
}
}
},
"animation.helioptile.angry": {
"loop": true,
"bones": {
"mouth_closed": {
"position": [0, 0, 0.1]
},
"eyelid_angry_right": {
"position": [0, 0, -0.1]
},
"eyelid_angry_left": {
"position": [0, 0, -0.1]
},
"mouth_open": {
"position": [0, 0, -0.1]
}
}
},
"animation.helioptile.sad": {
"loop": true,
"bones": {
"mouth_closed": {
"position": [0, 0, 0.1]
},
"eyelid_sad_right": {
"position": [0, 0, -0.1]
},
"eyelid_sad_left": {
"position": [0, 0, -0.1]
},
"mouth_closed_frown": {
"position": [0, 0, -0.1]
}
}
},
"animation.helioptile.hurt": {
"loop": true,
"bones": {
"eye_left": {
"position": [0, 0, 0.1]
},
"eye_right": {
"position": [0, 0, 0.1]
},
"mouth_closed": {
"position": [0, 0, 0.1]
},
"eyelid_hit_right": {
"position": [0, 0, -0.1]
},
"eyelid_hit_left": {
"position": [0, 0, -0.1]
},
"mouth_open": {
"position": [0, 0, -0.1]
}
}
},
"animation.helioptile.shocked": {
"loop": true,
"bones": {
"mouth_closed": {
"position": [0, 0, 0.1]
},
"mouth_open": {
"position": [0, 0, -0.1]
},
"pupil_left": {
"scale": [0.7, 0.7, 1]
},
"pupil_right": {
"scale": [0.7, 0.7, 1]
}
}
},
"animation.helioptile.annoyed": {
"loop": true,
"bones": {
"mouth_closed": {
"position": [0, 0, 0.1]
},
"eyelid_annoyed_right": {
"position": [0, 0, -0.1]
},
"eyelid_annoyed_left": {
"position": [0, 0, -0.1]
},
"mouth_closed_neutral": {
"position": [0, 0, -0.1]
}
}
}
}
}
@@ -0,0 +1,568 @@
{
"format_version": "1.8.0",
"animations": {
"animation.heliolisk.ground_idle": {
"loop": true,
"bones": {
"torso": {
"rotation": ["15-2*Math.cos((query.anim_time-0.0) * 90 * 2) *0.5", 0, 0],
"position": [0, "0.55*Math.cos((query.anim_time-0) * 90 * 2) *0.5", 0]
},
"tail": {
"rotation": [
"-35-6*Math.cos((query.anim_time-0.0) * 90 * 2) *0.5",
"-4*Math.cos((query.anim_time-0.25) * 90 * 1) *0.5",
"-12*Math.cos((query.anim_time-0.75) * 90 * 1) *0.5"
]
},
"tail2": {
"rotation": ["35-8*Math.cos((query.anim_time-0.25) * 90 * 2) *0.5", 0, "-22*Math.cos((query.anim_time-0.0) * 90 * 1) *0.5"]
},
"tail3": {
"rotation": [42.5, 0, "-32*Math.cos((query.anim_time-0.75) * 90 * 1) *0.5"]
},
"leg_right": {
"rotation": ["-42.5+5*Math.cos((query.anim_time-0) * 90 * 2) *0.5", 37.5, 7.5],
"position": [
"-0.2*Math.cos((query.anim_time-0) * 90 * 2) *0.5",
"0.67*Math.cos((query.anim_time-0) * 90 * 2) *0.5",
"-0.3*Math.cos((query.anim_time-0) * 90 * 2) *0.5"
]
},
"foot_right": {
"rotation": ["-27.5+5*Math.cos((query.anim_time-0) * 90 * 2) *0.5", 7.5, 0]
},
"leg_left": {
"rotation": ["-42.5+5*Math.cos((query.anim_time-0) * 90 * 2) *0.5", -37.5, -7.5],
"position": [
"0.2*Math.cos((query.anim_time-0) * 90 * 2) *0.5",
"0.67*Math.cos((query.anim_time-0) * 90 * 2) *0.5",
"-0.3*Math.cos((query.anim_time-0) * 90 * 2) *0.5"
]
},
"foot_left": {
"rotation": ["-27.5+5*Math.cos((query.anim_time-0) * 90 * 2) *0.5", -7.5, 0]
},
"frill_down_front": {
"rotation": [-45, 0, 0]
},
"frill_down_back": {
"rotation": [45, 0, 0]
},
"frill_down_left": {
"rotation": [0, 0, -45]
},
"frill_down_right": {
"rotation": [0, 0, 45]
},
"arm_left": {
"rotation": [1.89098, 19.11433, "44.07649-4*Math.cos((query.anim_time-0.5) * 90 * 2) *0.5"]
},
"arm_left2": {
"rotation": [0, "40+5*Math.cos((query.anim_time-0.75) * 90 * 2) *0.5", 0]
},
"hand_left_finger": {
"rotation": [0, 0, 22.5]
},
"hand_left_finger2": {
"rotation": [0, 10, 22.5]
},
"hand_left_finger3": {
"rotation": [0, -10, 22.5]
},
"arm_right": {
"rotation": [1.89098, -19.11433, "-44.07649+4*Math.cos((query.anim_time-0.5) * 90 * 2) *0.5"]
},
"arm_right2": {
"rotation": [0, "-40-5*Math.cos((query.anim_time-0.75) * 90 * 2) *0.5", 0]
},
"hand_right_finger": {
"rotation": [0, 0, -22.5]
},
"hand_right_finger2": {
"rotation": [0, -10, -22.5]
},
"hand_right_finger3": {
"rotation": [0, 10, -22.5]
},
"tail4": {
"rotation": ["27.5-18*Math.cos((query.anim_time-0.75) * 90 * 2) *0.5", 0, "-42*Math.cos((query.anim_time-0.25) * 90 * 1) *0.5"]
},
"tail5": {
"rotation": ["-37.5-18*Math.cos((query.anim_time-0.5) * 90 * 2) *0.5", 0, "-42*Math.cos((query.anim_time-0.0) * 90 * 1) *0.5"]
},
"tail6": {
"rotation": ["-37.5-18*Math.cos((query.anim_time-0.25) * 90 * 2) *0.5", 0, "-42*Math.cos((query.anim_time-0.75) * 90 * 1) *0.5"]
},
"toes_left": {
"rotation": ["-15-5*Math.cos((query.anim_time-0) * 90 * 2) *0.5", 0, 0]
},
"toes_right": {
"rotation": ["-15-5*Math.cos((query.anim_time-0) * 90 * 2) *0.5", 0, 0]
},
"hand_left": {
"rotation": [0, 0, "22.5-5*Math.cos((query.anim_time-0.0) * 90 * 2) *0.5"],
"position": [-0.25, 0, 0]
},
"hand_right": {
"rotation": [0, 0, "-22.5+5*Math.cos((query.anim_time-0.0) * 90 * 2) *0.5"],
"position": [0.25, 0, 0]
},
"frills_open": {
"scale": 0
},
"leg_left2": {
"rotation": ["-5*Math.cos((query.anim_time-0) * 90 * 2) *0.5", 0, 0]
},
"eye_unamused_left": {
"scale": 1
},
"eye_angry_left": {
"scale": 0
},
"eye_sad_left": {
"scale": 0
},
"eye_happy_left": {
"scale": 0
},
"eye_recoil_left": {
"scale": 0
},
"eye_surprise_left": {
"scale": 0
},
"eye_blink_left": {
"scale": 0
},
"eye_unamused_right": {
"scale": 1
},
"eye_blink_right": {
"scale": 0
},
"eye_angry_right": {
"scale": 0
},
"eye_sad_right": {
"scale": 0
},
"eye_happy_right": {
"scale": 0
},
"eye_recoil_right": {
"scale": 0
},
"eye_surprise_right": {
"scale": 0
},
"leg_right2": {
"rotation": ["-5*Math.cos((query.anim_time-0) * 90 * 2) *0.5", 0, 0]
},
"torso2": {
"rotation": ["-5-2*Math.cos((query.anim_time-0.25) * 90 * 2) *0.5", 0, 0]
},
"neck": {
"rotation": [0, 0, 0]
},
"head": {
"rotation": ["10-4*Math.cos((query.anim_time-0.75) * 90 * 2) *0.5", 0, 0]
},
"jaw": {
"rotation": ["4-4*Math.cos((query.anim_time-0.0) * 90 * 2) *0.5", 0, 0]
},
"neck2": {
"rotation": ["-7.5-2*Math.cos((query.anim_time-0.5) * 90 * 2) *0.5", 0, 0]
}
}
},
"animation.heliolisk.blink": {
"animation_length": 0.1667,
"bones": {
"ditto_eyelid_left": {
"position": {
"0.0": [0, 0, -0.1],
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"ditto_eyelid_right": {
"position": {
"0.0": [0, 0, -0.1],
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"eyelid_right_neutral": {
"position": {
"0.0": [0.1, 0, 0],
"0.1667": {"pre": [0.1, 0, 0], "post": [0, 0, 0]}
}
},
"eyelid_right_closed": {
"position": {
"0.0": [-0.1, 0, 0],
"0.1667": {"pre": [-0.1, 0, 0], "post": [0, 0, 0]}
}
},
"eyelid_left_neutral": {
"position": {
"0.0": [-0.1, 0, 0],
"0.1667": {"pre": [-0.1, 0, 0], "post": [0, 0, 0]}
}
},
"eyelid_left_closed": {
"position": {
"0.0": [0.1, 0, 0],
"0.1667": {"pre": [0.1, 0, 0], "post": [0, 0, 0]}
}
}
}
},
"animation.heliolisk.ditto_face": {
"loop": true,
"bones": {
"eyes": {
"scale": 0
},
"ditto_eye_left": {
"position": [0.1, 0, 0]
},
"ditto_eye_right": {
"position": [-0.1, 0, 0]
}
}
},
"animation.heliolisk.frill_test": {
"loop": "hold_on_last_frame",
"animation_length": 1,
"bones": {
"torso": {
"rotation": {
"0.0": [7.5, 0, 0],
"0.2917": [7.5, 0, 0],
"0.5": [40, 0, 0]
}
},
"tail": {
"rotation": [-50, 0, 0]
},
"tail2": {
"rotation": [22.5, 0, 0]
},
"tail3": {
"rotation": [22.5, 0, 0]
},
"leg_right": {
"rotation": [-45, 35, 0]
},
"foot_right": {
"rotation": [-30, 0, 0]
},
"leg_left": {
"rotation": [-45, -15, -15],
"position": [1, 0, 0]
},
"foot_left": {
"rotation": [-25, -7.5, 0]
},
"frill_down_front": {
"rotation": [-45, 0, 0]
},
"frill_down_back": {
"rotation": [45, 0, 0]
},
"frill_down_left": {
"rotation": [0, 0, -45]
},
"frill_down_right": {
"rotation": [0, 0, 45]
},
"arm_left": {
"rotation": {
"0.0": [1.89098, 19.11433, 44.07649],
"0.2917": [1.89, 19.11, 44.08],
"0.5": [-90, 0, 17.5]
}
},
"arm_left2": {
"rotation": {
"0.0": [0, 40, 0],
"0.3333": [0, 40, 0],
"0.5": [0, 20, 0]
}
},
"hand_left_finger": {
"rotation": [0, 0, 22.5]
},
"hand_left_finger2": {
"rotation": [0, 10, 22.5]
},
"hand_left_finger3": {
"rotation": [0, -10, 22.5]
},
"arm_right": {
"rotation": {
"0.0": [1.89098, -19.11433, -44.07649],
"0.2917": [1.89, -19.11, -44.08],
"0.5": [-90, 0, -17.5]
}
},
"arm_right2": {
"rotation": {
"0.0": [0, -40, 0],
"0.3333": [0, -40, 0],
"0.5": [0, -20, 0]
}
},
"hand_right_finger": {
"rotation": [0, 0, -22.5]
},
"hand_right_finger2": {
"rotation": [0, -10, -22.5]
},
"hand_right_finger3": {
"rotation": [0, 10, -22.5]
},
"tail4": {
"rotation": [22.5, 0, 0]
},
"tail5": {
"rotation": [22.5, 0, 0]
},
"tail6": {
"rotation": [-22.5, 0, 0]
},
"toes_left": {
"rotation": [-15, 0, 0]
},
"toes_right": {
"rotation": [-15, 0, 0]
},
"torso2": {
"rotation": {
"0.0": [0, 0, 0],
"0.2917": [0, 0, 0],
"0.5": [15, 0, 0]
}
},
"frills_down2": {
"rotation": {
"0.0": [0, 0, 0],
"0.2917": [0, 0, 0],
"0.3333": [-7.5, 0, 0]
},
"position": {
"0.0": [0, 0, 0],
"0.2917": [0, 0, 0],
"0.3333": [0, 0.6, 0]
},
"scale": {
"0.0": [1, 1, 1],
"0.2917": [1, 1, 1],
"0.3333": [2, 0.1, 2],
"0.375": {"pre": [2, 0.1, 2], "post": [0, 0, 0]}
}
},
"hand_left": {
"rotation": [0, 0, 22.5],
"position": [-0.25, 0, 0]
},
"hand_right": {
"rotation": [0, 0, -22.5],
"position": [0.25, 0, 0]
},
"frills_down3": {
"scale": {
"0.0": [1, 1, 1],
"0.4583": {"pre": [1, 1, 1], "post": [0, 0, 0]}
}
},
"head": {
"rotation": {
"0.0": [0, 0, 0],
"0.2917": [0, 0, 0],
"0.5": [-35, 0, 0]
}
},
"jaw": {
"rotation": {
"0.0": [0, 0, 0],
"0.2917": [0, 0, 0],
"0.5": [45, 0, 0]
}
},
"frills_open": {
"rotation": {
"0.0": [0, 0, 0],
"0.3333": {
"pre": [-55, 0, 0],
"post": [-55, 0, 0],
"lerp_mode": "catmullrom"
},
"0.4583": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
}
},
"position": {
"0.0": [0, 0, 0],
"0.3333": {
"pre": [0, -5.25, 0],
"post": [0, -5.25, 0],
"lerp_mode": "catmullrom"
},
"0.4583": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
}
},
"scale": {
"0.0": [0, 0, 0],
"0.3333": {"pre": [0, 0, 0], "post": [1, 1, 1]}
}
},
"leg_left2": {
"rotation": [0, -10, 0]
},
"eye_unamused_left": {
"scale": 1
},
"eye_angry_left": {
"scale": 0
},
"eye_sad_left": {
"scale": 0
},
"eye_happy_left": {
"scale": 0
},
"eye_recoil_left": {
"scale": 0
},
"eye_surprise_left": {
"scale": 0
},
"eye_blink_left": {
"scale": 0
},
"eye_unamused_right": {
"scale": 1
},
"eye_blink_right": {
"scale": 0
},
"eye_angry_right": {
"scale": 0
},
"eye_sad_right": {
"scale": 0
},
"eye_happy_right": {
"scale": 0
},
"eye_recoil_right": {
"scale": 0
},
"eye_surprise_right": {
"scale": 0
},
"frills_down": {
"scale": {
"0.375": [1, 1, 1],
"0.4167": [0, 0, 0]
}
}
}
},
"animation.heliolisk.happy": {
"loop": true,
"bones": {
"jaw": {
"rotation": [30, 0, 0]
},
"eyelid_right_neutral": {
"position": [0.1, 0, 0]
},
"eyelid_right_happy": {
"position": [-0.1, 0, 0]
},
"eyelid_left_neutral": {
"position": [-0.1, 0, 0]
},
"eyelid_left_happy": {
"position": [0.1, 0, 0]
}
}
},
"animation.heliolisk.angry": {
"loop": true,
"bones": {
"eyelid_right_neutral": {
"position": [0.1, 0, 0]
},
"eyelid_right_angry": {
"position": [-0.1, 0, 0]
},
"eyelid_left_neutral": {
"position": [-0.1, 0, 0]
},
"eyelid_left_angry": {
"position": [0.1, 0, 0]
}
}
},
"animation.heliolisk.sad": {
"loop": true,
"bones": {
"eyelid_right_neutral": {
"position": [0.1, 0, 0]
},
"eyelid_right_sad": {
"position": [-0.1, 0, 0]
},
"eyelid_left_neutral": {
"position": [-0.1, 0, 0]
},
"eyelid_left_sad": {
"position": [0.1, 0, 0]
}
}
},
"animation.heliolisk.hurt": {
"loop": true,
"bones": {
"jaw": {
"rotation": [30, 0, 0]
},
"eyelid_right_neutral": {
"position": [0.1, 0, 0]
},
"eyelid_right_hit": {
"position": [-0.1, 0, 0]
},
"eyelid_left_neutral": {
"position": [-0.1, 0, 0]
},
"eyelid_left_hit": {
"position": [0.1, 0, 0]
}
}
},
"animation.heliolisk.annoyed": {
"loop": true,
"bones": {
"eyelid_right_neutral": {
"position": [0.1, 0, 0]
},
"eyelid_right_annoyed": {
"position": [-0.1, 0, 0]
},
"eyelid_left_neutral": {
"position": [-0.1, 0, 0]
},
"eyelid_left_annoyed": {
"position": [0.1, 0, 0]
}
}
}
}
}
@@ -0,0 +1,355 @@
{
"format_version": "1.8.0",
"animations": {
"animation.grubbin.ground_idle": {
"loop": true,
"bones": {
"head": {
"rotation": ["5+math.sin(q.anim_time*90*6)", "0+0.5*math.sin(q.anim_time*90*3)", 0]
},
"tail": {
"rotation": [0, 0, 0]
},
"body": {
"rotation": [0, 0, 0]
},
"midsection": {
"rotation": [0, 0, 0]
}
}
},
"animation.grubbin.ground_walk": {
"loop": true,
"bones": {
"midsection": {
"rotation": ["0-0.5*math.sin(q.anim_time*90*6)*3", 0, 0]
},
"head": {
"rotation": ["0-math.sin(q.anim_time*90*6)*1", 0, 0]
},
"tail": {
"rotation": ["0+math.sin(q.anim_time*90*6)*3", 0, 0]
},
"arm_left": {
"rotation": ["0+math.sin(q.anim_time*90*6-90+180)*15", 0, "0-math.sin(q.anim_time*90*6+33*6)*5"]
},
"arm_right": {
"rotation": ["0+math.sin(q.anim_time*90*6-90+180)*15", 0, "0+math.sin(q.anim_time*90*6+33*6)*5"]
},
"leg_front_right": {
"rotation": ["0+math.sin(q.anim_time*90*6)*15", 0, "0-math.sin(q.anim_time*90*6+33*6+30)*5"]
},
"leg_back_right": {
"rotation": ["0+math.sin(q.anim_time*90*6-90+180+30)*15", 0, "0-math.sin(q.anim_time*90*6+33*6+15)*5"]
},
"leg_front_left": {
"rotation": ["0+math.sin(q.anim_time*90*6)*15", 0, "0+math.sin(q.anim_time*90*6+33*6+30)*5"]
},
"leg_back_left": {
"rotation": ["0+math.sin(q.anim_time*90*6-90+180+30)*15", 0, "0+math.sin(q.anim_time*90*6+33*6+15)*5"]
}
}
},
"animation.grubbin.blink": {
"animation_length": 0.1667,
"bones": {
"eye_right": {
"position": {
"0.0": [0.1, 0, 0],
"0.125": {"pre": [0.1, 0, 0], "post": [0, 0, 0]}
}
},
"eye_left": {
"position": {
"0.0": [-0.1, 0, 0],
"0.125": {"pre": [-0.1, 0, 0], "post": [0, 0, 0]}
}
},
"eyelid_left": {
"position": {
"0.0": [0.1, 0, 0],
"0.125": {"pre": [0.1, 0, 0], "post": [0, 0, 0]}
}
},
"eyelid_right": {
"position": {
"0.0": [-0.1, 0, 0],
"0.125": {"pre": [-0.1, 0, 0], "post": [0, 0, 0]}
}
},
"ditto_eyelid_left": {
"position": {
"0.0": [0.1, 0, 0],
"0.125": {"pre": [0.1, 0, 0], "post": [0, 0, 0]}
}
},
"ditto_eyelid_right": {
"position": {
"0.0": [-0.1, 0, 0],
"0.125": {"pre": [-0.1, 0, 0], "post": [0, 0, 0]}
}
}
}
},
"animation.grubbin.cry": {
"animation_length": 0.75,
"bones": {
"head": {
"rotation": {
"0.0": [0, 0, 0],
"0.125": [-15, 0, 0],
"0.1667": [-17.5, 0, 0],
"0.5417": [-17.78, 0, 0],
"0.625": [-15, 0, 0],
"0.75": [0, 0, 0]
}
},
"mouth_opened": {
"position": {
"0.0": [0, 0, 0],
"0.0417": {"pre": [0, 0, 0], "post": [0, -0.1, -0.1]},
"0.5417": {"pre": [0, -0.1, -0.1], "post": [0, 0, 0]}
}
},
"ditto_mouth": {
"position": {
"0.0": [0, 0, 0],
"0.0417": {"pre": [0, 0, 0], "post": [0, 0, 0.1]},
"0.5417": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"ditto_mouth_open": {
"position": {
"0.0": [0, 0, 0],
"0.0417": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"0.5417": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
}
}
},
"animation.grubbin.physical": {
"animation_length": 3,
"bones": {
"body": {
"rotation": {
"0.0": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"0.4167": {
"post": [-27.5, 10, 0],
"lerp_mode": "catmullrom"
},
"0.75": {
"post": [0, 22.5, 0],
"lerp_mode": "catmullrom"
},
"1.0417": {
"post": [0, 22.5, 0],
"lerp_mode": "catmullrom"
},
"1.25": {
"post": [0, 42.5, 0],
"lerp_mode": "catmullrom"
}
},
"position": {
"0.0": [0, 0, 0],
"0.4167": [-1, 1.75, 0.5],
"0.75": [0, 0, -1],
"1.0417": [0, 0, -1],
"1.25": [-1.5, 0, 0.25]
}
},
"midsection": {
"rotation": {
"0.0": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"0.4167": {
"post": [-2.2978, -6.6486, -3.4787],
"lerp_mode": "catmullrom"
},
"0.5833": {
"post": [-16.2925, -11.2398, -1.9568],
"lerp_mode": "catmullrom"
},
"0.6667": {
"post": [7.5, -15, 0],
"lerp_mode": "catmullrom"
},
"0.8333": {
"post": [0, -15, 0],
"lerp_mode": "catmullrom"
},
"1.0417": {
"post": [0, -15, 0],
"lerp_mode": "catmullrom"
},
"1.1667": {
"post": [-14.8142, -19.5172, 7.932],
"lerp_mode": "catmullrom"
},
"1.25": {
"post": [-23.1652, 9.2223, 1.9727],
"lerp_mode": "catmullrom"
}
},
"position": {
"0.0": [0, 0, 0],
"0.4167": [0, 0, 0],
"1.0417": [0, 0, 0]
}
},
"head": {
"rotation": {
"0.0": {
"post": [5, 0, 0],
"lerp_mode": "catmullrom"
},
"0.4167": {
"post": [-35.4132, -8.1778, 5.7751],
"lerp_mode": "catmullrom"
},
"0.75": {
"post": [12.1359, -10.4967, 1.6011],
"lerp_mode": "catmullrom"
},
"1.0417": {
"post": [12.1359, -10.4967, 1.6011],
"lerp_mode": "catmullrom"
},
"1.125": {
"post": [15.8612, -20.7049, 0.1476],
"lerp_mode": "catmullrom"
},
"1.2083": {
"post": [12.8861, -24.0031, 4.9488],
"lerp_mode": "catmullrom"
},
"1.25": {
"post": [-26.1035, 22.5432, -2.3104],
"lerp_mode": "catmullrom"
}
}
},
"mandible_left": {
"rotation": {
"0.0": [0, 0, 0],
"0.5417": [0, -26.88, 0],
"0.6667": [0, -26.88, 0],
"0.7083": [0, 15, 0],
"1.0833": [0, 15, 0]
}
},
"mandible_right": {
"rotation": {
"0.0": [0, 0, 0],
"0.5417": [0, 26.88, 0],
"0.6667": [0, 26.88, 0],
"0.7083": [0, -15, 0],
"1.0833": [0, -15, 0]
}
},
"arm_left": {
"rotation": {
"0.0": [0, 0, 0],
"1.5": [37.5, 0, 0]
}
},
"arm_right": {
"rotation": {
"0.0": [0, 0, 0],
"1.5": [37.5, 0, 0]
}
},
"leg_front_left": {
"rotation": {
"0.0": [0, 0, 0],
"0.3333": [27.5, 0, 0],
"0.5833": [27.5, 0, 0],
"0.7083": [0, 0, 0]
},
"position": {
"0.0": [0, 0, 0],
"0.3333": [0, -0.44351, 0.23087],
"0.5833": [0, -0.44351, 0.23087],
"0.7083": [0, 0, 0]
}
},
"leg_front_right": {
"rotation": {
"0.0": [0, 0, 0],
"0.3333": [27.5, 0, 0],
"0.5833": [27.5, 0, 0],
"0.7083": [0, 0, 0]
},
"position": {
"0.0": [0, 0, 0],
"0.3333": [0, -0.44351, 0.23087],
"0.5833": [0, -0.44351, 0.23087],
"0.7083": [0, 0, 0]
}
},
"tail": {
"rotation": {
"0.0": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"0.4167": {
"post": [27.5, 0, 0],
"lerp_mode": "catmullrom"
},
"0.75": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"1.0417": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
}
}
}
}
},
"animation.grubbin.new": {
"loop": true,
"bones": {
"grubbin": {
"scale": 0.75
}
}
},
"animation.grubbin.ditto_face": {
"loop": true,
"bones": {
"eye_right": {
"scale": 0
},
"mandible_left": {
"position": [0.5, 0, 0]
},
"mandible_right": {
"position": [-0.5, 0, 0]
},
"ditto_eye_left": {
"position": [0.1, 0, 0]
},
"ditto_mouth": {
"position": [0, 0, -0.1]
},
"ditto_eye_right": {
"position": [-0.1, 0, 0]
},
"ditto_mouth_open": {
"position": [0, 0, -0.1]
},
"face": {
"scale": 0
}
}
}
}
}
@@ -0,0 +1,98 @@
{
"format_version": "1.8.0",
"animations": {
"animation.charjabug.ground_idle": {
"loop": true
},
"animation.charjabug.blink": {
"loop": true
},
"animation.charjabug.cry": {
"animation_length": 0.75,
"bones": {
"mouth_closed": {
"position": {
"0.0": [0, 0, 0],
"0.0833": {"pre": [0, 0, 0], "post": [0, 0, 0.1]},
"0.625": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"ditto_mouth_open": {
"position": {
"0.0": [0, 0, 0],
"0.0833": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"0.625": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"mouth_open": {
"position": {
"0.0": [0, 0, 0],
"0.0833": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"0.625": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"ditto_mouth": {
"position": {
"0.0": [0, 0, 0],
"0.0833": {"pre": [0, 0, 0], "post": [0, 0, 0.1]},
"0.625": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
}
}
},
"animation.charjabug.ditto_face": {
"animation_length": 0.2083,
"bones": {
"face": {
"scale": 0
},
"ditto_eyes": {
"position": [0, 0, -0.1]
},
"ditto_mouth": {
"position": [0, 0, -0.1]
},
"ditto_mouth_open": {
"position": [0, 0, -0.1]
},
"ditto_mouth_uwu": {
"position": [0, 0, -0.1]
}
}
},
"animation.charjabug..3.": {
"loop": true,
"bones": {
"ditto_eye_left": {
"position": [0, -0.5, 0]
},
"ditto_mouth": {
"position": [0, 0, 0.1]
},
"ditto_eye_right": {
"position": [0, -0.5, 0]
},
"ditto_mouth_uwu": {
"position": [0, 0, -0.1]
}
}
},
"animation.charjabug.hold_item": {
"loop": true,
"bones": {
"locator_item": {
"rotation": [0, 0, -90],
"position": [0, 0.25, 2.5]
}
}
},
"animation.charjabug.hold_tool": {
"loop": true,
"bones": {
"locator_item": {
"position": [0, 0.25, 2.5]
}
}
}
}
}
@@ -0,0 +1,392 @@
{
"format_version": "1.8.0",
"animations": {
"animation.vikavolt.ground_walk": {
"loop": true,
"bones": {
"arm_right": {
"rotation": ["0+math.sin(q.anim_time*90*3+90)*3", 0, 15]
},
"forearm_right": {
"rotation": ["-29+math.sin(q.anim_time*90*3)*8", -15, -8]
},
"leg_right": {
"rotation": ["-20+math.sin(q.anim_time*90*3+90)*2", 0, 0]
},
"foreleg_right": {
"rotation": ["20+math.sin(q.anim_time*90*3)*10", 0, 0]
},
"back_wing_left": {
"rotation": ["4.9967+math.sin(q.anim_time*90*60)*10", 4.54585, "0.416+math.sin(q.anim_time*90*60)*10"]
},
"back_wing_right": {
"rotation": ["4.9967+math.sin(q.anim_time*90*60)*10", -4.5458, "-0.416-math.sin(q.anim_time*90*60)*10"]
},
"front_wing_left": {
"rotation": ["0+math.sin(q.anim_time*90)*5", 0, "0+math.sin(q.anim_time*90)*5"]
},
"front_wing_right": {
"rotation": ["0+math.sin(q.anim_time*90)*5", 0, "0-math.sin(q.anim_time*90)*5"]
},
"foot_claw_right": {
"rotation": ["0-math.sin(q.anim_time*90*3+90)*5", 0, 0]
},
"arm_left": {
"rotation": ["0+math.sin(q.anim_time*90*3)*3", 0, -15]
},
"forearm_left": {
"rotation": ["-29+math.sin(q.anim_time*90*3+90)*8", 15, 8]
},
"leg_left": {
"rotation": ["-20+math.sin(q.anim_time*90*3)*2", 0, 0]
},
"foreleg_left": {
"rotation": ["20+math.sin(q.anim_time*90*3+20)*10", 0, 0]
},
"foot_claw_left": {
"rotation": ["0-math.sin(q.anim_time*90*3)*5", 0, 0]
},
"claw_left": {
"rotation": [32.5, 0, 0]
},
"claw_right": {
"rotation": [32.5, 0, 0]
},
"back_wing_shell_left": {
"rotation": ["59+2*math.sin(q.anim_time*90)*2", 14, 33]
},
"back_wing_shell_right": {
"rotation": ["59+2*math.sin(q.anim_time*90)*2", -14, -33]
},
"body": {
"rotation": ["15+math.sin(q.anim_time*90*2)*2", 0, 0],
"position": ["0+math.sin(q.anim_time*90*1)*0.25", "math.sin(q.anim_time*90*4)*2", "0+math.sin(q.anim_time*90*2)*3"]
},
"mandible_left": {
"rotation": [0, "-2+math.sin(q.anim_time*90)*2", 0]
},
"mandible_right": {
"rotation": [0, "2-math.sin(q.anim_time*90)*2", 0]
},
"elytron_open_left": {
"rotation": ["59+2*math.sin(q.anim_time*90)*2", 14, 43]
},
"elytron_open_right": {
"rotation": ["59+2*math.sin(q.anim_time*90)*2", -14, -43]
},
"elytra_closed": {
"scale": 0
},
"wing_left": {
"rotation": ["4.9967+math.sin(q.anim_time*90*60)*10", 4.54585, "0.416+math.sin(q.anim_time*90*60)*10"]
},
"leg_front_left1": {
"rotation": ["0+math.sin(q.anim_time*90*3)*3 - +42.5", 0, -15]
},
"leg_front_left2": {
"rotation": ["-29+math.sin(q.anim_time*90*3+90)*8 - 2.5", 15, 8]
},
"foot_front_left": {
"rotation": [10, 0, 0]
},
"finger_left1": {
"rotation": [0, -27.5, 0]
},
"finger_left2": {
"rotation": [0, 27.5, 0]
},
"leg_front_right1": {
"rotation": ["0+math.sin(q.anim_time*90*3+90)*3 - +42.5", 0, 15]
},
"leg_front_right2": {
"rotation": ["-29+math.sin(q.anim_time*90*3)*8 - 2.5", -15, -8]
},
"foot_front_right": {
"rotation": [10, 0, 0]
},
"finger_right1": {
"rotation": [0, 27.5, 0]
},
"finger_right2": {
"rotation": [0, -27.5, 0]
},
"leg_back_left1": {
"rotation": ["-20+math.sin(q.anim_time*90*3)*2 - +42.5", 0, 0]
},
"leg_back_left2": {
"rotation": ["20+math.sin(q.anim_time*90*3+20)*10", 0, 0]
},
"toe_left1": {
"rotation": ["0-math.sin(q.anim_time*90*3)*5 - +47.5", 0, 0]
},
"leg_back_right1": {
"rotation": ["-20+math.sin(q.anim_time*90*3+90)*2 - +42.5", 0, 0]
},
"leg_back_right2": {
"rotation": ["20+math.sin(q.anim_time*90*3)*10", 0, 0]
},
"toe_right1": {
"rotation": ["0-math.sin(q.anim_time*90*3+90)*5 - +47.5", 0, 0]
},
"mouth_opened": {
"position": [0, 1, 1]
},
"wing_right": {
"rotation": ["4.9967+math.sin(q.anim_time*90*60)*10", -4.54585, "-0.416-math.sin(q.anim_time*90*60)*10"]
}
}
},
"animation.vikavolt.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, 0, 0]}
}
},
"eyelid_right": {
"position": {
"0.0": [-0.1, 0, -0.1],
"0.125": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]}
}
},
"ditto_eyelid_left": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"ditto_eyelid_right": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
}
}
},
"animation.vikavolt.elytra_opening": {
"loop": "hold_on_last_frame",
"animation_length": 0.2083,
"bones": {
"elytron_open_left": {
"rotation": {
"0.0833": [-10.2206, -1.5794, 25.815],
"0.125": [40.33, 9.52, 32.21],
"0.2083": [61.82843, 14, 43]
},
"position": {
"0.0": [0, 0, 0],
"0.0833": [2, 0, 0],
"0.125": [0, 0, 0]
},
"scale": {
"0.0": [0, 0, 0],
"0.0833": {"pre": [0, 0, 0], "post": [1.2, 1, 1.1]},
"0.1667": [1, 1, 1]
}
},
"elytron_open_right": {
"rotation": {
"0.0833": [-10.2206, 1.5794, -25.815],
"0.125": [40.33, -9.52, -32.21],
"0.2083": [61.82843, -14, -43]
},
"position": {
"0.0": [0, 0, 0],
"0.0833": [-2, 0, 0],
"0.125": [0, 0, 0]
},
"scale": {
"0.0": [0, 0, 0],
"0.0833": {"pre": [0, 0, 0], "post": [1.2, 1, 1.1]},
"0.1667": [1, 1, 1]
}
},
"elytra_closed": {
"scale": {
"0.0": [1, 1, 1],
"0.0833": {"pre": [1, 1, 1], "post": [0, 0, 0]}
}
},
"wing_left": {
"rotation": {
"0.0833": [-5, 0, 0],
"0.125": [0, 0, 0]
},
"scale": {
"0.0": [0, 0, 0],
"0.0833": {"pre": [0, 0, 0], "post": [0.6, 1, 1]},
"0.125": [1, 1, 1]
}
},
"wing_fold_left1": {
"rotation": {
"0.0833": [-1.3185, -9.9136, 7.6143],
"0.125": [0, 0, 0]
},
"scale": {
"0.0833": [0.8, 1, 0.7],
"0.125": [1, 1, 1]
}
},
"wing_fold_left2": {
"rotation": {
"0.0833": [0, -30, 0],
"0.125": [0, 0, 0]
}
},
"wing_fold_left3": {
"rotation": {
"0.0833": [0, -27.5, 0],
"0.1667": [0, 0, 0]
}
},
"wing_right": {
"rotation": {
"0.0833": [-5, 0, 0],
"0.125": [0, 0, 0]
},
"scale": {
"0.0": [0, 0, 0],
"0.0833": {"pre": [0, 0, 0], "post": [0.6, 1, 1]},
"0.125": [1, 1, 1]
}
},
"wing_fold_right1": {
"rotation": {
"0.0833": [-1.3185, 9.9136, -7.6143],
"0.125": [0, 0, 0]
},
"scale": {
"0.0833": [0.8, 1, 0.7],
"0.125": [1, 1, 1]
}
},
"wing_fold_right2": {
"rotation": {
"0.0833": [0, 30, 0],
"0.125": [0, 0, 0]
}
},
"wing_fold_right3": {
"rotation": {
"0.0833": [0, 27.5, 0],
"0.1667": [0, 0, 0]
}
}
}
},
"animation.vikavolt.ditto_face": {
"loop": true,
"bones": {
"face": {
"scale": 0
},
"ditto_face": {
"position": [0, 0, -1]
}
}
},
"animation.vikavolt.new": {
"loop": true,
"bones": {
"elytron_open_left": {
"rotation": [0, 0, 10]
},
"elytron_open_right": {
"rotation": [0, 0, -10]
},
"leg_front_left1": {
"rotation": [42.5, 0, 0]
},
"leg_front_left2": {
"rotation": [-2.5, 0, 0]
},
"foot_front_left": {
"rotation": [-40, 0, 0]
},
"finger_left1": {
"rotation": [0, -27.5, 0]
},
"finger_left2": {
"rotation": [0, 27.5, 0]
},
"leg_front_right1": {
"rotation": [42.5, 0, 0]
},
"leg_front_right2": {
"rotation": [-2.5, 0, 0]
},
"foot_front_right": {
"rotation": [-40, 0, 0]
},
"finger_right1": {
"rotation": [0, 27.5, 0]
},
"finger_right2": {
"rotation": [0, -27.5, 0]
},
"leg_back_left1": {
"rotation": [42.5, 0, 0]
},
"toe_left1": {
"rotation": [47.5, 0, 0]
},
"leg_back_right1": {
"rotation": [42.5, 0, 0]
},
"toe_right1": {
"rotation": [47.5, 0, 0]
}
}
},
"animation.vikavolt.cry": {
"animation_length": 1,
"bones": {
"head": {
"rotation": {
"0.0": [0, 0, 0],
"0.1667": [-10.5, 0, 0],
"0.5417": [-10.78, 0, 0],
"0.75": [0, 0, 0]
}
},
"mandible_left": {
"rotation": {
"0.0": [0, 0, 0],
"0.1667": [0, -12.5, 0],
"0.5417": [0, -12.5, 0],
"0.75": [0, 0, 0]
}
},
"mandible_right": {
"rotation": {
"0.0": [0, 0, 0],
"0.1667": [0, 12.5, 0],
"0.5417": [0, 12.5, 0],
"0.75": [0, 0, 0]
}
},
"mouth_opened": {
"position": {
"0.0": [0, 0, 0],
"0.125": {"pre": [0, 0, 0], "post": [0, -0.1, -0.1]},
"0.625": {"pre": [0, -0.1, -0.1], "post": [0, 0, 0]}
}
}
}
},
"animation.vikavolt.hold_item": {
"loop": true,
"bones": {
"foot_front_left": {
"rotation": [0, 0, 30]
},
"foot_front_right": {
"rotation": [0, 0, -30]
}
}
}
}
}
@@ -0,0 +1,504 @@
{
"format_version": "1.8.0",
"animations": {
"animation.eternatus.ground_idle": {
"loop": true,
"bones": {
"segment1": {
"rotation": [-32.5, 0, 0]
},
"segment2": {
"rotation": [2.5, 0, 0]
},
"segment3": {
"rotation": [0, 0, 0]
},
"segment4": {
"rotation": [0, 0, 0]
},
"segment5": {
"rotation": [10, 0, 0]
},
"segment6": {
"rotation": [5.00598, 0.23113, 0.0704]
},
"segment7": {
"rotation": [5, 0, 0]
},
"segment8": {
"rotation": [7.5, 0, 0]
},
"segment9": {
"rotation": [10, 0, 0]
},
"segment10": {
"rotation": [5, 0, 0]
},
"segment11": {
"rotation": [7.5, 0, 0]
},
"head": {
"rotation": [10, 0, 0]
},
"tail": {
"rotation": [5, 0, 0]
},
"tail2": {
"rotation": [10, 0, 0]
},
"leg_left": {
"rotation": [29.62165, 4.98093, -43.6822]
},
"leg_left2": {
"rotation": [42.5, 0, 0]
},
"foot_left": {
"rotation": [-57.5, 0, 0]
},
"foot_left_outer_connector": {
"rotation": [5, -5, 0]
},
"foot_left_inner_connector": {
"rotation": [2.5, 5, 0]
},
"tail3": {
"rotation": [7.5, 0, 0]
},
"tail4": {
"rotation": [5, 0, 0]
},
"tail5": {
"rotation": [7.5, 0, 0]
},
"tail6": {
"rotation": [10, 0, 0]
},
"tail7": {
"rotation": [10, 0, 0]
},
"tail8": {
"rotation": [15, 0, 0]
},
"tail9": {
"rotation": [2.5, 0, 0]
},
"tail10": {
"rotation": [-10, 0, 0]
},
"tail11": {
"rotation": [-5, 0, 0]
},
"tail12": {
"rotation": [-12.5, 0, 0]
},
"tail14": {
"rotation": [-17.5, 0, 0]
},
"leg_right": {
"rotation": [29.62165, -4.98093, 43.6822]
},
"leg_right2": {
"rotation": [42.5, 0, 0]
},
"foot_right": {
"rotation": [-57.5, 0, 0]
},
"foot_right_outer_connector": {
"rotation": [5, 5, 0]
},
"foot_right_inner_connector": {
"rotation": [2.5, -5, 0]
},
"shoulder_left": {
"rotation": [14.57882, 4.4989, 6.49638]
},
"arm_left2": {
"rotation": [-87.1353, 13.82792, -26.73636]
},
"hand_left": {
"rotation": [-65, 0, 0]
},
"hand_left_inner_connector": {
"rotation": [17.75313, -9.53274, 14.46487]
},
"hand_left_outer_connector": {
"rotation": [5.04292, 7.4713, -9.3426]
},
"shoulder_right": {
"rotation": [14.57882, -4.4989, -6.49638]
},
"arm_right_rotation": {
"rotation": [-148.22251, -326.24309, 176.48816]
},
"arm_right2": {
"rotation": [-87.1353, -13.82792, 26.73636]
},
"hand_right": {
"rotation": [-65, 0, 0]
},
"hand_right_inner_connector": {
"rotation": [17.75313, 9.53274, -14.46487]
},
"hand_right_outer_connector": {
"rotation": [5.04292, -7.4713, 9.3426]
},
"arm_left_rotation": {
"rotation": [-148.22251, 326.24309, -176.48816]
},
"jaw": {
"rotation": [5, 0, 0]
},
"wing_right": {
"rotation": [12.13627, -5.89979, -1.09342]
},
"wing_right2": {
"rotation": [7.5, 0, 0]
},
"wing_right3": {
"rotation": [-3.26042, 3.83514, 0.08715]
},
"wing_right4": {
"rotation": [-17.5, 0, 0]
},
"wing_right5": {
"rotation": [-15, 0, 0]
},
"wing_right6": {
"rotation": [-20, 0, 0]
},
"wing_right7": {
"rotation": [-27.5, 0, 0]
},
"wing_right8": {
"rotation": [-30, 0, 0]
},
"wing_right9": {
"rotation": [-22.5, 0, 0]
},
"dynamax_core": {
"rotation": [-2.5, 0, 0],
"position": [0, -1, 0]
},
"body": {
"position": [0, 8, 0]
},
"helmet_middle_back": {
"rotation": [-2.5, 0, 0]
},
"helmet_middle_back2": {
"rotation": [-27.5, 0, 0]
},
"helmet_left_back": {
"rotation": [-12.5, 0, 0]
},
"helmet_left_back2": {
"rotation": [-27.5, 0, 0]
},
"helmet_left_side_back": {
"rotation": [-17.5, 0, 0]
},
"helmet_left_side_back2": {
"rotation": [-27.5, 0, 0]
},
"helmet_right_back": {
"rotation": [-12.5, 0, 0]
},
"helmet_right_back2": {
"rotation": [-27.5, 0, 0]
},
"helmet_right_side_back": {
"rotation": [-17.5, 0, 0]
},
"helmet_right_side_back2": {
"rotation": [-27.5, 0, 0]
},
"wing_left": {
"rotation": [12.13627, 5.89979, 1.09342]
},
"wing_left2": {
"rotation": [7.5, 0, 0]
},
"wing_left3": {
"rotation": [-3.26042, -3.83514, -0.08715]
},
"wing_left4": {
"rotation": [-17.5, 0, 0]
},
"wing_left5": {
"rotation": [-15, 0, 0]
},
"wing_left6": {
"rotation": [-20, 0, 0]
},
"wing_left7": {
"rotation": [-27.5, 0, 0]
},
"wing_left8": {
"rotation": [-30, 0, 0]
},
"wing_left9": {
"rotation": [-22.5, 0, 0]
},
"dynamax_core2": {
"rotation": [0, 20, 0]
}
}
},
"animation.eternatus.render": {
"loop": true,
"bones": {
"segment1": {
"rotation": [-32.5, 0, 0]
},
"segment2": {
"rotation": [2.5, 0, 0]
},
"segment3": {
"rotation": [0, 0, 0]
},
"segment4": {
"rotation": [0, 0, 0]
},
"segment5": {
"rotation": [10, 0, 0]
},
"segment6": {
"rotation": [5.04628, -7.24011, -0.58744]
},
"segment7": {
"rotation": [5.59258, -10.10994, -2.64915]
},
"segment8": {
"rotation": [7.56397, -7.43547, -0.98448]
},
"segment9": {
"rotation": [5.15108, -9.84655, -1.75378]
},
"segment10": {
"rotation": [5.019, -4.98093, -0.43688]
},
"segment11": {
"rotation": [7.56397, -7.43547, -0.98448]
},
"head": {
"rotation": [24.93633, 2.01462, 1.76973]
},
"tail": {
"rotation": [12.54624, 4.88119, 1.08482]
},
"tail2": {
"rotation": [10, 0, 0]
},
"leg_left": {
"rotation": [-0.37835, 4.98093, -43.6822]
},
"leg_left2": {
"rotation": [72.5, 0, 0]
},
"foot_left": {
"rotation": [-78.84365, 5.17029, -17.42958]
},
"foot_left_outer_connector": {
"rotation": [5.79056, -4.05734, -9.98684]
},
"foot_left_inner_connector": {
"rotation": [2.5, 5, 0]
},
"tail3": {
"rotation": [17.75313, 9.53274, 3.03513]
},
"tail4": {
"rotation": [5.00474, 2.49048, 0.21803]
},
"tail5": {
"rotation": [7.56397, 7.43547, 0.98448]
},
"tail6": {
"rotation": [10.08453, 7.38542, 1.30962]
},
"tail7": {
"rotation": [10.08453, 7.38542, 1.30962]
},
"tail8": {
"rotation": [15.01365, 2.41476, 0.64743]
},
"tail9": {
"rotation": [2.50238, 2.49762, 0.10912]
},
"tail10": {
"rotation": [-10.03742, 4.92385, -0.87038]
},
"tail11": {
"rotation": [-5, 0, 0]
},
"tail12": {
"rotation": [-12.5, 0, 0]
},
"tail14": {
"rotation": [-17.5, 0, 0]
},
"leg_right": {
"rotation": [4.62165, -4.98093, 43.6822]
},
"leg_right2": {
"rotation": [62.5, 0, 0]
},
"foot_right": {
"rotation": [-57.5, 0, 0]
},
"foot_right_outer_connector": {
"rotation": [5, 5, 0]
},
"foot_right_inner_connector": {
"rotation": [3.13198, -4.631, -7.5175]
},
"shoulder_left": {
"rotation": [14.57882, 4.4989, 6.49638]
},
"arm_left2": {
"rotation": [-63.93039, 38.79021, -25.18356]
},
"hand_left": {
"rotation": [-68.53128, 13.12479, -30.00135]
},
"hand_left_inner_connector": {
"rotation": [0, 0, 15]
},
"hand_left_outer_connector": {
"rotation": [6.78391, 8.82892, -32.03435]
},
"shoulder_right": {
"rotation": [15.17846, -16.58312, -9.7551]
},
"arm_right_rotation": {
"rotation": [-151.61575, -337.07507, 169.37921]
},
"arm_right2": {
"rotation": [-87.1353, -13.82792, 26.73636]
},
"hand_right": {
"rotation": [-64.46949, 11.31255, 5.35254]
},
"hand_right_inner_connector": {
"rotation": [17.75313, 9.53274, -14.46487]
},
"hand_right_outer_connector": {
"rotation": [5.04292, -7.4713, 9.3426]
},
"arm_left_rotation": {
"rotation": [-128.22251, 326.24309, -176.48816]
},
"jaw": {
"rotation": [2.5, 0, 0]
},
"wing_right": {
"rotation": [30.32378, -4.30729, -2.5217]
},
"wing_right2": {
"rotation": [15.0547, 4.82922, 1.29717]
},
"wing_right3": {
"rotation": [19.2159, -3.33473, -2.06573]
},
"wing_right4": {
"rotation": [-17.64168, -7.15102, 2.26708]
},
"wing_right5": {
"rotation": [-15.12353, -7.24305, 1.95155]
},
"wing_right6": {
"rotation": [-20.28356, -9.39129, 3.45118]
},
"wing_right7": {
"rotation": [-27.70212, -6.64851, 3.47875]
},
"wing_right8": {
"rotation": [-30.02363, -2.16489, 1.2506]
},
"wing_right9": {
"rotation": [-22.5, 0, 0]
},
"dynamax_core": {
"rotation": [-2.5, 0, 0],
"position": [0, -1, 0]
},
"body": {
"rotation": [-15.78465, 52.06147, -22.36262],
"position": [0, 8, 0]
},
"helmet_middle_back": {
"rotation": [-2.5, 0, 0]
},
"helmet_middle_back2": {
"rotation": [-27.5, 0, 0]
},
"helmet_left_back": {
"rotation": [-12.5, 0, 0]
},
"helmet_left_back2": {
"rotation": [-27.5, 0, 0]
},
"helmet_left_side_back": {
"rotation": [-17.5, 0, 0]
},
"helmet_left_side_back2": {
"rotation": [-27.5, 0, 0]
},
"helmet_right_back": {
"rotation": [-12.5, 0, 0]
},
"helmet_right_back2": {
"rotation": [-27.5, 0, 0]
},
"helmet_right_side_back": {
"rotation": [-17.5, 0, 0]
},
"helmet_right_side_back2": {
"rotation": [-27.5, 0, 0]
},
"wing_left": {
"rotation": [-0.67748, -3.66641, -1.84018]
},
"wing_left2": {
"rotation": [10, 0, 0]
},
"wing_left3": {
"rotation": [4.23958, -3.83514, -0.08715]
},
"wing_left4": {
"rotation": [-17.5, 0, 0]
},
"wing_left5": {
"rotation": [-15, 0, 0]
},
"wing_left6": {
"rotation": [-20, 0, 0]
},
"wing_left7": {
"rotation": [-27.5, 0, 0]
},
"wing_left8": {
"rotation": [-30, 0, 0]
},
"wing_left9": {
"rotation": [-22.5, 0, 0]
},
"dynamax_core2": {
"rotation": [0, 20, 0]
},
"helmet_middle": {
"rotation": [-12.5, 0, 0]
},
"hand_left_inner": {
"rotation": [20, -12.5, 0]
},
"hand_left_outer": {
"rotation": [0, 27.5, 0]
},
"shoulder_right_rotation": {
"rotation": [7.66443, 10.4648, 24.61406]
}
}
}
}
}
@@ -90,15 +90,6 @@
"rotation": ["0+Math.cos((query.anim_time) * 90 * 1) * 1", -15, 0],
"position": [-6, -8.75, -1]
},
"face": {
"rotation": ["0+Math.cos((query.anim_time) * 90 * 1) * -1", 0, 0]
},
"eyelid_left": {
"position": [0, 0, -0.1]
},
"eyelid_right": {
"position": [0, 0, -0.1]
},
"petal_top_rotation": {
"rotation": [27.5, 0, 0]
},
@@ -106,7 +97,7 @@
"rotation": [37.5, 0, 0]
},
"petal_bottom_rotation": {
"rotation": ["-87.5+Math.cos((query.anim_time) * 90 * 1) * -1", -2, 0]
"rotation": ["-87.5+Math.cos((query.anim_time) * 90 * 1) * -1", 0, 0]
},
"petal_top_left_rotation": {
"rotation": [0, 0, 12.5]
@@ -116,7 +107,7 @@
},
"petal_bottom_left_rotation": {
"rotation": [-28.82946, -40.7758, -7.94616],
"position": [0.5, -1, 0]
"position": [0.5, -0.5, 0]
},
"petal_bottom_left2": {
"rotation": [-20, 0, 0]
@@ -130,7 +121,7 @@
},
"petal_bottom_right1": {
"rotation": [-14.54771, 55.75322, 13.84827],
"position": [-0.25, -1, 0]
"position": [-0.25, -0.5, 0]
},
"petal_bottom_right2": {
"rotation": [-22.5, 0, 0]
@@ -146,6 +137,12 @@
},
"tail": {
"rotation": [-15, 22.5, 0]
},
"eyelid_left": {
"position": [0.75, 0, -0.1]
},
"eyelid_right": {
"position": [-0.75, 0, -0.1]
}
}
},
@@ -259,26 +256,6 @@
"2.25": [1, 1, 1]
}
},
"eyelid_left": {
"position": {
"0.0": [0, 0, 0],
"0.0417": [0, 0, -0.1],
"0.5417": [0, 0, -0.1],
"0.5833": [0, 0, 0],
"2.0": [0, 0, 0],
"2.0417": [0, 0, -0.1]
}
},
"eyelid_right": {
"position": {
"0.0": [0, 0, 0],
"0.0417": [0, 0, -0.1],
"0.5417": [0, 0, -0.1],
"0.5833": [0, 0, 0],
"2.0": [0, 0, 0],
"2.0417": [0, 0, -0.1]
}
},
"petal_top_rotation": {
"rotation": {
"0.0": [0, 0, 0],
@@ -467,30 +444,122 @@
"2.7083": [30, 0, 0],
"2.7917": [27.5, 0, 0]
}
}
}
},
"animation.glimmet.blink": {
"animation_length": 0.16667,
"bones": {
},
"eyelid_left": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": [0, 0, -0.1],
"0.1667": [0, 0, 0]
"0.0": [0, 0, 0],
"0.0417": {"pre": [0, 0, 0], "post": [0.75, 0, -0.1]},
"0.5417": {"pre": [0.75, 0, -0.1], "post": [0.75, 0, -0.1]},
"0.5833": {"pre": [0.75, 0, -0.1], "post": [0, 0, 0]},
"2.0": {"pre": [0, 0, 0], "post": [0, 0, 0]},
"2.0417": {"pre": [0, 0, 0], "post": [0.75, 0, -0.1]}
}
},
"eyelid_right": {
"position": {
"0.0": [0, 0, 0],
"0.0417": {"pre": [0, 0, 0], "post": [-0.75, 0, -0.1]},
"0.5417": {"pre": [-0.75, 0, -0.1], "post": [-0.75, 0, -0.1]},
"0.5833": {"pre": [-0.75, 0, -0.1], "post": [0, 0, 0]},
"2.0": {"pre": [0, 0, 0], "post": [0, 0, 0]},
"2.0417": {"pre": [0, 0, 0], "post": [-0.75, 0, -0.1]}
}
}
}
},
"animation.glimmet.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.1]
}
}
},
"eyelid_left": {
"position": {
"0.0": [0.75, 0, -0.1],
"0.1667": {
"pre": [0.75, 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.1]
}
}
},
"eyelid_right": {
"position": {
"0.0": [-0.75, 0, -0.1],
"0.1667": {
"pre": [-0.75, 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.125": [0, 0, -0.1],
"0.1667": [0, 0, 0]
"0.1667": {
"pre": [0, 0, -0.1],
"post": [0, 0, 0]
}
}
},
"eye_blink_ditto_right": {
"position": {
"0.0": [-0.1, 0, 0],
"0.1667": {
"pre": [-0.1, 0, 0],
"post": [-0.1, 0, 0]
}
},
"scale": {
"0.0": [0.9, 0.9, 1],
"0.1667": {
"pre": [0.9, 0.9, 1],
"post": [0.9, 0.9, 1]
}
}
},
"eye_blink_ditto_left": {
"position": {
"0.0": [0.1, 0, 0],
"0.1667": {
"pre": [0.1, 0, 0],
"post": [0.1, 0, 0]
}
},
"scale": {
"0.0": [0.9, 0.9, 1],
"0.1667": {
"pre": [0.9, 0.9, 1],
"post": [0.9, 0.9, 1]
}
}
}
}
},
"animation.glimmet.cry": {
"animation_length": 1.33333,
"animation_length": 1.3333,
"bones": {
"body": {
"rotation": {
@@ -549,6 +618,18 @@
"effect": "pokemon.glimmet.cry"
}
}
},
"animation.glimmet.ditto_face": {
"loop": true,
"bones": {
"eyes": {
"position": [0, 0, 0.1],
"scale": 0
},
"face_ditto": {
"position": [0, 0, -0.1]
}
}
}
}
}
@@ -0,0 +1,143 @@
{
"format_version": "1.8.0",
"animations": {
"animation.greavard.ground_idle": {
"loop": true,
"bones": {
"torso": {
"rotation": [-2.5, 0, 0]
},
"head": {
"rotation": [5, 0, 0]
},
"flame": {
"rotation": [-6.396, -1.4932, -3.5407]
},
"jaw": {
"rotation": [5, 0, 0]
},
"tail": {
"rotation": [30, 0, 0]
},
"tail2": {
"rotation": [-25, 0, 0]
},
"leg_back_left": {
"rotation": [0, -10, 0]
},
"leg_front_left": {
"rotation": [0, -10, 0]
},
"ear_left3": {
"rotation": [0, 0, 5]
},
"ear_right3": {
"rotation": [0, 0, -5]
},
"leg_front_right": {
"rotation": [0, 10, 0]
},
"leg_back_right": {
"rotation": [0, 10, 0]
}
}
},
"animation.greavard.blink": {
"animation_length": 0.1667,
"bones": {
"eyes_ditto": {
"position": {
"0.0": [0, 0, 0.1],
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0.1]}
}
},
"eyes_blink_ditto": {
"position": {
"0.0": [0, 0, -0.1],
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, -0.1]}
}
}
}
},
"animation.greavard.ditto_face": {
"loop": true,
"bones": {
"face_ditto": {
"position": [0, 0, -2]
}
}
},
"animation.greavard.render": {
"loop": true,
"bones": {
"body": {
"rotation": [-8.6777, -50.2226, 17.5229]
},
"torso": {
"rotation": [-5, 0, 0]
},
"head": {
"rotation": [-3.6244, 2.5104, -16.9265]
},
"flame": {
"rotation": [-8.7816, 43.1603, -9.7404]
},
"jaw": {
"rotation": [32.5, 0, 0]
},
"tongue": {
"rotation": [-17.5628, 4.768, -1.507],
"position": [0, 0, 1]
},
"fur_flap_back": {
"rotation": [2.5, 0, 0]
},
"tail": {
"rotation": [47.5, 0, 0]
},
"tail2": {
"rotation": [-12.5, 0, 0]
},
"leg_back_left": {
"rotation": [2.5, -10, 0],
"position": [0, -0.5, 0]
},
"foot_back_left": {
"rotation": [45, 0, 0]
},
"leg_front_left": {
"rotation": [-7.5, -10, 0]
},
"foot_front_left": {
"rotation": [32.5767, -9.9616, -0.8804]
},
"ear_right": {
"rotation": [0, 0, 10]
},
"ear_right2": {
"rotation": [0, 0, -5]
},
"ear_right3": {
"rotation": [0, 0, -5]
},
"leg_front_right": {
"rotation": [5, 10, 0]
},
"foot_front_right": {
"rotation": [-37.8662, -8.8899, 10.6778]
},
"leg_back_right": {
"rotation": [10.4241, 9.5567, 2.4967],
"position": [0, -0.5, 0]
},
"foot_back_right": {
"rotation": [5, 0, 0]
},
"tongue2": {
"rotation": [25, 0, 0],
"position": [0, 0, -5]
}
}
}
}
}
@@ -0,0 +1,388 @@
{
"format_version": "1.8.0",
"animations": {
"animation.houndstone.ground_idle": {
"loop": true,
"bones": {
"torso": {
"rotation": [-2, 0, 0]
},
"fur_flaps_side_front_left2": {
"rotation": [0, 0, -8]
},
"fur_flaps_front_left": {
"rotation": [3, 0, 0]
},
"fur_flaps_front_left2": {
"rotation": [-10, 0, 0]
},
"tail": {
"rotation": [55, 0, 0]
},
"tail2": {
"rotation": [-35.5, 0, 0]
},
"head_angle": {
"rotation": [5, 0, 0]
},
"the_houndstone": {
"rotation": [-5, 0, 2]
},
"hair_left": {
"rotation": [-5, 0, -5]
},
"hair_left2": {
"rotation": [-1, 0, 2]
},
"hair_left3": {
"rotation": [0, 0, -18]
},
"jaw": {
"rotation": [10, 0, 0]
},
"leg_front_left": {
"rotation": [0, -5, 0]
},
"toe_front_middle_left": {
"rotation": [8, 0, 0]
},
"toe_front_middle_left2": {
"rotation": [-5, 0, 0]
},
"fur_flaps_back_left": {
"rotation": [-5, 0, 0]
},
"fur_flaps_back_left2": {
"rotation": [13, 0, 0]
},
"fur_flaps_back_right": {
"rotation": [-5, 0, 0]
},
"fur_flaps_back_right2": {
"rotation": [13, 0, 0]
},
"fur_flaps_front_right": {
"rotation": [3, 0, 0]
},
"fur_flaps_front_right2": {
"rotation": [-10, 0, 0]
},
"fur_flaps_side_middle_left": {
"rotation": [0, 0, 2]
},
"fur_flaps_side_middle_left2": {
"rotation": [0, 0, -8]
},
"fur_flaps_side_back_left": {
"rotation": [0, 0, 3]
},
"fur_flaps_side_back_left2": {
"rotation": [0, 0, -3]
},
"fur_flaps_side_front_right2": {
"rotation": [0, 0, 8]
},
"fur_flaps_side_middle_right": {
"rotation": [0, 0, -2]
},
"fur_flaps_side_back_right": {
"rotation": [0, 0, -3]
},
"fur_flaps_side_back_right2": {
"rotation": [0, 0, 3]
},
"hair_right": {
"rotation": [-5, 0, 5]
},
"hair_right2": {
"rotation": [-1, 0, 0]
},
"hair_right3": {
"rotation": [0, 0, 10]
},
"toe_front_inner_left": {
"rotation": [8, 2, 0]
},
"toe_front_inner_left2": {
"rotation": [-5, 0, 0]
},
"toe_front_outer_left": {
"rotation": [8, -2, 0]
},
"toe_front_outer_left2": {
"rotation": [-5, 0, 0]
},
"leg_front_right": {
"rotation": [0, 5, 0]
},
"toe_front_inner_right": {
"rotation": [8, -2, 0]
},
"toe_front_inner_right2": {
"rotation": [-5, 0, 0]
},
"toe_front_middle_right": {
"rotation": [8, 0, 0]
},
"toe_front_middle_right2": {
"rotation": [-5, 0, 0]
},
"toe_front_outer_right": {
"rotation": [8, 2, 0]
},
"toe_front_outer_right2": {
"rotation": [-5, 0, 0]
},
"leg_back_left": {
"rotation": [0, -8, 0]
},
"toe_back_inner_left": {
"rotation": [8, 2, 0]
},
"toe_back_inner_left2": {
"rotation": [-5, 0, 0]
},
"toe_back_middle_left": {
"rotation": [8, 0, 0]
},
"toe_back_middle_left2": {
"rotation": [-5, 0, 0]
},
"toe_back_outer_left": {
"rotation": [8, -2, 0]
},
"toe_back_outer_left2": {
"rotation": [-5, 0, 0]
},
"leg_back_right": {
"rotation": [0, 8, 0]
},
"toe_back_inner_right": {
"rotation": [8, -2, 0]
},
"toe_back_inner_right2": {
"rotation": [-5, 0, 0]
},
"toe_back_middle_right": {
"rotation": [8, 0, 0]
},
"toe_back_middle_right2": {
"rotation": [-5, 0, 0]
},
"toe_back_outer_right": {
"rotation": [8, 2, 0]
},
"toe_back_outer_right2": {
"rotation": [-5, 0, 0]
}
}
},
"animation.houndstone.blink": {
"animation_length": 0.1667,
"bones": {
"eyes_blink_ditto": {
"position": {
"0.0": [0, 0, -0.1],
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
}
}
},
"animation.houndstone.ditto_face": {
"loop": true,
"bones": {
"face_ditto": {
"position": [0, 0, -0.1]
}
}
},
"animation.houndstone.pose": {
"loop": true,
"bones": {
"body": {
"rotation": [0, 45, 0]
},
"torso": {
"rotation": [5, 0, -2]
},
"fur_flaps_side_front_left2": {
"rotation": [0, 0, -8]
},
"fur_flaps_front_left": {
"rotation": [3, 0, 0]
},
"fur_flaps_front_left2": {
"rotation": [-10, 0, 0]
},
"tail": {
"rotation": [61, 15, 23]
},
"tail2": {
"rotation": [-20.5, 12, -4]
},
"head_angle": {
"rotation": [-5, -12, 1]
},
"the_houndstone": {
"rotation": [-8, 0, 2]
},
"hair_left": {
"rotation": [-5, 0, -7]
},
"hair_left2": {
"rotation": [-1, 0, 2]
},
"hair_left3": {
"rotation": [0, 0, -28]
},
"jaw": {
"rotation": [13, 0, 0]
},
"leg_front_left": {
"rotation": [0, -13, 0],
"position": [1, 0, 1]
},
"toe_front_middle_left": {
"rotation": [8, 0, 0]
},
"toe_front_middle_left2": {
"rotation": [-5, 0, 0]
},
"fur_flaps_back_left": {
"rotation": [-5, 0, 0]
},
"fur_flaps_back_left2": {
"rotation": [13, 0, 0]
},
"fur_flaps_back_right": {
"rotation": [-5, 0, 0]
},
"fur_flaps_back_right2": {
"rotation": [13, 0, 0]
},
"fur_flaps_front_right": {
"rotation": [3, 0, 0]
},
"fur_flaps_front_right2": {
"rotation": [-10, 0, 0]
},
"fur_flaps_side_middle_left": {
"rotation": [0, 0, 2]
},
"fur_flaps_side_middle_left2": {
"rotation": [0, 0, -8]
},
"fur_flaps_side_back_left": {
"rotation": [0, 0, 3]
},
"fur_flaps_side_back_left2": {
"rotation": [0, 0, -3]
},
"fur_flaps_side_front_right": {
"rotation": [0, 0, 7.5]
},
"fur_flaps_side_front_right2": {
"rotation": [0, 0, 10]
},
"fur_flaps_side_middle_right": {
"rotation": [0, 0, 5]
},
"fur_flaps_side_middle_right2": {
"rotation": [0, 0, 10]
},
"fur_flaps_side_back_right": {
"rotation": [0, 0, 3]
},
"fur_flaps_side_back_right2": {
"rotation": [0, 0, 10]
},
"hair_right": {
"rotation": [-5, 0, 7]
},
"hair_right2": {
"rotation": [-1, 0, -7]
},
"hair_right3": {
"rotation": [0, 0, 30]
},
"toe_front_inner_left": {
"rotation": [8, 10, 1]
},
"toe_front_inner_left2": {
"rotation": [-5, 0, 0]
},
"toe_front_outer_left": {
"rotation": [8, -10, -1]
},
"toe_front_outer_left2": {
"rotation": [-5, 0, 0]
},
"leg_front_right": {
"rotation": [0, 13, 0],
"position": [-1, 0, 0]
},
"toe_front_inner_right": {
"rotation": [8, -10, -1]
},
"toe_front_inner_right2": {
"rotation": [-5, 0, 0]
},
"toe_front_middle_right": {
"rotation": [8, 0, 0]
},
"toe_front_middle_right2": {
"rotation": [-5, 0, 0]
},
"toe_front_outer_right": {
"rotation": [8, 10, 1]
},
"toe_front_outer_right2": {
"rotation": [-5, 0, 0]
},
"leg_back_left": {
"rotation": [0, -20, 0],
"position": [1, 0, 0]
},
"toe_back_inner_left": {
"rotation": [8, 10, 1]
},
"toe_back_inner_left2": {
"rotation": [-5, 0, 0]
},
"toe_back_middle_left": {
"rotation": [8, 0, 0]
},
"toe_back_middle_left2": {
"rotation": [-5, 0, 0]
},
"toe_back_outer_left": {
"rotation": [8, -10, -1]
},
"toe_back_outer_left2": {
"rotation": [-5, 0, 0]
},
"leg_back_right": {
"rotation": [0, 8, 0]
},
"toe_back_inner_right": {
"rotation": [8, -10, -1]
},
"toe_back_inner_right2": {
"rotation": [-5, 0, 0]
},
"toe_back_middle_right": {
"rotation": [8, 0, 0]
},
"toe_back_middle_right2": {
"rotation": [-5, 0, 0]
},
"toe_back_outer_right": {
"rotation": [8, 10, 1]
},
"toe_back_outer_right2": {
"rotation": [-5, 0, 0]
}
}
}
}
}
@@ -5,7 +5,7 @@
"description": {
"identifier": "geometry.cacnea",
"texture_width": 64,
"texture_height": 32,
"texture_height": 64,
"visible_bounds_width": 3,
"visible_bounds_height": 2.5,
"visible_bounds_offset": [0, 0.75, 0]
@@ -15,173 +15,284 @@
"name": "cacnea",
"pivot": [0, 0, 0]
},
{
"name": "locator_root",
"parent": "cacnea",
"pivot": [0, 0, 0],
"locators": {
"root": [0, 0, 0]
}
},
{
"name": "locator_top",
"parent": "cacnea",
"pivot": [0, 17, 0],
"locators": {
"top": [0, 17, 0]
}
},
{
"name": "body",
"parent": "cacnea",
"pivot": [0, 7.5, 0]
},
{
"name": "body_pivot",
"parent": "body",
"pivot": [0, 0, 0]
},
{
"name": "locator_target",
"parent": "body_pivot",
"pivot": [0, 8, -6],
"locators": {
"target": [0, 8, -6]
}
},
{
"name": "locator_middle",
"parent": "body_pivot",
"pivot": [0, 8, 0],
"locators": {
"middle": [0, 8, 0]
}
},
{
"name": "torso",
"parent": "body",
"parent": "body_pivot",
"pivot": [0, 3.5, 0],
"cubes": [
{"origin": [-4.5, 3, -4.5], "size": [9, 9, 9], "uv": [0, 0]},
{"origin": [-2, 3, -4.51], "size": [4, 3, 0], "uv": [0, 3]},
{"origin": [-2, 3, 4.51], "size": [4, 3, 0], "uv": [0, 0]},
{"origin": [3.25, 10.75, 0], "size": [3, 2, 0], "pivot": [4.5, 12, 0], "rotation": [0, 0, -45], "uv": [58, 0]},
{"origin": [4, 9.25, 0], "size": [2, 1, 0], "pivot": [4.5, 9.75, 0], "rotation": [0, 0, -15], "uv": [48, 1]},
{"origin": [-6.25, 10.75, 0], "size": [3, 2, 0], "pivot": [-4.5, 12, 0], "rotation": [0, 0, 45], "uv": [52, 0]},
{"origin": [-6, 9.25, 0], "size": [2, 1, 0], "pivot": [-4.5, 9.75, 0], "rotation": [0, 0, 15], "uv": [48, 0]}
{"origin": [-5, 3, -5], "size": [10, 10, 10], "uv": [0, 0]},
{"origin": [-0.5, 11.02, -5], "size": [1, 1, 1], "inflate": 0.01, "uv": [0, 1]},
{"origin": [-0.5, 11.02, 4], "size": [1, 1, 1], "inflate": 0.01, "uv": [5, 1]},
{"origin": [-5.75, 11.6, 0], "size": [2, 2, 0], "pivot": [-5, 12.85, 0], "rotation": [0, 0, 40], "uv": [36, 5]},
{"origin": [3.75, 11.6, 0], "size": [2, 2, 0], "pivot": [5, 12.85, 0], "rotation": [0, 0, -40], "uv": [31, 5]},
{"origin": [-6.75, 12.1, 0], "size": [1, 1, 0], "pivot": [-5, 12.85, 0], "rotation": [0, 0, 40], "uv": [37, 3]},
{"origin": [5.75, 12.1, 0], "size": [1, 1, 0], "pivot": [5, 12.85, 0], "rotation": [0, 0, -40], "uv": [32, 3]},
{"origin": [-6, 9.75, 0], "size": [2, 1, 0], "uv": [31, 8]},
{"origin": [4, 9.75, 0], "size": [2, 1, 0], "uv": [36, 8]}
]
},
{
"name": "mouth",
"name": "crown",
"parent": "torso",
"pivot": [0, 7, -4.5]
"pivot": [0, 13, 0],
"cubes": [
{"origin": [-2.5, 13, -2.25], "size": [5, 3, 0], "pivot": [0, 13, -2.25], "rotation": [20, 0, 0], "uv": [42, 60]},
{"origin": [-2.5, 13, 2.25], "size": [5, 3, 0], "pivot": [0, 13, 2.25], "rotation": [-20, 0, 0], "uv": [53, 60]},
{"origin": [2.25, 13, -2.5], "size": [0, 3, 5], "pivot": [2.25, 13, 0], "rotation": [0, 0, 20], "uv": [53, 51]},
{"origin": [-2.25, 13, -2.5], "size": [0, 3, 5], "pivot": [-2.25, 13, 0], "rotation": [0, 0, -20], "uv": [42, 51]},
{"origin": [-2, 12.25, -2], "size": [4, 1, 4], "inflate": 0.25, "uv": [0, 45]}
]
},
{
"name": "face",
"parent": "torso",
"pivot": [0, 9, -5]
},
{
"name": "mouth",
"parent": "face",
"pivot": [0, 6.75, -5]
},
{
"name": "mouth_middle",
"parent": "mouth",
"pivot": [0, 7.5, -4.5],
"pivot": [0, 7, -5],
"cubes": [
{"origin": [-1, 6.5, -4.52], "size": [2, 2, 0], "uv": [54, 18]}
{"origin": [-1, 6.5, -5.01], "size": [2, 2, 1], "uv": [1, 60]}
]
},
{
"name": "mouth_left",
"parent": "mouth",
"pivot": [2.25, 7.5, -4.5],
"pivot": [2.25, 7.25, -5],
"cubes": [
{"origin": [1.25, 6.5, -4.51], "size": [2, 2, 0], "uv": [58, 18]}
{"origin": [1.25, 6.5, -5.21], "size": [2, 2, 1], "inflate": -0.2, "uv": [15, 60]}
]
},
{
"name": "mouth_right",
"parent": "mouth",
"pivot": [-2.25, 7.5, -4.5],
"pivot": [-2.25, 7.25, -5],
"cubes": [
{"origin": [-3.25, 6.5, -4.51], "size": [2, 2, 0], "uv": [50, 18]}
{"origin": [-3.25, 6.5, -5.21], "size": [2, 2, 1], "inflate": -0.2, "uv": [8, 60]}
]
},
{
"name": "mouth_right2",
"parent": "mouth",
"pivot": [-4, 7.75, -4.51],
"cubes": [
{"origin": [-4.5, 7.5, -5.01], "size": [1, 1, 1], "uv": [22, 61]}
]
},
{
"name": "mouth_left2",
"parent": "mouth",
"pivot": [4, 7.75, -4.51],
"cubes": [
{"origin": [3.5, 7.5, -5.01], "size": [1, 1, 1], "uv": [27, 61]}
]
},
{
"name": "eyehole_left",
"parent": "face",
"pivot": [2.5, 10, -5],
"cubes": [
{"origin": [1.5, 9, -4.91], "size": [2, 2, 1], "inflate": 0.1, "uv": [1, 56]}
]
},
{
"name": "eye_left",
"parent": "torso",
"pivot": [2.5, 10, -4.5],
"parent": "eyehole_left",
"pivot": [2.35, 9.85, -5],
"cubes": [
{"origin": [1.5, 9, -4.51], "size": [2, 2, 0], "uv": [4, 6]}
{"origin": [1.85, 9.35, -4.82], "size": [1, 1, 1], "inflate": 0.2, "uv": [8, 57]}
]
},
{
"name": "pupil_left",
"parent": "eye_left",
"pivot": [2.5, 10, -4.5],
"pivot": [2.35, 9.85, -4.63],
"cubes": [
{"origin": [2, 9.5, -4.37], "size": [1, 1, 0], "inflate": 0.15, "uv": [0, 8]},
{"origin": [2, 9.5, -4.53], "size": [1, 1, 0], "uv": [4, 8], "mirror": true}
{"origin": [1.85, 9.35, -5.13], "size": [1, 1, 1], "inflate": -0.1, "uv": [13, 57]}
]
},
{
"name": "locator_eye_left",
"parent": "pupil_left",
"pivot": [2.5, 10, -4.5],
"pivot": [2.35, 9.85, -5],
"locators": {
"eye2": [2.5, 10, -4.5]
"eye2": [2.35, 9.85, -5]
}
},
{
"name": "eye_right",
"parent": "torso",
"pivot": [-2.5, 10, -4.5],
"name": "pupil_happy_left",
"parent": "eye_left",
"pivot": [2.1, 9.85, -4.9],
"cubes": [
{"origin": [-3.5, 9, -4.51], "size": [2, 2, 0], "uv": [0, 6]}
{"origin": [1.6, 9.35, -5.03], "size": [1, 1, 1], "inflate": -0.1, "uv": [28, 57]},
{"origin": [1.85, 9.1, -5.14], "size": [1, 1, 1], "inflate": -0.2, "uv": [33, 57]},
{"origin": [2.1, 9.35, -5.03], "size": [1, 1, 1], "inflate": -0.1, "uv": [23, 57]}
]
},
{
"name": "eye_detail_left",
"parent": "eye_left",
"pivot": [1.95, 10.25, -4.54],
"cubes": [
{"origin": [1.45, 9.75, -5.04], "size": [1, 1, 1], "inflate": -0.1, "uv": [18, 57]}
]
},
{
"name": "eyehole_right",
"parent": "face",
"pivot": [-2.5, 10, -5],
"cubes": [
{"origin": [-3.5, 9, -4.91], "size": [2, 2, 1], "inflate": 0.1, "uv": [1, 52]}
]
},
{
"name": "eye_right",
"parent": "eyehole_right",
"pivot": [-2.35, 9.85, -5],
"cubes": [
{"origin": [-2.85, 9.35, -4.82], "size": [1, 1, 1], "inflate": 0.2, "uv": [8, 53]}
]
},
{
"name": "pupil_right",
"parent": "eye_right",
"pivot": [-2.5, 10, -4.5],
"pivot": [-2.35, 9.85, -5],
"cubes": [
{"origin": [-3, 9.5, -4.37], "size": [1, 1, 0], "inflate": 0.15, "uv": [2, 8]},
{"origin": [-3, 9.5, -4.53], "size": [1, 1, 0], "uv": [6, 8]}
{"origin": [-2.85, 9.35, -5.13], "size": [1, 1, 1], "inflate": -0.1, "uv": [13, 53]}
]
},
{
"name": "locator_eye_right",
"parent": "pupil_right",
"pivot": [-2.5, 10, -4.5],
"pivot": [-2.35, 9.85, -5],
"locators": {
"eye1": [-2.5, 10, -4.5]
"eye1": [-2.35, 9.85, -5]
}
},
{
"name": "crown",
"name": "pupil_happy_right",
"parent": "eye_right",
"pivot": [-2.1, 9.85, -4.9],
"cubes": [
{"origin": [-2.6, 9.35, -5.03], "size": [1, 1, 1], "inflate": -0.1, "uv": [28, 53]},
{"origin": [-2.85, 9.1, -5.14], "size": [1, 1, 1], "inflate": -0.2, "uv": [33, 53]},
{"origin": [-3.1, 9.35, -5.03], "size": [1, 1, 1], "inflate": -0.1, "uv": [23, 53]}
]
},
{
"name": "eye_detail_right",
"parent": "eye_right",
"pivot": [-1.95, 10.25, -4.54],
"cubes": [
{"origin": [-2.45, 9.75, -5.04], "size": [1, 1, 1], "inflate": -0.1, "uv": [18, 53]}
]
},
{
"name": "face_ditto",
"parent": "torso",
"pivot": [0, 12, 0],
"pivot": [0, 8.75, -4.9]
},
{
"name": "eyes_ditto",
"parent": "face_ditto",
"pivot": [0, 9.5, -4.92],
"cubes": [
{"origin": [-2.5, 12, -2.5], "size": [5, 3, 0], "pivot": [0, 12, -2.5], "rotation": [15, 0, 0], "uv": [27, 6]},
{"origin": [-2.5, 12, 2.5], "size": [5, 3, 0], "pivot": [0, 12, 2.5], "rotation": [-15, 0, 0], "uv": [37, 6]},
{"origin": [2.5, 12, -2.5], "size": [0, 3, 5], "pivot": [2.5, 12, 0], "rotation": [0, 0, 15], "uv": [37, 7]},
{"origin": [-2.5, 12, -2.5], "size": [0, 3, 5], "pivot": [-2.5, 12, 0], "rotation": [0, 0, -15], "uv": [37, 4]}
{"origin": [-3.5, 9, -4.92], "size": [7, 1, 0], "uv": [25, 40]}
]
},
{
"name": "arm_left",
"name": "eyes_blink_ditto",
"parent": "face_ditto",
"pivot": [0, 9.5, -4.82],
"cubes": [
{"origin": [-4, 9, -4.82], "size": [8, 1, 0], "uv": [24, 42]},
{"origin": [-3.5, 9.5, -4.83], "size": [7, 1, 0], "uv": [25, 44]}
]
},
{
"name": "mouth_ditto",
"parent": "face_ditto",
"pivot": [0, 7.75, -4.9],
"cubes": [
{"origin": [-3, 7, -4.91], "size": [6, 1, 0], "uv": [26, 48]},
{"origin": [-4, 7.5, -4.91], "size": [8, 1, 0], "uv": [24, 46]}
]
},
{
"name": "mouth_open_ditto",
"parent": "face_ditto",
"pivot": [0, 7.5, -4.81],
"cubes": [
{"origin": [-4, 6.5, -4.81], "size": [8, 2, 0], "uv": [24, 50]}
]
},
{
"name": "mouth_open_ditto2",
"parent": "face_ditto",
"pivot": [0, 7.5, -4.81],
"cubes": [
{"origin": [-1, 6, -4.81], "size": [2, 3, 0], "uv": [17, 41]}
]
},
{
"name": "arms",
"parent": "torso",
"pivot": [4.5, 7.5, 0],
"cubes": [
{"origin": [3.5, 6, -1.5], "size": [5, 3, 3], "uv": [48, 9]}
]
},
{
"name": "arm_left2",
"parent": "arm_left",
"pivot": [8, 7.5, 0],
"cubes": [
{"origin": [7.5, 6, -1.5], "size": [6, 3, 3], "inflate": 0.01, "uv": [18, 18]}
]
},
{
"name": "arm_spike_top_left",
"parent": "arm_left2",
"pivot": [11.5, 9, 0],
"cubes": [
{"origin": [11, 9.015, -0.5], "size": [1, 0, 1], "pivot": [11.5, 9, 0], "rotation": [0, -45, 0], "uv": [55, 15]},
{"origin": [11, 8.5, 0], "size": [1, 2, 0], "uv": [56, 16]}
]
},
{
"name": "arm_spike_bottom_left",
"parent": "arm_left2",
"pivot": [11.5, 6, 0],
"cubes": [
{"origin": [11, 5.985, -0.5], "size": [1, 0, 1], "pivot": [11.5, 6, 0], "rotation": [0, -45, 0], "uv": [59, 15]},
{"origin": [11, 4.5, 0], "size": [1, 2, 0], "uv": [60, 16]}
]
},
{
"name": "arm_spike_front_left",
"parent": "arm_left2",
"pivot": [11.5, 7.5, -1.5],
"cubes": [
{"origin": [11, 7, -1.515], "size": [1, 1, 0], "pivot": [11.5, 7.5, -1.5], "rotation": [0, 0, 45], "uv": [58, 15]},
{"origin": [11, 7.5, -3], "size": [1, 0, 2], "uv": [56, 16]}
]
},
{
"name": "arm_spike_back_left",
"parent": "arm_left2",
"pivot": [11.5, 7.5, 1.5],
"cubes": [
{"origin": [11, 7, 1.515], "size": [1, 1, 0], "pivot": [11.5, 7.5, 1.5], "rotation": [0, 0, 45], "uv": [62, 15]},
{"origin": [11, 7.5, 1], "size": [1, 0, 2], "uv": [60, 16]}
]
"pivot": [0, 7.5, 0]
},
{
"name": "arm_right",
"parent": "torso",
"pivot": [-4.75, 7.5, 0],
"parent": "arms",
"pivot": [-4.5, 7.5, 0],
"cubes": [
{"origin": [-8.5, 6, -1.5], "size": [5, 3, 3], "uv": [48, 3]}
{"origin": [-8.5, 6, -1.5], "size": [5, 3, 3], "uv": [0, 28]}
]
},
{
@@ -189,76 +300,237 @@
"parent": "arm_right",
"pivot": [-8, 7.5, 0],
"cubes": [
{"origin": [-13.5, 6, -1.5], "size": [6, 3, 3], "inflate": 0.01, "uv": [0, 18]}
{"origin": [-13.5, 5.5, -2], "size": [6, 4, 4], "inflate": 0.01, "uv": [0, 20]},
{"origin": [-13.5, 7, -2], "size": [6, 1, 4], "inflate": 0.02, "uv": [44, 0]}
]
},
{
"name": "arm_spike_top_right",
"parent": "arm_right2",
"pivot": [-11.5, 9, 0],
"pivot": [-11.5, 9.5, 0],
"cubes": [
{"origin": [-12, 9.015, -0.5], "size": [1, 0, 1], "pivot": [-11.5, 9, 0], "rotation": [0, 45, 0], "uv": [47, 15]},
{"origin": [-12, 8.5, 0], "size": [1, 2, 0], "uv": [48, 16]}
{"origin": [-12, 10.5, 0], "size": [1, 1, 0], "uv": [46, 11]},
{"origin": [-12, 10.5, 0], "size": [1, 1, 0], "pivot": [-11.5, 11, 0], "rotation": [0, 90, 0], "uv": [46, 13]},
{"origin": [-12.5, 9.5, 0], "size": [2, 1, 0], "uv": [41, 11]},
{"origin": [-12.5, 9.5, 0], "size": [2, 1, 0], "pivot": [-11.5, 10, 0], "rotation": [0, 90, 0], "uv": [41, 13]}
]
},
{
"name": "arm_spike_bottom_right",
"parent": "arm_right2",
"pivot": [-11.5, 6, 0],
"pivot": [-11.5, 5.5, 0],
"cubes": [
{"origin": [-12, 5.985, -0.5], "size": [1, 0, 1], "pivot": [-11.5, 6, 0], "rotation": [0, 45, 0], "uv": [51, 15]},
{"origin": [-12, 4.5, 0], "size": [1, 2, 0], "uv": [52, 16]}
{"origin": [-12, 3.5, 0], "size": [1, 1, 0], "uv": [46, 15]},
{"origin": [-12, 3.5, 0], "size": [1, 1, 0], "pivot": [-11.5, 4, 0], "rotation": [0, 90, 0], "uv": [46, 17]},
{"origin": [-12.5, 4.5, 0], "size": [2, 1, 0], "uv": [41, 15]},
{"origin": [-12.5, 4.5, 0], "size": [2, 1, 0], "pivot": [-11.5, 5, 0], "rotation": [0, 90, 0], "uv": [41, 17]}
]
},
{
"name": "arm_spike_front_right",
"parent": "arm_right2",
"pivot": [-11.5, 7.5, -1.5],
"pivot": [-11.5, 7.5, -2],
"cubes": [
{"origin": [-12, 7, -1.515], "size": [1, 1, 0], "pivot": [-11.5, 7.5, -1.5], "rotation": [0, 0, -45], "uv": [50, 15]},
{"origin": [-12, 7.5, -3], "size": [1, 0, 2], "uv": [48, 16]}
{"origin": [-12, 7.5, -4], "size": [1, 0, 1], "uv": [45, 19]},
{"origin": [-12, 7.5, -4], "size": [1, 0, 1], "pivot": [-11.5, 7.5, -3.5], "rotation": [0, 0, 90], "uv": [45, 21]},
{"origin": [-12.5, 7.5, -3], "size": [2, 0, 1], "uv": [40, 19]},
{"origin": [-12.5, 7.5, -3], "size": [2, 0, 1], "pivot": [-11.5, 7.5, -2.5], "rotation": [0, 0, 90], "uv": [40, 21]}
]
},
{
"name": "arm_spike_back_right",
"parent": "arm_right2",
"pivot": [-11.5, 7.5, 1.5],
"pivot": [-11.5, 7.5, 2],
"cubes": [
{"origin": [-12, 7, 1.515], "size": [1, 1, 0], "pivot": [-11.5, 7.5, 1.5], "rotation": [0, 0, -45], "uv": [54, 15]},
{"origin": [-12, 7.5, 1], "size": [1, 0, 2], "uv": [52, 16]}
{"origin": [-12, 7.5, 3], "size": [1, 0, 1], "uv": [45, 23]},
{"origin": [-12, 7.5, 3], "size": [1, 0, 1], "pivot": [-11.5, 7.5, 3.5], "rotation": [0, 0, 90], "uv": [45, 25]},
{"origin": [-12.5, 7.5, 2], "size": [2, 0, 1], "uv": [40, 23]},
{"origin": [-12.5, 7.5, 2], "size": [2, 0, 1], "pivot": [-11.5, 7.5, 2.5], "rotation": [0, 0, 90], "uv": [40, 25]}
]
},
{
"name": "leg_left",
"parent": "body",
"pivot": [3.5, 3.5, 0],
"name": "locator_hand_primary",
"parent": "arm_right2",
"pivot": [-11.5, 7.5, 0],
"rotation": [0, 90, 0],
"locators": {
"hand_primary": [-11.5, 7.5, 0],
"physical": [-11.5, 7.5, 0]
}
},
{
"name": "locator_item",
"parent": "arm_right2",
"pivot": [-11.5, 5.5, 0],
"locators": {
"item": [-11.5, 5.5, 0]
}
},
{
"name": "arm_left",
"parent": "arms",
"pivot": [4.5, 7.5, 0],
"cubes": [
{"origin": [2, 2, -1.5], "size": [3, 3, 3], "uv": [39, 0]}
{"origin": [3.5, 6, -1.5], "size": [5, 3, 3], "uv": [16, 28]}
]
},
{
"name": "arm_left2",
"parent": "arm_left",
"pivot": [8, 7.5, 0],
"cubes": [
{"origin": [7.5, 5.5, -2], "size": [6, 4, 4], "inflate": 0.01, "uv": [20, 20]},
{"origin": [7.5, 7, -2], "size": [6, 1, 4], "inflate": 0.02, "uv": [44, 5]}
]
},
{
"name": "arm_spike_top_left",
"parent": "arm_left2",
"pivot": [11.5, 9.5, 0],
"cubes": [
{"origin": [11, 10.5, 0], "size": [1, 1, 0], "uv": [54, 11]},
{"origin": [11, 10.5, 0], "size": [1, 1, 0], "pivot": [11.5, 11, 0], "rotation": [0, -90, 0], "uv": [54, 13]},
{"origin": [10.5, 9.5, 0], "size": [2, 1, 0], "uv": [49, 11]},
{"origin": [10.5, 9.5, 0], "size": [2, 1, 0], "pivot": [11.5, 10, 0], "rotation": [0, -90, 0], "uv": [49, 13]}
]
},
{
"name": "arm_spike_bottom_left",
"parent": "arm_left2",
"pivot": [11.5, 5.5, 0],
"cubes": [
{"origin": [11, 3.5, 0], "size": [1, 1, 0], "uv": [54, 15]},
{"origin": [11, 3.5, 0], "size": [1, 1, 0], "pivot": [11.5, 4, 0], "rotation": [0, -90, 0], "uv": [54, 17]},
{"origin": [10.5, 4.5, 0], "size": [2, 1, 0], "uv": [49, 15]},
{"origin": [10.5, 4.5, 0], "size": [2, 1, 0], "pivot": [11.5, 5, 0], "rotation": [0, -90, 0], "uv": [49, 17]}
]
},
{
"name": "arm_spike_front_left",
"parent": "arm_left2",
"pivot": [11.5, 7.5, -2],
"cubes": [
{"origin": [11, 7.5, -4], "size": [1, 0, 1], "uv": [53, 19]},
{"origin": [11, 7.5, -4], "size": [1, 0, 1], "pivot": [11.5, 7.5, -3.5], "rotation": [0, 0, -90], "uv": [53, 21]},
{"origin": [10.5, 7.5, -3], "size": [2, 0, 1], "uv": [48, 19]},
{"origin": [10.5, 7.5, -3], "size": [2, 0, 1], "pivot": [11.5, 7.5, -2.5], "rotation": [0, 0, -90], "uv": [48, 21]}
]
},
{
"name": "arm_spike_back_left",
"parent": "arm_left2",
"pivot": [11.5, 7.5, 2],
"cubes": [
{"origin": [11, 7.5, 3], "size": [1, 0, 1], "uv": [53, 23]},
{"origin": [11, 7.5, 3], "size": [1, 0, 1], "pivot": [11.5, 7.5, 3.5], "rotation": [0, 0, -90], "uv": [53, 25]},
{"origin": [10.5, 7.5, 2], "size": [2, 0, 1], "uv": [48, 23]},
{"origin": [10.5, 7.5, 2], "size": [2, 0, 1], "pivot": [11.5, 7.5, 2.5], "rotation": [0, 0, -90], "uv": [48, 25]}
]
},
{
"name": "locator_hand_secondary",
"parent": "arm_left2",
"pivot": [11.5, 7.5, 0],
"rotation": [0, -90, 0],
"locators": {
"hand_secondary": [11.5, 7.5, 0]
}
},
{
"name": "locator_face",
"parent": "torso",
"pivot": [0, 9, -5],
"locators": {
"face": [0, 9, -5]
}
},
{
"name": "locator_mouth",
"parent": "torso",
"pivot": [0, 7.5, -5],
"locators": {
"mouth": [0, 7.5, -5],
"special": [0, 7.5, -5]
}
},
{
"name": "locator_head",
"parent": "torso",
"pivot": [0, 13, -2.5],
"locators": {
"head": [0, 13, -2.5]
}
},
{
"name": "item_hat",
"parent": "torso",
"pivot": [0, 13, 0],
"locators": {
"item_hat": [0, 14, 0]
}
},
{
"name": "locator_item_face",
"parent": "torso",
"pivot": [0, 10.5, -5],
"locators": {
"item_face": [0, 10.5, -5]
}
},
{
"name": "legs",
"parent": "body_pivot",
"pivot": [0, 3.5, 0]
},
{
"name": "leg_left",
"parent": "legs",
"pivot": [3.75, 3.5, 0],
"cubes": [
{"origin": [2.25, 2, -1.5], "size": [3, 3, 3], "uv": [12, 34]}
]
},
{
"name": "leg_left2",
"parent": "leg_left",
"pivot": [3.5, 2, 0],
"pivot": [3.75, 2, 0],
"cubes": [
{"origin": [2.5, 0, -1], "size": [2, 2, 2], "uv": [42, 16]}
{"origin": [2.75, 0, -1], "size": [2, 2, 2], "uv": [8, 40]}
]
},
{
"name": "locator_foot_secondary",
"parent": "leg_left2",
"pivot": [3.75, 1, 0],
"rotation": [90, 0, 0],
"locators": {
"foot_secondary": [3.75, 1, 0]
}
},
{
"name": "leg_right",
"parent": "body",
"pivot": [-3.5, 3.5, 0],
"parent": "legs",
"pivot": [-3.75, 3.5, 0],
"cubes": [
{"origin": [-5, 2, -1.5], "size": [3, 3, 3], "uv": [27, 0]}
{"origin": [-5.25, 2, -1.5], "size": [3, 3, 3], "uv": [0, 34]}
]
},
{
"name": "leg_right2",
"parent": "leg_right",
"pivot": [-3.5, 2, 0],
"pivot": [-3.75, 2, 0],
"cubes": [
{"origin": [-4.5, 0, -1], "size": [2, 2, 2], "uv": [34, 16]}
{"origin": [-4.75, 0, -1], "size": [2, 2, 2], "uv": [0, 40]}
]
},
{
"name": "locator_foot_primary",
"parent": "leg_right2",
"pivot": [-3.75, 1, 0],
"rotation": [90, 0, 0],
"locators": {
"foot_primary": [-3.75, 1, 0]
}
}
]
}
@@ -15,40 +15,143 @@
"name": "spheal",
"pivot": [0, 0, 0]
},
{
"name": "locator_root",
"parent": "spheal",
"pivot": [0, 0, 0],
"locators": {
"root": [0, 0, 0]
}
},
{
"name": "locator_top",
"parent": "spheal",
"pivot": [0, 14, 0],
"locators": {
"top": [0, 14, 0]
}
},
{
"name": "body",
"parent": "spheal",
"pivot": [0, 6.5, 0]
"pivot": [0, 7, 0]
},
{
"name": "torso",
"parent": "body",
"pivot": [0, 8, 1],
"pivot": [0, 8, 1]
},
{
"name": "body_roll",
"parent": "torso",
"pivot": [0, 7, 0],
"cubes": [
{"origin": [-7, 0, -7], "size": [14, 14, 14], "uv": [0, 0]}
]
},
{
"name": "locator_head",
"parent": "body_roll",
"pivot": [0, 14, -3],
"locators": {
"head": [0, 14, -3]
}
},
{
"name": "locator_item_hat",
"parent": "body_roll",
"pivot": [0, 16.75, 0],
"locators": {
"item_hat": [0, 16.75, 0]
}
},
{
"name": "locator_item_face",
"parent": "body_roll",
"pivot": [0, 11.25, -7.225],
"rotation": [-12.5, 0, 0],
"locators": {
"item_face": [0, 11.25, -7.225]
}
},
{
"name": "ditto_face",
"parent": "body_roll",
"pivot": [0, -2, 2]
},
{
"name": "ditto_eye_left",
"parent": "ditto_face",
"pivot": [3.5, 10.125, -5.45],
"cubes": [
{"origin": [3, 9.5, -6], "size": [1, 1, 1], "inflate": 0.01, "uv": [56, 15]}
]
},
{
"name": "ditto_eyelid_left",
"parent": "ditto_eye_left",
"pivot": [3.5, 10.25, -5.4],
"cubes": [
{"origin": [2.5, 9.5, -5.9], "size": [2, 1, 1], "inflate": 0.01, "uv": [0, 56]},
{"origin": [3, 10, -5.9], "size": [1, 1, 1], "inflate": 0.02, "uv": [56, 17]}
]
},
{
"name": "ditto_eye_right",
"parent": "ditto_face",
"pivot": [-3.5, 10.125, -5.45],
"cubes": [
{"origin": [-4, 9.5, -6], "size": [1, 1, 1], "inflate": 0.01, "uv": [18, 56]}
]
},
{
"name": "ditto_eyelid_right",
"parent": "ditto_eye_right",
"pivot": [-3.5, 10.25, -5.4],
"cubes": [
{"origin": [-4.5, 9.5, -5.9], "size": [2, 1, 1], "inflate": 0.01, "uv": [56, 0]},
{"origin": [-4, 10, -5.9], "size": [1, 1, 1], "inflate": 0.02, "uv": [56, 19]}
]
},
{
"name": "ditto_mouth",
"parent": "ditto_face",
"pivot": [0, 9, -6.01],
"cubes": [
{"origin": [-5, 7.5, -6], "size": [10, 1, 1], "inflate": 0.01, "uv": [30, 44]},
{"origin": [5, 8, -6], "size": [1, 1, 1], "inflate": 0.01, "uv": [56, 21]},
{"origin": [-6, 8, -6], "size": [1, 1, 1], "inflate": 0.01, "uv": [22, 56]}
]
},
{
"name": "ditto_mouth_open",
"parent": "ditto_face",
"pivot": [0, 7.2, -5.91],
"cubes": [
{"origin": [-6, 7, -5.9], "size": [12, 2, 0], "inflate": 0.01, "uv": [30, 37]}
]
},
{
"name": "ear_left",
"parent": "torso",
"pivot": [5, 14, -5],
"parent": "body_roll",
"pivot": [4.7, 14, -5],
"rotation": [12.5, 0, 15],
"cubes": [
{"origin": [3.5, 13, -6], "size": [3, 3, 2], "pivot": [5, 14.5, -5], "rotation": [0, 0, 0], "uv": [0, 5]}
{"origin": [3.2, 13, -6], "size": [3, 3, 2], "uv": [16, 48]}
]
},
{
"name": "ear_right",
"parent": "torso",
"pivot": [-5, 14, -5],
"parent": "body_roll",
"pivot": [-4.7, 14, -5],
"rotation": [12.5, 0, -15],
"cubes": [
{"origin": [-6.5, 13, -6], "size": [3, 3, 2], "pivot": [-5, 14.5, -5], "rotation": [0, 0, 0], "uv": [0, 0]}
{"origin": [-6.2, 13, -6], "size": [3, 3, 2], "uv": [26, 52]}
]
},
{
"name": "tail",
"parent": "torso",
"parent": "body_roll",
"pivot": [0, 1.5, 7],
"rotation": [17.5, 0, 0]
},
@@ -57,17 +160,33 @@
"parent": "tail",
"pivot": [0, 1.5, 7],
"cubes": [
{"origin": [-2.5, 1.55, 6], "size": [5, 0, 10], "uv": [20, 28]},
{"origin": [-2, 1.55, 7], "size": [4, 0, 2], "inflate": 0.005, "uv": [0, 10]}
{"origin": [-2.5, 1.55, 6], "size": [5, 0, 10], "uv": [0, 28]},
{"origin": [-2, 1.55, 7], "size": [4, 0, 2], "inflate": 0.01, "uv": [36, 52]}
]
},
{
"name": "locator_tail",
"parent": "tail2",
"pivot": [0, 1.55, 9.5],
"locators": {
"tail": [0, 1.55, 9.5]
}
},
{
"name": "locator_tail_tip",
"parent": "tail2",
"pivot": [0, 1.55, 15],
"locators": {
"tail_tip": [0, 1.55, 15]
}
},
{
"name": "tail_left",
"parent": "tail",
"pivot": [1.4, 1.5, 7],
"rotation": [0, 27.5, 0],
"cubes": [
{"origin": [-1.1, 1.5, 5.6], "size": [5, 0, 10], "uv": [10, 28]}
{"origin": [-1.1, 1.5, 5.6], "size": [5, 0, 10], "uv": [33, 0]}
]
},
{
@@ -76,98 +195,290 @@
"pivot": [-1.4, 1.5, 7],
"rotation": [0, -27.5, 0],
"cubes": [
{"origin": [-3.9, 1.5, 5.6], "size": [5, 0, 10], "uv": [0, 28]}
{"origin": [-3.9, 1.5, 5.6], "size": [5, 0, 10], "uv": [0, 38]}
]
},
{
"name": "flipper_left",
"parent": "torso",
"pivot": [6, 2, -5.5],
"parent": "body_roll",
"pivot": [6, 1, -5.5],
"cubes": [
{"origin": [5, 1, -7], "size": [5, 2, 3], "inflate": 0.005, "uv": [41, 40]}
{"origin": [5, 1, -7], "size": [5, 2, 3], "inflate": 0.005, "uv": [0, 48]}
]
},
{
"name": "locator_hand_secondary",
"parent": "flipper_left",
"pivot": [9, 2, -5.5],
"rotation": [0, -90, 0],
"locators": {
"hand_secondary": [9, 2, -5.5]
}
},
{
"name": "flipper_right",
"parent": "torso",
"pivot": [-6, 2, -5.5],
"parent": "body_roll",
"pivot": [-6, 1, -5.5],
"cubes": [
{"origin": [-10, 1, -7], "size": [5, 2, 3], "inflate": 0.005, "uv": [40, 31]}
{"origin": [-10, 1, -7], "size": [5, 2, 3], "inflate": 0.005, "uv": [48, 47]}
]
},
{
"name": "locator_item",
"parent": "flipper_right",
"pivot": [-9.5, 1, -5.5],
"locators": {
"item": [-9.5, 1, -5.5]
}
},
{
"name": "locator_hand_primary",
"parent": "flipper_right",
"pivot": [-9, 2, -5.5],
"rotation": [0, 90, 0],
"locators": {
"hand_primary": [-9, 2, -5.5]
}
},
{
"name": "face",
"parent": "torso",
"pivot": [0, -1, 1]
},
{
"name": "open_mouth",
"parent": "face",
"pivot": [0.5, 6.7, -7],
"cubes": [
{"origin": [-4.5, 3.6, -6.9], "size": [9, 5, 0], "inflate": 0.01, "uv": [24, 38]}
]
},
{
"name": "snout",
"parent": "face",
"pivot": [0, 10.5, -7],
"cubes": [
{"origin": [-5.5, 7.71251, -7.7637], "size": [11, 3, 1], "uv": [0, 38]},
{"origin": [-2, 8.71251, -7.7637], "size": [4, 1, 0], "inflate": 0.005, "uv": [0, 12]},
{"origin": [2, 6.7, -7.2], "size": [2, 2, 0], "pivot": [3, 7.7, -7.2], "rotation": [0, 0, 45], "uv": [10, 9]},
{"origin": [-4, 6.7, -7.2], "size": [2, 2, 0], "pivot": [-3, 7.7, -7.2], "rotation": [0, 0, -45], "uv": [10, 7]}
]
"parent": "body_roll",
"pivot": [0, -2, 1]
},
{
"name": "eye_left",
"parent": "face",
"pivot": [4.5, 10.5, -6],
"rotation": [0, 0, 2.5],
"pivot": [4.5, 9.5, -6],
"cubes": [
{"origin": [2.5, 10.5, -7], "size": [2, 2, 0], "inflate": 0.01, "uv": [10, 11]}
{"origin": [2.5, 9.5, -7], "size": [2, 2, 1], "inflate": 0.01, "uv": [8, 53]}
]
},
{
"name": "shine_left",
"parent": "eye_left",
"pivot": [3.2, 10.8, -6.5],
"cubes": [
{"origin": [2.7, 10.3, -7], "size": [1, 1, 1], "inflate": 0.02, "uv": [56, 7]}
]
},
{
"name": "locator_eye_left",
"parent": "eye_left",
"pivot": [3.5, 11.5, -7],
"parent": "shine_left",
"pivot": [3.25, 10.75, -7],
"locators": {
"eye2": [3.5, 11.5, -7]
"eye2": [3.25, 10.75, -7]
}
},
{
"name": "eyelid_left",
"parent": "eye_left",
"pivot": [3.5, 10.5, -6],
"pivot": [3.5, 9.5, -6],
"cubes": [
{"origin": [2.5, 10.5, -6.91], "size": [2, 2, 0], "inflate": 0.01, "uv": [10, 2]}
{"origin": [2.5, 9.5, -6.9], "size": [2, 2, 1], "inflate": 0.03, "uv": [14, 53]}
]
},
{
"name": "eyelid_angry_left",
"parent": "eye_left",
"pivot": [3.5, 9.5, -6],
"cubes": [
{"origin": [2.5, 10.5, -6.9], "size": [1, 1, 1], "inflate": 0.03, "uv": [56, 9]}
]
},
{
"name": "eyelid_sad_left",
"parent": "eye_left",
"pivot": [3.5, 9.5, -6],
"cubes": [
{"origin": [3.5, 10.5, -6.9], "size": [1, 1, 1], "inflate": 0.03, "uv": [10, 56]}
]
},
{
"name": "eyelid_unamused_left",
"parent": "eye_left",
"pivot": [3.5, 9.5, -6],
"cubes": [
{"origin": [2.5, 10.5, -6.9], "size": [2, 1, 1], "inflate": 0.03, "uv": [48, 55]}
]
},
{
"name": "eyelid_recoil_left",
"parent": "eye_left",
"pivot": [3.5, 9.5, -6],
"cubes": [
{"origin": [2.5, 9.5, -6.9], "size": [2, 2, 1], "inflate": 0.03, "uv": [54, 37]}
]
},
{
"name": "eyelid_happy_left",
"parent": "eye_left",
"pivot": [3.5, 9.5, -6],
"cubes": [
{"origin": [2, 9.5, -6.9], "size": [3, 2, 1], "inflate": 0.03, "uv": [48, 52]}
]
},
{
"name": "eye_right",
"parent": "face",
"pivot": [-4.5, 10.5, -6],
"rotation": [0, 0, -2.5],
"pivot": [-4.5, 9.5, -6],
"cubes": [
{"origin": [-4.5, 10.5, -7], "size": [2, 2, 0], "inflate": 0.01, "uv": [8, 5]}
{"origin": [-4.5, 9.5, -7], "size": [2, 2, 1], "inflate": 0.01, "uv": [20, 53]}
]
},
{
"name": "shine_right",
"parent": "eye_right",
"pivot": [-3.2, 10.8, -6.5],
"cubes": [
{"origin": [-3.7, 10.3, -7], "size": [1, 1, 1], "inflate": 0.02, "uv": [56, 11]}
]
},
{
"name": "locator_eye_right",
"parent": "eye_right",
"pivot": [-3.5, 11.5, -7],
"parent": "shine_right",
"pivot": [-3.25, 10.75, -7],
"locators": {
"eye1": [-3.5, 11.5, -7]
"eye1": [-3.25, 10.75, -7]
}
},
{
"name": "eyelid_right",
"parent": "eye_right",
"pivot": [-3.5, 10.5, -6],
"pivot": [-3.5, 9.5, -6],
"cubes": [
{"origin": [-4.5, 10.5, -6.91], "size": [2, 2, 0], "inflate": 0.01, "uv": [8, 0]}
{"origin": [-4.5, 9.5, -6.9], "size": [2, 2, 1], "inflate": 0.03, "uv": [36, 54]}
]
},
{
"name": "eyelid_angry_right",
"parent": "eye_right",
"pivot": [-3.5, 9.5, -6],
"cubes": [
{"origin": [-3.5, 10.5, -6.9], "size": [1, 1, 1], "inflate": 0.03, "uv": [56, 13]}
]
},
{
"name": "eyelid_sad_right",
"parent": "eye_right",
"pivot": [-3.5, 9.5, -6],
"cubes": [
{"origin": [-4.5, 10.5, -6.9], "size": [1, 1, 1], "inflate": 0.03, "uv": [14, 56]}
]
},
{
"name": "eyelid_unamused_right",
"parent": "eye_right",
"pivot": [-3.5, 9.5, -6],
"cubes": [
{"origin": [-4.5, 10.5, -6.9], "size": [2, 1, 1], "inflate": 0.03, "uv": [54, 55]}
]
},
{
"name": "eyelid_recoil_right",
"parent": "eye_right",
"pivot": [-3.5, 9.5, -6],
"cubes": [
{"origin": [-4.5, 9.5, -6.9], "size": [2, 2, 1], "inflate": 0.03, "uv": [42, 54]}
]
},
{
"name": "eyelid_happy_right",
"parent": "eye_right",
"pivot": [-3.5, 9.5, -6],
"cubes": [
{"origin": [-5, 9.5, -6.9], "size": [3, 2, 1], "inflate": 0.03, "uv": [0, 53]}
]
},
{
"name": "snout",
"parent": "face",
"pivot": [0, 9.5, -7],
"cubes": [
{"origin": [-5, 7.75, -7.75], "size": [10, 2, 1], "uv": [30, 41]},
{"origin": [2, 6.2, -7.5], "size": [2, 2, 0], "uv": [56, 5]},
{"origin": [-4, 6.2, -7.5], "size": [2, 2, 0], "uv": [6, 56]}
]
},
{
"name": "locator_face",
"parent": "snout",
"pivot": [0, 9.75, -7.75],
"locators": {
"face": [0, 9.75, -7.75]
}
},
{
"name": "locator_mouth",
"parent": "snout",
"pivot": [0, 7.5, -7],
"locators": {
"mouth": [0, 7.5, -7]
}
},
{
"name": "locator_special",
"parent": "snout",
"pivot": [0, 7.5, -7],
"locators": {
"special": [0, 7.5, -7]
}
},
{
"name": "mouth_frown",
"parent": "face",
"pivot": [0, 7.5, -6.91],
"cubes": [
{"origin": [4.99, 6, -6.91], "size": [2, 3, 0], "uv": [26, 48]},
{"origin": [-6.99, 6, -6.91], "size": [2, 3, 0], "uv": [56, 2]}
]
},
{
"name": "mouth_open_smile",
"parent": "face",
"pivot": [0, 5.2, -6.91],
"cubes": [
{"origin": [-4.5, 2.7, -6.91], "size": [9, 6, 0], "uv": [30, 46]}
]
},
{
"name": "mouth_open_cheesing",
"parent": "face",
"pivot": [0, 8, -6.9],
"cubes": [
{"origin": [-6, 7, -6.9], "size": [12, 2, 0], "inflate": 0.01, "uv": [30, 39]}
]
},
{
"name": "mouth_open_neutral",
"parent": "face",
"pivot": [0, 7.2, -6.91],
"cubes": [
{"origin": [-2.5, 5.7, -6.91], "size": [5, 3, 0], "uv": [52, 41]}
]
},
{
"name": "locator_middle",
"parent": "body",
"pivot": [0, 7, 0],
"locators": {
"middle": [0, 7, 0]
}
},
{
"name": "locator_target",
"parent": "body",
"pivot": [0, 7, -9],
"locators": {
"target": [0, 7, -9]
}
},
{
"name": "locator_physical",
"parent": "body",
"pivot": [0, 7, -9],
"locators": {
"physical": [0, 7, -9]
}
}
]
}
@@ -0,0 +1,470 @@
{
"format_version": "1.12.0",
"minecraft:geometry": [
{
"description": {
"identifier": "geometry.burmy_plant",
"texture_width": 64,
"texture_height": 64,
"visible_bounds_width": 2,
"visible_bounds_height": 3.5,
"visible_bounds_offset": [0, 1.25, 0]
},
"bones": [
{
"name": "burmy_plant",
"pivot": [0, 0, 0]
},
{
"name": "locator_root",
"parent": "burmy_plant",
"pivot": [0, 0, 0],
"locators": {
"root": [0, 0, 0]
}
},
{
"name": "locator_top",
"parent": "burmy_plant",
"pivot": [0, 24, 0],
"locators": {
"top": [0, 24, 0]
}
},
{
"name": "body",
"parent": "burmy_plant",
"pivot": [0, 19, 0]
},
{
"name": "body_rotation",
"parent": "body",
"pivot": [0, 13, 0],
"cubes": [
{"origin": [-3, 9, -2.5], "size": [6, 5, 5], "inflate": -0.1, "uv": [0, 0]}
]
},
{
"name": "locator_middle",
"parent": "body_rotation",
"pivot": [0, 8.5, 0],
"locators": {
"middle": [0, 8.5, 0]
}
},
{
"name": "locator_target",
"parent": "body_rotation",
"pivot": [0, 8.5, -6],
"locators": {
"target": [0, 8.5, -6]
}
},
{
"name": "face",
"parent": "body_rotation",
"pivot": [-0.05, 11.75, -3.41]
},
{
"name": "locator_mouth",
"parent": "face",
"pivot": [0, 10.25, -3.75],
"locators": {
"mouth": [0, 10.25, -3.75]
}
},
{
"name": "locator_item_face",
"parent": "face",
"pivot": [0, 11.75, -3.4],
"locators": {
"item_face": [0, 11.75, -3.4]
}
},
{
"name": "locator_face",
"parent": "face",
"pivot": [0, 11.75, -3.4],
"locators": {
"face": [0, 11.75, -3.4]
}
},
{
"name": "locator_special",
"parent": "face",
"pivot": [0, 10.5, -4.5],
"locators": {
"special": [0, 10.5, -4.5]
}
},
{
"name": "eyes",
"parent": "face",
"pivot": [-0.05, 11.75, -3.41]
},
{
"name": "eye_left",
"parent": "eyes",
"pivot": [1.9, 11.75, -3.41],
"cubes": [
{"origin": [1.4, 10.75, -3.41], "size": [1, 2, 1], "uv": [1, 33]}
]
},
{
"name": "eye_expression_left",
"parent": "eye_left",
"pivot": [1.9, 12.75, -2.82],
"cubes": [
{"origin": [1.4, 12.25, -3.32], "size": [1, 1, 1], "inflate": 0.01, "uv": [1, 37]}
]
},
{
"name": "pupil_left",
"parent": "eye_left",
"pivot": [1.65, 11.75, -3.42],
"cubes": [
{"origin": [1.15, 11.25, -3.42], "size": [1, 1, 1], "uv": [11, 33]}
]
},
{
"name": "locator_eye_left",
"parent": "pupil_left",
"pivot": [1.65, 11.75, -3.4],
"locators": {
"eye2": [1.65, 11.75, -3.4]
}
},
{
"name": "pupil_closed_left",
"parent": "eye_left",
"pivot": [1.75, 11.75, -3.32]
},
{
"name": "pupil_closed_left1",
"parent": "pupil_closed_left",
"pivot": [1.4, 11.75, -3.02],
"cubes": [
{"origin": [0.9, 11.25, -3.52], "size": [1, 1, 1], "inflate": -0.2, "uv": [1, 40]}
]
},
{
"name": "pupil_closed_left2",
"parent": "pupil_closed_left",
"pivot": [2, 11.75, -3.02],
"cubes": [
{"origin": [1.5, 11.25, -3.52], "size": [1, 1, 1], "inflate": -0.2, "uv": [1, 43]}
]
},
{
"name": "pupil_closed_left3",
"parent": "pupil_closed_left",
"pivot": [1.7, 11.45, -2.92],
"cubes": [
{"origin": [1.2, 10.95, -3.42], "size": [1, 1, 1], "inflate": -0.19, "uv": [11, 36]}
]
},
{
"name": "eye_right",
"parent": "eyes",
"pivot": [-1.9, 11.75, -3.41],
"cubes": [
{"origin": [-2.4, 10.75, -3.41], "size": [1, 2, 1], "uv": [6, 33], "mirror": true}
]
},
{
"name": "eye_expression_right",
"parent": "eye_right",
"pivot": [-1.9, 12.75, -2.82],
"cubes": [
{"origin": [-2.4, 12.25, -3.32], "size": [1, 1, 1], "inflate": 0.01, "uv": [6, 37], "mirror": true}
]
},
{
"name": "pupil_right",
"parent": "eye_right",
"pivot": [-1.65, 11.75, -3.42],
"cubes": [
{"origin": [-2.15, 11.25, -3.42], "size": [1, 1, 1], "uv": [16, 33], "mirror": true}
]
},
{
"name": "locator_eye_right",
"parent": "pupil_right",
"pivot": [-1.65, 11.75, -3.4],
"locators": {
"eye1": [-1.65, 11.75, -3.4]
}
},
{
"name": "pupil_closed_right",
"parent": "eye_right",
"pivot": [-1.75, 11.75, -3.32]
},
{
"name": "pupil_closed_right1",
"parent": "pupil_closed_right",
"pivot": [-1.4, 11.75, -3.02],
"cubes": [
{"origin": [-1.9, 11.25, -3.52], "size": [1, 1, 1], "inflate": -0.2, "uv": [6, 40], "mirror": true}
]
},
{
"name": "pupil_closed_right2",
"parent": "pupil_closed_right",
"pivot": [-2, 11.75, -3.02],
"cubes": [
{"origin": [-2.5, 11.25, -3.52], "size": [1, 1, 1], "inflate": -0.2, "uv": [6, 43], "mirror": true}
]
},
{
"name": "pupil_closed_right3",
"parent": "pupil_closed_right",
"pivot": [-1.7, 11.45, -2.92],
"cubes": [
{"origin": [-2.2, 10.95, -3.42], "size": [1, 1, 1], "inflate": -0.19, "uv": [16, 36], "mirror": true}
]
},
{
"name": "beak",
"parent": "face",
"pivot": [0, 11.5, -3.4],
"rotation": [45, 0, 0],
"cubes": [
{"origin": [-0.5, 10.5, -4.4], "size": [1, 1, 1], "uv": [1, 3]}
]
},
{
"name": "jaw",
"parent": "beak",
"pivot": [0, 10.495, -3.15],
"cubes": [
{"origin": [-0.5, 10.5, -3.41], "size": [1, 1, 0], "uv": [4, 17]},
{"origin": [-0.5, 10.5, -4.05], "size": [1, 0, 1], "pivot": [0, 10.5, -3.4], "rotation": [5, 0, 0], "uv": [3, 19]}
]
},
{
"name": "face_ditto",
"parent": "body_rotation",
"pivot": [0, 11.75, -3.3]
},
{
"name": "eyes_ditto",
"parent": "face_ditto",
"pivot": [0, 12.5, -3.32],
"cubes": [
{"origin": [-2, 12, -3.32], "size": [4, 1, 0], "uv": [22, 33]}
]
},
{
"name": "eyes_blink_ditto",
"parent": "face_ditto",
"pivot": [0, 12.5, -3.22],
"cubes": [
{"origin": [-2.5, 12, -3.22], "size": [5, 1, 0], "uv": [21, 35]},
{"origin": [-2, 12.5, -3.23], "size": [4, 1, 0], "uv": [22, 37]}
]
},
{
"name": "mouth_ditto",
"parent": "face_ditto",
"pivot": [0, 10.75, -3.3],
"cubes": [
{"origin": [-1.5, 10, -3.31], "size": [3, 1, 0], "uv": [23, 41]},
{"origin": [-2.5, 10.5, -3.31], "size": [5, 1, 0], "uv": [21, 39]}
]
},
{
"name": "mouth_open_ditto",
"parent": "face_ditto",
"pivot": [0, 10.5, -3.21],
"cubes": [
{"origin": [-2.5, 9.5, -3.21], "size": [5, 2, 0], "uv": [21, 43]}
]
},
{
"name": "segment1",
"parent": "body_rotation",
"pivot": [0, 10.1, 0],
"cubes": [
{"origin": [-2, 6.35, -1.5], "size": [4, 3, 3], "inflate": 0.12, "uv": [0, 10]}
]
},
{
"name": "leg_left1",
"parent": "segment1",
"pivot": [1.5, 7.85, -1.5],
"cubes": [
{"origin": [1, 7.35, -2.5], "size": [1, 1, 1], "inflate": 0.1, "uv": [17, 1]}
]
},
{
"name": "leg_right1",
"parent": "segment1",
"pivot": [-1.5, 7.85, -1.5],
"cubes": [
{"origin": [-2, 7.35, -2.5], "size": [1, 1, 1], "inflate": 0.1, "uv": [17, 3], "mirror": true}
]
},
{
"name": "segment2",
"parent": "segment1",
"pivot": [0, 6.6, 0],
"cubes": [
{"origin": [-2, 3.6, -1.5], "size": [4, 3, 3], "inflate": 0.06, "uv": [14, 10]}
]
},
{
"name": "leg_left2",
"parent": "segment2",
"pivot": [1.45, 5.1, -1.5],
"cubes": [
{"origin": [0.95, 4.6, -2.5], "size": [1, 1, 1], "inflate": 0.1, "uv": [22, 6]}
]
},
{
"name": "leg_right2",
"parent": "segment2",
"pivot": [-1.45, 5.1, -1.5],
"cubes": [
{"origin": [-1.95, 4.6, -2.5], "size": [1, 1, 1], "inflate": 0.1, "uv": [26, 6], "mirror": true}
]
},
{
"name": "segment3",
"parent": "segment2",
"pivot": [0, 4.1, 0],
"cubes": [
{"origin": [-2, 1.1, -1.5], "size": [4, 3, 3], "inflate": 0.01, "uv": [22, 0]}
]
},
{
"name": "leg_left3",
"parent": "segment3",
"pivot": [1.4, 2.6, -1.5],
"cubes": [
{"origin": [0.9, 2.1, -2.5], "size": [1, 1, 1], "inflate": 0.1, "uv": [22, 8]}
]
},
{
"name": "leg_right3",
"parent": "segment3",
"pivot": [-1.4, 2.6, -1.5],
"cubes": [
{"origin": [-1.9, 2.1, -2.5], "size": [1, 1, 1], "inflate": 0.1, "uv": [26, 8], "mirror": true}
]
},
{
"name": "spring",
"parent": "body_rotation",
"pivot": [-1, 14, 1],
"cubes": [
{"origin": [-1.95, 13.5, -2], "size": [4, 2, 4], "inflate": -0.25, "pivot": [0.05, 14.5, 0], "rotation": [2.5, 0, -5], "uv": [36, 0]}
]
},
{
"name": "spring2",
"parent": "spring",
"pivot": [1, 15.25, -1],
"cubes": [
{"origin": [-1.5, 14.75, -1.5], "size": [3, 2, 3], "pivot": [0, 15.75, 0], "rotation": [2.5, 0, -5], "uv": [34, 6]}
]
},
{
"name": "spring3",
"parent": "spring2",
"pivot": [-1, 16.75, 1],
"cubes": [
{"origin": [-1.5, 16.25, -1.5], "size": [3, 2, 3], "inflate": -0.25, "pivot": [0, 17.25, 0], "rotation": [0, 0, -2.5], "uv": [52, 0]}
]
},
{
"name": "spring4",
"parent": "spring3",
"pivot": [0, 18.25, 0],
"rotation": [0, -7.5, -27.5],
"cubes": [
{"origin": [-0.5, 17.75, -1], "size": [2, 1, 2], "uv": [29, 6]}
]
},
{
"name": "cloak_plant",
"parent": "body_rotation",
"pivot": [0, 13, 0],
"cubes": [
{"origin": [-3.5, 5, -3.5], "size": [7, 9, 7], "inflate": 0.005, "uv": [0, 16]},
{"origin": [-3, 2, -3], "size": [6, 3, 6], "inflate": 0.005, "uv": [22, 11]},
{"origin": [-3.5, 5, -3.5], "size": [7, 9, 7], "inflate": 0.35, "uv": [0, 48]},
{"origin": [-3, 2, -3], "size": [6, 3, 6], "inflate": 0.35, "uv": [28, 55]}
]
},
{
"name": "locator_item",
"parent": "cloak_plant",
"pivot": [-3.9, 7, 3.5],
"rotation": [-110, 15, -17.5],
"locators": {
"item": [-3.9, 7, 3.5]
}
},
{
"name": "locator_head",
"parent": "cloak_plant",
"pivot": [0, 14, -3.5],
"locators": {
"head": [0, 14, -3.5]
}
},
{
"name": "locator_item_hat",
"parent": "cloak_plant",
"pivot": [0, 15, 0],
"locators": {
"item_hat": [0, 15, 0]
}
},
{
"name": "locator_physical",
"parent": "cloak_plant",
"pivot": [0, 3.75, 0],
"locators": {
"physical": [0, 3.75, 0]
}
},
{
"name": "cloaked_face",
"parent": "cloak_plant",
"pivot": [0, 11.5, -3.5],
"cubes": [
{"origin": [-3, 9, -3.4], "size": [6, 5, 0], "uv": [30, 22]}
]
},
{
"name": "cloak_plant_bottom",
"parent": "cloak_plant",
"pivot": [0, 2, 0],
"cubes": [
{"origin": [-2.5, 0.25, 0], "size": [5, 2, 0], "uv": [23, 51]}
]
},
{
"name": "plant_cloak_stick_left",
"parent": "cloak_plant",
"pivot": [2.75, 2.25, 0],
"rotation": [0, 0, -20],
"cubes": [
{"origin": [2.25, 0, -0.5], "size": [1, 3, 1], "uv": [56, 60]}
]
},
{
"name": "plant_cloak_stick_right",
"parent": "cloak_plant",
"pivot": [-2.75, 2.25, 0],
"rotation": [0, 0, 20],
"cubes": [
{"origin": [-3.25, 0, -0.5], "size": [1, 3, 1], "uv": [60, 60], "mirror": true}
]
}
]
}
]
}
@@ -0,0 +1,457 @@
{
"format_version": "1.12.0",
"minecraft:geometry": [
{
"description": {
"identifier": "geometry.burmy_sandy",
"texture_width": 64,
"texture_height": 64,
"visible_bounds_width": 2,
"visible_bounds_height": 3.5,
"visible_bounds_offset": [0, 1.25, 0]
},
"bones": [
{
"name": "burmy_sandy",
"pivot": [0, 0, 0]
},
{
"name": "locator_root",
"parent": "burmy_sandy",
"pivot": [0, 0, 0],
"locators": {
"root": [0, 0, 0]
}
},
{
"name": "locator_top",
"parent": "burmy_sandy",
"pivot": [0, 24, 0],
"locators": {
"top": [0, 24, 0]
}
},
{
"name": "body",
"parent": "burmy_sandy",
"pivot": [0, 19, 0]
},
{
"name": "body_rotation",
"parent": "body",
"pivot": [0, 13, 0],
"cubes": [
{"origin": [-3, 9, -2.5], "size": [6, 5, 5], "inflate": -0.1, "uv": [0, 0]}
]
},
{
"name": "locator_middle",
"parent": "body_rotation",
"pivot": [0, 8.5, 0],
"locators": {
"middle": [0, 8.5, 0]
}
},
{
"name": "locator_target",
"parent": "body_rotation",
"pivot": [0, 8.5, -6],
"locators": {
"target": [0, 8.5, -6]
}
},
{
"name": "face",
"parent": "body_rotation",
"pivot": [-0.05, 11.75, -3.41]
},
{
"name": "locator_face",
"parent": "face",
"pivot": [0, 11.75, -3.4],
"locators": {
"face": [0, 11.75, -3.4]
}
},
{
"name": "locator_item_face",
"parent": "face",
"pivot": [0, 11.75, -3.4],
"locators": {
"item_face": [0, 11.75, -3.4]
}
},
{
"name": "locator_mouth",
"parent": "face",
"pivot": [0, 10.25, -3.75],
"locators": {
"mouth": [0, 10.25, -3.75]
}
},
{
"name": "locator_special",
"parent": "face",
"pivot": [0, 10.5, -4.5],
"locators": {
"special": [0, 10.75, -4.5]
}
},
{
"name": "eyes",
"parent": "face",
"pivot": [-0.05, 11.75, -3.41]
},
{
"name": "eye_left",
"parent": "eyes",
"pivot": [1.9, 11.75, -3.41],
"cubes": [
{"origin": [1.4, 10.75, -3.41], "size": [1, 2, 1], "uv": [1, 33]}
]
},
{
"name": "eye_expression_left",
"parent": "eye_left",
"pivot": [1.9, 12.75, -2.82],
"cubes": [
{"origin": [1.4, 12.25, -3.32], "size": [1, 1, 1], "inflate": 0.01, "uv": [1, 37]}
]
},
{
"name": "pupil_left",
"parent": "eye_left",
"pivot": [1.65, 11.75, -3.42],
"cubes": [
{"origin": [1.15, 11.25, -3.42], "size": [1, 1, 1], "uv": [11, 33]}
]
},
{
"name": "locator_eye_left",
"parent": "pupil_left",
"pivot": [1.65, 11.75, -3.4],
"locators": {
"eye2": [1.65, 11.75, -3.4]
}
},
{
"name": "pupil_closed_left",
"parent": "eye_left",
"pivot": [1.75, 11.75, -3.32]
},
{
"name": "pupil_closed_left1",
"parent": "pupil_closed_left",
"pivot": [1.4, 11.75, -3.02],
"cubes": [
{"origin": [0.9, 11.25, -3.52], "size": [1, 1, 1], "inflate": -0.2, "uv": [1, 40]}
]
},
{
"name": "pupil_closed_left2",
"parent": "pupil_closed_left",
"pivot": [2, 11.75, -3.02],
"cubes": [
{"origin": [1.5, 11.25, -3.52], "size": [1, 1, 1], "inflate": -0.2, "uv": [1, 43]}
]
},
{
"name": "pupil_closed_left3",
"parent": "pupil_closed_left",
"pivot": [1.7, 11.45, -2.92],
"cubes": [
{"origin": [1.2, 10.95, -3.42], "size": [1, 1, 1], "inflate": -0.19, "uv": [11, 36]}
]
},
{
"name": "eye_right",
"parent": "eyes",
"pivot": [-1.9, 11.75, -3.41],
"cubes": [
{"origin": [-2.4, 10.75, -3.41], "size": [1, 2, 1], "uv": [6, 33], "mirror": true}
]
},
{
"name": "eye_expression_right",
"parent": "eye_right",
"pivot": [-1.9, 12.75, -2.82],
"cubes": [
{"origin": [-2.4, 12.25, -3.32], "size": [1, 1, 1], "inflate": 0.01, "uv": [6, 37], "mirror": true}
]
},
{
"name": "pupil_right",
"parent": "eye_right",
"pivot": [-1.65, 11.75, -3.42],
"cubes": [
{"origin": [-2.15, 11.25, -3.42], "size": [1, 1, 1], "uv": [16, 33], "mirror": true}
]
},
{
"name": "locator_eye_right",
"parent": "pupil_right",
"pivot": [-1.65, 11.75, -3.4],
"locators": {
"eye1": [-1.65, 11.75, -3.4]
}
},
{
"name": "pupil_closed_right",
"parent": "eye_right",
"pivot": [-1.75, 11.75, -3.32]
},
{
"name": "pupil_closed_right1",
"parent": "pupil_closed_right",
"pivot": [-1.4, 11.75, -3.02],
"cubes": [
{"origin": [-1.9, 11.25, -3.52], "size": [1, 1, 1], "inflate": -0.2, "uv": [6, 40], "mirror": true}
]
},
{
"name": "pupil_closed_right2",
"parent": "pupil_closed_right",
"pivot": [-2, 11.75, -3.02],
"cubes": [
{"origin": [-2.5, 11.25, -3.52], "size": [1, 1, 1], "inflate": -0.2, "uv": [6, 43], "mirror": true}
]
},
{
"name": "pupil_closed_right3",
"parent": "pupil_closed_right",
"pivot": [-1.7, 11.45, -2.92],
"cubes": [
{"origin": [-2.2, 10.95, -3.42], "size": [1, 1, 1], "inflate": -0.19, "uv": [16, 36], "mirror": true}
]
},
{
"name": "beak",
"parent": "face",
"pivot": [0, 11.5, -3.4],
"rotation": [45, 0, 0],
"cubes": [
{"origin": [-0.5, 10.5, -4.4], "size": [1, 1, 1], "uv": [1, 3]}
]
},
{
"name": "jaw",
"parent": "beak",
"pivot": [0, 10.495, -3.15],
"cubes": [
{"origin": [-0.5, 10.5, -3.41], "size": [1, 1, 0], "uv": [4, 17]},
{"origin": [-0.5, 10.5, -4.05], "size": [1, 0, 1], "pivot": [0, 10.5, -3.4], "rotation": [5, 0, 0], "uv": [3, 19]}
]
},
{
"name": "face_ditto",
"parent": "body_rotation",
"pivot": [0, 11.75, -3.3]
},
{
"name": "eyes_ditto",
"parent": "face_ditto",
"pivot": [0, 12.5, -3.32],
"cubes": [
{"origin": [-2, 12, -3.32], "size": [4, 1, 0], "uv": [22, 33]}
]
},
{
"name": "eyes_blink_ditto",
"parent": "face_ditto",
"pivot": [0, 12.5, -3.22],
"cubes": [
{"origin": [-2.5, 12, -3.22], "size": [5, 1, 0], "uv": [21, 35]},
{"origin": [-2, 12.5, -3.23], "size": [4, 1, 0], "uv": [22, 37]}
]
},
{
"name": "mouth_ditto",
"parent": "face_ditto",
"pivot": [0, 10.75, -3.3],
"cubes": [
{"origin": [-1.5, 10, -3.31], "size": [3, 1, 0], "uv": [23, 41]},
{"origin": [-2.5, 10.5, -3.31], "size": [5, 1, 0], "uv": [21, 39]}
]
},
{
"name": "mouth_open_ditto",
"parent": "face_ditto",
"pivot": [0, 10.5, -3.21],
"cubes": [
{"origin": [-2.5, 9.5, -3.21], "size": [5, 2, 0], "uv": [21, 43]}
]
},
{
"name": "segment1",
"parent": "body_rotation",
"pivot": [0, 10.1, 0],
"cubes": [
{"origin": [-2, 6.35, -1.5], "size": [4, 3, 3], "inflate": 0.12, "uv": [0, 10]}
]
},
{
"name": "leg_left1",
"parent": "segment1",
"pivot": [1.5, 7.85, -1.5],
"cubes": [
{"origin": [1, 7.35, -2.5], "size": [1, 1, 1], "inflate": 0.1, "uv": [17, 1]}
]
},
{
"name": "leg_right1",
"parent": "segment1",
"pivot": [-1.5, 7.85, -1.5],
"cubes": [
{"origin": [-2, 7.35, -2.5], "size": [1, 1, 1], "inflate": 0.1, "uv": [17, 3], "mirror": true}
]
},
{
"name": "segment2",
"parent": "segment1",
"pivot": [0, 6.6, 0],
"cubes": [
{"origin": [-2, 3.6, -1.5], "size": [4, 3, 3], "inflate": 0.06, "uv": [14, 10]}
]
},
{
"name": "leg_left2",
"parent": "segment2",
"pivot": [1.45, 5.1, -1.5],
"cubes": [
{"origin": [0.95, 4.6, -2.5], "size": [1, 1, 1], "inflate": 0.1, "uv": [22, 6]}
]
},
{
"name": "leg_right2",
"parent": "segment2",
"pivot": [-1.45, 5.1, -1.5],
"cubes": [
{"origin": [-1.95, 4.6, -2.5], "size": [1, 1, 1], "inflate": 0.1, "uv": [26, 6], "mirror": true}
]
},
{
"name": "segment3",
"parent": "segment2",
"pivot": [0, 4.1, 0],
"cubes": [
{"origin": [-2, 1.1, -1.5], "size": [4, 3, 3], "inflate": 0.01, "uv": [22, 0]}
]
},
{
"name": "leg_left3",
"parent": "segment3",
"pivot": [1.4, 2.6, -1.5],
"cubes": [
{"origin": [0.9, 2.1, -2.5], "size": [1, 1, 1], "inflate": 0.1, "uv": [22, 8]}
]
},
{
"name": "leg_right3",
"parent": "segment3",
"pivot": [-1.4, 2.6, -1.5],
"cubes": [
{"origin": [-1.9, 2.1, -2.5], "size": [1, 1, 1], "inflate": 0.1, "uv": [26, 8], "mirror": true}
]
},
{
"name": "spring",
"parent": "body_rotation",
"pivot": [-1, 14, 1],
"cubes": [
{"origin": [-1.95, 13.5, -2], "size": [4, 2, 4], "inflate": -0.25, "pivot": [0.05, 14.5, 0], "rotation": [2.5, 0, -5], "uv": [36, 0]}
]
},
{
"name": "spring2",
"parent": "spring",
"pivot": [1, 15.25, -1],
"cubes": [
{"origin": [-1.5, 14.75, -1.5], "size": [3, 2, 3], "pivot": [0, 15.75, 0], "rotation": [2.5, 0, -5], "uv": [34, 6]}
]
},
{
"name": "spring3",
"parent": "spring2",
"pivot": [-1, 16.75, 1],
"cubes": [
{"origin": [-1.5, 16.25, -1.5], "size": [3, 2, 3], "inflate": -0.25, "pivot": [0, 17.25, 0], "rotation": [0, 0, -2.5], "uv": [52, 0]}
]
},
{
"name": "spring4",
"parent": "spring3",
"pivot": [0, 18.25, 0],
"rotation": [0, -7.5, -27.5],
"cubes": [
{"origin": [-0.5, 17.75, -1], "size": [2, 1, 2], "uv": [29, 6]}
]
},
{
"name": "cloak_sandy",
"parent": "body_rotation",
"pivot": [0, 13, 0],
"cubes": [
{"origin": [-3.5, 5, -3.5], "size": [7, 9, 7], "inflate": 0.005, "uv": [0, 16]},
{"origin": [-3, 2, -3], "size": [6, 3, 6], "inflate": 0.005, "uv": [22, 11]},
{"origin": [-3.5, 5, -3.5], "size": [7, 9, 7], "inflate": 0.2, "uv": [0, 48]},
{"origin": [-3, 2, -3], "size": [6, 3, 6], "inflate": 0.2, "uv": [28, 55]}
]
},
{
"name": "locator_item_hat",
"parent": "cloak_sandy",
"pivot": [0, 15, 0],
"locators": {
"item_hat": [0, 15, 0]
}
},
{
"name": "locator_head",
"parent": "cloak_sandy",
"pivot": [0, 14, -3.5],
"locators": {
"head": [0, 14, -3.5]
}
},
{
"name": "locator_item",
"parent": "cloak_sandy",
"pivot": [-3.9, 7, 3.5],
"rotation": [-110, 15, -17.5],
"locators": {
"item": [-3.9, 7, 3.5]
}
},
{
"name": "locator_physical",
"parent": "cloak_sandy",
"pivot": [0, 3.75, 0],
"locators": {
"physical": [0, 3.75, 0]
}
},
{
"name": "cloaked_face",
"parent": "cloak_sandy",
"pivot": [0, 11.5, -3.5],
"cubes": [
{"origin": [-3, 9, -3.4], "size": [6, 5, 0], "uv": [30, 22]}
]
},
{
"name": "sand_cloak_stones",
"parent": "cloak_sandy",
"pivot": [0, 9, 0],
"cubes": [
{"origin": [-1, 4.5, -4.1], "size": [2, 2, 1], "uv": [58, 61]},
{"origin": [-2.15, 7.75, -3.95], "size": [1, 1, 1], "inflate": 0.15, "pivot": [-1.65, 8.25, -3.45], "rotation": [0, 0, 5], "uv": [54, 62]},
{"origin": [2, 6.5, -4], "size": [1, 1, 1], "inflate": 0.1, "pivot": [2.5, 7, -3.5], "rotation": [0, 0, -5], "uv": [55, 60]},
{"origin": [1.5, 8.75, 2.975], "size": [1, 1, 1], "inflate": 0.15, "pivot": [2, 9.25, 3.475], "rotation": [0, 0, 5], "uv": [60, 54]},
{"origin": [-2.5, 8, 2.975], "size": [1, 1, 1], "inflate": 0.15, "pivot": [-2, 8.5, 3.475], "rotation": [0, 0, -2.5], "uv": [60, 56]},
{"origin": [0, 4.75, 3.225], "size": [2, 2, 1], "inflate": -0.1, "uv": [58, 58]}
]
}
]
}
]
}
@@ -0,0 +1,472 @@
{
"format_version": "1.12.0",
"minecraft:geometry": [
{
"description": {
"identifier": "geometry.burmy_trash",
"texture_width": 64,
"texture_height": 64,
"visible_bounds_width": 2,
"visible_bounds_height": 3.5,
"visible_bounds_offset": [0, 1.25, 0]
},
"bones": [
{
"name": "burmy_trash",
"pivot": [0, 0, 0]
},
{
"name": "locator_root",
"parent": "burmy_trash",
"pivot": [0, 0, 0],
"locators": {
"root": [0, 0, 0]
}
},
{
"name": "locator_top",
"parent": "burmy_trash",
"pivot": [0, 24, 0],
"locators": {
"top": [0, 24, 0]
}
},
{
"name": "body",
"parent": "burmy_trash",
"pivot": [0, 19, 0]
},
{
"name": "body_rotation",
"parent": "body",
"pivot": [0, 13, 0],
"cubes": [
{"origin": [-3, 9, -2.5], "size": [6, 5, 5], "inflate": -0.1, "uv": [0, 0]}
]
},
{
"name": "locator_middle",
"parent": "body_rotation",
"pivot": [0, 8.5, 0],
"locators": {
"middle": [0, 8.5, 0]
}
},
{
"name": "locator_target",
"parent": "body_rotation",
"pivot": [0, 8.5, -6],
"locators": {
"target": [0, 8.5, -6]
}
},
{
"name": "face",
"parent": "body_rotation",
"pivot": [-0.05, 11.75, -3.41]
},
{
"name": "locator_mouth",
"parent": "face",
"pivot": [0, 10.25, -3.75],
"locators": {
"mouth": [0, 10.25, -3.75]
}
},
{
"name": "locator_item_face",
"parent": "face",
"pivot": [0, 11.75, -3.4],
"locators": {
"item_face": [0, 11.75, -3.4]
}
},
{
"name": "locator_face",
"parent": "face",
"pivot": [0, 11.75, -3.4],
"locators": {
"face": [0, 11.75, -3.4]
}
},
{
"name": "locator_special",
"parent": "face",
"pivot": [0, 10.5, -4.5],
"locators": {
"special": [0, 10.5, -4.5]
}
},
{
"name": "eyes",
"parent": "face",
"pivot": [-0.05, 11.75, -3.41]
},
{
"name": "eye_left",
"parent": "eyes",
"pivot": [1.9, 11.75, -3.41],
"cubes": [
{"origin": [1.4, 10.75, -3.41], "size": [1, 2, 1], "uv": [1, 33]}
]
},
{
"name": "eye_expression_left",
"parent": "eye_left",
"pivot": [1.9, 12.75, -2.82],
"cubes": [
{"origin": [1.4, 12.25, -3.32], "size": [1, 1, 1], "inflate": 0.01, "uv": [1, 37]}
]
},
{
"name": "pupil_left",
"parent": "eye_left",
"pivot": [1.65, 11.75, -3.42],
"cubes": [
{"origin": [1.15, 11.25, -3.42], "size": [1, 1, 1], "uv": [11, 33]}
]
},
{
"name": "locator_eye_left",
"parent": "pupil_left",
"pivot": [1.65, 11.75, -3.4],
"locators": {
"eye2": [1.65, 11.75, -3.4]
}
},
{
"name": "pupil_closed_left",
"parent": "eye_left",
"pivot": [1.75, 11.75, -3.32]
},
{
"name": "pupil_closed_left1",
"parent": "pupil_closed_left",
"pivot": [1.4, 11.75, -3.02],
"cubes": [
{"origin": [0.9, 11.25, -3.52], "size": [1, 1, 1], "inflate": -0.2, "uv": [1, 40]}
]
},
{
"name": "pupil_closed_left2",
"parent": "pupil_closed_left",
"pivot": [2, 11.75, -3.02],
"cubes": [
{"origin": [1.5, 11.25, -3.52], "size": [1, 1, 1], "inflate": -0.2, "uv": [1, 43]}
]
},
{
"name": "pupil_closed_left3",
"parent": "pupil_closed_left",
"pivot": [1.7, 11.45, -2.92],
"cubes": [
{"origin": [1.2, 10.95, -3.42], "size": [1, 1, 1], "inflate": -0.19, "uv": [11, 36]}
]
},
{
"name": "eye_right",
"parent": "eyes",
"pivot": [-1.9, 11.75, -3.41],
"cubes": [
{"origin": [-2.4, 10.75, -3.41], "size": [1, 2, 1], "uv": [6, 33], "mirror": true}
]
},
{
"name": "eye_expression_right",
"parent": "eye_right",
"pivot": [-1.9, 12.75, -2.82],
"cubes": [
{"origin": [-2.4, 12.25, -3.32], "size": [1, 1, 1], "inflate": 0.01, "uv": [6, 37], "mirror": true}
]
},
{
"name": "pupil_right",
"parent": "eye_right",
"pivot": [-1.65, 11.75, -3.42],
"cubes": [
{"origin": [-2.15, 11.25, -3.42], "size": [1, 1, 1], "uv": [16, 33], "mirror": true}
]
},
{
"name": "locator_eye_right",
"parent": "pupil_right",
"pivot": [-1.65, 11.75, -3.4],
"locators": {
"eye1": [-1.65, 11.75, -3.4]
}
},
{
"name": "pupil_closed_right",
"parent": "eye_right",
"pivot": [-1.75, 11.75, -3.32]
},
{
"name": "pupil_closed_right1",
"parent": "pupil_closed_right",
"pivot": [-1.4, 11.75, -3.02],
"cubes": [
{"origin": [-1.9, 11.25, -3.52], "size": [1, 1, 1], "inflate": -0.2, "uv": [6, 40], "mirror": true}
]
},
{
"name": "pupil_closed_right2",
"parent": "pupil_closed_right",
"pivot": [-2, 11.75, -3.02],
"cubes": [
{"origin": [-2.5, 11.25, -3.52], "size": [1, 1, 1], "inflate": -0.2, "uv": [6, 43], "mirror": true}
]
},
{
"name": "pupil_closed_right3",
"parent": "pupil_closed_right",
"pivot": [-1.7, 11.45, -2.92],
"cubes": [
{"origin": [-2.2, 10.95, -3.42], "size": [1, 1, 1], "inflate": -0.19, "uv": [16, 36], "mirror": true}
]
},
{
"name": "beak",
"parent": "face",
"pivot": [0, 11.5, -3.4],
"rotation": [45, 0, 0],
"cubes": [
{"origin": [-0.5, 10.5, -4.4], "size": [1, 1, 1], "uv": [1, 3]}
]
},
{
"name": "jaw",
"parent": "beak",
"pivot": [0, 10.495, -3.15],
"cubes": [
{"origin": [-0.5, 10.5, -3.41], "size": [1, 1, 0], "uv": [4, 17]},
{"origin": [-0.5, 10.5, -4.05], "size": [1, 0, 1], "pivot": [0, 10.5, -3.4], "rotation": [5, 0, 0], "uv": [3, 19]}
]
},
{
"name": "face_ditto",
"parent": "body_rotation",
"pivot": [0, 11.75, -3.3]
},
{
"name": "eyes_ditto",
"parent": "face_ditto",
"pivot": [0, 12.5, -3.32],
"cubes": [
{"origin": [-2, 12, -3.32], "size": [4, 1, 0], "uv": [22, 33]}
]
},
{
"name": "eyes_blink_ditto",
"parent": "face_ditto",
"pivot": [0, 12.5, -3.22],
"cubes": [
{"origin": [-2.5, 12, -3.22], "size": [5, 1, 0], "uv": [21, 35]},
{"origin": [-2, 12.5, -3.23], "size": [4, 1, 0], "uv": [22, 37]}
]
},
{
"name": "mouth_ditto",
"parent": "face_ditto",
"pivot": [0, 10.75, -3.3],
"cubes": [
{"origin": [-1.5, 10, -3.31], "size": [3, 1, 0], "uv": [23, 41]},
{"origin": [-2.5, 10.5, -3.31], "size": [5, 1, 0], "uv": [21, 39]}
]
},
{
"name": "mouth_open_ditto",
"parent": "face_ditto",
"pivot": [0, 10.5, -3.21],
"cubes": [
{"origin": [-2.5, 9.5, -3.21], "size": [5, 2, 0], "uv": [21, 43]}
]
},
{
"name": "segment1",
"parent": "body_rotation",
"pivot": [0, 10.1, 0],
"cubes": [
{"origin": [-2, 6.35, -1.5], "size": [4, 3, 3], "inflate": 0.12, "uv": [0, 10]}
]
},
{
"name": "leg_left1",
"parent": "segment1",
"pivot": [1.5, 7.85, -1.5],
"cubes": [
{"origin": [1, 7.35, -2.5], "size": [1, 1, 1], "inflate": 0.1, "uv": [17, 1]}
]
},
{
"name": "leg_right1",
"parent": "segment1",
"pivot": [-1.5, 7.85, -1.5],
"cubes": [
{"origin": [-2, 7.35, -2.5], "size": [1, 1, 1], "inflate": 0.1, "uv": [17, 3], "mirror": true}
]
},
{
"name": "segment2",
"parent": "segment1",
"pivot": [0, 6.6, 0],
"cubes": [
{"origin": [-2, 3.6, -1.5], "size": [4, 3, 3], "inflate": 0.06, "uv": [14, 10]}
]
},
{
"name": "leg_left2",
"parent": "segment2",
"pivot": [1.45, 5.1, -1.5],
"cubes": [
{"origin": [0.95, 4.6, -2.5], "size": [1, 1, 1], "inflate": 0.1, "uv": [22, 6]}
]
},
{
"name": "leg_right2",
"parent": "segment2",
"pivot": [-1.45, 5.1, -1.5],
"cubes": [
{"origin": [-1.95, 4.6, -2.5], "size": [1, 1, 1], "inflate": 0.1, "uv": [26, 6], "mirror": true}
]
},
{
"name": "segment3",
"parent": "segment2",
"pivot": [0, 4.1, 0],
"cubes": [
{"origin": [-2, 1.1, -1.5], "size": [4, 3, 3], "inflate": 0.01, "uv": [22, 0]}
]
},
{
"name": "leg_left3",
"parent": "segment3",
"pivot": [1.4, 2.6, -1.5],
"cubes": [
{"origin": [0.9, 2.1, -2.5], "size": [1, 1, 1], "inflate": 0.1, "uv": [22, 8]}
]
},
{
"name": "leg_right3",
"parent": "segment3",
"pivot": [-1.4, 2.6, -1.5],
"cubes": [
{"origin": [-1.9, 2.1, -2.5], "size": [1, 1, 1], "inflate": 0.1, "uv": [26, 8], "mirror": true}
]
},
{
"name": "spring",
"parent": "body_rotation",
"pivot": [-1, 14, 1],
"cubes": [
{"origin": [-1.95, 13.5, -2], "size": [4, 2, 4], "inflate": -0.25, "pivot": [0.05, 14.5, 0], "rotation": [2.5, 0, -5], "uv": [36, 0]}
]
},
{
"name": "spring2",
"parent": "spring",
"pivot": [1, 15.25, -1],
"cubes": [
{"origin": [-1.5, 14.75, -1.5], "size": [3, 2, 3], "pivot": [0, 15.75, 0], "rotation": [2.5, 0, -5], "uv": [34, 6]}
]
},
{
"name": "spring3",
"parent": "spring2",
"pivot": [-1, 16.75, 1],
"cubes": [
{"origin": [-1.5, 16.25, -1.5], "size": [3, 2, 3], "inflate": -0.25, "pivot": [0, 17.25, 0], "rotation": [0, 0, -2.5], "uv": [52, 0]}
]
},
{
"name": "spring4",
"parent": "spring3",
"pivot": [0, 18.25, 0],
"rotation": [0, -7.5, -27.5],
"cubes": [
{"origin": [-0.5, 17.75, -1], "size": [2, 1, 2], "uv": [29, 6]}
]
},
{
"name": "cloak_trash",
"parent": "body_rotation",
"pivot": [0, 13, 0],
"cubes": [
{"origin": [-3.5, 5, -3.5], "size": [7, 9, 7], "inflate": 0.005, "uv": [0, 16]},
{"origin": [-3, 2, -3], "size": [6, 3, 6], "inflate": 0.005, "uv": [22, 11]},
{"origin": [-3.5, 5, -3.5], "size": [7, 9, 7], "inflate": 0.35, "uv": [0, 48]},
{"origin": [-3, 2, -3], "size": [6, 3, 6], "inflate": 0.35, "uv": [28, 55]}
]
},
{
"name": "locator_item_hat",
"parent": "cloak_trash",
"pivot": [0, 15, 0],
"locators": {
"item_hat": [0, 15, 0]
}
},
{
"name": "locator_head",
"parent": "cloak_trash",
"pivot": [0, 14, -3.5],
"locators": {
"head": [0, 14, -3.5]
}
},
{
"name": "locator_item",
"parent": "cloak_trash",
"pivot": [-3.9, 7, 3.5],
"rotation": [-110, 15, -17.5],
"locators": {
"item": [-3.9, 7, 3.5]
}
},
{
"name": "locator_physical",
"parent": "cloak_trash",
"pivot": [0, 3.75, 0],
"locators": {
"physical": [0, 3.75, 0]
}
},
{
"name": "cloaked_face",
"parent": "cloak_trash",
"pivot": [0, 11.5, -3.5],
"cubes": [
{"origin": [-3, 9, -3.4], "size": [6, 5, 0], "uv": [30, 22]}
]
},
{
"name": "cloak_trash_bottom",
"parent": "cloak_trash",
"pivot": [0, 2, 0],
"cubes": [
{"origin": [-1.5, -0.25, 0], "size": [3, 3, 0], "uv": [24, 50]}
]
},
{
"name": "trash_cloak_stick_left",
"parent": "cloak_trash",
"pivot": [2.5, 6.25, -3.5],
"rotation": [-32.5, -20, -15],
"cubes": [
{"origin": [2, 4, -4], "size": [1, 3, 1], "uv": [56, 60]},
{"origin": [2, 1, -4.5], "size": [1, 3, 1], "uv": [56, 56]}
]
},
{
"name": "trash_cloak_stick_right",
"parent": "cloak_trash",
"pivot": [-2.5, 6.25, -3.5],
"rotation": [-32.5, 20, 15],
"cubes": [
{"origin": [-3, 4, -4], "size": [1, 3, 1], "uv": [60, 60], "mirror": true},
{"origin": [-3, 1, -4.5], "size": [1, 3, 1], "uv": [60, 56], "mirror": true}
]
}
]
}
]
}
@@ -0,0 +1,580 @@
{
"format_version": "1.12.0",
"minecraft:geometry": [
{
"description": {
"identifier": "geometry.wormadam_plant",
"texture_width": 64,
"texture_height": 64,
"visible_bounds_width": 3,
"visible_bounds_height": 3.5,
"visible_bounds_offset": [0, 1.25, 0]
},
"bones": [
{
"name": "wormadam_plant",
"pivot": [0, 0, 0]
},
{
"name": "locator_top",
"parent": "wormadam_plant",
"pivot": [0, 27.5, 0],
"locators": {
"top": [0, 27.5, 0]
}
},
{
"name": "locator_root",
"parent": "wormadam_plant",
"pivot": [0, 0, 0],
"locators": {
"root": [0, 0, 0]
}
},
{
"name": "body",
"parent": "wormadam_plant",
"pivot": [0, 26.25, 0.25]
},
{
"name": "locator_middle",
"parent": "body",
"pivot": [0, 8.5, 0],
"locators": {
"middle": [0, 8.5, 0]
}
},
{
"name": "locator_target",
"parent": "body",
"pivot": [0, 8.5, -8],
"locators": {
"target": [0, 8.5, -8]
}
},
{
"name": "body_rotation",
"parent": "body",
"pivot": [0, 14.75, 0.25],
"cubes": [
{"origin": [-3, 11.25, -3], "size": [6, 4, 6], "inflate": -0.25, "uv": [0, 0]}
]
},
{
"name": "locator_item_hat",
"parent": "body_rotation",
"pivot": [0, 15.5, 0],
"locators": {
"item_hat": [0, 15.5, 0]
}
},
{
"name": "locator_head",
"parent": "body_rotation",
"pivot": [0, 15, -2.75],
"locators": {
"head": [0, 15, -2.75]
}
},
{
"name": "locator_item_face",
"parent": "body_rotation",
"pivot": [0, 13, -2.75],
"locators": {
"item_face": [0, 13, -2.75]
}
},
{
"name": "locator_face",
"parent": "body_rotation",
"pivot": [0, 13, -2.75],
"locators": {
"face": [0, 13, -2.75]
}
},
{
"name": "locator_special",
"parent": "body_rotation",
"pivot": [0, 11.5, -6.25],
"locators": {
"special": [0, 11.5, -6.25]
}
},
{
"name": "face",
"parent": "body_rotation",
"pivot": [0, 13, -2.75]
},
{
"name": "nose",
"parent": "face",
"pivot": [0, 12.75, -3],
"rotation": [17.5, 0, 0],
"cubes": [
{"origin": [-0.5, 11.75, -6.25], "size": [1, 1, 4], "uv": [54, 3]}
]
},
{
"name": "eyes",
"parent": "face",
"pivot": [-0.05, 12.75, -2.76]
},
{
"name": "eye_left",
"parent": "eyes",
"pivot": [1.8, 12.75, -2.76],
"cubes": [
{"origin": [1.3, 11.75, -2.76], "size": [1, 2, 1], "uv": [1, 11]},
{"origin": [1.1, 13.65, -2.85], "size": [1, 1, 1], "inflate": -0.1, "pivot": [1.6, 14.15, -2.835], "rotation": [0, 1, 0], "uv": [11, 20]}
]
},
{
"name": "eye_expression_left",
"parent": "eye_left",
"pivot": [1.8, 13.75, -2.17],
"cubes": [
{"origin": [1.3, 13.25, -2.67], "size": [1, 1, 1], "inflate": 0.01, "uv": [1, 15]}
]
},
{
"name": "pupil_left",
"parent": "eye_left",
"pivot": [1.55, 12.75, -2.77],
"cubes": [
{"origin": [1.05, 12.25, -2.77], "size": [1, 1, 1], "uv": [1, 24]}
]
},
{
"name": "locator_eye_left",
"parent": "pupil_left",
"pivot": [1.55, 12.75, -2.75],
"locators": {
"eye2": [1.55, 12.75, -2.75]
}
},
{
"name": "pupil_closed_left",
"parent": "eye_left",
"pivot": [1.65, 12.75, -2.67]
},
{
"name": "pupil_closed_left1",
"parent": "pupil_closed_left",
"pivot": [1.3, 12.75, -2.37],
"cubes": [
{"origin": [0.8, 12.25, -2.87], "size": [1, 1, 1], "inflate": -0.2, "uv": [1, 18]}
]
},
{
"name": "pupil_closed_left2",
"parent": "pupil_closed_left",
"pivot": [1.9, 12.75, -2.37],
"cubes": [
{"origin": [1.4, 12.25, -2.87], "size": [1, 1, 1], "inflate": -0.2, "uv": [1, 21]}
]
},
{
"name": "pupil_closed_left3",
"parent": "pupil_closed_left",
"pivot": [1.6, 12.45, -2.27],
"cubes": [
{"origin": [1.1, 11.95, -2.77], "size": [1, 1, 1], "inflate": -0.19, "uv": [1, 27]}
]
},
{
"name": "eye_right",
"parent": "eyes",
"pivot": [-1.8, 12.75, -2.76],
"cubes": [
{"origin": [-2.3, 11.75, -2.76], "size": [1, 2, 1], "uv": [6, 11], "mirror": true},
{"origin": [-2.1, 13.65, -2.85], "size": [1, 1, 1], "inflate": -0.1, "pivot": [-1.6, 14.15, -2.835], "rotation": [0, -1, 0], "uv": [16, 20], "mirror": true}
]
},
{
"name": "eye_expression_right",
"parent": "eye_right",
"pivot": [-1.8, 13.75, -2.17],
"cubes": [
{"origin": [-2.3, 13.25, -2.67], "size": [1, 1, 1], "inflate": 0.01, "uv": [6, 15], "mirror": true}
]
},
{
"name": "pupil_right",
"parent": "eye_right",
"pivot": [-1.55, 12.75, -2.77],
"cubes": [
{"origin": [-2.05, 12.25, -2.77], "size": [1, 1, 1], "uv": [6, 24], "mirror": true}
]
},
{
"name": "locator_eye_right",
"parent": "pupil_right",
"pivot": [-1.55, 12.75, -2.75],
"locators": {
"eye1": [-1.55, 12.75, -2.75]
}
},
{
"name": "pupil_closed_right",
"parent": "eye_right",
"pivot": [-1.65, 12.75, -2.67]
},
{
"name": "pupil_closed_right1",
"parent": "pupil_closed_right",
"pivot": [-1.3, 12.75, -2.37],
"cubes": [
{"origin": [-1.8, 12.25, -2.87], "size": [1, 1, 1], "inflate": -0.2, "uv": [6, 18], "mirror": true}
]
},
{
"name": "pupil_closed_right2",
"parent": "pupil_closed_right",
"pivot": [-1.9, 12.75, -2.37],
"cubes": [
{"origin": [-2.4, 12.25, -2.87], "size": [1, 1, 1], "inflate": -0.2, "uv": [6, 21], "mirror": true}
]
},
{
"name": "pupil_closed_right3",
"parent": "pupil_closed_right",
"pivot": [-1.6, 12.45, -2.27],
"cubes": [
{"origin": [-2.1, 11.95, -2.77], "size": [1, 1, 1], "inflate": -0.19, "uv": [6, 27], "mirror": true}
]
},
{
"name": "face_ditto",
"parent": "body_rotation",
"pivot": [0, 12.85, -2.65]
},
{
"name": "eyes_ditto",
"parent": "face_ditto",
"pivot": [0, 12.85, -2.67],
"cubes": [
{"origin": [-2, 12.35, -2.67], "size": [4, 1, 0], "uv": [12, 23]}
]
},
{
"name": "eyes_blink_ditto",
"parent": "face_ditto",
"pivot": [0, 12.85, -2.57],
"cubes": [
{"origin": [-2.5, 12.35, -2.57], "size": [5, 1, 0], "uv": [11, 25]},
{"origin": [-2, 12.85, -2.58], "size": [4, 1, 0], "uv": [12, 27]}
]
},
{
"name": "antenna",
"parent": "body_rotation",
"pivot": [0, 15.25, 0.25],
"cubes": [
{"origin": [-0.5, 14.25, -0.25], "size": [1, 5, 1], "inflate": 0.03, "uv": [2, 0]}
]
},
{
"name": "antenna2",
"parent": "antenna",
"pivot": [0, 19.25, 0.25],
"cubes": [
{"origin": [-0.5, 18.75, -0.25], "size": [1, 5, 1], "uv": [18, 0]}
]
},
{
"name": "antenna_end",
"parent": "antenna2",
"pivot": [0, 23.5, 0.25],
"rotation": [0, 0, -25],
"cubes": [
{"origin": [-1.75, 22, -1.25], "size": [3, 2, 3], "inflate": -0.25, "uv": [50, 8]}
]
},
{
"name": "antenna_end2",
"parent": "antenna_end",
"pivot": [-0.15, 23.75, 0.25],
"rotation": [0, 0, 35],
"cubes": [
{"origin": [-0.65, 23.4, -0.25], "size": [1, 3, 1], "inflate": 0.05, "uv": [50, 4]}
]
},
{
"name": "ears",
"parent": "body_rotation",
"pivot": [0, 15, 0.25]
},
{
"name": "ear_left",
"parent": "ears",
"pivot": [2, 15, 1],
"cubes": [
{"origin": [2, 15, -0.5], "size": [2, 0, 3], "inflate": 0.01, "uv": [-3, 61]}
]
},
{
"name": "ear_left2",
"parent": "ear_left",
"pivot": [4, 15, 1],
"cubes": [
{"origin": [4, 15, -1.5], "size": [3, 0, 5], "uv": [6, 59]}
]
},
{
"name": "ear_left3",
"parent": "ear_left2",
"pivot": [7, 15, 1],
"cubes": [
{"origin": [7, 15, -1.5], "size": [4, 0, 5], "uv": [23, 59]}
]
},
{
"name": "ear_left4",
"parent": "ear_left3",
"pivot": [11, 15, 1],
"cubes": [
{"origin": [11, 15, -1.5], "size": [3, 0, 5], "uv": [44, 59]}
]
},
{
"name": "ear_back_left",
"parent": "ears",
"pivot": [1.75, 15, 1.5],
"cubes": [
{"origin": [0.75, 15, 1.5], "size": [2, 3, 0], "uv": [0, 57]}
]
},
{
"name": "ear_right",
"parent": "ears",
"pivot": [-2, 15, 1],
"cubes": [
{"origin": [-4, 15, -0.5], "size": [2, 0, 3], "inflate": 0.01, "uv": [2, 61], "mirror": true}
]
},
{
"name": "ear_right2",
"parent": "ear_right",
"pivot": [-4, 15, 1],
"cubes": [
{"origin": [-7, 15, -1.5], "size": [3, 0, 5], "uv": [14, 59], "mirror": true}
]
},
{
"name": "ear_right3",
"parent": "ear_right2",
"pivot": [-7, 15, 1],
"cubes": [
{"origin": [-11, 15, -1.5], "size": [4, 0, 5], "uv": [33, 59], "mirror": true}
]
},
{
"name": "ear_right4",
"parent": "ear_right3",
"pivot": [-11, 15, 1],
"cubes": [
{"origin": [-14, 15, -1.5], "size": [3, 0, 5], "uv": [52, 59], "mirror": true}
]
},
{
"name": "ear_back_right",
"parent": "ears",
"pivot": [-1.75, 15, 1.5],
"cubes": [
{"origin": [-2.75, 15, 1.5], "size": [2, 3, 0], "uv": [5, 57], "mirror": true}
]
},
{
"name": "chest",
"parent": "body_rotation",
"pivot": [0, 14.65, 0.25],
"cubes": [
{"origin": [-6.5, 7.15, -6.25], "size": [13, 5, 13], "pivot": [0, 11.65, 0.25], "rotation": [5, 0, 0], "uv": [11, 0]}
]
},
{
"name": "locator_item",
"parent": "chest",
"pivot": [-6.9, 11.5, 5],
"rotation": [-110, 15, -17.5],
"locators": {
"item": [-6.9, 11.5, 5]
}
},
{
"name": "chest_details",
"parent": "chest",
"pivot": [4, 12.25, 0.5]
},
{
"name": "chest_fluff_left",
"parent": "chest_details",
"pivot": [3, 12.25, 0.5],
"rotation": [5, 0, 0]
},
{
"name": "chest_fluff_left1",
"parent": "chest_fluff_left",
"pivot": [4.5, 12.15, -1],
"rotation": [0, -5, -2.5],
"cubes": [
{"origin": [5, 12.15, -2], "size": [3, 0, 7], "uv": [12, 45]}
]
},
{
"name": "chest_fluff_left2",
"parent": "chest_fluff_left",
"pivot": [6.25, 11, 0.5],
"rotation": [0, -5, 12.5],
"cubes": [
{"origin": [5.75, 11, -7.25], "size": [3, 0, 15], "uv": [-13, 37]}
]
},
{
"name": "chest_fluff_left3",
"parent": "chest_fluff_left",
"pivot": [6.4, 8.75, 0.5],
"rotation": [-2.5, 0, 17.5],
"cubes": [
{"origin": [6.4, 8.75, -5.5], "size": [2, 0, 11], "uv": [42, 41]}
]
},
{
"name": "chest_fluff_left4",
"parent": "chest_fluff_left",
"pivot": [4, 7.5, 0],
"rotation": [0, 5, 15],
"cubes": [
{"origin": [4.5, 7.4, -3], "size": [3, 0, 7], "uv": [29, 45]}
]
},
{
"name": "chest_fluff_right",
"parent": "chest_details",
"pivot": [-3, 12.25, 0.5],
"rotation": [5, 0, 0]
},
{
"name": "chest_fluff_right1",
"parent": "chest_fluff_right",
"pivot": [-4.5, 12.15, -1],
"rotation": [0, 5, 2.5],
"cubes": [
{"origin": [-8, 12.15, -2], "size": [3, 0, 7], "uv": [20, 45], "mirror": true}
]
},
{
"name": "chest_fluff_right2",
"parent": "chest_fluff_right",
"pivot": [-6.25, 10.75, 0.5],
"rotation": [0, 5, -12.5],
"cubes": [
{"origin": [-8.75, 10.75, -7.25], "size": [3, 0, 15], "uv": [-5, 37], "mirror": true}
]
},
{
"name": "chest_fluff_right3",
"parent": "chest_fluff_right",
"pivot": [-6.4, 8.75, 0.5],
"rotation": [-2.5, 0, -17.5],
"cubes": [
{"origin": [-8.4, 8.75, -5.5], "size": [2, 0, 11], "uv": [48, 41], "mirror": true}
]
},
{
"name": "chest_fluff_right4",
"parent": "chest_fluff_right",
"pivot": [-4, 7.5, 0],
"rotation": [0, -5, -15],
"cubes": [
{"origin": [-7.5, 7.4, -3], "size": [3, 0, 7], "uv": [37, 45], "mirror": true}
]
},
{
"name": "flower_front",
"parent": "chest_details",
"pivot": [0, 8.25, -6],
"rotation": [7.5, 0, 0],
"cubes": [
{"origin": [-1.5, 6.25, -6.05], "size": [3, 3, 0], "pivot": [0, 7.75, -6.05], "rotation": [0, 0, 45], "uv": [27, 54]}
]
},
{
"name": "flower_left",
"parent": "chest_details",
"pivot": [4.5, 10.75, -6.275],
"rotation": [0, 0, -15],
"cubes": [
{"origin": [2.75, 9.25, -6.275], "size": [3, 3, 0], "pivot": [4.25, 10.75, -6.275], "rotation": [0, 0, 45], "uv": [11, 54]}
]
},
{
"name": "flower_right",
"parent": "chest_details",
"pivot": [-4.5, 10.75, -6.275],
"rotation": [0, 0, 15],
"cubes": [
{"origin": [-5.75, 9.25, -6.275], "size": [3, 3, 0], "pivot": [-4.25, 10.75, -6.275], "rotation": [0, 0, -45], "uv": [19, 54], "mirror": true}
]
},
{
"name": "torso",
"parent": "chest",
"pivot": [0, 7.15, 0],
"cubes": [
{"origin": [-2.5, 3.25, -2.5], "size": [5, 5, 5], "inflate": 0.1, "uv": [44, 18]}
]
},
{
"name": "locator_physical",
"parent": "torso",
"pivot": [0, 3.65, 0],
"locators": {
"physical": [0, 3.65, 0]
}
},
{
"name": "fluff_plant",
"parent": "torso",
"pivot": [0, 3.15, -1]
},
{
"name": "fluff_plant_front",
"parent": "fluff_plant",
"pivot": [0, 3.15, -1.5],
"rotation": [-27.5, 0, 0],
"cubes": [
{"origin": [-2.5, 0.65, -1.5], "size": [5, 3, 0], "uv": [32, 20]}
]
},
{
"name": "fluff_plant_back",
"parent": "fluff_plant",
"pivot": [0, 3.15, 1.5],
"rotation": [27.5, 0, 0],
"cubes": [
{"origin": [-2.5, 0.65, 1.5], "size": [5, 3, 0], "uv": [32, 25]}
]
},
{
"name": "fluff_plant_left",
"parent": "fluff_plant",
"pivot": [1.5, 3.15, 0],
"rotation": [0, 0, -27.5],
"cubes": [
{"origin": [1.5, 0.65, -2.5], "size": [0, 3, 5], "uv": [40, 49]}
]
},
{
"name": "fluff_plant_right",
"parent": "fluff_plant",
"pivot": [-1.5, 3.15, 0],
"rotation": [0, 0, 27.5],
"cubes": [
{"origin": [-1.5, 0.65, -2.5], "size": [0, 3, 5], "uv": [52, 49], "mirror": true}
]
}
]
}
]
}

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