Compare commits

...
257 Commits
Author SHA1 Message Date
Paul e6fda6137e Teeny tiny changelog [skip-ci] 2026-01-31 10:47:13 +10:00
Paul afae39acc8 Missed a bit of changelog [skip-ci] 2026-01-31 09:21:40 +10:00
Paul 37264aff0f Changelog stuff and no snapshot 2026-01-31 09:17:43 +10:00
Paul 2b60e6de77 Merge remote-tracking branch 'origin/lang-updates' 2026-01-31 09:12:27 +10:00
Hiroku 4f29e7457c Merge branch 'feature/riding-scrape' into 'main'
scrape riding data and fix script

See merge request cable-mc/cobblemon!2141
2026-01-30 09:43:44 +00:00
Polymeta 04a6ab31f4 rescrape data
Signed-off-by: Polymeta <40173118+Polymeta@users.noreply.github.com>
2026-01-30 09:26:22 +00:00
Hiroku a2cdc847dd Merge branch 'packet-sync-error-fix' into 'main'
Fixed packet sync issue with pokemon interactions, added "chance" requirement type

Closes #1933 and #1938

See merge request cable-mc/cobblemon!2147
2026-01-30 03:04:14 +00:00
阿鱼andWeblate 0bca678f56 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (9061 of 9061 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/zh_Hans/
2026-01-30 02:59:44 +00:00
Paul 067c3607aa Tweak /pctake to check the PC's box count and use that for constraints 2026-01-30 12:20:17 +10:00
Hiroku 823c1f6444 Merge branch 'main' into 'main'
Fixes PcTake not respecting defaultBoxCount

See merge request cable-mc/cobblemon!2146
2026-01-30 02:18:38 +00:00
Paul bfc00635cd Fixed packet sync issue with pokemon interactions, added "chance" requirement type 2026-01-30 12:16:01 +10:00
Hiroku b2e5b85ac5 Merge branch 'Custom-Ball-Resources-updated' into 'main'
updated ball texture locations missing from last update

See merge request cable-mc/cobblemon!2145
2026-01-30 00:24:49 +00:00
阿鱼andWeblate 2c27476954 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.7% (9034 of 9061 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/zh_Hans/
2026-01-29 13:40:10 +00:00
Auristite aab78d84fc Fixes PcTake not respecting defaultBoxCount
Command is also missing lang option for "cobblemon.command.pctake.removed" (Removing Pokémon from self)
2026-01-29 04:46:25 +00:00
Zack the GhastandWeblate cb632c2a65 Translated using Weblate (Portuguese (Portugal))
Currently translated at 67.9% (6154 of 9061 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/pt_PT/
2026-01-29 01:28:38 +00:00
Dragonwhisper92 8d219f1338 updated ball texture locations 2026-01-28 23:45:08 +00:00
Zack the GhastandWeblate 1e6a4ed984 Translated using Weblate (Portuguese (Portugal))
Currently translated at 67.7% (6143 of 9061 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/pt_PT/
2026-01-28 21:10:25 +00:00
geumuandWeblate 64240c31fc Translated using Weblate (Korean)
Currently translated at 100.0% (9061 of 9061 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/ko/
2026-01-28 17:35:35 +00:00
Zack the GhastandWeblate d2222c3858 Translated using Weblate (Portuguese (Portugal))
Currently translated at 67.6% (6129 of 9061 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/pt_PT/
2026-01-28 14:44:02 +00:00
geumuandWeblate c7f31c3e14 Translated using Weblate (Korean)
Currently translated at 100.0% (9061 of 9061 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/ko/
2026-01-28 14:44:01 +00:00
Zack the GhastandWeblate 740e846b2d Translated using Weblate (Portuguese (Portugal))
Currently translated at 67.5% (6125 of 9061 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/pt_PT/
2026-01-28 08:26:35 +00:00
Zack the GhastandWeblate 06f9d60595 Translated using Weblate (Portuguese (Portugal))
Currently translated at 67.5% (6123 of 9061 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/pt_PT/
2026-01-27 04:12:54 +00:00
Zack the GhastandWeblate d54439ce14 Translated using Weblate (Portuguese (Portugal))
Currently translated at 67.3% (6103 of 9061 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/pt_PT/
2026-01-26 02:31:37 +00:00
TeggyandWeblate 32ee4bb72a Translated using Weblate (Spanish)
Currently translated at 84.3% (7644 of 9061 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/es/
2026-01-25 13:02:37 +00:00
Polymeta e7d2a46cc0 Bumping snapshot version 2026-01-25 06:57:31 +00:00
YasitoandWeblate 3ee94ec076 Translated using Weblate (French)
Currently translated at 100.0% (9061 of 9061 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-25 03:06:53 +00:00
YasitoandWeblate 589293abc4 Translated using Weblate (French (Canada))
Currently translated at 100.0% (9061 of 9061 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/fr_CA/
2026-01-25 03:06:49 +00:00
Paul 279865cc7c Resnaps your shot 2026-01-25 11:53:29 +10:00
Paul b597b149c3 Snapnot 2026-01-25 10:18:32 +10:00
Paul b7f592f2a8 Relocate mongodb packages 2026-01-25 10:18:02 +10:00
Paul 70e17c22e7 Merge remote-tracking branch 'origin/lang-updates' 2026-01-25 10:17:49 +10:00
YasitoandWeblate 51b18ca0f6 Translated using Weblate (French)
Currently translated at 99.6% (9027 of 9061 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-25 00:16:58 +00:00
YasitoandWeblate a83f243a3b Translated using Weblate (French (Canada))
Currently translated at 99.9% (9059 of 9061 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/fr_CA/
2026-01-25 00:16:55 +00:00
Weblate f5b088c708 Update translation files
Updated by "Remove blank strings" add-on in Weblate.

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/
2026-01-25 00:14:04 +00:00
YasitoandWeblate dc454cbb68 Translated using Weblate (French)
Currently translated at 99.5% (9022 of 9061 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-25 00:13:56 +00:00
YasitoandWeblate 3b99e38da2 Translated using Weblate (French (Canada))
Currently translated at 99.9% (9057 of 9061 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/fr_CA/
2026-01-25 00:13:54 +00:00
Paul 483af57964 Merge remote-tracking branch 'origin/lang-updates' 2026-01-25 10:12:48 +10:00
Dmytro BunnuaandWeblate a941bdddf3 Translated using Weblate (Ukrainian)
Currently translated at 76.9% (6971 of 9061 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/uk/
2026-01-24 18:24:12 +00:00
TeggyandWeblate 246ba4a93b Translated using Weblate (Spanish)
Currently translated at 83.9% (7611 of 9061 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/es/
2026-01-24 18:24:09 +00:00
Paul 3347c084ed More changelog [skip-ci] 2026-01-24 22:42:58 +10:00
Paul 8175cee454 More translations 2026-01-24 22:11:15 +10:00
Paul 37d54053a5 Merge remote-tracking branch 'origin/lang-updates' 2026-01-24 22:10:10 +10:00
Dmytro BunnuaandWeblate b8846bd74c Translated using Weblate (Ukrainian)
Currently translated at 76.8% (6966 of 9061 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/uk/
2026-01-24 11:47:21 +00:00
Paul 1716e135c4 Changelog [skip-ci] 2026-01-24 21:45:14 +10:00
Paul 0ac804cfcb Cleanup 2026-01-24 21:20:50 +10:00
Hiroku aecc132814 Merge branch 'pokeballUIResourcePathChange' into 'main'
ball_icon resource location changes

See merge request cable-mc/cobblemon!2113
2026-01-24 11:13:26 +00:00
Hiroku 8b47876dff Merge branch 'Add-Plaques-to-Village-Pokecenters' into 'main'
Adding Plaques to Village Pokecenters

See merge request cable-mc/cobblemon!2139
2026-01-24 09:27:56 +00:00
Slippy ffc108953a Adding Plaques to Village Pokecenters 2026-01-24 01:51:33 -06:00
Paul 0a106174fe Changelog cleanup [skip-ci] 2026-01-24 15:59:27 +10:00
Paul 90210bee3c Fixed cottonee cries being inconsistent due to not having appropriate pose type coverage 2026-01-24 15:13:08 +10:00
Paul 8603cd4ad0 Merge remote-tracking branch 'origin/main' into Expression-stuffs 2026-01-24 13:56:14 +10:00
Hiroku 7b2c6827c2 Merge branch 'Expression-stuffs' into 'main'
Expression stuffs

See merge request cable-mc/cobblemon!2138
2026-01-24 03:55:02 +00:00
Paul 902b4a6d21 Fixed croagunk and toxicroak playing cry animations without the sound 2026-01-24 13:54:41 +10:00
Hiroku a847cb5926 Merge branch 'fix-plain-aprijuice-prefix' into 'main'
Fix Aprijuice 'Plain' prefix

See merge request cable-mc/cobblemon!2137
2026-01-24 03:46:05 +00:00
Paul 050c6f5adc Merge remote-tracking branch 'origin/Expression-stuffs' into Expression-stuffs 2026-01-24 13:41:23 +10:00
Paul fb95fb3cf7 Various cry corrections from implementation 2026-01-24 13:41:11 +10:00
Carmendar d507367411 Bird stamina changes. 2026-01-23 21:30:43 -06:00
Paul faa19cebcb Fixed perma zero stamina on horses when landing from bird 2026-01-24 13:16:38 +10:00
Paul aced374367 Fixed birds falling out of the sky and not gliding all chill like 2026-01-24 12:40:04 +10:00
Paul d424a6f1d3 Fixed stamina stat flowing to crazy negative from bird sometimes 2026-01-24 11:58:25 +10:00
Carmendar 71bb1c32de stamina expression changes for Bird and Hover. Changes to Mantine riding. 2026-01-23 18:56:17 -06:00
Carmendar f726fcedb9 Merge branch 'main' into implement_pokemon 2026-01-23 18:09:48 -06:00
Weblate 77344ccc2f Update translation files
Updated by "Remove blank strings" add-on in Weblate.

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/
2026-01-23 17:29:44 +00:00
Dmytro BunnuaandWeblate 90bc16be90 Translated using Weblate (Ukrainian)
Currently translated at 76.8% (6960 of 9061 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/uk/
2026-01-23 17:29:37 +00:00
Gustavo PuerariandWeblate d1b743a01f Translated using Weblate (Portuguese (Brazil))
Currently translated at 98.3% (8908 of 9061 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/pt_BR/
2026-01-23 17:29:33 +00:00
TeggyandWeblate aed651c0a0 Translated using Weblate (Spanish)
Currently translated at 83.9% (7608 of 9061 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/es/
2026-01-23 17:29:28 +00:00
Faintful 4c477e1675 Add changelog 2026-01-23 17:36:05 +01:00
Faintful d1cdc6789c Handle case for LOW quality Aprijuice in getName() for proper 'Plain' prefix 2026-01-23 17:33:04 +01:00
geumuandWeblate cd3127b983 Translated using Weblate (Korean)
Currently translated at 100.0% (9061 of 9061 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/ko/
2026-01-23 13:22:11 +00:00
Watuneni iteiteandWeblate 68f5eff048 Translated using Weblate (Japanese)
Currently translated at 100.0% (9061 of 9061 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/ja/
2026-01-23 13:22:06 +00:00
Paul c3d2918a2b Fixed a crash when joining a server and a player is riding nearby 2026-01-23 17:49:57 +10:00
Paul 0432525c06 Throh resize 2026-01-23 17:04:45 +10:00
Paul a60f27e282 Fixed implemented flag missing from the new 1.7.2 pokemon, subtle size changes 2026-01-23 17:04:14 +10:00
Test 5f0182cb7e fix type asset 2026-01-23 01:48:49 -05:00
Paul 4a3ae9407b Translation changelog [skip-ci] 2026-01-23 16:44:32 +10:00
Paul 766c2838d2 Merge remote-tracking branch 'origin/lang-updates' 2026-01-23 14:34:19 +10:00
Hiroku 4cb95589b4 Merge branch 'more-fixes' into 'main'
More fixes

See merge request cable-mc/cobblemon!2134
2026-01-23 04:30:49 +00:00
Hiroku a8d3c2dd52 Merge branch '1.7.2-spawns' into 'main'
Added spawns. Fixed spawns. Updated tags.

Closes #1896

See merge request cable-mc/cobblemon!2131
2026-01-23 04:13:07 +00:00
Test cb5d7b6ad7 rm unused 2026-01-22 23:05:38 -05:00
Test c7dcc64595 sync repo assets 2026-01-22 23:00:10 -05:00
Paul 6573e08da7 Fix for packet handling to ensure all packets are handled on main and without extra delays on Fabric, closes #1903 2026-01-23 13:37:36 +10:00
Paul cd695ade4a Apparently I put more changelog in than was meant to be there 2026-01-23 13:22:37 +10:00
Paul 55cb413cfc Merge remote-tracking branch 'origin/main' into 1.7.2-spawns 2026-01-23 13:11:50 +10:00
Paul 4f1bf7fcbb Changelog for spawns [skip-ci] 2026-01-23 13:11:42 +10:00
Test 154ee80ead fix some block issues 2026-01-22 21:32:51 -05:00
Test 1c9f9bb198 Merge branch 'main' of https://gitlab.com/cable-mc/cobblemon 2026-01-22 20:38:08 -05:00
Test 6836343f11 ride summary 2026-01-22 20:37:46 -05:00
RedGenesectNinja aa0d1cd943 Updated changelog 2026-01-22 14:44:46 -06:00
Hiroku 798f1da8b3 Merge branch 'main' into 'main'
Issue 1926: Make SpawnBaitInfluence apply all effects correctly

See merge request cable-mc/cobblemon!2130
2026-01-22 13:44:44 +00:00
Andy d98efb52b6 Add changelog line and extend author tag 2026-01-22 08:38:13 -05:00
Kenji_64 2f27a03f08 Alolan Raichu can look around in the menu now (yay) 2026-01-22 13:36:19 +01:00
Kenji_64 e33025b1fa Fixed the weird eye clipping on Dragapult (fr this time) 2026-01-22 13:36:00 +01:00
Kenji_64 ade2481f42 Treecko line has their cries back 2026-01-22 13:35:39 +01:00
Hiroku 576e2301ce Merge branch 'open-actor-classes' into 'main'
Mark the actor classes as open so they can be extended.

See merge request cable-mc/cobblemon!2129
2026-01-22 12:19:06 +00:00
Polymeta a568d45d75 [skip-ci] tidy up changelog take two 2026-01-22 09:58:38 +00:00
Hiroku bc19a7e4c1 Merge branch 'decor-split' into 'main'
Decor split

See merge request cable-mc/cobblemon!2127
2026-01-22 09:42:35 +00:00
Polymeta 616e438f17 [skip-ci] tidy up changelog 2026-01-22 09:40:47 +00:00
Polymeta 9bb11c46d5 Merge branch 'implement_pokemon' into 'main'
Implement pokemon

Closes #1921 and #1800

See merge request cable-mc/cobblemon!2063
2026-01-22 09:28:25 +00:00
Carmendar 5f470bb703 Honchkrow and Mantine camera fixes. 2026-01-21 23:25:53 -06:00
Andy 276f13cea5 1926: Re-add affectWeight comment 2026-01-22 00:08:34 -05:00
Andy ac069687f1 1926: Changed SpawnBaitInfluence to apply all bait effects properly in affectWeight 2026-01-22 00:07:14 -05:00
Deltric f248c22eed Fix initialPos being able to change and changelog 2026-01-21 22:54:53 -06:00
RedGenesectNinja 65a5687f92 Fixed Dusknoir's stomach mouth lips glowing while it sleeps 2026-01-21 22:27:11 -06:00
Deltric ea50fa534b Mark the actor classes as open so they can be extended. 2026-01-21 21:35:03 -06:00
RedGenesectNinja 4bd3c4af58 Updated changelog 2026-01-21 21:20:16 -06:00
RedGenesectNinja 283d80f7ed Implemented Croagunk and Toxicroak's animations 2026-01-21 21:19:22 -06:00
Veraxiel 0238ca80f0 Added spawns. Fixed spawns. Updated tags. 2026-01-21 18:53:40 -05:00
RedGenesectNinja d24c5fe874 Fixed a mistake I made with file placement 2026-01-21 15:32:14 -06:00
RedGenesectNinja e65e21f2ff Fixed Chimecho's cry not playing a sound 2026-01-21 15:21:02 -06:00
Carmendar e1d417718f Added Flygon jump and Mantine ride anims with temp ride stats. 2026-01-21 02:25:05 -06:00
Polymeta d4308b0a4f Merge branch 'fix-battle-memory-leak' into 'main'
Fixed memory leak from battles not being cleaned up after ending.

See merge request cable-mc/cobblemon!2075
2026-01-21 08:09:44 +00:00
Jerzykv 56650418d2 Implemented Throh and Sawk 2026-01-20 20:32:21 +01:00
Jerzykv 0543b84d34 The battle idle should probably play the battle idle animation 2026-01-20 19:57:45 +01:00
Jerzykv 1f50687a59 Re-added Honchkrow's driving license 2026-01-20 19:53:25 +01:00
Polymeta ed04faf0d8 Merge branch 'dispenser-fix' into 'main'
Resolved Dispenser Behaviors not working

See merge request cable-mc/cobblemon!2118
2026-01-20 14:46:55 +00:00
AramandPolymeta 1ed020f3e0 Resolved Dispenser Behaviors not working 2026-01-20 14:46:54 +00:00
Polymeta 7e385d8c94 Merge branch 'default-offest' into 'main'
[FEAT] Add `default_seat` option to seat offset posers

See merge request cable-mc/cobblemon!1999
2026-01-20 14:46:44 +00:00
Polymeta ee509b5438 Merge branch 'molang-inventory-and-move-utility' into 'main'
molang additions: Move struct accessor and player inventory utils

See merge request cable-mc/cobblemon!2103
2026-01-20 14:46:34 +00:00
Jerzykv ac9394131c Implemented Litleo and Pyroar - Changelog 2026-01-20 12:01:09 +01:00
Jerzykv d058a306a7 Implemented Litleo and Pyroar 2026-01-20 11:58:48 +01:00
Jerzykv b9be0c3fcb Swirlix and Slurpuff cry fixes 2026-01-20 10:14:16 +01:00
Jerzykv b59b46568a Swirlix and Slurpuff poser changes 2026-01-20 10:14:11 +01:00
Jerzykv 408cbc8c49 Slurpuff and Aromatisse scale changes 2026-01-20 10:13:55 +01:00
Jerzykv a8ce3c2175 Fixed Wishiwashi's School Form, Fixes #1921 2026-01-18 12:39:16 +01:00
Jerzykv 80ae127379 Implemented Spritzee and Aromatisse. Smells good. 2026-01-18 12:36:48 +01:00
Jerzykv bd3a9fb3af Implemented Swirlix and Slurpuff. How sweet! 2026-01-18 11:28:15 +01:00
Instrafe d0eaccb81b Fixed Ferroseed and Ferrothorn's posers not identifying a root bone (woops) 2026-01-17 12:12:08 -05:00
Deltric 0b531d967e Merge remote-tracking branch 'origin/fix-battle-memory-leak' into fix-battle-memory-leak
# Conflicts:
#	common/src/main/resources/data/cobblemon/showdown.zip
2026-01-17 03:42:38 -06:00
Deltric b0d1aec9ab Update showdown 2026-01-17 03:42:21 -06:00
Deltric f4d47098b5 Fixed memory leak from battles not being cleaned up after ending. 2026-01-17 03:42:08 -06:00
Instrafe 1989b8aa92 Implemented remodels for Ferroseed and Ferrothorn 2026-01-16 17:06:45 -05:00
Carmendar e290fe9c75 Modified Hover expressions and buffs/nerfs for hover mounts. 2026-01-15 21:23:34 -06:00
Jerzykv 06a50cfeeb Changelog for the cottons 2026-01-15 11:12:17 +01:00
Jerzykv 00888c8ad5 Implemented Cottonee and Whimsicott remodels 2026-01-15 11:11:44 +01:00
RedGenesectNinja 3963e83717 Implemented Ducklett and Swanna's cries with placeholder animations 2026-01-12 01:04:46 -06:00
Konoha 7893e365da yolo: drop item on give_item if inventory is full & sneak in a fix for active_dialogue 2026-01-11 18:50:52 -05:00
Hiroku b6a7051b2c Fixed galarian weezing blink crash, closes #1800 2026-01-11 04:28:37 +00:00
Jerzykv 2cb1cf2f83 tiny fix on Togekiss 2026-01-10 13:36:40 +01:00
阿鱼andWeblate f13a4e0e24 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (9022 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/zh_Hans/
2026-01-08 18:45:37 +00:00
Dragonwhisper92 17e1bbd6a1 oops changelog extra '-' removed 2026-01-07 20:00:26 +00:00
Dragonwhisper92 c36ff0a0fe ball_icon resource location changes
Changed the resource location of pokeball icons in the gui to use the balls namespace instead of cobblemon, allowing mods to properly use their own name space for these textures
2026-01-07 19:57:36 +00:00
Jerzykv 8dbb350230 minor fix to apricorn textures 2026-01-05 21:56:02 +01:00
Jerzykv 52f9ffb1f6 fixed Politoed's drop again. thanks scraper 2026-01-05 12:23:07 +01:00
LucasandWeblate 030195e3ff Translated using Weblate (French)
Currently translated at 100.0% (9022 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-03 08:52:44 +00:00
YasitoandWeblate d21a52ae68 Translated using Weblate (French)
Currently translated at 100.0% (9022 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-03 08:52:43 +00:00
YasitoandWeblate 3c1f1dbacb Translated using Weblate (French (Canada))
Currently translated at 100.0% (9022 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr_CA/
2026-01-03 08:52:42 +00:00
LucasandWeblate 787c4851ff Translated using Weblate (French)
Currently translated at 99.9% (9021 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-02 21:02:21 +00:00
YasitoandWeblate bf6e7fafd3 Translated using Weblate (French)
Currently translated at 99.9% (9021 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-02 21:02:20 +00:00
LucasandWeblate ea6df764c0 Translated using Weblate (French)
Currently translated at 99.9% (9020 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-02 21:01:41 +00:00
YasitoandWeblate f242de272d Translated using Weblate (French)
Currently translated at 99.9% (9020 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-02 21:01:41 +00:00
LucasandWeblate 5232e2e9bc Translated using Weblate (French)
Currently translated at 99.9% (9019 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-02 21:01:09 +00:00
YasitoandWeblate ca35898243 Translated using Weblate (French)
Currently translated at 99.9% (9019 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-02 21:01:08 +00:00
LucasandWeblate 869457d235 Translated using Weblate (French)
Currently translated at 99.9% (9018 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-02 21:00:52 +00:00
YasitoandWeblate 6736c8160b Translated using Weblate (French)
Currently translated at 99.9% (9018 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-02 21:00:51 +00:00
LucasandWeblate 243c50550d Translated using Weblate (French)
Currently translated at 99.9% (9017 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-02 21:00:37 +00:00
YasitoandWeblate fe7d3ef23a Translated using Weblate (French)
Currently translated at 99.9% (9017 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-02 21:00:36 +00:00
LucasandWeblate 57ad77fc39 Translated using Weblate (French)
Currently translated at 99.9% (9016 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-02 21:00:10 +00:00
LucasandWeblate d70e7bd1b3 Translated using Weblate (French)
Currently translated at 99.9% (9015 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-02 20:59:34 +00:00
YasitoandWeblate 254cc931ea Translated using Weblate (French)
Currently translated at 99.9% (9015 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-02 20:59:34 +00:00
LucasandWeblate 01fe5cffe8 Translated using Weblate (French)
Currently translated at 99.9% (9014 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-02 20:59:19 +00:00
YasitoandWeblate 3e18995a37 Translated using Weblate (French)
Currently translated at 99.9% (9014 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-02 20:59:18 +00:00
YasitoandWeblate ff161c9c9b Translated using Weblate (French)
Currently translated at 99.9% (9013 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-02 20:58:36 +00:00
LucasandWeblate 6b7b4f326d Translated using Weblate (French)
Currently translated at 99.9% (9013 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-02 20:58:35 +00:00
LucasandWeblate f50f7dec29 Translated using Weblate (French)
Currently translated at 99.8% (9012 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-02 20:58:17 +00:00
YasitoandWeblate a5def20c58 Translated using Weblate (French)
Currently translated at 99.8% (9012 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-02 20:58:16 +00:00
YasitoandWeblate b23204f9c9 Translated using Weblate (French)
Currently translated at 99.8% (9011 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-02 20:57:51 +00:00
LucasandWeblate 4972de0aaa Translated using Weblate (French)
Currently translated at 99.8% (9011 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-02 20:57:50 +00:00
LucasandWeblate 58a1f3d7b4 Translated using Weblate (French)
Currently translated at 99.8% (9010 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-02 20:57:33 +00:00
YasitoandWeblate f516edb858 Translated using Weblate (French)
Currently translated at 99.8% (9010 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-02 20:57:32 +00:00
LucasandWeblate 161aa952fa Translated using Weblate (French)
Currently translated at 99.8% (9008 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-02 20:55:43 +00:00
YasitoandWeblate 3b26a13ad6 Translated using Weblate (French)
Currently translated at 99.8% (9008 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-02 20:55:43 +00:00
LucasandWeblate 014189217a Translated using Weblate (French)
Currently translated at 99.8% (9007 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-02 20:55:29 +00:00
YasitoandWeblate 978debb40c Translated using Weblate (French)
Currently translated at 99.8% (9007 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-02 20:55:28 +00:00
LucasandWeblate 5be707811e Translated using Weblate (French)
Currently translated at 99.8% (9006 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-02 20:55:13 +00:00
YasitoandWeblate ac44a98f8a Translated using Weblate (French)
Currently translated at 99.8% (9006 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-02 20:55:12 +00:00
LucasandWeblate 03ecc2ae8d Translated using Weblate (French)
Currently translated at 99.8% (9005 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-02 20:54:13 +00:00
YasitoandWeblate 1518379107 Translated using Weblate (French)
Currently translated at 99.8% (9005 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-02 20:54:12 +00:00
YasitoandWeblate a58c8c59e1 Translated using Weblate (French)
Currently translated at 99.8% (9004 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-02 20:53:58 +00:00
LucasandWeblate 37959b5048 Translated using Weblate (French)
Currently translated at 99.8% (9004 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-02 20:53:58 +00:00
YasitoandWeblate cbcc9fc6f1 Translated using Weblate (French (Canada))
Currently translated at 99.7% (9002 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr_CA/
2026-01-02 20:53:57 +00:00
YasitoandWeblate d236aaa7da Translated using Weblate (French)
Currently translated at 99.7% (9000 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-02 20:50:35 +00:00
LucasandWeblate a2cd5a671c Translated using Weblate (French)
Currently translated at 99.7% (9000 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-02 20:50:35 +00:00
LucasandWeblate 1d6a45bf4d Translated using Weblate (French)
Currently translated at 99.7% (8998 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-02 20:49:59 +00:00
YasitoandWeblate 5bfe703ed7 Translated using Weblate (French)
Currently translated at 99.7% (8998 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-02 20:49:58 +00:00
YasitoandWeblate fc8485388e Translated using Weblate (French)
Currently translated at 99.7% (8997 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-02 20:45:38 +00:00
LucasandWeblate a5593b3131 Translated using Weblate (French)
Currently translated at 99.7% (8997 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-02 20:45:38 +00:00
YasitoandWeblate 9541bf3267 Translated using Weblate (French (Canada))
Currently translated at 99.6% (8991 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr_CA/
2026-01-02 20:45:37 +00:00
LucasandWeblate 1037fe0a0e Translated using Weblate (French)
Currently translated at 99.6% (8989 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-02 20:38:19 +00:00
YasitoandWeblate a6eea3198a Translated using Weblate (French)
Currently translated at 99.6% (8989 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-02 20:38:19 +00:00
YasitoandWeblate b28e2313a8 Translated using Weblate (French (Canada))
Currently translated at 99.6% (8988 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr_CA/
2026-01-02 20:38:19 +00:00
LucasandWeblate 0f0b4e6c86 Translated using Weblate (French)
Currently translated at 99.6% (8988 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-02 20:37:45 +00:00
YasitoandWeblate e033467054 Translated using Weblate (French)
Currently translated at 99.6% (8988 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-02 20:37:45 +00:00
YasitoandWeblate 0f092bf6bf Translated using Weblate (French (Canada))
Currently translated at 99.6% (8987 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr_CA/
2026-01-02 20:37:44 +00:00
LucasandWeblate 66ba762360 Translated using Weblate (French)
Currently translated at 99.6% (8987 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-02 20:37:01 +00:00
YasitoandWeblate c7c11838a0 Translated using Weblate (French)
Currently translated at 99.6% (8987 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2026-01-02 20:37:01 +00:00
YasitoandWeblate 301d80fabe Translated using Weblate (French (Canada))
Currently translated at 99.6% (8986 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr_CA/
2026-01-02 20:37:00 +00:00
Konoha fade5502d9 molang additions: Move struct accessor and player inventory utils 2026-01-01 15:31:40 -05:00
Jerzykv ce55035408 changelog 2025-12-30 14:46:38 +01:00
Jerzykv d4665ddaeb implemented Falinks remodel 2025-12-30 14:44:46 +01:00
Jerzykv 4375c6f667 fixed Revavroom's hitbox. Who implemented this guy (it was me) 2025-12-30 14:43:24 +01:00
RedGenesectNinja f4a7c6e873 Implemented the remodels for Chingling and Chimecho 2025-12-21 22:40:17 -06:00
geumuandWeblate 3bef1dad4a Translated using Weblate (Korean)
Currently translated at 100.0% (9022 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ko/
2025-12-20 19:34:20 +00:00
geumuandWeblate da50ee59cf Translated using Weblate (Korean)
Currently translated at 100.0% (9022 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ko/
2025-12-20 14:40:56 +00:00
arvid6andWeblate 6e8985d97e Translated using Weblate (Spanish)
Currently translated at 84.2% (7599 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/es/
2025-12-19 08:15:16 +00:00
geumuandWeblate 19c4c0d50d Translated using Weblate (Korean)
Currently translated at 100.0% (9022 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ko/
2025-12-19 08:15:15 +00:00
阿鱼andWeblate b23110950e Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (9022 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/zh_Hans/
2025-12-19 08:15:14 +00:00
Watuneni iteiteandWeblate 60c213c44b Translated using Weblate (Japanese)
Currently translated at 100.0% (9022 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ja/
2025-12-19 08:15:13 +00:00
geumuandWeblate 3df8dea71b Translated using Weblate (Korean)
Currently translated at 100.0% (9022 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ko/
2025-12-18 17:09:19 +00:00
geumuandWeblate 3cca50b7cc Translated using Weblate (Korean)
Currently translated at 100.0% (9022 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ko/
2025-12-18 07:49:53 +00:00
geumuandWeblate 1ff5622694 Translated using Weblate (Korean)
Currently translated at 100.0% (9022 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ko/
2025-12-18 06:01:40 +00:00
Alexis SalgueiroandWeblate 411f388bd3 Translated using Weblate (French)
Currently translated at 99.5% (8984 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2025-12-18 00:21:32 +00:00
geumuandWeblate 5b8d35604a Translated using Weblate (Korean)
Currently translated at 100.0% (9022 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ko/
2025-12-18 00:21:30 +00:00
geumuandWeblate 619d002bc4 Translated using Weblate (Korean)
Currently translated at 100.0% (9022 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ko/
2025-12-17 07:19:25 +00:00
geumuandWeblate 7049656f64 Translated using Weblate (Korean)
Currently translated at 100.0% (9022 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ko/
2025-12-16 06:33:05 +00:00
geumuandWeblate e6e7c2982d Translated using Weblate (Korean)
Currently translated at 100.0% (9022 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ko/
2025-12-15 12:47:01 +00:00
Watuneni iteiteandWeblate 82686b0511 Translated using Weblate (Japanese)
Currently translated at 99.4% (8976 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ja/
2025-12-12 03:20:38 +00:00
JPAKx4 f4eca30163 Fix merge issues 2025-12-11 10:40:53 -06:00
arvid6andWeblate 2814183012 Translated using Weblate (Spanish)
Currently translated at 84.2% (7597 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/es/
2025-12-11 16:38:11 +00:00
JPAKx4 bbc3c2a8d6 Merge branch 'main' into default-offest
# Conflicts:
#	common/src/main/kotlin/com/cobblemon/mod/common/client/render/camera/MountedCameraRenderer.kt
2025-12-11 10:27:50 -06:00
geumuandWeblate 7eeb7feeae Translated using Weblate (Korean)
Currently translated at 100.0% (9022 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ko/
2025-12-11 06:27:41 +00:00
geumuandWeblate b2f850c1c8 Translated using Weblate (Korean)
Currently translated at 100.0% (9022 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ko/
2025-12-10 15:57:39 +00:00
Nico MerenqandWeblate 23db346070 Translated using Weblate (Russian)
Currently translated at 77.7% (7012 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ru/
2025-12-09 19:49:13 +00:00
geumuandWeblate d3b7d739bb Translated using Weblate (Korean)
Currently translated at 100.0% (9022 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ko/
2025-12-09 19:49:11 +00:00
geumuandWeblate eb6c134f4b Translated using Weblate (Korean)
Currently translated at 100.0% (9022 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ko/
2025-12-08 10:48:16 +00:00
geumuandWeblate aa0b8d88e8 Translated using Weblate (Korean)
Currently translated at 100.0% (9022 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ko/
2025-12-07 12:09:09 +00:00
Deltric 3cf9425247 Fixed memory leak from battles not being cleaned up after ending. 2025-12-06 01:35:53 -06:00
Carmendar b5578e72bd Merge branch 'main' into implement_pokemon 2025-12-05 01:30:51 -06:00
Carmendar 3aea0909a4 Merge branch 'main' into implement_pokemon 2025-12-05 01:27:25 -06:00
TeggyandWeblate 5adef3336e Translated using Weblate (Spanish)
Currently translated at 84.2% (7597 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/es/
2025-12-05 06:23:53 +00:00
geumuandWeblate 1a96b418bc Translated using Weblate (Korean)
Currently translated at 100.0% (9022 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ko/
2025-12-05 06:23:51 +00:00
geumuandWeblate e373e86b60 Translated using Weblate (Korean)
Currently translated at 100.0% (9022 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ko/
2025-12-04 15:33:38 +00:00
geumuandWeblate 6f3035184c Translated using Weblate (Korean)
Currently translated at 100.0% (9022 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ko/
2025-12-04 09:30:13 +00:00
Jerzykv 7ae8b1957c fixed Arcanine's texture having a line 2025-12-04 10:27:42 +01:00
geumuandWeblate 824b9718ee Translated using Weblate (Korean)
Currently translated at 100.0% (9022 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ko/
2025-12-04 08:07:32 +00:00
geumuandWeblate ef43f6c087 Translated using Weblate (Korean)
Currently translated at 100.0% (9022 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ko/
2025-12-03 21:23:55 +00:00
geumuandWeblate c8a70caf79 Translated using Weblate (Korean)
Currently translated at 100.0% (9022 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ko/
2025-12-03 16:30:22 +00:00
geumuandWeblate ba11758e1f Translated using Weblate (Korean)
Currently translated at 100.0% (9022 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ko/
2025-12-03 12:53:16 +00:00
geumuandWeblate f0412d6b1d Translated using Weblate (Korean)
Currently translated at 100.0% (9022 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ko/
2025-12-03 10:05:08 +00:00
Jerzykv f5f87ce1a3 fixed Dewgong swimming in battle 2025-12-03 06:57:40 +01:00
Jerzykv f28b269734 fixed Camerupt jumping in battle 2025-12-03 06:57:31 +01:00
Jerzykv d545efd843 adjusted Tinkaton & Tinkatuff profile scaling 2025-12-03 06:57:07 +01:00
Zack the GhastandWeblate f8682c2123 Translated using Weblate (Portuguese (Brazil))
Currently translated at 98.2% (8866 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/pt_BR/
2025-12-02 05:47:12 +00:00
geumuandWeblate f62e31a1eb Translated using Weblate (Korean)
Currently translated at 100.0% (9022 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ko/
2025-12-02 05:46:50 +00:00
Watuneni iteiteandWeblate ea623b08a6 Translated using Weblate (Japanese)
Currently translated at 99.4% (8971 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ja/
2025-12-02 05:46:48 +00:00
geumuandWeblate ce3d5a413c Translated using Weblate (Korean)
Currently translated at 95.8% (8650 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ko/
2025-12-01 13:03:30 +00:00
geumuandWeblate d23fd6e23c Translated using Weblate (Korean)
Currently translated at 84.1% (7595 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ko/
2025-12-01 05:33:07 +00:00
geumuandWeblate 59395a254d Translated using Weblate (Korean)
Currently translated at 81.2% (7328 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ko/
2025-11-30 20:59:27 +00:00
geumuandWeblate 5d7c6c8d6f Translated using Weblate (Korean)
Currently translated at 80.6% (7276 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ko/
2025-11-30 08:10:30 +00:00
violet 6529293d21 Merge remote-tracking branch 'origin/implement_pokemon' into implement_pokemon 2025-11-29 02:44:47 -05:00
violet a1fce624ea something was forgotten in the changelog... 2025-11-29 02:44:34 -05:00
geumuandWeblate b7773f7471 Translated using Weblate (Korean)
Currently translated at 79.1% (7144 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ko/
2025-11-28 23:27:54 +00:00
geumuandWeblate f927e47bfe Translated using Weblate (Korean)
Currently translated at 77.9% (7030 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ko/
2025-11-28 15:25:08 +00:00
Watuneni iteiteandWeblate 48a37b2018 Translated using Weblate (Japanese)
Currently translated at 99.2% (8953 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ja/
2025-11-28 15:25:07 +00:00
阿鱼andWeblate f6b2da6ed6 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (9022 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/zh_Hans/
2025-11-27 11:09:47 +00:00
Watuneni iteiteandWeblate 275779b20e Translated using Weblate (Japanese)
Currently translated at 99.2% (8953 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ja/
2025-11-26 22:24:14 +00:00
阿鱼andWeblate 2102f8ff88 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.6% (8991 of 9022 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/zh_Hans/
2025-11-26 15:42:52 +00:00
JPAKx4 8f462aab40 Add default_seat option to seat offset posers, and remove shouldRotate as it's not needed for positioning the camera. 2025-11-18 00:56:40 -06:00
410 changed files with 38355 additions and 6649 deletions
+13 -75
View File
@@ -1,85 +1,23 @@
# Changelog
## [1.7.2 (MONTH Xth, YEAR)](#1-7-2)
### Additions
- Added riding statistics: `Distance by Pokémon on Land`, `Distance by Pokémon in Air` and `Distance by Pokémon in Liquid`.
- Added the Partner Mark, which party Pokémon have a very small chance to earn as the player walks, provided they have enough friendship.
- Added new effects
- Mental Restoration: Reduces "Time Since Last Rest" statistic, which controls Insomnia, by half a minute per second per effect level
- Negative Effect Cleanse: Removes all negative effects
- Effect Cleanse: Removes all effects
- Added more seasonings for sinister tea
- Mental Herb - Mental Restoration I for 10 seconds
- White Herb - Negative Effect Cleanse
- Milk - Effect Cleanse
- Moomoo Milk - Effect Cleanse
- Added `label` as an alternate key to the `tag` property.
- Added Saccharine wood furniture for Adorn.
- Added block models for existing items: Potion, Super Potion, Hyper Potion, Max Potion, Full Restore, Antidote, Awakening, Burn Heal, Ice Heal, Paralyze Heal, Full Heal, Ether, Elixir, Max Ether, Max Elixir, X Accuracy, X Attack, X Defence, X Special Attack, X Special Defence, X Speed, Dire Hit, Guard Spec, Weakness Policy, Blunder Policy, Cleanse Tag, and Spell Tag.
- Added decorative sign blocks, Plaques.
### Changes
- Ride sounds have been separated into stereo for passengers and mono for other players. Riding will now sound more spacious.
- Added a new config option, `Enable In-Flight Dismounting` (default: off), which lets you dismount while riding a Pokémon in the air.
- Battle AI now uses a smarter threshold for switching, reducing unnecessary switches.
- AI will always use the most damaging move when at low HP and when it is not switching, improving endgame decision-making.
- Added support for optional message variants in battle activate instructions for more context-specific battle text.
- Example: `this.add('-activate', pokemon, 'ability: example', '[msg]message1');` will parse to lang key `cobblemon.battle.activate.example.message1`
## [1.7.3 (January 31st, 2026)](#1-7-3)
### Fixes
- Fixed an issue in the OmniPathNodeMaker/Navigation that prevented Combee from pathing into and out of Saccharine Leaves.
- Fixed orientation not getting reset after crashing while flying and getting back on the Pokémon.
- Fixed Furfrou not being trimmable on NeoForge.
- Fixed shiny Pokémon not respecting the silent flag on spawn.
- Fixed honey from Saccharine Leaves being harvestable at less than the max age.
- Items given from interacting with Saccharine Leaves are placed in the active hotbar slot if possible.
- Fix all Pokémon being saved to chunks and never despawning.
- Fixed possible error on world generation when Combee are placed in naturally generated bee nests.
- Fixed Poké Snacks crashing if there was no available spawn.
- Fixed Pokémon spawn influences not being specific to regional forms.
- Fixed crashing when viewing another player in spectator mode.
- Fixed missing apricorn textures for Adorn blocks.
- Fixed crashing when riding due to malformed json file instead of resetting it.
- Fixed mochi items consuming two items at a time.
- Fix item interaction sometimes not working properly when playing on servers.
- Fixed Soothe Bell not being properly tagged as a held item.
- Fixed Mint Leaves not being usable for filling the Resurrection Machine.
- Added Saccharine Boats and Saccharine Boat with Chests to relevant boat tags.
- Fixed the `run_script` Molang function to not fail if the environment's context is null.
- Fixed battle item duplication issue.
- Fixed the movesets of certain Pokémon being incorrectly sanitized upon reload.
- Fixed the ordering of Aprijuice's riding stat boosts to always have the same order.
- Fixed the Molang functions `date_local_time`, `date_of`, `date_is_after` to use the correct date format.
- Fixed the bottom half of pasture blocks having an incorrect hit-box when facing north or south.
- Fixed Galarian Mr. Mime incorrectly being rideable.
- Fixed gimmicks not being usable in double / triple battles.
- Fixed gimmick buttons showing when already used in the same turn in double / triple battles.
- Fixed Apricorn block model rotation for counters/sinks/cupboards/drawers to match that of most recent version of Adorn.
- Fixed Fresh Start Mochi EV reset not syncing health changes properly.
- Fixed requirements such as `biomeCondition` crashing the game when used to define Pokémon interactions.
- Fixed Pokémon interactions not playing sound effects when the volume was not specified.
- Fixed Pokémon interaction cooldowns taking longer than intended when the Pokémon was in the player’s party.
- Fixed Pokémon interactions occasionally crashing the game when spamming an interaction with a 0 cooldown.
- Fixed Pokémon fullness decreasing more than intended when the Pokémon was pastured.
- Fixed crashing when sending a Pokémon out after editing its form.
- Fixed Super Potion recipes incorrectly using Hondew Berry instead of Aguav Berry.
- Fixed `/calculateseatpositions` expecting a locator format that even we don't use. It needs an underscore after "seat".
- Fixed invulnerability-bypassed damage being resisted by invulnerable NPC entities.
- Fixed selected leading Pokémon in battle not being used when levels are raised.
- Fixed killer not being set early enough on a wild wild Pokémon entity from WinInstruction.
- Fixed mounted Pokémon not playing sounds.
- Fixed players failing to join servers randomly.
- Fixed some Pokémon having no stamina for flying.
- Fixed `/pctake` not respecting the actual size of the PC.
### Developer
- Changed the `owner` parameter in the `OwnerQueryRequirement` interface from `ServerPlayer` to `Player`. This method is now also called on the client to verify whether a Pokémon interaction succeeded, so make sure to update your implementations to handle both server and client contexts.
- Added `pnx` to the `BattleFaintedEvent` and `FormeChangeEvent`.
- Added register methods for custom instructions to `ShowdownInterpreter`.
- Changed callback operations in `BattlePokemon` to allow multiple callbacks and is now mutable.
- Poké Ball GUI textures now respect the ball's namespace, enabling proper texture loading for custom balls from other mods.
### Molang & Datapacks
- Ride sounds can now be set as exclusive to passengers.
- Ride sounds no longer play when submerged unless specified with a new setting.
- Exception handling has been added to `run_molang`, resolving some crashes caused by malformed MoLang expressions.
### Particles
- Added a `chance` requirement type for Pokémon interactions.
### Localization
- Updated translations for:
- French
- Canadian French
- Korean
- Portuguese
- Simplified Chinese
- Spanish
+137
View File
@@ -0,0 +1,137 @@
# Changelog
## [1.7.2 (January 25th, 2026)](#1-7-2)
### Additions
- Added Saccharine wood furniture for Adorn.
- Added the Partner Mark, which party Pokémon have a very small chance to earn as the player walks, provided they have enough friendship.
- Added decorative block models for existing items: Potion, Super Potion, Hyper Potion, Max Potion, Full Restore, Antidote, Awakening, Burn Heal, Ice Heal, Paralyze Heal, Full Heal, Ether, Elixir, Max Ether, Max Elixir, X Accuracy, X Attack, X Defence, X Special Attack, X Special Defence, X Speed, Dire Hit, Guard Spec, Weakness Policy, Blunder Policy, Cleanse Tag, and Spell Tag.
- Added decorative sign blocks called Plaques.
- Added ride style labels to ride stats in Pokédex, as well as ride style icons in the summary GUI.
- Added more seasonings for sinister tea:
- Mental Herb - Mental Restoration I for 10 seconds, which staves off Insomnia.
- White Herb - Removes negative effects.
- Milk, Moomoo Milk - Removes effects.
- Added dispenser support for:
- Applying a Honey Bottle to Saccharine Logs.
- Washing honey off of Saccharine Slathered Logs.
- Applying and removing honey on Saccharine Leaves.
- Added riding statistics: `Distance by Pokémon on Land`, `Distance by Pokémon in Air` and `Distance by Pokémon in Liquid`.
### New rideable Pokémon
- Honchkrow
- Mantine
### Pokémon Added
#### Gen 5
- Throh
- Sawk
#### Gen 6
- Litleo
- Pyroar
- Spritzee
- Aromatisse
- Swirlix
- Slurpuff
### Model updates for the following Pokémon
- Falinks
- Cottonee
- Whimsicott
- Ferroseed
- Ferrothorn
- Chingling
- Chimecho
### Animation updates for the following Pokémon
- Mantine (ride animations)
- Flygon (ride jump animation)
- Honchkrow (ride animations)
- Croagunk
- Toxicroak
### Changes
- Added a new config option, `Enable In-Flight Dismounting` (default: off), which lets you dismount while riding a Pokémon in the air. This is the textbook definition of caveat emptor.
- Ride sounds have been separated into stereo for passengers and mono for other players. Riding will now sound more spacious.
- Battle AI now uses a smarter threshold for switching, reducing unnecessary switches.
- AI will always use the most damaging move when at low HP and when it is not switching, improving endgame decision-making.
- Items given from interacting with Saccharine Leaves are placed in the active hotbar slot if possible.
- Added `label` as an alternate key to the `tag` property.
### Fixes
- Fixed crashing when viewing another player in spectator mode. Some said this was reason to release this update a month ago. They were probably right.
- Fixed crashing when sending a Pokémon out after editing its form.
- Fixed all Pokémon being saved to chunks and never despawning even when they should be.
- Fixed Poké Snacks crashing if there was no available spawn.
- Fixed Poké Snack / Bait effects so that EV Yield, Type, and Egg Group filters now all apply together when weighting spawns. And you thought you were going crazy.
- Fixed Furfrou not being trimmable on NeoForge specifically.
- Fixed honey from Saccharine Leaves being harvestable at less than the max age.
- Fixed possible error on world generation when Combee are placed in naturally generated bee nests.
- Fixed Galarian Weezing crashing the world if it decides to blink the wrong way. The same could happen to you!
- Fixed Galarian Mr. Mime incorrectly being rideable. Some would argue that regular Mr. Mime shouldn't be rideable, but that would make them wrong.
- Fixed missing apricorn textures for Adorn blocks.
- Fixed Apricorn block model rotation for counters/sinks/cupboards/drawers to match that of most recent version of Adorn.
- Fixed item interaction sometimes not working properly when playing on servers.
- Fixed Mint Leaves not being usable for filling the Resurrection Machine.
- Fixed Super Potion recipes incorrectly using Hondew Berry instead of Aguav Berry. They look similar, to be fair.
- Fixed Wishiwashi not schooling properly.
- Fixed battle item duplication issue. How did it work? Wouldn't you like to know, weather boy.
- Fixed the ordering of Aprijuice's riding stat boosts so they always have the same order.
- Fixed the movesets of certain Pokémon being incorrectly sanitized upon reload, causing some forms to keep losing moves.
- Fixed selected leading Pokémon in battle not being used when levels are set.
- Fixed the bottom half of pasture blocks having an incorrect hit-box when facing north or south.
- Fixed gimmicks not being usable in double and triple battles.
- Fixed gimmick buttons showing when already used in the same turn in double and triple battles.
- Fixed mochi items consuming two items at a time.
- Fixed Fresh Start Mochi's EV reset not syncing health changes properly.
- Fixed Pokémon spawn influences not being specific to regional forms.
- Fixed memory leak from battles not being cleaned up after ending.
- Fixed orientation not getting reset after crashing while flying and getting back on the Pokémon.
- Fixed shiny Pokémon not respecting the `silent` flag on spawn.
- Fixed 'Plain' prefix not being applied to all low-quality Aprijuice.
- Fixed Pokémon interactions not playing sound effects when the volume was not specified.
- Fixed Pokémon interaction cooldowns taking longer than intended when the Pokémon was in the player’s party.
- Fixed Pokémon interactions occasionally crashing the game when spamming an interaction with a 0 cooldown.
- Fixed Pokémon fullness decreasing more than intended when the Pokémon was pastured.
- Fixed Scraggy line, Milcery line, and Morpeko spawning on unnatural blocks.
- Fixed invulnerability-bypassed damage being resisted by invulnerable NPC entities.
- Fixed Fabric network packets not being handled immediately, fixing incompatibilities with Supplementaries, Prometheus, Sleep Tight, and others.
- Fixed killer not being set early enough on a wild Pokémon entity from `WinInstruction`.
- Fixed requirements such as `biomeCondition` crashing the game when used to define Pokémon interactions.
- Fixed an issue that prevented registering custom dispenser behaviours (no longer overrides vanilla behaviour).
- Fixed an issue navigation that prevented Combee from pathing into and out of Saccharine Leaves.
- Added Saccharine Boats and Saccharine Boat with Chests to relevant boat tags.
- Fixed Soothe Bell not being properly tagged as a held item.
- Fixed `/calculateseatpositions` expecting a locator format that even we don't use. It needs an underscore after "seat".
- Fixed the `run_script` Molang function to not fail if the environment's context is null.
- Fixed the Molang functions `date_local_time`, `date_of`, `date_is_after` to use the correct date format.
### Developer
- Changed the `owner` parameter in the `OwnerQueryRequirement` interface from `ServerPlayer` to `Player`. This method is now also called on the client to verify whether a Pokémon interaction succeeded, so make sure to update your implementations to handle both server and client contexts.
- Added the `pnx` to the `BattleFaintedEvent` and `FormeChangeEvent`.
- Added register methods for custom instructions to `ShowdownInterpreter`.
- Changed callback operations in `BattlePokemon` to allow multiple callbacks and be mutable.
- Added `display_name`, `description`, and `max_pp` functions to the `MoveTemplate` struct.
- Changed the implementations of `AIBattleActor` to be open classes to allow extension.
- Changed the resource location of Poké Ball icons in the GUI to use the balls namespace instead of Cobblemon's, allowing mods to properly use their own namespace for these textures.
### Molang & Datapacks
- Ride sounds can now be set as exclusive to passengers.
- Ride sounds no longer play when submerged unless specified with a new setting.
- Exception handling has been added to `run_molang`, resolving some crashes caused by malformed MoLang expressions.
- Added the `create_itemstack`, `has_inventory_space`, `set_inventory_slot`, and `give_item` MoLang functions for item and inventory utility.
- Added the `get_move_from_id` MoLang function for general move info queries without requiring a Moveset object to access.
- Added support for optional message variants in battle activate instructions for more context-specific battle text.
- Example: `this.add('-activate', pokemon, 'ability: example', '[msg]message1');` will parse to lang key `cobblemon.battle.activate.example.message1`.
### Localization
- Updated translations for:
- French
- Canadian French
- Simplified Chinese
- Ukrainian
- Brazilian Portuguese
- Spanish
- Korean
- Japanese
@@ -0,0 +1,26 @@
/*
* 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.mixin.accessor;
import net.minecraft.world.item.Item;
import net.minecraft.core.dispenser.DispenseItemBehavior;
import net.minecraft.world.level.block.DispenserBlock;
import java.util.Map;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
@Mixin(DispenserBlock.class)
public interface DispenserBlockAccessor {
@Accessor("DISPENSER_REGISTRY")
static Map<Item, DispenseItemBehavior> getItemBehaviors() {
throw new AssertionError();
}
}
@@ -68,7 +68,7 @@ import com.cobblemon.mod.common.api.tags.CobblemonItemTags
import com.cobblemon.mod.common.battles.*
import com.cobblemon.mod.common.battles.actor.PokemonBattleActor
import com.cobblemon.mod.common.battles.pokemon.BattlePokemon
import com.cobblemon.mod.common.block.DispenserBehaviorRegistry
import com.cobblemon.mod.common.block.dispenser.DispenserBehaviorRegistry
import com.cobblemon.mod.common.client.CobblemonPack
import com.cobblemon.mod.common.command.argument.*
import com.cobblemon.mod.common.config.CobblemonConfig
@@ -165,7 +165,7 @@ object Cobblemon {
val statistics: CobblemonStats = CobblemonStats
@JvmStatic
val builtinPacks = listOf<CobblemonPack>(
val builtinPacks = listOf(
CobblemonPack(id = "adorncompatibility", name = "Adorn Compatibility", packType = PackType.CLIENT_RESOURCES, activationBehaviour = ResourcePackActivationBehaviour.ALWAYS_ENABLED, neededMods = setOf("adorn")),
CobblemonPack(id = "gyaradosjump", name = "Gyarados Jump Patterns", packType = PackType.CLIENT_RESOURCES, activationBehaviour = ResourcePackActivationBehaviour.DEFAULT_ENABLED),
CobblemonPack(id = "regionbiasforms", name = "Region Bias Forms", packType = PackType.CLIENT_RESOURCES, activationBehaviour = ResourcePackActivationBehaviour.DEFAULT_ENABLED),
@@ -21,12 +21,15 @@ import com.cobblemon.mod.common.client.net.callback.partymove.OpenPartyMoveCallb
import com.cobblemon.mod.common.client.net.cooking.ToggleCookingPotLidHandler
import com.cobblemon.mod.common.client.net.data.CobblemonMechanicsSyncHandler
import com.cobblemon.mod.common.client.net.data.DataRegistrySyncPacketHandler
import com.cobblemon.mod.common.client.net.data.PokemonInteractionsSyncHandler
import com.cobblemon.mod.common.client.net.data.RideSettingsSyncHandler
import com.cobblemon.mod.common.client.net.debug.OpenRidingStatsDebugGUIHandler
import com.cobblemon.mod.common.client.net.dialogue.DialogueClosedHandler
import com.cobblemon.mod.common.client.net.dialogue.DialogueOpenedHandler
import com.cobblemon.mod.common.client.net.effect.*
import com.cobblemon.mod.common.client.net.effect.PokeSnackBlockParticlesHandler
import com.cobblemon.mod.common.client.net.effect.RunPosableMoLangHandler
import com.cobblemon.mod.common.client.net.effect.SaccharineLogBlockParticlesHandler
import com.cobblemon.mod.common.client.net.effect.SpawnSnowstormEntityParticleHandler
import com.cobblemon.mod.common.client.net.effect.SpawnSnowstormParticleHandler
import com.cobblemon.mod.common.client.net.gui.ExpGainedDataPacketHandler
import com.cobblemon.mod.common.client.net.gui.InteractPokemonUIPacketHandler
import com.cobblemon.mod.common.client.net.gui.PokedexUIPacketHandler
@@ -34,7 +37,11 @@ import com.cobblemon.mod.common.client.net.gui.SummaryUIPacketHandler
import com.cobblemon.mod.common.client.net.npc.CloseNPCEditorHandler
import com.cobblemon.mod.common.client.net.npc.OpenNPCEditorHandler
import com.cobblemon.mod.common.client.net.orientation.ClientboundUpdateOrientationHandler
import com.cobblemon.mod.common.client.net.pasture.*
import com.cobblemon.mod.common.client.net.pasture.ClosePastureHandler
import com.cobblemon.mod.common.client.net.pasture.OpenPastureHandler
import com.cobblemon.mod.common.client.net.pasture.PokemonPasturedHandler
import com.cobblemon.mod.common.client.net.pasture.PokemonUnpasturedHandler
import com.cobblemon.mod.common.client.net.pasture.UpdatePastureConflictFlagHandler
import com.cobblemon.mod.common.client.net.pokedex.ServerConfirmedRegisterHandler
import com.cobblemon.mod.common.client.net.pokemon.update.ClientboundUpdateRidingStateHandler
import com.cobblemon.mod.common.client.net.pokemon.update.PokemonUpdatePacketHandler
@@ -52,7 +59,14 @@ import com.cobblemon.mod.common.client.net.storage.party.SetPartyPokemonHandler
import com.cobblemon.mod.common.client.net.storage.party.SetPartyReferenceHandler
import com.cobblemon.mod.common.client.net.storage.pc.*
import com.cobblemon.mod.common.client.net.toast.ToastPacketHandler
import com.cobblemon.mod.common.client.net.trade.*
import com.cobblemon.mod.common.client.net.trade.TradeAcceptanceChangedHandler
import com.cobblemon.mod.common.client.net.trade.TradeCancelledHandler
import com.cobblemon.mod.common.client.net.trade.TradeCompletedHandler
import com.cobblemon.mod.common.client.net.trade.TradeOfferExpiredHandler
import com.cobblemon.mod.common.client.net.trade.TradeOfferNotificationHandler
import com.cobblemon.mod.common.client.net.trade.TradeProcessStartedHandler
import com.cobblemon.mod.common.client.net.trade.TradeStartedHandler
import com.cobblemon.mod.common.client.net.trade.TradeUpdatedHandler
import com.cobblemon.mod.common.net.PacketRegisterInfo
import com.cobblemon.mod.common.net.messages.client.CalculateSeatPositionsPacket
import com.cobblemon.mod.common.net.messages.client.OpenBehaviourEditorPacket
@@ -69,12 +83,20 @@ import com.cobblemon.mod.common.net.messages.client.data.*
import com.cobblemon.mod.common.net.messages.client.debug.RequestOpenRidingStatsDebugGUIPacket
import com.cobblemon.mod.common.net.messages.client.dialogue.DialogueClosedPacket
import com.cobblemon.mod.common.net.messages.client.dialogue.DialogueOpenedPacket
import com.cobblemon.mod.common.net.messages.client.effect.*
import com.cobblemon.mod.common.net.messages.client.effect.PokeSnackBlockParticlesPacket
import com.cobblemon.mod.common.net.messages.client.effect.RunPosableMoLangPacket
import com.cobblemon.mod.common.net.messages.client.effect.SaccharineLogBlockParticlesPacket
import com.cobblemon.mod.common.net.messages.client.effect.SpawnSnowstormEntityParticlePacket
import com.cobblemon.mod.common.net.messages.client.effect.SpawnSnowstormParticlePacket
import com.cobblemon.mod.common.net.messages.client.npc.CloseNPCEditorPacket
import com.cobblemon.mod.common.net.messages.client.npc.OpenNPCEditorPacket
import com.cobblemon.mod.common.net.messages.client.orientation.ClientboundUpdateDriverInputPacket
import com.cobblemon.mod.common.net.messages.client.orientation.ClientboundUpdateOrientationPacket
import com.cobblemon.mod.common.net.messages.client.pasture.*
import com.cobblemon.mod.common.net.messages.client.pasture.ClosePasturePacket
import com.cobblemon.mod.common.net.messages.client.pasture.OpenPasturePacket
import com.cobblemon.mod.common.net.messages.client.pasture.PokemonPasturedPacket
import com.cobblemon.mod.common.net.messages.client.pasture.PokemonUnpasturedPacket
import com.cobblemon.mod.common.net.messages.client.pasture.UpdatePastureConflictFlagPacket
import com.cobblemon.mod.common.net.messages.client.pokedex.ServerConfirmedRegisterPacket
import com.cobblemon.mod.common.net.messages.client.pokemon.update.*
import com.cobblemon.mod.common.net.messages.client.pokemon.update.evolution.AddEvolutionPacket
@@ -94,19 +116,43 @@ import com.cobblemon.mod.common.net.messages.client.storage.party.InitializePart
import com.cobblemon.mod.common.net.messages.client.storage.party.MoveClientPartyPokemonPacket
import com.cobblemon.mod.common.net.messages.client.storage.party.SetPartyPokemonPacket
import com.cobblemon.mod.common.net.messages.client.storage.party.SetPartyReferencePacket
import com.cobblemon.mod.common.net.messages.client.storage.pc.*
import com.cobblemon.mod.common.net.messages.client.storage.pc.ClosePCPacket
import com.cobblemon.mod.common.net.messages.client.storage.pc.InitializePCPacket
import com.cobblemon.mod.common.net.messages.client.storage.pc.MoveClientPCPokemonPacket
import com.cobblemon.mod.common.net.messages.client.storage.pc.OpenPCPacket
import com.cobblemon.mod.common.net.messages.client.storage.pc.RenamePCBoxPacket
import com.cobblemon.mod.common.net.messages.client.storage.pc.SetPCBoxPacket
import com.cobblemon.mod.common.net.messages.client.storage.pc.SetPCPokemonPacket
import com.cobblemon.mod.common.net.messages.client.storage.pc.wallpaper.ChangePCBoxWallpaperPacket
import com.cobblemon.mod.common.net.messages.client.storage.pc.wallpaper.RequestPCBoxWallpapersPacket
import com.cobblemon.mod.common.net.messages.client.storage.pc.wallpaper.SetPCBoxWallpapersPacket
import com.cobblemon.mod.common.net.messages.client.storage.pc.wallpaper.UnlockPCBoxWallpaperPacket
import com.cobblemon.mod.common.net.messages.client.toast.ToastPacket
import com.cobblemon.mod.common.net.messages.client.trade.*
import com.cobblemon.mod.common.net.messages.client.trade.TradeAcceptanceChangedPacket
import com.cobblemon.mod.common.net.messages.client.trade.TradeCancelledPacket
import com.cobblemon.mod.common.net.messages.client.trade.TradeCompletedPacket
import com.cobblemon.mod.common.net.messages.client.trade.TradeOfferExpiredPacket
import com.cobblemon.mod.common.net.messages.client.trade.TradeOfferNotificationPacket
import com.cobblemon.mod.common.net.messages.client.trade.TradeProcessStartedPacket
import com.cobblemon.mod.common.net.messages.client.trade.TradeStartedPacket
import com.cobblemon.mod.common.net.messages.client.trade.TradeUpdatedPacket
import com.cobblemon.mod.common.net.messages.client.ui.ExpGainedDataPacket
import com.cobblemon.mod.common.net.messages.client.ui.InteractPokemonUIPacket
import com.cobblemon.mod.common.net.messages.client.ui.PokedexUIPacket
import com.cobblemon.mod.common.net.messages.client.ui.SummaryUIPacket
import com.cobblemon.mod.common.net.messages.server.*
import com.cobblemon.mod.common.net.messages.server.battle.*
import com.cobblemon.mod.common.net.messages.server.BattleChallengePacket
import com.cobblemon.mod.common.net.messages.server.BattleChallengeResponsePacket
import com.cobblemon.mod.common.net.messages.server.BenchMovePacket
import com.cobblemon.mod.common.net.messages.server.RequestMoveSwapPacket
import com.cobblemon.mod.common.net.messages.server.RequestPlayerInteractionsPacket
import com.cobblemon.mod.common.net.messages.server.SelectStarterPacket
import com.cobblemon.mod.common.net.messages.server.SendOutPokemonPacket
import com.cobblemon.mod.common.net.messages.server.battle.BattleSelectActionsPacket
import com.cobblemon.mod.common.net.messages.server.battle.BattleTeamLeavePacket
import com.cobblemon.mod.common.net.messages.server.battle.BattleTeamRequestPacket
import com.cobblemon.mod.common.net.messages.server.battle.BattleTeamResponsePacket
import com.cobblemon.mod.common.net.messages.server.battle.RemoveSpectatorPacket
import com.cobblemon.mod.common.net.messages.server.battle.SpectateBattlePacket
import com.cobblemon.mod.common.net.messages.server.behaviour.DamageOnCollisionPacket
import com.cobblemon.mod.common.net.messages.server.behaviour.SetEntityBehaviourPacket
import com.cobblemon.mod.common.net.messages.server.block.AdjustBlockEntityViewerCountPacket
@@ -131,7 +177,11 @@ import com.cobblemon.mod.common.net.messages.server.pasture.UnpasturePokemonPack
import com.cobblemon.mod.common.net.messages.server.pokedex.scanner.FinishScanningPacket
import com.cobblemon.mod.common.net.messages.server.pokedex.scanner.StartScanningPacket
import com.cobblemon.mod.common.net.messages.server.pokemon.interact.InteractPokemonPacket
import com.cobblemon.mod.common.net.messages.server.pokemon.update.*
import com.cobblemon.mod.common.net.messages.server.pokemon.update.ServerboundUpdateRidingStatePacket
import com.cobblemon.mod.common.net.messages.server.pokemon.update.SetActiveMarkPacket
import com.cobblemon.mod.common.net.messages.server.pokemon.update.SetItemHiddenPacket
import com.cobblemon.mod.common.net.messages.server.pokemon.update.SetMarkingsPacket
import com.cobblemon.mod.common.net.messages.server.pokemon.update.SetNicknamePacket
import com.cobblemon.mod.common.net.messages.server.pokemon.update.evolution.AcceptEvolutionPacket
import com.cobblemon.mod.common.net.messages.server.riding.DismountPokemonPacket
import com.cobblemon.mod.common.net.messages.server.riding.ServerboundUpdateDriverInputPacket
@@ -142,11 +192,21 @@ import com.cobblemon.mod.common.net.messages.server.storage.party.MovePartyPokem
import com.cobblemon.mod.common.net.messages.server.storage.party.ReleasePartyPokemonPacket
import com.cobblemon.mod.common.net.messages.server.storage.party.SwapPartyPokemonPacket
import com.cobblemon.mod.common.net.messages.server.storage.pc.*
import com.cobblemon.mod.common.net.messages.server.trade.*
import com.cobblemon.mod.common.net.messages.server.trade.AcceptTradeRequestPacket
import com.cobblemon.mod.common.net.messages.server.trade.CancelTradePacket
import com.cobblemon.mod.common.net.messages.server.trade.ChangeTradeAcceptancePacket
import com.cobblemon.mod.common.net.messages.server.trade.OfferTradePacket
import com.cobblemon.mod.common.net.messages.server.trade.PerformTradePacket
import com.cobblemon.mod.common.net.messages.server.trade.UpdateTradeOfferPacket
import com.cobblemon.mod.common.net.serverhandling.ChallengeHandler
import com.cobblemon.mod.common.net.serverhandling.ChallengeResponseHandler
import com.cobblemon.mod.common.net.serverhandling.RequestInteractionsHandler
import com.cobblemon.mod.common.net.serverhandling.battle.*
import com.cobblemon.mod.common.net.serverhandling.battle.BattleSelectActionsHandler
import com.cobblemon.mod.common.net.serverhandling.battle.RemoveSpectatorHandler
import com.cobblemon.mod.common.net.serverhandling.battle.SpectateBattleHandler
import com.cobblemon.mod.common.net.serverhandling.battle.TeamLeaveHandler
import com.cobblemon.mod.common.net.serverhandling.battle.TeamRequestHandler
import com.cobblemon.mod.common.net.serverhandling.battle.TeamRequestResponseHandler
import com.cobblemon.mod.common.net.serverhandling.behaviour.DamageOnCollisionPacketHandler
import com.cobblemon.mod.common.net.serverhandling.behaviour.SetEntityBehaviourHandler
import com.cobblemon.mod.common.net.serverhandling.block.AdjustBlockEntityViewerCountHandler
@@ -172,7 +232,11 @@ import com.cobblemon.mod.common.net.serverhandling.pasture.UnpasturePokemonHandl
import com.cobblemon.mod.common.net.serverhandling.pokedex.scanner.FinishScanningHandler
import com.cobblemon.mod.common.net.serverhandling.pokedex.scanner.StartScanningHandler
import com.cobblemon.mod.common.net.serverhandling.pokemon.interact.InteractPokemonHandler
import com.cobblemon.mod.common.net.serverhandling.pokemon.update.*
import com.cobblemon.mod.common.net.serverhandling.pokemon.update.ServerboundUpdateRidingStateHandler
import com.cobblemon.mod.common.net.serverhandling.pokemon.update.SetActiveMarkHandler
import com.cobblemon.mod.common.net.serverhandling.pokemon.update.SetItemHiddenHandler
import com.cobblemon.mod.common.net.serverhandling.pokemon.update.SetMarkingsHandler
import com.cobblemon.mod.common.net.serverhandling.pokemon.update.SetNicknameHandler
import com.cobblemon.mod.common.net.serverhandling.riding.DismountPokemonPacketHandler
import com.cobblemon.mod.common.net.serverhandling.riding.DriverInputPacketHandler
import com.cobblemon.mod.common.net.serverhandling.riding.ServerboundUpdateRiderRotationHandler
@@ -186,7 +250,12 @@ import com.cobblemon.mod.common.net.serverhandling.storage.party.MovePartyPokemo
import com.cobblemon.mod.common.net.serverhandling.storage.party.ReleasePCPokemonHandler
import com.cobblemon.mod.common.net.serverhandling.storage.party.SwapPartyPokemonHandler
import com.cobblemon.mod.common.net.serverhandling.storage.pc.*
import com.cobblemon.mod.common.net.serverhandling.trade.*
import com.cobblemon.mod.common.net.serverhandling.trade.AcceptTradeRequestHandler
import com.cobblemon.mod.common.net.serverhandling.trade.CancelTradeHandler
import com.cobblemon.mod.common.net.serverhandling.trade.ChangeTradeAcceptanceHandler
import com.cobblemon.mod.common.net.serverhandling.trade.OfferTradeHandler
import com.cobblemon.mod.common.net.serverhandling.trade.PerformTradeHandler
import com.cobblemon.mod.common.net.serverhandling.trade.UpdateTradeOfferHandler
import com.cobblemon.mod.common.util.server
import net.minecraft.server.level.ServerPlayer
@@ -332,7 +401,7 @@ object CobblemonNetwork {
// Data registries
list.add(PacketRegisterInfo(AbilityRegistrySyncPacket.ID, AbilityRegistrySyncPacket::decode, DataRegistrySyncPacketHandler()))
list.add(PacketRegisterInfo(CobblemonMechanicsSyncPacket.ID, CobblemonMechanicsSyncPacket::decode, CobblemonMechanicsSyncHandler))
list.add(PacketRegisterInfo(PokemonInteractionsSyncPacket.ID, PokemonInteractionsSyncPacket::decode, PokemonInteractionsSyncHandler))
list.add(PacketRegisterInfo(PokemonInteractionsSyncPacket.ID, PokemonInteractionsSyncPacket::decode, DataRegistrySyncPacketHandler()))
list.add(PacketRegisterInfo(MovesRegistrySyncPacket.ID, MovesRegistrySyncPacket::decode, DataRegistrySyncPacketHandler()))
list.add(PacketRegisterInfo(BerryRegistrySyncPacket.ID, BerryRegistrySyncPacket::decode, DataRegistrySyncPacketHandler()))
list.add(PacketRegisterInfo(SpeciesRegistrySyncPacket.ID, SpeciesRegistrySyncPacket::decode, DataRegistrySyncPacketHandler()))
@@ -499,8 +499,8 @@ open class PokemonBattle(
}
fun stop() {
end()
writeShowdownAction(">forcetie") // This will terminate the Showdown connection
end()
}
fun checkForInputDispatch() {
@@ -59,40 +59,32 @@ object PokemonInteractions : JsonDataRegistry<PokemonInteractionSet> {
.setPrettyPrinting()
.create()
val speciesInteractions = mutableListOf<PokemonInteractionSet>()
val generalInteractions = mutableListOf<PokemonInteractionSet>()
val interactions = mutableListOf<PokemonInteractionSet>()
override fun sync(player: ServerPlayer) {
PokemonInteractionsSyncPacket(
speciesInteractions,
generalInteractions,
).sendToPlayer(player)
PokemonInteractionsSyncPacket(interactions).sendToPlayer(player)
}
override fun reload(data: Map<ResourceLocation, PokemonInteractionSet>) {
speciesInteractions.clear()
generalInteractions.clear()
val split = data.entries.partition { it.value.requirements.any { requirement -> requirement is PokemonPropertiesRequirement && requirement.target.species != null } }
speciesInteractions.addAll(split.first.map {it.value})
generalInteractions.addAll(split.second.map {it.value})
Cobblemon.LOGGER.info("Loaded {} Pokémon interaction sets", data.size)
interactions.clear()
val split = data.entries
.partition {
it.value.requirements.any { requirement -> requirement is PokemonPropertiesRequirement && requirement.target.species != null }
}
// Put the species specific interactions first as they take priority
interactions.addAll(split.first.map {it.value})
interactions.addAll(split.second.map {it.value})
Cobblemon.LOGGER.info("Loaded {} Pokémon interaction sets", interactions.size)
}
fun findInteraction(pokemon: PokemonEntity): PokemonInteraction? {
val setCheck: (PokemonInteractionSet) -> Boolean = { it.requirements.all { req -> req.check(pokemon.pokemon) }}
val interactionCheck: (PokemonInteraction) -> Boolean = { it.requirements.all { req -> req.check(pokemon.pokemon) } && !pokemon.pokemon.isOnInteractionCooldown(it.grouping) }
// species-specific interactions take priority
val validInteractions = speciesInteractions
return interactions
.filter(setCheck)
.flatMap { it.interactions }
.filter(interactionCheck)
.toMutableList()
if (validInteractions.isEmpty()) { // if all species-specific interactions are absent/on cooldown, fallback to more generic ones
validInteractions.addAll(generalInteractions.filter(setCheck).flatMap { it.interactions }
.filter(interactionCheck)
)
}
return validInteractions.randomOrNull()
.firstOrNull(interactionCheck)
}
}
@@ -43,17 +43,9 @@ data class PokemonInteractionSet(
companion object {
fun decode(buffer: FriendlyByteBuf): PokemonInteractionSet {
val requirements = buffer.readList { it ->
CobblemonRequirementAdapter.decode(it)
}
val interactions = buffer.readList { it ->
PokemonInteraction.decode(it)
}
return PokemonInteractionSet(
requirements,
interactions,
)
val requirements = buffer.readList(CobblemonRequirementAdapter::decode)
val interactions = buffer.readList(PokemonInteraction::decode)
return PokemonInteractionSet(requirements, interactions)
}
}
}
@@ -368,6 +368,11 @@ object MoLangFunctions {
val b = format.parse(dateB)
DoubleValue(a.after(b))
},
"get_move_from_id" to java.util.function.Function { params ->
val moveId = params.getString(0)
val moveTemplate = Moves.getByName(moveId)
return@Function moveTemplate?.struct ?: DoubleValue.ZERO
},
"create_simple_party_provider" to java.util.function.Function { params ->
val partyProvider = SimplePartyProvider()
return@Function partyProvider.struct
@@ -378,6 +383,13 @@ object MoLangFunctions {
val pickupItem = ObtainableItem(item = item, pickupPriority = pickupPriority)
return@Function pickupItem.struct
},
"create_itemstack" to java.util.function.Function { params ->
val itemId = params.getString(0).asIdentifierDefaultingNamespace()
val item = BuiltInRegistries.ITEM.get(itemId) ?: return@Function DoubleValue.ZERO
val count = params.getIntOrNull(1) ?: 1
val itemStack = ItemStack(item, count)
return@Function ObjectValue(itemStack)
},
"file" to java.util.function.Function { MoLangLoadedFilesCache.struct }
)
val biomeFunctions = mutableListOf<(Holder<Biome>) -> HashMap<String, java.util.function.Function<MoParams, Any>>>()
@@ -583,6 +595,62 @@ object MoLangFunctions {
}
return@put items
}
map.put("has_inventory_space") { _ ->
val inventory = player.inventory
return@put if (inventory.getFreeSlot() != -1) DoubleValue.ONE else DoubleValue.ZERO
}
map.put("set_inventory_slot") { params ->
val slot = params.getInt(0)
val inventory = player.inventory
if (slot !in 0 until inventory.containerSize) return@put DoubleValue.ZERO
val value = params.getOrNull<MoValue>(1) ?: return@put DoubleValue.ZERO
val stack: ItemStack? = when (value) {
is ObjectValue<*> -> value.obj as? ItemStack
is StringValue -> {
val id = ResourceLocation.parse(value.value)
val item = player.registryAccess().registryOrThrow(Registries.ITEM).get(id) ?: return@put DoubleValue.ZERO
ItemStack(item)
}
else -> null
}
if (stack == null) return@put DoubleValue.ZERO
inventory.setItem(slot, stack)
return@put DoubleValue.ONE
}
map.put("give_item") { params ->
val inventory = player.inventory
val freeSlot = inventory.getFreeSlot()
val value = params.getOrNull<MoValue>(0) ?: return@put DoubleValue.ZERO
val dropIfFull = params.getBooleanOrNull(1) ?: false
val stack: ItemStack? = when (value) {
is ObjectValue<*> -> value.obj as? ItemStack
is StringValue -> {
val id = ResourceLocation.parse(value.value)
val item = player.registryAccess().registryOrThrow(Registries.ITEM).get(id) ?: return@put DoubleValue.ZERO
ItemStack(item)
}
else -> null
}
if (stack == null) return@put DoubleValue.ZERO
if (freeSlot == -1) {
if (dropIfFull) {
player.drop(stack, false)
return@put DoubleValue.ONE
} else {
return@put DoubleValue.ZERO
}
}
inventory.setItem(freeSlot, stack)
return@put DoubleValue.ONE
}
map.put("face") { params -> ObjectValue(PlayerDialogueFaceProvider(player.uuid, params.getBooleanOrNull(0) != false)) }
map.put("swing_hand") { _ -> player.swing(player.usedItemHand) }
map.put("food_level") { _ -> DoubleValue(player.foodData.foodLevel) }
@@ -626,8 +694,7 @@ object MoLangFunctions {
}
map.put("active_dialogue") { _ ->
if (player.isInDialogue) {
player.activeDialogue?.dialogueId.toString()
return@put DoubleValue.ONE
return@put player.activeDialogue?.toMoLangStruct() ?: DoubleValue.ZERO
} else {
DoubleValue.ZERO
}
@@ -58,12 +58,15 @@ open class MoveTemplate(
val struct: MoStruct by lazy {
QueryStruct(hashMapOf())
.addFunction("name") { StringValue(name) }
.addFunction("display_name") { StringValue(displayName.string) }
.addFunction("description") { StringValue(description.string) }
.addFunction("type") { StringValue(elementalType.showdownId) }
.addFunction("damage_category") { StringValue(damageCategory.name) }
.addFunction("power") { DoubleValue(power) }
.addFunction("target") { StringValue(target.name) }
.addFunction("accuracy") { DoubleValue(accuracy) }
.addFunction("pp") { DoubleValue(pp) }
.addFunction("max_pp") { DoubleValue(maxPp) }
.addFunction("priority") { DoubleValue(priority) }
.addFunction("crit_ratio") { DoubleValue(critRatio) }
}
@@ -41,10 +41,6 @@ interface CompositeRidingStrategy<T : CompositeSettings> {
toState: RidingBehaviourState,
toSettings: RidingBehaviourSettings
) {
if (vehicle.level().isClientSide) {
val fromSettings = if (settings.defaultBehaviour == toSettings) settings.alternateBehaviour else settings.defaultBehaviour
}
toState.stamina.set(fromState.stamina.get())
toState.rideVelocity.set(fromState.rideVelocity.get())
fromState.reset()
@@ -187,17 +187,16 @@ class HorseBehaviour : RidingBehaviour<HorseSettings, HorseState> {
return
}
var newStam = stam
val stamDrainRate = (1.0f / vehicle.runtime.resolveDouble(settings.staminaExpr ?: globalHorse.staminaExpr!!)).toFloat() / 20.0f
if (state.sprinting.get()) {
newStam = max(0.0f,stam - stamDrainRate)
val newStam = if (state.sprinting.get()) {
max(0.0f,stam - stamDrainRate)
} else {
newStam = min(1.0f,stam + stamDrainRate * 4)
min(1.0f,stam + stamDrainRate * 4)
}
state.stamina.set(newStam)
state.stamina.set(newStam.coerceIn(0F, 1F))
}
override fun updatePassengerRotation(
@@ -100,7 +100,7 @@ class DolphinBehaviour : RidingBehaviour<DolphinSettings, DolphinState> {
driver: Player,
input: Vec3
) {
if(vehicle.level().isClientSide) {
if (vehicle.level().isClientSide) {
handleBoosting(state, vehicle)
tickStamina(settings, state, vehicle)
}
@@ -147,7 +147,7 @@ class DolphinBehaviour : RidingBehaviour<DolphinSettings, DolphinState> {
val stamDrainRate = (1.0f / boostTime).toFloat()
val newStam = if (state.boosting.get()) max(0.0f,stam - stamDrainRate)
else min(1.0f,stam + stamDrainRate)
else (stam + stamDrainRate).coerceIn(0F, 1F)
state.stamina.set(newStam)
}
@@ -26,7 +26,7 @@ import net.minecraft.world.entity.Entity
/**
* A [SpawningInfluence] that applies some number of SpawnBait effects.
*
* @author Hiroku, Plastered_Crab
* @author Hiroku, Plastered_Crab, ppVon
* @since March 18th, 2025
*/
open class SpawnBaitInfluence(val effects: List<SpawnBait.Effect>, val onUsed: (time: Int, entity: PokemonEntity?) -> Unit = { _, _ -> }) : SpawningInfluence {
@@ -50,85 +50,84 @@ open class SpawnBaitInfluence(val effects: List<SpawnBait.Effect>, val onUsed: (
}
}
// EV related bait effects
// EV, Type, and Egg Group related bait effects
override fun affectWeight(detail: SpawnDetail, spawnablePosition: SpawnablePosition, weight: Float): Float {
val merged = SpawnBaitUtils.mergeEffects(effects)
val hasRelevantEffects =
merged.any { it.type == Effects.EV } ||
merged.any { it.type == Effects.TYPING } ||
merged.any { it.type == Effects.EGG_GROUP }
if (!hasRelevantEffects) {
return super.affectWeight(detail, spawnablePosition, weight)
}
val pokemonDetail = detail as? PokemonSpawnDetail
?: return super.affectWeight(detail, spawnablePosition, weight)
val detailSpecies = pokemonDetail.pokemon.species
?.let { PokemonSpecies.getByName(it) }
?: return super.affectWeight(detail, spawnablePosition, weight)
val formData = detailSpecies.getForm(pokemonDetail.pokemon.aspects)
var newWeight = weight
var used = false
// if bait exists and any effects are related to EV yields
if (merged.any { it.type == Effects.EV }){
if (detail is PokemonSpawnDetail) {
val detailSpecies = detail.pokemon.species?.let { PokemonSpecies.getByName(it) }
val baitEVStat = effects.firstOrNull { it.type == Effects.EV }?.subcategory?.path?.let { Stats.getStat(it) }
if (merged.any { it.type == Effects.EV }) {
val evEffect = effects.firstOrNull { it.type == Effects.EV }
val baitEVStat = evEffect?.subcategory?.path?.let { Stats.getStat(it) }
if (detailSpecies != null && baitEVStat != null) {
val detailAspects = detail.pokemon.aspects
val formData = detailSpecies.getForm(detailAspects)
val evYieldValue = formData.evYield[baitEVStat]?.toFloat() ?: 0f
return when {
evYieldValue > 0 -> {
markUsed()
super.affectWeight(detail, spawnablePosition, weight)
}
else -> {
markUsed()
super.affectWeight(detail, spawnablePosition, 0f)
}
}
if (baitEVStat != null) {
val evYieldValue = formData.evYield[baitEVStat]?.toFloat() ?: 0f
used = true
if (evYieldValue <= 0f) {
newWeight = 0f
} else {
LOGGER.debug("Boosted weight value");
}
}
}
// if bait exists and any effects are related to Typing
if (merged.any { it.type == Effects.TYPING }){
if (detail is PokemonSpawnDetail) {
val detailSpecies = detail.pokemon.species?.let { PokemonSpecies.getByName(it) }
val baitEffect = effects.firstOrNull { it.type == Effects.TYPING }
val baitTypingEffect = baitEffect?.subcategory?.path?.let { ElementalTypes.get(it) }
if (newWeight > 0f && merged.any { it.type == Effects.TYPING }) {
val baitEffect = effects.firstOrNull { it.type == Effects.TYPING }
val baitTypingEffect = baitEffect?.subcategory?.path?.let { ElementalTypes.get(it) }
if (detailSpecies != null && baitTypingEffect != null) {
val detailAspects = detail.pokemon.aspects
val formData = detailSpecies.getForm(detailAspects)
val isMatchingType = formData.types.contains(baitTypingEffect)
return when {
isMatchingType -> {
markUsed()
super.affectWeight(detail, spawnablePosition, weight * baitEffect.value.toFloat())
}
else -> super.affectWeight(detail, spawnablePosition, weight)
}
if (baitEffect != null && baitTypingEffect != null) {
val isMatchingType = formData.types.contains(baitTypingEffect)
used = true
if (isMatchingType) {
newWeight *= baitEffect.value.toFloat()
}
}
}
// if bait exists and any effects are related to Egg Groups
if (merged.any { it.type == Effects.EGG_GROUP }) {
if (detail is PokemonSpawnDetail) {
val detailSpecies = detail.pokemon.species?.let { PokemonSpecies.getByName(it) }
if (newWeight > 0f && merged.any { it.type == Effects.EGG_GROUP }) {
val eggGroupEffects = effects.filter { it.type == Effects.EGG_GROUP }
if (detailSpecies != null) {
val detailAspects = detail.pokemon.aspects
val formData = detailSpecies.getForm(detailAspects)
// Collect all the egg group effects
val eggGroupEffects = effects.filter { it.type == Effects.EGG_GROUP }
// Check if any of the egg group effects match the species' egg groups
val matchingEffect = eggGroupEffects.firstOrNull { effect ->
val effectEggGroupKey = effect.subcategory?.path ?: return@firstOrNull false
val eggGroup = EggGroup.fromIdentifier(effectEggGroupKey)
if (eggGroup == null) {
LOGGER.warn("Unknown egg group identifier: $effectEggGroupKey")
return@firstOrNull false
}
formData.eggGroups.contains(eggGroup)
}
if (matchingEffect != null) {
markUsed()
val multiplier = matchingEffect.value
return super.affectWeight(detail, spawnablePosition, (weight * multiplier).toFloat())
}
val matchingEffect = eggGroupEffects.firstOrNull { effect ->
val key = effect.subcategory?.path ?: return@firstOrNull false
val eggGroup = EggGroup.fromIdentifier(key)
if (eggGroup == null) {
LOGGER.warn("Unknown egg group identifier: $key")
return@firstOrNull false
}
formData.eggGroups.contains(eggGroup)
}
if (matchingEffect != null) {
used = true
newWeight *= matchingEffect.value.toFloat()
}
}
return super.affectWeight(detail, spawnablePosition, weight)
if (used) markUsed()
return super.affectWeight(detail, spawnablePosition, newWeight)
}
}
@@ -221,6 +221,7 @@ object BattleRegistry {
fun closeBattle(battle: PokemonBattle) {
battle.onEndHandlers.forEach { it(battle) }
battleMap.remove(battle.battleId)
ShowdownService.service.endBattle(battle)
}
@JvmStatic
@@ -18,7 +18,7 @@ import java.util.UUID
import net.minecraft.network.chat.MutableComponent
import net.minecraft.network.chat.Component
class MultiPokemonBattleActor(
open class MultiPokemonBattleActor(
pokemonList: List<BattlePokemon>,
artificialDecider: BattleAI = RandomBattleAI(),
uuid: UUID = UUID.randomUUID()
@@ -24,17 +24,14 @@ import net.minecraft.network.chat.MutableComponent
import net.minecraft.network.chat.Component
import net.minecraft.world.phys.Vec3
class PokemonBattleActor(
open class PokemonBattleActor(
uuid: UUID,
val pokemon: BattlePokemon,
override val fleeDistance: Float,
artificialDecider: BattleAI = RandomBattleAI()
artificialDecider: BattleAI = RandomBattleAI(),
) : AIBattleActor(uuid, listOf(pokemon), artificialDecider), EntityBackedBattleActor<PokemonEntity>, FleeableBattleActor {
override val initialPos: Vec3?
init {
initialPos = entity?.position()
}
override val initialPos: Vec3? = pokemon.entity?.position()
override fun getName() = pokemon.effectedPokemon.species.translatedName
override fun nameOwned(name: String): MutableComponent = Component.literal(name)
override fun getWorldAndPosition(): Pair<ServerLevel, Vec3>? {
@@ -17,7 +17,7 @@ import com.cobblemon.mod.common.util.battleLang
import java.util.UUID
import net.minecraft.network.chat.MutableComponent
class TrainerBattleActor(
open class TrainerBattleActor(
val trainerName: String,
uuid: UUID,
pokemonList: List<BattlePokemon>,
@@ -27,6 +27,7 @@ interface ShowdownService {
fun openConnection()
fun closeConnection()
fun startBattle(battle: PokemonBattle, messages: Array<String>)
fun endBattle(battle: PokemonBattle)
fun send(battleId: UUID, messages: Array<String>)
fun getRegistryData(type: String): JsonArray
fun sendRegistryData(data: Map<String, String>, type: String)
@@ -129,6 +129,11 @@ class GraalShowdownService : ShowdownService {
startBattleFunction.execute(this, battle.battleId.toString(), messages)
}
override fun endBattle(battle: PokemonBattle) {
val endBattleFunction = context.getBindings("js").getMember("endBattle")
endBattleFunction.execute(battle.battleId.toString())
}
override fun send(battleId: UUID, messages: Array<String>) {
sendToShowdown(battleId, messages)
}
@@ -62,6 +62,11 @@ class SocketShowdownService(val host: String = "localhost", val port: Int = 1846
send(battle.battleId, messages)
}
override fun endBattle(battle: PokemonBattle) {
writer.write(">endbattle ${battle.battleId}\n")
acknowledge { Cobblemon.LOGGER.error("Failed to end battle ${battle.battleId}!") }
}
override fun send(battleId: UUID, messages: Array<String>) {
for (message in messages) {
writer.write("$battleId~$message\n")
@@ -1,42 +0,0 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.block
import net.minecraft.world.item.Item
import net.minecraft.core.dispenser.DispenseItemBehavior
import net.minecraft.world.item.Items
import net.minecraft.world.item.alchemy.PotionContents
import net.minecraft.world.item.alchemy.Potions
import net.minecraft.world.level.block.DispenserBlock
object DispenserBehaviorRegistry {
private val behaviors = mutableMapOf<Item, DispenseItemBehavior>()
fun register(items: List<Item>, behaviorProvider: (Item) -> DispenseItemBehavior) {
for (item in items) {
behaviors[item] = behaviorProvider(item)
}
}
fun applyBehaviors() {
behaviors.forEach { (item, behavior) ->
DispenserBlock.registerBehavior(item, behavior)
}
}
// TODO: Seems like there can only 1 behavior per item, so registering the leaves with the honey bottle overrode the honey bottle behavior for the log.
// Registering a new behavior with `DispenserBlock.registerBehavior` will override any existing ones for that item, possibly even ones from Minecraft and other mods
// Will probably need to use an alternate way of implementing this to avoid conflicts.
fun registerDispenserBehaviors() {
// register(listOf(PotionContents.createItemStack(Items.POTION, Potions.WATER).item)) { SaccharineLogSlatheredBlock.createBehavior() }
// register(listOf(Items.HONEY_BOTTLE)) { SaccharineLogBlock.createBehavior() }
// register(listOf(Items.HONEY_BOTTLE, Items.GLASS_BOTTLE)) { item -> SaccharineLeafBlock.createBehavior(item)}
applyBehaviors()
}
}
@@ -28,6 +28,8 @@ import net.minecraft.world.entity.player.Player
import net.minecraft.world.item.Item
import net.minecraft.world.item.ItemStack
import net.minecraft.world.item.Items
import net.minecraft.world.item.alchemy.PotionContents
import net.minecraft.world.item.alchemy.Potions
import net.minecraft.world.level.BlockGetter
import net.minecraft.world.level.Level
import net.minecraft.world.level.LevelAccessor
@@ -67,9 +69,16 @@ class SaccharineLeafBlock(settings: Properties) : LeavesBlock(settings) {
if (blockState.block is SaccharineLeafBlock) {
val currentAge = blockState.getValue(AGE)
val newAge = when {
item == Items.HONEY_BOTTLE && currentAge < MAX_AGE -> (currentAge + 2).coerceAtMost(MAX_AGE)
item == Items.GLASS_BOTTLE && currentAge > MIN_AGE -> (currentAge - 2).coerceAtLeast(MIN_AGE)
val waterBottle = PotionContents.createItemStack(Items.POTION, Potions.WATER).item
val newAge = when (item) {
Items.HONEY_BOTTLE if currentAge < MAX_AGE ->
(currentAge + 2).coerceAtMost(MAX_AGE)
waterBottle if currentAge > MIN_AGE ->
(currentAge - 2).coerceAtLeast(MIN_AGE)
else -> currentAge
}
@@ -79,21 +88,23 @@ class SaccharineLeafBlock(settings: Properties) : LeavesBlock(settings) {
stack.shrink(1)
val dispenserEntity = source.blockEntity
val outputItem = if (item == Items.HONEY_BOTTLE) Items.GLASS_BOTTLE else Items.HONEY_BOTTLE
val outputItem = Items.GLASS_BOTTLE
val outputStack = ItemStack(outputItem)
var added = false
for (i in 0 until dispenserEntity.containerSize) {
val slotStack = dispenserEntity.getItem(i)
if (dispenserEntity != null) {
for (i in 0 until dispenserEntity.containerSize) {
val slotStack = dispenserEntity.getItem(i)
if (slotStack.isEmpty) {
dispenserEntity.setItem(i, outputStack.copy())
added = true
break
} else if (slotStack.`is`(outputItem) && slotStack.count < slotStack.maxStackSize) {
slotStack.grow(1)
added = true
break
if (slotStack.isEmpty) {
dispenserEntity.setItem(i, outputStack.copy())
added = true
break
} else if (slotStack.`is`(outputItem) && slotStack.count < slotStack.maxStackSize) {
slotStack.grow(1)
added = true
break
}
}
}
@@ -25,6 +25,7 @@ import net.minecraft.world.entity.player.Player
import net.minecraft.world.item.ItemStack
import net.minecraft.world.item.Items
import net.minecraft.world.level.Level
import net.minecraft.world.level.block.DispenserBlock
import net.minecraft.world.level.block.HorizontalDirectionalBlock
import net.minecraft.world.level.block.RotatedPillarBlock
import net.minecraft.world.level.block.state.BlockState
@@ -37,7 +38,7 @@ class SaccharineLogBlock(properties: Properties) : RotatedPillarBlock(properties
fun createBehavior(): DispenseItemBehavior {
return DispenseItemBehavior { source, stack ->
val level = source.level
val facing = source.state.getValue(HorizontalDirectionalBlock.FACING)
val facing = source.state.getValue(DispenserBlock.FACING)
val pos = source.pos.relative(facing)
val blockState = level.getBlockState(pos)
@@ -50,7 +51,13 @@ class SaccharineLogBlock(properties: Properties) : RotatedPillarBlock(properties
}
}
fun changeLogTypeDispenser(level: ServerLevel, pos: BlockPos, newState: BlockState, stack: ItemStack, source: BlockSource) {
fun changeLogTypeDispenser(
level: ServerLevel,
pos: BlockPos,
newState: BlockState,
stack: ItemStack,
source: BlockSource
) {
level.setBlock(pos, newState, 3)
level.gameEvent(null, GameEvent.BLOCK_CHANGE, pos)
@@ -75,11 +82,23 @@ class SaccharineLogBlock(properties: Properties) : RotatedPillarBlock(properties
}
if (!added) {
Containers.dropItemStack(level, source.pos.x.toDouble(), source.pos.y.toDouble(), source.pos.z.toDouble(), glassBottle)
Containers.dropItemStack(
level,
source.pos.x.toDouble(),
source.pos.y.toDouble(),
source.pos.z.toDouble(),
glassBottle
)
}
}
fun changeLogType(level: Level, pos: BlockPos, newState: BlockState, player: Player? = null, itemStack: ItemStack? = null) {
fun changeLogType(
level: Level,
pos: BlockPos,
newState: BlockState,
player: Player? = null,
itemStack: ItemStack? = null
) {
level.setBlock(pos, newState, 3)
level.gameEvent(null, GameEvent.BLOCK_CHANGE, pos)
@@ -93,7 +112,15 @@ class SaccharineLogBlock(properties: Properties) : RotatedPillarBlock(properties
}
}
override fun useItemOn(stack: ItemStack, state: BlockState, level: Level, pos: BlockPos, player: Player, hand: InteractionHand, hitResult: BlockHitResult): ItemInteractionResult {
override fun useItemOn(
stack: ItemStack,
state: BlockState,
level: Level,
pos: BlockPos,
player: Player,
hand: InteractionHand,
hitResult: BlockHitResult
): ItemInteractionResult {
val axis = state.getValue(AXIS)
val itemStack = player.getItemInHand(hand)
if (!level.isClientSide && itemStack.`is`(Items.HONEY_BOTTLE) && axis == Direction.Axis.Y) {
@@ -16,7 +16,9 @@ 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.Block
import net.minecraft.world.level.block.Blocks
import net.minecraft.world.level.block.HorizontalDirectionalBlock
import net.minecraft.world.level.block.SimpleWaterloggedBlock
import net.minecraft.world.level.block.state.BlockState
@@ -24,6 +26,8 @@ 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.IntegerProperty
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
@@ -45,7 +49,7 @@ class StackableItemBlock(settings: Properties, val type: StackableItemBlockType)
}
companion object {
val MAX_AMOUNT: Int = 8
val MAX_AMOUNT: Int = 4
val AMOUNT: IntegerProperty = IntegerProperty.create("amount", 1, MAX_AMOUNT)
val CODEC: MapCodec<StackableItemBlock> = RecordCodecBuilder.mapCodec { it.group(
@@ -163,6 +167,16 @@ class StackableItemBlock(settings: Properties, val type: StackableItemBlockType)
builder.add(HORIZONTAL_FACING, AMOUNT, WATERLOGGED)
}
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)
val count = state.getValue(AMOUNT)
@@ -175,8 +189,9 @@ class StackableItemBlock(settings: Properties, val type: StackableItemBlockType)
override fun getStateForPlacement(context: BlockPlaceContext): BlockState? {
val blockState = context.level.getBlockState(context.clickedPos)
val fluidState = context.level.getFluidState(context.clickedPos)
return if (blockState.`is`(this)) blockState.setValue(AMOUNT, min(getMaxAmount(type), (blockState.getValue(AMOUNT) + 1)))
else super.getStateForPlacement(context)?.setValue(HORIZONTAL_FACING, context.horizontalDirection.opposite)
else super.getStateForPlacement(context)?.setValue(HORIZONTAL_FACING, context.horizontalDirection.opposite)?.setValue(WATERLOGGED, fluidState.type === Fluids.WATER)
}
override fun canBeReplaced(state: BlockState, useContext: BlockPlaceContext): Boolean {
@@ -8,8 +8,6 @@
package com.cobblemon.mod.common.block
import com.cobblemon.mod.common.block.StackableItemBlock.Companion.AMOUNT
import com.cobblemon.mod.common.block.StackableItemBlock.Companion.MAX_AMOUNT
import com.cobblemon.mod.common.util.rotateShape
import com.mojang.serialization.MapCodec
import com.mojang.serialization.codecs.RecordCodecBuilder
@@ -23,6 +21,7 @@ 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.IntegerProperty
import net.minecraft.world.phys.shapes.CollisionContext
import net.minecraft.world.phys.shapes.Shapes
import net.minecraft.world.phys.shapes.VoxelShape
@@ -40,6 +39,9 @@ class WallAttachedStackableItemBlock(settings: Properties, val type: WallStackab
}
companion object {
val MAX_AMOUNT: Int = 8
val AMOUNT: IntegerProperty = IntegerProperty.create("amount", 1, MAX_AMOUNT)
val CODEC: MapCodec<WallAttachedStackableItemBlock> = RecordCodecBuilder.mapCodec { it.group(
propertiesCodec(),
WallStackableItemBlockType.CODEC.fieldOf("type").forGetter(WallAttachedStackableItemBlock::type)
@@ -0,0 +1,57 @@
/*
* 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.dispenser
import net.minecraft.core.dispenser.BlockSource
import net.minecraft.core.dispenser.DispenseItemBehavior
import net.minecraft.world.item.ItemStack
import java.util.concurrent.CopyOnWriteArrayList
class ChainedDispenseItemBehavior(private val base: DispenseItemBehavior) : DispenseItemBehavior {
private val extras = CopyOnWriteArrayList<DispenseItemBehavior>()
fun add(behavior: DispenseItemBehavior) {
extras.add(behavior)
}
override fun dispense(blockSource: BlockSource, itemStack: ItemStack): ItemStack {
var current = itemStack
for (b in extras) {
val prev = current.copy()
val next = try {
b.dispense(blockSource, current)
} catch (t: Throwable) {
continue
}
current = next
if (handled(prev, current)) {
return current
}
}
val beforeBase = current.copy()
val afterBase = try {
base.dispense(blockSource, current)
} catch (_: Throwable) {
return current
}
if (handled(beforeBase, afterBase)) {
return afterBase
}
return afterBase
}
private fun handled(before: ItemStack, after: ItemStack): Boolean {
return !ItemStack.matches(before, after)
}
}
@@ -0,0 +1,90 @@
/*
* 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.dispenser
import com.cobblemon.mod.common.block.SaccharineLeafBlock
import com.cobblemon.mod.common.block.SaccharineLogBlock
import com.cobblemon.mod.common.block.SaccharineLogSlatheredBlock
import com.cobblemon.mod.common.mixin.accessor.DispenserBlockAccessor
import net.minecraft.core.dispenser.DispenseItemBehavior
import net.minecraft.world.item.Item
import net.minecraft.world.item.Items
import net.minecraft.world.item.alchemy.PotionContents
import net.minecraft.world.item.alchemy.Potions
import net.minecraft.world.level.block.DispenserBlock
object DispenserBehaviorRegistry {
private val behaviors = mutableMapOf<Item, DispenseItemBehavior>()
fun register(items: List<Item>, behaviorProvider: (Item) -> DispenseItemBehavior) {
register(behaviorProvider, items = items)
}
fun register(vararg behaviorProviders: (Item) -> DispenseItemBehavior, items: List<Item>) {
for (item in items) {
val providedBehaviors = behaviorProviders.map { provider -> provider(item) }
val existingLocal = behaviors[item]
if (existingLocal is ChainedDispenseItemBehavior) {
providedBehaviors.forEach { existingLocal.add(it) }
continue
}
val currentRegistered = getCurrentRegisteredBehavior(item)
if (currentRegistered is ChainedDispenseItemBehavior) {
behaviors[item] = currentRegistered
providedBehaviors.forEach { currentRegistered.add(it) }
continue
}
val base = currentRegistered ?: DispenseItemBehavior.NOOP
val chained = ChainedDispenseItemBehavior(base)
providedBehaviors.forEach { chained.add(it) }
behaviors[item] = chained
DispenserBlock.registerBehavior(item, chained)
}
}
private fun getCurrentRegisteredBehavior(item: Item): DispenseItemBehavior? {
return try {
val map = DispenserBlockAccessor.getItemBehaviors()
map[item]
} catch (t: Throwable) {
DispenseItemBehavior.LOGGER.error("Failed to read existing dispenser behaviors via mixin accessor", t)
null
}
}
fun registerDispenserBehaviors() {
register(
{ SaccharineLogSlatheredBlock.createBehavior() },
items = listOf(
PotionContents.createItemStack(
Items.POTION,
Potions.WATER
).item
)
)
register(
{ SaccharineLogBlock.createBehavior() },
items = listOf(Items.HONEY_BOTTLE)
)
register(
{ item -> SaccharineLeafBlock.createBehavior(item) },
items = listOf(
Items.HONEY_BOTTLE,
PotionContents.createItemStack(
Items.POTION,
Potions.WATER
).item
)
)
}
}
@@ -507,9 +507,7 @@ class PokemonClientDelegate : PosableState(), PokemonSideDelegate {
override fun positionRider(passenger: Entity, positionUpdater: MoveFunction) {
val locatorName = getSeatLocator(passenger)
val locator = this.locatorStates[locatorName]
if (locator == null) return
val locator = this.locatorStates[locatorName] ?: return
val offset = locator.matrix.getTranslation(Vector3f())
.sub(
@@ -29,6 +29,7 @@ import com.cobblemon.mod.common.client.render.renderScaledGuiItemIcon
import com.cobblemon.mod.common.pokemon.Gender
import com.cobblemon.mod.common.util.cobblemonResource
import com.cobblemon.mod.common.util.lang
import com.cobblemon.mod.common.util.toAssetPath
import java.util.UUID
import net.minecraft.client.DeltaTracker
import net.minecraft.client.Minecraft
@@ -38,6 +39,7 @@ import net.minecraft.client.gui.components.toasts.AdvancementToast
import net.minecraft.client.gui.components.toasts.Toast
import net.minecraft.client.gui.screens.ChatScreen
import net.minecraft.client.gui.screens.Screen
import net.minecraft.resources.ResourceLocation
import net.minecraft.util.Mth
import kotlin.math.ceil
import kotlin.math.floor
@@ -467,7 +469,7 @@ class PartyOverlay : Gui(Minecraft.getInstance()) {
)
}
val ballIcon = cobblemonResource("textures/gui/ball/" + pokemon.caughtBall.name.path + ".png")
val ballIcon = pokemon.caughtBall.name.toAssetPath("textures/gui/ball/", ".png")
val ballHeight = 22
blitk(
matrixStack = matrices,
@@ -31,12 +31,14 @@ import com.cobblemon.mod.common.util.battleLang
import com.cobblemon.mod.common.util.cobblemonResource
import com.cobblemon.mod.common.util.lang
import com.cobblemon.mod.common.util.math.fromEulerXYZDegrees
import com.cobblemon.mod.common.util.toAssetPath
import net.minecraft.client.Minecraft
import net.minecraft.client.gui.GuiGraphics
import net.minecraft.client.gui.narration.NarratableEntry
import net.minecraft.client.gui.narration.NarrationElementOutput
import net.minecraft.client.resources.sounds.SimpleSoundInstance
import net.minecraft.client.sounds.SoundManager
import net.minecraft.resources.ResourceLocation
import org.joml.Quaternionf
import org.joml.Vector3f
@@ -231,7 +233,7 @@ class BattleSwitchPokemonSelection(
textureHeight = SELECT_HEIGHT * 2,
)
val ballIcon = cobblemonResource("textures/gui/ball/" + pokemon.caughtBall.name.path + ".png")
val ballIcon = pokemon.caughtBall.name.toAssetPath("textures/gui/ball/", ".png")
val ballHeight = 22
blitk(
matrixStack = matrixStack,
@@ -24,11 +24,13 @@ import com.cobblemon.mod.common.util.asIdentifierDefaultingNamespace
import com.cobblemon.mod.common.util.cobblemonResource
import com.cobblemon.mod.common.util.lang
import com.cobblemon.mod.common.util.math.fromEulerXYZDegrees
import com.cobblemon.mod.common.util.toAssetPath
import com.google.common.collect.Lists
import net.minecraft.client.gui.GuiGraphics
import net.minecraft.client.gui.components.Button
import net.minecraft.client.sounds.SoundManager
import net.minecraft.network.chat.Component
import net.minecraft.resources.ResourceLocation
import net.minecraft.util.FormattedCharSequence
import net.minecraft.world.item.ItemStack
import org.joml.Quaternionf
@@ -111,7 +113,7 @@ class PartySlotButton(
)
context.pose().popPose()
val ballIcon = cobblemonResource("textures/gui/ball/" + pokemon.pokeball!!.asIdentifierDefaultingNamespace().path + ".png")
val ballIcon = pokemon.pokeball!!.asIdentifierDefaultingNamespace().toAssetPath("textures/gui/ball/", ".png")
val ballHeight = 22
blitk(
matrixStack = matrices,
@@ -40,6 +40,7 @@ import com.cobblemon.mod.common.util.asTranslated
import com.cobblemon.mod.common.util.cobblemonResource
import com.cobblemon.mod.common.util.isInventoryKeyPressed
import com.cobblemon.mod.common.util.lang
import com.cobblemon.mod.common.util.toAssetPath
import com.mojang.blaze3d.platform.InputConstants
import net.minecraft.client.Minecraft
import net.minecraft.client.gui.GuiGraphics
@@ -463,7 +464,7 @@ class PCGUI(
)
// Poké Ball
val ballResource = cobblemonResource("textures/item/poke_balls/" + pokemon.caughtBall.name.path + ".png")
val ballResource = pokemon.caughtBall.name.toAssetPath("textures/item/poke_balls/", ".png")
blitk(
matrixStack = matrices,
texture = ballResource,
@@ -237,9 +237,11 @@ class StatsWidget(val pX: Int, val pY: Int) : SoundlessWidget(
blitk(matrixStack = matrices, texture = divider, x = pX + 51, y = pY + 10, height = 27.5, width = 1)
blitk(matrixStack = matrices, texture = divider, x = pX + 9, y = pY + 2, height = 6, width = 121)
val rideStyle = selectedBehaviour.value.key.path.toString().split("/").last().lowercase()
drawScaledText(
context = context,
text = lang("ui.ride_style.${selectedBehaviour.key.name.lowercase()}").bold(),
text = lang("ui.ride_style.${selectedBehaviour.key.toString().lowercase()}.${rideStyle}")
.append(" | ").append(lang("ui.ride_style.${selectedBehaviour.key.toString().lowercase()}")).bold(),
x = pX + 69.5,
y = pY + 3,
colour = 0x3A96B6,
@@ -45,6 +45,7 @@ import com.cobblemon.mod.common.pokemon.Pokemon
import com.cobblemon.mod.common.util.cobblemonResource
import com.cobblemon.mod.common.util.isInventoryKeyPressed
import com.cobblemon.mod.common.util.lang
import com.cobblemon.mod.common.util.toAssetPath
import com.mojang.blaze3d.platform.InputConstants
import net.minecraft.client.Minecraft
import net.minecraft.client.gui.GuiGraphics
@@ -558,7 +559,7 @@ class Summary private constructor(party: Collection<Pokemon?>, private val edita
}
// Poké Ball
val ballResource = cobblemonResource("textures/item/poke_balls/" + selectedPokemon.caughtBall.name.path + ".png")
val ballResource = selectedPokemon.caughtBall.name.toAssetPath("textures/item/poke_balls/", ".png")
blitk(
matrixStack = matrices,
texture = ballResource,
@@ -24,6 +24,7 @@ import com.cobblemon.mod.common.pokemon.Pokemon
import com.cobblemon.mod.common.util.cobblemonResource
import com.cobblemon.mod.common.util.lang
import com.cobblemon.mod.common.util.math.fromEulerXYZDegrees
import com.cobblemon.mod.common.util.toAssetPath
import net.minecraft.client.gui.GuiGraphics
import net.minecraft.network.chat.Component
import net.minecraft.resources.ResourceLocation
@@ -107,7 +108,7 @@ class PartySlotWidget(
)
}
val ballIcon = cobblemonResource("textures/gui/ball/" + slotPokemon.caughtBall.name.path + ".png")
val ballIcon = slotPokemon.caughtBall.name.toAssetPath("textures/gui/ball/", ".png")
val ballHeight = 22
blitk(
matrixStack = matrices,
@@ -19,11 +19,11 @@ import com.cobblemon.mod.common.client.render.drawScaledText
import com.cobblemon.mod.common.net.messages.server.RequestMoveSwapPacket
import com.cobblemon.mod.common.util.cobblemonResource
import com.cobblemon.mod.common.util.lang
import java.math.RoundingMode
import java.text.DecimalFormat
import net.minecraft.client.Minecraft
import net.minecraft.client.gui.GuiGraphics
import net.minecraft.network.chat.Component
import java.math.RoundingMode
import java.text.DecimalFormat
class MovesWidget(
pX: Int, pY: Int,
@@ -66,6 +66,7 @@ class StatWidget(
private const val MARKER_WIDTH = 8
private const val WIDTH = 134
private const val HEIGHT = 148
private const val RIDE_ICON_SIZE = 32
const val SCALE = 0.5F
private const val WHITE = 0x00FFFFFF
@@ -336,14 +337,16 @@ class StatWidget(
colour = pentagonColour
)
drawScaledText(
context = context,
font = CobblemonResources.DEFAULT_LARGE,
text = lang("ui.ride_style.${selectedBehaviour.key.name.lowercase()}").bold(),
x = x + (WIDTH / 2),
y = y + 66,
shadow = true,
centered = true
val rideStyle = selectedBehaviour.value.key.path.toString().split("/").last().lowercase()
val iconResource = cobblemonResource("textures/gui/summary/icon_ride_${selectedBehaviour.key.toString().lowercase()}_${rideStyle}.png")
blitk(
matrixStack = matrices,
texture = iconResource,
x= (x + 59) / SCALE,
y = (y + 62.5) / SCALE,
width = RIDE_ICON_SIZE,
height = RIDE_ICON_SIZE,
scale = SCALE
)
// Stat Labels
@@ -368,6 +371,16 @@ class StatWidget(
verticesOffset = pentagonVerticesOffset,
offsetY = 5.5
)
if (pMouseX >= (x + 59) && pMouseY >= (y + 62.5) && pMouseX <= ((x + 59) + (RIDE_ICON_SIZE * SCALE)) && pMouseY <= ((y + 62.5) + (RIDE_ICON_SIZE * SCALE))) {
context.renderTooltip(
Minecraft.getInstance().font,
lang("ui.ride_style.${selectedBehaviour.key.toString().lowercase()}.${rideStyle}")
.append(" | ").append(lang("ui.ride_style.${selectedBehaviour.key.toString().lowercase()}")),
pMouseX,
pMouseY
)
}
}
} else {
@@ -32,6 +32,7 @@ import com.cobblemon.mod.common.pokemon.Pokemon
import com.cobblemon.mod.common.util.asTranslated
import com.cobblemon.mod.common.util.cobblemonResource
import com.cobblemon.mod.common.util.lang
import com.cobblemon.mod.common.util.toAssetPath
import com.mojang.blaze3d.platform.InputConstants
import net.minecraft.client.Minecraft
import net.minecraft.client.gui.GuiGraphics
@@ -584,7 +585,7 @@ class TradeGUI(
// Poké Ball
val nameXOffset = if (isOpposing) 75 else 0
val ballResource = cobblemonResource("textures/item/poke_balls/" + pokemon.caughtBall.name.path + ".png")
val ballResource = pokemon.caughtBall.name.toAssetPath("textures/item/poke_balls/", ".png")
blitk(
matrixStack = context.pose(),
texture = ballResource,
@@ -16,10 +16,8 @@ object SetClientPlayerDataHandler : ClientNetworkPacketHandler<SetClientPlayerDa
override fun handle(packet: SetClientPlayerDataPacket, client: Minecraft) {
if (packet.isIncremental) {
packet.type.incrementalAfterDecodeAction.invoke(packet.playerData)
}
else {
} else {
packet.type.afterDecodeAction.invoke(packet.playerData)
}
}
}
@@ -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.net.data
import com.cobblemon.mod.common.api.interaction.PokemonInteractions
import com.cobblemon.mod.common.api.net.ClientNetworkPacketHandler
import com.cobblemon.mod.common.net.messages.client.data.PokemonInteractionsSyncPacket
import net.minecraft.client.Minecraft
object PokemonInteractionsSyncHandler : ClientNetworkPacketHandler<PokemonInteractionsSyncPacket> {
override fun handle(
packet: PokemonInteractionsSyncPacket,
client: Minecraft,
) {
PokemonInteractions.speciesInteractions.clear()
PokemonInteractions.speciesInteractions.addAll(packet.speciesInteractions)
PokemonInteractions.generalInteractions.clear()
PokemonInteractions.generalInteractions.addAll(packet.generalInteractions)
}
}
@@ -17,35 +17,33 @@ import net.minecraft.util.Mth
object ClientboundUpdateOrientationHandler : ClientNetworkPacketHandler<ClientboundUpdateOrientationPacket> {
override fun handle(packet: ClientboundUpdateOrientationPacket, client: Minecraft) {
client.executeIfPossible {
val level = client.level ?: return@executeIfPossible
val player = client.player ?: return@executeIfPossible
val vehicle = level.getEntity(packet.entityId)
val vehicleController = if (vehicle is OrientationControllable) vehicle.orientationController else return@executeIfPossible
val level = client.level ?: return
val player = client.player ?: return
val vehicle = level.getEntity(packet.entityId)
val vehicleController = if (vehicle is OrientationControllable) vehicle.orientationController else return
// If the client is also the driver of this entity then don't update it as the driver is the source
// of truth on vehicle orientation updates.
if (vehicle.controllingPassenger != player) {
packet.active?.let { shouldUseCustomOrientation ->
// If the client is also the driver of this entity then don't update it as the driver is the source
// of truth on vehicle orientation updates.
if (vehicle.controllingPassenger != player) {
packet.active?.let { shouldUseCustomOrientation ->
val playerIsPassenger = vehicle.passengers.contains(player)
val playerIsPassenger = vehicle.passengers.contains(player)
// If the player has just switched to riding a custom orientation ride then set their
// ride x and y rots local to the vehicle rots(if the controller wasn't active and will now be active)
// This ensures that on transition your camera stays in the same spot
if (!vehicleController.isActive() && shouldUseCustomOrientation && playerIsPassenger) {
// Set local to the vehicle x and yrot
val playerRotater = player as RidePassenger?
if (playerRotater != null) {
playerRotater.`cobblemon$setRideXRot`(Mth.wrapDegrees(player.getXRot() - vehicle.getXRot()))
playerRotater.`cobblemon$setRideYRot`(Mth.wrapDegrees(player.getYRot() - vehicle.getYRot()))
}
// If the player has just switched to riding a custom orientation ride then set their
// ride x and y rots local to the vehicle rots(if the controller wasn't active and will now be active)
// This ensures that on transition your camera stays in the same spot
if (!vehicleController.isActive() && shouldUseCustomOrientation && playerIsPassenger) {
// Set local to the vehicle x and yrot
val playerRotater = player as RidePassenger?
if (playerRotater != null) {
playerRotater.`cobblemon$setRideXRot`(Mth.wrapDegrees(player.getXRot() - vehicle.getXRot()))
playerRotater.`cobblemon$setRideYRot`(Mth.wrapDegrees(player.getYRot() - vehicle.getYRot()))
}
vehicle.orientationController.active = shouldUseCustomOrientation
}
vehicle.orientationController.updateOrientation { _ -> packet.orientation }
vehicle.orientationController.active = shouldUseCustomOrientation
}
vehicle.orientationController.updateOrientation { _ -> packet.orientation }
}
}
}
@@ -15,16 +15,14 @@ import net.minecraft.client.Minecraft
object ClientboundUpdateRidingStateHandler : ClientNetworkPacketHandler<ClientboundUpdateRidingStatePacket> {
override fun handle(packet: ClientboundUpdateRidingStatePacket, client: Minecraft) {
client.executeIfPossible {
val player = client.player ?: return@executeIfPossible
val entity = player.level().getEntity(packet.entity) ?: return@executeIfPossible
if (entity !is PokemonEntity) return@executeIfPossible
if (entity.controllingPassenger == player) return@executeIfPossible
val buffer = packet.data ?: return@executeIfPossible
if (entity.ridingController?.context?.settings?.key != packet.behaviour) {
entity.ridingController?.changeBehaviour(packet.behaviour)
}
entity.ridingController?.context?.state?.decode(buffer)
val player = client.player ?: return
val entity = player.level().getEntity(packet.entity) ?: return
if (entity !is PokemonEntity) return
if (entity.controllingPassenger == player) return
val buffer = packet.data ?: return
if (entity.ridingController?.context?.settings?.key != packet.behaviour) {
entity.ridingController?.changeBehaviour(packet.behaviour)
}
entity.ridingController?.context?.state?.decode(buffer)
}
}
@@ -15,15 +15,13 @@ import net.minecraft.client.player.RemotePlayer
object ClientboundUpdateDriverInputHandler : ClientNetworkPacketHandler<ClientboundUpdateDriverInputPacket> {
override fun handle(packet: ClientboundUpdateDriverInputPacket, client: Minecraft) {
client.executeIfPossible {
val level = client.level ?: return@executeIfPossible
val entity = level.getEntity(packet.entityId)
if (entity is RemotePlayer) {
entity.xxa = packet.driverInput.x
entity.zza = packet.driverInput.z
entity.jumping = packet.driverInput.y == 1.0f
entity.isShiftKeyDown = packet.driverInput.y == -1.0f
}
val level = client.level ?: return
val entity = level.getEntity(packet.entityId)
if (entity is RemotePlayer) {
entity.xxa = packet.driverInput.x
entity.zza = packet.driverInput.z
entity.jumping = packet.driverInput.y == 1.0f
entity.isShiftKeyDown = packet.driverInput.y == -1.0f
}
}
}
@@ -15,11 +15,9 @@ import net.minecraft.sounds.SoundEvent
internal object UnvalidatedPlaySoundS2CPacketHandler : ClientNetworkPacketHandler<UnvalidatedPlaySoundS2CPacket> {
override fun handle(packet: UnvalidatedPlaySoundS2CPacket, client: Minecraft) {
client.executeIfPossible {
// This prevents clients that might not have the required resources installed from getting spammed about missing sound
if (client.soundManager.getSoundEvent(packet.sound) != null) {
client.level?.playSound(client.player, packet.x, packet.y, packet.z, SoundEvent.createVariableRangeEvent(packet.sound), packet.category, packet.volume, packet.pitch)
}
// This prevents clients that might not have the required resources installed from getting spammed about missing sound
if (client.soundManager.getSoundEvent(packet.sound) != null) {
client.level?.playSound(client.player, packet.x, packet.y, packet.z, SoundEvent.createVariableRangeEvent(packet.sound), packet.category, packet.volume, packet.pitch)
}
}
}
@@ -15,6 +15,6 @@ import net.minecraft.client.Minecraft
object ToastPacketHandler : ClientNetworkPacketHandler<ToastPacket> {
override fun handle(packet: ToastPacket, client: Minecraft) {
client.executeIfPossible { ToastTracker.handle(packet, client) }
ToastTracker.handle(packet, client)
}
}
@@ -82,7 +82,6 @@ object MountedCameraRenderer {
var offset = Vec3(0.0, currEyeHeight - (driver.bbHeight / 2), 0.0)
var eyeOffset = Vec3(0.0, currEyeHeight - (driver.bbHeight / 2), 0.0)
val shouldFlip = !(vehicleController.active && vehicleController.orientation != null) // Do not flip the offset for 3rd person reverse unless we are using normal mc camera rotation.
val isFirstPerson = Minecraft.getInstance().options.cameraType == CameraType.FIRST_PERSON
eyeOffset = eyeOffset.add(getFirstPersonOffset(model, locatorName))
@@ -91,9 +90,9 @@ object MountedCameraRenderer {
if (isFirstPerson) {
getFirstPersonOffset(model, locatorName)
} else /* if (Cobblemon.config.thirdPersonViewBobbing) */ {
getThirdPersonOffset(thirdPersonReverse, model.thirdPersonCameraOffset, locatorName, shouldFlip)
getThirdPersonOffset(thirdPersonReverse, model.thirdPersonCameraOffset, locatorName)
} /* else {
getThirdPersonOffset(thirdPersonReverse, model.thirdPersonCameraOffsetNoViewBobbing, locatorName, shouldFlip)
getThirdPersonOffset(thirdPersonReverse, model.thirdPersonCameraOffsetNoViewBobbing, locatorName)
} */
)
@@ -325,19 +324,20 @@ object MountedCameraRenderer {
thirdPersonReverse: Boolean,
cameraOffsets: Map<String, Vec3>,
locatorName: String,
shouldFlip: Boolean = true
): Vec3 {
val offset = if (thirdPersonReverse && cameraOffsets.containsKey(locatorName + "_reverse")) {
cameraOffsets[locatorName + "_reverse"]!!
} else if (thirdPersonReverse && cameraOffsets.containsKey("seat_default_reverse")) {
cameraOffsets[locatorName + "seat_default_reverse"]!!
} else if (cameraOffsets.containsKey(locatorName)) {
cameraOffsets[locatorName]!!
} else if (cameraOffsets.containsKey("seat_default")) {
cameraOffsets["seat_default"]!!
} else {
Vec3.ZERO
}
// Don't need to account for this since orientation is derived from camera rotation and that z is already flipped.
// Flip only when not on a rollable.
return if (thirdPersonReverse && shouldFlip) offset.multiply(1.0, 1.0, -1.0) else offset
return if (thirdPersonReverse) offset.multiply(1.0, 1.0, -1.0) else offset
}
private fun getFirstPersonOffset(model: PosableModel, locatorName: String): Vec3 {
@@ -345,6 +345,8 @@ object MountedCameraRenderer {
return if (cameraOffsets.containsKey(locatorName)) {
cameraOffsets[locatorName]!!
} else if (cameraOffsets.containsKey("seat_default")) {
cameraOffsets["seat_default"]!!
} else {
Vec3.ZERO
}
@@ -568,6 +568,9 @@ open class PosableModel(@Transient override val rootPart: Bone) : ModelFrame {
// Is there any reason why we should actually change the pose?
if (entity != null && (poseName == null || currentPose == null || !currentPose.isSuitable(state) || entityPoseType !in currentPose.poseTypes)) {
val desirablePose = getFirstSuitablePose(state, entityPoseType)
if (desirablePose == currentPose) {
return currentPose
}
// If this if succeeds then it just no longer fits this pose
if (currentPose != null) {
// Don't apply pose correction until the current primary animation is complete.
@@ -1,60 +0,0 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen3
import com.cobblemon.mod.common.client.render.models.blockbench.PosableState
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
import com.cobblemon.mod.common.client.render.models.blockbench.pose.CobblemonPose
import com.cobblemon.mod.common.entity.PoseType
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class ChimechoModel(root: ModelPart) : PokemonPosableModel(root) {
override val rootPart = root.registerChildWithAllChildren("chimecho")
override var portraitScale = 3.6F
override var portraitTranslation = Vec3(-0.1, -0.4, 0.0)
override var profileScale = 1.0F
override var profileTranslation = Vec3(0.0, 0.3, 0.0)
lateinit var sleep: CobblemonPose
lateinit var hover: CobblemonPose
lateinit var fly: CobblemonPose
override val cryAnimation = CryProvider { bedrockStateful("chimecho", "cry") }
override fun registerPoses() {
val blink = quirk { bedrockStateful("chimecho", "blink") }
sleep = registerPose(
poseType = PoseType.SLEEP,
animations = arrayOf(bedrock("chimecho", "sleep"))
)
hover = registerPose(
poseName = "hover",
poseTypes = PoseType.STATIONARY_POSES + PoseType.UI_POSES,
quirks = arrayOf(blink),
animations = arrayOf(
bedrock("chimecho", "air_idle")
)
)
fly = registerPose(
poseName = "flying",
poseTypes = PoseType.MOVING_POSES,
quirks = arrayOf(blink),
animations = arrayOf(
bedrock("chimecho", "air_fly")
)
)
}
override fun getFaintAnimation(state: PosableState) = if (state.isPosedIn(hover, fly, sleep)) bedrockStateful("chimecho", "faint") else null
}
@@ -1,89 +0,0 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen4
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
import com.cobblemon.mod.common.client.render.models.blockbench.pose.CobblemonPose
import com.cobblemon.mod.common.entity.PoseType
import com.cobblemon.mod.common.entity.PoseType.Companion.MOVING_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.SHOULDER_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.STATIONARY_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.UI_POSES
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class ChinglingModel(root: ModelPart) : PokemonPosableModel(root) {
override val rootPart = root.registerChildWithAllChildren("chingling")
override var portraitScale = 2.8F
override var portraitTranslation = Vec3(0.0, -2.4, 0.0)
override var profileScale = 1.3F
override var profileTranslation = Vec3(0.0, -0.2, 0.0)
lateinit var sleep: CobblemonPose
lateinit var standing: CobblemonPose
lateinit var walk: CobblemonPose
lateinit var hover: CobblemonPose
lateinit var fly: CobblemonPose
override val cryAnimation = CryProvider { bedrockStateful("chingling", "cry") }
override fun registerPoses() {
val blink = quirk { bedrockStateful("chingling", "blink") }
val sleepquirk = quirk { bedrockStateful("chingling", "sleep_quirk") }
sleep = registerPose(
poseType = PoseType.SLEEP,
quirks = arrayOf(sleepquirk),
animations = arrayOf(bedrock("chingling", "sleep"))
)
standing = registerPose(
poseName = "standing",
poseTypes = STATIONARY_POSES - PoseType.HOVER + UI_POSES + SHOULDER_POSES,
quirks = arrayOf(blink),
animations = arrayOf(
bedrock("chingling", "ground_idle")
)
)
walk = registerPose(
poseName = "walk",
poseTypes = MOVING_POSES - PoseType.FLY,
quirks = arrayOf(blink),
animations = arrayOf(
bedrock("chingling", "ground_walk")
)
)
hover = registerPose(
poseName = "hover",
poseType = PoseType.HOVER,
quirks = arrayOf(blink),
animations = arrayOf(
bedrock("chingling", "air_idle")
)
)
fly = registerPose(
poseName = "fly",
poseType = PoseType.FLY,
quirks = arrayOf(blink),
animations = arrayOf(
bedrock("chingling", "air_fly")
)
)
}
//override fun getFaintAnimation(
// pokemonEntity: PokemonEntity,
// state: PosableState<PokemonEntity>
//) = if (state.isPosedIn(standing, walk, hover, fly, sleep )) bedrockStateful("chingling", "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.frame.HeadedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
import com.cobblemon.mod.common.entity.PoseType
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class CottoneeModel (root: ModelPart) : PokemonPosableModel(root), HeadedFrame{
override val rootPart = root.registerChildWithAllChildren("cottonee")
override val head = getPart("body")
override var portraitScale = 2.0F
override var portraitTranslation = Vec3(-0.1, -1.5, 0.0)
override var profileScale = 0.9F
override var profileTranslation = Vec3(0.0, 0.35, 0.0)
lateinit var standing: Pose
lateinit var walk: Pose
override val cryAnimation = CryProvider { bedrockStateful("cottonee", "cry") }
override fun registerPoses() {
val blink = quirk { bedrockStateful("cottonee", "blink") }
standing = registerPose(
poseName = "standing",
poseTypes = PoseType.STATIONARY_POSES + PoseType.UI_POSES,
quirks = arrayOf(blink),
animations = arrayOf(
singleBoneLook(disableY = true)
//bedrock("cottonee", "ground_idle")
)
)
walk = registerPose(
poseName = "walk",
poseTypes = PoseType.MOVING_POSES,
quirks = arrayOf(blink),
animations = arrayOf(
singleBoneLook(disableY = true)
//bedrock("cottonee", "ground_walk")
)
)
}
// override fun getFaintAnimation(
// pokemonEntity: PokemonEntity,
// state: PosableState<PokemonEntity>
// ) = if (state.isPosedIn(standing, walk)) bedrockStateful("cottonee", "faint") else null
}
@@ -1,71 +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.pokemon.PokemonPosableModel
import com.cobblemon.mod.common.client.render.models.blockbench.pose.CobblemonPose
import com.cobblemon.mod.common.entity.PoseType
import com.cobblemon.mod.common.util.isBattling
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class FerroseedModel (root: ModelPart) : PokemonPosableModel(root) {
override val rootPart = root.registerChildWithAllChildren("ferroseed")
override var portraitScale = 1.8F
override var portraitTranslation = Vec3(-0.15, -0.74, 0.0)
override var profileScale = 0.66F
override var profileTranslation = Vec3(0.0, 0.58, 0.0)
lateinit var standing: CobblemonPose
lateinit var walk: CobblemonPose
lateinit var battleIdle: CobblemonPose
lateinit var sleep: CobblemonPose
override fun registerPoses() {
val blink = quirk { bedrockStateful("ferroseed", "blink") }
sleep = registerPose(
poseName = "sleep",
poseType = PoseType.SLEEP,
animations = arrayOf(
bedrock("ferroseed", "sleep")
)
)
standing = registerPose(
poseName = "standing",
poseTypes = PoseType.STATIONARY_POSES + PoseType.UI_POSES,
condition = { !it.isBattling },
quirks = arrayOf(blink),
animations = arrayOf(
bedrock("ferroseed", "ground_idle")
)
)
walk = registerPose(
poseName = "walk",
poseTypes = PoseType.MOVING_POSES,
quirks = arrayOf(blink),
animations = arrayOf(
bedrock("ferroseed", "ground_walk"),
)
)
battleIdle = registerPose(
poseName = "battle_idle",
poseTypes = PoseType.STATIONARY_POSES,
condition = { it.isBattling },
quirks = arrayOf(blink),
animations = arrayOf(
bedrock("ferroseed", "battle_idle")
)
)
}
}
@@ -1,71 +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.pokemon.PokemonPosableModel
import com.cobblemon.mod.common.client.render.models.blockbench.pose.CobblemonPose
import com.cobblemon.mod.common.entity.PoseType
import com.cobblemon.mod.common.util.isBattling
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class FerrothornModel(root: ModelPart) : PokemonPosableModel(root) {
override val rootPart = root.registerChildWithAllChildren("ferrothorn")
override var portraitScale = 1.07F
override var portraitTranslation = Vec3(-0.41, 0.55, 0.0)
override var profileScale = 0.39F
override var profileTranslation = Vec3(-0.08, 0.9, -6.0)
lateinit var standing: CobblemonPose
lateinit var walk: CobblemonPose
lateinit var battleIdle: CobblemonPose
lateinit var sleep: CobblemonPose
override fun registerPoses() {
val blink = quirk { bedrockStateful("ferrothorn", "blink") }
sleep = registerPose(
poseName = "sleep",
poseType = PoseType.SLEEP,
animations = arrayOf(
bedrock("ferrothorn", "sleep")
)
)
standing = registerPose(
poseName = "standing",
poseTypes = PoseType.STATIONARY_POSES + PoseType.UI_POSES,
condition = { !it.isBattling },
quirks = arrayOf(blink),
animations = arrayOf(
bedrock("ferrothorn", "ground_idle")
)
)
walk = registerPose(
poseName = "walk",
poseTypes = PoseType.MOVING_POSES,
quirks = arrayOf(blink),
animations = arrayOf(
bedrock("ferrothorn", "ground_walk"),
)
)
battleIdle = registerPose(
poseName = "battle_idle",
poseTypes = PoseType.STATIONARY_POSES,
condition = { it.isBattling },
quirks = arrayOf(blink),
animations = arrayOf(
bedrock("ferrothorn", "battle_idle")
)
)
}
}
@@ -1,73 +0,0 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen5
import com.cobblemon.mod.common.client.render.models.blockbench.animation.BimanualSwingAnimation
import com.cobblemon.mod.common.client.render.models.blockbench.animation.BipedWalkAnimation
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BimanualFrame
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BipedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
import com.cobblemon.mod.common.entity.PoseType
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class WhimsicottModel (root: ModelPart) : PokemonPosableModel(root), HeadedFrame, BipedFrame, BimanualFrame {
override val rootPart = root.registerChildWithAllChildren("whimsicott")
override val head = getPart("head")
override val leftArm = getPart("arm_left")
override val rightArm = getPart("arm_right")
override val leftLeg = getPart("leg_left")
override val rightLeg = getPart("leg_right")
override var portraitScale = 2.0F
override var portraitTranslation = Vec3(0.0, -0.6, 0.0)
override var profileScale = 0.8F
override var profileTranslation = Vec3(0.0, 0.55, 0.0)
lateinit var standing: Pose
lateinit var walk: Pose
override val cryAnimation = CryProvider { bedrockStateful("whimsicott", "cry") }
override fun registerPoses() {
val blink = quirk { bedrockStateful("whimsicott", "blink") }
standing = registerPose(
poseName = "standing",
poseTypes = PoseType.STATIONARY_POSES + PoseType.UI_POSES,
quirks = arrayOf(blink),
animations = arrayOf(
singleBoneLook(disableX = true),
bedrock("whimsicott", "ground_idle")
)
)
walk = registerPose(
poseName = "walk",
poseTypes = PoseType.MOVING_POSES,
quirks = arrayOf(blink),
animations = arrayOf(
singleBoneLook(disableX = true),
bedrock("whimsicott", "ground_idle"),
BipedWalkAnimation(this, periodMultiplier = 0.6F, amplitudeMultiplier = 0.9F),
BimanualSwingAnimation(this, swingPeriodMultiplier = 0.6F, amplitudeMultiplier = 0.9F)
//bedrock("whimsicott", "ground_walk")
)
)
}
// override fun getFaintAnimation(
// pokemonEntity: PokemonEntity,
// state: PosableState<PokemonEntity>
// ) = if (state.isPosedIn(standing, walk)) bedrockStateful("whimsicott", "faint") else null
}
@@ -1,100 +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.gen8
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
import com.cobblemon.mod.common.client.render.models.blockbench.pose.CobblemonPose
import com.cobblemon.mod.common.entity.PoseType
import com.cobblemon.mod.common.util.isBattling
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class FalinksModel (root: ModelPart) : PokemonPosableModel(root){
override val rootPart = root.registerChildWithAllChildren("falinks")
override var portraitScale = 1.9F
override var portraitTranslation = Vec3(-1.0, -1.2, 0.0)
override var profileScale = 0.5F
override var profileTranslation = Vec3(0.1, 0.9, 0.0)
lateinit var standing: CobblemonPose
lateinit var battlestanding: CobblemonPose
lateinit var battlestanding2: CobblemonPose
lateinit var walk: CobblemonPose
lateinit var uipose: CobblemonPose
lateinit var sleep: CobblemonPose
override fun registerPoses() {
val blink = quirk { bedrockStateful("falinks", "blink") }
val blink2 = quirk { bedrockStateful("falinks", "blink2") }
val blink3 = quirk { bedrockStateful("falinks", "blink3") }
val blink4 = quirk { bedrockStateful("falinks", "blink4") }
val blink5 = quirk { bedrockStateful("falinks", "blink5") }
val blink6 = quirk { bedrockStateful("falinks", "blink6") }
sleep = registerPose(
poseName = "sleep",
poseType = PoseType.SLEEP,
animations = arrayOf(
bedrock("falinks", "sleep")
)
)
standing = registerPose(
poseName = "standing",
poseTypes = PoseType.STATIONARY_POSES,
quirks = arrayOf(blink, blink2, blink3, blink4, blink5, blink6),
condition = { !it.isBattling },
animations = arrayOf(
bedrock("falinks", "ground_idle")
)
)
battlestanding2 = registerPose(
poseName = "battlestanding2",
poseTypes = PoseType.STATIONARY_POSES,
quirks = arrayOf(blink, blink2, blink3, blink4, blink5, blink6),
condition = { it.isBattling && ((it.getEntity()?.uuid?.mostSignificantBits ?: 2) % 2).toInt() == 0 },
animations = arrayOf(
bedrock("falinks", "battle_idle2")
)
)
battlestanding = registerPose(
poseName = "battlestanding",
poseTypes = PoseType.STATIONARY_POSES,
quirks = arrayOf(blink, blink2, blink3, blink4, blink5, blink6),
condition = { it.isBattling },
animations = arrayOf(
bedrock("falinks", "battle_idle")
)
)
walk = registerPose(
poseName = "walk",
poseTypes = PoseType.MOVING_POSES,
quirks = arrayOf(blink, blink2, blink3, blink4, blink5, blink6),
condition = { !it.isBattling },
animations = arrayOf(
bedrock("falinks", "ground_walk")
)
)
uipose = registerPose(
poseName = "uipose",
poseTypes = PoseType.UI_POSES,
quirks = arrayOf(blink, blink2, blink3, blink4, blink5, blink6),
animations = arrayOf(
bedrock("falinks", "summary_idle")
)
)
}
}
@@ -408,8 +408,6 @@ object VaryingModelRepository {
inbuilt("tandemaus", ::TandemausModel)
inbuilt("maushold", ::MausholdModel)
inbuilt("mausholdfour", ::MausholdfourModel)
inbuilt("chingling", ::ChinglingModel)
inbuilt("chimecho", ::ChimechoModel)
inbuilt("fidough", ::FidoughModel)
inbuilt("dachsbun", ::DachsbunModel)
inbuilt("chatot", ::ChatotModel)
@@ -424,7 +422,6 @@ object VaryingModelRepository {
inbuilt("surskit", ::SurskitModel)
inbuilt("masquerain", ::MasquerainModel)
inbuilt("carnivine", ::CarnivineModel)
inbuilt("falinks", ::FalinksModel)
inbuilt("stufful", ::StuffulModel)
inbuilt("bewear", ::BewearModel)
inbuilt("scatterbug", ::ScatterbugModel)
@@ -495,8 +492,6 @@ object VaryingModelRepository {
inbuilt("zigzagoon_galarian", :: ZigzagoonGalarianModel)
inbuilt("linoone_galarian", :: LinooneGalarianModel)
inbuilt("obstagoon", :: ObstagoonModel)
inbuilt("cottonee", :: CottoneeModel)
inbuilt("whimsicott", :: WhimsicottModel)
inbuilt("wishiwashi_solo", :: WishiwashiSoloModel)
inbuilt("wishiwashi_schooling", :: WishiwashiSchoolingModel)
inbuilt("meowth_alolan", ::MeowthAlolanModel)
@@ -589,8 +584,6 @@ object VaryingModelRepository {
inbuilt("makuhita", ::MakuhitaModel)
inbuilt("hariyama", ::HariyamaModel)
inbuilt("alomomola", ::AlomomolaModel)
inbuilt("ferroseed", ::FerroseedModel)
inbuilt("ferrothorn", ::FerrothornModel)
inbuilt("carbink", ::CarbinkModel)
inbuilt("goomy", ::GoomyModel)
inbuilt("goomy_hisui_bias", ::GoomyHisuiBiasModel)
@@ -8,11 +8,11 @@
package com.cobblemon.mod.common.command
import com.cobblemon.mod.common.Cobblemon
import com.cobblemon.mod.common.api.permission.CobblemonPermissions
import com.cobblemon.mod.common.api.storage.pc.PCPosition
import com.cobblemon.mod.common.api.storage.pc.POKEMON_PER_BOX
import com.cobblemon.mod.common.api.text.red
import com.cobblemon.mod.common.api.text.text
import com.cobblemon.mod.common.util.*
import com.mojang.brigadier.Command
import com.mojang.brigadier.CommandDispatcher
@@ -35,7 +35,7 @@ object PcTakeCommand {
.then(
Commands.argument("box", IntegerArgumentType.integer(1))
.then(
Commands.argument("slot", IntegerArgumentType.integer(1, 30))
Commands.argument("slot", IntegerArgumentType.integer(1, POKEMON_PER_BOX))
.executes(::execute)
)
)
@@ -60,8 +60,8 @@ object PcTakeCommand {
val slot = IntegerArgumentType.getInteger(context, "slot")
val pc = target.pc()
if (box > POKEMON_PER_BOX) {
context.source.sendFailure(commandLang("pctake.too_many_boxes", POKEMON_PER_BOX))
if (box > pc.boxes.size) {
context.source.sendFailure(commandLang("pctake.too_many_boxes", pc.boxes.size))
return 0
}
@@ -12,6 +12,7 @@ import com.cobblemon.mod.common.api.battles.model.actor.AIBattleActor
import com.cobblemon.mod.common.api.battles.model.actor.ActorType
import com.cobblemon.mod.common.api.battles.model.actor.BattleActor
import com.cobblemon.mod.common.api.battles.model.actor.EntityBackedBattleActor
import com.cobblemon.mod.common.api.battles.model.ai.BattleAI
import com.cobblemon.mod.common.api.net.NetworkPacket
import com.cobblemon.mod.common.api.storage.party.PartyStore
import com.cobblemon.mod.common.battles.ai.StrongBattleAI
@@ -23,14 +24,15 @@ import com.cobblemon.mod.common.util.effectiveName
import com.cobblemon.mod.common.util.update
import java.util.concurrent.CompletableFuture
class NPCBattleActor(
open class NPCBattleActor(
val npc: NPCEntity,
pokemonList: List<BattlePokemon>,
val skill: Int
val skill: Int,
artificialDecider: BattleAI = StrongBattleAI(skill),
) : AIBattleActor(
gameId = npc.uuid,
pokemonList = pokemonList.let { if (npc.npc.randomizePartyOrder) it.shuffled() else it },
battleAI = StrongBattleAI(skill)
battleAI = artificialDecider
), EntityBackedBattleActor<NPCEntity> {
override val entity = npc
override val type = ActorType.NPC
@@ -59,6 +59,7 @@ class AprijuiceItem(val type: Apricorn): CobblemonItem(Properties().stacksTo(16)
val prefixKey = when {
hasBoosts && quality == CookingQuality.HIGH -> "item.cobblemon.aprijuice.prefix.delicious"
hasBoosts && quality == CookingQuality.MEDIUM -> "item.cobblemon.aprijuice.prefix.tasty"
hasBoosts && quality == CookingQuality.LOW -> "item.cobblemon.aprijuice.prefix.plain"
!hasBoosts -> "item.cobblemon.aprijuice.prefix.plain"
else -> null
}
@@ -20,11 +20,12 @@ class BerryRegistrySyncPacket(berries: Collection<Berry>) : DataRegistrySyncPack
}
override val id = ID
override fun encodeEntry(buffer: RegistryFriendlyByteBuf, entry: Berry) {
entry.encode(buffer)
}
override fun decodeEntry(buffer: RegistryFriendlyByteBuf): Berry? = Berry.decode(buffer)
override fun decodeEntry(buffer: RegistryFriendlyByteBuf): Berry = Berry.decode(buffer)
override fun synchronizeDecoded(entries: Collection<Berry>) {
Berries.reload(entries.associateBy { it.identifier })
@@ -9,40 +9,30 @@
package com.cobblemon.mod.common.net.messages.client.data
import com.cobblemon.mod.common.api.interaction.PokemonInteractionSet
import com.cobblemon.mod.common.api.net.NetworkPacket
import com.cobblemon.mod.common.api.interaction.PokemonInteractions
import com.cobblemon.mod.common.util.cobblemonResource
import net.minecraft.network.RegistryFriendlyByteBuf
class PokemonInteractionsSyncPacket(
val speciesInteractions: List<PokemonInteractionSet>,
val generalInteractions: List<PokemonInteractionSet>,
) : NetworkPacket<PokemonInteractionsSyncPacket> {
entries: Collection<PokemonInteractionSet>,
) : DataRegistrySyncPacket<PokemonInteractionSet, PokemonInteractionsSyncPacket>(entries) {
override val id = ID
override fun encode(buffer: RegistryFriendlyByteBuf) {
buffer.writeCollection(speciesInteractions) { it, speciesInteraction ->
speciesInteraction.encode(it)
}
buffer.writeCollection(generalInteractions) { it, generalInteraction ->
generalInteraction.encode(it)
}
override fun encodeEntry(buffer: RegistryFriendlyByteBuf, entry: PokemonInteractionSet) {
entry.encode(buffer)
}
override fun decodeEntry(buffer: RegistryFriendlyByteBuf): PokemonInteractionSet {
return PokemonInteractionSet.decode(buffer)
}
override fun synchronizeDecoded(entries: Collection<PokemonInteractionSet>) {
PokemonInteractions.interactions.clear()
PokemonInteractions.interactions.addAll(entries)
}
companion object {
val ID = cobblemonResource("pokemon_interactions_sync")
fun decode(buffer: RegistryFriendlyByteBuf): PokemonInteractionsSyncPacket {
val speciesInteractions = buffer.readList { it ->
PokemonInteractionSet.decode(it)
}
val generalInteractions = buffer.readList { it ->
PokemonInteractionSet.decode(it)
}
return PokemonInteractionsSyncPacket(
speciesInteractions,
generalInteractions,
)
}
fun decode(buffer: RegistryFriendlyByteBuf): PokemonInteractionsSyncPacket = PokemonInteractionsSyncPacket(emptyList()).apply { decodeBuffer(buffer) }
}
}
@@ -31,29 +31,27 @@ abstract class SpawnExtraDataEntityPacket<T: NetworkPacket<T>, E : Entity>(var v
abstract fun checkType(entity: Entity): Boolean
fun spawnAndApply(client: Minecraft) {
client.execute {
val player = client.player ?: return@execute
val world = player.level() as? ClientLevel ?: return@execute
// This is a copy pasta of ClientPlayNetworkHandler#onEntitySpawn
// This exists due to us needing to do everything it does except spawn the entity in the world.
// We invoke applyData then we add the entity to the world.
PacketUtils.ensureRunningOnSameThread(this.vanillaSpawnPacket, player.connection, client)
val entityType = this.vanillaSpawnPacket.type
val entity = entityType.create(world) ?: return@execute
entity.recreateFromPacket(this.vanillaSpawnPacket)
entity.deltaMovement = Vec3(
this.vanillaSpawnPacket.xa,
this.vanillaSpawnPacket.ya,
this.vanillaSpawnPacket.za
)
// Cobblemon start
if (this.checkType(entity)) {
this.applyData(entity as E, world)
}
// Cobblemon end
world.addEntity(entity)
(player.connection as ClientPlayNetworkHandlerInvoker).callPlaySpawnSound(entity)
val player = client.player ?: return
val world = player.level() as? ClientLevel ?: return
// This is a copy pasta of ClientPlayNetworkHandler#onEntitySpawn
// This exists due to us needing to do everything it does except spawn the entity in the world.
// We invoke applyData then we add the entity to the world.
PacketUtils.ensureRunningOnSameThread(this.vanillaSpawnPacket, player.connection, client)
val entityType = this.vanillaSpawnPacket.type
val entity = entityType.create(world) ?: return
entity.recreateFromPacket(this.vanillaSpawnPacket)
entity.deltaMovement = Vec3(
this.vanillaSpawnPacket.xa,
this.vanillaSpawnPacket.ya,
this.vanillaSpawnPacket.za
)
// Cobblemon start
if (this.checkType(entity)) {
this.applyData(entity as E, world)
}
// Cobblemon end
world.addEntity(entity)
(player.connection as ClientPlayNetworkHandlerInvoker).callPlaySpawnSound(entity)
}
companion object {
@@ -18,14 +18,22 @@ import com.cobblemon.mod.common.entity.PlatformType
import com.cobblemon.mod.common.entity.PoseType
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
import com.cobblemon.mod.common.pokemon.Gender
import com.cobblemon.mod.common.util.*
import com.cobblemon.mod.common.util.cobblemonResource
import com.cobblemon.mod.common.util.readEnumConstant
import com.cobblemon.mod.common.util.readIdentifier
import com.cobblemon.mod.common.util.readString
import com.cobblemon.mod.common.util.readText
import com.cobblemon.mod.common.util.writeEnumConstant
import com.cobblemon.mod.common.util.writeIdentifier
import com.cobblemon.mod.common.util.writeString
import com.cobblemon.mod.common.util.writeText
import java.util.UUID
import net.minecraft.client.multiplayer.ClientLevel
import net.minecraft.network.RegistryFriendlyByteBuf
import net.minecraft.network.chat.MutableComponent
import net.minecraft.network.protocol.game.ClientboundAddEntityPacket
import net.minecraft.resources.ResourceLocation
import net.minecraft.world.entity.Entity
import java.util.*
class SpawnPokemonPacket(
var ownerId: UUID?,
@@ -51,7 +59,6 @@ class SpawnPokemonPacket(
var spawnYaw: Float,
var friendship: Int,
var freezeFrame: Float,
var passengers: IntArray,
var tickSpawned: Int,
var rideBoosts: Map<RidingStat, Float>,
var rideStamina: Float,
@@ -85,7 +92,6 @@ class SpawnPokemonPacket(
entity.entityData.get(PokemonEntity.SPAWN_DIRECTION),
entity.entityData.get(PokemonEntity.FRIENDSHIP),
entity.entityData.get(PokemonEntity.FREEZE_FRAME),
entity.passengers.map { it.id }.toIntArray(),
entity.tickCount,
entity.entityData.get(PokemonEntity.RIDE_BOOSTS),
entity.entityData.get(PokemonEntity.RIDE_STAMINA),
@@ -117,7 +123,6 @@ class SpawnPokemonPacket(
buffer.writeFloat(this.spawnYaw)
buffer.writeInt(this.friendship)
buffer.writeFloat(this.freezeFrame)
buffer.writeVarIntArray(this.passengers)
buffer.writeInt(this.tickSpawned)
buffer.writeMap(
rideBoosts,
@@ -173,11 +178,6 @@ class SpawnPokemonPacket(
entity.entityData.set(PokemonEntity.SCALE_MODIFIER, scaleModifier)
entity.isSilent = silent
entity.ejectPassengers()
passengers.forEach {
val passenger = level.getEntity(it) ?: return@forEach
passenger.startRiding(entity)
}
entity.tickSpawned = this.tickSpawned
entity.delegate.updateAge(this.tickSpawned)
}
@@ -210,7 +210,6 @@ class SpawnPokemonPacket(
val spawnAngle = buffer.readFloat()
val friendship = buffer.readInt()
val freezeFrame = buffer.readFloat()
val passengers = buffer.readVarIntArray()
val tickSpawned = buffer.readInt()
val rideBoosts = buffer.readMap(
{ buffer.readEnumConstant(RidingStat::class.java) },
@@ -244,7 +243,6 @@ class SpawnPokemonPacket(
spawnAngle,
friendship,
freezeFrame,
passengers,
tickSpawned,
rideBoosts,
rideStamina,
@@ -67,6 +67,7 @@ object CobblemonRequirementAdapter : RequirementAdapter {
this.registerType(PropertyRangeRequirement.ADAPTER_VARIANT, PropertyRangeRequirement::class)
this.registerType(AdvancementRequirement.ADAPTER_VARIANT, AdvancementRequirement::class)
this.registerType(OwnerHoldsItemRequirement.ADAPTER_VARIANT, OwnerHoldsItemRequirement::class)
this.registerType(ChanceRequirement.ADAPTER_VARIANT, ChanceRequirement::class)
}
val gson: Gson by lazy {
@@ -0,0 +1,37 @@
/*
* 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.molang.ExpressionLike
import com.cobblemon.mod.common.api.pokemon.requirement.Requirement
import com.cobblemon.mod.common.pokemon.Pokemon
import com.cobblemon.mod.common.util.asExpressionLike
import com.cobblemon.mod.common.util.genericRuntime
import com.cobblemon.mod.common.util.resolveFloat
import kotlin.random.Random
/**
* A requirement that will only pass the check if some random chance is satisfied.
*
* @author Hiroku
* @since January 30th, 2026
*/
class ChanceRequirement : Requirement {
companion object {
const val ADAPTER_VARIANT = "chance"
}
val chance: ExpressionLike = "1".asExpressionLike()
override fun check(pokemon: Pokemon): Boolean {
genericRuntime.environment.query.addFunction("pokemon") { pokemon.struct }
val chance = genericRuntime.resolveFloat(chance)
return Random.nextFloat() < chance
}
}
@@ -36,6 +36,11 @@ fun String.asIdentifierDefaultingNamespace(namespace: String = Cobblemon.MODID):
return if (id.contains(":")) ResourceLocation.fromNamespaceAndPath(id.substringBefore(":"), id.substringAfter(":")) else ResourceLocation.fromNamespaceAndPath(namespace, id)
}
fun ResourceLocation.toAssetPath(prefix: String = "", suffix: String = ""): ResourceLocation {
return ResourceLocation.fromNamespaceAndPath(this.namespace, "$prefix$path$suffix")
}
/**
* Attempts to parse an [ResourceLocation] from the [StringReader].
* Unlike [ResourceLocation.fromCommandInput] this will default the namespace to the given [namespace] if non-present.
@@ -271,6 +271,119 @@
}
}
},
"animation.mantine.ride_jump": {
"loop": true,
"bones": {
"torso": {
"rotation": ["0+q.r.velocity_y(0)*-30+math.sin(q.anim_time*90*16)*1", 0, 0],
"position": [0, "0+math.sin(q.anim_time*90*16-90)*0.1", 0]
},
"antenna_right": {
"rotation": ["-10+q.r.velocity_y(0)*20+math.sin(q.anim_time*90*16-90)*3", 15, -12.5]
},
"antenna_right2": {
"rotation": ["0+math.sin(q.anim_time*90*16-150)*3", 0, 17.5]
},
"antenna_right3": {
"rotation": ["0+math.sin(q.anim_time*90*16-210)*8", 0, 10]
},
"antenna_left": {
"rotation": ["-10+q.r.velocity_y(0)*20+math.sin(q.anim_time*90*16-90)*3", -15, 12.5]
},
"antenna_left2": {
"rotation": ["0+math.sin(q.anim_time*90*16-150)*3", 0, -17.5]
},
"antenna_left3": {
"rotation": ["0+math.sin(q.anim_time*90*16-210)*8", 0, -10]
},
"wing_right": {
"rotation": [0, 0, "-2.5+q.r.velocity_y(0)*-20+math.sin(q.anim_time*90*16-90)*-1"]
},
"wing_right2": {
"rotation": [0, 0, "-7.5+q.r.velocity_y(0)*-10+math.sin(q.anim_time*90*16-120)*-1"]
},
"wing_right3": {
"rotation": [0, 0, "-5+q.r.velocity_y(0)*-5+math.sin(q.anim_time*90*16-180)*-1"]
},
"wing_right4": {
"rotation": [0, 0, "5+q.r.velocity_y(0)*-5+math.sin(q.anim_time*90*16-250)*-3"]
},
"wing_left": {
"rotation": [0, 0, "2.5+q.r.velocity_y(0)*20+math.sin(q.anim_time*90*16-90)*1"]
},
"wing_left2": {
"rotation": [0, 0, "7.5+q.r.velocity_y(0)*10+math.sin(q.anim_time*90*16-120)*1"]
},
"wing_left3": {
"rotation": [0, 0, "5+q.r.velocity_y(0)*5+math.sin(q.anim_time*90*16-180)*1"]
},
"wing_left4": {
"rotation": [0, 0, "-5+q.r.velocity_y(0)*5+math.sin(q.anim_time*90*16-250)*3"]
},
"tail": {
"rotation": ["-12.5+q.r.velocity_y(0)*-10+math.sin(q.anim_time*90*16-45)*1", 0, 0]
},
"tail2": {
"rotation": ["5+q.r.velocity_y(0)*-10+math.sin(q.anim_time*90*16-90)*1", 0, 0]
},
"tail3": {
"rotation": ["7.5+q.r.velocity_y(0)*-10+math.sin(q.anim_time*90*16-130)*3", 0, 0]
},
"tail4": {
"rotation": ["10+q.r.velocity_y(0)*-10+math.sin(q.anim_time*90*16-180)*6", 0, 0]
}
}
},
"animation.mantine.ride_water_swim": {
"loop": true,
"bones": {
"torso": {
"rotation": ["0+q.r.pitch_change(0)*-8", "0+q.r.yaw_change(0)*12", "0+q.r.roll_change(0)*-12"]
},
"antenna_right2": {
"rotation": [0, 0, "0+q.r.yaw_change(0)*12"]
},
"antenna_left2": {
"rotation": [0, 0, "0+q.r.yaw_change(0)*12"]
},
"wing_right": {
"rotation": [0, "0+q.r.pitch_change(0)*8", "0+q.r.roll_change(0)*12"]
},
"wing_right2": {
"rotation": [0, 0, "0+q.r.roll_change(0)*12"]
},
"wing_right3": {
"rotation": [0, 0, "0+q.r.roll_change(0)*12"]
},
"wing_right4": {
"rotation": [0, 0, "0+q.r.roll_change(0)*12"]
},
"wing_left": {
"rotation": [0, "0+q.r.pitch_change(0)*-8", "0+q.r.roll_change(0)*12"]
},
"wing_left2": {
"rotation": [0, 0, "0+q.r.roll_change(0)*12"]
},
"wing_left3": {
"rotation": [0, 0, "0+q.r.roll_change(0)*12"]
},
"wing_left4": {
"rotation": [0, 0, "0+q.r.roll_change(0)*12"]
},
"tail": {
"rotation": ["0+q.r.pitch_change(0)*-8", "0+q.r.yaw_change(0)*-12", 0]
},
"tail2": {
"rotation": ["0+q.r.pitch_change(0)*-8", "0+q.r.yaw_change(0)*-4", 0]
},
"tail3": {
"rotation": ["0+q.r.pitch_change(0)*-8", 0, 0]
},
"tail4": {
"rotation": ["0+q.r.pitch_change(0)*-8", 0, 0]
}
}
},
"animation.mantine.sleep": {
"loop": true,
"animation_length": 4,
@@ -588,7 +701,16 @@
}
}
},
"animation.mantine.walkspeedtest": {
"loop": true,
"bones": {
"mantine": {
"position": [0, 0, "-q.anim_time*90*0.4"]
}
}
},
"animation.mantine.cry": {
"animation_length": 1.25,
"sound_effects": {
"0.0417": {
"effect": "pokemon.mantine.cry"
@@ -1005,6 +1005,14 @@
"position": [-0.1, 0, 0]
}
}
},
"animation.treecko.cry": {
"animation_length": 1.25,
"sound_effects": {
"0.0417": {
"effect": "pokemon.treecko.cry"
}
}
}
}
}
@@ -167,6 +167,14 @@
}
}
}
},
"animation.grovyle.cry": {
"animation_length": 1.25,
"sound_effects": {
"0.0417": {
"effect": "pokemon.grovyle.cry"
}
}
}
}
}
@@ -551,6 +551,14 @@
"position": [0, 0.3, 0]
}
}
},
"animation.sceptile.cry": {
"animation_length": 1.25,
"sound_effects": {
"0.0417": {
"effect": "pokemon.sceptile.cry"
}
}
}
}
}
@@ -3373,6 +3373,188 @@
}
}
},
"animation.flygon.ride_jump": {
"loop": true,
"bones": {
"body": {
"rotation": [0, "-Math.cos((query.anim_time)*90*12)*-0.1", "Math.sin((query.anim_time)*90*12-12)*-0.1"],
"position": [0, 4, 1]
},
"torso": {
"rotation": ["70+q.r.velocity_y(0)*-15", 0, 0]
},
"chest": {
"rotation": ["-15+q.r.velocity_y(0)*4", 0, 0]
},
"neck": {
"rotation": ["-4+q.r.velocity_y(0)*4-(q.r.velocity_y(0)-0.5)*Math.cos((query.anim_time)*90*12-30)*0.1", 0, 0]
},
"neck2": {
"rotation": ["-20+q.r.velocity_y(0)*10-(q.r.velocity_y(0)-0.5)*Math.cos((query.anim_time)*90*12-60)*0.2", 0, 0]
},
"neck3": {
"rotation": ["-15+q.r.velocity_y(0)*2-(q.r.velocity_y(0)-0.5)*Math.cos((query.anim_time)*90*12-90)*-0.3", 0, 0]
},
"head_angle": {
"rotation": ["-10+q.r.velocity_y(0)*-2-(q.r.velocity_y(0)-0.5)*Math.cos((query.anim_time)*90*12-90)*-0.1", 0, 0]
},
"antenna_left": {
"rotation": ["25+q.r.velocity_y(0)*-3-Math.cos((query.anim_time)*90*12-120)*0.5", 5, 0]
},
"antenna_left2": {
"rotation": ["-25+q.r.velocity_y(0)*-10-Math.cos((query.anim_time)*90*12-150)*0.5", 0, 0]
},
"antenna_left3": {
"rotation": ["-15+q.r.velocity_y(0)*-6-Math.cos((query.anim_time)*90*12-180)*1-Math.cos((query.anim_time)*90*30-180)*1", 0, 0]
},
"antenna_right": {
"rotation": ["25+q.r.velocity_y(0)*-3-Math.cos((query.anim_time)*90*12-130)*0.5", -5, 0]
},
"antenna_right2": {
"rotation": ["-25+q.r.velocity_y(0)*-10-Math.cos((query.anim_time)*90*12-160)*0.5", 0, 0]
},
"antenna_right3": {
"rotation": ["-15+q.r.velocity_y(0)*-6-Math.cos((query.anim_time)*90*12-190)*1-Math.cos((query.anim_time)*90*30-1900)*1", 0, 0]
},
"arm_left": {
"rotation": [70, "math.clamp(15+q.r.velocity_y(0)*25,15,45)", 75],
"position": [0, "-1+q.r.velocity_y(0)*-1", "-1+q.r.velocity_y(0)*-1"]
},
"arm_left2": {
"rotation": [0, 0, "-90+q.r.velocity_y(0)*-5"]
},
"hand_left": {
"rotation": ["-10+q.r.velocity_y(0)*10", 0, "(45+q.r.velocity_y(0)*-20)"]
},
"finger_back_left_rotation": {
"rotation": [0, 0, 30]
},
"finger_back_left2": {
"rotation": [0, 0, 52.5]
},
"finger_center_left": {
"rotation": [0, 0, 37.5]
},
"finger_center_left2": {
"rotation": [0, 0, 37.5]
},
"finger_front_left_rotation": {
"rotation": [0, 0, 45]
},
"finger_front_left2": {
"rotation": [0, 0, 22.5]
},
"arm_right": {
"rotation": [70, "-(math.clamp(15+q.r.velocity_y(0)*25,15,45))", -75],
"position": [0, "-1+q.r.velocity_y(0)*-1", "-1+q.r.velocity_y(0)*-1"]
},
"arm_right2": {
"rotation": [0, 0, "90+q.r.velocity_y(0)*-5"]
},
"hand_right": {
"rotation": ["-10+q.r.velocity_y(0)*10", 0, "-((45+q.r.velocity_y(0)*-20))"]
},
"finger_back_right_rotation": {
"rotation": [0, 0, -30]
},
"finger_back_right2": {
"rotation": [0, 0, -52.5]
},
"finger_center_right": {
"rotation": [0, 0, -37.5]
},
"finger_center_right2": {
"rotation": [0, 0, -37.5]
},
"finger_front_right_rotation": {
"rotation": [0, 0, -45]
},
"finger_front_right2": {
"rotation": [0, 0, -22.5]
},
"wing_left": {
"rotation": [
"(16+q.r.velocity_y(0)*6.5)",
"(-35+q.r.velocity_y(0)*9+(q.r.velocity_y(0)-0.9)*(Math.cos((query.anim_time)*90*12)*0.2+Math.cos((query.anim_time)*90*30)*0.6))",
"(57.5+q.r.velocity_y(0)*7.5)"
]
},
"wing_left2": {
"rotation": [0, "(math.clamp(q.r.velocity_y(0)*20,-5,12)+Math.cos((query.anim_time)*90*30-30)*-1)", 0]
},
"wing_right": {
"rotation": [
"(16+q.r.velocity_y(0)*6.5)",
"-((-35+q.r.velocity_y(0)*9+(q.r.velocity_y(0)-0.9)*(Math.cos((query.anim_time)*90*12-10)*0.2+Math.cos((query.anim_time)*90*30-10)*0.6)))",
"-((57.5+q.r.velocity_y(0)*7.5))"
]
},
"wing_right2": {
"rotation": [0, "-((math.clamp(q.r.velocity_y(0)*20,-5,12)+Math.cos((query.anim_time)*90*30-30)*-1))", 0]
},
"tail": {
"rotation": ["-80-q.r.velocity_y(0)*15-Math.cos((query.anim_time)*90*12)*0.05", "-Math.sin((query.anim_time)*90*6)*0.1", 0],
"position": [0, "-0.5+q.r.velocity_y(0)*0.25", 2]
},
"tail2": {
"rotation": ["5-q.r.velocity_y(0)*-10-Math.cos((query.anim_time)*90*12-20)*0.1", "-Math.sin((query.anim_time)*90*6-20)*0.5", 0]
},
"tail3": {
"rotation": ["5-q.r.velocity_y(0)*-10-Math.cos((query.anim_time)*90*12-40)*0.2", "-Math.sin((query.anim_time)*90*6-40)*0.4", 0]
},
"tail4": {
"rotation": ["10-q.r.velocity_y(0)*-5-Math.cos((query.anim_time)*90*12-60)*0.5", "-Math.sin((query.anim_time)*90*6-60)*0.5", 0]
},
"tail5": {
"rotation": ["5+q.r.velocity_y(0)*-5-Math.cos((query.anim_time)*90*12-80)*1", "-Math.sin((query.anim_time)*90*6-80)*-1", 0]
},
"tail6": {
"rotation": ["10-q.r.velocity_y(0)*15-Math.cos((query.anim_time)*90*12-100)*3", "-Math.sin((query.anim_time)*90*6-100)*-1", 0]
},
"tail_fins": {
"rotation": ["5-q.r.velocity_y(0)*20-Math.cos((query.anim_time)*90*12-120)*-3", "-Math.sin((query.anim_time)*90*6-120)*-1", 0]
},
"leg_left": {
"rotation": ["5+q.r.velocity_y(0)*32.5", 0, 0],
"position": [0, "-3+q.r.velocity_y(0)*-1", "2+q.r.velocity_y(0)*-1"]
},
"leg_left2": {
"rotation": ["6+q.r.velocity_y(0)*8.5", 0, 0],
"position": [0, -1.25, "math.clamp(q.r.velocity_y(0)*1.75,0,2)"]
},
"foot_left": {
"rotation": ["10.5+q.r.velocity_y(0)*5.5", 0, 0]
},
"foot_left2": {
"rotation": ["8+q.r.velocity_y(0)*12", 0, 0],
"position": [0, "math.clamp(q.r.velocity_y(0)*0.125,0,1)", "0.2+math.clamp(q.r.velocity_y(0)*0.675,-0.2,1)"]
},
"leg_right": {
"rotation": ["5+q.r.velocity_y(0)*32.5", 0, 0],
"position": [0, "-3+q.r.velocity_y(0)*-1", "2+q.r.velocity_y(0)*-1"]
},
"leg_right2": {
"rotation": ["6+q.r.velocity_y(0)*8.5", 0, 0],
"position": [0, -1.25, "math.clamp(q.r.velocity_y(0)*1.75,0,2)"]
},
"foot_right": {
"rotation": ["10.5+q.r.velocity_y(0)*5.5", 0, 0]
},
"foot_right2": {
"rotation": ["8+q.r.velocity_y(0)*12", 0, 0],
"position": [0, "math.clamp(q.r.velocity_y(0)*0.125,0,1)", "0.2+math.clamp(q.r.velocity_y(0)*0.675,-0.2,1)"]
},
"tail_fin_center": {
"rotation": ["6-Math.cos((query.anim_time)*90*30-80)*-6", 0, 0]
},
"tail_fin_left": {
"rotation": ["-0-Math.cos((query.anim_time)*90*30-90)*-5", "(-10+q.r.velocity_y(0)*-15)", 0]
},
"tail_fin_right": {
"rotation": ["-0-Math.cos((query.anim_time)*90*30-100)*-5", "-(-10+q.r.velocity_y(0)*-15)", 0]
}
}
},
"animation.flygon.shock": {
"loop": true,
"bones": {
@@ -3,18 +3,19 @@
"animations": {
"animation.chimecho.ground_idle": {
"loop": true,
"animation_length": 864.1667,
"bones": {
"body": {
"rotation": ["math.sin(q.anim_time*90*0.5+15)*2", 0, "math.sin(q.anim_time*90*1+35)*5"],
"position": [0, "math.sin(q.anim_time*90*2)*2*math.sin(q.anim_time*90*1)*0.2", 0]
},
"arm_left": {
"rotation": ["math.sin(q.anim_time*90*2-30)*4*math.sin(q.anim_time*90*1-30)*-1", 0, 0],
"position": [-1, 0.5, -0.25]
},
"arm_right": {
"rotation": ["math.sin(q.anim_time*90*2-30)*4*math.sin(q.anim_time*90*1-30)*-1", 0, 0],
"position": [1, 0.5, -0.25]
"position": [-0.5, 0.25, -0.25]
},
"arm_left": {
"rotation": ["math.sin(q.anim_time*90*2-30)*4*math.sin(q.anim_time*90*1-30)*-1", 0, 0],
"position": [0.5, 0.25, -0.25]
},
"tail": {
"rotation": ["math.sin(q.anim_time*90*2-30)*-5*math.sin(q.anim_time*90*1-30)*-2", 0, 0]
@@ -40,13 +41,13 @@
"rotation": ["math.sin(q.anim_time*90*0.5+15)*2", 0, "math.sin(q.anim_time*90*1+35)*5"],
"position": [0, "math.sin(q.anim_time*90*2)*2*math.sin(q.anim_time*90*1)*0.2", 0]
},
"arm_left": {
"rotation": ["math.sin(q.anim_time*90*2-30)*4*math.sin(q.anim_time*90*1-30)*-1", 0, 0],
"position": [-1, 0.5, -0.25]
},
"arm_right": {
"rotation": ["math.sin(q.anim_time*90*2-30)*4*math.sin(q.anim_time*90*1-30)*-1", 0, 0],
"position": [1, 0.5, -0.25]
"position": [-0.5, 0.25, -0.25]
},
"arm_left": {
"rotation": ["math.sin(q.anim_time*90*2-30)*4*math.sin(q.anim_time*90*1-30)*-1", 0, 0],
"position": [0.5, 0.25, -0.25]
},
"tail": {
"rotation": ["math.sin(q.anim_time*90*2-30)*-5*math.sin(q.anim_time*90*1-30)*-2", 0, 0]
@@ -72,13 +73,11 @@
"rotation": ["5+math.sin(q.anim_time*90*4+50)*1", 0, "math.sin(q.anim_time*90*1+35)*-2"],
"position": [0, "math.sin(q.anim_time*90*4)*0.3", "math.sin(q.anim_time*90*4)*-0.2"]
},
"arm_left": {
"rotation": ["math.sin(q.anim_time*90*4-30)*5", 0, 0],
"position": [-0.25, 0, 0]
},
"arm_right": {
"rotation": ["math.sin(q.anim_time*90*4-20)*5", 0, 0],
"position": [0.25, 0, 0]
"rotation": ["math.sin(q.anim_time*90*4-30)*5", 0, 0]
},
"arm_left": {
"rotation": ["math.sin(q.anim_time*90*4-20)*5", 0, 0]
},
"tail": {
"rotation": ["math.sin(q.anim_time*90*4-30)*-2", 0, 0]
@@ -104,13 +103,11 @@
"rotation": ["5+math.sin(q.anim_time*90*4+50)*1", 0, "math.sin(q.anim_time*90*1+35)*-2"],
"position": [0, "math.sin(q.anim_time*90*4)*0.3", "math.sin(q.anim_time*90*4)*-0.2"]
},
"arm_left": {
"rotation": ["math.sin(q.anim_time*90*4-30)*5", 0, 0],
"position": [-0.25, 0, 0]
},
"arm_right": {
"rotation": ["math.sin(q.anim_time*90*4-20)*5", 0, 0],
"position": [0.25, 0, 0]
"rotation": ["math.sin(q.anim_time*90*4-30)*5", 0, 0]
},
"arm_left": {
"rotation": ["math.sin(q.anim_time*90*4-20)*5", 0, 0]
},
"tail": {
"rotation": ["math.sin(q.anim_time*90*4-30)*-2", 0, 0]
@@ -140,10 +137,10 @@
"math.sin(q.anim_time*90*4-90)*-0.8"
]
},
"arm_left": {
"arm_right": {
"rotation": ["math.sin(q.anim_time*90*4-30)*8", 0, 0]
},
"arm_right": {
"arm_left": {
"rotation": ["math.sin(q.anim_time*90*4-20)*8", 0, 0]
},
"tail": {
@@ -170,21 +167,21 @@
"loop": true,
"bones": {
"body": {
"position": [0, -15, 2]
"position": [0, -17.5, 2]
},
"eyelid_right": {
"position": [0, 0, -0.1]
"position": [0, 0, -0.2]
},
"eyelid_left": {
"position": [0, 0, -0.1]
"position": [0, 0, -0.2]
},
"head": {
"rotation": ["-4+math.sin(q.anim_time*90*1)*-1-1", "-0.1+math.sin(q.anim_time*90*1)*-0.5", -3]
},
"arm_left": {
"arm_right": {
"rotation": ["-2.5+math.sin(q.anim_time*90*1-30)*2", 0.2, 42.5]
},
"arm_right": {
"arm_left": {
"rotation": ["2.5+math.sin(q.anim_time*90*1-30)*2", 0, -37.5]
},
"tail": {
@@ -201,6 +198,15 @@
},
"ribbon4": {
"rotation": [-2, -1, "math.sin(q.anim_time*90*1-80)*5"]
},
"eyes": {
"position": [0, 0, 0.1]
},
"eyes_ditto": {
"position": [0, 0, 0.1]
},
"eyes_blink_ditto": {
"position": [0, 0, -0.1]
}
}
},
@@ -283,22 +289,22 @@
"lerp_mode": "catmullrom"
},
"2.0": {
"post": [2.4, -12.3, 0.85],
"post": [2.4, -13.3, 0.85],
"lerp_mode": "catmullrom"
},
"2.0833": {
"post": [1.6, -11.5, 0.85],
"post": [1.6, -12.5, 0.85],
"lerp_mode": "catmullrom"
},
"2.2083": {
"post": [0.9, -11.9, 0.85],
"post": [0.9, -12.9, 0.85],
"lerp_mode": "catmullrom"
},
"2.3333": {
"post": [1.53, -11.89, 0.85],
"post": [1.53, -12.89, 0.85],
"lerp_mode": "catmullrom"
},
"2.4583": [1.4, -12, 0.85]
"2.4583": [1.4, -13, 0.85]
}
},
"head": {
@@ -358,7 +364,7 @@
"1.9167": [0, 0, -0.1]
}
},
"arm_left": {
"arm_right": {
"rotation": {
"0.0": [0, 0, 0],
"0.1667": [-7.36, -2.27, 0.53],
@@ -387,7 +393,7 @@
"2.4167": [-20.46837, 12.38579, 5.5139]
}
},
"arm_right": {
"arm_left": {
"rotation": {
"0.0": [0, 0, 0],
"0.1667": [-7.36, 2.27, -0.53],
@@ -623,8 +629,29 @@
"2.4583": [18.18235, 2.90113, 3.04049],
"2.6667": [3.86, 2.9, 3.04],
"2.8333": [28.96168, -1.75342, 1.21027],
"2.9167": [37.33288, -2.65201, 0.21221],
"3.0": [30.70408, -3.55061, -0.78586]
"2.9167": [40.53288, -2.65201, 0.21221],
"3.0": [42.30408, -3.55061, -0.78586]
}
},
"mouth_open": {
"position": {
"0.7917": [0, 0, 0],
"0.8333": [0, 0, -0.1],
"1.5833": [0, 0, -0.1],
"1.625": [0, 0, 0]
}
},
"mouth_smile": {
"position": {
"0.0": [0, 0, 0],
"0.8333": {
"pre": [0, 0, 0],
"post": [0, 0, 0.1]
},
"1.625": {
"pre": [0, 0, 0.1],
"post": [0, 0, 0]
}
}
}
}
@@ -656,17 +683,23 @@
}
}
},
"mouth": {
"mouth_open": {
"position": {
"0.0": [0, 0, 0],
"0.25": [0, 0, -0.1],
"1.25": [0, 0, -0.1],
"1.5": [0, 0, 0]
"0.25": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.3333": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"mouth_smile": {
"position": {
"0.0": [0, 0, 0],
"0.25": {"pre": [0, 0, 0], "post": [0, 0, 0.1]},
"1.3333": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
}
},
"sound_effects": {
"0.0417": {
"0.25": {
"effect": "pokemon.chimecho.cry"
}
}
@@ -677,16 +710,239 @@
"eyelid_left": {
"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]
}
}
},
"eyelid_right": {
"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]
}
}
},
"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.chimecho.happy": {
"loop": true,
"bones": {
"mouth": {
"position": [0, 0, 0.1]
},
"mouth_open": {
"position": [0, 0, -0.1]
},
"eyes_happy": {
"position": [0, 0, -0.2]
},
"mouth_smile": {
"position": [0, 0, 0.1]
},
"eyelid_left_happy": {
"position": [0, 0, -0.1]
},
"eyelid_right_happy": {
"position": [0, 0, -0.1]
}
}
},
"animation.chimecho.shocked": {
"loop": true,
"bones": {
"mouth": {
"position": [0, 0, 0.1]
},
"eye_right": {
"scale": [0.6, 0.6, 1]
},
"eye_left": {
"scale": [0.6, 0.6, 1]
},
"mouth_open_shocked": {
"position": [0, 0, -0.1]
}
}
},
"animation.chimecho.intrigued": {
"loop": true,
"bones": {
"mouth": {
"position": [0, 0, 0.1]
},
"mouth_0": {
"position": [0, 0, -0.1]
},
"mouth_smile": {
"position": [0, 0, 0.1]
}
}
},
"animation.chimecho.angry": {
"loop": true,
"bones": {
"mouth": {
"rotation": [0, 0, 180],
"position": [0, -0.5, 0]
},
"eyebrows": {
"position": [0, 0, -0.1]
},
"mouth_smile": {
"position": [0, 0, 0.1]
},
"eyelid_left_angry": {
"position": [0, 0, -0.1]
},
"eyelid_right_angry": {
"position": [0, 0, -0.1]
},
"mouth_frown": {
"position": [0, 0, -0.1]
}
}
},
"animation.chimecho.sad": {
"loop": true,
"bones": {
"mouth": {
"rotation": [0, 0, 180],
"position": [0, -0.5, 0]
},
"eyebrow_right": {
"position": [-1, 0, 0]
},
"eyebrows": {
"position": [0, 0, -0.1]
},
"eyebrow_left": {
"position": [1, 0, 0]
},
"mouth_smile": {
"position": [0, 0, 0.1]
},
"eyelid_left_sad": {
"position": [0, 0, -0.1]
},
"eyelid_right_sad": {
"position": [0, 0, -0.1]
},
"mouth_frown": {
"position": [0, 0, -0.1]
}
}
},
"animation.chimecho.achieved_peace": {
"loop": true,
"bones": {
"mouth": {
"position": [0, 0, 0.1]
},
"mouth_open": {
"position": [0, 0, -0.1]
},
"eyes_happy": {
"position": [0, 0, -0.2]
},
"detail_right": {
"position": [0, 1, 0]
},
"detail_left": {
"position": [0, 1, 0]
},
"mouth_smile": {
"position": [0, 0, 0.1]
},
"eyelid_left": {
"position": [0, 0, -0.1]
},
"eyelid_right": {
"position": [0, 0, -0.1]
}
}
},
"animation.chimecho.mellow": {
"loop": true,
"bones": {
"mouth": {
"position": [0, 0, 0]
},
"eyes": {
"position": [0, 0, 0]
},
"mouth_open": {
"position": [0, 0, 0]
},
"eyes_happy": {
"position": [0, 0, 0]
},
"eyebrow_left": {
"position": [0.5, 0, -0.1]
},
"eyebrow_right": {
"position": [-0.5, 0, -0.1]
},
"mouth_smile": {
"position": [0, 0, 0.1]
},
"eyelid_left_annoyed": {
"position": [0, 0, -0.1]
},
"eyelid_right_annoyed": {
"position": [0, 0, -0.1]
},
"mouth_neutral": {
"position": [0, 0, -0.1]
}
}
},
"animation.chimecho.scream": {
"loop": true,
"bones": {
"mouth": {
"position": [0, 0, 0.1]
},
"eyebrows": {
"position": [0, 0, -0.1]
},
"mouth_scream": {
"position": [0, 0, -0.1]
},
"mouth_smile": {
"position": [0, 0, 0.1]
}
}
},
"animation.chimecho.ditto_face": {
"loop": true,
"bones": {
"face": {
"position": [0, 0, 0.1],
"scale": 0
},
"face_ditto": {
"position": [0, 0, -0.1]
}
}
}
@@ -15,51 +15,132 @@
"arm_left": {
"rotation": [0, 0, "40+math.sin(q.anim_time*90*4-40)*-4"]
},
"arm_right": {
"rotation": [0, 0, "-40+math.sin(q.anim_time*90*4-40)*4"]
},
"ribbon_right": {
"rotation": [0, "12.5+math.sin(q.anim_time*90*2-10)*-4", "math.sin(q.anim_time*90*4-10)*-4"]
},
"ribbon_right2": {
"rotation": [0, "20+math.sin(q.anim_time*90*2-10)*-10", "math.sin(q.anim_time*90*4-10)*-4"]
},
"ribbon_end_right": {
"rotation": [0, "17.5+math.sin(q.anim_time*90*2-70)*-20", 0]
},
"ribbon_end_right2": {
"rotation": [0, "15+math.sin(q.anim_time*90*2-70)*-15", 0],
"position": [-0.2, 0, 0.2]
},
"ribbon_end_right3": {
"rotation": [0, "17.5+math.sin(q.anim_time*90*2-70)*-20", 0]
},
"leg_left": {
"rotation": ["math.sin(q.anim_time*90*4-10)*4+4", 0, 0],
"foot_left": {
"rotation": ["math.sin(q.anim_time*90*4-10)*4+4", -15, 0],
"position": [0, "math.sin(q.anim_time*90*4)*0.2+0.1", "math.sin(q.anim_time*90*4)*0.1"]
},
"leg_right": {
"rotation": ["math.sin(q.anim_time*90*4-10)*4+4", 0, 0],
"position": [0, "math.sin(q.anim_time*90*4)*0.2+0.1", 0]
},
"body": {
"position": [0, "math.sin(q.anim_time*90*4)*-0.1", "math.sin(q.anim_time*90*4)*-0.15"]
},
"ribbon_left": {
"rotation": [0, "-12.5+math.sin(q.anim_time*90*2-10)*4", "-(math.sin(q.anim_time*90*4-10)*- 4)"]
"rotation": [0, "-20+math.sin(q.anim_time*90*1-10)*4", "-25-(math.sin(q.anim_time*90*2-10)*- 4)"]
},
"ribbon_left2": {
"rotation": [0, "-20+math.sin(q.anim_time*90*2-10)*10", "-(math.sin(q.anim_time*90*4-10)*-4)"]
"rotation": [0, "0+math.sin(q.anim_time*90*1-10)*6", "-20-(math.sin(q.anim_time*90*2-10)*-6)"]
},
"ribbon_end_left": {
"rotation": [0, "-17.5+math.sin(q.anim_time*90*2-70)*20", 0]
"ribbon_left3": {
"rotation": [0, "-20+math.sin(q.anim_time*90*1-10)*6", "-15-(math.sin(q.anim_time*90*2-10)*-6)"]
},
"ribbon_end_left2": {
"rotation": [0, "-15+math.sin(q.anim_time*90*2-70)*15", 0],
"position": [0.2, 0, 0.2]
"ribbon_tip_top_left": {
"rotation": [0, 22.5, -15]
},
"ribbon_end_left3": {
"rotation": [0, "-17.5+math.sin(q.anim_time*90*2-70)*20", 0]
"ribbon_tip_middle_left": {
"rotation": [0, 10, 0],
"position": [0, 0, 0.1]
},
"ribbon_tip_bottom_left": {
"rotation": [0, 22.5, 15]
},
"ribbon_right": {
"rotation": [0, "20-math.sin(q.anim_time*90*1-10)*4", "25+(math.sin(q.anim_time*90*2-10)*- 4)"]
},
"ribbon_right2": {
"rotation": [0, "0-math.sin(q.anim_time*90*1-10)*6", "20+(math.sin(q.anim_time*90*2-10)*-6)"]
},
"ribbon_right3": {
"rotation": [0, "20-math.sin(q.anim_time*90*1-10)*6", "15+(math.sin(q.anim_time*90*2-10)*-6)"]
},
"ribbon_tip_top_right": {
"rotation": [0, -22.5, 15]
},
"ribbon_tip_middle_right": {
"rotation": [0, -10, 0],
"position": [0, 0, 0.1]
},
"ribbon_tip_bottom_right": {
"rotation": [0, -22.5, -15]
},
"arm_right": {
"rotation": [0, 0, "-40+math.sin(q.anim_time*90*4-40)*4"]
},
"foot_right": {
"rotation": ["math.sin(q.anim_time*90*4-10)*4+4", 15, 0],
"position": [0, "math.sin(q.anim_time*90*4)*0.2+0.1", 0]
}
}
},
"animation.chingling.ground_walk": {
"loop": true,
"bones": {
"torso": {
"rotation": ["math.sin(q.anim_time*90*4-10)*3", "math.sin(q.anim_time*90*2-20)*-2", "math.sin(q.anim_time*90*4-20)*8"]
},
"tongue": {
"position": ["math.sin(q.anim_time*90*4+90)*-0.8", "math.sin(q.anim_time*90*4*2+50)*-0.1", 0]
},
"arm_left": {
"rotation": [0, 0, "40+math.sin(q.anim_time*90*4-40)*-4+math.sin(q.anim_time*90*4*2-40)*-2"]
},
"foot_left": {
"rotation": ["math.clamp(math.sin(q.anim_time*90*4+50-180)*-5,0,5)+math.clamp(math.sin(q.anim_time*90*4-180)*10,-6,10)+1", 0, 0],
"position": [
0,
"math.clamp(math.sin(q.anim_time*90*4+140-180)*-0.5,0,1)+math.clamp(math.sin(q.anim_time*90*4+140-180)*-1,-0.2,0)",
"math.sin(q.anim_time*90*4+50-180)*1"
]
},
"body": {
"rotation": [0, 0, 0],
"position": [0, "math.sin(q.anim_time*90*4*2)*0.2+0.1", 0]
},
"ribbon_left": {
"rotation": [0, "-20+math.sin(q.anim_time*90*1-10)*4", "-25-(math.sin(q.anim_time*90*2-10)*- 4)"]
},
"ribbon_left2": {
"rotation": [0, "0+math.sin(q.anim_time*90*1-10)*6", "-20-(math.sin(q.anim_time*90*2-10)*-6)"]
},
"ribbon_left3": {
"rotation": [0, "-20+math.sin(q.anim_time*90*1-10)*6", "-15-(math.sin(q.anim_time*90*2-10)*-6)"]
},
"ribbon_tip_top_left": {
"rotation": [0, 22.5, -15]
},
"ribbon_tip_middle_left": {
"rotation": [0, 10, 0],
"position": [0, 0, 0.1]
},
"ribbon_tip_bottom_left": {
"rotation": [0, 22.5, 15]
},
"ribbon_right": {
"rotation": [0, "20-math.sin(q.anim_time*90*1-10)*4", "25+(math.sin(q.anim_time*90*2-10)*- 4)"]
},
"ribbon_right2": {
"rotation": [0, "0-math.sin(q.anim_time*90*1-10)*6", "20+(math.sin(q.anim_time*90*2-10)*-6)"]
},
"ribbon_right3": {
"rotation": [0, "20-math.sin(q.anim_time*90*1-10)*6", "15+(math.sin(q.anim_time*90*2-10)*-6)"]
},
"ribbon_tip_top_right": {
"rotation": [0, -22.5, 15]
},
"ribbon_tip_middle_right": {
"rotation": [0, -10, 0],
"position": [0, 0, 0.1]
},
"ribbon_tip_bottom_right": {
"rotation": [0, -22.5, -15]
},
"arm_right": {
"rotation": [0, 0, "-40+math.sin(q.anim_time*90*4-40)*4+math.sin(q.anim_time*90*4*2-40)*2"]
},
"foot_right": {
"rotation": ["math.clamp(math.sin(q.anim_time*90*4+50)*-5,0,5)+math.clamp(math.sin(q.anim_time*90*4+0)*10,-6,10)+1", 0, 0],
"position": [
0,
"math.clamp(math.sin(q.anim_time*90*4+140)*-0.5,0,1)+math.clamp(math.sin(q.anim_time*90*4+140)*-1,-0.2,0)",
"math.sin(q.anim_time*90*4+50)*1"
]
}
}
},
@@ -106,7 +187,7 @@
"1.0": [0, 0.1, 0]
}
},
"leg_left": {
"foot_left": {
"rotation": {
"0.0": ["-1+math.clamp(math.sin(q.anim_time*90*4+10)*40*1,0,50)+10", 0, 0],
"0.4583": ["-1+math.clamp(math.sin(q.anim_time*90*4+10)*30*1,0,30)-10", 0, 0],
@@ -130,6 +211,47 @@
"1.0": [0, 0, "40+math.sin(q.anim_time*90*4-80)*8"]
}
},
"legs": {
"position": [0, 0.25, 0]
},
"ribbon_left": {
"rotation": [0, "-40-math.sin(q.anim_time*90*4-10)*-5", "-math.sin(q.anim_time*90*4)*-20"]
},
"ribbon_left2": {
"rotation": [0, "-10-math.sin(q.anim_time*90*4-10)*-5", "(math.sin(q.anim_time*90*4-10)*2)"]
},
"ribbon_left3": {
"rotation": [0, "-15-math.sin(q.anim_time*90*4-10)*-5", "(math.sin(q.anim_time*90*4-10)*2)"]
},
"ribbon_tip_top_left": {
"rotation": [0, "-17.5-math.sin(q.anim_time*90*4-70)*-20-math.sin(q.anim_time*90*15)*-8", -15]
},
"ribbon_tip_middle_left": {
"rotation": [0, "-15-math.sin(q.anim_time*90*4-70)*-15-math.sin(q.anim_time*90*15)*-8", 0],
"position": [0, 0, 0.25]
},
"ribbon_tip_bottom_left": {
"rotation": [0, "-17.5-math.sin(q.anim_time*90*4-70)*-20-math.sin(q.anim_time*90*15)*-8", 15]
},
"ribbon_right": {
"rotation": [0, "40+math.sin(q.anim_time*90*4-10)*-5", "math.sin(q.anim_time*90*4)*-20"]
},
"ribbon_right2": {
"rotation": [0, "10+math.sin(q.anim_time*90*4-10)*-5", "-(math.sin(q.anim_time*90*4-10)*2)"]
},
"ribbon_right3": {
"rotation": [0, "15+math.sin(q.anim_time*90*4-10)*-5", "-(math.sin(q.anim_time*90*4-10)*2)"]
},
"ribbon_tip_top_right": {
"rotation": [0, "17.5+math.sin(q.anim_time*90*4-70)*-20+math.sin(q.anim_time*90*15)*-8", 15]
},
"ribbon_tip_middle_right": {
"rotation": [0, "15+math.sin(q.anim_time*90*4-70)*-15+math.sin(q.anim_time*90*15)*-8", 0],
"position": [0, 0, 0.25]
},
"ribbon_tip_bottom_right": {
"rotation": [0, "17.5+math.sin(q.anim_time*90*4-70)*-20+math.sin(q.anim_time*90*15)*-8", -15]
},
"arm_right": {
"rotation": {
"0.0": [0, 0, "-40+math.sin(q.anim_time*90*4-80)*-8"],
@@ -138,39 +260,7 @@
"1.0": [0, 0, "-40+math.sin(q.anim_time*90*4-80)*-8"]
}
},
"ribbon_right": {
"rotation": [0, "40+math.sin(q.anim_time*90*4-10)*-5", "math.sin(q.anim_time*90*4)*-20"]
},
"ribbon_right2": {
"rotation": [0, "20+math.sin(q.anim_time*90*4-10)*-10", "-(math.sin(q.anim_time*90*4-10)*4)"]
},
"ribbon_end_right": {
"rotation": [0, "17.5+math.sin(q.anim_time*90*4-70)*-20+math.sin(q.anim_time*90*15)*-8", 0]
},
"ribbon_end_right2": {
"rotation": [0, "15+math.sin(q.anim_time*90*4-70)*-15+math.sin(q.anim_time*90*15)*-8", 0],
"position": [-0.2, 0, 0.2]
},
"ribbon_end_right3": {
"rotation": [0, "17.5+math.sin(q.anim_time*90*4-70)*-20+math.sin(q.anim_time*90*15)*-8", 0]
},
"ribbon_left": {
"rotation": [0, "-40+math.sin(q.anim_time*90*4-10)*5", "math.sin(q.anim_time*90*4)*20"]
},
"ribbon_left2": {
"rotation": [0, "-20+math.sin(q.anim_time*90*4-10)*10+math.sin(q.anim_time*90*15)*1", "-(math.sin(q.anim_time*90*4-10)*-4)"]
},
"ribbon_end_left": {
"rotation": [0, "-17.5+math.sin(q.anim_time*90*4-70)*20+math.sin(q.anim_time*90*15)*8", 0]
},
"ribbon_end_left2": {
"rotation": [0, "-15+math.sin(q.anim_time*90*4-70)*15+math.sin(q.anim_time*90*15)*8", 0],
"position": [0.2, 0, 0.2]
},
"ribbon_end_left3": {
"rotation": [0, "-17.5+math.sin(q.anim_time*90*4-70)*20+math.sin(q.anim_time*90*15)*8", 0]
},
"leg_right": {
"foot_right": {
"rotation": {
"0.0": ["-1+math.clamp(math.sin(q.anim_time*90*4+10)*40*1,0,50)+10", 0, 0],
"0.4583": ["-1+math.clamp(math.sin(q.anim_time*90*4+10)*30*1,0,30)-10", 0, 0],
@@ -190,7 +280,7 @@
"bones": {
"body": {
"rotation": ["math.sin(q.anim_time*90*2+90)*-2", 0, "math.sin(q.anim_time*90*2+30)*-2"],
"position": ["math.sin(q.anim_time*90*0.2)*-0.5", "math.sin(q.anim_time*90*2)*-1", 0]
"position": ["math.sin(q.anim_time*90*0.2)*-0.5", "2+math.sin(q.anim_time*90*2)*-1", 0]
},
"torso": {
"position": [0, "math.sin(q.anim_time*90*2-20)*-0.1", 0]
@@ -201,46 +291,55 @@
"arm_left": {
"rotation": [0, 0, "35+math.sin(q.anim_time*90*2-80)*-10"]
},
"foot_left": {
"rotation": ["40+math.sin(q.anim_time*90*3-40)*-10", -15, 0]
},
"ribbon_left": {
"rotation": [0, "-12.5+math.sin(q.anim_time*90*1-10)*4", "-25-(math.sin(q.anim_time*90*2-10)*- 4)"]
},
"ribbon_left2": {
"rotation": [0, "0+math.sin(q.anim_time*90*1-10)*6", "-20-(math.sin(q.anim_time*90*2-10)*-6)"]
},
"ribbon_tip_top_left": {
"rotation": [0, 22.5, -15]
},
"ribbon_tip_middle_left": {
"rotation": [0, 10, 0],
"position": [0, 0, 0.1]
},
"ribbon_tip_bottom_left": {
"rotation": [0, 22.5, 15]
},
"legs": {
"position": [0, 0.5, 0]
},
"ribbon_left3": {
"rotation": [0, "-20+math.sin(q.anim_time*90*1-10)*6", "-15-(math.sin(q.anim_time*90*2-10)*-6)"]
},
"ribbon_right": {
"rotation": [0, "12.5-math.sin(q.anim_time*90*1-10)*4", "25+(math.sin(q.anim_time*90*2-10)*- 4)"]
},
"ribbon_right2": {
"rotation": [0, "0-math.sin(q.anim_time*90*1-10)*6", "20+(math.sin(q.anim_time*90*2-10)*-6)"]
},
"ribbon_right3": {
"rotation": [0, "20-math.sin(q.anim_time*90*1-10)*6", "15+(math.sin(q.anim_time*90*2-10)*-6)"]
},
"ribbon_tip_top_right": {
"rotation": [0, -22.5, 15]
},
"ribbon_tip_middle_right": {
"rotation": [0, -10, 0],
"position": [0, 0, 0.1]
},
"ribbon_tip_bottom_right": {
"rotation": [0, -22.5, -15]
},
"arm_right": {
"rotation": [0, 0, "-35+math.sin(q.anim_time*90*2-80)*10"]
},
"ribbon_right": {
"rotation": [0, "20+math.sin(q.anim_time*90*1-10)*-4", "NaN-(math.sin(q.anim_time*90*2-10)*4)"]
},
"ribbon_right2": {
"rotation": [0, 0, 0]
},
"ribbon_end_right": {
"rotation": [0, "17.5+math.sin(q.anim_time*90*1-70)*-20", 0]
},
"ribbon_end_right2": {
"rotation": [0, "15+math.sin(q.anim_time*90*1-70)*-15", 0],
"position": [-0.2, 0, 0.2]
},
"ribbon_end_right3": {
"rotation": [0, "17.5+math.sin(q.anim_time*90*1-70)*-20", 0]
},
"ribbon_left": {
"rotation": [0, "-20+math.sin(q.anim_time*90*1-10)*4", "-(math.sin(q.anim_time*90*2-10)*- 4)"]
},
"ribbon_left2": {
"rotation": [0, 0, 0]
},
"ribbon_end_left": {
"rotation": [0, "-17.5+math.sin(q.anim_time*90*1-70)*20", 0]
},
"ribbon_end_left2": {
"rotation": [0, "-15+math.sin(q.anim_time*90*1-70)*15", 0],
"position": [0.2, 0, 0.2]
},
"ribbon_end_left3": {
"rotation": [0, "-17.5+math.sin(q.anim_time*90*1-70)*20", 0]
},
"leg_left": {
"rotation": ["25+math.sin(q.anim_time*90*3-40)*-10", -5, 0]
},
"leg_right": {
"rotation": ["25+math.sin(q.anim_time*90*3-20)*-10", 5, 0]
"foot_right": {
"rotation": ["40+math.sin(q.anim_time*90*3-20)*-10", 15, 0]
}
}
},
@@ -249,7 +348,7 @@
"bones": {
"body": {
"rotation": ["10+math.sin(q.anim_time*90*4+80)*-3", 0, "-math.sin(q.anim_time*90*2+30)*-3"],
"position": ["math.sin(q.anim_time*90*2)*-0.5", "math.sin(q.anim_time*90*4)*-1", "math.sin(q.anim_time*90*4)*0.5"]
"position": ["math.sin(q.anim_time*90*2)*-0.5", "2+math.sin(q.anim_time*90*4)*-1", "math.sin(q.anim_time*90*4)*0.5"]
},
"torso": {
"position": [0, "math.sin(q.anim_time*90*2-20)*-0.1", 0]
@@ -260,51 +359,144 @@
"arm_left": {
"rotation": [0, -20, "35+math.sin(q.anim_time*90*4-40)*-10"]
},
"arm_right": {
"rotation": [0, 20, "-35+math.sin(q.anim_time*90*4-40)*10"]
"foot_left": {
"rotation": ["25+math.sin(q.anim_time*90*4-20)*-10", -5, 0]
},
"ribbon_left": {
"rotation": [0, "-40-math.sin(q.anim_time*90*4-10)*-4", "-(math.sin(q.anim_time*90*4-10)*4)"]
},
"ribbon_left2": {
"rotation": [0, "-15-math.sin(q.anim_time*90*4-10)*-5-math.sin(q.anim_time*90*15)*-0.5", "(math.sin(q.anim_time*90*4-10)*2)"]
},
"ribbon_left3": {
"rotation": [0, "-15-math.sin(q.anim_time*90*4-10)*-5-math.sin(q.anim_time*90*15)*-0.5", "(math.sin(q.anim_time*90*4-10)*2)"]
},
"ribbon_tip_top_left": {
"rotation": [0, "-12.5-math.sin(q.anim_time*90*4-70)*-20-math.sin(q.anim_time*90*15)*-8", -12.5]
},
"ribbon_tip_middle_left": {
"rotation": [0, "-15-math.sin(q.anim_time*90*4-70)*-15-math.sin(q.anim_time*90*15)*-8", 0],
"position": [0, 0, 0.25]
},
"ribbon_tip_bottom_left": {
"rotation": [0, "-12.5-math.sin(q.anim_time*90*4-70)*-20-math.sin(q.anim_time*90*15)*-8", 12.5]
},
"ribbon_right": {
"rotation": [0, "40+math.sin(q.anim_time*90*4-10)*-4", "(math.sin(q.anim_time*90*4-10)*4)"]
},
"ribbon_right2": {
"rotation": [0, "20+math.sin(q.anim_time*90*4-10)*-10+math.sin(q.anim_time*90*15)*-1", "NaN-(math.sin(q.anim_time*90*4-10)*4)"]
"rotation": [0, "15+math.sin(q.anim_time*90*4-10)*-5+math.sin(q.anim_time*90*15)*-0.5", "-(math.sin(q.anim_time*90*4-10)*2)"]
},
"ribbon_end_right": {
"rotation": [0, "17.5+math.sin(q.anim_time*90*4-70)*-20+math.sin(q.anim_time*90*15)*-8", 0]
"ribbon_right3": {
"rotation": [0, "15+math.sin(q.anim_time*90*4-10)*-5+math.sin(q.anim_time*90*15)*-0.5", "-(math.sin(q.anim_time*90*4-10)*2)"]
},
"ribbon_end_right2": {
"ribbon_tip_top_right": {
"rotation": [0, "12.5+math.sin(q.anim_time*90*4-70)*-20+math.sin(q.anim_time*90*15)*-8", 12.5]
},
"ribbon_tip_middle_right": {
"rotation": [0, "15+math.sin(q.anim_time*90*4-70)*-15+math.sin(q.anim_time*90*15)*-8", 0],
"position": [-0.2, 0, 0.2]
"position": [0, 0, 0.25]
},
"ribbon_end_right3": {
"rotation": [0, "17.5+math.sin(q.anim_time*90*4-70)*-20+math.sin(q.anim_time*90*15)*-8", 0]
"ribbon_tip_bottom_right": {
"rotation": [0, "12.5+math.sin(q.anim_time*90*4-70)*-20+math.sin(q.anim_time*90*15)*-8", -12.5]
},
"ribbon_left": {
"rotation": [0, "-40+math.sin(q.anim_time*90*4-10)*4", "(math.sin(q.anim_time*90*4-10)*-4)"]
"arm_right": {
"rotation": [0, 20, "-35+math.sin(q.anim_time*90*4-40)*10"]
},
"ribbon_left2": {
"rotation": [0, "-20+math.sin(q.anim_time*90*4-10)*10+math.sin(q.anim_time*90*15)*1", "-(math.sin(q.anim_time*90*4-10)*-4)"]
},
"ribbon_end_left": {
"rotation": [0, "-17.5+math.sin(q.anim_time*90*4-70)*20+math.sin(q.anim_time*90*15)*8", 0]
},
"ribbon_end_left2": {
"rotation": [0, "-15+math.sin(q.anim_time*90*4-70)*15+math.sin(q.anim_time*90*15)*8", 0],
"position": [0.2, 0, 0.2]
},
"ribbon_end_left3": {
"rotation": [0, "-17.5+math.sin(q.anim_time*90*4-70)*20+math.sin(q.anim_time*90*15)*8", 0]
},
"leg_left": {
"rotation": ["25+math.sin(q.anim_time*90*4-20)*-10", -5, 0]
},
"leg_right": {
"foot_right": {
"rotation": ["25+math.sin(q.anim_time*90*4-30)*-15", 5, 0]
}
}
},
"animation.chingling.sleep": {
"loop": true,
"bones": {
"body": {
"rotation": [-80.5, 0, 0],
"position": [0, "-0.5+math.sin(q.anim_time*90*1)*0.1", 0]
},
"torso": {
"rotation": ["math.sin(q.anim_time*90*1)*-1+11", 0, 0]
},
"tongue": {
"rotation": ["math.sin(q.anim_time*90*1-40)*-2", 0, 0],
"position": ["math.sin(q.anim_time*90*0.5-30)*0.4", "math.sin(q.anim_time*90*1-30)*0.1", 0]
},
"arm_left": {
"rotation": [12, "-25+math.sin(q.anim_time*90*1-30)*5", "42+math.sin(q.anim_time*90*1-10)*-3"]
},
"foot_left": {
"rotation": ["40+math.sin(q.anim_time*90*1+60)*10", -9, -12],
"position": [0.4, 0, "0.5+math.sin(q.anim_time*90*1+60)*0.2"]
},
"ribbon_left": {
"rotation": [-15.5, "-5.5+math.sin(q.anim_time*90*1)*-1", -25]
},
"ribbon_left2": {
"rotation": [0, 0, -22.5]
},
"ribbon_left3": {
"rotation": [0, 0, -22.5]
},
"ribbon_tip_top_left": {
"rotation": [0, -22.5, -15]
},
"ribbon_tip_bottom_left": {
"rotation": [0, -22.5, 15]
},
"legs": {
"position": [0, 0.5, 0]
},
"ribbons": {
"rotation": ["-math.sin(q.anim_time*90*1)*-2", 0, 0]
},
"ribbon_right": {
"rotation": [-20, 5, 20]
},
"ribbon_right3": {
"rotation": [0, -2.5, -22.5]
},
"ribbon_tip_top_right": {
"rotation": [0, 22.5, 15]
},
"ribbon_tip_bottom_right": {
"rotation": [0, 22.5, -15]
},
"arm_right": {
"rotation": [12, "25+math.sin(q.anim_time*90*1-70)*-5", "-42+math.sin(q.anim_time*90*1-50)*3"]
},
"foot_right": {
"rotation": ["40+math.sin(q.anim_time*90*1+50)*3", 5, 20],
"position": [-0.3, 0, "0.6+math.sin(q.anim_time*90*1+30)*0.1"]
},
"eyelid_left": {
"position": [0, -2, -0.1]
},
"eyelid_right": {
"position": [0, -2, -0.1]
},
"eyes_ditto": {
"position": [0, 0, 0.1]
},
"eyes_closed_ditto": {
"position": [0, 0, -0.1]
}
}
},
"animation.chingling.sleep_quirk": {
"animation_length": 1.6667,
"bones": {
"tongue": {
"position": {
"0.0": [0, 0, 0],
"0.25": ["math.sin(q.anim_time*90*14-50)*-1", 0, 0],
"1.6667": [0, 0, 0]
}
}
}
},
"animation.chingling.cry": {
"animation_length": 1.66667,
"animation_length": 1.6667,
"bones": {
"torso": {
"rotation": {
@@ -340,6 +532,10 @@
"post": [-7, 0, 0],
"lerp_mode": "catmullrom"
},
"1.25": {
"post": [-2.03, 0, -0.13],
"lerp_mode": "catmullrom"
},
"1.4167": {
"post": [2.5, 0, 0],
"lerp_mode": "catmullrom"
@@ -348,39 +544,99 @@
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
}
},
"position": {
"0.0": [0, 0, 0],
"0.125": [0, 0, 0],
"0.2083": [0, 1, 0],
"1.25": [0, 0, 0]
}
},
"tongue": {
"position": {
"0.0": [0, 0, 0],
"0.25": ["math.sin(q.anim_time*90*14-50)*-1", 0, 0],
"0.125": [0, 0, 0],
"0.2083": [0.45, -1, 0],
"0.25": ["math.sin(q.anim_time*90*14-50)*-1", -1, 0],
"1.6667": [0, 0, 0]
}
},
"ribbon_right2": {
"rotation": {
"0.25": [0, 0, 0],
"0.2917": [0, 0, 2.5],
"0.3333": [0, 0, 0],
"0.4167": [0, 0, 5],
"0.5": [0, 0, 0],
"0.5417": [0, 0, 2.5],
"0.5833": [0, 0, 0],
"0.6667": [0, 0, 5],
"1.25": [0, 0, 0]
"eyes": {
"position": {
"0.0": [0, 0, 0],
"0.2083": {
"pre": [0, 0, 0],
"post": [0, 0.25, 0]
},
"1.25": {
"pre": [0, 0.25, 0],
"post": [0, 0, 0]
}
}
},
"ribbon_left2": {
"rotation": {
"0.25": [0, 0, 0],
"0.2917": [0, 0, -2.5],
"0.3333": [0, 0, 0],
"0.4167": [0, 0, -5],
"0.5": [0, 0, 0],
"0.5417": [0, 0, -2.5],
"0.5833": [0, 0, 0],
"0.6667": [0, 0, -5],
"1.25": [0, 0, 0]
"mouths_closed": {
"scale": {
"0.0": [1, 1, 1],
"0.2083": {
"pre": [1, 1, 1],
"post": [0, 0, 0]
},
"1.25": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
}
}
},
"mouth_open_sad": {
"scale": {
"0.0": [1, 1, 1],
"0.2083": {
"pre": [1, 1, 1],
"post": [0, 0, 0]
},
"1.25": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
}
}
},
"pupil_right": {
"position": {
"0.0": [0, 0, 0],
"0.2083": {
"pre": [0, 0, 0],
"post": [0, 1.5, 0]
},
"1.25": {
"pre": [0, 1.5, 0],
"post": [0, 0, 0]
}
}
},
"pupil_left": {
"position": {
"0.0": [0, 0, 0],
"0.2083": {
"pre": [0, 0, 0],
"post": [0, 1.5, 0]
},
"1.25": {
"pre": [0, 1.5, 0],
"post": [0, 0, 0]
}
}
},
"face_ditto": {
"position": {
"0.0": [0, 0, 0],
"0.2083": {
"pre": [0, 0, 0],
"post": [0, 1.45, 0]
},
"1.25": {
"pre": [0, 1.45, 0],
"post": [0, 0, 0]
}
}
}
},
@@ -390,175 +646,56 @@
}
}
},
"animation.chingling.ground_walk": {
"loop": true,
"bones": {
"torso": {
"rotation": ["math.sin(q.anim_time*90*4-10)*3", "math.sin(q.anim_time*90*2-20)*-2", "math.sin(q.anim_time*90*4-20)*8"]
},
"tongue": {
"position": ["math.sin(q.anim_time*90*4+90)*-0.8", "math.sin(q.anim_time*90*4*2+50)*-0.1", 0]
},
"arm_left": {
"rotation": [0, 0, "40+math.sin(q.anim_time*90*4-40)*-4+math.sin(q.anim_time*90*4*2-40)*-2"]
},
"arm_right": {
"rotation": [0, 0, "-40+math.sin(q.anim_time*90*4-40)*4+math.sin(q.anim_time*90*4*2-40)*2"]
},
"ribbon_right": {
"rotation": [0, "20+math.sin(q.anim_time*90*4-40)*-5", "math.sin(q.anim_time*90*4-10)*-4"]
},
"ribbon_right2": {
"rotation": [0, "20+math.sin(q.anim_time*90*4-40)*-10", "math.sin(q.anim_time*90*4-10)*-4"]
},
"ribbon_end_right": {
"rotation": [0, "17.5+math.sin(q.anim_time*90*4-70)*-20", 0]
},
"ribbon_end_right2": {
"rotation": [0, "15+math.sin(q.anim_time*90*4-70)*-15", 0],
"position": [-0.2, 0, 0.2]
},
"ribbon_end_right3": {
"rotation": [0, "17.5+math.sin(q.anim_time*90*4-70)*-20", 0]
},
"leg_left": {
"rotation": ["math.clamp(math.sin(q.anim_time*90*4+50-180)*-5,0,5)+math.clamp(math.sin(q.anim_time*90*4-180)*10,-6,10)+1", 0, 0],
"position": [
0,
"math.clamp(math.sin(q.anim_time*90*4+140-180)*-0.5,0,1)+math.clamp(math.sin(q.anim_time*90*4+140-180)*-1,-0.2,0)",
"math.sin(q.anim_time*90*4+50-180)*1"
]
},
"leg_right": {
"rotation": ["math.clamp(math.sin(q.anim_time*90*4+50)*-5,0,5)+math.clamp(math.sin(q.anim_time*90*4+0)*10,-6,10)+1", 0, 0],
"position": [
0,
"math.clamp(math.sin(q.anim_time*90*4+140)*-0.5,0,1)+math.clamp(math.sin(q.anim_time*90*4+140)*-1,-0.2,0)",
"math.sin(q.anim_time*90*4+50)*1"
]
},
"body": {
"rotation": [0, 0, 0],
"position": [0, "math.sin(q.anim_time*90*4*2)*0.2+0.1", 0]
},
"ribbon_left": {
"rotation": [0, "-20+math.sin(q.anim_time*90*4-40)*-5", "-(math.sin(q.anim_time*90*4-10)*-4)"]
},
"ribbon_left2": {
"rotation": [0, "-20+math.sin(q.anim_time*90*4-40)*-10", "-(math.sin(q.anim_time*90*4-10)*-4)"]
},
"ribbon_end_left": {
"rotation": [0, "-17.5+math.sin(q.anim_time*90*4-70)*-20", 0]
},
"ribbon_end_left2": {
"rotation": [0, "-15+math.sin(q.anim_time*90*4-70)*-15", 0],
"position": [0.2, 0, 0.2]
},
"ribbon_end_left3": {
"rotation": [0, "-17.5+math.sin(q.anim_time*90*4-70)*-20", 0]
}
}
},
"animation.chingling.sleep": {
"loop": true,
"bones": {
"body": {
"rotation": [-80.5, 0, 0],
"position": [0, "-0.7+math.sin(q.anim_time*90*1)*0.1", 0]
},
"torso": {
"rotation": ["math.sin(q.anim_time*90*1)*-1+1", 0, 0]
},
"tongue": {
"rotation": ["math.sin(q.anim_time*90*1-40)*-2", 0, 0],
"position": ["math.sin(q.anim_time*90*0.5-30)*0.4", "math.sin(q.anim_time*90*1-30)*0.1", 0]
},
"arm_left": {
"rotation": [12, "-25+math.sin(q.anim_time*90*1-30)*5", "42+math.sin(q.anim_time*90*1-10)*-3"]
},
"arm_right": {
"rotation": [12, "25+math.sin(q.anim_time*90*1-70)*-5", "-42+math.sin(q.anim_time*90*1-50)*3"]
},
"eyelid_right": {
"position": [0, 0, -0.1]
},
"eyelid_left": {
"position": [0, 0, -0.1]
},
"ribbon_right": {
"rotation": [-5, "22+math.sin(q.anim_time*90*1)*1", -2]
},
"ribbon_right2": {
"rotation": ["-2+math.sin(q.anim_time*90*1)*1", "-16+math.sin(q.anim_time*90*1)*-2", -10]
},
"ribbon_end_right": {
"rotation": [0, "2.5+math.sin(q.anim_time*90*1)*3", -12.5],
"position": [-0.1, 0, 0]
},
"ribbon_end_right2": {
"rotation": [-2, "-2+math.sin(q.anim_time*90*1)*3", -15],
"position": [-0.3, 0, 0]
},
"ribbon_end_right3": {
"rotation": [0, "-2.5+math.sin(q.anim_time*90*1)*3", -27.5],
"position": [0.2, 0.2, 0]
},
"ribbon_left": {
"rotation": [-5, "-22+math.sin(q.anim_time*90*1)*-1", 2]
},
"ribbon_left2": {
"rotation": [-15, "10+math.sin(q.anim_time*90*1)*2 ", -43]
},
"ribbon_end_left": {
"rotation": [-2.5, "-12+math.sin(q.anim_time*90*1)*-3", -19],
"position": [-0.2, -0.1, 0]
},
"ribbon_end_left2": {
"rotation": [1.5, "-10+math.sin(q.anim_time*90*1)*-3", -10],
"position": [0.3, 0, 0]
},
"ribbon_end_left3": {
"rotation": [1, "-7+math.sin(q.anim_time*90*1)*-3", -6],
"position": [0.1, 0, 0]
},
"leg_left": {
"rotation": ["40+math.sin(q.anim_time*90*1+60)*10", -9, -12],
"position": [0.4, -0.2, "0.5+math.sin(q.anim_time*90*1+60)*0.2"]
},
"leg_right": {
"rotation": ["40+math.sin(q.anim_time*90*1+50)*3", 5, 20],
"position": [-0.3, -0.3, "0.6+math.sin(q.anim_time*90*1+30)*0.1"]
}
}
},
"animation.chingling.sleep_quirk": {
"animation_length": 1.66667,
"bones": {
"tongue": {
"position": {
"0.0": [0, 0, 0],
"0.25": ["math.sin(q.anim_time*90*14-50)*-1", 0, 0],
"1.6667": [0, 0, 0]
}
}
}
},
"animation.chingling.blink": {
"animation_length": 0.16667,
"animation_length": 0.1667,
"bones": {
"eyelid_right": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": [0, 0, -0.1],
"0.1667": [0, 0, 0]
}
},
"eyelid_left": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": [0, 0, -0.1],
"0.1667": [0, 0, 0]
"0.0": [0, -2, -0.1],
"0.1667": {
"pre": [0, -2, -0.1],
"post": [0, 0, 0]
}
}
},
"eyelid_right": {
"position": {
"0.0": [0, -2, -0.1],
"0.1667": {
"pre": [0, -2, -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_closed_ditto": {
"position": {
"0.0": [0, 0, -0.1],
"0.1667": {
"pre": [0, 0, -0.1],
"post": [0, 0, 0]
}
}
}
}
},
"animation.chingling.face_ditto": {
"loop": true,
"bones": {
"eyes": {
"position": [0, 0, 0.1],
"scale": 0
},
"face_ditto": {
"position": [0, 0, -6]
}
}
}
@@ -492,19 +492,19 @@
"loop": true,
"bones": {
"torso": {
"rotation": ["0+q.r.input_forward(0)*10", 0, "0+q.r.input_right(0)*-20"]
"rotation": ["0+q.r.velocity_forward(0)*10", 0, "0+q.r.velocity_right(0)*-20"]
},
"arm_left": {
"rotation": [0, "0+math.max(q.r.input_right(0)*-20,0)", 0]
"rotation": [0, "0+math.max(q.r.velocity_right(0)*-20,0)", 0]
},
"arm_left2": {
"rotation": [0, "0+math.max(q.r.input_right(0)*-20,0)", 0]
"rotation": [0, "0+math.max(q.r.velocity_right(0)*-20,0)", 0]
},
"arm_right": {
"rotation": [0, "0+math.min(q.r.input_right(0)*-20,0)", 0]
"rotation": [0, "0+math.min(q.r.velocity_right(0)*-20,0)", 0]
},
"arm_right2": {
"rotation": [0, "0+math.min(q.r.input_right(0)*-20,0)", 0]
"rotation": [0, "0+math.min(q.r.velocity_right(0)*-20,0)", 0]
}
}
},
@@ -2873,6 +2873,16 @@
}
}
},
"locator_hand_primary": {
"position": {
"0.0": [0, 0, 0],
"0.8333": [0, 0, 0],
"0.875": [-1, 0, 0],
"1.875": [-1, 0, 0],
"1.9167": [0, 0, 0],
"3.0": [0, 0, 0]
}
},
"finger_ring_right": {
"rotation": {
"0.0": {
@@ -5129,6 +5139,16 @@
"lerp_mode": "catmullrom"
}
}
},
"locator_mouth": {
"position": {
"0.0": [0, 0, 0],
"0.875": [0, 0, 0],
"0.9167": [0, 5, -1],
"2.375": [0, 5, -1],
"2.4167": [0, 0, 0],
"3.0": [0, 0, 0]
}
}
}
},
@@ -10801,169 +10821,358 @@
"chest_eyes_light": {
"scale": {
"1.0417": [0, 0, 0],
"1.0833": {"pre": [0, 0, 0], "post": [1, 1, 1]},
"1.0833": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
},
"1.2917": [1, 1, 1],
"1.3333": {"pre": [1, 1, 1], "post": [0, 0, 0]},
"1.3333": {
"pre": [1, 1, 1],
"post": [0, 0, 0]
},
"1.5": [0, 0, 0],
"1.5417": {"pre": [0, 0, 0], "post": [1, 1, 1]},
"1.5417": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
},
"1.7083": [1, 1, 1],
"1.75": {"pre": [1, 1, 1], "post": [0, 0, 0]},
"1.75": {
"pre": [1, 1, 1],
"post": [0, 0, 0]
},
"1.8333": [0, 0, 0],
"1.875": {"pre": [0, 0, 0], "post": [1, 1, 1]},
"1.875": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
},
"1.9583": [1, 1, 1],
"2.0": {"pre": [1, 1, 1], "post": [0, 0, 0]},
"2.0": {
"pre": [1, 1, 1],
"post": [0, 0, 0]
},
"2.0417": [0, 0, 0],
"2.0833": {"pre": [0, 0, 0], "post": [1, 1, 1]}
"2.0833": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
}
}
},
"chest_jaw_light": {
"scale": {
"1.0417": [0, 0, 0],
"1.0833": {"pre": [0, 0, 0], "post": [1, 1, 1]},
"1.0833": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
},
"1.2917": [1, 1, 1],
"1.3333": {"pre": [1, 1, 1], "post": [0, 0, 0]},
"1.3333": {
"pre": [1, 1, 1],
"post": [0, 0, 0]
},
"1.5": [0, 0, 0],
"1.5417": {"pre": [0, 0, 0], "post": [1, 1, 1]},
"1.5417": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
},
"1.7083": [1, 1, 1],
"1.75": {"pre": [1, 1, 1], "post": [0, 0, 0]},
"1.75": {
"pre": [1, 1, 1],
"post": [0, 0, 0]
},
"1.8333": [0, 0, 0],
"1.875": {"pre": [0, 0, 0], "post": [1, 1, 1]},
"1.875": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
},
"1.9583": [1, 1, 1],
"2.0": {"pre": [1, 1, 1], "post": [0, 0, 0]},
"2.0": {
"pre": [1, 1, 1],
"post": [0, 0, 0]
},
"2.0417": [0, 0, 0],
"2.0833": {"pre": [0, 0, 0], "post": [1, 1, 1]}
"2.0833": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
}
}
},
"arm_left1_light": {
"scale": {
"0.0": [0, 0, 0],
"1.0417": [0, 0, 0],
"1.0833": {"pre": [0, 0, 0], "post": [1, 1, 1]},
"1.0833": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
},
"1.2917": [1, 1, 1],
"1.3333": {"pre": [1, 1, 1], "post": [0, 0, 0]},
"1.3333": {
"pre": [1, 1, 1],
"post": [0, 0, 0]
},
"1.5": [0, 0, 0],
"1.5417": {"pre": [0, 0, 0], "post": [1, 1, 1]},
"1.5417": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
},
"1.7083": [1, 1, 1],
"1.75": {"pre": [1, 1, 1], "post": [0, 0, 0]},
"1.75": {
"pre": [1, 1, 1],
"post": [0, 0, 0]
},
"1.8333": [0, 0, 0],
"1.875": {"pre": [0, 0, 0], "post": [1, 1, 1]},
"1.875": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
},
"1.9583": [1, 1, 1],
"2.0": {"pre": [1, 1, 1], "post": [0, 0, 0]},
"2.0": {
"pre": [1, 1, 1],
"post": [0, 0, 0]
},
"2.0417": [0, 0, 0],
"2.0833": {"pre": [0, 0, 0], "post": [1, 1, 1]}
"2.0833": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
}
}
},
"arm_left1_light2": {
"scale": {
"0.0": [0, 0, 0],
"1.0417": [0, 0, 0],
"1.0833": {"pre": [0, 0, 0], "post": [1, 1, 1]},
"1.0833": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
},
"1.2917": [1, 1, 1],
"1.3333": {"pre": [1, 1, 1], "post": [0, 0, 0]},
"1.3333": {
"pre": [1, 1, 1],
"post": [0, 0, 0]
},
"1.5": [0, 0, 0],
"1.5417": {"pre": [0, 0, 0], "post": [1, 1, 1]},
"1.5417": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
},
"1.7083": [1, 1, 1],
"1.75": {"pre": [1, 1, 1], "post": [0, 0, 0]},
"1.75": {
"pre": [1, 1, 1],
"post": [0, 0, 0]
},
"1.8333": [0, 0, 0],
"1.875": {"pre": [0, 0, 0], "post": [1, 1, 1]},
"1.875": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
},
"1.9583": [1, 1, 1],
"2.0": {"pre": [1, 1, 1], "post": [0, 0, 0]},
"2.0": {
"pre": [1, 1, 1],
"post": [0, 0, 0]
},
"2.0417": [0, 0, 0],
"2.0833": {"pre": [0, 0, 0], "post": [1, 1, 1]}
"2.0833": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
}
}
},
"arm_right1_light": {
"scale": {
"0.0": [0, 0, 0],
"1.0417": [0, 0, 0],
"1.0833": {"pre": [0, 0, 0], "post": [1, 1, 1]},
"1.0833": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
},
"1.2917": [1, 1, 1],
"1.3333": {"pre": [1, 1, 1], "post": [0, 0, 0]},
"1.3333": {
"pre": [1, 1, 1],
"post": [0, 0, 0]
},
"1.5": [0, 0, 0],
"1.5417": {"pre": [0, 0, 0], "post": [1, 1, 1]},
"1.5417": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
},
"1.7083": [1, 1, 1],
"1.75": {"pre": [1, 1, 1], "post": [0, 0, 0]},
"1.75": {
"pre": [1, 1, 1],
"post": [0, 0, 0]
},
"1.8333": [0, 0, 0],
"1.875": {"pre": [0, 0, 0], "post": [1, 1, 1]},
"1.875": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
},
"1.9583": [1, 1, 1],
"2.0": {"pre": [1, 1, 1], "post": [0, 0, 0]},
"2.0": {
"pre": [1, 1, 1],
"post": [0, 0, 0]
},
"2.0417": [0, 0, 0],
"2.0833": {"pre": [0, 0, 0], "post": [1, 1, 1]}
"2.0833": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
}
}
},
"arm_right1_light2": {
"scale": {
"0.0": [0, 0, 0],
"1.0417": [0, 0, 0],
"1.0833": {"pre": [0, 0, 0], "post": [1, 1, 1]},
"1.0833": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
},
"1.2917": [1, 1, 1],
"1.3333": {"pre": [1, 1, 1], "post": [0, 0, 0]},
"1.3333": {
"pre": [1, 1, 1],
"post": [0, 0, 0]
},
"1.5": [0, 0, 0],
"1.5417": {"pre": [0, 0, 0], "post": [1, 1, 1]},
"1.5417": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
},
"1.7083": [1, 1, 1],
"1.75": {"pre": [1, 1, 1], "post": [0, 0, 0]},
"1.75": {
"pre": [1, 1, 1],
"post": [0, 0, 0]
},
"1.8333": [0, 0, 0],
"1.875": {"pre": [0, 0, 0], "post": [1, 1, 1]},
"1.875": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
},
"1.9583": [1, 1, 1],
"2.0": {"pre": [1, 1, 1], "post": [0, 0, 0]},
"2.0": {
"pre": [1, 1, 1],
"post": [0, 0, 0]
},
"2.0417": [0, 0, 0],
"2.0833": {"pre": [0, 0, 0], "post": [1, 1, 1]}
"2.0833": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
}
}
},
"head_light": {
"scale": {
"0.0": [0, 0, 0],
"1.0417": [0, 0, 0],
"1.0833": {"pre": [0, 0, 0], "post": [1, 1, 1]},
"1.0833": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
},
"1.2917": [1, 1, 1],
"1.3333": {"pre": [1, 1, 1], "post": [0, 0, 0]},
"1.3333": {
"pre": [1, 1, 1],
"post": [0, 0, 0]
},
"1.5": [0, 0, 0],
"1.5417": {"pre": [0, 0, 0], "post": [1, 1, 1]},
"1.5417": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
},
"1.7083": [1, 1, 1],
"1.75": {"pre": [1, 1, 1], "post": [0, 0, 0]},
"1.75": {
"pre": [1, 1, 1],
"post": [0, 0, 0]
},
"1.8333": [0, 0, 0],
"1.875": {"pre": [0, 0, 0], "post": [1, 1, 1]},
"1.875": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
},
"1.9583": [1, 1, 1],
"2.0": {"pre": [1, 1, 1], "post": [0, 0, 0]},
"2.0": {
"pre": [1, 1, 1],
"post": [0, 0, 0]
},
"2.0417": [0, 0, 0],
"2.0833": {"pre": [0, 0, 0], "post": [1, 1, 1]}
"2.0833": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
}
}
},
"crown_light": {
"scale": {
"0.0": [0, 0, 0],
"1.0417": [0, 0, 0],
"1.0833": {"pre": [0, 0, 0], "post": [1, 1, 1]},
"1.0833": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
},
"1.2917": [1, 1, 1],
"1.3333": {"pre": [1, 1, 1], "post": [0, 0, 0]},
"1.3333": {
"pre": [1, 1, 1],
"post": [0, 0, 0]
},
"1.5": [0, 0, 0],
"1.5417": {"pre": [0, 0, 0], "post": [1, 1, 1]},
"1.5417": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
},
"1.7083": [1, 1, 1],
"1.75": {"pre": [1, 1, 1], "post": [0, 0, 0]},
"1.75": {
"pre": [1, 1, 1],
"post": [0, 0, 0]
},
"1.8333": [0, 0, 0],
"1.875": {"pre": [0, 0, 0], "post": [1, 1, 1]},
"1.875": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
},
"1.9583": [1, 1, 1],
"2.0": {"pre": [1, 1, 1], "post": [0, 0, 0]},
"2.0": {
"pre": [1, 1, 1],
"post": [0, 0, 0]
},
"2.0417": [0, 0, 0],
"2.0833": {"pre": [0, 0, 0], "post": [1, 1, 1]}
"2.0833": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
}
}
},
"torso_jaw_light": {
"scale": {
"1.0417": [0, 0, 0],
"1.0833": {"pre": [0, 0, 0], "post": [1, 1, 1]},
"1.0833": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
},
"1.2917": [1, 1, 1],
"1.3333": {"pre": [1, 1, 1], "post": [0, 0, 0]},
"1.3333": {
"pre": [1, 1, 1],
"post": [0, 0, 0]
},
"1.5": [0, 0, 0],
"1.5417": {"pre": [0, 0, 0], "post": [1, 1, 1]},
"1.5417": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
},
"1.7083": [1, 1, 1],
"1.75": {"pre": [1, 1, 1], "post": [0, 0, 0]},
"1.75": {
"pre": [1, 1, 1],
"post": [0, 0, 0]
},
"1.8333": [0, 0, 0],
"1.875": {"pre": [0, 0, 0], "post": [1, 1, 1]},
"1.875": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
},
"1.9583": [1, 1, 1],
"2.0": {"pre": [1, 1, 1], "post": [0, 0, 0]},
"2.0": {
"pre": [1, 1, 1],
"post": [0, 0, 0]
},
"2.0417": [0, 0, 0],
"2.0833": {"pre": [0, 0, 0], "post": [1, 1, 1]}
"2.0833": {
"pre": [0, 0, 0],
"post": [1, 1, 1]
}
}
},
"torso": {
@@ -11090,11 +11299,20 @@
"lerp_mode": "catmullrom"
},
"1.6667": [0, 5.5, 0],
"1.7083": {"pre": [0, 5.5, 0], "post": [0, -5, 0]},
"1.7083": {
"pre": [0, 5.5, 0],
"post": [0, -5, 0]
},
"1.9583": [0, 5.5, 0],
"2.0": {"pre": [0, 5.5, 0], "post": [0, -5, 0]},
"2.0": {
"pre": [0, 5.5, 0],
"post": [0, -5, 0]
},
"2.0833": [0, 5.5, 0],
"2.125": {"pre": [0, 5.5, 0], "post": [0, -5, 0]},
"2.125": {
"pre": [0, 5.5, 0],
"post": [0, -5, 0]
},
"2.2083": [0, 5.5, 0]
},
"scale": {
@@ -11338,30 +11556,54 @@
"face_neutral": {
"position": {
"0.0417": [0, 0, 0],
"0.0833": {"pre": [0, 0, 0], "post": [0, 0, 6]}
"0.0833": {
"pre": [0, 0, 0],
"post": [0, 0, 6]
}
}
},
"face_angry": {
"position": {
"1.375": [0, 0, 0],
"1.4167": {"pre": [0, 0, 0], "post": [0, 0, -6]}
"1.4167": {
"pre": [0, 0, 0],
"post": [0, 0, -6]
}
}
},
"face_unamused": {
"position": {
"0.4583": [0, 0, 0],
"0.5": {"pre": [0, 0, 0], "post": [0, 0, -6]},
"0.5": {
"pre": [0, 0, 0],
"post": [0, 0, -6]
},
"1.375": [0, 0, -6],
"1.4167": {"pre": [0, 0, -6], "post": [0, 0, 0]}
"1.4167": {
"pre": [0, 0, -6],
"post": [0, 0, 0]
}
}
},
"face_shock": {
"position": {
"0.0": [0, 0, 0],
"0.0417": {"pre": [0, 0, 0], "post": [0, 0, 0]},
"0.0833": {"pre": [0, 0, 0], "post": [0, 0, -6]},
"0.4583": {"pre": [0, 0, -6], "post": [0, 0, -6]},
"0.5": {"pre": [0, 0, -6], "post": [0, 0, 0]}
"0.0417": {
"pre": [0, 0, 0],
"post": [0, 0, 0]
},
"0.0833": {
"pre": [0, 0, 0],
"post": [0, 0, -6]
},
"0.4583": {
"pre": [0, 0, -6],
"post": [0, 0, -6]
},
"0.5": {
"pre": [0, 0, -6],
"post": [0, 0, 0]
}
}
},
"neck_ornament_left1": {
@@ -13130,6 +13372,12 @@
},
"chest_eyes_light": {
"scale": 0
},
"chest_jaw_light": {
"scale": 0
},
"torso_jaw_light": {
"scale": 0
}
}
},
@@ -0,0 +1,286 @@
{
"format_version": "1.8.0",
"animations": {
"animation.throh.ground_idle": {
"loop": true,
"bones": {
"torso": {
"rotation": [0, 2.5, 0]
},
"chest": {
"rotation": [2.5, 0, 0]
},
"arm_left": {
"rotation": [10, 0, 0]
},
"arm_left_rotation": {
"rotation": [-0.44067, 9.99038, 39.96148]
},
"arm_left2": {
"rotation": [0, 27.5, 0]
},
"hand_left": {
"rotation": [1.33781, 14.94159, 5.17544]
},
"finger_back_left": {
"rotation": [-2.3273, -24.89837, 5.51385]
},
"finger_back_left2": {
"rotation": [0, 25, 0]
},
"finger_middle_left": {
"rotation": [0, 0, -35]
},
"finger_middle_left2": {
"rotation": [0, 0, 17.5]
},
"finger_front_left": {
"rotation": [14.47281, 32.60072, 18.55513]
},
"finger_front_left2": {
"rotation": [0, -17.5, 0]
},
"leg_left": {
"rotation": [-1.5, -6.5, -5]
},
"leg_left2": {
"rotation": [5, 0, 0]
},
"leg_right": {
"rotation": [-1.5, 6.5, 5]
},
"arm_right": {
"rotation": [10, 0, 0]
},
"arm_right_rotation": {
"rotation": [-0.44067, -9.99038, -39.96148]
},
"arm_right2": {
"rotation": [0, -27.5, 0]
},
"hand_right": {
"rotation": [1.33781, -14.94159, -5.17544]
},
"finger_back_right": {
"rotation": [-2.3273, 24.89837, -5.51385]
},
"finger_back_right2": {
"rotation": [0, -25, 0]
},
"finger_middle_right2": {
"rotation": [0, 0, -17.5]
},
"finger_front_right": {
"rotation": [14.47281, -32.60072, -18.55513]
},
"finger_front_right2": {
"rotation": [0, 17.5, 0]
},
"head": {
"rotation": [0, -2.5, 0]
},
"foot_left": {
"rotation": [-3, 0, 5],
"position": [0, 0.5, 0]
},
"leg_right2": {
"rotation": [5, 0, 0]
},
"foot_right": {
"rotation": [-3, 0, -5],
"position": [0, 0.5, 0]
},
"body": {
"position": [0, -0.8, 0]
},
"belt_left2": {
"rotation": [5, 0, 5]
},
"belt_right": {
"rotation": [-7.5, 0, 0]
},
"belt_right2": {
"rotation": [5, 0, -5]
},
"finger_middle_right": {
"rotation": [0, 0, 35]
},
"belt_left": {
"rotation": [-5, 0, 0]
}
}
},
"animation.throh.battle_idle": {
"loop": true,
"bones": {
"torso": {
"rotation": [0, 2.5, 0]
},
"chest": {
"rotation": [0, 0, 0]
},
"arm_left": {
"rotation": [-17.5, 0, 0]
},
"arm_left_rotation": {
"rotation": [0, 0, 5]
},
"arm_left2": {
"rotation": [0, 65, 0]
},
"hand_left": {
"rotation": [2.66399, 14.76689, 10.34527]
},
"finger_back_left": {
"rotation": [0, -25, 0]
},
"finger_back_left2": {
"rotation": [0, 25, 0]
},
"finger_middle_left": {
"rotation": [0, 0, -35]
},
"finger_middle_left2": {
"rotation": [0, 0, 17.5]
},
"finger_front_left": {
"rotation": [11.28582, 33.71632, 12.73216]
},
"finger_front_left2": {
"rotation": [0, -17.5, 0]
},
"legs": {
"rotation": [0, 10, 0]
},
"leg_left": {
"rotation": [2, -12.5, -11]
},
"leg_left2": {
"rotation": [5, 0, 0]
},
"leg_right": {
"rotation": [0, 5, 10]
},
"arm_right": {
"rotation": [-15, 0, 0]
},
"arm_right_rotation": {
"rotation": [0, 0, -45]
},
"arm_right2": {
"rotation": [0, -42.5, 0]
},
"hand_right": {
"rotation": [0, -17.5, 0]
},
"finger_back_right": {
"rotation": [0, 25, 0]
},
"finger_back_right2": {
"rotation": [0, -20, 0]
},
"finger_middle_right2": {
"rotation": [0, 0, -30]
},
"finger_front_right": {
"rotation": [11.28582, -33.71632, -12.73216]
},
"finger_front_right2": {
"rotation": [0, 17.5, 0]
},
"head": {
"rotation": [0, -2.5, 0]
},
"foot_left": {
"rotation": [-4.5, 0, 10.5],
"position": [0, 0.6, 0]
},
"leg_right2": {
"rotation": [5, 0, 0]
},
"foot_right": {
"rotation": [-3.5, 0, -9.5],
"position": [0, 0.6, 0]
},
"body": {
"position": [0, -1, 0]
},
"belt_left2": {
"rotation": [5, 0, 5]
},
"belt_right": {
"rotation": [-7.5, 0, 0]
},
"belt_right2": {
"rotation": [5, 0, -5]
},
"finger_middle_right": {
"rotation": [0, 0, 35]
},
"belt_left": {
"rotation": [-5, 0, 0]
}
}
},
"animation.throh.blink": {
"animation_length": 0.1667,
"bones": {
"eyelid_left": {
"position": {
"0.0": [0, 0, -0.1],
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"eyelid_right": {
"position": {
"0.0": [0, 0, -0.1],
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"eye_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]}
}
},
"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.throh.ditto_face": {
"loop": true,
"bones": {
"eyes": {
"position": [0, 0, 0.1]
},
"face_ditto": {
"position": [0, 0, -0.1]
}
}
},
"animation.throh.cry": {
"animation_length": 1.25,
"sound_effects": {
"0.0417": {
"effect": "pokemon.throh.cry"
}
}
}
}
}
@@ -0,0 +1,322 @@
{
"format_version": "1.8.0",
"animations": {
"animation.sawk.ground_idle": {
"loop": true,
"bones": {
"body": {
"position": [0, -1.7, 0]
},
"torso": {
"rotation": [2.5, 0, 0]
},
"robe_back": {
"rotation": [2.5, 0, 0]
},
"robe_left": {
"rotation": [0, 0, -22.5]
},
"robe_right": {
"rotation": [0, 0, 22.5]
},
"belt_left": {
"rotation": [-2.5, 0, -5]
},
"belt_left2": {
"rotation": [2.45177, 0.08843, 7.02123]
},
"belt_right": {
"rotation": [-2.5, 0, 5]
},
"belt_right2": {
"rotation": [2.45177, -0.08843, -7.02123]
},
"chest": {
"rotation": [0, 0, 0]
},
"arm_left": {
"rotation": [-2.35666, -17.34551, 62.85952]
},
"arm_left2": {
"rotation": [0, 40, 0]
},
"hand_left": {
"rotation": [0.44067, 9.99038, 2.53852]
},
"finger_back_left": {
"rotation": [-6.46066, -13.56626, 25.76926]
},
"finger_back_left2": {
"rotation": [0, 0, 27.5]
},
"finger_front_left": {
"rotation": [2.26708, 7.15102, 17.64168]
},
"finger_front_left2": {
"rotation": [0, 0, 25]
},
"thumb_left": {
"rotation": [19.52546, 35.63104, 31.32977]
},
"thumb_left2": {
"rotation": [0, -35, 0]
},
"arm_right": {
"rotation": [-2.35666, 17.34551, -62.85952]
},
"arm_right2": {
"rotation": [0, -40, 0]
},
"hand_right": {
"rotation": [0.44067, -9.99038, -2.53852]
},
"finger_back_right": {
"rotation": [-6.46066, 13.56626, -25.76926]
},
"finger_back_right2": {
"rotation": [0, 0, -27.5]
},
"finger_front_right": {
"rotation": [2.26708, -7.15102, -17.64168]
},
"finger_front_right2": {
"rotation": [0, 0, -25]
},
"thumb_right": {
"rotation": [19.52546, -35.63104, -31.32977]
},
"thumb_right2": {
"rotation": [0, 35, 0]
},
"leg_left": {
"rotation": [-13.5, -18.75, -5],
"position": [-0.15, 0, 0]
},
"leg_left2": {
"rotation": [25, 0, 0]
},
"foot_left": {
"rotation": [-10, 0, 5]
},
"leg_right": {
"rotation": [-13.5, 18.75, 5],
"position": [0.15, 0, 0]
},
"leg_right2": {
"rotation": [25, 0, 0]
},
"foot_right": {
"rotation": [-10, 0, -5]
},
"head": {
"rotation": [2, 0, 0]
}
}
},
"animation.sawk.battle_idle": {
"loop": true,
"bones": {
"body": {
"rotation": [0, -25, 0],
"position": [0, -7.75, 0]
},
"torso": {
"rotation": [2, -12.5, 2.5],
"position": [0, 0, -0.5]
},
"robe_front": {
"rotation": [-2.5, 0, 0]
},
"robe_left": {
"rotation": [0, 0, -57.5]
},
"robe_right": {
"rotation": [0, 0, 45]
},
"belt_left": {
"rotation": [-2.5, 0, -5]
},
"belt_left2": {
"rotation": [0, 0, 7.5]
},
"belt_right": {
"rotation": [-5, 0, 0]
},
"belt_right2": {
"rotation": [0, 0, -10]
},
"chest": {
"rotation": [3.5, -1.5, -5.5]
},
"arm_left": {
"rotation": [33.37349, 23.33783, 39.65943]
},
"arm_left2": {
"rotation": [0, 85, 0]
},
"hand_left": {
"rotation": [-17.5, 0, 17.5],
"position": [0, 0, -1]
},
"finger_back_left": {
"rotation": [-1.6575, -12.39135, 65.17995]
},
"finger_back_left2": {
"rotation": [0, 0, 77.5]
},
"finger_front_left": {
"rotation": [0, 0, 47.5]
},
"finger_front_left2": {
"rotation": [0, 0, 67.5]
},
"thumb_left": {
"rotation": [0, 12.5, 50]
},
"thumb_left2": {
"rotation": [0, -75, 0]
},
"leg_left": {
"rotation": [-56.5, -73.5, -13],
"position": [0, 0, 1]
},
"leg_left2": {
"rotation": [65.5, 0, 0]
},
"leg_right": {
"rotation": [-70, 45, 0]
},
"leg_right2": {
"rotation": [57.5, 0, 0]
},
"arm_right": {
"rotation": [-35.13942, -12.52777, -43.0439]
},
"arm_right2": {
"rotation": [-7.97707, -72.32584, 8.25248]
},
"finger_back_right": {
"rotation": [-6.03887, 13.82381, -20.54269]
},
"finger_front_right": {
"rotation": [3.22206, -27.28953, -8.41338]
},
"finger_front_right2": {
"rotation": [0, 0, -2.5]
},
"thumb_right": {
"rotation": [0, -65, 0]
},
"thumb_right2": {
"rotation": [0, 15, 0]
},
"wrist_right": {
"rotation": [-20.5421, -26.64464, 41.49118]
},
"wrist_left": {
"rotation": [-87.5, 0, 0]
},
"foot_left": {
"rotation": [3.5, 0, 4],
"position": [0, 0.5, 0]
},
"hand_right": {
"rotation": [7.5, 10, 0]
},
"finger_back_right2": {
"rotation": [0, 0, -17.5]
},
"foot_right": {
"rotation": [12.5, 0, 0],
"position": [0, 0.7, -0.25]
},
"head": {
"rotation": [-1, 40, -1.5]
}
}
},
"animation.sawk.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]
}
}
}
}
},
"animation.sawk.ditto_face": {
"loop": true,
"bones": {
"eyes": {
"position": [0, 0, 0.1],
"scale": 0
},
"eyebrow_right": {
"position": [0, 0, 0.1],
"scale": 0
},
"face_ditto": {
"position": [0, 0, -0.1]
}
}
},
"animation.sawk.cry": {
"animation_length": 1.25,
"sound_effects": {
"0.0417": {
"effect": "pokemon.sawk.cry"
}
}
}
}
}
@@ -4,40 +4,101 @@
"animation.cottonee.ground_idle": {
"loop": true,
"bones": {
"left_wing2": {
"rotation": [0, 0, -25]
"wing_left2": {
"rotation": [0, 0, -15]
},
"right_wing2": {
"rotation": [0, 0, 25]
"wing_right2": {
"rotation": [0, 0, 15]
},
"nimbus_top": {
"position": [0, -0.15, 0]
},
"wing_left": {
"rotation": [0, 0, 5]
},
"wing_right": {
"rotation": [0, 0, -5]
}
}
},
"animation.cottonee.blink": {
"animation_length": 0.1667,
"bones": {
"eyelid_right": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": [0, 0, -0.1],
"0.1667": [0, 0, 0]
}
},
"eyelid_left": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": [0, 0, -0.1],
"0.1667": [0, 0, 0]
"0.1667": {
"pre": [0, 0, -0.1],
"post": [0, 0, 0]
}
}
},
"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]
}
}
},
"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.cottonee.cry": {
"animation_length": 0.70833,
"animation_length": 0.7083,
"sound_effects": {
"0.0417": {
"effect": "pokemon.cottonee.cry"
}
}
},
"animation.cottonee.ditto_face": {
"loop": true,
"bones": {
"eyes": {
"position": [0, 0, 0.1],
"scale": 0
},
"face_ditto": {
"position": [0, 0, -0.1]
}
}
}
}
}
@@ -11,100 +11,93 @@
"rotation": [5, 0, 0]
},
"head": {
"rotation": [-5, 0, 0]
"rotation": [-7.5, 0, 0]
},
"arm_right": {
"rotation": [0, -20, -47.5]
"rotation": [0, -10, -40]
},
"arm_left": {
"rotation": [0, 20, 47.5]
"rotation": [0, 10, 40]
},
"leg_left": {
"rotation": [11, 0, 0]
},
"leg_right": {
"rotation": [11, 0, 0]
},
"body": {
"position": [0, 0, -0.5]
}
}
},
"animation.whimsicott.blink": {
"animation_length": 0.16667,
"animation_length": 0.1667,
"bones": {
"eyelid_right": {
"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_right": {
"position": {
"0.0": [0, 0, 0.1],
"0.1667": {
"pre": [0, 0, 0.1],
"post": [0, 0, 0]
}
}
},
"eyes_closed_ditto": {
"position": {
"0.0": [0, 0, -0.1],
"0.1667": {
"pre": [0, 0, -0.1],
"post": [0, 0, 0]
}
}
},
"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.125": [0, 0, -0.1],
"0.1667": [0, 0, 0]
"0.1667": {
"pre": [0, 0, -0.1],
"post": [0, 0, 0]
}
}
}
}
},
"animation.whimsicott.cry": {
"animation_length": 1.16667,
"bones": {
"neck": {
"rotation": {
"0.0": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"0.1667": {
"post": [-7.5, 0, 0],
"lerp_mode": "catmullrom"
},
"0.5": {
"post": [-7.5, 0, 0],
"lerp_mode": "catmullrom"
},
"1.1667": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
}
}
},
"head": {
"rotation": {
"0.0": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"0.1667": {
"post": [-7.5, 0, 0],
"lerp_mode": "catmullrom"
},
"0.5": {
"post": [-7.5, 0, 0],
"lerp_mode": "catmullrom"
},
"1.1667": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
}
}
},
"mouth_closed": {
"position": {
"0.0": [0, 0, 0],
"0.0833": [0, 0, 0.1],
"0.9167": [0, 0, 0.1],
"1.0": [0, 0, 0]
}
},
"mouth_open": {
"position": {
"0.0": [0, 0, 0],
"0.0833": [0, 0, -0.1],
"0.9167": [0, 0, -0.1],
"1.0": [0, 0, 0]
}
}
},
"animation_length": 1.0417,
"sound_effects": {
"0.0833": {
"effect": "pokemon.whimsicott.cry"
}
}
},
"animation.whimsicott.ditto_face": {
"loop": true,
"bones": {
"face": {
"position": [0, 0, 1]
},
"face_ditto": {
"position": [0, 0, -0.1]
}
}
}
}
}
@@ -195,18 +195,37 @@
"eyelid_right": {
"position": {
"0.0": [-0.1, 0, -0.1],
"0.125": {"pre": [-0.1, 0, -0.1], "post": [-0.1, 0, -0.1]},
"0.1667": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]}
"0.125": {
"pre": [-0.1, 0, -0.1],
"post": [-0.1, 0, -0.1]
},
"0.1667": {
"pre": [-0.1, 0, -0.1],
"post": [0, 0, 0]
}
}
},
"eyelid_left": {
"position": {
"0.0": [0.1, 0, -0.1],
"0.125": {"pre": [0.1, 0, -0.1], "post": [0.1, 0, -0.1]},
"0.1667": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]}
"0.125": {
"pre": [0.1, 0, -0.1],
"post": [0.1, 0, -0.1]
},
"0.1667": {
"pre": [0.1, 0, -0.1],
"post": [0, 0, 0]
}
}
}
}
},
"animation.ducklett.cry": {
"sound_effects": {
"0.1667": {
"effect": "pokemon.ducklett.cry"
}
}
}
}
}
@@ -402,15 +402,27 @@
"eyelid_right": {
"position": {
"0.0": [-0.1, 0, -0.1],
"0.125": {"pre": [-0.1, 0, -0.1], "post": [-0.1, 0, -0.1]},
"0.1667": {"pre": [-0.1, 0, -0.1], "post": [0, 0, 0]}
"0.125": {
"pre": [-0.1, 0, -0.1],
"post": [-0.1, 0, -0.1]
},
"0.1667": {
"pre": [-0.1, 0, -0.1],
"post": [0, 0, 0]
}
}
},
"eyelid_left": {
"position": {
"0.0": [0.1, 0, -0.1],
"0.125": {"pre": [0.1, 0, -0.1], "post": [0.1, 0, -0.1]},
"0.1667": {"pre": [0.1, 0, -0.1], "post": [0, 0, 0]}
"0.125": {
"pre": [0.1, 0, -0.1],
"post": [0.1, 0, -0.1]
},
"0.1667": {
"pre": [0.1, 0, -0.1],
"post": [0, 0, 0]
}
}
}
}
@@ -443,6 +455,13 @@
"scale": 0
}
}
},
"animation.swanna.cry": {
"sound_effects": {
"0.1667": {
"effect": "pokemon.swanna.cry"
}
}
}
}
}
@@ -131,46 +131,34 @@
}
},
"animation.ferroseed.blink": {
"animation_length": 0.16667,
"animation_length": 0.1667,
"bones": {
"pupil_open_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]
}
"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]
}
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"pupil_open_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]
}
"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]
}
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
}
}
@@ -182,80 +170,44 @@
"position": {
"0.0": [0, 0, 0.1],
"0.0417": [0, 0, 0.1],
"0.0833": {
"pre": [0, 0, 0.1],
"post": [0, 0, 0]
},
"0.0833": {"pre": [0, 0, 0.1], "post": [0, 0, 0]},
"0.5833": [0, 0, 0],
"0.625": {
"pre": [0, 0, 0],
"post": [0, 0, 0.1]
},
"0.625": {"pre": [0, 0, 0], "post": [0, 0, 0.1]},
"0.6667": [0, 0, 0.1],
"0.7083": {
"pre": [0, 0, 0.1],
"post": [0, 0, 0]
}
"0.7083": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"pupil_closed_left": {
"position": {
"0.0": [0, 0, -0.1],
"0.0417": [0, 0, -0.1],
"0.0833": {
"pre": [0, 0, -0.1],
"post": [0, 0, 0]
},
"0.0833": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"0.5833": [0, 0, 0],
"0.625": {
"pre": [0, 0, 0],
"post": [0, 0, -0.1]
},
"0.625": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"0.6667": [0, 0, -0.1],
"0.7083": {
"pre": [0, 0, -0.1],
"post": [0, 0, 0]
}
"0.7083": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"pupil_open_right": {
"position": {
"0.0": [0, 0, 0.1],
"0.0417": [0, 0, 0.1],
"0.0833": {
"pre": [0, 0, 0.1],
"post": [0, 0, 0]
},
"0.0833": {"pre": [0, 0, 0.1], "post": [0, 0, 0]},
"0.5833": [0, 0, 0],
"0.625": {
"pre": [0, 0, 0],
"post": [0, 0, 0.1]
},
"0.625": {"pre": [0, 0, 0], "post": [0, 0, 0.1]},
"0.6667": [0, 0, 0.1],
"0.7083": {
"pre": [0, 0, 0.1],
"post": [0, 0, 0]
}
"0.7083": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"pupil_closed_right": {
"position": {
"0.0": [0, 0, -0.1],
"0.0417": [0, 0, -0.1],
"0.0833": {
"pre": [0, 0, -0.1],
"post": [0, 0, 0]
},
"0.0833": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"0.5833": [0, 0, 0],
"0.625": {
"pre": [0, 0, 0],
"post": [0, 0, -0.1]
},
"0.625": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"0.6667": [0, 0, -0.1],
"0.7083": {
"pre": [0, 0, -0.1],
"post": [0, 0, 0]
}
"0.7083": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"body": {
@@ -288,6 +240,81 @@
"effect": "pokemon.ferroseed.cry"
}
}
},
"animation.ferroseed.shock": {
"loop": true,
"bones": {
"pupil_open_left": {
"position": [0, -0.25, 0],
"scale": [0.6, 0.6, 1]
},
"pupil_open_right": {
"position": [0, -0.25, 0],
"scale": [0.6, 0.6, 1]
}
}
},
"animation.ferroseed.angry": {
"loop": true,
"bones": {
"eye_expression_left": {
"position": [-0.25, -0.25, -0.1],
"scale": [0.5, 0.5, 1]
},
"eye_expression_right": {
"position": [0.25, -0.25, -0.1],
"scale": [0.5, 0.5, 1]
}
}
},
"animation.ferroseed.sad": {
"loop": true,
"bones": {
"eye_expression_left": {
"position": [0.25, -0.15, -0.1],
"scale": [0.5, 0.3, 1]
},
"eye_expression_right": {
"position": [-0.25, -0.15, -0.1],
"scale": [0.5, 0.3, 1]
}
}
},
"animation.ferroseed.happy": {
"loop": true,
"bones": {
"pupil_open_left": {
"position": [0, 0, 0.1]
},
"pupil_happy_left": {
"position": [0, 0, -0.1]
},
"pupil_open_right": {
"position": [0, 0, 0.1]
},
"pupil_happy_right": {
"position": [0, 0, -0.1]
}
}
},
"animation.ferroseed.hurt": {
"loop": true,
"bones": {
"pupil_open_left": {
"position": [0, 0, 0.1]
},
"pupil_closed_left": {
"rotation": [-6, 0, -20],
"position": [0, 0, -0.11]
},
"pupil_open_right": {
"position": [0, 0, 0.1]
},
"pupil_closed_right": {
"rotation": [-6, 0, 20],
"position": [0, 0, -0.11]
}
}
}
}
}
@@ -830,7 +830,7 @@
}
},
"animation.ferrothorn.blink": {
"animation_length": 0.16667,
"animation_length": 0.1667,
"bones": {
"pupil_open_left": {
"position": {
@@ -946,6 +946,79 @@
"effect": "pokemon.ferrothorn.cry"
}
}
},
"animation.ferrothorn.shock": {
"loop": true,
"bones": {
"pupil_open_left": {
"scale": [0.8, 0.4, 1]
},
"pupil_open_right": {
"scale": [0.8, 0.4, 1]
}
}
},
"animation.ferrothorn.angry": {
"loop": true,
"bones": {
"eye_expression_left": {
"position": [-0.3, 0.2, -0.1],
"scale": [0.6, 0.6, 1]
},
"eye_expression_right": {
"position": [0.3, 0.2, -0.1],
"scale": [0.6, 0.6, 1]
}
}
},
"animation.ferrothorn.sad": {
"loop": true,
"bones": {
"eye_expression_left": {
"position": [0.3, 0.25, -0.1],
"scale": [0.5, 0.5, 1]
},
"eye_expression_right": {
"position": [-0.3, 0.25, -0.1],
"scale": [0.5, 0.5, 1]
}
}
},
"animation.ferrothorn.happy": {
"loop": true,
"bones": {
"pupil_open_left": {
"position": [0, 0, 0.1]
},
"pupil_happy_left": {
"position": [0, 0, -0.2]
},
"pupil_open_right": {
"position": [0, 0, 0.1]
},
"pupil_happy_right": {
"position": [0, 0, -0.2]
}
}
},
"animation.ferrothorn.hurt": {
"loop": true,
"bones": {
"pupil_open_left": {
"position": [0, 0, 0.1]
},
"pupil_closed_left": {
"rotation": [0, 0, -25],
"position": [0, 0.25, -0.1]
},
"pupil_open_right": {
"position": [0, 0, 0.1]
},
"pupil_closed_right": {
"rotation": [0, 0, 25],
"position": [0, 0.25, -0.1]
}
}
}
}
}
@@ -0,0 +1,48 @@
{
"format_version": "1.8.0",
"animations": {
"animation.litleo.ground_idle": {
"loop": true,
"bones": {
"litleo": {
"scale": 1
},
"tail": {
"rotation": [27.5, 0, 0]
},
"tail2": {
"rotation": [22.5, 0, 0]
},
"tail_tip": {
"rotation": [22.5, 0, 0]
},
"ear_left": {
"rotation": [0, 0, 45]
},
"ear_right": {
"rotation": [0, 0, -45]
},
"foot_front_left_claws": {
"position": [0, 0, 2]
},
"foot_front_right_claws": {
"position": [0, 0, 2]
},
"foot_back_left_claws": {
"position": [0, 0, 2]
},
"foot_back_right_claws": {
"position": [0, 0, 2]
}
}
},
"animation.litleo.cry": {
"animation_length": 1.75,
"sound_effects": {
"0.0417": {
"effect": "pokemon.litleo.cry"
}
}
}
}
}
@@ -0,0 +1,142 @@
{
"format_version": "1.8.0",
"animations": {
"animation.pyroar_female.ground_idle": {
"loop": true,
"bones": {
"head_angle": {
"rotation": [-17.5, 0, 0]
},
"ear_left": {
"rotation": [0, 0, 45]
},
"tail": {
"rotation": [-22.5, 0, 0]
},
"leg_front_left": {
"rotation": [-7.5, 0, 5]
},
"tail2": {
"rotation": [-50, 0, 0]
},
"tail3": {
"rotation": [-37.5, 0, 0]
},
"tail4": {
"rotation": [55, 0, 0]
},
"tail5": {
"rotation": [52.18367, 4.29674, 1.53694]
},
"tail_ti2": {
"rotation": [27.5, 0, 0]
},
"tail_tip3": {
"rotation": [25, 0, 0]
},
"tail_fur": {
"rotation": [-45, 0, 0]
},
"ear_right": {
"rotation": [0, 0, -45]
},
"foot_front_left": {
"rotation": [0, 0, -5]
},
"leg_back_left": {
"rotation": [0, 0, -5]
},
"hair2": {
"rotation": [-20, 0, 0]
},
"hair3": {
"rotation": [-25, 0, 0]
},
"hair4": {
"rotation": [27.5, 0, 0]
},
"hair": {
"rotation": [10, 0, 0]
},
"hair5": {
"rotation": [15, 0, 0]
},
"hair6": {
"rotation": [5, 0, 0]
},
"hair7": {
"rotation": [-47.5, 0, 0]
},
"neckfur": {
"rotation": [-22.5, 0, 0]
},
"neckfur_right": {
"rotation": [0, 0, 15]
},
"neckfur_tip": {
"rotation": [-12.5, 0, 0]
},
"neckfur_tip2": {
"rotation": [-15, 0, 0]
},
"neckfur_left": {
"rotation": [0, 0, -15]
},
"foot_back_left": {
"rotation": [0, 0, 5]
},
"claws_front_left": {
"position": [0, 0, 2]
},
"leg_front_left2": {
"rotation": [7.5, 0, 0]
},
"claws_back_left": {
"position": [0, 0, 2]
},
"waist": {
"rotation": [10, 0, 0]
},
"torso": {
"rotation": [-7.5, 0, 0]
},
"torso2": {
"rotation": [-2.5, 0, 0]
},
"leg_front_right": {
"rotation": [5, 0, -5],
"position": [0, -0.25, 0]
},
"leg_front_right2": {
"rotation": [-5, 0, 0]
},
"foot_front_right": {
"rotation": [0, 0, 5]
},
"claws_front_right": {
"position": [0, 0, 2]
},
"leg_back_right": {
"rotation": [0, 0, 5]
},
"foot_back_right": {
"rotation": [0, 0, -5]
},
"claws_back_right": {
"position": [0, 0, 2]
},
"neck": {
"rotation": [25, 0, 0]
}
}
},
"animation.pyroar_female.cry": {
"animation_length": 1.75,
"sound_effects": {
"0.0417": {
"effect": "pokemon.pyroar.cry"
}
}
}
}
}
@@ -0,0 +1,139 @@
{
"format_version": "1.8.0",
"animations": {
"animation.pyroar_male.ground_idle": {
"loop": true,
"bones": {
"ear_left": {
"rotation": [0, 0, 45]
},
"tail": {
"rotation": [-22.5, 0, 0]
},
"leg_front_left": {
"rotation": [-7.5, 0, 5]
},
"tail2": {
"rotation": [-50, 0, 0]
},
"tail3": {
"rotation": [-37.5, 0, 0]
},
"tail4": {
"rotation": [55, 0, 0]
},
"tail5": {
"rotation": [52.18367, 4.29674, 1.53694]
},
"tail_tip2": {
"rotation": [27.5, 0, 0]
},
"tail_tip3": {
"rotation": [25, 0, 0]
},
"ear_right": {
"rotation": [0, 0, -45]
},
"foot_front_left": {
"rotation": [0, 0, -5]
},
"leg_back_left": {
"rotation": [0, 0, -5]
},
"hair2": {
"rotation": [-20, 0, 0]
},
"hair3": {
"rotation": [-25, 0, 0]
},
"hair4": {
"rotation": [27.5, 0, 0]
},
"hair": {
"rotation": [10, 0, 0]
},
"hair5": {
"rotation": [15, 0, 0]
},
"hair6": {
"rotation": [5, 0, 0]
},
"hair7": {
"rotation": [-47.5, 0, 0]
},
"neckfur": {
"rotation": [-22.5, 0, 0]
},
"neckfur_right": {
"rotation": [0, 0, 15]
},
"neckfur_tip": {
"rotation": [-12.5, 0, 0]
},
"neckfur_tip2": {
"rotation": [-15, 0, 0]
},
"neckfur_left": {
"rotation": [0, 0, -15]
},
"foot_back_left": {
"rotation": [0, 0, 5]
},
"claws_front_left": {
"position": [0, 0, 2]
},
"leg_front_left2": {
"rotation": [7.5, 0, 0]
},
"claws_back_left": {
"position": [0, 0, 2]
},
"waist": {
"rotation": [10, 0, 0]
},
"torso": {
"rotation": [-7.5, 0, 0]
},
"torso2": {
"rotation": [-2.5, 0, 0]
},
"neck": {
"rotation": [-2.5, 0, 0]
},
"leg_front_right": {
"rotation": [5, 0, -5],
"position": [0, -0.25, 0]
},
"leg_front_right2": {
"rotation": [-5, 0, 0]
},
"foot_front_right": {
"rotation": [0, 0, 5]
},
"claws_front_right": {
"position": [0, 0, 2]
},
"leg_back_right": {
"rotation": [0, 0, 5]
},
"foot_back_right": {
"rotation": [0, 0, -5]
},
"claws_back_right": {
"position": [0, 0, 2]
},
"mane_bottom2": {
"rotation": [-2.5, 0, 0]
}
}
},
"animation.pyroar_male.cry": {
"animation_length": 1.75,
"sound_effects": {
"0.0417": {
"effect": "pokemon.pyroar.cry"
}
}
}
}
}
@@ -0,0 +1,341 @@
{
"format_version": "1.8.0",
"animations": {
"animation.spritzee.ground_idle": {
"loop": true,
"bones": {
"tuft": {
"rotation": ["5+3*Math.cos((query.anim_time-0.75) * 90 * 2) *0.5", 10, 0]
},
"wing_left": {
"rotation": [-20, "-70+4*Math.cos((query.anim_time-0.5) * 90 * 2) *0.5", 15]
},
"wing_right": {
"rotation": [-20, "70-4*Math.cos((query.anim_time-0.5) * 90 * 2) *0.5", -15]
},
"body": {
"position": [0, -1, 0]
},
"hair_right": {
"rotation": [25, 0, 0]
},
"tuft_end": {
"rotation": ["15+2*Math.cos((query.anim_time-0.5) * 90 * 2) *0.5", -20, 0]
},
"fur_bottom_back": {
"rotation": [67.5, 0, 0]
},
"fur_bottom_left": {
"rotation": [0, 0, -60]
},
"fur_bottom_right": {
"rotation": [0, 0, 60]
},
"fur_bottom_front": {
"rotation": [-67.5, 0, 0]
},
"leg_right": {
"rotation": [0, 0, 5]
},
"leg_left": {
"rotation": [0, 0, -5]
},
"legs": {
"rotation": [-90, 0, 0],
"position": [0, -0.5, 1]
},
"hair_left": {
"rotation": [25, 0, 0]
},
"lash_left": {
"rotation": [0, -35, 0]
},
"lash_right": {
"rotation": [0, 35, 0]
},
"torso": {
"rotation": [
"3*Math.cos((query.anim_time-0) * 90 * 2) *0.5",
"3*Math.cos((query.anim_time-0.25) * 90 * 1) *0.5",
"3*Math.cos((query.anim_time-0) * 90 * 1) *0.5"
],
"position": [0, "0.2*Math.cos((query.anim_time-0.5) * 90 * 2) *0.5", 0]
}
}
},
"animation.spritzee.air_idle": {
"loop": true,
"bones": {
"body": {
"position": [0, 2, 0]
},
"hair_right": {
"rotation": [25, 0, 0]
},
"tuft_end": {
"rotation": [15, -20, 0]
},
"wing_left": {
"rotation": [0, 10, -7.5]
},
"wing_right": {
"rotation": [0, -10, 7.5]
},
"fur_bottom_back": {
"rotation": [45, 0, 0]
},
"fur_bottom_left": {
"rotation": [0, 0, -55]
},
"fur_bottom_right": {
"rotation": [0, 0, 55]
},
"fur_bottom_front": {
"rotation": [-50, 0, 0]
},
"leg_right": {
"rotation": [15, 0, 2.5]
},
"leg_left": {
"rotation": [15, 0, -2.5]
},
"hair_left": {
"rotation": [25, 0, 0]
},
"legs": {
"rotation": [-5, 0, 0]
},
"lash_left": {
"rotation": [0, -35, 0]
},
"lash_right": {
"rotation": [0, 35, 0]
}
}
},
"animation.spritzee.air_sleep": {
"loop": true,
"bones": {
"body": {
"rotation": [22.5, 0, 0],
"position": [0, 2, 0]
},
"hair_right": {
"rotation": [25, 0, 0]
},
"tuft_end": {
"rotation": [15, -20, 0]
},
"wing_left": {
"rotation": [-25, -45, 45]
},
"wing_right": {
"rotation": [-25, 45, -45]
},
"fur_bottom_back": {
"rotation": [45, 0, 0]
},
"fur_bottom_left": {
"rotation": [0, 0, -55]
},
"fur_bottom_right": {
"rotation": [0, 0, 55]
},
"fur_bottom_front": {
"rotation": [-50, 0, 0]
},
"leg_right": {
"rotation": [15, 0, 2.5]
},
"leg_left": {
"rotation": [15, 0, -2.5]
},
"hair_left": {
"rotation": [25, 0, 0]
},
"legs": {
"rotation": [-40, 0, 0]
},
"eye_left": {
"position": [0, 0, 0.1]
},
"lash_left": {
"rotation": [0, -35, 0]
},
"eyelid_left": {
"position": [0, 0, -0.1]
},
"eye_right": {
"position": [0, 0, 0.1]
},
"lash_right": {
"rotation": [0, 35, 0]
},
"eyelid_right": {
"position": [0, 0, -0.1]
}
}
},
"animation.spritzee.ground_sleep": {
"loop": true,
"bones": {
"tuft": {
"rotation": [5, 10, 0]
},
"wing_left": {
"rotation": [-45, -60.5, 46.5]
},
"wing_right": {
"rotation": [-45, 60.5, -46.5]
},
"body": {
"position": [0, -1, 0]
},
"hair_right": {
"rotation": [10, 0, 0]
},
"tuft_end": {
"rotation": [15, -20, 0]
},
"fur_bottom_back": {
"rotation": [52.5, 0, 0]
},
"fur_bottom_left": {
"rotation": [0, 0, -77.5]
},
"fur_bottom_right": {
"rotation": [0, 0, 77.5]
},
"fur_bottom_front": {
"rotation": [-85, 0, 0]
},
"leg_right": {
"rotation": [0, 0, 5]
},
"leg_left": {
"rotation": [0, 0, -5]
},
"legs": {
"rotation": [-90, 0, 0],
"position": [0, -0.5, 1.25]
},
"hair_left": {
"rotation": [10, 0, 0]
},
"torso": {
"rotation": [10, 0, 0],
"position": [0, -0.5, 0]
},
"eye_left": {
"position": [0, 0, 0.1]
},
"lash_left": {
"rotation": [0, -35, 0]
},
"eyelid_left": {
"position": [0, 0, -0.1]
},
"eye_right": {
"position": [0, 0, 0.1]
},
"lash_right": {
"rotation": [0, 35, 0]
},
"eyelid_right": {
"position": [0, 0, -0.1]
}
}
},
"animation.spritzee.blink": {
"animation_length": 0.2083,
"bones": {
"eyelid_left": {
"position": {
"0.0": [0, 0, -0.1],
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"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]}
}
}
}
},
"animation.spritzee.pose": {
"loop": true,
"bones": {
"body": {
"rotation": [-12.5, 0, 10],
"position": [0, 1, 0]
},
"hair_right": {
"rotation": [25, 0, 0]
},
"tuft_end": {
"rotation": [15, -20, 0]
},
"wing_left": {
"rotation": [-15, 20, -15]
},
"wing_right": {
"rotation": [-15, -20, 15]
},
"fur_bottom_back": {
"rotation": [45, 0, 0]
},
"fur_bottom_left": {
"rotation": [0, 0, -55]
},
"fur_bottom_right": {
"rotation": [0, 0, 55]
},
"fur_bottom_front": {
"rotation": [-50, 0, 0]
},
"leg_right": {
"rotation": [15, 0, 2.5]
},
"leg_left": {
"rotation": [15, 0, -2.5]
},
"hair_left": {
"rotation": [25, 0, 0]
},
"lash_left": {
"rotation": [0, -35, 0]
},
"pupil_left": {
"position": [0.25, 0, 0]
},
"pupil_right": {
"position": [0.25, 0, 0]
},
"lash_right": {
"rotation": [0, 35, 0]
}
}
},
"animation.spritzee.cry": {
"animation_length": 0.875,
"sound_effects": {
"0.0417": {
"effect": "pokemon.spritzee.cry"
}
}
}
}
}
@@ -0,0 +1,84 @@
{
"format_version": "1.8.0",
"animations": {
"animation.aromatisse.ground_idle": {
"loop": true,
"bones": {
"left_leg": {
"rotation": [-12.5, -15, 0],
"position": [1, 0, -4]
},
"left_foot": {
"rotation": [12.5, 0, 0]
},
"right_leg": {
"rotation": [0, 22.5, -7.5]
},
"left_arm": {
"rotation": ["15-3*Math.cos((query.anim_time-0.5) * 90 * 2) *0.5", 52.5, -40]
},
"hand_left": {
"rotation": [47.5, 0, 0]
},
"left_claws": {
"rotation": [55, 0, 0]
},
"body_leg_tuft": {
"rotation": [15, 0, 0]
},
"right_foot": {
"rotation": [-2.5, 0, 7.5]
},
"left_elbow": {
"rotation": [0, 65, 0]
},
"right_arm": {
"rotation": ["21.50777307-3*Math.cos((query.anim_time-0.5) * 90 * 2) *0.5", -35.22118, -23.27698]
},
"right_elbow": {
"rotation": [67.5, 0, 0]
},
"hand_right": {
"rotation": [17.5, 0, 0]
},
"waist": {
"rotation": ["3*Math.cos((query.anim_time-0) * 90 * 2) *0.5", 0, "1*Math.cos((query.anim_time-0.25) * 90 * 1) *0.5"],
"position": [0, "0.2*Math.cos((query.anim_time-0.5) * 90 * 2) *0.5", 0]
},
"torso": {
"rotation": ["3*Math.cos((query.anim_time-0.75) * 90 * 2) *0.5", 0, 0]
},
"head": {
"rotation": ["2*Math.cos((query.anim_time-0.5) * 90 * 2) *0.5", 0, 0]
}
}
},
"animation.aromatisse.cry": {
"animation_length": 1.75,
"sound_effects": {
"0.0417": {
"effect": "pokemon.aromatisse.cry"
}
}
},
"animation.aromatisse.blink": {
"animation_length": 0.2083,
"bones": {
"right_eye_closed": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": [0, 0, -0.1],
"0.2083": [0, 0, 0]
}
},
"left_eye_closed": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": [0, 0, -0.1],
"0.2083": [0, 0, 0]
}
}
}
}
}
}
@@ -0,0 +1,96 @@
{
"format_version": "1.8.0",
"animations": {
"animation.swirlix.blink": {
"animation_length": 0.1667,
"bones": {
"eyelid_right": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": [0, 0, -0.1],
"0.1667": [0, 0, 0]
}
},
"eyelid_left": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": [0, 0, -0.1],
"0.1667": [0, 0, 0]
}
}
}
},
"animation.swirlix.ground_idle": {
"loop": true,
"bones": {
"torso": {
"rotation": [-2.5, 0, 0]
},
"ear_left": {
"rotation": [0, 0, 35]
},
"ear_right": {
"rotation": [0, 0, -35]
},
"tongue": {
"rotation": [50, 0, 0],
"position": [3, 0.25, 0]
},
"leg_right": {
"rotation": [0, 10, 0]
},
"leg_left": {
"rotation": [0, -10, 0]
},
"tail_only": {
"rotation": [-32.5, 0, 0]
},
"tail2": {
"rotation": [30, 0, 0]
}
}
},
"animation.swirlix.air_idle": {
"loop": true,
"bones": {
"body": {
"position": [0, 7, 0]
},
"legs": {
"position": [0, 2, 0]
},
"ear_left": {
"rotation": [0, 0, 35]
},
"ear_right": {
"rotation": [0, 0, -35]
},
"tongue": {
"rotation": [50, 0, 0],
"position": [3, 0.25, 0]
},
"tail_only": {
"rotation": [7.5, 0, 0]
},
"tail2": {
"rotation": [15, "0+math.sin(query.anim_time*90*2)*3", 0]
},
"tail": {
"rotation": [-90, 0, 0],
"position": [0, -2, -5.5]
},
"tail_fur_big": {
"rotation": [10, 0, 0]
}
}
},
"animation.swirlix.cry": {
"animation_length": 1.25,
"sound_effects": {
"0.0417": {
"effect": "pokemon.swirlix.cry"
}
}
}
}
}
@@ -0,0 +1,77 @@
{
"format_version": "1.8.0",
"animations": {
"animation.slurpuff.ground_idle": {
"loop": true,
"bones": {
"torso": {
"rotation": [5, 0, 0]
},
"head": {
"rotation": [-5, 0, 0]
},
"hair_right": {
"rotation": [0, 0, 5]
},
"arm_right": {
"rotation": [0, -30, 0]
},
"tounge": {
"rotation": [35, 0, 0],
"position": [3.5, 0.25, 0]
},
"arm_left": {
"rotation": [0, 30, 0]
},
"hair_right_ball": {
"rotation": [0, -10, 0]
},
"mouth_open": {
"position": [0, 0.25, 0]
},
"hair_ball_tag": {
"rotation": [0, 35, 0]
},
"hair_left": {
"rotation": [0, 0, -5]
},
"hair_left_ball": {
"rotation": [0, 10, 0]
},
"eye_right": {
"rotation": [0, 0, 2.5]
},
"eye_left": {
"rotation": [0, 0, -2.5]
}
}
},
"animation.slurpuff.blink": {
"animation_length": 0.1667,
"bones": {
"eyelid_right": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": [0, 0, -0.1],
"0.1667": [0, 0, 0]
}
},
"eyelid_left": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": [0, 0, -0.1],
"0.1667": [0, 0, 0]
}
}
}
},
"animation.slurpuff.cry": {
"animation_length": 1.25,
"sound_effects": {
"0.0417": {
"effect": "pokemon.slurpuff.cry"
}
}
}
}
}
@@ -76,6 +76,18 @@
"leg_right1": {
"rotation": [0, 0, "4+4*math.cos(q.anim_time*90*2-90)"],
"position": ["0.25*math.cos(q.anim_time*90*2-90)", 0, 0]
},
"shield_left1": {
"position": [-1, 0, 0]
},
"shield_right1": {
"position": [1, 0, 0]
},
"arm_left1": {
"position": [-1, 0, 0]
},
"arm_right1": {
"position": [1, 0, 0]
}
}
},
@@ -155,20 +167,32 @@
"rotation": [0, 0, "4+4*math.cos(q.anim_time*90*2-90)"],
"position": ["0.25*math.cos(q.anim_time*90*2-90)", 0, 0]
},
"body": {
"body1": {
"position": [0, 0, 12]
},
"body2": {
"position": [7, 0, 11]
"position": [9, 0, 11]
},
"body3": {
"position": [-7, 0, 0]
"position": [-9, 0, 0]
},
"body5": {
"position": [13, 0, -11]
"position": [18, 0, -11]
},
"body6": {
"position": [-13, 0, -22]
"position": [-18, 0, -22]
},
"shield_left1": {
"position": [-1, 0, 0]
},
"shield_right1": {
"position": [1, 0, 0]
},
"arm_left1": {
"position": [-1, 0, 0]
},
"arm_right1": {
"position": [1, 0, 0]
}
}
},
@@ -326,6 +350,14 @@
"1+math.sin(q.anim_time*90*4-30-30-30-30-30)*1 + math.sin(q.anim_time*90*4*3-90-90-90-90-90)*1/10",
"-1.75+math.sin(q.anim_time*90*4-30-30-30-30-30)*-2 - math.sin(q.anim_time*90*4*3-90-90-90-90-90)*2/10 + 2*math.sin(q.anim_time*90*4-90-180-30-30-30-30-30 + math.sin(q.anim_time*90*4-90-180-30-30-30-30-30)*30)"
]
},
"arm_left1": {
"rotation": [0, 57.5, 0],
"position": [-0.5, 0, -3.75]
},
"arm_right1": {
"rotation": [0, -57.5, 0],
"position": [0.5, 0, -3.75]
}
}
},
@@ -387,7 +419,7 @@
"rotation": ["-25*math.sin(q.anim_time*90*8-100)", 0, 0],
"position": [0, "0.25+0.5*math.cos(q.anim_time*90*8-100)", "-1*math.sin(q.anim_time*90*8-100)"]
},
"body": {
"body1": {
"rotation": ["12-4*math.sin(q.anim_time*90*16-45)", 0, 0],
"position": [0, "0.5+0.5*math.sin(q.anim_time*90*16)", 0]
},
@@ -429,6 +461,14 @@
"body6": {
"rotation": ["12-4*math.sin(q.anim_time*90*16-145)", 0, 0],
"position": [0, "0.5+0.5*math.sin(q.anim_time*90*16-100)", 0]
},
"arm_left1": {
"rotation": [0, 57.5, 0],
"position": [-0.5, 0, -3.75]
},
"arm_right1": {
"rotation": [0, -57.5, 0],
"position": [0.5, 0, -3.75]
}
}
},
@@ -470,6 +510,37 @@
"0.9583": ["-10*math.sin(q.anim_time*90*2)", 0, "-10*math.sin(q.anim_time*90*4)"],
"1.0": [0, 0, 0]
}
},
"mouth_ditto": {
"position": {
"0.0": [0, 0, 0],
"0.0417": {
"pre": [0, 0, 0],
"post": [0, 0, 0.1]
},
"0.9583": {
"pre": [0, 0, 0.1],
"post": [0, 0, 0]
}
}
},
"mouth_open_ditto": {
"position": {
"0.0": [0, 0, 0],
"0.0417": {
"pre": [0, 0, 0],
"post": [0, 0, -0.1]
},
"0.9583": {
"pre": [0, 0, -0.1],
"post": [0, 0, 0]
}
}
}
},
"sound_effects": {
"0.0417": {
"effect": "pokemon.falinks.cry"
}
}
},
@@ -832,7 +903,7 @@
"2.0833": [45, 0, 0]
}
},
"body": {
"body1": {
"rotation": {
"0.0": ["-8-8*math.sin(q.anim_time*90*4.5-90)", 0, 0],
"1.5833": ["-8-15*math.sin(q.anim_time*90*4-90)", 0, 0],
@@ -897,7 +968,7 @@
"position": {
"0.7917": [-2, 0, -5.5],
"1.2083": [0, 0, -5.5],
"1.75": [0, 0, 0]
"1.75": [-1, 0, 0]
}
},
"shield_right1": {
@@ -908,7 +979,7 @@
"position": {
"0.7917": [2, 0, -5.5],
"1.2083": [0, 0, -5.5],
"1.75": [0, 0, 0]
"1.75": [1, 0, 0]
}
},
"leg_left1": {
@@ -1066,6 +1137,30 @@
"0.875": [0, -1.5, 4],
"1.0833": [0, 0, 7]
}
},
"arm_left1": {
"rotation": {
"0.0": [0, 57.5, 0],
"1.3333": [0, 57.5, 0],
"1.75": [0, 0, 0]
},
"position": {
"0.0": [-0.5, 0, -3.75],
"1.3333": [-0.5, 0, -3.75],
"1.75": [-1, 0, 0]
}
},
"arm_right1": {
"rotation": {
"0.0": [0, -57.5, 0],
"1.3333": [0, 57.5, 0],
"1.75": [0, 0, 0]
},
"position": {
"0.0": [0.5, 0, -3.75],
"1.3333": [-0.5, 0, -3.75],
"1.75": [1, 0, 0]
}
}
}
},
@@ -1399,7 +1494,7 @@
"1.625": [0, 0, 0]
}
},
"body": {
"body1": {
"rotation": {
"0.0": [-5, 0, 0],
"0.0833": [5, 0, 0],
@@ -1663,6 +1758,14 @@
"1.5417": [0, 0.3, 0],
"1.625": [0, 0, 0]
}
},
"arm_left1": {
"rotation": [0, 57.5, 0],
"position": [-0.5, 0, -3.75]
},
"arm_right1": {
"rotation": [0, -57.5, 0],
"position": [0.5, 0, -3.75]
}
}
},
@@ -1996,7 +2099,7 @@
"1.625": [0, 0, 0]
}
},
"body": {
"body1": {
"rotation": {
"0.0": [-5, 0, 0],
"0.0833": [5, 0, 0],
@@ -2127,19 +2230,19 @@
"1.4583": [-5, 0, 0]
},
"position": {
"0.0": [7, 0, 11],
"0.0417": [7, 0, 11],
"0.125": [7, 0.3, 11],
"0.2083": [7, 0, 11],
"0.4583": [7, 0, 11],
"0.5417": [7, 0.3, 11],
"0.625": [7, 0, 11],
"0.875": [7, 0, 11],
"0.9583": [7, 0.3, 11],
"1.0417": [7, 0, 11],
"1.2917": [7, 0, 11],
"1.375": [7, 0.3, 11],
"1.4583": [7, 0, 11]
"0.0": [9, 0, 11],
"0.0417": [9, 0, 11],
"0.125": [9, 0.3, 11],
"0.2083": [9, 0, 11],
"0.4583": [9, 0, 11],
"0.5417": [9, 0.3, 11],
"0.625": [9, 0, 11],
"0.875": [9, 0, 11],
"0.9583": [9, 0.3, 11],
"1.0417": [9, 0, 11],
"1.2917": [9, 0, 11],
"1.375": [9, 0.3, 11],
"1.4583": [9, 0, 11]
}
},
"body3": {
@@ -2158,19 +2261,19 @@
"1.5": [-5, 0, 0]
},
"position": {
"0.0": [-7, 0, 0],
"0.0833": [-7, 0, 0],
"0.1667": [-7, 0.3, 0],
"0.25": [-7, 0, 0],
"0.5": [-7, 0, 0],
"0.5833": [-7, 0.3, 0],
"0.6667": [-7, 0, 0],
"0.9167": [-7, 0, 0],
"1.0": [-7, 0.3, 0],
"1.0833": [-7, 0, 0],
"1.3333": [-7, 0, 0],
"1.4167": [-7, 0.3, 0],
"1.5": [-7, 0, 0]
"0.0": [-9, 0, 0],
"0.0833": [-9, 0, 0],
"0.1667": [-9, 0.3, 0],
"0.25": [-9, 0, 0],
"0.5": [-9, 0, 0],
"0.5833": [-9, 0.3, 0],
"0.6667": [-9, 0, 0],
"0.9167": [-9, 0, 0],
"1.0": [-9, 0.3, 0],
"1.0833": [-9, 0, 0],
"1.3333": [-9, 0, 0],
"1.4167": [-9, 0.3, 0],
"1.5": [-9, 0, 0]
}
},
"body4": {
@@ -2219,19 +2322,19 @@
"1.5833": [-5, 0, 0]
},
"position": {
"0.0": [-14, 0, -11],
"0.1667": [-14, 0, -11],
"0.25": [-14, 0.3, -11],
"0.3333": [-14, 0, -11],
"0.5833": [-14, 0, -11],
"0.6667": [-14, 0.3, -11],
"0.75": [-14, 0, -11],
"1.0": [-14, 0, -11],
"1.0833": [-14, 0.3, -11],
"1.1667": [-14, 0, -11],
"1.4167": [-14, 0, -11],
"1.5": [-14, 0.3, -11],
"1.5833": [-14, 0, -11]
"0.0": [-18, 0, -11],
"0.1667": [-18, 0, -11],
"0.25": [-18, 0.3, -11],
"0.3333": [-18, 0, -11],
"0.5833": [-18, 0, -11],
"0.6667": [-18, 0.3, -11],
"0.75": [-18, 0, -11],
"1.0": [-18, 0, -11],
"1.0833": [-18, 0.3, -11],
"1.1667": [-18, 0, -11],
"1.4167": [-18, 0, -11],
"1.5": [-18, 0.3, -11],
"1.5833": [-18, 0, -11]
}
},
"body6": {
@@ -2250,20 +2353,34 @@
"1.625": [-5, 0, 0]
},
"position": {
"0.0": [14, 0, -22],
"0.2083": [14, 0, -22],
"0.2917": [14, 0.3, -22],
"0.375": [14, 0, -22],
"0.625": [14, 0, -22],
"0.7083": [14, 0.3, -22],
"0.7917": [14, 0, -22],
"1.0417": [14, 0, -22],
"1.125": [14, 0.3, -22],
"1.2083": [14, 0, -22],
"1.4583": [14, 0, -22],
"1.5417": [14, 0.3, -22],
"1.625": [14, 0, -22]
"0.0": [19, 0, -24],
"0.125": [19, 0, -24],
"0.2083": [19, 0.3, -24],
"0.2917": [19, 0, -24],
"0.5417": [19, 0, -24],
"0.625": [19, 0.3, -24],
"0.7083": [19, 0, -24],
"0.9583": [19, 0, -24],
"1.0417": [19, 0.3, -24],
"1.125": [19, 0, -24],
"1.375": [19, 0, -24],
"1.4583": [19, 0.3, -24],
"1.5417": [19, 0, -24]
}
},
"arm_left1": {
"rotation": [0, 57.5, 0],
"position": [-0.5, 0, -3.75]
},
"arm_right1": {
"rotation": [0, -57.5, 0],
"position": [0.5, 0, -3.75]
},
"locator_target": {
"position": [0, 0, 10]
},
"locator_special": {
"position": [0, 0, 10]
}
}
},
@@ -2364,7 +2481,7 @@
"rotation": [-70.63695, 18.36283, 27.10874],
"position": [-0.7, -0.5, -2]
},
"body": {
"body1": {
"rotation": [-15, 0, 0],
"position": [1, -1.5, 1]
},
@@ -2405,12 +2522,31 @@
"body6": {
"rotation": [-558.9788, -60.18068, -533.73388],
"position": [8.5, -2, -40.75]
},
"shield_left1": {
"rotation": [0, 0, 0],
"position": [-1, 0, 0]
},
"shield_right1": {
"rotation": [0, 0, 0],
"position": [1, 0, 0]
},
"arm_left1": {
"position": [-1, 0, 0]
},
"arm_right1": {
"position": [1, 0, 0]
},
"eyes_ditto": {
"position": [0, 0, 0.1]
},
"eyes_blink_ditto": {
"position": [0, 0, -0.1]
}
}
},
"animation.falinks.physical_attack": {
"loop": true,
"animation_length": 1.45833,
"animation.falinks.physical": {
"animation_length": 1.4583,
"bones": {
"spike": {
"position": {
@@ -2681,7 +2817,7 @@
"1.0": [0.1, 0, 0]
}
},
"body": {
"body1": {
"rotation": {
"0.0": ["-20*math.sin(q.anim_time*90*6)", 0, 0],
"0.5": [20, 0, 0],
@@ -2714,8 +2850,8 @@
"position": {
"0.0": [-2, 0, -5.5],
"0.0833": [0, 0, -5.5],
"0.1667": [0, 0, 0],
"1.0833": [0, 0, 0],
"0.1667": [-1, 0, 0],
"1.0833": [-1, 0, 0],
"1.2083": [0, 0, -5.5],
"1.2917": [-2, 0, -5.5]
}
@@ -2730,8 +2866,8 @@
"position": {
"0.0": [2, 0, -5.5],
"0.0833": [0, 0, -5.5],
"0.1667": [0, 0, 0],
"1.0833": [0, 0, 0],
"0.1667": [1, 0, 0],
"1.0833": [1, 0, 0],
"1.2083": [0, 0, -5.5],
"1.2917": [2, 0, -5.5]
}
@@ -2853,122 +2989,224 @@
"1.1667": [0, 0, "-3+4*math.sin(q.anim_time*90*4)"],
"1.4167": [0, 0, 1]
}
},
"arm_left1": {
"rotation": {
"0.0833": [0, 57.5, 0],
"0.1667": [0, 0, 0],
"1.0833": [0, 0, 0],
"1.2083": [0, 57.5, 0]
},
"position": {
"0.0833": [-0.5, 0, -3.75],
"0.1667": [-1, 0, 0],
"1.0833": [-1, 0, 0],
"1.2083": [-0.5, 0, -3.75]
}
},
"arm_right1": {
"rotation": {
"0.0833": [0, -57.5, 0],
"0.1667": [0, 0, 0],
"1.0833": [0, 0, 0],
"1.2083": [0, -57.5, 0]
},
"position": {
"0.0833": [0.5, 0, -3.75],
"0.1667": [1, 0, 0],
"1.0833": [1, 0, 0],
"1.2083": [0.5, 0, -3.75]
}
}
}
},
"animation.falinks.blink": {
"animation_length": 0.16667,
"animation_length": 0.1667,
"bones": {
"eyelid_left1": {
"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]
}
}
},
"eyelid_right1": {
"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]
}
}
},
"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.falinks.blink2": {
"animation_length": 0.16667,
"animation_length": 0.1667,
"bones": {
"eyelid_left2": {
"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]
}
}
},
"eyelid_right2": {
"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]
}
}
}
}
},
"animation.falinks.blink3": {
"animation_length": 0.16667,
"animation_length": 0.1667,
"bones": {
"eyelid_left3": {
"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]
}
}
},
"eyelid_right3": {
"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]
}
}
}
}
},
"animation.falinks.blink4": {
"animation_length": 0.16667,
"animation_length": 0.1667,
"bones": {
"eyelid_left4": {
"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]
}
}
},
"eyelid_right4": {
"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]
}
}
}
}
},
"animation.falinks.blink5": {
"animation_length": 0.16667,
"animation_length": 0.1667,
"bones": {
"eyelid_left5": {
"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]
}
}
},
"eyelid_right5": {
"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]
}
}
}
}
},
"animation.falinks.blink6": {
"animation_length": 0.16667,
"animation_length": 0.1667,
"bones": {
"eyelid_left6": {
"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]
}
}
},
"eyelid_right6": {
"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]
}
}
}
}
},
"animation.falinks.ditto_face": {
"loop": true,
"bones": {
"eyes1": {
"position": [0, 0, 0.1],
"scale": 0
},
"eyes2": {
"position": [0, 0, 0.1],
"scale": 0
},
"eyes3": {
"position": [0, 0, 0.1],
"scale": 0
},
"eyes4": {
"position": [0, 0, 0.1],
"scale": 0
},
"eyes5": {
"position": [0, 0, 0.1],
"scale": 0
},
"eyes6": {
"position": [0, 0, 0.1],
"scale": 0
},
"face_ditto": {
"position": [0, 0, -0.1]
}
}
}
}
}
@@ -29,6 +29,55 @@
{"origin": [-8, 1.5, 11], "size": [16, 8, 6], "uv": [84, 14]}
]
},
{
"name": "locator_seat_2",
"parent": "torso",
"pivot": [0, 11, 11],
"locators": {
"seat_2": [0, 11, 11]
}
},
{
"name": "locator_seat_1",
"parent": "torso",
"pivot": [0, 11, 4],
"locators": {
"seat_1": [0, 11, 4]
}
},
{
"name": "locator_item_face",
"parent": "torso",
"pivot": [0, 5.5, -11],
"locators": {
"item_face": [0, 5.5, -11]
}
},
{
"name": "locator_face",
"parent": "torso",
"pivot": [0, 5, -11],
"locators": {
"face": [0, 5, -11]
}
},
{
"name": "locator_item_hat",
"parent": "torso",
"pivot": [0, 14.4, -6.25],
"locators": {
"item_hat": [0, 14.4, -6.25]
}
},
{
"name": "locator_head",
"parent": "torso",
"pivot": [0, 11, -8],
"locators": {
"head": [0, 11, -8],
"physical": [0, 11, -8]
}
},
{
"name": "mouth",
"parent": "torso",
@@ -42,6 +91,23 @@
{"origin": [-3, 2, -11.01], "size": [6, 1, 0], "uv": [0, 38]}
]
},
{
"name": "locator_item",
"parent": "mouth_closed",
"pivot": [0, 2, -12],
"locators": {
"item": [0, 2, -12]
}
},
{
"name": "locator_mouth",
"parent": "mouth_closed",
"pivot": [0, 2.5, -11],
"locators": {
"mouth": [0, 2.5, -11],
"special": [0, 2.5, -11]
}
},
{
"name": "mouth_closed_right",
"parent": "mouth_closed",
@@ -143,6 +209,14 @@
{"origin": [-7.5, 5, -11.02], "size": [1, 1, 0], "uv": [12, 35]}
]
},
{
"name": "locator_eye_right",
"parent": "pupil_right",
"pivot": [-7, 5.5, -11],
"locators": {
"eye1": [-7, 5.5, -11]
}
},
{
"name": "eye_left",
"parent": "eyes",
@@ -183,6 +257,14 @@
{"origin": [6.5, 5, -11.02], "size": [1, 1, 0], "uv": [12, 36]}
]
},
{
"name": "locator_eye_left",
"parent": "pupil_left",
"pivot": [7, 5.5, -11],
"locators": {
"eye2": [7, 5.5, -11]
}
},
{
"name": "antenna_right",
"parent": "torso",
@@ -321,6 +403,15 @@
{"origin": [-5.5, 6.5, 34], "size": [11, 0, 9], "uv": [-6, 88]}
]
},
{
"name": "locator_tail",
"parent": "tail3",
"pivot": [0, 6.5, 37.5],
"rotation": [0, 180, 0],
"locators": {
"tail": [0, 6.5, 37.5]
}
},
{
"name": "tail4",
"parent": "tail3",
@@ -328,6 +419,47 @@
"cubes": [
{"origin": [-3.5, 6.5, 43], "size": [7, 0, 9], "uv": [20, 88]}
]
},
{
"name": "locator_tail_tip",
"parent": "tail4",
"pivot": [0, 6.5, 52],
"rotation": [0, 180, 0],
"locators": {
"tail_tip": [0, 6.5, 52]
}
},
{
"name": "locator_target",
"parent": "body",
"pivot": [0, 4.5, -16.25],
"locators": {
"target": [0, 4.5, -16.25]
}
},
{
"name": "locator_middle",
"parent": "body",
"pivot": [0, 6, 0],
"locators": {
"middle": [0, 6, 0]
}
},
{
"name": "locator_root",
"parent": "mantine",
"pivot": [0, 0, 0],
"locators": {
"root": [0, 0, 0]
}
},
{
"name": "locator_top",
"parent": "mantine",
"pivot": [0, 17, 0],
"locators": {
"top": [0, 17, 0]
}
}
]
}
@@ -3,135 +3,472 @@
"minecraft:geometry": [
{
"description": {
"identifier": "geometry.unknown",
"texture_width": 32,
"identifier": "geometry.chimecho",
"texture_width": 64,
"texture_height": 32,
"visible_bounds_width": 2,
"visible_bounds_height": 2.5,
"visible_bounds_offset": [0, 0.75, 0]
"visible_bounds_height": 3.5,
"visible_bounds_offset": [0, 1.25, 0]
},
"bones": [
{
"name": "chimecho",
"pivot": [0, 0, 0]
},
{
"name": "locator_root",
"parent": "chimecho",
"pivot": [0, 0, 0],
"locators": {
"root": [0, 0, 0]
}
},
{
"name": "locator_top",
"parent": "chimecho",
"pivot": [0, 28, 0],
"locators": {
"top": [0, 28, 0]
}
},
{
"name": "body",
"parent": "chimecho",
"pivot": [0, -2, 0]
"pivot": [0, 20, 0]
},
{
"name": "locator_target",
"parent": "body",
"pivot": [0, 20, -6.5],
"locators": {
"target": [0, 20, -6.5]
}
},
{
"name": "locator_middle",
"parent": "body",
"pivot": [0, 20, 0],
"locators": {
"middle": [0, 20, 0]
}
},
{
"name": "head",
"parent": "body",
"pivot": [0, 15, 0],
"pivot": [0, 18, 0],
"cubes": [
{"origin": [-2.5, 15, -2.5], "size": [5, 4, 5], "uv": [0, 0]},
{"origin": [-0.5, 18, 0], "size": [1, 2, 0], "uv": [2, 0]},
{"origin": [-1, 20, -1], "size": [2, 2, 2], "uv": [8, 13]}
{"origin": [-3.5, 18, -3.5], "size": [7, 5, 7], "uv": [0, 0]},
{"origin": [-3.5, 19.5, -3.5], "size": [7, 2, 7], "inflate": 0.01, "uv": [29, 0]},
{"origin": [-0.5, 22, -0.5], "size": [1, 2, 1], "uv": [60, 1]},
{"origin": [-1.5, 24.25, -1.5], "size": [3, 2, 3], "inflate": 0.25, "uv": [51, 1]}
]
},
{
"name": "mouth",
"name": "locator_face",
"parent": "head",
"pivot": [0, 15, 0],
"cubes": [
{"origin": [-0.5, 15.75, -2.401], "size": [1, 1, 0], "pivot": [0, 16.25, -2.5], "rotation": [0, 0, 45], "uv": [15, 4]}
]
"pivot": [0, 20.5, -3.5],
"locators": {
"face": [0, 20.5, -3.5]
}
},
{
"name": "locator_item_face",
"parent": "head",
"pivot": [0, 21.4, -3.5],
"locators": {
"item_face": [0, 21.4, -3.5]
}
},
{
"name": "locator_mouth",
"parent": "head",
"pivot": [0, 19.7, -3.5],
"locators": {
"mouth": [0, 19.7, -3.5],
"special": [0, 19.7, -3.5]
}
},
{
"name": "locator_head",
"parent": "head",
"pivot": [0, 23.05, -3.5],
"locators": {
"head": [0, 23.05, -3.5]
}
},
{
"name": "locator_item_hat",
"parent": "head",
"pivot": [0, 26.5, 0],
"locators": {
"item_hat": [0, 26.5, 0]
}
},
{
"name": "face",
"parent": "head",
"pivot": [0, 20.5, -3.015]
},
{
"name": "eyes",
"parent": "head",
"pivot": [0, 16.75, -2.5]
},
{
"name": "eye_right",
"parent": "eyes",
"pivot": [-1.5, 17.25, -2.5],
"rotation": [0, 0, -45],
"cubes": [
{"origin": [-2, 16.75, -2.501], "size": [1, 1, 0], "uv": [14, 13]}
]
},
{
"name": "eyelid_right",
"parent": "eye_right",
"pivot": [-1.5, 17.25, -2.5],
"cubes": [
{"origin": [-2, 16.75, -2.401], "size": [1, 1, 0], "inflate": 0.01, "uv": [17, 13]}
]
"parent": "face",
"pivot": [0, 20.5, -3.5]
},
{
"name": "eye_left",
"parent": "eyes",
"pivot": [1.5, 17.25, -2.5],
"rotation": [0, 0, 45],
"pivot": [2, 20.75, -3.5],
"cubes": [
{"origin": [1, 16.75, -2.501], "size": [1, 1, 0], "uv": [14, 14]}
{"origin": [1.5, 20.5, -3.5], "size": [1, 1, 1], "inflate": 0.01, "uv": [1, 26]}
]
},
{
"name": "locator_eye_left",
"parent": "eye_left",
"pivot": [2, 21, -3.5],
"locators": {
"eye2": [2, 21, -3.5]
}
},
{
"name": "eyelid_left_angry",
"parent": "eye_left",
"pivot": [1.5, 21.5, -2.9],
"cubes": [
{"origin": [1, 21, -3.4], "size": [1, 1, 1], "inflate": 0.02, "uv": [6, 26]}
]
},
{
"name": "eyelid_left_sad",
"parent": "eye_left",
"pivot": [2.5, 21.5, -2.9],
"cubes": [
{"origin": [2, 21, -3.4], "size": [1, 1, 1], "inflate": 0.02, "uv": [11, 26]}
]
},
{
"name": "eyelid_left_happy",
"parent": "eye_left",
"pivot": [2, 21.25, -2.9],
"cubes": [
{"origin": [1, 21, -3.4], "size": [2, 1, 1], "inflate": 0.02, "uv": [16, 26]},
{"origin": [1.5, 20.5, -3.4], "size": [1, 1, 1], "inflate": 0.03, "uv": [23, 26]}
]
},
{
"name": "eyelid_left_annoyed",
"parent": "eye_left",
"pivot": [2, 21.5, -2.9],
"cubes": [
{"origin": [1.5, 21, -3.4], "size": [1, 1, 1], "inflate": 0.02, "uv": [28, 26]}
]
},
{
"name": "eyelid_left_hit",
"parent": "eye_left",
"pivot": [1.75, 21.25, -2.9],
"cubes": [
{"origin": [1.5, 20.5, -3.4], "size": [1, 1, 1], "inflate": 0.02, "uv": [33, 26]},
{"origin": [1, 21, -3.4], "size": [1, 1, 1], "inflate": 0.03, "uv": [38, 26]}
]
},
{
"name": "eyelid_left",
"parent": "eye_left",
"pivot": [1.5, 17.25, -2.5],
"pivot": [2, 21.25, -2.9],
"cubes": [
{"origin": [1, 16.75, -2.401], "size": [1, 1, 0], "inflate": 0.01, "uv": [17, 14]}
{"origin": [1.5, 20.5, -3.4], "size": [1, 1, 1], "inflate": 0.02, "uv": [43, 26]},
{"origin": [1.5, 21, -3.4], "size": [1, 1, 1], "inflate": 0.03, "uv": [48, 26]}
]
},
{
"name": "eye_right",
"parent": "eyes",
"pivot": [-2, 20.75, -3.5],
"cubes": [
{"origin": [-2.5, 20.5, -3.5], "size": [1, 1, 1], "inflate": 0.01, "uv": [1, 29]}
]
},
{
"name": "locator_eye_right",
"parent": "eye_right",
"pivot": [-2, 21, -3.5],
"locators": {
"eye1": [-2, 21, -3.5]
}
},
{
"name": "eyelid_right_angry",
"parent": "eye_right",
"pivot": [-1.5, 21.5, -2.9],
"cubes": [
{"origin": [-2, 21, -3.4], "size": [1, 1, 1], "inflate": 0.02, "uv": [6, 29]}
]
},
{
"name": "eyelid_right_sad",
"parent": "eye_right",
"pivot": [-2.5, 21.5, -2.9],
"cubes": [
{"origin": [-3, 21, -3.4], "size": [1, 1, 1], "inflate": 0.02, "uv": [11, 29]}
]
},
{
"name": "eyelid_right_happy",
"parent": "eye_right",
"pivot": [-2, 21.25, -2.9],
"cubes": [
{"origin": [-3, 21, -3.4], "size": [2, 1, 1], "inflate": 0.02, "uv": [16, 29]},
{"origin": [-2.5, 20.5, -3.4], "size": [1, 1, 1], "inflate": 0.03, "uv": [23, 29]}
]
},
{
"name": "eyelid_right_annoyed",
"parent": "eye_right",
"pivot": [-2, 21.5, -2.9],
"cubes": [
{"origin": [-2.5, 21, -3.4], "size": [1, 1, 1], "inflate": 0.02, "uv": [28, 29]}
]
},
{
"name": "eyelid_right_hit",
"parent": "eye_right",
"pivot": [-1.75, 21.25, -2.9],
"cubes": [
{"origin": [-2.5, 20.5, -3.4], "size": [1, 1, 1], "inflate": 0.02, "uv": [33, 29]},
{"origin": [-2, 21, -3.4], "size": [1, 1, 1], "inflate": 0.03, "uv": [38, 29]}
]
},
{
"name": "eyelid_right",
"parent": "eye_right",
"pivot": [-2, 21.25, -2.9],
"cubes": [
{"origin": [-2.5, 20.5, -3.4], "size": [1, 1, 1], "inflate": 0.02, "uv": [43, 29]},
{"origin": [-2.5, 21, -3.4], "size": [1, 1, 1], "inflate": 0.03, "uv": [48, 29]}
]
},
{
"name": "mouths",
"parent": "face",
"pivot": [0, 20.25, -3.015]
},
{
"name": "mouth_smile",
"parent": "mouths",
"pivot": [0, 20.25, -3.015],
"cubes": [
{"origin": [-2, 19.5, -3.51], "size": [4, 1, 1], "uv": [43, 10]},
{"origin": [-1.5, 20, -3.52], "size": [3, 1, 1], "uv": [54, 10]}
]
},
{
"name": "mouth_frown",
"parent": "mouths",
"pivot": [0, 20, -2.915],
"cubes": [
{"origin": [-2, 19.5, -3.41], "size": [4, 1, 1], "uv": [43, 14]},
{"origin": [-1.5, 19, -3.42], "size": [3, 2, 1], "uv": [54, 13]}
]
},
{
"name": "mouth_neutral",
"parent": "mouths",
"pivot": [0, 20, -2.91],
"cubes": [
{"origin": [-2, 19.5, -3.41], "size": [4, 1, 1], "uv": [43, 17]}
]
},
{
"name": "mouth_open",
"parent": "mouths",
"pivot": [0, 18, -1],
"cubes": [
{"origin": [-2, 19.5, -3.41], "size": [4, 1, 1], "uv": [43, 20]},
{"origin": [-1.5, 19, -3.42], "size": [3, 1, 1], "uv": [30, 10]}
]
},
{
"name": "mouth_scream",
"parent": "mouths",
"pivot": [0, 20.25, -2.915],
"cubes": [
{"origin": [-1.5, 18.5, -3.41], "size": [3, 2, 1], "uv": [54, 19]},
{"origin": [-1, 18, -3.42], "size": [2, 1, 1], "uv": [52, 24]}
]
},
{
"name": "mouth_0",
"parent": "mouths",
"pivot": [0, 20.35, -2.915],
"cubes": [
{"origin": [-0.5, 18.5, -3.41], "size": [1, 2, 1], "uv": [59, 23]}
]
},
{
"name": "locator_jaw_upper",
"parent": "mouths",
"pivot": [0, 20.5, -3.5],
"locators": {
"jaw1": [0, 20.5, -3.5]
}
},
{
"name": "locator_jaw_lower",
"parent": "mouths",
"pivot": [0, 18.5, -3.5],
"locators": {
"jaw2": [0, 18.5, -3.5]
}
},
{
"name": "face_ditto",
"parent": "head",
"pivot": [0, 20.75, -3.4]
},
{
"name": "eyes_ditto",
"parent": "face_ditto",
"pivot": [0, 21.5, -3.42],
"cubes": [
{"origin": [-2.5, 21, -3.42], "size": [5, 1, 0], "uv": [18, 21]}
]
},
{
"name": "eyes_blink_ditto",
"parent": "face_ditto",
"pivot": [0, 21.5, -3.32],
"cubes": [
{"origin": [-3, 21, -3.32], "size": [6, 1, 0], "uv": [17, 23]},
{"origin": [-2.5, 21.5, -3.33], "size": [5, 1, 0], "uv": [53, 28]}
]
},
{
"name": "mouth_ditto",
"parent": "face_ditto",
"pivot": [0, 19.75, -3.4],
"cubes": [
{"origin": [-2, 19, -3.42], "size": [4, 1, 0], "uv": [54, 30]},
{"origin": [-3, 19.5, -3.42], "size": [6, 1, 0], "uv": [4, 23]}
]
},
{
"name": "mouth_open_ditto",
"parent": "face_ditto",
"pivot": [0, 19.5, -3.31],
"cubes": [
{"origin": [-3, 18.5, -3.32], "size": [6, 2, 0], "uv": [30, 22]}
]
},
{
"name": "arms",
"parent": "head",
"pivot": [0, 18.75, -2.75]
},
{
"name": "arm_left",
"parent": "head",
"pivot": [-1, 15, -1],
"parent": "arms",
"pivot": [2.75, 19, -2.75],
"rotation": [30, -50, 0],
"cubes": [
{"origin": [-1, 15, -3.25], "size": [0, 1, 2], "pivot": [-1, 15, -1], "rotation": [32.5, 0, 40], "uv": [0, 2]}
{"origin": [2.25, 18.5, -4.5], "size": [1, 1, 2], "inflate": 0.1, "uv": [29, 3]}
]
},
{
"name": "locator_hand_secondary",
"parent": "arm_left",
"pivot": [2.7, 19, -4.5],
"rotation": [0, -90, 0],
"locators": {
"hand_secondary": [2.7, 19, -4.5]
}
},
{
"name": "arm_right",
"parent": "head",
"pivot": [1, 15, -1],
"parent": "arms",
"pivot": [-2.75, 19, -2.75],
"rotation": [30, 50, 0],
"cubes": [
{"origin": [1, 15, -3.25], "size": [0, 1, 2], "pivot": [1, 15, -1], "rotation": [32.5, 0, -40], "uv": [0, 1]}
{"origin": [-3.25, 18.5, -4.5], "size": [1, 1, 2], "inflate": 0.1, "uv": [22, 3]}
]
},
{
"name": "locator_hand_primary",
"parent": "arm_right",
"pivot": [-2.7, 19, -4.5],
"rotation": [0, 90, 0],
"locators": {
"hand_primary": [-2.7, 19, -4.5]
}
},
{
"name": "locator_item",
"parent": "arm_right",
"pivot": [-2.7, 19, -4.5],
"rotation": [0, -90, 0],
"locators": {
"item": [-2.7, 19, -4.5]
}
},
{
"name": "tail",
"parent": "head",
"pivot": [0, 15, 2.75],
"pivot": [0, 18.85, 2.75],
"rotation": [-25, 0, 0],
"cubes": [
{"origin": [0, 14.5, 1.75], "size": [0, 1, 2], "pivot": [0, 15, 2.75], "rotation": [-27.5, 0, 0], "uv": [0, 0]}
{"origin": [-0.5, 18.25, 2.75], "size": [1, 1, 2], "inflate": 0.1, "uv": [0, 3]}
]
},
{
"name": "ribbon1",
"parent": "body",
"pivot": [0, 15, 0],
"pivot": [0, 18, 0],
"cubes": [
{"origin": [-0.5, 13, 0], "size": [1, 2, 0], "uv": [0, 0]}
{"origin": [-0.5, 16, 0], "size": [1, 2, 0], "uv": [27, 2]}
]
},
{
"name": "ribbon2",
"parent": "ribbon1",
"pivot": [0, 13, 0],
"pivot": [0, 16, 0],
"cubes": [
{"origin": [-2, 9, 0], "size": [4, 4, 0], "uv": [0, 13]}
{"origin": [-2.5, 12, 0], "size": [5, 4, 0], "uv": [30, 14]}
]
},
{
"name": "ribbon3",
"parent": "ribbon2",
"pivot": [0, 9, 0],
"pivot": [0, 12, 0],
"cubes": [
{"origin": [-2, 5, 0], "size": [4, 4, 0], "uv": [8, 9]}
{"origin": [-2.5, 7, 0], "size": [5, 5, 0], "uv": [18, 14]}
]
},
{
"name": "locator_tail",
"parent": "ribbon3",
"pivot": [0, 9.5, 0],
"rotation": [-90, 0, 180],
"locators": {
"tail": [0, 9.5, 0]
}
},
{
"name": "ribbon4",
"parent": "ribbon3",
"pivot": [0, 5, 0],
"pivot": [0, 7, 0],
"cubes": [
{"origin": [-2, 1, 0], "size": [4, 4, 0], "uv": [0, 9]}
{"origin": [-3.5, 0, 0], "size": [7, 7, 0], "uv": [2, 14]}
]
},
{
"name": "locator_tail_tip",
"parent": "ribbon4",
"pivot": [0, 0, 0],
"rotation": [-90, 0, 180],
"locators": {
"tail_tip": [0, 0, 0],
"physical2": [0, 0, 0]
}
}
]
}
@@ -3,9 +3,9 @@
"minecraft:geometry": [
{
"description": {
"identifier": "geometry.unknown",
"identifier": "geometry.chingling",
"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,201 +15,553 @@
"name": "chingling",
"pivot": [0, 0, 0]
},
{
"name": "locator_root",
"parent": "chingling",
"pivot": [0, 0, 0],
"locators": {
"root": [0, 0, 0]
}
},
{
"name": "locator_top",
"parent": "chingling",
"pivot": [0, 14, 0],
"locators": {
"top": [0, 14, 0]
}
},
{
"name": "body",
"parent": "chingling",
"pivot": [0, 4, 0]
"pivot": [0, 4.5, -0.5]
},
{
"name": "locator_target",
"parent": "body",
"pivot": [0, 5, -6.5],
"locators": {
"target": [0, 5, -6.5]
}
},
{
"name": "locator_middle",
"parent": "body",
"pivot": [0, 6.5, 0],
"locators": {
"middle": [0, 6.5, 0]
}
},
{
"name": "torso",
"parent": "body",
"pivot": [0, 1.5, 0],
"pivot": [0, 1.5, -0.5],
"cubes": [
{"origin": [-3, 7, -3], "size": [6, 0, 6], "uv": [0, 6]},
{"origin": [3, 1, -3], "size": [0, 6, 6], "uv": [31, -4]},
{"origin": [-3, 2, -3], "size": [6, 0, 2], "uv": [10, 14]},
{"origin": [-3, 4, -3], "size": [6, 0, 2], "uv": [10, 12]},
{"origin": [-3, 2, -1], "size": [6, 2, 0], "uv": [18, 10]},
{"origin": [-3, 1, 3], "size": [6, 6, 0], "uv": [18, 0]},
{"origin": [-3, 1, -3], "size": [6, 0, 6], "uv": [0, 0]},
{"origin": [-3, 1, -3], "size": [6, 6, 0], "uv": [43, 0]},
{"origin": [-3, 1, -3], "size": [0, 6, 6], "uv": [0, 6]},
{"origin": [-1, 6, 2], "size": [2, 2, 2], "uv": [39, 10]}
{"origin": [-4, 1, 0], "size": [8, 8, 4], "uv": [0, 0]}
]
},
{
"name": "face",
"parent": "torso",
"pivot": [1, 3, 0],
"cubes": [
{"origin": [-4, 6, -4], "size": [8, 3, 4], "uv": [0, 12]},
{"origin": [-4, 1, -4], "size": [8, 1, 4], "uv": [0, 19]}
]
},
{
"name": "locator_item_hat",
"parent": "face",
"pivot": [0, 9.5, 0],
"locators": {
"item_hat": [0, 9.5, 0]
}
},
{
"name": "locator_head",
"parent": "face",
"pivot": [0, 9.05, -4],
"locators": {
"head": [0, 9.05, -4],
"physical": [0, 9.05, -4]
}
},
{
"name": "locator_mouth",
"parent": "face",
"pivot": [0, 3.45, -4],
"locators": {
"mouth": [0, 3.45, -4],
"special": [0, 3.45, -4]
}
},
{
"name": "locator_item_face",
"parent": "face",
"pivot": [0, 5.5, -4],
"locators": {
"item_face": [0, 5.5, -4]
}
},
{
"name": "locator_face",
"parent": "face",
"pivot": [0, 5, -4],
"locators": {
"face": [0, 5, -4]
}
},
{
"name": "tongue",
"parent": "torso",
"pivot": [0, 2.5, -1.25],
"parent": "face",
"pivot": [0, 2.95, -0.95],
"cubes": [
{"origin": [-1, 1.5, -2.25], "size": [2, 2, 2], "uv": [24, 15]}
{"origin": [-1, 1.95, -1.95], "size": [2, 2, 2], "uv": [33, 13]}
]
},
{
"name": "arm_left",
"parent": "torso",
"pivot": [2.5, 4, 0.5],
"name": "mouths",
"parent": "face",
"pivot": [0, 3.25, -3.5]
},
{
"name": "locator_jaw_upper",
"parent": "mouths",
"pivot": [0, 5, -4],
"locators": {
"jaw1": [0, 5, -4]
}
},
{
"name": "locator_jaw_lower",
"parent": "mouths",
"pivot": [0, 3, -4],
"locators": {
"jaw2": [0, 3, -4]
}
},
{
"name": "mouths_closed",
"parent": "mouths",
"pivot": [0, 3.75, -2.875],
"cubes": [
{"origin": [2, 3.5, -0.5], "size": [3, 1, 2], "uv": [24, 12]}
{"origin": [-4, 2, -4], "size": [8, 4, 0], "uv": [2, 26]},
{"origin": [4, 2, -4], "size": [0, 4, 4], "uv": [10, 31]},
{"origin": [-4, 2, -4], "size": [0, 4, 4], "uv": [1, 31]}
]
},
{
"name": "arm_right",
"parent": "torso",
"pivot": [-2.5, 4, 0.5],
"name": "mouth_closed_corners",
"parent": "mouths_closed",
"pivot": [0, 3.5, -3.5],
"cubes": [
{"origin": [-5, 3.5, -0.5], "size": [3, 1, 2], "uv": [31, 8]}
{"origin": [-4, 3, -4], "size": [1, 1, 1], "inflate": 0.01, "uv": [2, 47]},
{"origin": [3, 3, -4], "size": [1, 1, 1], "inflate": 0.01, "uv": [9, 47]}
]
},
{
"name": "mouth_top",
"parent": "torso",
"pivot": [0, 4, -3],
"name": "mouth_closed_main",
"parent": "mouths_closed",
"pivot": [0, 3, -3.5],
"cubes": [
{"origin": [-2, 3.5, -3], "size": [4, 1, 0], "uv": [45, 11]}
{"origin": [-3, 2.5, -4], "size": [6, 1, 1], "inflate": 0.01, "uv": [2, 50]}
]
},
{
"name": "mouth_bottom",
"parent": "torso",
"pivot": [0, 2, -3],
"name": "mouth_open_happy",
"parent": "mouths",
"pivot": [0, 3.75, -2.875],
"cubes": [
{"origin": [-2, 1.5, -3], "size": [4, 1, 0], "uv": [31, 11]}
{"origin": [-4, 5, -4], "size": [8, 1, 0], "uv": [26, 25]},
{"origin": [4, 5, -4], "size": [0, 1, 4], "uv": [37, 34]},
{"origin": [-4, 5, -4], "size": [0, 1, 4], "uv": [46, 34]},
{"origin": [-4, 2, -1], "size": [0, 1, 1], "uv": [44, 18]},
{"origin": [4, 2, -1], "size": [0, 1, 1], "uv": [40, 18]},
{"origin": [-3, 2, -4], "size": [6, 1, 0], "uv": [26, 19]}
]
},
{
"name": "mouth_open_sad",
"parent": "mouths",
"pivot": [0, 3.75, -2.875],
"cubes": [
{"origin": [-4, 5, -4], "size": [8, 1, 0], "uv": [26, 22]},
{"origin": [4, 5, -4], "size": [0, 1, 4], "uv": [19, 34]},
{"origin": [-4, 5, -4], "size": [0, 1, 4], "uv": [28, 34]},
{"origin": [-3, 2, -4], "size": [6, 1, 0], "uv": [26, 28]}
]
},
{
"name": "eyes",
"parent": "face",
"pivot": [0, 4.85, -4.01]
},
{
"name": "eye_left",
"parent": "torso",
"pivot": [1.75, 4.75, -2.51],
"parent": "eyes",
"pivot": [2.25, 5, -3.5]
},
{
"name": "pupil_left",
"parent": "eye_left",
"pivot": [2.25, 5, -3.5],
"cubes": [
{"origin": [1.25, 4.25, -3.01], "size": [1, 1, 1], "uv": [0, 8]}
{"origin": [1.75, 4, -4], "size": [1, 2, 1], "inflate": 0.01, "uv": [2, 54]}
]
},
{
"name": "eyelid_right",
"name": "locator_eye_left",
"parent": "pupil_left",
"pivot": [2.25, 5, -4],
"locators": {
"eye2": [2.25, 5, -4]
}
},
{
"name": "eyelid_left",
"parent": "eye_left",
"pivot": [1.75, 4.75, -2.41],
"pivot": [2.25, 7, -3.4],
"cubes": [
{"origin": [0.75, 4.25, -2.91], "size": [2, 1, 1], "inflate": 0.01, "uv": [0, 20]}
{"origin": [1.25, 6, -3.9], "size": [2, 2, 1], "inflate": 0.02, "uv": [21, 54]}
]
},
{
"name": "eyelid_angry_left",
"parent": "eye_left",
"pivot": [1.75, 8, -3.4],
"cubes": [
{"origin": [1.25, 7.5, -3.9], "size": [1, 1, 1], "inflate": 0.02, "uv": [33, 55]}
]
},
{
"name": "eyelid_sad_left",
"parent": "eye_left",
"pivot": [2.75, 8, -3.4],
"cubes": [
{"origin": [2.25, 7.5, -3.9], "size": [1, 1, 1], "inflate": 0.02, "uv": [38, 55]}
]
},
{
"name": "eyelid_happy_left",
"parent": "eye_left",
"pivot": [2.25, 7, -3.4],
"cubes": [
{"origin": [1.75, 6, -3.9], "size": [1, 1, 1], "inflate": 0.03, "uv": [28, 55]},
{"origin": [1.25, 6.5, -3.9], "size": [2, 2, 1], "inflate": 0.02, "uv": [7, 54]}
]
},
{
"name": "eyelid_annoyed_left",
"parent": "eye_left",
"pivot": [2.25, 7.5, -3.4],
"cubes": [
{"origin": [1.25, 7, -3.9], "size": [2, 1, 1], "inflate": 0.02, "uv": [43, 55]}
]
},
{
"name": "eyelid_hurt_left",
"parent": "eye_left",
"pivot": [2.25, 7, -3.4],
"cubes": [
{"origin": [1.25, 6, -3.9], "size": [2, 2, 1], "inflate": 0.02, "uv": [14, 54]}
]
},
{
"name": "eye_right",
"parent": "torso",
"pivot": [-1.75, 4.75, -2.51],
"cubes": [
{"origin": [-2.25, 4.25, -3.01], "size": [1, 1, 1], "uv": [0, 6]}
]
"parent": "eyes",
"pivot": [-2.25, 5, -3.5]
},
{
"name": "eyelid_left",
"name": "pupil_right",
"parent": "eye_right",
"pivot": [-1.75, 4.75, -2.51],
"pivot": [-2.25, 5, -3.5],
"cubes": [
{"origin": [-2.75, 4.25, -2.91], "size": [2, 1, 1], "inflate": 0.01, "uv": [0, 18]}
{"origin": [-2.75, 4, -4], "size": [1, 2, 1], "inflate": 0.01, "uv": [2, 59]}
]
},
{
"name": "ribbon_right",
"name": "locator_eye_right",
"parent": "pupil_right",
"pivot": [-2.25, 5, -4],
"locators": {
"eye1": [-2.25, 5, -4]
}
},
{
"name": "eyelid_right",
"parent": "eye_right",
"pivot": [-2.25, 7, -3.4],
"cubes": [
{"origin": [-3.25, 6, -3.9], "size": [2, 2, 1], "inflate": 0.02, "uv": [21, 59]}
]
},
{
"name": "eyelid_angry_right",
"parent": "eye_right",
"pivot": [-1.75, 8, -3.4],
"cubes": [
{"origin": [-2.25, 7.5, -3.9], "size": [1, 1, 1], "inflate": 0.02, "uv": [33, 60]}
]
},
{
"name": "eyelid_sad_right",
"parent": "eye_right",
"pivot": [-2.75, 8, -3.4],
"cubes": [
{"origin": [-3.25, 7.5, -3.9], "size": [1, 1, 1], "inflate": 0.02, "uv": [38, 60]}
]
},
{
"name": "eyelid_happy_right",
"parent": "eye_right",
"pivot": [-2.25, 7, -3.4],
"cubes": [
{"origin": [-2.75, 6, -3.9], "size": [1, 1, 1], "inflate": 0.03, "uv": [28, 60]},
{"origin": [-3.25, 6.5, -3.9], "size": [2, 2, 1], "inflate": 0.02, "uv": [7, 59]}
]
},
{
"name": "eyelid_annoyed_right",
"parent": "eye_right",
"pivot": [-2.25, 7.5, -3.4],
"cubes": [
{"origin": [-3.25, 7, -3.9], "size": [2, 1, 1], "inflate": 0.02, "uv": [43, 60]}
]
},
{
"name": "eyelid_hurt_right",
"parent": "eye_right",
"pivot": [-2.25, 7, -3.4],
"cubes": [
{"origin": [-3.25, 6, -3.9], "size": [2, 2, 1], "inflate": 0.02, "uv": [14, 59]}
]
},
{
"name": "face_ditto",
"parent": "face",
"pivot": [0, 5, 1.99]
},
{
"name": "eyes_ditto",
"parent": "face_ditto",
"pivot": [0, 5, 1.99],
"cubes": [
{"origin": [-3, 4.5, 1.99], "size": [6, 1, 0], "uv": [50, 56]}
]
},
{
"name": "eyes_closed_ditto",
"parent": "face_ditto",
"pivot": [0, 5.25, 2.09],
"cubes": [
{"origin": [-3.5, 4.5, 2.09], "size": [7, 1, 0], "inflate": 0.01, "uv": [50, 58]},
{"origin": [-3, 5, 2.08], "size": [6, 1, 0], "inflate": 0.01, "uv": [50, 60]}
]
},
{
"name": "bell_back",
"parent": "torso",
"pivot": [-0.75, 7, 3],
"rotation": [0, 0, 22.5],
"pivot": [0, 7.25, 3.5],
"cubes": [
{"origin": [-2.5, 6, 2.5], "size": [2, 2, 1], "uv": [0, 3]}
{"origin": [-1, 5.75, 3.5], "size": [2, 3, 2], "uv": [24, 12]}
]
},
{
"name": "ribbon_right2",
"parent": "ribbon_right",
"pivot": [-2, 7, 3],
"cubes": [
{"origin": [-7, 5.5, 2.5], "size": [5, 3, 1], "inflate": 0.01, "uv": [43, 6]}
]
},
{
"name": "ribbon_end_right",
"parent": "ribbon_right2",
"pivot": [-6.5, 8, 3],
"rotation": [0, 0, 12.5],
"cubes": [
{"origin": [-8.5, 7.5, 3], "size": [2, 1, 0], "uv": [53, 16]}
]
},
{
"name": "ribbon_end_right2",
"parent": "ribbon_right2",
"pivot": [-6.5, 7, 3],
"cubes": [
{"origin": [-8.5, 6.5, 3], "size": [2, 1, 0], "uv": [45, 10]}
]
},
{
"name": "ribbon_end_right3",
"parent": "ribbon_right2",
"pivot": [-6.5, 6, 3],
"rotation": [0, 0, -12.5],
"cubes": [
{"origin": [-8.5, 5.5, 3], "size": [2, 1, 0], "uv": [39, 9]}
]
"name": "ribbons",
"parent": "bell_back",
"pivot": [-0.75, 7.25, 4.5]
},
{
"name": "ribbon_left",
"parent": "torso",
"pivot": [0.75, 7, 3],
"rotation": [0, 0, -22.5],
"parent": "ribbons",
"pivot": [1, 7.25, 4.5],
"cubes": [
{"origin": [0.5, 6, 2.5], "size": [2, 2, 1], "uv": [0, 0]}
{"origin": [0.75, 6.25, 4], "size": [2, 2, 1], "uv": [42, 14]}
]
},
{
"name": "ribbon_left2",
"parent": "ribbon_left",
"pivot": [2, 7, 3],
"pivot": [2.5, 7.25, 4.5],
"cubes": [
{"origin": [2, 5.5, 2.5], "size": [5, 3, 1], "inflate": 0.01, "uv": [18, 6]}
{"origin": [2.25, 5.75, 3.5], "size": [4, 3, 2], "inflate": 0.01, "uv": [52, 6]}
]
},
{
"name": "ribbon_end_left",
"name": "ribbon_left3",
"parent": "ribbon_left2",
"pivot": [6.5, 8, 3],
"rotation": [0, 0, -12.5],
"pivot": [5.75, 7.25, 4.5],
"cubes": [
{"origin": [6.5, 7.5, 3], "size": [2, 1, 0], "uv": [39, 8]}
{"origin": [5.5, 5.25, 3.5], "size": [4, 4, 2], "inflate": 0.25, "uv": [52, 0]}
]
},
{
"name": "ribbon_end_left2",
"parent": "ribbon_left2",
"pivot": [6.5, 7, 3],
"name": "ribbon_left4",
"parent": "ribbon_left3",
"pivot": [10.75, 7.25, 4.5]
},
{
"name": "ribbon_tip_top_left",
"parent": "ribbon_left4",
"pivot": [9.5, 8.75, 4.5],
"cubes": [
{"origin": [6.5, 6.5, 3], "size": [2, 1, 0], "uv": [0, 11]}
{"origin": [9.25, 7.75, 4], "size": [3, 2, 1], "uv": [56, 11]}
]
},
{
"name": "ribbon_end_left3",
"parent": "ribbon_left2",
"pivot": [6.5, 6, 3],
"rotation": [0, 0, 12.5],
"name": "ribbon_tip_middle_left",
"parent": "ribbon_left4",
"pivot": [9.5, 7.25, 4.5],
"cubes": [
{"origin": [6.5, 5.5, 3], "size": [2, 1, 0], "uv": [0, 10]}
{"origin": [9.75, 6.25, 4], "size": [3, 2, 1], "inflate": 0.01, "uv": [56, 14]}
]
},
{
"name": "leg_left",
"name": "ribbon_tip_bottom_left",
"parent": "ribbon_left4",
"pivot": [9.5, 5.75, 4.5],
"cubes": [
{"origin": [9.25, 4.75, 4], "size": [3, 2, 1], "uv": [56, 17]}
]
},
{
"name": "ribbon_right",
"parent": "ribbons",
"pivot": [-1, 7.25, 4.5],
"cubes": [
{"origin": [-2.75, 6.25, 4], "size": [2, 2, 1], "uv": [42, 11]}
]
},
{
"name": "ribbon_right2",
"parent": "ribbon_right",
"pivot": [-2.5, 7.25, 4.5],
"cubes": [
{"origin": [-6.25, 5.75, 3.5], "size": [4, 3, 2], "inflate": 0.01, "uv": [40, 6]}
]
},
{
"name": "ribbon_right3",
"parent": "ribbon_right2",
"pivot": [-5.75, 7.25, 4.5],
"cubes": [
{"origin": [-9.5, 5.25, 3.5], "size": [4, 4, 2], "inflate": 0.25, "uv": [40, 0]}
]
},
{
"name": "ribbon_right4",
"parent": "ribbon_right3",
"pivot": [-10.75, 7.25, 4.5]
},
{
"name": "ribbon_tip_top_right",
"parent": "ribbon_right4",
"pivot": [-9.5, 8.75, 4.5],
"cubes": [
{"origin": [-12.25, 7.75, 4], "size": [3, 2, 1], "uv": [48, 11]}
]
},
{
"name": "ribbon_tip_middle_right",
"parent": "ribbon_right4",
"pivot": [-9.5, 7.25, 4.5],
"cubes": [
{"origin": [-12.75, 6.25, 4], "size": [3, 2, 1], "inflate": 0.01, "uv": [48, 14]}
]
},
{
"name": "ribbon_tip_bottom_right",
"parent": "ribbon_right4",
"pivot": [-9.5, 5.75, 4.5],
"cubes": [
{"origin": [-12.25, 4.75, 4], "size": [3, 2, 1], "uv": [48, 17]}
]
},
{
"name": "arms",
"parent": "torso",
"pivot": [0, 4, 1]
},
{
"name": "arm_left",
"parent": "arms",
"pivot": [3.5, 4, 1],
"cubes": [
{"origin": [2.75, 3, 0], "size": [4, 2, 2], "inflate": -0.25, "uv": [24, 8]}
]
},
{
"name": "locator_hand_secondary",
"parent": "arm_left",
"pivot": [6.1, 4, 1],
"rotation": [0, -90, 0],
"locators": {
"hand_secondary": [6.1, 4, 1]
}
},
{
"name": "arm_right",
"parent": "arms",
"pivot": [-3.5, 4, 1],
"cubes": [
{"origin": [-6.75, 3, 0], "size": [4, 2, 2], "inflate": -0.25, "uv": [24, 4]}
]
},
{
"name": "locator_hand_primary",
"parent": "arm_right",
"pivot": [-6.1, 4, 1],
"rotation": [0, 90, 0],
"locators": {
"hand_primary": [-6.1, 4, 1]
}
},
{
"name": "locator_item",
"parent": "arm_right",
"pivot": [-6.1, 3.5, 1],
"locators": {
"item": [-6.1, 3.5, 1]
}
},
{
"name": "legs",
"parent": "body",
"pivot": [1.5, 1.25, 0.5],
"pivot": [0, 1, 0.5]
},
{
"name": "foot_left",
"parent": "legs",
"pivot": [2, 1, 1],
"cubes": [
{"origin": [0.5, 0, -1.5], "size": [2, 1, 3], "uv": [52, 12]}
{"origin": [1, 0, -1.5], "size": [2, 1, 3], "uv": [20, 0]}
]
},
{
"name": "leg_right",
"parent": "body",
"pivot": [-1.5, 1.25, 0.5],
"name": "locator_foot_secondary",
"parent": "foot_left",
"pivot": [2, 0.5, 0],
"rotation": [90, 0, 0],
"locators": {
"foot_secondary": [2, 0.5, 0]
}
},
{
"name": "foot_right",
"parent": "legs",
"pivot": [-2, 1, 1],
"cubes": [
{"origin": [-2.5, 0, -1.5], "size": [2, 1, 3], "uv": [54, 8]}
{"origin": [-3, 0, -1.5], "size": [2, 1, 3], "uv": [30, 0]}
]
},
{
"name": "locator_foot_primary",
"parent": "foot_right",
"pivot": [-2, 0.5, 0],
"rotation": [90, 0, 0],
"locators": {
"foot_primary": [-2, 0.5, 0]
}
}
]
}
@@ -18,7 +18,7 @@
{
"name": "body",
"parent": "croagunk",
"pivot": [0, 0, 0]
"pivot": [0, 12, 0]
},
{
"name": "torso",
@@ -35,7 +35,7 @@
{
"name": "torso2",
"parent": "torso",
"pivot": [0, 13, 1.3],
"pivot": [0, 13, 2.3],
"cubes": [
{"origin": [-4.5, 12, -2.7], "size": [9, 8, 8], "uv": [29, 34]}
]
@@ -53,7 +53,7 @@
"parent": "arm_left",
"pivot": [9.5, 15.41299, 3.06175],
"cubes": [
{"origin": [9.5, 14.41299, 0.56175], "size": [4, 2, 3], "uv": [36, 29]}
{"origin": [9.5, 14.41299, 0.56175], "size": [4, 2, 3], "inflate": 0.01, "uv": [36, 29]}
]
},
{
@@ -127,7 +127,7 @@
"parent": "arm_right",
"pivot": [-9.5, 15.41299, 3.06175],
"cubes": [
{"origin": [-13.5, 14.41299, 0.56175], "size": [4, 2, 3], "uv": [50, 29], "mirror": true}
{"origin": [-13.5, 14.41299, 0.56175], "size": [4, 2, 3], "inflate": 0.01, "uv": [50, 29], "mirror": true}
]
},
{
@@ -7,10 +7,17 @@
"texture_width": 64,
"texture_height": 64,
"visible_bounds_width": 3,
"visible_bounds_height": 2.5,
"visible_bounds_offset": [0, 0.75, 0]
"visible_bounds_height": 3.5,
"visible_bounds_offset": [0, 1.25, 0]
},
"bones": [
{
"name": "bb_main",
"pivot": [0, 0, 0],
"cubes": [
{"origin": [-2, 0, 0], "size": [2, 2, 2], "uv": [0, 0]}
]
},
{
"name": "croagunk",
"pivot": [0, 0, 0]
@@ -18,7 +25,7 @@
{
"name": "body",
"parent": "croagunk",
"pivot": [0, 0, 0]
"pivot": [0, 12, 0]
},
{
"name": "torso",
@@ -35,7 +42,7 @@
{
"name": "torso2",
"parent": "torso",
"pivot": [0, 13, 1.3],
"pivot": [0, 13, 2.3],
"cubes": [
{"origin": [-4.5, 12, -2.7], "size": [9, 8, 8], "uv": [30, 9]}
]
@@ -53,7 +60,7 @@
"parent": "arm_left",
"pivot": [9.5, 15.41299, 3.06175],
"cubes": [
{"origin": [9.5, 14.41299, 0.56175], "size": [4, 2, 3], "uv": [36, 29]}
{"origin": [9.5, 14.41299, 0.56175], "size": [4, 2, 3], "inflate": 0.01, "uv": [36, 29]}
]
},
{
@@ -127,7 +134,7 @@
"parent": "arm_right",
"pivot": [-9.5, 15.41299, 3.06175],
"cubes": [
{"origin": [-13.5, 14.41299, 0.56175], "size": [4, 2, 3], "uv": [50, 29], "mirror": true}
{"origin": [-13.5, 14.41299, 0.56175], "size": [4, 2, 3], "inflate": 0.01, "uv": [50, 29], "mirror": true}
]
},
{
@@ -18,7 +18,7 @@
{
"name": "body",
"parent": "toxicroak",
"pivot": [0, 0, 0]
"pivot": [0, 19, 0]
},
{
"name": "torso",
@@ -18,7 +18,7 @@
{
"name": "body",
"parent": "toxicroak",
"pivot": [0, 0, 0]
"pivot": [0, 19, 0]
},
{
"name": "torso",

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