Compare commits

...
Author SHA1 Message Date
Guilherme Pereira 1e7f70dc13 update anger veins particle 2026-08-04 21:22:51 -04:00
Guilherme Pereira 5612f09713 refactor mood particles to use action effects 2026-07-31 10:05:29 -04:00
Guilherme Pereira c197aeb9d8 Merge branch 'main' of gitlab.com:cable-mc/cobblemon into mood-particles 2026-07-30 14:19:01 -04:00
Polymeta d671c5a8b8 [skip-ci] tidy up changelog
Signed-off-by: Polymeta <4726322-polymeta@users.noreply.gitlab.com>
2026-07-29 11:59:10 +01:00
Polymeta 69b31dd9b9 fix up null checks to prevent crashes during ticks in BerryBlock
Signed-off-by: Polymeta <4726322-polymeta@users.noreply.gitlab.com>
2026-07-29 11:45:50 +01:00
Polymeta fc94bbac4c Merge branch 'dandelion-sinistertea-fix' into 'main'
Dandelion Sinister Tea Fix

See merge request cable-mc/cobblemon!2324
2026-07-28 15:53:25 +00:00
CeejayandPolymeta f7d315fa33 Dandelion Sinister Tea Fix 2026-07-28 15:53:25 +00:00
Paul 7c30fd81f3 Scraped behaviours for updated AI behaviour 2026-07-28 20:10:29 +10:00
Paul 7f1704d573 Fixed habitat spelling beheeyem wrong 2026-07-28 19:49:22 +10:00
Paul 0c2ec3ca81 Scraped habitat spawns, deduplicated fixes in changelog, update wildlife -> wildfire in habitat pool 2026-07-28 19:43:09 +10:00
Paul 33d3e156cc Merge remote-tracking branch 'origin/lang-updates' 2026-07-28 19:06:49 +10:00
arvid6andWeblate 415642a8ba Translated using Weblate (Spanish)
Currently translated at 99.6% (9432 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/es/
2026-07-27 18:45:01 +00:00
arvid6andWeblate dd12081cd1 Translated using Weblate (Spanish)
Currently translated at 99.5% (9425 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/es/
2026-07-27 11:20:52 +00:00
arvid6andWeblate b7de84acfd Translated using Weblate (Spanish)
Currently translated at 99.1% (9384 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/es/
2026-07-27 11:06:54 +00:00
Hiroku 8efda8c47b Merge branch 'main' into 'main'
Fix load time deadlock between ElementalType and ElementalTypes

Closes #2034

See merge request cable-mc/cobblemon!2332
2026-07-26 02:24:21 +00:00
Naitronbomb 6baf96f83b Add changelog entry for load time deadlock fix 2026-07-25 11:13:18 -07:00
Naitronbomb 009a9c3f15 Fix load time deadlock between ElementalType and ElementalTypes 2026-07-25 09:29:47 -07:00
Polymeta fc0a6c0c8b Merge branch 'gem-unbalance' into 'main'
Type Gem Loot Table Tweaks

See merge request cable-mc/cobblemon!2322
2026-07-25 16:14:44 +00:00
Hiroku 041e080cd4 Merge branch 'fix-starter-toast-dismissal' into 'main'
Fix starter toast not being dismissed when capturing a pokemon

See merge request cable-mc/cobblemon!2331
2026-07-25 03:13:11 +00:00
lionandHiroku 65bbadcfa8 Fix starter toast not being dismissed when capturing a pokemon 2026-07-25 03:13:11 +00:00
阿鱼andWeblate a70d5e200a Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.5% (9420 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/zh_Hans/
2026-07-25 00:24:55 +00:00
阿鱼andWeblate 4d0ee751a3 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 97.2% (9206 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/zh_Hans/
2026-07-24 22:42:33 +00:00
Hiroku d87438e53d I'll try changing the repo URL, that's a good trick 2026-07-24 16:57:53 +10:00
Hiroku 3efef07afa Merge remote-tracking branch 'origin/main' 2026-07-24 16:27:11 +10:00
Hiroku 9ff227fbef Fix pipelines maybe with findutils installs? 2026-07-24 16:27:01 +10:00
Hiroku 55ef5fd537 Merge branch 'fix-forms-riding-camera-offset' into 'main'
Fix riding camera offset defined on Pokemon forms not being applied

See merge request cable-mc/cobblemon!2326
2026-07-24 06:23:29 +00:00
lionandHiroku b3cdfb579c Fix riding camera offset defined on Pokemon forms not being applied 2026-07-24 06:23:28 +00:00
Hiroku 29588f1fde Merge branch 'implement_pokemon' into 'main'
the last of 1.8 (merge once ride stats are in)

See merge request cable-mc/cobblemon!2329
2026-07-24 06:19:25 +00:00
Polymeta 24c10d1a4f Merge branch 'riding-scrape-1.8' into 'implement_pokemon'
Riding scrape

See merge request cable-mc/cobblemon!2330
2026-07-24 06:10:15 +00:00
Carmendar ac0d9d4d74 Seat fixes 2026-07-24 00:53:00 -05:00
Nico MerenqandWeblate d33974b19e Translated using Weblate (Russian)
Currently translated at 78.8% (7467 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/ru/
2026-07-24 05:48:29 +00:00
Carmendar 1dcdfe309e Correcting Goodra ride stats 2026-07-24 00:03:33 -05:00
Landon Wills 6ce1990145 Fix issues with scraper 2026-07-24 00:54:33 -04:00
Landon Wills 1203721889 Remove pidgeotto scrape 2026-07-24 00:54:01 -04:00
Landon Wills 333672f993 Push pidgeot riding scrape 2026-07-24 00:53:33 -04:00
Carmendar f0f9a9596f Merge remote-tracking branch 'origin/implement_pokemon' into implement_pokemon 2026-07-23 23:52:58 -05:00
Carmendar 80b8aa2b8c Hisuian Goodra anim updates 2026-07-23 23:52:41 -05:00
Landon Wills b919e447d8 Add scraped files 2026-07-24 00:36:22 -04:00
Hiroku 3075b7fd73 Improved spawn scraper script: recognize more time range names, support 'storm' as a weather condition 2026-07-24 14:31:13 +10:00
ewwww 412e3fcb8a minor poser tweaks 2026-07-24 00:23:14 -04:00
ewwww 32253fd462 starmie shiny texture fix 2026-07-23 23:17:42 -04:00
arvid6andWeblate 4de018a209 Translated using Weblate (Spanish)
Currently translated at 98.2% (9297 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/es/
2026-07-23 15:30:25 +00:00
ewwww 2204a4b700 substitute remodel + animations 2026-07-23 02:43:37 -04:00
arvid6andWeblate 22a27cbbd7 Translated using Weblate (Spanish)
Currently translated at 97.5% (9238 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/es/
2026-07-21 18:03:56 +00:00
arvid6andWeblate e202e7bf2f Translated using Weblate (Spanish)
Currently translated at 97.3% (9217 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/es/
2026-07-21 17:03:35 +00:00
ewwww 03104b3a3d re-deleting these 2026-07-20 04:09:26 -04:00
Polymeta 280e1ae820 Merge branch 'implement_these_dumbfuck_birds' into 'implement_pokemon'
Implement these dumbfuck birds

See merge request cable-mc/cobblemon!2328
2026-07-20 08:02:19 +00:00
Carmendar ee5653bfba Merge branch 'implement_pokemon' into implement_these_dumbfuck_birds
# Conflicts:
#	common/src/main/kotlin/com/cobblemon/mod/common/client/render/models/blockbench/repository/VaryingModelRepository.kt
2026-07-20 02:49:35 -05:00
Carmendar a9c3c14367 Finishing touches to Pidgeot 2026-07-20 02:44:46 -05:00
Paul 9cdc979067 Fixed /giveallpokemon not respecting the min and max options 2026-07-20 13:13:27 +10:00
Carmendar 4b45fdde3f Pidgeotto fixed, and work done to Pidgeot. 2026-07-19 14:55:31 -05:00
Nico MerenqandWeblate 5bf7cc6aef Translated using Weblate (Russian)
Currently translated at 78.7% (7454 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/ru/
2026-07-19 12:01:56 +00:00
Polymeta 7cf1f5a4e5 Merge branch 'habitats-crash-fix' into 'main'
Fixed some crashes that happened due to invalid processor referencing and structure

See merge request cable-mc/cobblemon!2327
2026-07-18 22:12:10 +00:00
Faintful 0fe2b0f60c Fixed some crashes that happened due to invalid processor referencing and structure 2026-07-18 22:22:56 +02:00
阿鱼andWeblate 667376226b Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 96.4% (9134 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/zh_Hans/
2026-07-18 14:24:13 +00:00
Nico MerenqandWeblate 5506e076f6 Translated using Weblate (Russian)
Currently translated at 78.5% (7437 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/ru/
2026-07-18 14:24:11 +00:00
Hiroku f8799efd9d Merge branch 'Habitat-Blocks-pt2' into 'main'
Habitat blocks pt2

See merge request cable-mc/cobblemon!2325
2026-07-18 01:47:16 +00:00
Slippy bb642fbf29 ALL HABITATS HAVE HABITAT BLOCKS!!! 2026-07-17 16:23:59 -05:00
Nico MerenqandWeblate e19aa02283 Translated using Weblate (Russian)
Currently translated at 78.5% (7433 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/ru/
2026-07-17 17:47:39 +00:00
Slippy e65010e289 Six more habitats with habitat blocks 2026-07-16 01:05:07 -05:00
Nico MerenqandWeblate 4b4a715868 Translated using Weblate (Russian)
Currently translated at 78.4% (7429 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/ru/
2026-07-15 20:06:53 +00:00
Slippy 26ec5717f1 11 more habitats with habitat blocks 2026-07-15 11:55:41 -05:00
Nico MerenqandWeblate 446d4771d8 Translated using Weblate (Russian)
Currently translated at 78.4% (7429 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/ru/
2026-07-15 13:44:03 +00:00
Nico MerenqandWeblate 9d817b3f77 Translated using Weblate (Russian)
Currently translated at 78.4% (7427 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/ru/
2026-07-15 03:10:05 +00:00
Zack the GhastandWeblate 21213c4fce Translated using Weblate (Portuguese (Portugal))
Currently translated at 66.3% (6281 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/pt_PT/
2026-07-14 07:36:57 +00:00
Watuneni iteiteandWeblate cebf105dd5 Translated using Weblate (Japanese)
Currently translated at 100.0% (9467 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/ja/
2026-07-13 07:43:46 +00:00
Jakotens 123d3291c6 Fixed Gogoat's battle_idle animation being absent from its poser which caused certain battle animations to break. 2026-07-12 16:21:57 -06:00
dhi_holo 935a39c578 Type Gems now place Stage 1 (Medium) rather than Stage 0 (Small) 2026-07-12 17:56:24 +10:00
dhi_holo d53e67b55c New Loot Tables 2026-07-12 17:31:50 +10:00
Zack the GhastandWeblate ec0766ddcd Translated using Weblate (Portuguese (Portugal))
Currently translated at 65.9% (6244 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/pt_PT/
2026-07-11 15:56:17 +00:00
Nico MerenqandWeblate 917577f7a8 Translated using Weblate (Russian)
Currently translated at 78.3% (7418 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/ru/
2026-07-11 03:06:15 +00:00
Nico MerenqandWeblate 01de2f71af Translated using Weblate (Russian)
Currently translated at 78.2% (7412 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/ru/
2026-07-10 14:42:24 +00:00
Nico MerenqandWeblate 0779251581 Translated using Weblate (Russian)
Currently translated at 76.5% (7244 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/ru/
2026-07-09 23:17:58 +00:00
Nico MerenqandWeblate 14d4c6c2e4 Translated using Weblate (Russian)
Currently translated at 76.2% (7222 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/ru/
2026-07-09 21:50:35 +00:00
Nico MerenqandWeblate de82d36da3 Translated using Weblate (Russian)
Currently translated at 75.2% (7124 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/ru/
2026-07-09 17:04:40 +00:00
Nico MerenqandWeblate ae2704e218 Translated using Weblate (Russian)
Currently translated at 75.0% (7104 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/ru/
2026-07-09 13:30:48 +00:00
Nico MerenqandWeblate a235c1286c Translated using Weblate (Russian)
Currently translated at 74.6% (7063 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/ru/
2026-07-09 13:20:24 +00:00
Polymeta ce584bd403 Merge branch 'tm-unlock-utilities' into 'main'
Move Data Monitor Learn to Helper, Add Utility and MoLang Functions for Unlocking TMs + Impossible Obtain Method

See merge request cable-mc/cobblemon!2321
2026-07-09 08:09:45 +00:00
Konoha DandPolymeta 1c25861e04 Move Data Monitor Learn to Helper, Add Utility and MoLang Functions for Unlocking TMs + Impossible Obtain Method 2026-07-09 08:09:45 +00:00
Watuneni iteiteandWeblate 006cc21ebb Translated using Weblate (Japanese)
Currently translated at 100.0% (9467 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/ja/
2026-07-08 03:33:00 +00:00
Watuneni iteiteandWeblate 5ab9072f94 Translated using Weblate (Japanese)
Currently translated at 99.6% (9431 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/ja/
2026-07-07 09:36:33 +00:00
Watuneni iteiteandWeblate f7023b9737 Translated using Weblate (Japanese)
Currently translated at 99.4% (9417 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/ja/
2026-07-06 07:04:09 +00:00
Paul 987a7d0ccc Fixed entity attributes not updating when a pokemon levels up 2026-07-04 11:56:47 +10:00
ewwww d49c0a0ec6 changelog 2026-07-03 17:26:41 -04:00
ewwww d4a910bf26 added corsola's physical attack + updated textures 2026-07-03 17:23:13 -04:00
Kenji_64 25b75231ad Implemented Cottonee and Whimsicott animations! 2026-07-03 17:22:13 +02:00
RedGenesectNinja 0db1f372e3 Adjusted swimming heights for both forms of Grimer and Muk 2026-07-03 03:58:57 -05:00
RedGenesectNinja 1ddffc1c0d Merge remote-tracking branch 'origin/implement_pokemon' into implement_pokemon 2026-07-03 01:19:34 -05:00
RedGenesectNinja 5fe04aad83 Implemented Grimer animations 2026-07-02 20:26:49 -05:00
Polymeta 03b74d4b72 Merge branch 'implement_pokemon' into 'main'
various asset updates

See merge request cable-mc/cobblemon!2319
2026-07-02 06:16:52 +00:00
ewwww a5f150af9a poser tweaks 2026-07-02 00:56:11 -04:00
ewwww b3b5e47cc9 tinyprogress 2026-07-02 00:06:01 -04:00
Watuneni iteiteandWeblate 1d0aa06dc4 Translated using Weblate (Japanese)
Currently translated at 99.1% (9389 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/ja/
2026-07-01 11:24:54 +00:00
ewwww 1e5c0f5137 added chansey + blissey animations 2026-07-01 00:26:07 -04:00
ewwww 7bafd53f58 minor dugtrio tweaks 2026-06-30 07:36:16 -04:00
ewwww bdbdf238f5 dugtrio physical attack + diglett tweaks 2026-06-30 07:06:24 -04:00
ewwww 6cd71050df added golett remodel 2026-06-30 04:11:09 -04:00
Polymeta 2047f4f461 Merge branch 'my-stupid-tmm-bug' into 'main'
Fix for TMM putting burn screen tab when no tm is selected

See merge request cable-mc/cobblemon!2320
2026-06-30 08:08:37 +00:00
Gertimoshka 0aaed4bb84 Fixed issue where it would still put you on burn screen even with no tm selected 2026-06-30 06:03:56 +03:00
ewwww 3779b4c0b3 updated assets 2026-06-29 17:42:21 -04:00
ewwww 74aaa16a0d physical attack animation for graveler + eye locators for alolan graveler 2026-06-29 07:01:18 -04:00
ewwww 332ef2fddd diglett physical attack 2026-06-29 06:30:21 -04:00
ewwww f29c5c5f6d new animations for sandshrew 2026-06-29 05:24:17 -04:00
ewwww c46375aafb new animations for nidoran male, female, and nidorina 2026-06-29 05:23:54 -04:00
Watuneni iteiteandWeblate a5e16ccf65 Translated using Weblate (Japanese)
Currently translated at 98.7% (9349 of 9467 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/ja/
2026-06-29 08:24:38 +00:00
ewwww 4cc83560e8 kakuna animations 2026-06-29 01:53:20 -04:00
ewwww a7f4ef8449 mountable duraludon and archaludon (stats not final) 2026-06-29 01:25:42 -04:00
ewwww edaafa2263 work in progress i'm sleep deprived 2026-06-28 08:28:18 -04:00
ewwww 0162bdae5f added new animations for poliwhirl 2026-06-27 18:54:44 -04:00
ewwww 34fc434883 implemented new battle animations for happiny 2026-06-27 05:51:30 -04:00
ewwww 74949a02de yungoos poser tweak 2026-06-27 05:51:04 -04:00
ewwww 1617c1b087 added zubat physical animation 2026-06-27 04:57:03 -04:00
ewwww 4b1c180538 added poliwrath walk animation 2026-06-27 04:56:50 -04:00
ewwww cba6f51706 implemented new yungoos & gumshoos animations 2026-06-27 03:46:00 -04:00
ewwww 9b9fbedaf7 Merge remote-tracking branch 'origin/implement_pokemon' into implement_pokemon 2026-06-26 19:27:45 -04:00
ewwww 8c3acd9a0e 'angery' typo 2026-06-26 18:23:48 -04:00
CaptainLennie 4ab52cac0e Merge remote-tracking branch 'origin/implement_pokemon' into implement_pokemon 2026-06-26 19:28:24 +02:00
CaptainLennie 68805a5dd1 Fixed tentacool using ground animations while swimming on the surface (and updated to JSON poser) 2026-06-26 19:28:10 +02:00
Jerzykv 5a0b4e8f99 Alolan Vulpix portrait tweak 2026-06-26 14:03:11 +02:00
Jerzykv 3e9d3a307f Implemented animations for Rellor and Rabsca 2026-06-26 13:59:14 +02:00
ewwww 7c4d3ecb71 tweaked aerodactyl's walkspeed 2026-06-26 07:30:01 -04:00
ewwww e91fd5596a implemented new vulpix animations 2026-06-26 07:29:29 -04:00
ewwww f9d218adf8 forgot something 2026-06-25 05:46:04 -04:00
ewwww 05d70b28e7 monitor screen updates 2026-06-25 05:41:30 -04:00
ewwww 6755462eb0 added new animations for noctowl 2026-06-25 05:39:58 -04:00
ewwww 7ef3facac8 added new animations for drowzee and hypno 2026-06-25 04:07:39 -04:00
ewwww b7c16324bd misc texture fixes 2026-06-24 04:05:06 -04:00
Polymeta 7ccd0bbe11 Merge branch 'multiplayer_mount_sync' into 'main'
Multiplayer mount sync

Closes #2023

See merge request cable-mc/cobblemon!2315
2026-06-22 12:23:42 +00:00
ewwww e1cc9c7aba added new animations for Togetic 2026-06-22 02:45:55 -04:00
ewwww 79e821a438 added new animations for Staryu and Starmie 2026-06-22 01:08:45 -04:00
Polymeta d289880cc8 Merge branch 'tmm-fixes-n-changes' into 'main'
TMM Fixes and Changes

See merge request cable-mc/cobblemon!2316
2026-06-20 19:43:21 +00:00
ewwww 19dd57feed form name corrections 2026-06-20 13:16:12 -04:00
Paul 6609c7d038 Added held_item_visible pokemonproperty 2026-06-20 22:29:14 +10:00
Paul 88afe05c16 Fixed NPE's when block entities aren't attached to berry blocks at time of ticking, closes #2020 2026-06-20 18:01:52 +10:00
ewwww e739b57a08 grammar. 2026-06-20 01:22:04 -04:00
Gertimoshka 99aa25e1bf I forgor 2026-06-19 17:50:52 +03:00
Gertimoshka 76faa50035 Fixes, tmm multiplayer syncing and cleanup 2026-06-19 17:42:50 +03:00
aeroeng15 8ce989cb6b Changelog 2026-06-18 19:03:45 -07:00
aeroeng15 02030950aa Force passenger updates 2026-06-18 18:53:36 -07:00
Polymeta 6148b58fdc Merge branch 'qa-fixes-84' into 'main'
Qa fixes 84

See merge request cable-mc/cobblemon!2314
2026-06-17 11:17:33 +00:00
ewwww 2044762b72 various poser alterations that accidentally got reverted 2026-06-17 05:33:34 -04:00
ewwww 77117e83c7 implemented (non-riding) animations & corrected scales for Duraludon & Archaludon 2026-06-17 05:33:21 -04:00
Carmendar 55f4e6e738 Goodra ride anim adjustments 2026-06-17 00:57:18 -05:00
Faintful 1e4936aeac Add changelog 2026-06-16 20:40:08 +02:00
Faintful 15ea72e777 Fixed Smoked Tail Curry returning a wooden bowl when consumed 2026-06-16 20:38:56 +02:00
Polymeta 3c3d4e4552 [skip-ci] changelogging 2026-06-16 17:43:50 +00:00
Polymeta 796e416578 Merge branch 'fix-auto-third-person-mod-compat' into 'main'
Add check for remember ride camera config when dismounting

Closes #2012

See merge request cable-mc/cobblemon!2308
2026-06-16 17:37:08 +00:00
lionandPolymeta 7608dfde94 Add check for remember ride camera config when dismounting 2026-06-16 17:37:07 +00:00
Polymeta b2b871617a Merge branch 'qa-fixes-85' into 'main'
Qa fixes 85

See merge request cable-mc/cobblemon!2313
2026-06-16 17:19:16 +00:00
Faintful bc4c8d13b7 Fix Panpour consuming a held item when evolving with a Water Stone 2026-06-16 17:07:36 +02:00
Faintful 0f9c51f7dd Fixed full heal stackable block not dropping full heals 2026-06-16 16:05:06 +02:00
Polymeta 2c2623e0f9 Merge branch 'summary-and-pokedex-profile-translations' into 'main'
Add profile translation and scale properties specific to the Pokédex and summary

See merge request cable-mc/cobblemon!2309
2026-06-16 13:44:41 +00:00
lionandPolymeta 8ec85e7d2f Add profile translation and scale properties specific to the Pokédex and summary 2026-06-16 13:44:41 +00:00
Faintful 7af9b0854a Fixed Status Cure items not returning a bottle after use 2026-06-15 17:55:22 +02:00
Guilherme Pereira 2ce1b465d4 add mood particle assets 2026-03-01 19:33:21 -03:00
Guilherme Pereira 1e35b7c1ae update CHANGELOG.md 2025-12-16 17:25:14 -03:00
Guilherme Pereira d4f2070d1f add mood particle for when pokemon is fleeing from an attacker 2025-12-16 17:20:19 -03:00
Guilherme Pereira dcc162fd98 make all fullness items play mood particles 2025-12-16 15:11:01 -03:00
Guilherme Pereira 2287c7718e add mood particles 2025-12-11 17:02:16 -03:00
1014 changed files with 162698 additions and 24461 deletions
+4
View File
@@ -16,6 +16,7 @@ check_assets_cache:
stage: preprocessing
script:
- echo "Checking if cached hash matches current hash"
- yum install -y findutils
# Calculate the current hash
- find common/src/main/resources/assets common/src/main/resources/data -type f -exec sha256sum {} + | sort -k 2 | sha256sum > current_hash.txt
@@ -148,6 +149,7 @@ build:
dependencies:
- replace_resources
script:
- yum install -y findutils
- export GRADLE_OPTS="-Xmx4G -Xms4G"
- chmod +x ./gradlew
- ./gradlew build
@@ -163,6 +165,7 @@ publish:
rules:
- if: '$CI_PROJECT_PATH == "cable-mc/cobblemon" && $CI_COMMIT_BRANCH == "main"'
script:
- yum install -y findutils
- export GRADLE_OPTS="-Xmx4G -Xms4G"
- chmod +x ./gradlew
- ./gradlew publish
@@ -176,6 +179,7 @@ deploy_artifacts:
dependencies:
- build
script:
- yum install -y findutils
- echo "Collecting artifacts..."
- find neoforge/build/libs/ -type f -name "*.jar" | grep -vE "dev-shadow|sources|javadoc" | xargs -I {} mv {} ./
- find fabric/build/libs/ -type f -name "*.jar" | grep -vE "dev-shadow|sources|javadoc" | xargs -I {} mv {} ./
+83 -27
View File
@@ -2,6 +2,14 @@
## [1.8.0 (MONTH Xth, 2026)](#1-8-0)
### Additions
- Added riding statistics: `Distance by Pokémon on Land`, `Distance by Pokémon in Air` and `Distance by Pokémon in Liquid`.
- Added the Partner Mark, which party Pokémon have a very small chance to earn as the player walks, provided they have enough friendship.
- Added trades for Saccharine Saplings, Hearty Grains, Chipped Pot, and Masterpiece Teacup to the Wandering Trader.
- Added brewing recipe for Throat Spray.
- Added mood particles! Pokémon now visually react to certain actions:
- Angry particles when attacking a mob.
- Annoyed particles when a player tries to feed them while they’re already full.
- Sweat droplets when they run out of stamina while being ridden.
- Added config options to award experience to fainted Pokémon for opponents they helped defeat (`awardExperienceToFaintedPokemon`) and to still award experience for defeated enemies even after battle loss/forfeit (`awardExperienceOnBattleLoss`)
- Party Overlay Exp Gained Animation will now display the amount of EXP the Pokémon gained
- Added a toast to notify players of how they can scroll through their party. Did you know you can hold R and scroll instead of using arrow keys??!
@@ -21,7 +29,7 @@
- Added Move Dex to Pokédex
- Added the Habitat Block, a spawner block for servers and adventure maps that controls spawning in an area.
- Added Disk Rack for storing disks and being an audio sequencer for Noteblocks
- Added intrinsic scaling to all mons (+-5%). Some rendering cases, such as shoulder mounting, revert to 1.0 scaling to preserve animation accuracy.
- Added intrinsic scaling to all Pokémon (+-5%). Some rendering cases, such as shoulder mounting, revert to 1.0 scaling to preserve animation accuracy.
- Added scaling to "baby" Pokémon (smaller (-20%) at level 1 → normally sized at level 10)
- Added conditional seats for riding. Seats can be gated by molang such as "is_alpha".
- Added Alpha Pokémon
@@ -42,9 +50,8 @@
- All ruin structures gilded chest loot tables have been updated to include a guaranteed TM not learned naturally by any Pokémon through their level-up moveset. Each ruin gets its own specific TM, so you can now go hunting ruins to complete your move dex!
- All fossil structures have been transferred over to biome features, allowing for better placement in generation.
- The prehistoric_underwater_fissure & prehistoric_submerged_impact fossil structures now use the biome tag `#cobblemon:is_temperate_ocean`.
- A new Biome tag called `#cobblemon:is_stony_beach` has been added.
- Gimmighoul towers now generate at ground level rather than sinking one block into the ground.
- 1 New shipwreck cove structure called the "magma_shipwreck_cove" has been added.
- A new shipwreck cove structure called the "magma_shipwreck_cove" has been added.
- Shipwreck coves now generate slightly more frequently.
- Added equipment loot tables for shipwreck cove enemies.
- Maps from abandoned fishing boats leading to shipwreck coves now will skip explored chunks, allowing the player to find more shipwreck coves easier.
@@ -57,15 +64,18 @@
- Pokémon cries now play when clicking Pokémon in the summary screen.
- Pressing the Summary key while either the starter selection or summary screen are open now closes those screens
- Ice type Pokémon are now immune to Packed Snow
- Held item visibility can now be controlled by the held_item_visible command argument.
### New rideable Pokémon
- Drampa
- Archeops
- Skarmory
- Crobat
- Goodra
- Hisuian Goodra
- Skarmory
- Milotic
- Archeops
- Goodra
- Goodra (Hisuian Form)
- Drampa
- Duraludon
- Archaludon
### Pokémon Added
#### Generation 3
@@ -162,7 +172,10 @@
- Cofagrigus
- Tyranitar
- Turtonator
- Golett
- Corsola
- Arbok (New Patterns: Angry, Cartoon, Clown, Comedic, Crow, Grin, Ink, Modern, Rain, Scribble, Silence, Sloth, Suspicious, Will)
- ... and Substitute
#### Model changes to the regional bias resource pack:
@@ -171,6 +184,26 @@
- Changed models for every existing regional bias
### Animation updates for the following Pokémon
- Kakuna
- Grimer
- Nidoran♀ (+ New shoulder mount)
- Nidorina
- Nidoran♂ (+ New shoulder mount)
- Sandshrew
- Diglett
- Dugtrio
- Graveler
- Happiny
- Chansey
- Blissey
- Poliwhirl
- Poliwrath
- Zubat
- Vulpix
- Drowzee
- Hypno
- Noctowl
- Skarmory
- Skitty
- Flygon
@@ -202,8 +235,19 @@
- Yamask
- Cofagrigus
- Luvdisc
- Staryu
- Starmie
- Togetic
- Rellor
- Rabsca
- Yungoos
- Gumshoos
- Cottonee
- Whimsicott
- Corsola
#### Added sounds to the following moves
- Absorb
- Aurora Beam
- Double Team
@@ -229,13 +273,8 @@
### Changes
- Stat increase and decrease particles have been changed, with the addition of alpha boost particles.
- Dragonite's mailbag cosmetic can now also be obtained with a chest in the cosmetic slot
### Fixes
- Adjusted Croagunk's walkspeed
- Fixed Blitzle's base scale being `1` rather than the intended `0.8`
- Fixed Magnezone's emissive layer for the shiny having the wrong name, thus displaying wrongly
- Fixed Litleo not blinking
- Fixed Garchomp T-posing when sleeping while out of battle.
- Adjusted Aerodactyl's walkspeed
- Sharp Beak can now be crafted
- Metal Alloy can now be crafted
- Ability Capsules can now be brewed
@@ -288,26 +327,19 @@
- Hearty Grains can be milled like Farmer's Delight Rice Panicles if both Farmer's Delight and Create are installed
- Big Roots and Revival Herbs can be milled to their respective powders
- Pep-Up Flowers, Medicinal Leeks, and all 70 berries can be milled in Create's Millstone for additional dye drops
- Auspicious Armor and Upgrades can be Haunted using Create's crafting systems
- Auspicious Armour and Upgrades can be Haunted using Create's crafting systems
- Applin Apples can be used to make Honeyed Apples in Create
- Golden Apples can now be crafted using the Applin Apples
- Prismarine Crystals and Amethyst Shards can now be used to craft Pokedexes
- Updated Pokedex Screens item tag to support tagged variants of Redstone and Glowstone Dust
- Sounds for interacting with various Cobblemon blocks now play from the center of the block, rather than the corner
- Updated Pokédex Screens item tag to support tagged variants of Redstone and Glowstone Dust
- Sounds for interacting with various Cobblemon blocks now play from the centre of the block, rather than the corner
- The `/pc` command no longer plays PC activation sounds
- Lowered the volume of Blitzle and Zebstrika's cry
- Fixed Raichu (male) and Alolan Raichu (both genders) not displaying the correct Partner Cap when Pewter Crunchies are in the cosmetic slot.
- Regional Foods will now prioritize being eaten instead of used for healing Pokémon, shift clicking will use it as healing
- Resolved Z-Fighting on Pokédex Models
- Restored Ninjask's ability to do barrel rolls
- Fixed a crash caused by adding enchanted items to the Resurrection Machine
- Fixed a crash that could occur when starting a PvN battle with only fainted Pokémon.
### Fixes
- Fixed Croagunk's walkspeed
- Fixed Blitzle's base scale being `1` rather than the intended `0.8`
- Fixed Magnezone's emissive layer for the shiny having the wrong name, thus displaying wrongly
- Fixed Litleo not blinking
- Fixed Omanyte and Omastar incorrectly using water animations on land.
- Fixed Pokédex layout for genderless variations
- Fixed odd stacking behaviour with the poke_bait item.
- Fixed a compatibility issue with World Game Rules which caused some log spam in specific cases.
@@ -349,9 +381,29 @@
- Fixed Exploit where you could take out the bait or drop your Pokérod with bait to avoid consuming bait, now the bobber will just disappear if you do so
- Fixed Apricorn and Saccharine boats incorrectly using chest boat models
- Fixed wild and trainer battle AI refusing to select moves with the `adjacentAlly` target type, even when it's their only option
- Fixed Guilded chests being more accessible than intended
- Fixed gilded chests being more accessible than intended
- Fixed fished up Pokémon not being added as "seen" to the Pokedex
- Fixed surprised Gimmighoul encounters not being added as "seen" to the Pokedex
- Fixed a crash involving berry trees that have been world edited.
- Fixed visual desync in multiplayer for players mounting Pokémon outside other players' loaded chunks
- Fixed Pokémon entities leveled by rare candy not getting stronger as Minecraft entities unless recalled.
- Fixed a freeze during game load that occurred when multiple mods tried to load Cobblemon API classes at the same time.
- Fixed random tick crashes from berry trees
- Lowered the volume of Blitzle and Zebstrika's cry
- Regional Foods will now prioritise being eaten instead of used for healing Pokémon, shift clicking will use it as healing
- Resolved Z-Fighting on Pokédex Models
- Restored Ninjask's ability to do barrel rolls
- Fixed Raichu (male) and Alolan Raichu (both genders) not displaying the correct Partner Cap when Pewter Crunchies are in the cosmetic slot.
- Fixed a crash caused by adding enchanted items to the Resurrection Machine
- Fixed a crash that could occur when starting a PvN battle with only fainted Pokémon.
- Fixed the Remember Riding Camera config not being respected when dismounting and resolved the incompatibility with the Auto Third Person mod
- Fixed Full Heal block not dropping Full Heals
- Fixed status cure items not returning an empty bottle when used
- Fixed Panpour consuming its held item when evolving with a Water Stone
- Fixed Smoked Tail Curry returning a Wooden Bowl when consumed despite it not being included in the recipe
- Fixed `/giveallpokemon` not respecting the min and max parameters
- Fixed the choose starter toast not disappearing when capturing a Pokémon instead of opening the starter selection screen
- Fixed an issue where certain Sinister Tea seasonings were only applying as instant effects and would not apply over time
### Developer
- Added `PokeSnackSpawnerFactory` which allows influence registration on PokeSnack encounters
@@ -362,7 +414,9 @@
- Separated all the functions of MoLangFunctions.kt into their own files.
- Spawn buckets and their base weights are now provided by the spawner, with different base weights for world, fishing, snack, and habitat spawn buckets.
- Removed "SpawnBucket" class in favour of just storing maps of bucket names to weights.
- Fixed nicknames not being applied to Pokémon spawned from `spawn_pool_world` files
- Fixed nicknames not being applied to Pokémon spawned from `spawn_pool_world` files.
- Added support for `profilePokedexScale`, `profilePokedexTranslation`, `profileSummaryScale`, and `profileSummaryTranslation` in poser files for finer control over profile displays.
- Fixed riding camera offsets defined on Pokémon forms not being applied
### Molang & Datapacks
- Added `moveset_builders` datapack folder for different styles of movesets.
@@ -373,6 +427,7 @@
- Added `q.item.is_enchanted()`
- Added `q.item.has_enchantment(minecraft:sharpness, 3)`
- Added `has_chosen_starter` & `get_starter_uuid` as available Molang functions
- Added `has_tm_move_unlocked`, `unlock_tm_move`, & `lock_tm_move` as available Molang functions for Players
- Added `marks`, `has_mark`, & `remove_marks` as available Molang functions for Pokémon
- Added Data Component support for species drops, eg `"components": {"minecraft:custom_model_data": 123}`
- Added the new `sortOrder` field to mark entries, (defaults to 0 if not specified) which controls the order in which marks are rendered on the HUD, with higher numbers being rendered on top of lower numbers
@@ -463,6 +518,7 @@
- German
- Spanish
- Ecuadorian Spanish
- Portuguese
- Brazilian Portuguese
- Simplified Chinese
- Traditional Chinese
@@ -108,6 +108,7 @@ import com.cobblemon.mod.common.pokemon.helditem.CobblemonHeldItemManager
import com.cobblemon.mod.common.pokemon.properties.AspectPropertyType
import com.cobblemon.mod.common.pokemon.properties.BattleCloneProperty
import com.cobblemon.mod.common.pokemon.properties.FreezeFrameProperty
import com.cobblemon.mod.common.pokemon.properties.HeldItemVisibleProperty
import com.cobblemon.mod.common.pokemon.properties.HiddenAbilityPropertyType
import com.cobblemon.mod.common.pokemon.properties.LabelProperty
import com.cobblemon.mod.common.pokemon.properties.NoAIProperty
@@ -350,6 +351,7 @@ object Cobblemon {
CustomPokemonProperty.register(UnaspectPropertyType)
CustomPokemonProperty.register(FreezeFrameProperty)
CustomPokemonProperty.register(NoAIProperty)
CustomPokemonProperty.register(HeldItemVisibleProperty)
CobblemonEvents.POKEMON_PROPERTY_INITIALISED.emit(Unit)
@@ -405,7 +405,7 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
@JvmField
val BIG_MALASADA = regionalFoodItem("big_malasada", 64, 7, 0.3f, false)
@JvmField
val SMOKED_TAIL_CURRY = regionalFoodItem("smoked_tail_curry", 64, 10, 0.6f, false, ItemStack(Items.BOWL, 1))
val SMOKED_TAIL_CURRY = regionalFoodItem("smoked_tail_curry", 64, 10, 0.6f, false)
@JvmField
val JUBILIFE_MUFFIN = regionalFoodItem("jubilife_muffin", 64, 7, 0.3f, false)
@JvmField
@@ -35,6 +35,7 @@ import com.cobblemon.mod.common.client.net.gui.PokedexUIPacketHandler
import com.cobblemon.mod.common.client.net.gui.SetActiveTMPacketHandler
import com.cobblemon.mod.common.client.net.gui.SetTMMachineContainerDataPacketHandler
import com.cobblemon.mod.common.client.net.gui.SummaryUIPacketHandler
import com.cobblemon.mod.common.client.net.gui.SynchronizeActiveTMHandler
import com.cobblemon.mod.common.client.net.habitat.OpenHabitatBlockEditorHandler
import com.cobblemon.mod.common.client.net.npc.CloseNPCEditorHandler
import com.cobblemon.mod.common.client.net.npc.OpenNPCEditorHandler
@@ -147,6 +148,7 @@ import com.cobblemon.mod.common.net.messages.client.ui.PokedexUIPacket
import com.cobblemon.mod.common.net.messages.client.ui.SetActiveTMPacket
import com.cobblemon.mod.common.net.messages.client.ui.SetTMMachineContainerDataPacket
import com.cobblemon.mod.common.net.messages.client.ui.SummaryUIPacket
import com.cobblemon.mod.common.net.messages.client.ui.SynchronizeActiveTMPacket
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
@@ -375,6 +377,7 @@ object CobblemonNetwork {
list.add(PacketRegisterInfo(PlayerInteractOptionsPacket.ID, PlayerInteractOptionsPacket::decode, PlayerInteractOptionsHandler))
list.add(PacketRegisterInfo(PokedexUIPacket.ID, PokedexUIPacket::decode, PokedexUIPacketHandler))
list.add(PacketRegisterInfo(ExpGainedDataPacket.ID, ExpGainedDataPacket::decode, ExpGainedDataPacketHandler))
list.add(PacketRegisterInfo(SynchronizeActiveTMPacket.ID, SynchronizeActiveTMPacket::decode, SynchronizeActiveTMHandler))
// Starter packets
list.add(PacketRegisterInfo(OpenStarterUIPacket.ID, OpenStarterUIPacket::decode, StarterUIPacketHandler))
@@ -8,6 +8,7 @@
package com.cobblemon.mod.common.api.cooking.effects
import net.minecraft.server.level.ServerPlayer
import net.minecraft.world.effect.MobEffect
import net.minecraft.world.effect.MobEffectCategory
import net.minecraft.world.entity.Entity
@@ -18,5 +19,13 @@ class CleanseAllEffect : MobEffect(MobEffectCategory.BENEFICIAL, 0xFFFFFF) {
override fun applyInstantenousEffect(source: Entity?, indirect: Entity?, target: LivingEntity, amplifier: Int, proximity: Double) {
target.removeAllEffects()
}
override fun shouldApplyEffectTickThisTick(duration: Int, amplifier: Int) = false
override fun applyEffectTick(livingEntity: LivingEntity, amplifier: Int): Boolean {
if (livingEntity is ServerPlayer){
livingEntity.removeAllEffects()
}
return true
}
override fun shouldApplyEffectTickThisTick(duration: Int, amplifier: Int) = true
}
@@ -8,6 +8,7 @@
package com.cobblemon.mod.common.api.cooking.effects
import net.minecraft.server.level.ServerPlayer
import net.minecraft.world.effect.MobEffect
import net.minecraft.world.effect.MobEffectCategory
import net.minecraft.world.entity.Entity
@@ -23,5 +24,18 @@ class CleanseNegativeEffect : MobEffect(MobEffectCategory.BENEFICIAL, 0xFFFFFF)
}
}
}
override fun shouldApplyEffectTickThisTick(duration: Int, amplifier: Int) = false
override fun applyEffectTick(livingEntity: LivingEntity, amplifier: Int): Boolean {
if (livingEntity is ServerPlayer){
val snapshot = livingEntity.activeEffects.toList()
for (ei in snapshot) {
if (ei.effect.value().category == MobEffectCategory.HARMFUL) {
livingEntity.removeEffect(ei.effect)
}
}
}
return true
}
override fun shouldApplyEffectTickThisTick(duration: Int, amplifier: Int) = true
}
@@ -92,13 +92,17 @@ interface PokemonAndMoveSelectingItem {
}
fun canUseOnPokemon(stack: ItemStack, pokemon: Pokemon): Boolean {
if (stack.`is`(CobblemonItemTags.POKE_FOOD)) {
return !pokemon.isFull()
if (pokemon.entity == null && stack.`is`(CobblemonItemTags.POKE_FOOD) && pokemon.isFull()) {
return false
}
return true
}
fun canUseOnBattlePokemon(stack: ItemStack, battlePokemon: BattlePokemon): Boolean = bagItem!!.canUse(stack, battlePokemon.actor.battle, battlePokemon)
fun canUseOnBattlePokemon(stack: ItemStack, battlePokemon: BattlePokemon): Boolean {
return bagItem!!.canUse(stack, battlePokemon.actor.battle, battlePokemon)
}
fun canUseOnMove(stack: ItemStack, pokemon: Pokemon, move: Move): Boolean = canUseOnMove(stack, move)
fun canUseOnMove(stack: ItemStack, move: Move): Boolean
@@ -107,13 +107,16 @@ interface PokemonSelectingItem {
}
fun canUseOnPokemon(stack: ItemStack, pokemon: Pokemon): Boolean {
if (stack.`is`(CobblemonItemTags.POKE_FOOD)) {
return !pokemon.isFull()
if (pokemon.entity == null && stack.`is`(CobblemonItemTags.POKE_FOOD) && pokemon.isFull()) {
return false
}
return true
}
fun canUseOnBattlePokemon(stack: ItemStack, battlePokemon: BattlePokemon): Boolean = bagItem!!.canUse(stack, battlePokemon.actor.battle, battlePokemon)
fun canUseOnBattlePokemon(stack: ItemStack, battlePokemon: BattlePokemon): Boolean {
return bagItem!!.canUse(stack, battlePokemon.actor.battle, battlePokemon)
}
fun interactWithSpecificBattle(player: ServerPlayer, stack: ItemStack, battlePokemon: BattlePokemon): InteractionResultHolder<ItemStack> {
return if (canUseOnBattlePokemon(stack, battlePokemon)) {
@@ -17,6 +17,8 @@ import com.bedrockk.molang.runtime.value.MoValue
import com.bedrockk.molang.runtime.value.StringValue
import com.cobblemon.mod.common.Cobblemon
import com.cobblemon.mod.common.CobblemonBlockEntities
import com.cobblemon.mod.common.api.moves.Moves
import com.cobblemon.mod.common.api.tms.TechnicalMachines
import com.cobblemon.mod.common.api.dialogue.PlayerDialogueFaceProvider
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asMoLangValue
import com.cobblemon.mod.common.api.molang.ObjectValue
@@ -44,6 +46,7 @@ import com.cobblemon.mod.common.util.party
import com.cobblemon.mod.common.util.pc
import com.cobblemon.mod.common.util.pokedex
import com.cobblemon.mod.common.util.server
import com.cobblemon.mod.common.util.tmList
import net.minecraft.core.registries.BuiltInRegistries
import net.minecraft.core.registries.Registries
import net.minecraft.resources.ResourceLocation
@@ -312,6 +315,23 @@ object PlayerMoLangFunctions : AbstractMoLangFunctionHolder<Player>() {
}
return@put DoubleValue.ZERO
}
map["has_tm_move_unlocked"] = put@{ params ->
val move = Moves.getByName(params.getString(0)) ?: return@put DoubleValue.ZERO
val tm = TechnicalMachines.moveToTM[move] ?: return@put DoubleValue.ZERO
DoubleValue(if (player.tmList().learnedTMs.contains(tm.id)) 1.0 else 0.0)
}
map["unlock_tm_move"] = put@{ params ->
val move = Moves.getByName(params.getString(0)) ?: return@put DoubleValue.ZERO
val tm = TechnicalMachines.moveToTM[move] ?: return@put DoubleValue.ZERO
player.tmList().syncTMFromMove(move)
DoubleValue(if (player.tmList().learnedTMs.contains(tm.id)) 1.0 else 0.0)
}
map["lock_tm_move"] = put@{ params ->
val move = Moves.getByName(params.getString(0)) ?: return@put DoubleValue.ZERO
val tm = TechnicalMachines.moveToTM[move] ?: return@put DoubleValue.ZERO
player.tmList().syncTMLockFromMove(move)
DoubleValue(if (player.tmList().learnedTMs.contains(tm.id)) 0.0 else 1.0)
}
map["start_battle"] = put@{ params ->
val opponentValue = params.get<MoValue>(0)
val opponent = if (opponentValue is ObjectValue<*>) {
@@ -54,8 +54,9 @@ object PokemonMoLangFunctions : AbstractMoLangFunctionHolder<Pokemon>() {
}
map["feed_pokemon"] = { params ->
val amount = params.getDouble(0)
val playSound = params.getBooleanOrNull(1) ?: true
pokemon.feedPokemon(amount.toInt(), playSound)
val playSound = params.getBooleanOrNull(1) != false
val playMoodParticles = params.getBooleanOrNull(2) != false
DoubleValue(pokemon.feedPokemon(amount.toInt(), playSound, playMoodParticles))
}
map["behaviour"] = { pokemon.form.behaviour.struct }
map["behavior"] = { pokemon.form.behaviour.struct } // Inferior
@@ -44,6 +44,7 @@ object ActionEffects : JsonDataRegistry<ActionEffectTimeline> {
ActionEffectKeyframe.register<EntityMoLangActionEffectKeyframe>("entity_molang")
ActionEffectKeyframe.register<MoLangActionEffectKeyframe>("molang")
ActionEffectKeyframe.register<ParallelActionEffectKeyframe>("parallel")
ActionEffectKeyframe.register<LoopActionEffectKeyframe>("loop")
ActionEffectKeyframe.register<CanInterruptActionEffectKeyframe>("can_interrupt")
ActionEffectKeyframe.register<CannotInterruptActionEffectKeyframe>("cannot_interrupt")
ActionEffectKeyframe.register<RemoveHoldsActionEffectKeyframe>("remove_holds")
@@ -0,0 +1,39 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.api.moves.animations.keyframes
import com.cobblemon.mod.common.api.moves.animations.ActionEffectContext
import java.util.concurrent.CompletableFuture
class LoopActionEffectKeyframe(
val keyframe: ActionEffectKeyframe = PauseActionEffectKeyframe()
) : ConditionalActionEffectKeyframe() {
override fun playWhenTrue(context: ActionEffectContext): CompletableFuture<Unit> {
val future = CompletableFuture<Unit>()
runIteration(context, future)
return future
}
private fun runIteration(context: ActionEffectContext, future: CompletableFuture<Unit>) {
context.currentKeyframes.add(keyframe)
keyframe.play(context)
.thenRun { context.currentKeyframes.remove(keyframe) }
.thenAccept {
if (condition.resolveBoolean(context.runtime)) {
runIteration(context, future)
} else {
future.complete(Unit)
}
}
.exceptionally {
future.completeExceptionally(it)
null
}
}
}
@@ -9,6 +9,7 @@
package com.cobblemon.mod.common.api.tms
import com.cobblemon.mod.common.tms.obtain.DefaultObtainMethod
import com.cobblemon.mod.common.tms.obtain.ImpossibleObtainMethod
import com.cobblemon.mod.common.tms.obtain.PlayerHasAdvancementObtainMethod
import com.cobblemon.mod.common.tms.obtain.PlayerYObtainMethod
import com.cobblemon.mod.common.tms.obtain.UnlockableObtainMethod
@@ -36,6 +37,7 @@ interface ObtainMethod {
val variant = buffer.readUtf()
return when (variant) {
"cobblemon:unlockable" -> UnlockableObtainMethod()
"cobblemon:impossible" -> ImpossibleObtainMethod()
"cobblemon:default" -> DefaultObtainMethod()
"cobblemon:advancement" -> {
val advancement = buffer.readResourceLocation()
@@ -14,6 +14,8 @@ import com.cobblemon.mod.common.advancement.CobblemonCriteria
import com.cobblemon.mod.common.advancement.criterion.CountableContext
import com.cobblemon.mod.common.advancement.criterion.LearnAllTMContext
import com.cobblemon.mod.common.advancement.criterion.LearnTMContext
import com.cobblemon.mod.common.api.abilities.Ability
import com.cobblemon.mod.common.api.abilities.AbilityPool
import com.cobblemon.mod.common.api.moves.MoveTemplate
import com.cobblemon.mod.common.api.scheduling.ScheduledTask
import com.cobblemon.mod.common.api.scheduling.ServerTaskTracker
@@ -50,6 +52,11 @@ class TMMoveManager(
learn(listOf(tmId))
}
fun syncTMLockFromMove(moveTemplate: MoveTemplate) {
val tmId = TechnicalMachines.moveToTM[moveTemplate]?.id ?: return
unlearn(listOf(tmId))
}
fun getLearnableTMsFromPokemon(pokemon: Pokemon): Collection<ResourceLocation> {
val learnableMoves = pokemon.allAccessibleMoves.toMutableSet()
learnableMoves.addAll(pokemon.moveSet.map { it.template })
@@ -42,10 +42,12 @@ class ElementalType(
companion object {
@JvmStatic
val BY_STRING_CODEC: Codec<ElementalType> = CodecUtils.createByStringCodec(
ElementalTypes::get,
{it.showdownId}
) { id -> "No ElementalType for ID $id" }
val BY_STRING_CODEC: Codec<ElementalType> by lazy {
CodecUtils.createByStringCodec(
ElementalTypes::get,
{ it.showdownId }
) { id -> "No ElementalType for ID $id" }
}
}
}
}
@@ -9,7 +9,6 @@
package com.cobblemon.mod.common.block
//import dev.lambdaurora.lambdynlights.util.SodiumDynamicLightHandler.pos
import com.cobblemon.mod.common.CobblemonBlockEntities
import com.cobblemon.mod.common.CobblemonSounds
import com.cobblemon.mod.common.api.berry.Berries
import com.cobblemon.mod.common.api.berry.Berry
@@ -40,7 +39,11 @@ import net.minecraft.world.level.BlockGetter
import net.minecraft.world.level.Level
import net.minecraft.world.level.LevelAccessor
import net.minecraft.world.level.LevelReader
import net.minecraft.world.level.block.*
import net.minecraft.world.level.block.BaseEntityBlock
import net.minecraft.world.level.block.Block
import net.minecraft.world.level.block.Blocks
import net.minecraft.world.level.block.BonemealableBlock
import net.minecraft.world.level.block.RenderShape
import net.minecraft.world.level.block.entity.BlockEntity
import net.minecraft.world.level.block.entity.BlockEntityTicker
import net.minecraft.world.level.block.entity.BlockEntityType
@@ -70,7 +73,7 @@ class BerryBlock(private val berryIdentifier: ResourceLocation, settings: Proper
override fun playerWillDestroy(world: Level, pos: BlockPos, state: BlockState, player: Player): BlockState {
if (!player.isCreative && state.getValue(AGE) == FRUIT_AGE) {
val treeEntity = world.getBlockEntity(pos) as BerryBlockEntity
treeEntity.harvest(world, state, pos, player).forEach { drop -> Block.popResource(world, pos, drop) }
treeEntity.harvest(world, state, pos, player).forEach { drop -> popResource(world, pos, drop) }
}
return super.playerWillDestroy(world, pos, state, player)
}
@@ -92,7 +95,7 @@ class BerryBlock(private val berryIdentifier: ResourceLocation, settings: Proper
// Random Tick handler: uses time compensation to ensure correct growth speed
@Deprecated("Deprecated in Java")
override fun randomTick(state: BlockState, world: ServerLevel, pos: BlockPos, random: RandomSource) {
val blockEntity = world.getBlockEntity(pos) as? BerryBlockEntity ?: return
val blockEntity = world.getBlockEntity(pos) as? BerryBlockEntity? ?: return
// processTick calculates elapsed time and updates timer, returns whether growth is needed
if (blockEntity.processTick(world, pos, state) && !world.getBlockTicks().hasScheduledTick(pos, this)) {
@@ -128,7 +131,10 @@ class BerryBlock(private val berryIdentifier: ResourceLocation, settings: Proper
val newAge = curAge + 1
if (newAge > FRUIT_AGE) return
val newState = state.setValue(AGE, newAge)
val treeEntity = world.getBlockEntity(pos) as BerryBlockEntity
val treeEntity = world.getBlockEntity(pos) as? BerryBlockEntity? ?: run {
world.setBlock(pos, Blocks.AIR.defaultBlockState(), UPDATE_CLIENTS)
return
}
if (curAge == MATURE_AGE) {
treeEntity.generateGrowthPoints(world, newState, pos, null)
determineMutation(world, random, pos, newState)
@@ -146,7 +152,7 @@ class BerryBlock(private val berryIdentifier: ResourceLocation, settings: Proper
for (direction in this.lookupDirections) {
val redirectedPos = pos.offset(direction.normal)
val redirectedState = world.getBlockState(redirectedPos)
val berryBlock = redirectedState.block as? BerryBlock ?: continue
val berryBlock = redirectedState.block as? BerryBlock? ?: continue
val berry = berryBlock.berry() ?: continue
val mutation = this.berry()?.mutationWith(berry) ?: continue
mutations += mutation
@@ -160,7 +166,7 @@ class BerryBlock(private val berryIdentifier: ResourceLocation, settings: Proper
treeEntity.decrementMulchDuration(world, pos, state)
}
val mutation = if (random.nextInt(1000) < mutateChance) mutations.random() else null
(world.getBlockEntity(pos) as? BerryBlockEntity)?.let { blockEntity ->
(world.getBlockEntity(pos) as? BerryBlockEntity?)?.let { blockEntity ->
CobblemonEvents.BERRY_MUTATION_RESULT.post(BerryMutationResultEvent(berry, world, state, pos, berryMutationOffer.mutations, mutation)) { berryMutationResult ->
berryMutationResult.pickedMutation?.let { mutation -> blockEntity.mutate(mutation) }
}
@@ -178,7 +184,7 @@ class BerryBlock(private val berryIdentifier: ResourceLocation, settings: Proper
): Boolean {
val underBlockState = world.getBlockState(pos.below())
val validSoil = state.getValue(IS_ROOTED) || underBlockState.`is`(CobblemonBlockTags.BERRY_SOIL)
val treeEntity = world.getBlockEntity(pos) as? BerryBlockEntity ?: return false
val treeEntity = world.getBlockEntity(pos) as? BerryBlockEntity? ?: return false
return getMulch(treeEntity) == MulchVariant.NONE && state.getValue(AGE) < FLOWER_AGE && validSoil
}
@@ -353,7 +359,7 @@ class BerryBlock(private val berryIdentifier: ResourceLocation, settings: Proper
fun getMulch(entity: BerryBlockEntity) = entity.mulchVariant
fun convertMulchToEntity(world: ServerLevel, state: BlockState, pos: BlockPos) {
val entity = world.getBlockEntity(pos) as? BerryBlockEntity ?: return
val entity = world.getBlockEntity(pos) as? BerryBlockEntity? ?: return
if (state.getValue(MULCH) != MulchVariant.NONE && state.getValue(MULCH) != entity.mulchVariant) {
entity.mulchVariant = state.getValue(MULCH)
world.setBlockAndUpdate(pos, state.setValue(MULCH, MulchVariant.NONE))
@@ -370,9 +376,9 @@ class BerryBlock(private val berryIdentifier: ResourceLocation, settings: Proper
}
private fun harvestBerry(world: Level, state: BlockState, pos: BlockPos, player: Player? = null): Boolean {
val blockEntity = world.getBlockEntity(pos) as? BerryBlockEntity ?: return false
val blockEntity = world.getBlockEntity(pos) as? BerryBlockEntity? ?: return false
blockEntity.harvest(world, state, pos, player).forEach { drop ->
Block.popResource(world, pos, drop)
popResource(world, pos, drop)
}
val sound = if (player != null) CobblemonSounds.BERRY_HARVEST else SoundEvents.SHEEP_SHEAR
@@ -14,7 +14,6 @@ import com.cobblemon.mod.common.api.multiblock.MultiblockEntity
import com.cobblemon.mod.common.api.multiblock.MultiblockStructure
import com.cobblemon.mod.common.api.multiblock.builder.MultiblockStructureBuilder
import com.cobblemon.mod.common.api.pokemon.PokemonProperties
import com.cobblemon.mod.common.api.tms.TechnicalMachines
import com.cobblemon.mod.common.api.types.ElementalTypes
import com.cobblemon.mod.common.block.MonitorBlock
import com.cobblemon.mod.common.block.multiblock.FossilMultiblockStructure
@@ -307,8 +306,7 @@ open class FossilMultiblockEntity(
private fun unlockTmForPlayer(player: ServerPlayer, stack: ItemStack) {
if (stack.item !is TechnicalMachineItem) return
val move = TMMoveComponent.getTMMove(stack) ?: return
val tmId = TechnicalMachines.moveToTM[move]?.id ?: return
player.tmList()?.learn(listOf(tmId))
player.tmList().syncTMFromMove(move)
}
private fun updateMonitorScreen() {
@@ -10,11 +10,13 @@ package com.cobblemon.mod.common.block.tmmachine
import com.cobblemon.mod.common.CobblemonItems
import com.cobblemon.mod.common.CobblemonMenuType
import com.cobblemon.mod.common.CobblemonNetwork.sendPacket
import com.cobblemon.mod.common.api.moves.Moves
import com.cobblemon.mod.common.api.tms.TechnicalMachine
import com.cobblemon.mod.common.api.tms.TechnicalMachines
import com.cobblemon.mod.common.block.entity.TMMachineBlockEntity
import com.cobblemon.mod.common.util.itemRegistry
import net.minecraft.server.level.ServerLevel
import com.cobblemon.mod.common.net.messages.client.ui.SynchronizeActiveTMPacket
import net.minecraft.server.level.ServerPlayer
import net.minecraft.util.Mth
import net.minecraft.world.Container
import net.minecraft.world.SimpleContainer
@@ -35,38 +37,20 @@ class TMMachineMenu(menuType: MenuType<*>, syncId: Int) : AbstractContainerMenu(
var inventory: Container? = null
var containerData: ContainerData? = null
var currentlySelectedTM: TechnicalMachine? = null
private var lastSelectedTM: TechnicalMachine? = null
var onSelectedTMUpdate: (TechnicalMachine?) -> Unit = {}
constructor(syncId: Int, playerInventory: Inventory) : this(CobblemonMenuType.TM_MACHINE, syncId) {
this.playerInventory = playerInventory
this.inventory = SimpleContainer(5)
this.containerData = SimpleContainerData(6)
this.tmMachineEntity = (inventory as? TMMachineBlockEntity.TMMachineBlockInventory)?.blockEntity
this.addDataSlots(containerData!!)
inventory?.startOpen(playerInventory.player)
val startX = 15
val startY = 144
val slotWidth = 18
val slotHeight = 18
for (row in 0..2) {
for (col in 0..8) {
this.addSlot(Slot(playerInventory, 9 + (row * 9) + col, startX + (slotWidth * col), startY + (slotHeight * row)))
}
}
for (col in 0..8) {
this.addSlot(Slot(playerInventory, col, startX + (slotWidth * col), startY + 58))
}
val container = inventory
container?.let {
this.addSlot(TMResultSlot(container, RESULT_SLOT, startX + 37, startY - 28)) // Output slot
this.addSlot(BlankTMSlot(container, BLANK_TM_SLOT, startX + 90, startY - 28)) // Blank TM
for (index in INGREDIENT_SLOTS) {
this.addSlot(Slot(container, index, startX + 114 + (18 * (index - INGREDIENT_SLOTS.first)), startY - 28))
}
}
this.addSlotListener(this)
initiateSlots()
}
constructor(syncId: Int, playerInventory: Inventory, inventory: Container, containerData: ContainerData) : this(CobblemonMenuType.TM_MACHINE, syncId) {
@@ -78,6 +62,20 @@ class TMMachineMenu(menuType: MenuType<*>, syncId: Int) : AbstractContainerMenu(
this.addDataSlots(containerData)
inventory.startOpen(playerInventory.player)
initiateSlots()
tmMachineEntity?.let {
val move = Moves.getByName(it.activeMove)
move.let {
currentlySelectedTM = TechnicalMachines.moveToTM[it]
synchronizeSelectedTM()
}
}
this.addSlotListener(this)
}
private fun initiateSlots() {
val startX = 15
val startY = 144
val slotWidth = 18
@@ -92,7 +90,7 @@ class TMMachineMenu(menuType: MenuType<*>, syncId: Int) : AbstractContainerMenu(
this.addSlot(Slot(playerInventory, col, startX + (slotWidth * col), startY + 58))
}
val container = inventory
val container = inventory!!
container.let {
this.addSlot(TMResultSlot(container, RESULT_SLOT, startX + 37, startY - 28)) // Output slot
this.addSlot(BlankTMSlot(container, BLANK_TM_SLOT, startX + 90, startY - 28)) // Blank TM
@@ -100,7 +98,6 @@ class TMMachineMenu(menuType: MenuType<*>, syncId: Int) : AbstractContainerMenu(
this.addSlot(Slot(container, index, startX + 114 + (18 * (index - INGREDIENT_SLOTS.first)), startY - 28))
}
}
this.addSlotListener(this)
}
override fun quickMoveStack(player: Player, index: Int): ItemStack {
@@ -207,4 +204,25 @@ class TMMachineMenu(menuType: MenuType<*>, syncId: Int) : AbstractContainerMenu(
override fun dataChanged(containerMenu: AbstractContainerMenu, dataSlotIndex: Int, value: Int) {
broadcastChanges()
}
fun synchronizeSelectedTM() {
val serverPlayer = playerInventory?.player as? ServerPlayer ?: return
serverPlayer.sendPacket(SynchronizeActiveTMPacket(currentlySelectedTM))
lastSelectedTM = currentlySelectedTM
}
override fun sendAllDataToRemote() {
super.sendAllDataToRemote()
synchronizeSelectedTM()
}
override fun broadcastChanges() {
super.broadcastChanges()
if (lastSelectedTM != currentlySelectedTM) synchronizeSelectedTM()
}
fun clientSetSelectedTM(tm: TechnicalMachine?) {
currentlySelectedTM = tm
onSelectedTMUpdate(tm)
}
}
@@ -49,7 +49,7 @@ object MountedCameraTypeHandler {
return
}
val currentCameraType = mc.options.cameraType
if (currentCameraType != unmountedCameraType) {
if (Cobblemon.config.rememberRidingCamera && currentCameraType != unmountedCameraType) {
mc.options.cameraType = unmountedCameraType
}
val data = ClientPersistedData.ridingPerspectives
@@ -130,20 +130,25 @@ class PartyOverlay : Gui(Minecraft.getInstance()) {
val party = CobblemonClient.storage.party
val matrices = context.pose()
if (party.slots.none { it != null }) {
if (CobblemonClient.clientPlayerData.promptStarter &&
if (!this.attachedToast &&
CobblemonClient.clientPlayerData.promptStarter &&
!CobblemonClient.clientPlayerData.starterLocked &&
!CobblemonClient.clientPlayerData.starterSelected &&
!CobblemonClient.checkedStarterScreen
) {
if (!this.attachedToast) {
// Adding starter toast on start and connect of client to server.
minecraft.toasts.addToast(this.starterToast)
this.attachedToast = true
}
// Adding starter toast on start and connect of client to server.
minecraft.toasts.addToast(this.starterToast)
this.attachedToast = true
}
return // Don't render the stuff below if no Pokémon in party
}
// Without this simply capturing a Pokémon instead of opening the starter screen won't dismiss the toast
if (!CobblemonClient.checkedStarterScreen) {
CobblemonClient.checkedStarterScreen = true
starterToast.nextVisibility = Toast.Visibility.HIDE
}
val totalHeight = party.slots.size * SLOT_HEIGHT
val midY = minecraft.window.guiScaledHeight / 2
val startY = (midY - totalHeight / 2) - ((SLOT_SPACING * 5) / 2)
@@ -27,10 +27,18 @@ import net.minecraft.client.renderer.RenderType
import net.minecraft.client.renderer.texture.OverlayTexture
import net.minecraft.resources.ResourceLocation
import net.minecraft.util.Mth
import net.minecraft.world.phys.Vec3
import org.joml.Quaternionf
import org.joml.Vector3f
import kotlin.math.atan
enum class ProfileTransformType {
PROFILE,
NONE,
POKEDEX,
SUMMARY,
}
fun drawProfilePokemon(
renderablePokemon: RenderablePokemon,
matrixStack: PoseStack,
@@ -39,7 +47,7 @@ fun drawProfilePokemon(
state: PosableState,
partialTicks: Float,
scale: Float = 20F,
applyProfileTransform: Boolean = true,
profileTransformType: ProfileTransformType = ProfileTransformType.PROFILE,
applyBaseScale: Boolean = false,
r: Float = 1F,
g: Float = 1F,
@@ -56,7 +64,7 @@ fun drawProfilePokemon(
state = state.also { it.currentAspects = renderablePokemon.aspects },
partialTicks = partialTicks,
scale = scale,
applyProfileTransform = applyProfileTransform,
profileTransformType = profileTransformType,
applyBaseScale = applyBaseScale,
r = r,
g = g,
@@ -75,7 +83,7 @@ fun drawProfilePokemon(
state: PosableState,
partialTicks: Float,
scale: Float = 20F,
applyProfileTransform: Boolean = true,
profileTransformType: ProfileTransformType = ProfileTransformType.PROFILE,
applyBaseScale: Boolean = false,
doQuirks: Boolean = false,
r: Float = 1F,
@@ -114,18 +122,38 @@ fun drawProfilePokemon(
state.setPoseToFirstSuitable(poseType)
state.updatePartialTicks(partialTicks)
if (applyProfileTransform) {
matrixStack.translate(
model.profileTranslation.x,
model.profileTranslation.y + 1.5 * model.profileScale,
model.profileTranslation.z - 4.0
)
matrixStack.scale(model.profileScale, model.profileScale, 1 / model.profileScale)} else {
if (profileTransformType == ProfileTransformType.NONE) {
matrixStack.translate(0F, 0F, -4.0F)
if (applyBaseScale) {
matrixStack.scale(baseScale, baseScale, 1 / baseScale)
}
} else {
var profileScale: Float
var profileTranslation: Vec3
when (profileTransformType) {
ProfileTransformType.POKEDEX -> {
profileScale = model.profilePokedexScale ?: model.profileScale
profileTranslation = model.profilePokedexTranslation ?: model.profileTranslation
}
ProfileTransformType.SUMMARY -> {
profileScale = model.profileSummaryScale ?: model.profileScale
profileTranslation = model.profileSummaryTranslation ?: model.profileTranslation
}
else -> {
profileScale = model.profileScale
profileTranslation = model.profileTranslation
}
}
matrixStack.translate(
profileTranslation.x,
profileTranslation.y + 1.5 * profileScale,
profileTranslation.z - 4.0
)
matrixStack.scale(profileScale, profileScale, 1 / profileScale)
}
matrixStack.mulPose(rotation)
model.applyAnimations(null, state, 0F, 0F, 0F, headYaw, headPitch)
@@ -0,0 +1,97 @@
/*
* 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.gui
import com.cobblemon.mod.common.Cobblemon
import com.cobblemon.mod.common.client.render.models.blockbench.FloatingState
import com.cobblemon.mod.common.client.render.models.blockbench.repository.VaryingModelRepository
import com.mojang.blaze3d.platform.InputConstants
import net.minecraft.client.Minecraft
import net.minecraft.network.chat.Component
import net.minecraft.resources.ResourceLocation
import net.minecraft.world.phys.Vec3
fun handleProfileDebugKeys(keyCode: Int, poserResourceLocation: ResourceLocation, state: FloatingState) {
if (!Cobblemon.config.enableDebugKeys) {
return
}
val model = VaryingModelRepository.getPoser(poserResourceLocation, state)
val delta = when (keyCode) {
InputConstants.KEY_UP -> Vec3(0.0, -0.01, 0.0)
InputConstants.KEY_DOWN -> Vec3(0.0, 0.01, 0.0)
InputConstants.KEY_LEFT -> Vec3(-0.01, 0.0, 0.0)
InputConstants.KEY_RIGHT -> Vec3(0.01, 0.0, 0.0)
else -> null
}
if (delta != null) {
model.profileTranslation = model.profileTranslation.add(delta)
model.profileSummaryTranslation = model.profileSummaryTranslation?.add(delta)
model.profilePokedexTranslation = model.profilePokedexTranslation?.add(delta)
}
val scaleDelta = when (keyCode) {
InputConstants.KEY_EQUALS -> 0.01F
InputConstants.KEY_MINUS -> -0.01F
else -> null
}
if (scaleDelta != null) {
model.profileScale += scaleDelta
model.profileSummaryScale = model.profileSummaryScale?.plus(scaleDelta)
model.profilePokedexScale = model.profilePokedexScale?.plus(scaleDelta)
}
}
fun logProfileTranslations(poserResourceLocation: ResourceLocation, state: FloatingState) {
if (!Cobblemon.config.enableDebugKeys) {
return
}
val model = VaryingModelRepository.getPoser(poserResourceLocation, state)
val player = Minecraft.getInstance().player
fun Double.f2() = "%.2f".format(this)
fun Float.f2() = "%.2f".format(this)
fun sendTranslation(name: String, translation: Vec3) {
player?.sendSystemMessage(Component.literal("$name Translation: (${translation.x.f2()}, ${translation.y.f2()}, ${translation.z.f2()})"))
}
fun sendScale(name: String, scale: Float) {
player?.sendSystemMessage(Component.literal("$name Scale: ${scale.f2()}"))
}
fun logTranslation(name: String, translation: Vec3) {
Cobblemon.LOGGER.info("override var ${name.replaceFirstChar(Char::lowercase)}Translation = Vec3(${translation.x.f2()}, ${translation.y.f2()}, ${translation.z.f2()})")
}
fun logScale(name: String, scale: Float) {
Cobblemon.LOGGER.info("override var ${name.replaceFirstChar(Char::lowercase)}Scale = ${scale.f2()}F")
}
sendTranslation("Profile", model.profileTranslation)
sendScale("Profile", model.profileScale)
model.profileSummaryTranslation?.let { sendTranslation("Summary Profile", it) }
model.profileSummaryScale?.let { sendScale("Summary Profile", it) }
model.profilePokedexTranslation?.let { sendTranslation("Pokedex Profile", it) }
model.profilePokedexScale?.let { sendScale("Pokedex Profile", it) }
logTranslation("Profile", model.profileTranslation)
logScale("Profile", model.profileScale)
model.profileSummaryTranslation?.let { logTranslation("ProfileSummary", it) }
model.profileSummaryScale?.let { logScale("ProfileSummary", it) }
model.profilePokedexTranslation?.let { logTranslation("ProfilePokedex", it) }
model.profilePokedexScale?.let { logScale("ProfilePokedex", it) }
}
@@ -32,6 +32,8 @@ import com.cobblemon.mod.common.client.ClientMoLangFunctions.setupClient
import com.cobblemon.mod.common.client.CobblemonClient
import com.cobblemon.mod.common.client.CobblemonResources
import com.cobblemon.mod.common.client.gui.CobblemonRenderable
import com.cobblemon.mod.common.client.gui.handleProfileDebugKeys
import com.cobblemon.mod.common.client.gui.logProfileTranslations
import com.cobblemon.mod.common.client.gui.pokedex.PokedexGUIConstants.BASE_HEIGHT
import com.cobblemon.mod.common.client.gui.pokedex.PokedexGUIConstants.BASE_WIDTH
import com.cobblemon.mod.common.client.gui.pokedex.PokedexGUIConstants.HALF_OVERLAY_WIDTH
@@ -427,6 +429,11 @@ class PokedexGUI private constructor(
override fun onClose() {
if (blockPos != null) AdjustBlockEntityViewerCountPacket(blockPos, false).sendToServer()
playSound(CobblemonSounds.POKEDEX_CLOSE)
selectedEntry?.speciesId?.let { speciesId ->
logProfileTranslations(speciesId, pokemonInfoWidget.state)
}
super.onClose()
}
@@ -757,6 +764,12 @@ class PokedexGUI private constructor(
return true
}
if (!searchWidget.isFocused) {
selectedEntry?.speciesId?.let { speciesId ->
handleProfileDebugKeys(keyCode, speciesId, pokemonInfoWidget.state)
}
}
return super.keyPressed(keyCode, scanCode, modifiers)
}
@@ -22,6 +22,7 @@ import com.cobblemon.mod.common.api.types.ElementalType
import com.cobblemon.mod.common.client.ClientMoLangFunctions.setupClient
import com.cobblemon.mod.common.client.CobblemonClient
import com.cobblemon.mod.common.client.CobblemonResources
import com.cobblemon.mod.common.client.gui.ProfileTransformType
import com.cobblemon.mod.common.client.gui.TypeIcon
import com.cobblemon.mod.common.client.gui.drawProfilePokemon
import com.cobblemon.mod.common.client.gui.pokedex.PokedexGUIConstants.HALF_OVERLAY_HEIGHT
@@ -386,7 +387,8 @@ class PokemonInfoWidget(val pX: Int, val pY: Int, val updateForm: (PokedexForm)
partialTicks = delta,
rotation = Quaternionf().fromEulerXYZDegrees(rotationVector),
state = state,
blockLight = 15
blockLight = 15,
profileTransformType = ProfileTransformType.POKEDEX,
)
matrices.popPose()
@@ -11,6 +11,7 @@ package com.cobblemon.mod.common.client.gui.pokedex.widgets
import com.cobblemon.mod.common.api.gui.blitk
import com.cobblemon.mod.common.api.text.bold
import com.cobblemon.mod.common.client.CobblemonResources
import com.cobblemon.mod.common.client.gui.ProfileTransformType
import com.cobblemon.mod.common.client.gui.drawProfilePokemon
import com.cobblemon.mod.common.client.gui.pokedex.PokedexGUIConstants.HALF_OVERLAY_WIDTH
import com.cobblemon.mod.common.client.gui.pokedex.PokedexGUIConstants.POKEMON_DESCRIPTION_HEIGHT
@@ -90,7 +91,7 @@ class SizeWidget(val pX: Int, val pY: Int) : SoundlessWidget(
rotation = Quaternionf().fromEulerXYZDegrees(Vector3f(0F, 0F, 0F)),
state = FloatingState(),
scale = modelScale,
applyProfileTransform = false,
profileTransformType = ProfileTransformType.NONE,
applyBaseScale = true,
r = 0F,
g = 0F,
@@ -8,7 +8,6 @@
package com.cobblemon.mod.common.client.gui.summary
import com.cobblemon.mod.common.Cobblemon
import com.cobblemon.mod.common.CobblemonItems
import com.cobblemon.mod.common.CobblemonNetwork.sendToServer
import com.cobblemon.mod.common.CobblemonSounds
@@ -21,14 +20,8 @@ import com.cobblemon.mod.common.api.text.bold
import com.cobblemon.mod.common.api.text.text
import com.cobblemon.mod.common.client.CobblemonClient
import com.cobblemon.mod.common.client.CobblemonResources
import com.cobblemon.mod.common.client.gui.CobblemonRenderable
import com.cobblemon.mod.common.client.gui.ExitButton
import com.cobblemon.mod.common.client.gui.TypeIcon
import com.cobblemon.mod.common.client.gui.summary.widgets.EvolutionSelectScreen
import com.cobblemon.mod.common.client.gui.summary.widgets.MarkingsWidget
import com.cobblemon.mod.common.client.gui.summary.widgets.ModelWidget
import com.cobblemon.mod.common.client.gui.summary.widgets.NicknameEntryWidget
import com.cobblemon.mod.common.client.gui.summary.widgets.PartyWidget
import com.cobblemon.mod.common.client.gui.*
import com.cobblemon.mod.common.client.gui.summary.widgets.*
import com.cobblemon.mod.common.client.gui.summary.widgets.screens.SummaryTab
import com.cobblemon.mod.common.client.gui.summary.widgets.screens.info.InfoWidget
import com.cobblemon.mod.common.client.gui.summary.widgets.screens.marks.MarksWidget
@@ -37,7 +30,6 @@ import com.cobblemon.mod.common.client.gui.summary.widgets.screens.moves.MovesWi
import com.cobblemon.mod.common.client.gui.summary.widgets.screens.stats.StatWidget
import com.cobblemon.mod.common.client.keybind.keybinds.SummaryBinding
import com.cobblemon.mod.common.client.render.drawScaledText
import com.cobblemon.mod.common.client.render.models.blockbench.repository.VaryingModelRepository
import com.cobblemon.mod.common.net.messages.server.pokemon.update.SetItemHiddenPacket
import com.cobblemon.mod.common.net.messages.server.storage.party.MovePartyPokemonPacket
import com.cobblemon.mod.common.net.messages.server.storage.party.SwapPartyPokemonPacket
@@ -715,27 +707,9 @@ class Summary private constructor(party: Collection<Pokemon?>, private val edita
) {
this.focused = null
}
if (Cobblemon.config.enableDebugKeys) {
val model = VaryingModelRepository.getPoser(selectedPokemon.species.resourceIdentifier, modelWidget.state)
if (keyCode == InputConstants.KEY_UP) {
model.profileTranslation = model.profileTranslation.add(0.0, -0.01, 0.0)
}
if (keyCode == InputConstants.KEY_DOWN) {
model.profileTranslation = model.profileTranslation.add(0.0, 0.01, 0.0)
}
if (keyCode == InputConstants.KEY_LEFT) {
model.profileTranslation = model.profileTranslation.add(-0.01, 0.0, 0.0)
}
if (keyCode == InputConstants.KEY_RIGHT) {
model.profileTranslation = model.profileTranslation.add(0.01, 0.0, 0.0)
}
if (keyCode == InputConstants.KEY_EQUALS) {
model.profileScale += 0.01F
}
if (keyCode == InputConstants.KEY_MINUS) {
model.profileScale -= 0.01F
}
}
handleProfileDebugKeys(keyCode, selectedPokemon.species.resourceIdentifier, modelWidget.state)
return super.keyPressed(keyCode, scanCode, modifiers)
}
@@ -744,13 +718,8 @@ class Summary private constructor(party: Collection<Pokemon?>, private val edita
}
override fun onClose() {
if (Cobblemon.config.enableDebugKeys) {
val model = VaryingModelRepository.getPoser(selectedPokemon.species.resourceIdentifier, modelWidget.state)
Minecraft.getInstance().player?.sendSystemMessage(Component.literal("Profile Translation: ${model.profileTranslation}"))
Minecraft.getInstance().player?.sendSystemMessage(Component.literal("Profile Scale: ${model.profileScale}"))
Cobblemon.LOGGER.info("override var profileTranslation = Vec3d(${model.profileTranslation.x}, ${model.profileTranslation.y}, ${model.profileTranslation.z})")
Cobblemon.LOGGER.info("override var profileScale = ${model.profileScale}F")
}
logProfileTranslations(selectedPokemon.species.resourceIdentifier, modelWidget.state)
super.onClose()
}
}
@@ -11,6 +11,7 @@ package com.cobblemon.mod.common.client.gui.summary.widgets
import com.bedrockk.molang.runtime.value.DoubleValue
import com.cobblemon.mod.common.Cobblemon
import com.cobblemon.mod.common.api.tags.CobblemonItemTags
import com.cobblemon.mod.common.client.gui.ProfileTransformType
import com.cobblemon.mod.common.client.gui.drawProfilePokemon
import com.cobblemon.mod.common.client.gui.calculateHeadYawAndPitch
import com.cobblemon.mod.common.client.render.models.blockbench.FloatingState
@@ -116,7 +117,8 @@ class ModelWidget(
partialTicks = partialTicks,
headYaw = currentYawAndPitch.first,
headPitch = currentYawAndPitch.second,
blockLight = blockLight
blockLight = blockLight,
profileTransformType = ProfileTransformType.SUMMARY,
)
heldItemRenderer.renderOnModel(
@@ -120,7 +120,7 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
fun getLogoResource(langCode: String?): ResourceLocation =
logoResourceMap.entries.find { it.value.contains(langCode?.substringBefore("_")) }?.key ?: logo
}
var selectedTM: TechnicalMachine? = null
var heldStackMove: MoveTemplate? = null
var tmList: SettableObservable<MutableList<TechnicalMachine>> = SettableObservable(mutableListOf())
var output: ItemStack? = null
@@ -159,6 +159,8 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
var oldIngredientItems: Array<Item> = arrayOf(Items.AIR, Items.AIR, Items.AIR)
var oldResultTmSlotItem: Item = Items.AIR
var moveInfoTM: TechnicalMachine? = null
override fun init() {
imageWidth = WIDTH
imageHeight = HEIGHT
@@ -171,6 +173,8 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
logoPosY = topPos + 1
scanPosY = topPos + 1
menu.onSelectedTMUpdate = { updateSelectedTM(it) }
partySlotList.clear()
CobblemonClient.storage.party.forEachIndexed { index, pokemon ->
partySlotList.add(TMPartySlotWidget(
@@ -226,7 +230,14 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
pX = leftPos + 4,
pY = topPos + 29,
tmList,
setTM = { tm, clicked -> setSelectedTM(tm, clicked) }
setTM = { tm, clicked ->
if (clicked) {
if (tm != menu.currentlySelectedTM) SetActiveTMPacket(tm).sendToServer()
setScreenFromMode(TM_BURN_MODE)
} else {
updateMoveInformation(tm)
}
}
)
if (!children().contains(movesScrollingList)) addRenderableWidget(movesScrollingList)
@@ -252,24 +263,21 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
selectedMoveButton = MoveSlotButton(
leftPos + 6,
topPos + 6,
move = selectedTM?.moveName,
pp = selectedTM?.moveName?.pp ?: 0,
move = menu.currentlySelectedTM?.moveName,
pp = menu.currentlySelectedTM?.moveName?.pp ?: 0,
ppAsFraction = false
) {
if ((it as MoveSlotButton).enabled) {
if (::movesScrollingList.isInitialized && movesScrollingList.children().isEmpty()) setMoveList()
playSound(CobblemonSounds.GUI_CLICK)
setScreenFromMode(MOVE_SELECT_MODE)
// Clear active TM
CobblemonNetwork.sendToServer(SetActiveTMPacket(null))
}
}
if (!children().contains(selectedMoveButton)) addRenderableWidget(selectedMoveButton)
startButton = StartButton(leftPos + 5F, topPos + 35F) {
if (!(it as StartButton).disabled) {
selectedTM?.let {
menu.currentlySelectedTM?.let {
val burnActive = menu.containerData?.get(TMMachineBlockEntity.BURN_ACTIVE_INDEX) ?: 0
CobblemonNetwork.sendToServer(SetTMMachineContainerDataPacket(
TMMachineBlockEntity.BURN_ACTIVE_INDEX,
@@ -284,17 +292,14 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
))
}*/
CobblemonNetwork.sendToServer(SetActiveTMPacket(it))
//CobblemonNetwork.sendToServer(SetActiveTMPacket(it))
if (burnActive != 1) playSound(CobblemonSounds.TM_MACHINE_START)
inventory.setChanged()
menu.broadcastChanges()
}
}
}
if (!children().contains(startButton)) addRenderableWidget(startButton)
setScreenFromMode(mode)
initScreen = false
updateSlotItemMemory()
}
@@ -306,7 +311,7 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
if (scanPosY + 1 >= (topPos + SCREEN_SAVER_HEIGHT) * 2) scanPosY = 0
if (mode == TM_BURN_MODE) {
selectedTM?.let { tm ->
menu.currentlySelectedTM?.let { tm ->
val resultStack = menu.inventory!!.getItem(TMMachineMenu.RESULT_SLOT)
val craftedTmStack = ItemStack(CobblemonItems.TECHNICAL_MACHINE)
.also { TMMoveComponent.setTMMove(it, tm.moveName) }
@@ -339,7 +344,7 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
}
if (::selectedMoveButton.isInitialized) {
selectedMoveButton.enabled = !isBurnActive() && (heldStackMove == null || heldStackMove == selectedTM?.moveName)
selectedMoveButton.enabled = (heldStackMove == null || heldStackMove == menu.currentlySelectedTM?.moveName)
}
if (isBurnActive()) {
@@ -350,9 +355,6 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
}
}
}
} else {
// Check if screen should be switched upon opening UI
if (!initScreen) loadBurnScreenData()
}
if (heldMoveItemChanged) {
@@ -400,32 +402,6 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
return wasScreenSaverActive
}
private fun loadBurnScreenData() {
var tm: TechnicalMachine? = null
val blockPos = menu.containerData?.let {
val x = it.get(TMMachineBlockEntity.POSITION_X_INDEX)
val y = it.get(TMMachineBlockEntity.POSITION_Y_INDEX)
val z = it.get(TMMachineBlockEntity.POSITION_Z_INDEX)
BlockPos(x, y, z)
}
inventory.player.level().getBlockEntity(blockPos)?.let { blockEntity ->
if (blockEntity is TMMachineBlockEntity) {
Moves.getByName(blockEntity.activeMove)?.let {
tm = TechnicalMachines.moveToTM[it]
}
}
}
// If burn currently in progress or if active TM set, set to burn screen
if (isBurnActive() || tm != null) {
setSelectedTM(tm, true)
}
initScreen = true
}
private fun isBurnActive(): Boolean = (menu.containerData?.get(TMMachineBlockEntity.BURN_ACTIVE_INDEX) ?: 0) == 1
private fun setScreenFromMode(screen: Int) {
@@ -467,7 +443,6 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
private fun toggleTypeSelect(isVisible: Boolean) {
if (isVisible) {
setSelectedTM(null, false)
if (::moveSearchWidget.isInitialized) moveSearchWidget.value = ""
if (selectedPokemon != null) selectedPokemon = null
sortType = null
@@ -505,7 +480,6 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
}
private fun toggleTMBurn(isVisible: Boolean) {
if (!isVisible) setSelectedTM(null, false)
if (::selectedMoveButton.isInitialized) selectedMoveButton.visible = isVisible
if (::startButton.isInitialized) startButton.visible = isVisible
}
@@ -516,35 +490,40 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
return if (learnableMoves.contains(move)) TMPartySlotWidget.CAN_LEARN else TMPartySlotWidget.CANNOT_LEARN
}
fun setSelectedTM(tm: TechnicalMachine?, clicked: Boolean) {
if (selectedTM != tm) {
selectedTM = tm
updatePartySlotStatus(tm?.moveName)
fun updateSelectedTM(tm: TechnicalMachine?) {
if (!initScreen) {
initScreen = true
tm?.let {
setScreenFromMode(TM_BURN_MODE)
sortType = ElementalTypes.get(tm.type)
setMoveList()
}
}
if (::movesScrollingList.isInitialized) {
movesScrollingList.setSlotHighlighted(if (clicked) null else selectedTM?.id)
if (mode == TM_BURN_MODE) updateMoveInformation(tm)
tm?.let {
if (::selectedMoveButton.isInitialized) {
selectedMoveButton.apply {
move = it.moveName
pp = it.moveName.pp
}
}
}
}
fun updateMoveInformation(tm: TechnicalMachine?) {
moveInfoTM = tm
if (::moveDescriptionWidget.isInitialized) {
val selectedDescription = selectedTM?.moveName?.description?.string
val selectedDescription = tm?.moveName?.description?.string
moveDescriptionWidget.setText(
if (selectedDescription != null) listOf(selectedDescription) else emptyList()
)
}
if (clicked) {
CobblemonNetwork.sendToServer(SetActiveTMPacket(tm))
selectedTM?.let {
if (::selectedMoveButton.isInitialized) {
selectedMoveButton.apply {
move = it.moveName
pp = it.moveName.pp
}
setScreenFromMode(TM_BURN_MODE)
}
}
if (::movesScrollingList.isInitialized) {
movesScrollingList.setSlotHighlighted(tm?.id)
}
}
@@ -557,7 +536,7 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
}
fun renderDiscTypeOverlay(poseStack: PoseStack, isDiscRotating: Boolean, alpha: Float = 1F) {
selectedTM?.let {
menu.currentlySelectedTM?.let {
val primaryRgb = it.moveName.elementalType.primaryColor.toRGB()
val secondaryRgb = it.moveName.elementalType.secondaryColor.toRGB()
blitk(
@@ -706,7 +685,7 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
}
fun renderMoveInfo(context: GuiGraphics, mouseX: Int, mouseY: Int) {
val moveTemplate = selectedTM?.moveName
val moveTemplate = moveInfoTM?.moveName
blitk(
matrixStack = context.pose(),
@@ -1057,7 +1036,7 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
movesScrollingList.setDisabled(true, TechnicalMachines.moveToTM[heldStackMove])
if (mode == MOVE_SELECT_MODE) {
val heldStackTm = TechnicalMachines.moveToTM[heldStackMove]
setSelectedTM(if (tmList.get().contains(heldStackTm)) heldStackTm else null, false)
updateMoveInformation(if (tmList.get().contains(heldStackTm)) heldStackTm else null)
// Scroll to move if moves list contains held TM move
if (tmList.get().contains(heldStackTm)) {
@@ -1077,8 +1056,8 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
heldStackMove = null
// Reset selected move on move select screen
if (mode == MOVE_SELECT_MODE) setSelectedTM(null, false)
updatePartySlotStatus(selectedTM?.moveName)
if (mode == MOVE_SELECT_MODE) updateMoveInformation(null)
updatePartySlotStatus(menu.currentlySelectedTM?.moveName)
if (::movesScrollingList.isInitialized) {
movesScrollingList.setDisabled(false)
@@ -1155,7 +1134,7 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
if (isInventoryKeyPressed(minecraft, keyCode, scanCode)) {
if (searchFocused) { return true }
else {
Minecraft.getInstance().setScreen(null)
onClose()
return true
}
}
@@ -1166,7 +1145,7 @@ class TMMachineScreen(containerMenu: TMMachineMenu, val inventory: Inventory, ti
this.focused = null
return true
} else {
Minecraft.getInstance().setScreen(null)
onClose()
return true
}
}
@@ -19,7 +19,6 @@ import net.minecraft.world.level.block.Block
object SetActiveTMPacketHandler : ServerNetworkPacketHandler<SetActiveTMPacket> {
override fun handle(packet: SetActiveTMPacket, server: MinecraftServer, player: ServerPlayer) {
val menu = player.containerMenu as? TMMachineMenu ?: return
val inventory = menu.inventory ?: return
val tmData = Cobblemon.playerDataManager.getTMData(player)
if (packet.tm != null && (!packet.tm.isPassivelyObtained() && packet.tm.id !in tmData.learnedTMs)) {
@@ -30,9 +29,17 @@ object SetActiveTMPacketHandler : ServerNetworkPacketHandler<SetActiveTMPacket>
blockEntity.activeMove = packet.tm?.moveName?.name ?: ""
blockEntity.setChanged()
player.level().sendBlockUpdated(blockEntity.blockPos, blockEntity.blockState, blockEntity.blockState, Block.UPDATE_CLIENTS)
}
inventory.setChanged()
menu.broadcastChanges()
blockEntity.burnActive = false
blockEntity.burnProgress = 0
player.level().players().forEach { thePlayer -> //Update all players with matching menu/blockentity
val tmmMenu = thePlayer.containerMenu as? TMMachineMenu ?: return@forEach
if (tmmMenu.tmMachineEntity == blockEntity) {
tmmMenu.currentlySelectedTM = packet.tm
tmmMenu.broadcastChanges()
}
}
}
}
}
@@ -0,0 +1,21 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.client.net.gui
import com.cobblemon.mod.common.api.net.ClientNetworkPacketHandler
import com.cobblemon.mod.common.block.tmmachine.TMMachineMenu
import com.cobblemon.mod.common.net.messages.client.ui.SynchronizeActiveTMPacket
import net.minecraft.client.Minecraft
object SynchronizeActiveTMHandler: ClientNetworkPacketHandler<SynchronizeActiveTMPacket> {
override fun handle(packet: SynchronizeActiveTMPacket, client: Minecraft) {
val tmmMenu = client.player?.containerMenu as? TMMachineMenu ?: return
tmmMenu.clientSetSelectedTM(packet.tm)
}
}
@@ -72,7 +72,8 @@ object MountedCameraRenderer {
val rollable = vehicle as OrientationControllable
val vehicleController = rollable.getOrientationController()
val model = getPoser(vehicle.pokemon.species.resourceIdentifier, FloatingState())
val state = FloatingState().also { it.currentAspects = vehicle.pokemon.aspects }
val model = getPoser(vehicle.pokemon.species.resourceIdentifier, state)
val locatorName = delegate.getSeatLocator(driver)
val locator = delegate.locatorStates[locatorName] ?: return null
@@ -134,6 +134,11 @@ open class PosableModel(@Transient override val rootPart: Bone) : ModelFrame {
*/
open var profileTranslation = Vec3(0.0, 0.0, 0.0)
open var profilePokedexScale: Float? = null
open var profilePokedexTranslation: Vec3? = null
open var profileSummaryScale: Float? = null
open var profileSummaryTranslation: Vec3? = null
var red = 1F
var green = 1F
var blue = 1F
@@ -1,85 +0,0 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen1
import com.cobblemon.mod.common.client.render.models.blockbench.PosableState
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BipedFrame
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.STATIONARY_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.UI_POSES
import com.cobblemon.mod.common.util.isBattling
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class ChanseyModel(root: ModelPart) : PokemonPosableModel(root), BipedFrame {
override val rootPart = root.registerChildWithAllChildren("chansey")
override val leftLeg = getPart("left_foot")
override val rightLeg = getPart("right_foot")
override var portraitScale = 1.5F
override var portraitTranslation = Vec3(-0.35, 0.3, 0.0)
override var profileScale = 0.8F
override var profileTranslation = Vec3(0.0, 0.55, 0.0)
lateinit var standing: CobblemonPose
lateinit var walk: CobblemonPose
lateinit var sleep: CobblemonPose
lateinit var battleIdle: CobblemonPose
override val cryAnimation = CryProvider { bedrockStateful("chansey", "cry") }
override fun registerPoses() {
val blink = quirk { bedrockStateful("chansey", "blink") }
sleep = registerPose(
poseName = "sleep",
poseType = PoseType.SLEEP,
animations = arrayOf(
bedrock("chansey", "sleep")
)
)
standing = registerPose(
poseName = "standing",
poseTypes = STATIONARY_POSES + UI_POSES,
condition = { !it.isBattling },
transformTicks = 10,
animations = arrayOf(
bedrock("chansey", "ground_idle")
)
)
walk = registerPose(
poseName = "walk",
poseTypes = MOVING_POSES,
transformTicks = 10,
quirks = arrayOf(blink),
animations = arrayOf(
bedrock("chansey", "ground_walk")
)
)
battleIdle = registerPose(
poseName = "battle_idle",
poseTypes = PoseType.STATIONARY_POSES,
condition = { it.isBattling },
transformTicks = 10,
animations = arrayOf(
bedrock("chansey", "battle_idle")
)
)
}
override fun getFaintAnimation(state: PosableState) = bedrockStateful("chansey", "faint")
}
@@ -1,74 +0,0 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen1
import com.cobblemon.mod.common.client.render.models.blockbench.PosableState
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
import com.cobblemon.mod.common.client.render.models.blockbench.pose.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.STATIONARY_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.UI_POSES
import com.cobblemon.mod.common.util.isBattling
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class DiglettAlolanModel(root: ModelPart) : PokemonPosableModel(root) {
override val rootPart = root.registerChildWithAllChildren("diglett_alolan")
override var portraitScale = 1.8F
override var portraitTranslation = Vec3(-0.06, -0.86, 0.0)
override var profileScale = 0.9F
override var profileTranslation = Vec3(0.0, 0.32, 0.0)
lateinit var stand: CobblemonPose
lateinit var walk: CobblemonPose
lateinit var battleidle: CobblemonPose
lateinit var sleep: CobblemonPose
override val cryAnimation = CryProvider { bedrockStateful("diglett_alolan", "cry") }
override fun registerPoses() {
val blink = quirk { bedrockStateful("diglett_alolan", "blink")}
val quirk = quirk { bedrockStateful("diglett_alolan", "quirk_idle")}
sleep = registerPose(
poseName = "sleep",
poseType = PoseType.SLEEP,
animations = arrayOf(bedrock("diglett_alolan", "sleep"))
)
stand = registerPose(
poseName = "stand",
poseTypes = STATIONARY_POSES + UI_POSES,
condition = { !it.isBattling },
quirks = arrayOf(blink,quirk),
animations = arrayOf(bedrock("diglett_alolan", "ground_idle"))
)
walk = registerPose(
poseName = "walk",
poseTypes = MOVING_POSES,
quirks = arrayOf(blink),
animations = arrayOf(bedrock("diglett_alolan", "ground_idle"))
)
battleidle = registerPose(
poseName = "battleidle",
poseTypes = STATIONARY_POSES,
condition = { it.isBattling },
quirks = arrayOf(blink),
animations = arrayOf(bedrock("diglett_alolan", "battle_idle"))
)
}
override fun getFaintAnimation(state: PosableState) = bedrockStateful("diglett_alolan", "faint")
}
@@ -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.gen1
import com.cobblemon.mod.common.client.render.models.blockbench.PosableState
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
import com.cobblemon.mod.common.client.render.models.blockbench.pose.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.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 DiglettModel(root: ModelPart) : PokemonPosableModel(root) {
override val rootPart = root.registerChildWithAllChildren("diglett")
override var portraitScale = 1.8F
override var portraitTranslation = Vec3(-0.06, -0.86, 0.0)
override var profileScale = 0.9F
override var profileTranslation = Vec3(0.0, 0.32, 0.0)
lateinit var stand: CobblemonPose
lateinit var walk: CobblemonPose
lateinit var battleidle: CobblemonPose
lateinit var sleep: CobblemonPose
override val cryAnimation = CryProvider { bedrockStateful("diglett", "cry") }
override fun registerPoses() {
val blink = quirk { bedrockStateful("diglett", "blink")}
val quirk = quirk { bedrockStateful("diglett", "quirk_idle")}
sleep = registerPose(
poseName = "sleep",
poseType = PoseType.SLEEP,
animations = arrayOf(bedrock("diglett", "sleep"))
)
stand = registerPose(
poseName = "stand",
poseTypes = STATIONARY_POSES + UI_POSES,
quirks = arrayOf(blink, quirk),
animations = arrayOf(bedrock("diglett", "ground_idle"))
)
walk = registerPose(
poseName = "walk",
poseTypes = MOVING_POSES,
quirks = arrayOf(blink),
animations = arrayOf(bedrock("diglett", "ground_walk"))
)
battleidle = registerPose(
poseName = "battleidle",
poseTypes = STATIONARY_POSES,
quirks = arrayOf(blink, quirk),
animations = arrayOf(bedrock("diglett", "battle_idle"))
)
}
override fun getFaintAnimation(state: PosableState) = bedrockStateful("diglett", "faint")
}
@@ -1,79 +0,0 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen1
import com.cobblemon.mod.common.client.render.models.blockbench.PosableState
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
import com.cobblemon.mod.common.client.render.models.blockbench.pose.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.STATIONARY_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.UI_POSES
import com.cobblemon.mod.common.util.isBattling
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class DugtrioAlolanModel(root: ModelPart) : PokemonPosableModel(root) {
override val rootPart = root.registerChildWithAllChildren("dugtrio_alolan")
override var portraitScale = 1.3F
override var portraitTranslation = Vec3(-0.11, -0.1, 0.0)
override var profileScale = 0.9F
override var profileTranslation = Vec3(0.0, 0.29, 0.0)
lateinit var standing: CobblemonPose
lateinit var walking: CobblemonPose
lateinit var battleidle: CobblemonPose
lateinit var sleep: CobblemonPose
override val cryAnimation = CryProvider { bedrockStateful("dugtrio_alolan", "cry") }
override fun registerPoses() {
val blink = quirk { bedrockStateful("dugtrio_alolan", "blink")}
val blink2 = quirk { bedrockStateful("dugtrio_alolan", "blink2")}
val blink3 = quirk { bedrockStateful("dugtrio_alolan", "blink3")}
val quirk = quirk { bedrockStateful("dugtrio_alolan", "quirk_idle")}
val quirk2 = quirk { bedrockStateful("dugtrio_alolan", "quirk_idle2")}
val quirk3 = quirk { bedrockStateful("dugtrio_alolan", "quirk_idle3")}
sleep = registerPose(
poseName = "sleep",
poseType = PoseType.SLEEP,
animations = arrayOf(bedrock("dugtrio_alolan", "sleep"))
)
standing = registerPose(
poseName = "stand",
poseTypes = STATIONARY_POSES + UI_POSES,
condition = { !it.isBattling },
quirks = arrayOf(blink, blink2, blink3, quirk, quirk2, quirk3),
animations = arrayOf(bedrock("dugtrio_alolan", "ground_idle"))
)
walking = registerPose(
poseName = "walk",
poseTypes = MOVING_POSES,
quirks = arrayOf(blink, blink2, blink3),
animations = arrayOf(bedrock("dugtrio_alolan", "ground_idle"))
)
battleidle = registerPose(
poseName = "battleidle",
poseTypes = STATIONARY_POSES,
condition = { it.isBattling },
quirks = arrayOf(blink, blink2, blink3, quirk, quirk2, quirk3),
animations = arrayOf(bedrock("dugtrio_alolan", "battle_idle"))
)
}
override fun getFaintAnimation(state: PosableState) = bedrockStateful("dugtrio_alolan", "faint")
}
@@ -1,99 +0,0 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen1
import com.cobblemon.mod.common.client.render.models.blockbench.PosableState
import com.cobblemon.mod.common.client.render.models.blockbench.animation.SingleBoneLookAnimation
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.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.STATIONARY_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.UI_POSES
import com.cobblemon.mod.common.util.isBattling
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class DugtrioModel(root: ModelPart) : PokemonPosableModel(root), HeadedFrame {
override val rootPart = root.registerChildWithAllChildren("dugtrio")
override val head = getPart("body3")
val lefthead = object : HeadedFrame {
override val rootPart = this@DugtrioModel.rootPart
override val head: ModelPart = getPart("body2")
}
val righthead = object : HeadedFrame {
override val rootPart = this@DugtrioModel.rootPart
override val head: ModelPart = getPart("body1")
}
override var portraitScale = 1.3F
override var portraitTranslation = Vec3(-0.11, -0.1, 0.0)
override var profileScale = 0.9F
override var profileTranslation = Vec3(0.0, 0.29, 0.0)
lateinit var standing: CobblemonPose
lateinit var walking: CobblemonPose
lateinit var battleidle: CobblemonPose
lateinit var sleep: CobblemonPose
override val cryAnimation = CryProvider { bedrockStateful("dugtrio", "cry") }
override fun registerPoses() {
val blink = quirk { bedrockStateful("dugtrio", "blink")}
val blink2 = quirk { bedrockStateful("dugtrio", "blink2")}
val blink3 = quirk { bedrockStateful("dugtrio", "blink3")}
val quirk = quirk { bedrockStateful("dugtrio", "quirk_idle")}
val quirk2 = quirk { bedrockStateful("dugtrio", "quirk_idle2")}
val quirk3 = quirk { bedrockStateful("dugtrio", "quirk_idle3")}
sleep = registerPose(
poseName = "sleep",
poseType = PoseType.SLEEP,
animations = arrayOf(bedrock("dugtrio", "sleep"))
)
standing = registerPose(
poseName = "stand",
poseTypes = STATIONARY_POSES + UI_POSES,
condition = { !it.isBattling },
quirks = arrayOf(blink, blink2, blink3, quirk, quirk2, quirk3),
animations = arrayOf(
singleBoneLook(pitchMultiplier = 0.6F, yawMultiplier = 0.4F, maxPitch = 10F, minPitch = -30F),
SingleBoneLookAnimation(lefthead, false, false, false, false, 1F, 1.4F, 0F, -30F, 20F, -45F),
SingleBoneLookAnimation(righthead, false, false, false, false, 1F, 1.4F, 0F, -30F, 45F, -25F),
bedrock("dugtrio", "ground_idle"))
)
walking = registerPose(
poseName = "walk",
poseTypes = MOVING_POSES,
quirks = arrayOf(blink, blink2, blink3),
animations = arrayOf(
singleBoneLook(pitchMultiplier = 0.6F, yawMultiplier = 0.4F, maxPitch = 10F, minPitch = -30F),
SingleBoneLookAnimation(lefthead, false, false, false, false, 1F, 1.4F, 0F, -30F, 20F, -45F),
SingleBoneLookAnimation(righthead, false, false, false, false, 1F, 1.4F, 0F, -30F, 45F, -25F),
bedrock("dugtrio", "ground_walk"))
)
battleidle = registerPose(
poseName = "battleidle",
poseTypes = STATIONARY_POSES,
condition = { it.isBattling },
quirks = arrayOf(blink, blink2, blink3, quirk, quirk2, quirk3),
animations = arrayOf(bedrock("dugtrio", "battle_idle"))
)
}
override fun getFaintAnimation(state: PosableState) = bedrockStateful("dugtrio", "faint")
}
@@ -1,66 +0,0 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen1
import com.cobblemon.mod.common.client.render.models.blockbench.animation.BipedWalkAnimation
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BipedFrame
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.Companion.MOVING_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.STATIONARY_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.UI_POSES
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class GravelerModel(root: ModelPart) : PokemonPosableModel(root), BipedFrame {
override val rootPart = root.registerChildWithAllChildren("graveler")
override val leftLeg = getPart("leg_left")
override val rightLeg = getPart("leg_right")
override var portraitScale = 1.4F
override var portraitTranslation = Vec3(-0.1, -0.28, 0.0)
override var profileScale = 0.9F
override var profileTranslation = Vec3(0.0, 0.37, 0.0)
lateinit var standing: CobblemonPose
lateinit var walk: CobblemonPose
override val cryAnimation = CryProvider { bedrockStateful("graveler", "cry") }
override fun registerPoses() {
val blink = quirk { bedrockStateful("graveler", "blink")}
standing = registerPose(
poseName = "standing",
poseTypes = STATIONARY_POSES + UI_POSES,
quirks = arrayOf(blink),
animations = arrayOf(
bedrock("graveler", "ground_idle")
)
)
walk = registerPose(
poseName = "walk",
poseTypes = MOVING_POSES,
quirks = arrayOf(blink),
animations = arrayOf(
BipedWalkAnimation(this, periodMultiplier = 1.1F),
bedrock("graveler", "ground_idle")
//bedrock("graveler", "ground_walk")
)
)
}
// override fun getFaintAnimation(
// pokemonEntity: PokemonEntity,
// state: PosableState<PokemonEntity>
// ) = if (state.isPosedIn(standing, walk)) bedrockStateful("graveler", "faint") else null
}
@@ -1,52 +0,0 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen1
import com.cobblemon.mod.common.client.render.models.blockbench.PosableState
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
import com.cobblemon.mod.common.entity.PoseType
import com.cobblemon.mod.common.entity.PoseType.Companion.ALL_POSES
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class KakunaModel(root: ModelPart) : PokemonPosableModel(root), HeadedFrame {
override val rootPart = root.registerChildWithAllChildren("kakuna")
override val head = getPart("head")
override var portraitScale = 1.7F
override var portraitTranslation = Vec3(0.1, -0.4, 0.0)
override var profileScale = 0.96F
override var profileTranslation = Vec3(0.0, 0.35, 0.0)
lateinit var sleep: Pose
lateinit var standing: Pose
override val cryAnimation = CryProvider { bedrockStateful("kakuna", "cry") }
override fun registerPoses() {
sleep = registerPose(
poseType = PoseType.SLEEP,
animations = arrayOf(bedrock("kakuna", "sleep"))
)
standing = registerPose(
poseName = "standing",
poseTypes = ALL_POSES - PoseType.SLEEP,
animations = arrayOf(
singleBoneLook(),
bedrock("kakuna", "ground_idle")
)
)
}
override fun getFaintAnimation(state: PosableState) = bedrockStateful("kakuna", "faint")
}
@@ -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.gen1
import com.cobblemon.mod.common.client.render.models.blockbench.animation.QuadrupedWalkAnimation
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.frame.QuadrupedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.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.Companion.MOVING_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.STATIONARY_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.UI_POSES
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class NidoranfModel(root: ModelPart) : PokemonPosableModel(root), HeadedFrame, QuadrupedFrame {
override val rootPart = root.registerChildWithAllChildren("nidoran_f")
override val head = getPart("head")
override val foreLeftLeg = getPart("leg_front_left")
override val foreRightLeg = getPart("leg_front_right")
override val hindLeftLeg = getPart("leg_back_left")
override val hindRightLeg = getPart("leg_back_right")
override var portraitScale = 2.0F
override var portraitTranslation = Vec3(-0.16, -0.85, 0.0)
override var profileScale = 1.03F
override var profileTranslation = Vec3(0.02, 0.21, 0.0)
lateinit var sleep: CobblemonPose
lateinit var standing: CobblemonPose
lateinit var walk: CobblemonPose
override val cryAnimation = CryProvider { bedrockStateful("nidoranf", "cry") }
override fun registerPoses() {
val blink = quirk { bedrockStateful("nidoranf", "blink") }
standing = registerPose(
poseName = "standing",
poseTypes = STATIONARY_POSES + UI_POSES,
transformTicks = 10,
quirks = arrayOf(blink),
animations = arrayOf(
singleBoneLook(),
bedrock("nidoranf", "idle")
)
)
walk = registerPose(
poseName = "walk",
poseTypes = MOVING_POSES,
transformTicks = 10,
quirks = arrayOf(blink),
animations = arrayOf(
singleBoneLook(),
bedrock("nidoranf", "idle"),
QuadrupedWalkAnimation(this)
)
)
}
// override fun getFaintAnimation(
// pokemonEntity: PokemonEntity,
// state: PosableState<PokemonEntity>
// ) = if (state.isPosedIn(standing, walk)) bedrockStateful("nidoranf", "faint") else null
}
@@ -1,73 +0,0 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen1
import com.cobblemon.mod.common.client.render.models.blockbench.animation.QuadrupedWalkAnimation
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.frame.QuadrupedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
import com.cobblemon.mod.common.entity.PoseType.Companion.MOVING_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.STATIONARY_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.UI_POSES
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class NidoranmModel(root: ModelPart) : PokemonPosableModel(root), HeadedFrame, QuadrupedFrame {
override val rootPart = root.registerChildWithAllChildren("nidoran_m")
override val head = getPart("head")
override val foreLeftLeg = getPart("leg_front_left")
override val foreRightLeg = getPart("leg_front_right")
override val hindLeftLeg = getPart("leg_back_left")
override val hindRightLeg = getPart("leg_back_right")
override var portraitScale = 1.97F
override var portraitTranslation = Vec3(-0.18, -1.28, 0.0)
override var profileScale = 1.05F
override var profileTranslation = Vec3(0.03, 0.11, 0.0)
lateinit var sleep: Pose
lateinit var standing: Pose
lateinit var walk: Pose
override val cryAnimation = CryProvider { bedrockStateful("nidoranm", "cry") }
override fun registerPoses() {
val blink = quirk { bedrockStateful("nidoranm", "blink") }
standing = registerPose(
poseName = "standing",
poseTypes = STATIONARY_POSES + UI_POSES,
transformTicks = 10,
quirks = arrayOf(blink),
animations = arrayOf(
singleBoneLook(),
bedrock("nidoranm", "idle")
)
)
walk = registerPose(
poseName = "walk",
poseTypes = MOVING_POSES,
transformTicks = 10,
quirks = arrayOf(blink),
animations = arrayOf(
singleBoneLook(),
bedrock("nidoranm", "idle"),
QuadrupedWalkAnimation(this)
)
)
}
// override fun getFaintAnimation(
// pokemonEntity: PokemonEntity,
// state: PosableState<PokemonEntity>
// ) = if (state.isPosedIn(standing, walk)) bedrockStateful("nidoranm", "faint") else null
}
@@ -1,92 +0,0 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen1
import com.cobblemon.mod.common.client.render.models.blockbench.animation.QuadrupedWalkAnimation
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.frame.QuadrupedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
import com.cobblemon.mod.common.entity.PoseType
import com.cobblemon.mod.common.entity.PoseType.Companion.MOVING_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.STATIONARY_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.UI_POSES
import com.cobblemon.mod.common.util.isBattling
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class NidorinaModel(root: ModelPart) : PokemonPosableModel(root), HeadedFrame, QuadrupedFrame {
override val rootPart = root.registerChildWithAllChildren("nidorina")
override val head = getPart("head")
override val foreLeftLeg= getPart("left_upper_arm")
override val foreRightLeg = getPart("right_upper_arm")
override val hindLeftLeg = getPart("left_leg")
override val hindRightLeg = getPart("right_leg")
override var portraitScale = 2.13F
override var portraitTranslation = Vec3(-0.05, -0.71, 0.0)
override var profileScale = 1.0F
override var profileTranslation = Vec3(0.0, 0.21, 0.0)
lateinit var sleep: Pose
lateinit var standing: Pose
lateinit var walk: Pose
lateinit var battleidle: Pose
override val cryAnimation = CryProvider { bedrockStateful("nidorina", "cry") }
override fun registerPoses() {
val blink = quirk { bedrockStateful("nidorina", "blink")}
standing = registerPose(
poseName = "standing",
poseTypes = STATIONARY_POSES + UI_POSES,
condition = { !it.isBattling },
quirks = arrayOf(blink),
animations = arrayOf(
singleBoneLook(),
bedrock("nidorina", "idle3")
)
)
sleep = registerPose(
poseType = PoseType.SLEEP,
animations = arrayOf(bedrock("nidorina", "idle2"))
)
walk = registerPose(
poseName = "walk",
poseTypes = MOVING_POSES,
quirks = arrayOf(blink),
animations = arrayOf(
singleBoneLook(),
bedrock("nidorina", "idle2"),
QuadrupedWalkAnimation(this)
)
)
battleidle = registerPose(
poseName = "battle_idle",
poseTypes = PoseType.STATIONARY_POSES,
transformTicks = 10,
quirks = arrayOf(blink),
condition = { it.isBattling },
animations = arrayOf(
singleBoneLook(),
bedrock("nidorina", "idle")
)
)
}
// override fun getFaintAnimation(
// pokemonEntity: PokemonEntity,
// state: PosableState<PokemonEntity>
// ) = if (state.isPosedIn(standing, walk)) bedrockStateful("nidorina", "faint") else null
}
@@ -1,206 +0,0 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen1
import com.cobblemon.mod.common.client.render.models.blockbench.createTransformation
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BiWingedFrame
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.ModelPartTransformation
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
import com.cobblemon.mod.common.client.render.models.blockbench.wavefunction.parabolaFunction
import com.cobblemon.mod.common.client.render.models.blockbench.wavefunction.sineFunction
import com.cobblemon.mod.common.entity.PoseType
import com.cobblemon.mod.common.entity.PoseType.Companion.STATIONARY_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.UI_POSES
import com.cobblemon.mod.common.util.math.geometry.toRadians
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class PidgeottoModel(root: ModelPart) : PokemonPosableModel(root), HeadedFrame, BipedFrame, BiWingedFrame {
override val rootPart = root.registerChildWithAllChildren("pidgeotto")
override val head = getPart("neck")
override val leftWing = getPart("wing_closed_left")
override val rightWing = getPart("wing_closed_right")
override val leftLeg = getPart("leg_left")
override val rightLeg = getPart("leg_right")
private val tail = getPart("tail")
private val wingOpenRight = getPart("wing_open_right")
private val wingOpenLeft = getPart("wing_open_left")
private val wingClosedRight = getPart("wing_closed_right")
private val wingClosedLeft = getPart("wing_closed_left")
override var portraitScale = 2.8F
override var portraitTranslation = Vec3(-0.4, -0.9, 0.0)
override var profileScale = 1.1F
override var profileTranslation = Vec3(0.0, 0.1, 0.0)
lateinit var sleep: Pose
lateinit var stand: Pose
lateinit var walk: Pose
lateinit var hover: Pose
lateinit var fly: Pose
override val cryAnimation = CryProvider { bedrockStateful("pidgeotto", "cry") }
override fun registerPoses() {
val blink = quirk { bedrockStateful("pidgeotto", "blink")}
val flyQuirk1 = quirk { bedrockStateful("pidgeotto", "air_fly_quirk") }
val flyQuirk2 = quirk { bedrockStateful("pidgeotto", "air_fly_quirk2") }
sleep = registerPose(
poseName = "sleep",
poseType = PoseType.SLEEP,
transformedParts = arrayOf(
wingClosedLeft.createTransformation().withVisibility(visibility = true),
wingClosedRight.createTransformation().withVisibility(visibility = true),
wingOpenLeft.createTransformation().withVisibility(visibility = false),
wingOpenRight.createTransformation().withVisibility(visibility = false)
),
animations = arrayOf(bedrock("pidgeotto", "sleep_PLACEHOLDER"))
)
stand = registerPose(
poseName = "stand",
poseTypes = STATIONARY_POSES - PoseType.HOVER + UI_POSES,
transformedParts = arrayOf(
wingClosedLeft.createTransformation().withVisibility(visibility = true),
wingClosedRight.createTransformation().withVisibility(visibility = true),
wingOpenLeft.createTransformation().withVisibility(visibility = false),
wingOpenRight.createTransformation().withVisibility(visibility = false)
),
quirks = arrayOf(blink),
animations = arrayOf(
singleBoneLook(),
bedrock("pidgeotto", "ground_idle_PLACEHOLDER")
)
)
walk = registerPose(
poseName = "hover",
poseTypes = PoseType.MOVING_POSES - PoseType.FLY,
transformedParts = arrayOf(
wingClosedLeft.createTransformation().withVisibility(visibility = true),
wingClosedRight.createTransformation().withVisibility(visibility = true),
wingOpenLeft.createTransformation().withVisibility(visibility = false),
wingOpenRight.createTransformation().withVisibility(visibility = false)
),
quirks = arrayOf(blink),
animations = arrayOf(
singleBoneLook(),
bedrock("pidgeotto", "ground_idle_PLACEHOLDER"),
rootPart.translation(
function = parabolaFunction(
peak = -4F,
period = 0.4F
),
timeVariable = { state, _, _ -> state.animationSeconds },
axis = ModelPartTransformation.Y_AXIS
),
head.translation(
function = sineFunction(
amplitude = (-20F).toRadians(),
period = 1F,
verticalShift = (-10F).toRadians()
),
axis = ModelPartTransformation.X_AXIS,
timeVariable = { state, _, _ -> state.animationSeconds }
),
leftLeg.rotation(
function = parabolaFunction(
tightness = -20F,
phaseShift = 0F,
verticalShift = (30F).toRadians()
),
axis = ModelPartTransformation.X_AXIS,
timeVariable = { _, _, ageInTicks -> ageInTicks / 20 },
),
rightLeg.rotation(
function = parabolaFunction(
tightness = -20F,
phaseShift = 0F,
verticalShift = (30F).toRadians()
),
axis = ModelPartTransformation.X_AXIS,
timeVariable = { _, _, ageInTicks -> ageInTicks / 20 },
),
tail.rotation(
function = sineFunction(
amplitude = (-5F).toRadians(),
period = 1F
),
axis = ModelPartTransformation.X_AXIS,
timeVariable = { _, _, ageInTicks -> ageInTicks / 20 },
),
wingFlap(
flapFunction = sineFunction(
amplitude = (-5F).toRadians(),
period = 0.4F,
phaseShift = 0.00F,
verticalShift = (-20F).toRadians()
),
timeVariable = { state, _, _ -> state.animationSeconds },
axis = ModelPartTransformation.Z_AXIS
),
rightWing.translation(
function = parabolaFunction(
tightness = -10F,
phaseShift = 30F,
verticalShift = (25F).toRadians()
),
axis = ModelPartTransformation.Y_AXIS,
timeVariable = { _, _, ageInTicks -> ageInTicks / 20 },
),
leftWing.translation(
function = parabolaFunction(
tightness = -10F,
phaseShift = 30F,
verticalShift = (25F).toRadians()
),
axis = ModelPartTransformation.Y_AXIS,
timeVariable = { _, _, ageInTicks -> ageInTicks / 20 },
),
)
)
hover = registerPose(
poseName = "fly",
poseType = PoseType.HOVER,
transformedParts = arrayOf(
wingClosedLeft.createTransformation().withVisibility(visibility = false),
wingClosedRight.createTransformation().withVisibility(visibility = false),
wingOpenLeft.createTransformation().withVisibility(visibility = true),
wingOpenRight.createTransformation().withVisibility(visibility = true)
),
quirks = arrayOf(blink),
animations = arrayOf(
singleBoneLook(),
bedrock("pidgeotto", "air_idle")
)
)
fly = registerPose(
poseName = "walk",
poseType = PoseType.FLY,
transformedParts = arrayOf(
wingClosedLeft.createTransformation().withVisibility(visibility = false),
wingClosedRight.createTransformation().withVisibility(visibility = false),
wingOpenLeft.createTransformation().withVisibility(visibility = true),
wingOpenRight.createTransformation().withVisibility(visibility = true)
),
transformTicks = 10,
quirks = arrayOf(blink, flyQuirk1, flyQuirk2),
animations = arrayOf(
singleBoneLook(),
bedrock("pidgeotto", "air_fly")
)
)
}
}
@@ -1,131 +0,0 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen1
import com.cobblemon.mod.common.client.render.models.blockbench.animation.PitchTiltAnimation
import com.cobblemon.mod.common.client.render.models.blockbench.createTransformation
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.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.SHOULDER_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 PidgeyModel(root: ModelPart) : PokemonPosableModel(root), HeadedFrame {
override val rootPart = root.registerChildWithAllChildren("pidgey")
override val head = getPart("head")
private val wingOpenRight = getPart("wing_open_right")
private val wingOpenLeft = getPart("wing_open_left")
private val wingClosedRight = getPart("wing_closed_right")
private val wingClosedLeft = getPart("wing_closed_left")
override var portraitScale = 3.5F
override var portraitTranslation = Vec3(-0.1, -2.1, 0.0)
override var profileScale = 1.2F
override var profileTranslation = Vec3(0.0, -0.01, 0.0)
lateinit var sleep: CobblemonPose
lateinit var stand: CobblemonPose
lateinit var walk: CobblemonPose
lateinit var hover: CobblemonPose
lateinit var fly: CobblemonPose
override val cryAnimation = CryProvider { bedrockStateful("pidgey", "cry") }
override fun registerPoses() {
val blink = quirk { bedrockStateful("pidgey", "blink") }
sleep = registerPose(
poseName = "sleeping",
transformedParts = arrayOf(
wingClosedLeft.createTransformation().withVisibility(visibility = true),
wingClosedRight.createTransformation().withVisibility(visibility = true),
wingOpenLeft.createTransformation().withVisibility(visibility = false),
wingOpenRight.createTransformation().withVisibility(visibility = false)
),
poseType = PoseType.SLEEP,
animations = arrayOf(bedrock("pidgey", "sleep_PLACEHOLDER"))
)
stand = registerPose(
poseName = "standing",
poseTypes = SHOULDER_POSES + UI_POSES + PoseType.STATIONARY_POSES - PoseType.HOVER,
transformTicks = 10,
transformedParts = arrayOf(
wingClosedLeft.createTransformation().withVisibility(visibility = true),
wingClosedRight.createTransformation().withVisibility(visibility = true),
wingOpenLeft.createTransformation().withVisibility(visibility = false),
wingOpenRight.createTransformation().withVisibility(visibility = false)
),
quirks = arrayOf(blink),
animations = arrayOf(
singleBoneLook(),
bedrock("pidgey", "ground_idle")
)
)
hover = registerPose(
poseName = "hover",
poseType = PoseType.HOVER,
transformedParts = arrayOf(
wingClosedLeft.createTransformation().withVisibility(visibility = false),
wingClosedRight.createTransformation().withVisibility(visibility = false),
wingOpenLeft.createTransformation().withVisibility(visibility = true),
wingOpenRight.createTransformation().withVisibility(visibility = true)
),
transformTicks = 10,
quirks = arrayOf(blink),
animations = arrayOf(
PitchTiltAnimation(bone = getPart("body"), maxChangePerTick = 1F),
singleBoneLook(),
bedrock("pidgey", "air_idle")
)
)
fly = registerPose(
poseName = "fly",
poseType = PoseType.FLY,
transformedParts = arrayOf(
wingClosedLeft.createTransformation().withVisibility(visibility = false),
wingClosedRight.createTransformation().withVisibility(visibility = false),
wingOpenLeft.createTransformation().withVisibility(visibility = true),
wingOpenRight.createTransformation().withVisibility(visibility = true)
),
transformTicks = 10,
quirks = arrayOf(blink),
animations = arrayOf(
PitchTiltAnimation(bone = getPart("body"), maxChangePerTick = 1F),
singleBoneLook(),
bedrock("pidgey", "air_fly")
)
)
walk = registerPose(
poseName = "walking",
poseTypes = PoseType.MOVING_POSES - PoseType.FLY,
transformedParts = arrayOf(
wingClosedLeft.createTransformation().withVisibility(visibility = true),
wingClosedRight.createTransformation().withVisibility(visibility = true),
wingOpenLeft.createTransformation().withVisibility(visibility = false),
wingOpenRight.createTransformation().withVisibility(visibility = false)
),
transformTicks = 10,
quirks = arrayOf(blink),
animations = arrayOf(
singleBoneLook(),
bedrock("pidgey", "ground_walk")
)
)
}
}
@@ -1,93 +0,0 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen1
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
import com.cobblemon.mod.common.client.render.models.blockbench.pose.CobblemonPose
import com.cobblemon.mod.common.entity.PoseType
import com.cobblemon.mod.common.entity.PoseType.Companion.UI_POSES
import com.cobblemon.mod.common.util.isInWater
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class TentacoolModel(root: ModelPart) : PokemonPosableModel(root) {
override val rootPart = root.registerChildWithAllChildren("tentacool")
override var portraitScale = 1.2F
override var portraitTranslation = Vec3(0.1, 1.1, 0.0)
override var profileScale = 0.6F
override var profileTranslation = Vec3(0.0, 0.8, 0.0)
lateinit var standing: CobblemonPose
lateinit var walk: CobblemonPose
lateinit var swim: CobblemonPose
lateinit var float: CobblemonPose
lateinit var sleep: CobblemonPose
lateinit var watersleep: CobblemonPose
override fun registerPoses() {
val blink = quirk { bedrockStateful("tentacool", "blink")}
standing = registerPose(
poseName = "standing",
poseType = PoseType.STAND,
quirks = arrayOf(blink),
animations = arrayOf(
bedrock("tentacool", "ground_idle")
)
)
walk = registerPose(
poseName = "walk",
poseType = PoseType.WALK,
quirks = arrayOf(blink),
animations = arrayOf(
bedrock("tentacool", "ground_idle")
//bedrock("tentacool", "ground_walk")
)
)
float = registerPose(
poseName = "float",
poseTypes = UI_POSES + PoseType.FLOAT,
quirks = arrayOf(blink),
animations = arrayOf(
bedrock("tentacool", "water_idle")
)
)
swim = registerPose(
poseName = "swim",
poseType = PoseType.SWIM,
quirks = arrayOf(blink),
animations = arrayOf(
bedrock("tentacool", "water_swim")
)
)
sleep = registerPose(
poseName = "sleep",
poseType = PoseType.SLEEP,
condition = { !it.isInWater },
animations = arrayOf(bedrock("tentacool", "sleep"))
)
watersleep = registerPose(
poseName = "watersleep",
poseType = PoseType.SLEEP,
condition = { it.isInWater },
animations = arrayOf(bedrock("tentacool", "water_sleep"))
)
}
// override fun getFaintAnimation(
// pokemonEntity: PokemonEntity,
// state: PosableState<PokemonEntity>
// ) = if (state.isPosedIn(standing, walk)) bedrockStateful("tentacool", "faint") else null
}
@@ -30,7 +30,7 @@ class WartortleModel(root: ModelPart) : PokemonPosableModel(root), HeadedFrame {
override var portraitTranslation = Vec3(-0.17, 0.54, 0.0)
override var profileScale = 0.69F
override var profileTranslation = Vec3(-0.04, 0.69, 0.0)
override var profileTranslation = Vec3(0.0, 0.69, 0.0)
lateinit var sleep: CobblemonPose
lateinit var standing: CobblemonPose
@@ -1,86 +0,0 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen2
import com.cobblemon.mod.common.client.render.models.blockbench.PosableState
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BimanualFrame
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BipedFrame
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.STATIONARY_POSES
import com.cobblemon.mod.common.entity.PoseType.Companion.UI_POSES
import com.cobblemon.mod.common.util.isBattling
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class BlisseyModel(root: ModelPart) : PokemonPosableModel(root), BipedFrame, BimanualFrame {
override val rootPart = root.registerChildWithAllChildren("blissey")
override val leftLeg = getPart("left_foot")
override val rightLeg = getPart("right_foot")
override val leftArm = getPart("left_arm")
override val rightArm = getPart("right_arm")
override var portraitScale = 1.5F
override var portraitTranslation = Vec3(-0.6, 0.9, 0.0)
override var profileScale = 0.7F
override var profileTranslation = Vec3(0.0, 0.7, 0.0)
lateinit var standing: CobblemonPose
lateinit var walk: CobblemonPose
lateinit var sleep: CobblemonPose
lateinit var battle_idle: CobblemonPose
override fun registerPoses() {
val blink = quirk { bedrockStateful("blissey", "blink") }
val eggQuirk = quirk { bedrockStateful("blissey", "eggadjust_quirk") }
sleep = registerPose(
poseName = "sleep",
poseType = PoseType.SLEEP,
animations = arrayOf(
bedrock("blissey", "sleep")
)
)
standing = registerPose(
poseName = "standing",
poseTypes = STATIONARY_POSES + UI_POSES,
condition = { !it.isBattling },
quirks = arrayOf(blink, eggQuirk),
animations = arrayOf(
bedrock("blissey", "ground_idle")
)
)
walk = registerPose(
poseName = "walk",
poseTypes = MOVING_POSES,
quirks = arrayOf(blink),
animations = arrayOf(
bedrock("blissey", "ground_walk")
)
)
battle_idle = registerPose(
poseName = "battle_idle",
poseTypes = STATIONARY_POSES,
condition = { it.isBattling },
quirks = arrayOf(blink, eggQuirk),
animations = arrayOf(
bedrock("blissey", "battle_idle")
)
)
}
override fun getFaintAnimation(state: PosableState) = bedrockStateful("blissey", "faint")
}
@@ -1,76 +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.PosableState
import com.cobblemon.mod.common.client.render.models.blockbench.animation.ActiveAnimation
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 GolettModel (root: ModelPart) : PokemonPosableModel(root), HeadedFrame, BipedFrame, BimanualFrame {
override val rootPart = root.registerChildWithAllChildren("golett")
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 = 3.0F
override var portraitTranslation = Vec3(-0.15, -0.45, 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
lateinit var sleep: Pose
override val cryAnimation = CryProvider { bedrockStateful("golett", "cry") }
override fun registerPoses() {
val blink = quirk { bedrockStateful("golett", "blink") }
standing = registerPose(
poseName = "standing",
poseTypes = PoseType.STATIONARY_POSES + PoseType.UI_POSES,
quirks = arrayOf(blink),
animations = arrayOf(
singleBoneLook(),
bedrock("golett", "ground_idle")
)
)
walk = registerPose(
poseName = "walk",
poseTypes = PoseType.MOVING_POSES,
quirks = arrayOf(blink),
animations = arrayOf(
singleBoneLook(),
bedrock("golett", "ground_walk")
)
)
sleep = registerPose(
poseName = "sleep",
poseType = PoseType.SLEEP,
animations = arrayOf(bedrock("golett", "sleep"))
)
}
override fun getFaintAnimation(state: PosableState): ActiveAnimation? {
return if (state.isNotPosedIn(sleep, standing, walk)) bedrockStateful("golett", "faint") else null
}
}
@@ -224,16 +224,11 @@ object VaryingModelRepository {
inbuilt("metapod", ::MetapodModel)
inbuilt("butterfree", ::ButterfreeModel)
inbuilt("weedle", ::WeedleModel)
inbuilt("kakuna", ::KakunaModel)
inbuilt("beedrill", ::BeedrillModel)
inbuilt("rattata", ::RattataModel)
inbuilt("raticate", ::RaticateModel)
inbuilt("rattata_alolan", ::RattataAlolanModel)
inbuilt("raticate_alolan", ::RaticateAlolanModel)
inbuilt("pidgey", ::PidgeyModel)
inbuilt("pidgeotto", ::PidgeottoModel)
inbuilt("diglett", ::DiglettModel)
inbuilt("dugtrio", ::DugtrioModel)
inbuilt("krabby", ::KrabbyModel)
inbuilt("paras", ::ParasModel)
inbuilt("mankey", ::MankeyModel)
@@ -248,7 +243,6 @@ object VaryingModelRepository {
inbuilt("machop", ::MachopModel)
inbuilt("machoke", ::MachokeModel)
inbuilt("machamp", ::MachampModel)
inbuilt("chansey", ::ChanseyModel)
inbuilt("cubone", ::CuboneModel)
inbuilt("dodrio", ::DodrioModel)
inbuilt("doduo", ::DoduoModel)
@@ -261,7 +255,6 @@ object VaryingModelRepository {
inbuilt("geodude", ::GeodudeModel)
inbuilt("golduck", ::GolduckModel)
inbuilt("golem", ::GolemModel)
inbuilt("graveler", ::GravelerModel)
inbuilt("hitmonchan", ::HitmonchanModel)
inbuilt("hitmonlee", ::HitmonleeModel)
inbuilt("kabuto", ::KabutoModel)
@@ -272,9 +265,6 @@ object VaryingModelRepository {
inbuilt("marowak", ::MarowakModel)
inbuilt("meowth", ::MeowthModel)
inbuilt("nidoqueen", ::NidoqueenModel)
inbuilt("nidoranf", ::NidoranfModel)
inbuilt("nidoranm", ::NidoranmModel)
inbuilt("nidorina", ::NidorinaModel)
inbuilt("nidorino", ::NidorinoModel)
inbuilt("persian", ::PersianModel)
inbuilt("pinsir", ::PinsirModel)
@@ -285,14 +275,12 @@ object VaryingModelRepository {
inbuilt("rapidash", ::RapidashModel)
inbuilt("sandslash", ::SandslashModel)
inbuilt("tangela", ::TangelaModel)
inbuilt("tentacool", ::TentacoolModel)
inbuilt("venomoth", ::VenomothModel)
inbuilt("venonat", ::VenonatModel)
inbuilt("elekid", ::ElekidModel)
inbuilt("hitmontop", ::HitmontopModel)
inbuilt("electivire", ::ElectivireModel)
inbuilt("tangrowth", ::TangrowthModel)
inbuilt("blissey", ::BlisseyModel)
inbuilt("piloswine", ::PiloswineModel)
inbuilt("quagsire", ::QuagsireModel)
inbuilt("swinub", ::SwinubModel)
@@ -341,7 +329,6 @@ object VaryingModelRepository {
inbuilt("lotad", :: LotadModel)
inbuilt("lombre", :: LombreModel)
inbuilt("ludicolo", :: LudicoloModel)
inbuilt("golett", :: GolettModel)
inbuilt("stantler", :: StantlerModel)
inbuilt("bergmite", :: BergmiteModel)
inbuilt("avalugg", :: AvaluggModel)
@@ -549,8 +536,6 @@ object VaryingModelRepository {
inbuilt("beartic", ::BearticModel)
inbuilt("dreepy", ::DreepyModel)
inbuilt("drakloak", ::DrakloakModel)
inbuilt("diglett_alolan", ::DiglettAlolanModel)
inbuilt("dugtrio_alolan", ::DugtrioAlolanModel)
inbuilt("makuhita", ::MakuhitaModel)
inbuilt("hariyama", ::HariyamaModel)
inbuilt("alomomola", ::AlomomolaModel)
@@ -45,6 +45,9 @@ object GiveAllPokemon {
val orderedSpeces = PokemonSpecies.implemented.sortedBy { it.nationalPokedexNumber }
for (species in orderedSpeces) {
if (species.nationalPokedexNumber !in range) {
continue
}
val pokemon = species.create()
pokemon.setOriginalTrainer(player.uuid)
pc.add(pokemon)//.sendOut(player.level() as ServerWorld, player.pos)
@@ -9,7 +9,10 @@
package com.cobblemon.mod.common.entity.ai
import com.bedrockk.molang.Expression
import com.cobblemon.mod.common.CobblemonMemories
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asMostSpecificMoLangValue
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
import com.cobblemon.mod.common.util.getMemorySafely
import com.cobblemon.mod.common.util.mainThreadRuntime
import com.cobblemon.mod.common.util.resolveInt
import com.cobblemon.mod.common.util.withQueryValue
@@ -29,12 +32,23 @@ object FleeFromAttackerTask {
Trigger { _, entity, _ ->
val hurtByEntity = it.get(hurtByEntity)
val avoidTarget = it.tryGet(avoidTarget).orElse(null)
if (avoidTarget != null && avoidTarget == hurtByEntity.uuid) {
if (avoidTarget != null && avoidTarget == hurtByEntity) {
return@Trigger false
}
mainThreadRuntime.withQueryValue("entity", entity.asMostSpecificMoLangValue())
val avoidDurationTicks = mainThreadRuntime.resolveInt(avoidDurationTicks)
val pokemonEntity = entity as? PokemonEntity
pokemonEntity?.let {
it.after(1.0f) {
it.playMoodParticle("mood_stress")
}
}
entity.brain.setMemoryWithExpiry(MemoryModuleType.AVOID_TARGET, hurtByEntity, avoidDurationTicks.toLong())
return@Trigger true
}
}
@@ -8,6 +8,7 @@
package com.cobblemon.mod.common.entity.ai
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
import net.minecraft.world.entity.LivingEntity
import net.minecraft.world.entity.ai.behavior.OneShot
import net.minecraft.world.entity.ai.behavior.declarative.BehaviorBuilder
@@ -24,10 +25,16 @@ object GetAngryAtAttackerTask {
Trigger { _, entity, _ ->
val hurtByEntity = it.get(hurtByEntity)
val angryAt = it.tryGet(angryAt).orElse(null)
if (angryAt != null && angryAt == hurtByEntity.uuid) {
return@Trigger false
}
val becomingAngry = angryAt == null
entity.brain.setMemory(MemoryModuleType.ANGRY_AT, hurtByEntity.uuid)
if (becomingAngry) {
(entity as PokemonEntity?)?.playMoodParticle("mood_anger_steam")
}
return@Trigger true
}
}
@@ -34,6 +34,9 @@ import com.cobblemon.mod.common.api.molang.MoLangFunctions.addPokemonFunctions
import com.cobblemon.mod.common.api.molang.MoLangFunctions.addStandardFunctions
import com.cobblemon.mod.common.api.molang.MoLangFunctions.setup
import com.cobblemon.mod.common.api.molang.ObjectValue
import com.cobblemon.mod.common.api.moves.animations.ActionEffectContext
import com.cobblemon.mod.common.api.moves.animations.ActionEffects
import com.cobblemon.mod.common.api.moves.animations.UsersProvider
import com.cobblemon.mod.common.api.net.serializers.PlatformTypeDataSerializer
import com.cobblemon.mod.common.api.net.serializers.PoseTypeDataSerializer
import com.cobblemon.mod.common.api.net.serializers.RideBoostsDataSerializer
@@ -425,6 +428,9 @@ open class PokemonEntity(
var occupiedSeats = mutableMapOf<Seat, Entity>()
var moodParticleLock = false
var playedZeroStaminaParticle = false
init {
delegate.initialize(this)
delegate.changePokemon(pokemon)
@@ -904,6 +910,27 @@ open class PokemonEntity(
return future
}
fun playMoodParticle(particleName: String) {
if (moodParticleLock) return
val actionEffect = ActionEffects.actionEffects[cobblemonResource(particleName)] ?: return
cry()
val context = ActionEffectContext(
actionEffect = actionEffect,
providers = mutableListOf(UsersProvider(this)),
runtime = runtime,
level = level()
)
actionEffect.run(context)
moodParticleLock = true
after(5.0f) {
moodParticleLock = false
}
}
override fun saveWithoutId(nbt: CompoundTag): CompoundTag {
val tethering = this.tethering
if (tethering != null) {
@@ -2300,6 +2327,8 @@ open class PokemonEntity(
ifRidingAvailable { _, _, state ->
state.stamina.set(entityData.get(RIDE_STAMINA))
}
playedZeroStaminaParticle = false
}
}
@@ -2328,12 +2357,26 @@ open class PokemonEntity(
override fun tickRidden(driver: Player, movementInput: Vec3) {
super.tickRidden(driver, movementInput)
ifRidingAvailable { behaviour, settings, state ->
behaviour.tick(settings, state, this, driver, movementInput)
if (entityData.get(RIDE_STAMINA) == -1F) {
state.stamina.set(1F, forced = true)
}
if (!level().isClientSide) {
val stamina = state.stamina.get()
if (stamina <= 0f) {
if (!playedZeroStaminaParticle) {
playMoodParticle("mood_stress")
playedZeroStaminaParticle = true
}
} else {
playedZeroStaminaParticle = false
}
}
if (!this.level().isClientSide) {
val pose = behaviour.pose(settings, state, this)
if (pose != this.entityData.get(POSE_TYPE)) {
@@ -14,7 +14,6 @@ import com.bedrockk.molang.runtime.value.MoValue
import com.cobblemon.mod.common.Cobblemon
import com.cobblemon.mod.common.CobblemonMemories
import com.cobblemon.mod.common.CobblemonSounds
import com.cobblemon.mod.common.OrientationControllable
import com.cobblemon.mod.common.api.entity.PokemonSender
import com.cobblemon.mod.common.api.entity.PokemonSideDelegate
import com.cobblemon.mod.common.api.molang.MoLangFunctions.addPokemonEntityFunctions
@@ -31,7 +30,6 @@ import com.cobblemon.mod.common.pokemon.Pokemon
import com.cobblemon.mod.common.pokemon.activestate.ActivePokemonState
import com.cobblemon.mod.common.pokemon.activestate.SentOutState
import com.cobblemon.mod.common.util.*
import com.cobblemon.mod.common.util.math.geometry.toRadians
import com.cobblemon.mod.common.world.gamerules.CobblemonGameRules
import net.minecraft.network.chat.Component
import net.minecraft.network.syncher.EntityDataAccessor
@@ -43,8 +41,6 @@ import net.minecraft.world.entity.ai.attributes.Attributes
import net.minecraft.world.item.ItemStack
import net.minecraft.world.level.pathfinder.PathType
import net.minecraft.world.phys.Vec3
import org.joml.Matrix3f
import org.joml.Vector3f
import java.util.*
import kotlin.math.*
@@ -52,6 +48,7 @@ import kotlin.math.*
class PokemonServerDelegate : PokemonSideDelegate {
lateinit var entity: PokemonEntity
var acknowledgedHPValue = -1
var acknowledgedLevel = -1
val passengerOffsets = mutableMapOf<Int, Vec3>()
/** Mocked properties exposed to the client [PokemonEntity]. */
@@ -301,6 +298,11 @@ class PokemonServerDelegate : PokemonSideDelegate {
if (entity.ownerUUID == null) entity.ownerUUID = entity.pokemon.getOwnerUUID()
}
if (acknowledgedLevel != entity.pokemon.level) {
acknowledgedLevel = entity.pokemon.level
updateAttributes(entity.pokemon)
}
val tethering = entity.tethering
if (tethering != null && entity.pokemon.tetheringId != tethering.tetheringId) {
return entity.discard()
@@ -44,6 +44,11 @@ class DefendOwnerSensor : Sensor<PokemonEntity>(10) {
return@findClosest false
}.map { mob -> mob as LivingEntity }
val previousAttacker = entity.brain.getMemorySafely(CobblemonMemories.NEAREST_VISIBLE_ATTACKER)
val isNewAttacker = nearestAttacker.isPresent && previousAttacker.isEmpty
entity.brain.setMemory(CobblemonMemories.NEAREST_VISIBLE_ATTACKER, nearestAttacker)
if (isNewAttacker) {
entity.playMoodParticle("mood_anger_steam")
}
}
}
@@ -9,6 +9,7 @@
package com.cobblemon.mod.common.entity.pokemon.ai.tasks
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
import com.cobblemon.mod.common.util.getMemorySafely
import net.minecraft.world.entity.LivingEntity
import net.minecraft.world.entity.Mob
import net.minecraft.world.entity.ai.behavior.OneShot
@@ -60,7 +61,12 @@ object AttackHostileMobsTask {
}
if (hostile != null) {
val isNewTarget = currentTarget == null
entity.brain.setMemory(MemoryModuleType.ATTACK_TARGET, hostile)
if (isNewTarget) {
(entity as? PokemonEntity)?.playMoodParticle("mood_anger_steam")
}
true
} else {
false
@@ -91,7 +91,7 @@ class EatHeldItemTask(entity: PokemonEntity) : Behavior<PokemonEntity>(
}
this.timelastEaten = time
if (itemConfig != null && itemConfig.fullnessValue > 0) {
entity.pokemon.feedPokemon(itemConfig.fullnessValue, false)
entity.pokemon.feedPokemon(itemConfig.fullnessValue, false, false)
}
// Check if the result item is something that should be dropped
resultItemStack = entity.pokemon.heldItem()
@@ -13,7 +13,9 @@ import com.cobblemon.mod.common.api.apricorn.Apricorn
import com.cobblemon.mod.common.api.item.PokemonSelectingItem
import com.cobblemon.mod.common.api.riding.stats.RidingStat
import com.cobblemon.mod.common.client.pot.CookingQuality
import com.cobblemon.mod.common.net.messages.client.effect.SpawnSnowstormEntityParticlePacket
import com.cobblemon.mod.common.pokemon.Pokemon
import com.cobblemon.mod.common.util.cobblemonResource
import net.minecraft.network.chat.Component
import net.minecraft.server.level.ServerLevel
import net.minecraft.server.level.ServerPlayer
@@ -92,7 +94,9 @@ class AprijuiceItem(val type: Apricorn): CobblemonItem(Properties().stacksTo(16)
return InteractionResultHolder.fail(stack)
}
pokemon.feedPokemon(1)
if (!pokemon.feedPokemon(1)) {
return InteractionResultHolder.fail(stack)
}
val boosts = getBoosts(stack)
pokemon.addRideBoosts(boosts.mapValues { it.value.toFloat() })
@@ -9,6 +9,7 @@
package com.cobblemon.mod.common.item
import com.cobblemon.mod.common.CobblemonSounds
import com.cobblemon.mod.common.block.TypeGemClusterBlock
import net.minecraft.sounds.SoundEvents
import net.minecraft.sounds.SoundSource
import net.minecraft.world.InteractionResult
@@ -29,7 +30,7 @@ class GemItem(settings: Properties, val block: Block): Item(settings) {
if (state.isFaceSturdy(world, pos, direction)) {
if (!world.getBlockState(pos.relative(direction)).isAir) return InteractionResult.FAIL
context.itemInHand.consume(1, context.player)
world.setBlockAndUpdate(pos.relative(direction), block.defaultBlockState().setValue(DirectionalBlock.FACING, direction))
world.setBlockAndUpdate(pos.relative(direction), block.defaultBlockState().setValue(DirectionalBlock.FACING, direction).setValue(TypeGemClusterBlock.STAGE, 1))
world.playSound(null, pos, CobblemonSounds.TYPE_GEM_CLUSTER_SOUNDS.placeSound, SoundSource.BLOCKS)
return InteractionResult.SUCCESS
}
@@ -96,8 +96,9 @@ class PokePuffItem : Item(Properties().stacksTo(64)), PokemonSelectingItem {
return InteractionResultHolder.fail(stack)
}
// Feed the Pokémon 4 fullness points
pokemon.feedPokemon(4)
if (!pokemon.feedPokemon(4)) {
return InteractionResultHolder.fail(stack)
}
val friendshipChange = PokePuffUtils.calculateFriendshipChange(stack, pokemon.nature)
@@ -54,14 +54,16 @@ class FriendshipRaisingBerryItem(block: BerryBlock, val stat: Stat) : BerryItem(
val evLowerAmount = max(genericRuntime.resolveInt(CobblemonMechanics.berries.evLowerAmount), 0)
val decreasedEVs = pokemon.evs.add(stat, -evLowerAmount, ItemEvSource(player, stack, pokemon)) != 0
return if (increasedFriendship || decreasedEVs) {
pokemon.feedPokemon(1)
stack.consume(1, player)
InteractionResultHolder.success(stack)
} else {
InteractionResultHolder.pass(stack)
if (!increasedFriendship && !decreasedEVs) {
return InteractionResultHolder.pass(stack)
}
if (!pokemon.feedPokemon(1)) {
return InteractionResultHolder.fail(stack)
}
stack.consume(1, player)
return InteractionResultHolder.success(stack)
}
override fun use(world: Level, user: Player, hand: InteractionHand): InteractionResultHolder<ItemStack> {
@@ -54,7 +54,10 @@ class HealingBerryItem(block: BerryBlock, val amount: () -> ExpressionLike): Ber
return InteractionResultHolder.fail(stack)
}
pokemon.feedPokemon(1)
if (!pokemon.feedPokemon(1)) {
return InteractionResultHolder.fail(stack)
}
pokemon.currentHealth = Integer.min(pokemon.currentHealth + genericRuntime.resolveInt(amount(), pokemon), pokemon.maxHealth)
stack.consume(1, player)
return InteractionResultHolder.success(stack)
@@ -62,7 +65,7 @@ class HealingBerryItem(block: BerryBlock, val amount: () -> ExpressionLike): Ber
override fun applyToBattlePokemon(player: ServerPlayer, stack: ItemStack, battlePokemon: BattlePokemon) {
super.applyToBattlePokemon(player, stack, battlePokemon)
battlePokemon.originalPokemon.feedPokemon(1)
battlePokemon.originalPokemon.feedPokemon(1, playMoodParticle = false)
}
override fun use(world: Level, user: Player, hand: InteractionHand): InteractionResultHolder<ItemStack> {
@@ -48,21 +48,26 @@ class PPRestoringBerryItem(block: BerryBlock, val amount: () -> ExpressionLike):
&& super.canUseOnPokemon(stack, pokemon)
override fun applyToPokemon(player: ServerPlayer, stack: ItemStack, pokemon: Pokemon, move: Move) {
if (canUseOnPokemon(stack, pokemon) && canUseOnMove(stack, move)) {
pokemon.feedPokemon(1)
val moveToRecover = pokemon.moveSet.find { it.template == move.template }
if (moveToRecover != null && moveToRecover.currentPp < moveToRecover.maxPp) {
moveToRecover.currentPp =
min(moveToRecover.maxPp, moveToRecover.currentPp + genericRuntime.resolveInt(amount(), pokemon))
if (!canUseOnPokemon(stack, pokemon) && canUseOnMove(stack, move)) {
return
}
stack.consume(1, player)
}
if (!pokemon.feedPokemon(1)) {
return
}
val moveToRecover = pokemon.moveSet.find { it.template == move.template }
if (moveToRecover != null && moveToRecover.currentPp < moveToRecover.maxPp) {
moveToRecover.currentPp =
min(moveToRecover.maxPp, moveToRecover.currentPp + genericRuntime.resolveInt(amount(), pokemon))
stack.consume(1, player)
}
}
override fun applyToBattlePokemon(player: ServerPlayer, stack: ItemStack, battlePokemon: BattlePokemon, move: Move) {
super.applyToBattlePokemon(player, stack, battlePokemon, move)
battlePokemon.originalPokemon.feedPokemon(1)
battlePokemon.originalPokemon.feedPokemon(1, playMoodParticle = false)
}
override fun use(world: Level, user: Player, hand: InteractionHand): InteractionResultHolder<ItemStack> {
@@ -59,7 +59,9 @@ class PortionHealingBerryItem(block: BerryBlock, val canCauseConfusion: Boolean,
}
// count these berries as multiple feedings due to the amount they heal
pokemon.feedPokemon(5)
if (!pokemon.feedPokemon(5)) {
return InteractionResultHolder.fail(stack)
}
var amount = Integer.min(pokemon.currentHealth + (genericRuntime.resolveFloat(portion(), pokemon) * pokemon.maxHealth).toInt(), pokemon.maxHealth)
CobblemonEvents.POKEMON_HEALED.postThen(PokemonHealedEvent(pokemon, amount, this), { cancelledEvent -> return InteractionResultHolder.fail(stack)}) { event ->
@@ -73,7 +75,7 @@ class PortionHealingBerryItem(block: BerryBlock, val canCauseConfusion: Boolean,
override fun applyToBattlePokemon(player: ServerPlayer, stack: ItemStack, battlePokemon: BattlePokemon) {
super.applyToBattlePokemon(player, stack, battlePokemon)
battlePokemon.originalPokemon.feedPokemon(5)
battlePokemon.originalPokemon.feedPokemon(5, playMoodParticle = false)
}
override fun use(world: Level, user: Player, hand: InteractionHand): InteractionResultHolder<ItemStack> {
@@ -58,19 +58,23 @@ class StatusCuringBerryItem(block: BerryBlock, vararg val status: Status): Berry
stack: ItemStack,
pokemon: Pokemon
): InteractionResultHolder<ItemStack>? {
return if (canUseOnPokemon(stack, pokemon)) {
pokemon.feedPokemon(1)
pokemon.status = null
stack.consume(1, player)
InteractionResultHolder.success(stack)
} else {
InteractionResultHolder.fail(stack)
if (!canUseOnPokemon(stack, pokemon)) {
return InteractionResultHolder.fail(stack)
}
if (!pokemon.feedPokemon(1)) {
return InteractionResultHolder.fail(stack)
}
pokemon.status = null
stack.consume(1, player)
return InteractionResultHolder.success(stack)
}
override fun applyToBattlePokemon(player: ServerPlayer, stack: ItemStack, battlePokemon: BattlePokemon) {
super.applyToBattlePokemon(player, stack, battlePokemon)
battlePokemon.originalPokemon.feedPokemon(1)
battlePokemon.originalPokemon.feedPokemon(1, playMoodParticle = false)
}
override fun use(world: Level, user: Player, hand: InteractionHand): InteractionResultHolder<ItemStack> {
@@ -53,7 +53,10 @@ class BerryJuiceItem : CobblemonItem(Properties()), PokemonSelectingItem, Healin
if (!canUseOnPokemon(stack, pokemon)) {
return InteractionResultHolder.fail(stack)
}
pokemon.feedPokemon(1)
if (!pokemon.feedPokemon(1)) {
return InteractionResultHolder.fail(stack)
}
var amount = Integer.min(pokemon.currentHealth + 20, pokemon.maxHealth)
CobblemonEvents.POKEMON_HEALED.postThen(PokemonHealedEvent(pokemon, amount, this), { cancelledEvent -> return InteractionResultHolder.fail(stack)}) { event ->
@@ -74,7 +77,9 @@ class BerryJuiceItem : CobblemonItem(Properties()), PokemonSelectingItem, Healin
override fun applyToBattlePokemon(player: ServerPlayer, stack: ItemStack, battlePokemon: BattlePokemon) {
super.applyToBattlePokemon(player, stack, battlePokemon)
battlePokemon.originalPokemon.feedPokemon(1)
battlePokemon.originalPokemon.feedPokemon(1, playMoodParticle = false)
if (!player.hasInfiniteMaterials()) {
val woodenBowlItemStack = ItemStack(Items.BOWL)
if (!player.inventory.add(woodenBowlItemStack)) {
@@ -33,7 +33,9 @@ class FreshStartMochiItem : CobblemonItem(Properties()), PokemonSelectingItem {
return InteractionResultHolder.fail(stack)
}
pokemon.feedPokemon(1)
if (!pokemon.feedPokemon(1)) {
return InteractionResultHolder.fail(stack)
}
pokemon.evs.forEach {
pokemon.setEV(it.key, 0)
@@ -24,7 +24,9 @@ class MochiItem(stat: Stats): EVIncreaseItem(stat, 4) {
return InteractionResultHolder.fail(stack)
}
pokemon.feedPokemon(1)
if (!pokemon.feedPokemon(1)) {
return InteractionResultHolder.fail(stack)
}
return super.applyToPokemon(player, stack, pokemon)
}
@@ -40,7 +40,7 @@ class SinisterTeaItem : Item(
val holder = inst.effect
val effect = holder.value()
if (effect.isInstantenous) {
if (effect.isInstantenous && (inst.duration <= 1)) {
effect.applyInstantenousEffect(user as? Player, null, user, inst.amplifier, 1.0)
} else {
user.addEffect(inst)
@@ -36,7 +36,7 @@ import net.minecraft.world.level.block.Block
class StatusCureItem(val itemName: String, vararg val status: Status, block: Block) : ItemNameBlockItem(block, Properties()), PokemonSelectingItem {
override val bagItem = object : BagItem {
override val itemName = this@StatusCureItem.itemName
override val returnItem = Items.AIR
override val returnItem = Items.GLASS_BOTTLE
override fun canUse(stack: ItemStack, battle: PokemonBattle, target: BattlePokemon) = canUseOnPokemon(stack, target.effectedPokemon)
override fun getShowdownInput(actor: BattleActor, battlePokemon: BattlePokemon, data: String?) = "cure_status${status.takeIf { it.isNotEmpty() }?.let { " ${it.joinToString(separator = " ") { it.showdownName } }" } ?: "" }"
}
@@ -64,6 +64,7 @@ class SpawnPokemonPacket(
var rideStamina: Float,
var isAlpha: Boolean,
var silent: Boolean,
var riders: List<Int>,
vanillaSpawnPacket: ClientboundAddEntityPacket,
) : SpawnExtraDataEntityPacket<SpawnPokemonPacket, PokemonEntity>(vanillaSpawnPacket) {
@@ -98,6 +99,7 @@ class SpawnPokemonPacket(
entity.entityData.get(PokemonEntity.RIDE_STAMINA),
entity.entityData.get(PokemonEntity.IS_ALPHA),
entity.isSilent,
entity.occupiedSeats.map { entry -> entry.value.id }.toList(),
vanillaSpawnPacket
)
@@ -134,6 +136,7 @@ class SpawnPokemonPacket(
buffer.writeFloat(rideStamina)
buffer.writeBoolean(isAlpha)
buffer.writeBoolean(silent)
buffer.writeCollection(this.riders) { pb, value -> pb.writeInt(value) }
}
override fun applyData(entity: PokemonEntity, level: ClientLevel) {
@@ -184,6 +187,10 @@ class SpawnPokemonPacket(
entity.tickSpawned = this.tickSpawned
entity.delegate.updateAge(this.tickSpawned)
if (this.riders.isNotEmpty()) {
this.riders.forEach { level.getEntity(it)?.startRiding(entity) }
}
}
override fun checkType(entity: Entity): Boolean = entity is PokemonEntity
@@ -222,6 +229,7 @@ class SpawnPokemonPacket(
val rideStamina = buffer.readFloat()
val isAlpha = buffer.readBoolean()
val silent = buffer.readBoolean()
val riders = buffer.readList { it.readInt() }.toList()
val vanillaPacket = decodeVanillaPacket(buffer)
return SpawnPokemonPacket(
@@ -253,6 +261,7 @@ class SpawnPokemonPacket(
rideStamina,
isAlpha,
silent,
riders,
vanillaPacket
)
}
@@ -0,0 +1,33 @@
/*
* 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.net.messages.client.ui
import com.cobblemon.mod.common.api.net.NetworkPacket
import com.cobblemon.mod.common.api.tms.TechnicalMachine
import com.cobblemon.mod.common.api.tms.TechnicalMachines
import com.cobblemon.mod.common.util.cobblemonResource
import net.minecraft.network.RegistryFriendlyByteBuf
class SynchronizeActiveTMPacket(val tm: TechnicalMachine?): NetworkPacket<SynchronizeActiveTMPacket> {
override val id = ID
override fun encode(buffer: RegistryFriendlyByteBuf) {
buffer.writeNullable(tm?.id) { pb, value -> pb.writeResourceLocation(value) }
}
companion object {
val ID = cobblemonResource("synchronize_active_tm")
fun decode(buffer: RegistryFriendlyByteBuf): SynchronizeActiveTMPacket {
val resourceLocation = buffer.readNullable { it.readResourceLocation() }
if (resourceLocation == null) return SynchronizeActiveTMPacket(null)
val tm = TechnicalMachines.tmMap[resourceLocation]
return SynchronizeActiveTMPacket(tm)
}
}
}
@@ -327,7 +327,6 @@ open class Pokemon : ShowdownIdentifiable {
if (experienceGroup.getLevel(experience) != boundedValue || value == Cobblemon.config.maxPokemonLevel) {
experience = experienceGroup.getExperience(boundedValue)
}
// _level.emit(value)
currentHealth = ceil(hpRatio * maxHealth).coerceIn(0..maxHealth)
}
@@ -986,6 +985,10 @@ open class Pokemon : ShowdownIdentifiable {
this.recall()
}
fun playMoodParticle(particleName: String) {
entity?.playMoodParticle(particleName)
}
fun heal() {
CobblemonEvents.POKEMON_HEALED.postThen(PokemonHealedEvent(this)) { event ->
this.currentHealth = maxHealth
@@ -1057,23 +1060,13 @@ open class Pokemon : ShowdownIdentifiable {
else -> 0 // For weights less than 0.1
}
fun feedPokemon(feedCount: Int, playSound: Boolean = true) {
// play sounds from the entity first (itemstack is consumed outside of this function)
if (this.entity != null && playSound) {
val fullnessPercent = ((this.currentFullness).toFloat() / (this.getMaxFullness()).toFloat()) * (.5f)
if (this.currentFullness >= this.getMaxFullness()) {
this.entity?.playSound(CobblemonSounds.BERRY_EAT_FULL, 1F, 1F)
}
else {
this.entity?.playSound(CobblemonSounds.BERRY_EAT, 1F, 1F + fullnessPercent)
}
}
fun feedPokemon(feedCount: Int, playSound: Boolean = true, playMoodParticle: Boolean = true): Boolean {
playFullnessEffects(playSound, playMoodParticle)
// if it is already full we don't need to do anything
// TODO this can happen when feeding in battle since we are temporarily ignoring fullness checks for pp/hp/status berries
if (isFull()) {
return
return false
}
this.currentFullness = (this.currentFullness + feedCount).coerceIn(0, this.getMaxFullness())
@@ -1082,6 +1075,31 @@ open class Pokemon : ShowdownIdentifiable {
if (this.currentFullness == 1) {
this.resetMetabolismCycle()
}
return true
}
private fun playFullnessEffects(playSound: Boolean = true, playMoodParticle: Boolean = true) {
if (!playSound && !playMoodParticle) return
val pokemonEntity = entity ?: return
val fullnessPercent = ((this.currentFullness).toFloat() / (this.getMaxFullness()).toFloat()) * (.5f)
if (!isFull()) {
if (playSound) {
pokemonEntity.playSound(CobblemonSounds.BERRY_EAT, 1F, 1F + fullnessPercent)
}
return
}
if (playSound) {
pokemonEntity.playSound(CobblemonSounds.BERRY_EAT_FULL, 1F, 1F)
if (playMoodParticle) {
pokemonEntity.playMoodParticle("mood_annoyed")
}
}
}
// decrease a pokemon's Fullness value by a certain amount
@@ -0,0 +1,34 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.pokemon.properties
import com.cobblemon.mod.common.api.properties.CustomPokemonPropertyType
object HeldItemVisibleProperty : CustomPokemonPropertyType<BooleanProperty> {
override val keys = setOf("held_item_visible")
override val needsKey = true
override fun fromString(value: String?) =
when {
value == null || value.lowercase() in listOf("true", "yes") -> heldItemVisible(true)
value.lowercase() in listOf("false", "no") -> heldItemVisible(false)
else -> null
}
fun heldItemVisible(value: Boolean) = BooleanProperty(
key = keys.first(),
value = value,
pokemonApplicator = { pokemon, _ -> pokemon.heldItemVisible = value },
entityApplicator = { pokemonEntity, _ -> pokemonEntity.pokemon.heldItemVisible = value },
pokemonMatcher = { pokemon, _ -> pokemon.heldItemVisible == value },
entityMatcher = { pokemonEntity, _ -> pokemonEntity.pokemon.heldItemVisible == value }
)
override fun examples() = setOf("yes", "no")
}
@@ -0,0 +1,36 @@
/*
* 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.tms.obtain
import com.cobblemon.mod.common.api.tms.ObtainMethod
import com.cobblemon.mod.common.util.cobblemonResource
import net.minecraft.network.RegistryFriendlyByteBuf
import net.minecraft.server.level.ServerPlayer
/**
* An [ObtainMethod] for TMs that cannot be unlocked through gameplay triggers.
* These TMs are intended to be granted manually by command or MoLang only.
*/
class ImpossibleObtainMethod : ObtainMethod {
override val passive = false
companion object {
val ID = cobblemonResource("impossible")
fun readFromBuffer(buffer: RegistryFriendlyByteBuf): ImpossibleObtainMethod {
return ImpossibleObtainMethod()
}
}
override fun matches(player: ServerPlayer) = false
override fun writeToBuffer(buffer: RegistryFriendlyByteBuf) {
buffer.writeUtf("cobblemon:impossible")
}
}
@@ -11,6 +11,7 @@ package com.cobblemon.mod.common.util.adapters
import com.cobblemon.mod.common.Cobblemon
import com.cobblemon.mod.common.api.tms.ObtainMethod
import com.cobblemon.mod.common.tms.obtain.DefaultObtainMethod
import com.cobblemon.mod.common.tms.obtain.ImpossibleObtainMethod
import com.cobblemon.mod.common.tms.obtain.PlayerHasAdvancementObtainMethod
import com.cobblemon.mod.common.tms.obtain.PlayerYObtainMethod
import com.cobblemon.mod.common.tms.obtain.UnlockableObtainMethod
@@ -29,6 +30,7 @@ object TMObtainMethodAdapter : JsonSerializer<ObtainMethod>, JsonDeserializer<Ob
init {
this.register(UnlockableObtainMethod::class, UnlockableObtainMethod.ID)
this.register(ImpossibleObtainMethod::class, ImpossibleObtainMethod.ID)
this.register(PlayerHasAdvancementObtainMethod::class, PlayerHasAdvancementObtainMethod.ID)
this.register(DefaultObtainMethod::class, DefaultObtainMethod.ID)
this.register(PlayerYObtainMethod::class, PlayerYObtainMethod.ID)
@@ -15,114 +15,411 @@
"name": "substitute",
"pivot": [0, 0, 0]
},
{
"name": "locator_root",
"parent": "substitute",
"pivot": [0, 0, 0],
"locators": {
"root": [0, 0, 0]
}
},
{
"name": "locator_top",
"parent": "substitute",
"pivot": [0, 16.5, 0],
"locators": {
"top": [0, 16.5, 0]
}
},
{
"name": "body",
"parent": "substitute",
"pivot": [0, 0, 0]
"pivot": [0, 8, 0]
},
{
"name": "locator_middle",
"parent": "body",
"pivot": [0, 8, 0],
"locators": {
"middle": [0, 8, 0]
}
},
{
"name": "locator_target",
"parent": "body",
"pivot": [0, 8.5, -8],
"locators": {
"target": [0, 8.5, -8]
}
},
{
"name": "locator_physical",
"parent": "body",
"pivot": [0, 9, -7.25],
"locators": {
"physical": [0, 9, -7.25]
}
},
{
"name": "locator_special",
"parent": "body",
"pivot": [0, 9, -7.25],
"locators": {
"special": [0, 9, -7.25]
}
},
{
"name": "torso",
"parent": "body",
"pivot": [0, 2, -1.75],
"pivot": [0, 2.5, -0.75],
"cubes": [
{"origin": [-4.5, 0, -4], "size": [9, 8, 7], "inflate": 0.01, "uv": [0, 15]},
{"origin": [0, 5.5, 2.5], "size": [0, 3, 3], "uv": [0, 0]}
{"origin": [-4.5, 0, -5], "size": [9, 8, 9], "inflate": 0.01, "uv": [0, 0]},
{"origin": [0, 4.5, 4], "size": [0, 3, 2], "uv": [6, 58]}
]
},
{
"name": "locator_seat_1",
"parent": "torso",
"pivot": [0, 10.75, 6.5],
"locators": {
"seat_1": [0, 10.75, 6.5]
}
},
{
"name": "locator_neck_fluff",
"parent": "torso",
"pivot": [0, 8.25, -0.5],
"locators": {
"neck_fluff": [0, 8.25, -0.5]
}
},
{
"name": "stuffing_shoulder_left",
"parent": "torso",
"pivot": [4.35, 6, -3.5],
"cubes": [
{"origin": [4.3, 5, -4.5], "size": [0, 2, 2], "uv": [60, 33]},
{"origin": [4.4, 5.5, -4], "size": [0, 1, 1], "uv": [62, 40]}
]
},
{
"name": "stuffing_shoulder_right",
"parent": "torso",
"pivot": [-4.35, 6, -3.5],
"cubes": [
{"origin": [-4.3, 5, -4.5], "size": [0, 2, 2], "uv": [55, 33]},
{"origin": [-4.4, 5.5, -4], "size": [0, 1, 1], "uv": [59, 40]}
]
},
{
"name": "stuffing_neck",
"parent": "torso",
"pivot": [0, 7.7, -0.5],
"cubes": [
{"origin": [-3.5, 7.71, -4], "size": [7, 0, 7], "inflate": 0.01, "uv": [43, 27]},
{"origin": [-2.5, 7.96, -3], "size": [5, 0, 5], "uv": [49, 21]}
]
},
{
"name": "locator_item",
"parent": "torso",
"pivot": [0.05, 3.5, -5],
"rotation": [90, 0, 0],
"locators": {
"item": [0, 3.5, -5]
}
},
{
"name": "head",
"parent": "torso",
"pivot": [0, 8, -4],
"pivot": [0, 8, 0]
},
{
"name": "head_ai",
"parent": "head",
"pivot": [0, 8, 0]
},
{
"name": "head_angle",
"parent": "head_ai",
"pivot": [0, 8, 0],
"cubes": [
{"origin": [-4.5, 8, -5], "size": [9, 7, 8], "uv": [0, 0]},
{"origin": [0, 9.5, 2.5], "size": [0, 3, 3], "uv": [0, 12]}
{"origin": [-4, 7.5, -7], "size": [8, 7, 10], "uv": [0, 17]},
{"origin": [-0.5, 7.5, -7], "size": [1, 7, 10], "inflate": 0.01, "uv": [0, 34]},
{"origin": [0, 8, 3], "size": [0, 3, 2], "uv": [1, 58]}
]
},
{
"name": "eye_right",
"parent": "head",
"pivot": [-4.5, 12.5, -3.25],
"name": "locator_face",
"parent": "head_angle",
"pivot": [0, 10.5, -7],
"locators": {
"face": [0, 10.5, -7]
}
},
{
"name": "locator_head",
"parent": "head_angle",
"pivot": [0, 14.5, -5.5],
"locators": {
"head": [0, 14.5, -5.5]
}
},
{
"name": "locator_item_face",
"parent": "head_angle",
"pivot": [0, 13.7, -6.9],
"locators": {
"item_face": [0, 13.7, -6.9]
}
},
{
"name": "locator_item_hat",
"parent": "head_angle",
"pivot": [0, 15.75, -2],
"locators": {
"item_hat": [0, 15.75, -2]
}
},
{
"name": "face_ditto",
"parent": "head_angle",
"pivot": [0, 10.25, -6.9]
},
{
"name": "eyes_ditto",
"parent": "face_ditto",
"pivot": [0, 11, -6.92],
"cubes": [
{"origin": [-4.5, 11.5, -4.75], "size": [0, 2, 3], "inflate": 0.01, "pivot": [-4.5, 12.5, -3.25], "rotation": [5, 0, 0], "uv": [0, 37], "mirror": true}
{"origin": [-3.5, 10.5, -6.92], "size": [7, 1, 0], "uv": [26, 52]}
]
},
{
"name": "eyes_blink_ditto",
"parent": "face_ditto",
"pivot": [0, 11, -6.82],
"cubes": [
{"origin": [-4, 10.5, -6.82], "size": [8, 1, 0], "uv": [25, 54]},
{"origin": [-3.5, 11, -6.83], "size": [7, 1, 0], "uv": [26, 56]}
]
},
{
"name": "mouth_ditto",
"parent": "face_ditto",
"pivot": [0, 9.25, -6.9],
"cubes": [
{"origin": [-3, 8.5, -6.92], "size": [6, 1, 0], "uv": [27, 60]},
{"origin": [-4, 9, -6.92], "size": [8, 1, 0], "uv": [25, 58]}
]
},
{
"name": "mouth_open_ditto",
"parent": "face_ditto",
"pivot": [0, 9, -6.81],
"cubes": [
{"origin": [-4, 8, -6.82], "size": [8, 2, 0], "uv": [25, 62]}
]
},
{
"name": "face",
"parent": "head_angle",
"pivot": [0, 10.5, -4.51]
},
{
"name": "mouth",
"parent": "face",
"pivot": [0, 9.5, -7.01],
"cubes": [
{"origin": [-4, 8.5, -7.01], "size": [8, 2, 2], "inflate": 0.01, "uv": [23, 47]}
]
},
{
"name": "eyes",
"parent": "face",
"pivot": [0, 12, -3.75]
},
{
"name": "eye_left",
"parent": "head",
"pivot": [4.5, 12.5, -3.25],
"parent": "eyes",
"pivot": [4, 12, -3.75],
"cubes": [
{"origin": [4.5, 11.5, -4.75], "size": [0, 2, 3], "inflate": 0.01, "pivot": [4.5, 12.5, -3.25], "rotation": [5, 0, 0], "uv": [0, 37]}
{"origin": [3, 10.5, -6], "size": [1, 2, 4], "inflate": 0.01, "uv": [12, 52]}
]
},
{
"name": "locator_eye_left",
"parent": "eye_left",
"pivot": [4, 11.5, -4],
"rotation": [0, -90, 0],
"locators": {
"eye2": [4, 11.5, -4]
}
},
{
"name": "eye_right",
"parent": "eyes",
"pivot": [-4, 12, -3.75],
"cubes": [
{"origin": [-4, 10.5, -6], "size": [1, 2, 4], "inflate": 0.01, "uv": [1, 52]}
]
},
{
"name": "locator_eye_right",
"parent": "eye_right",
"pivot": [-4, 11.5, -4],
"rotation": [0, 90, 0],
"locators": {
"eye1": [-4, 11.5, -4]
}
},
{
"name": "ears",
"parent": "head_angle",
"pivot": [0, 14, -0.1]
},
{
"name": "ear_left",
"parent": "ears",
"pivot": [1.5, 14.5, -0.5],
"rotation": [0, -25, 0],
"cubes": [
{"origin": [1, 14.5, -0.5], "size": [3, 2, 0], "uv": [11, 61]}
]
},
{
"name": "ear_right",
"parent": "head",
"pivot": [-3.25, 14.5, 0],
"rotation": [-10, 15, -20],
"parent": "ears",
"pivot": [-1.5, 14.5, -0.5],
"rotation": [0, 25, 0],
"cubes": [
{"origin": [-4.75, 14.5, 0], "size": [3, 3, 0], "uv": [0, 18]}
{"origin": [-4, 14.5, -0.5], "size": [3, 2, 0], "uv": [18, 61]}
]
},
{
"name": "ear_left",
"parent": "head",
"pivot": [3.25, 14.5, 0],
"rotation": [-10, -15, 20],
"cubes": [
{"origin": [1.75, 14.5, 0], "size": [3, 3, 0], "uv": [0, 0]}
]
},
{
"name": "arm_right",
"name": "arms",
"parent": "torso",
"pivot": [-3.25, 6.25, -3],
"rotation": [-5, 15, 0],
"cubes": [
{"origin": [-4.75, 4.75, -6.5], "size": [3, 3, 4], "uv": [26, 0]}
]
"pivot": [0, 6, -2.5]
},
{
"name": "arm_left",
"parent": "torso",
"pivot": [3.25, 6.25, -3],
"rotation": [-5, -15, 0],
"parent": "arms",
"pivot": [3.5, 6, -2.5],
"cubes": [
{"origin": [1.75, 4.75, -6.5], "size": [3, 3, 4], "uv": [16, 30]}
{"origin": [3.5, 4.5, -6], "size": [2, 3, 4], "uv": [36, 27]}
]
},
{
"name": "stuffing_arm_left",
"parent": "arm_left",
"pivot": [3.6925, 6, -3.5],
"cubes": [
{"origin": [3.735, 5, -4.5], "size": [0, 2, 2], "uv": [60, 36]},
{"origin": [3.65, 5.5, -4], "size": [0, 1, 1], "uv": [62, 42]}
]
},
{
"name": "locator_hand_secondary",
"parent": "arm_left",
"pivot": [0.5, 6, -6],
"locators": {
"hand_secondary": [0.5, 6, -6]
}
},
{
"name": "arm_right",
"parent": "arms",
"pivot": [-4.5, 6, -2.5],
"cubes": [
{"origin": [-5.5, 4.5, -6], "size": [2, 3, 4], "uv": [42, 34]}
]
},
{
"name": "stuffing_arm_right",
"parent": "arm_right",
"pivot": [-4.6925, 6, -3.5],
"cubes": [
{"origin": [-3.735, 5, -4.5], "size": [0, 2, 2], "uv": [55, 36]},
{"origin": [-3.65, 5.5, -4], "size": [0, 1, 1], "uv": [59, 42]}
]
},
{
"name": "locator_hand_primary",
"parent": "arm_right",
"pivot": [-3.5, 6, -6],
"locators": {
"hand_primary": [-3.5, 6, -6]
}
},
{
"name": "tail",
"parent": "torso",
"pivot": [0, 2.25, 3],
"pivot": [0, 2.25, 3.5],
"cubes": [
{"origin": [-2, 0.25, 2], "size": [4, 4, 5], "uv": [27, 25]}
{"origin": [-2.5, 0.25, 3], "size": [5, 4, 5], "uv": [36, 11]}
]
},
{
"name": "locator_tail",
"parent": "tail",
"pivot": [0, 2.25, 6.5],
"rotation": [180, 0, 0],
"locators": {
"tail": [0, 2.25, 6.5]
}
},
{
"name": "tail2",
"parent": "tail",
"pivot": [0, 0.25, 7],
"pivot": [0, 2, 8],
"cubes": [
{"origin": [-1.5, 0.25, 7], "size": [3, 3, 3], "uv": [32, 19]}
{"origin": [-1.5, 0.5, 7.5], "size": [3, 3, 4], "uv": [36, 20]}
]
},
{
"name": "leg_right",
"name": "locator_tail_tip",
"parent": "tail2",
"pivot": [0, 2, 11.5],
"rotation": [180, 0, 0],
"locators": {
"tail_tip": [0, 2, 11.5]
}
},
{
"name": "legs",
"parent": "body",
"pivot": [-3.5, 2, -1.75],
"rotation": [0, 15, 0],
"cubes": [
{"origin": [-5, 0, -6.25], "size": [3, 4, 5], "uv": [29, 10]}
]
"pivot": [0, 2.5, -0.75]
},
{
"name": "leg_left",
"parent": "body",
"pivot": [3.5, 2, -1.75],
"rotation": [0, -15, 0],
"parent": "legs",
"pivot": [5, 2.5, -0.75],
"cubes": [
{"origin": [2, 0, -6.25], "size": [3, 4, 5], "uv": [0, 30]}
{"origin": [3.5, 0.5, -7.25], "size": [3, 4, 7], "uv": [22, 34]}
]
},
{
"name": "locator_foot_secondary",
"parent": "leg_left",
"pivot": [5, 2.5, -6.75],
"locators": {
"foot_secondary": [5, 2.5, -6.75]
}
},
{
"name": "leg_right",
"parent": "legs",
"pivot": [-5, 2.5, -0.75],
"cubes": [
{"origin": [-6.5, 0.5, -7.25], "size": [3, 4, 7], "uv": [36, 0]}
]
},
{
"name": "locator_foot_primary",
"parent": "leg_right",
"pivot": [-5, 2.5, -6.75],
"locators": {
"foot_primary": [-5, 2.5, -6.75]
}
}
]
}
@@ -1,10 +1,33 @@
{
"portraitScale": 1.8,
"portraitTranslation": [-0.11, -0.36, 0],
"profileScale": 1.0,
"profileTranslation": [0.0, 0.18, 0.0],
"rootBone": "substitute",
"animations": {
"faint": "q.bedrock_primary('substitute', math.random(0, 1) < (1/3) ? 'destroy_flop' : (math.random(0, 1) < 0.5 ? 'destroy_fling_left' : 'destroy_fling_right'), q.curve('one'))",
"recoil": "q.bedrock_stateful('substitute', 'recoil')"
},
"poses": {
"battle-standing": {
"poseTypes": ["STAND"],
"isBattle": true,
"animations": [
"q.bedrock('substitute', 'ground_idle')"
]
},
"standing": {
"poseName": "standing",
"transformTicks": 10,
"allPoseTypes": true,
"animations": []
"poseTypes": ["STAND", "NONE", "PORTRAIT", "PROFILE"],
"isBattle": false,
"animations": [
"q.bedrock('substitute', 'ground_idle')"
]
},
"walking": {
"poseTypes": ["WALK"],
"animations": [
"q.bedrock('substitute', 'ground_idle')"
]
}
}
}
@@ -12,6 +12,16 @@
{
"aspects": ["shiny"],
"texture": "cobblemon:textures/pokemon/substitute_shiny.png"
},
{
"aspects": ["alpha_eyes"],
"layers": [
{
"name": "alpha_eyes",
"texture": "cobblemon:textures/pokemon/substitute_alpha.png",
"emissive": true
}
]
}
]
}
@@ -0,0 +1,43 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:mood_anger_steam",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/mood/steam_center_double"
}
},
"components": {
"minecraft:emitter_rate_instant": {
"num_particles": 1
},
"minecraft:emitter_lifetime_once": {
"active_time": 1
},
"minecraft:emitter_shape_point": {
"offset": [0, "math.clamp((v.entity_radius*1.2),0.48,0.96)*0.75", 0]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 1
},
"minecraft:particle_initial_speed": 0,
"minecraft:particle_motion_dynamic": {},
"minecraft:particle_appearance_billboard": {
"size": ["math.clamp((v.entity_radius*1.5),0.9,2.4)", "math.clamp((v.entity_radius*0.5),0.3,0.8)"],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 48,
"texture_height": 176,
"flipbook": {
"base_UV": [0, 0],
"size_UV": [48, 16],
"step_UV": [0, 16],
"max_frame": 11,
"stretch_to_lifetime": true
}
}
}
}
}
}
@@ -0,0 +1,64 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:mood_anger_veins",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/mood/vein_red"
}
},
"components": {
"minecraft:emitter_initialization": {
"creation_expression": "v.particle_size = math.clamp((v.entity_radius*0.75),0.15,0.4);"
},
"minecraft:emitter_rate_instant": {
"num_particles": 1
},
"minecraft:emitter_lifetime_once": {
"active_time": 1
},
"minecraft:emitter_shape_point": {
"direction": ["math.random(-1,1)", 1.5, "math.random(-1,1)"]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 1.25
},
"minecraft:particle_initial_spin": {
"rotation": "math.random_integer(-1,2)*90"
},
"minecraft:particle_initial_speed": "v.particle_size*13",
"minecraft:particle_motion_dynamic": {
"linear_acceleration": [0, 0.75, 0],
"linear_drag_coefficient": "v.particle_size*15"
},
"minecraft:particle_appearance_billboard": {
"size": ["math.clamp((v.entity_radius*0.75),0.15,0.3)", "math.clamp((v.entity_radius*0.75),0.15,0.3)"],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 22,
"texture_height": 11,
"flipbook": {
"base_UV": [0, 0],
"size_UV": [11, 11],
"step_UV": [11, 0],
"frames_per_second": 6,
"max_frame": 2,
"loop": true
}
}
},
"minecraft:particle_motion_collision": {},
"minecraft:particle_appearance_lighting": {},
"minecraft:particle_appearance_tinting": {
"color": {
"interpolant": "v.particle_age/v.particle_lifetime",
"gradient": {
"0.86": "#ffffffff",
"1.0": "#FF000000"
}
}
}
}
}
}
@@ -0,0 +1,49 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:mood_annoyed",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/mood/scribble_purple"
}
},
"components": {
"minecraft:emitter_initialization": {
"creation_expression": "v.particle_size = math.clamp((v.entity_radius*0.75),0.2,0.5);"
},
"minecraft:emitter_rate_instant": {
"num_particles": 1
},
"minecraft:emitter_lifetime_once": {
"active_time": 2
},
"minecraft:emitter_shape_point": {
"direction": [0, 1, 0]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 1
},
"minecraft:particle_initial_speed": "v.particle_size*10",
"minecraft:particle_motion_dynamic": {
"linear_drag_coefficient": 3
},
"minecraft:particle_appearance_billboard": {
"size": ["math.clamp((v.entity_radius*0.75),0.2,0.5)", "math.clamp((v.entity_radius*0.75),0.2,0.5)"],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 168,
"texture_height": 14,
"flipbook": {
"base_UV": [0, 0],
"size_UV": [14, 14],
"step_UV": [14, 0],
"frames_per_second": 10,
"max_frame": 12
}
}
},
"minecraft:particle_appearance_lighting": {}
}
}
}
@@ -0,0 +1,47 @@
{
"format_version": "1.10.0",
"particle_effect": {
"description": {
"identifier": "cobblemon:mood_stress",
"basic_render_parameters": {
"material": "particles_alpha",
"texture": "textures/particles/mood/sweat_blue"
}
},
"components": {
"minecraft:emitter_initialization": {
"creation_expression": "v.particle_height = math.clamp((v.entity_radius*1.2),0.48,0.96);"
},
"minecraft:emitter_rate_instant": {
"num_particles": 1
},
"minecraft:emitter_lifetime_looping": {
"active_time": 1
},
"minecraft:emitter_shape_point": {
"offset": [0, "math.clamp((v.entity_radius*1.2),0.48,0.96)*0.75", 0]
},
"minecraft:particle_lifetime_expression": {
"max_lifetime": 0.45
},
"minecraft:particle_initial_speed": 0,
"minecraft:particle_motion_dynamic": {},
"minecraft:particle_appearance_billboard": {
"size": ["math.clamp((v.entity_radius*1.2),0.48,0.96)", "math.clamp((v.entity_radius*0.65),0.26,0.52)"],
"facing_camera_mode": "rotate_xyz",
"uv": {
"texture_width": 216,
"texture_height": 13,
"flipbook": {
"base_UV": [0, 0],
"size_UV": [24, 13],
"step_UV": [24, 0],
"max_frame": 9,
"stretch_to_lifetime": true
}
}
},
"minecraft:particle_appearance_lighting": {}
}
}
}
@@ -5,19 +5,8 @@
"loop": true,
"bones": {
"body": {
"rotation": [
"math.clamp(math.sin(q.anim_time*90*2)*1,-1,0)+math.clamp(math.sin(q.anim_time*90*2)*1,0,1)+math.sin(q.anim_time*90*2)*0.5",
0,
"math.clamp(math.sin(q.anim_time*90*4)*0.5,-1,0)+math.clamp(math.sin(q.anim_time*90*4)*0.5,0,1)+math.sin(q.anim_time*90*4)*0.1"
],
"position": [
0,
"(-math.clamp(math.sin(q.anim_time*90*2)*0.2,-0.1,0)-math.clamp(math.sin(q.anim_time*90*2)*0.2,0,0.1)-math.sin(q.anim_time*90*2)*0.2)*0.1",
0
]
},
"tail": {
"rotation": ["-math.clamp(math.sin(q.anim_time*90*2)*0.5,-0.8,0)-math.clamp(math.sin(q.anim_time*90*2)*0.5,0,0.8)-math.sin(q.anim_time*90*2)*0.5", 0, 0]
"rotation": ["-math.sin(q.anim_time*90*2)*1", 0, "math.sin(q.anim_time*90*2-90)*0.5"],
"position": ["-math.sin(q.anim_time*90*2-90)*-0.1", 0.5, "math.sin(q.anim_time*90*2)*0.2"]
}
}
},
@@ -25,71 +14,226 @@
"loop": true,
"bones": {
"body": {
"rotation": [
"math.clamp(math.sin(q.anim_time*90*1)*1,-1,0)+math.clamp(math.sin(q.anim_time*90*1)*1,0,1)+math.sin(q.anim_time*90*1)*0.5",
0,
"math.clamp(math.sin(q.anim_time*90*2)*0.5,-1,0)+math.clamp(math.sin(q.anim_time*90*2)*0.5,0,1)+math.sin(q.anim_time*90*2)*0.1"
],
"position": [
0,
"(-math.clamp(math.sin(q.anim_time*90*1)*0.2,-0.1,0)-math.clamp(math.sin(q.anim_time*90*1)*0.2,0,0.1)-math.sin(q.anim_time*90*2)*0.2)*0.1",
0
]
},
"tail": {
"rotation": ["-math.clamp(math.sin(q.anim_time*90*2)*0.5,-0.8,0)-math.clamp(math.sin(q.anim_time*90*2)*0.5,0,0.8)-math.sin(q.anim_time*90*2)*0.5", 0, 0]
"rotation": ["-math.sin(q.anim_time*90*1-90)*1", 0, "math.sin(q.anim_time*90*1)*0.5"],
"position": ["-math.sin(q.anim_time*90*1)*-0.1", 0.5, "math.sin(q.anim_time*90*1-90)*0.2"]
}
}
},
"animation.kakuna.physical": {
"animation_length": 3,
"bones": {
"body": {
"rotation": {
"0.0": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"0.5": {
"post": ["-math.sin(q.anim_time*90*3)*-20", 0, "math.cos(q.anim_time*90*3)*-20"],
"lerp_mode": "catmullrom"
},
"0.7917": {
"post": ["-math.sin(q.anim_time*90*3)*-20", 0, "math.cos(q.anim_time*90*3)*-20"],
"lerp_mode": "catmullrom"
},
"1.0417": {
"post": [-16.62939, 7, -11.1114],
"lerp_mode": "catmullrom"
},
"1.1667": {
"post": [0, 30, -32.5],
"lerp_mode": "catmullrom"
},
"1.2083": {
"post": [43.5061, 41.7947, 7.1679],
"lerp_mode": "catmullrom"
},
"1.25": {
"post": [43.47759, 0, 7.65367],
"lerp_mode": "catmullrom"
},
"1.5417": {
"post": [36.1795, -24.8022, 10.1779],
"lerp_mode": "catmullrom"
},
"1.8333": {
"post": [8.1692, -24.4369, 32.0742],
"lerp_mode": "catmullrom"
},
"2.5833": {
"post": ["-math.cos(q.anim_time*90*2)*20", 0, "math.sin(q.anim_time*90*2)*-20"],
"lerp_mode": "catmullrom"
},
"3.0": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
}
},
"position": {
"0.0": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"0.5": {
"post": ["-math.cos(q.anim_time*90*3)*2.6", "math.sin(q.anim_time*90*3)*0.2", "math.sin(q.anim_time*90*3)*-2.6"],
"lerp_mode": "catmullrom"
},
"0.7917": {
"post": ["-math.cos(q.anim_time*90*3)*2.6", "math.sin(q.anim_time*90*3)*0.2", "math.sin(q.anim_time*90*3)*-2.6"],
"lerp_mode": "catmullrom"
},
"1.0417": {
"post": [-1.44448, -0.16629, 2.16182],
"lerp_mode": "catmullrom"
},
"1.1667": {
"post": [-3.6, 0, 0],
"lerp_mode": "catmullrom"
},
"1.2083": {
"post": [-2.31, 0.1, -3.81],
"lerp_mode": "catmullrom"
},
"1.25": {
"post": [0.99498, 0.18478, -5.40209],
"lerp_mode": "catmullrom"
},
"1.5417": {
"post": [2.22, 0.2, -4.24],
"lerp_mode": "catmullrom"
},
"1.8333": {
"post": [3.11, -0.5, -0.9],
"lerp_mode": "catmullrom"
},
"2.5833": {
"post": ["-math.sin(q.anim_time*90*2)*2.6", "math.cos(q.anim_time*90*2)*-0.2", "math.cos(q.anim_time*90*2)*2.6"],
"lerp_mode": "catmullrom"
},
"3.0": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
}
},
"scale": {
"1.125": [1, 1, 1],
"1.2083": [1.2, 1.1, 0.8],
"1.25": [1, 1, 1]
}
}
}
},
"animation.kakuna.faint": {
"animation_length": 3,
"bones": {
"kakuna": {
"body": {
"rotation": {
"0.0": [0, 0, 0],
"0.125": [5, 0, 0],
"0.2917": [7.5, 0, 0],
"0.75": [0, 0, 0],
"1.0417": [-10.17, 0, 0],
"1.1667": [-26.43, 0, 0],
"1.25": [-52.86, 0, 0],
"1.3333": [-72.68, 0, 0],
"1.4167": [-92.5, 0, 0],
"1.5417": [-97.5, 0, 0],
"1.6667": [-100, 0, 0],
"1.75": [-100, 0, 0],
"2.0833": [-88.46, 0, 0],
"2.2917": [-70, 0, 0],
"2.3333": [-72.64, 0, 0],
"2.375": [-70, 0, 0]
"0.0": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"0.5": {
"post": ["-math.sin(q.anim_time*90*2)*-20", 0, "math.cos(q.anim_time*90*2)*-20"],
"lerp_mode": "catmullrom"
},
"1.1667": {
"post": ["-math.sin(q.anim_time*90*2)*-20", 0, "math.cos(q.anim_time*90*2)*-20"],
"lerp_mode": "catmullrom"
},
"1.375": {
"post": ["-19.94-math.sin(q.anim_time*90*32)*1", -0.9, 2.28],
"lerp_mode": "catmullrom"
},
"1.5417": {
"post": ["-24.1146-math.sin(q.anim_time*90*32)*1", -5.1806, -9.6237],
"lerp_mode": "catmullrom"
},
"1.75": {
"post": [-48.12, -9.9, -10.88],
"lerp_mode": "catmullrom"
},
"1.8333": {
"post": [-82.4083, -26.1002, -17.2368],
"lerp_mode": "catmullrom"
},
"2.0417": {
"post": [-102.1119, -24.854, -31.5905],
"lerp_mode": "catmullrom"
},
"2.3333": {
"post": [-99.1014, -23.4505, -14.6775],
"lerp_mode": "catmullrom"
},
"2.6667": {
"post": [-66.3538, -24.159, 6.6861],
"lerp_mode": "catmullrom"
},
"3.0": {
"post": [-85.0639, -23.1834, -2.9264],
"lerp_mode": "catmullrom"
}
},
"position": {
"0.0": [0, -0.2, 0],
"0.75": [0, -0.2, 0],
"1.0417": [0, -0.2, 0],
"1.1667": [0, -0.2, 0],
"1.25": [0, -0.1, 0],
"1.3333": [0, 0.05, 0],
"1.4167": [0, 2.8, 0],
"1.5417": [0, 3.3, 0.3],
"1.6667": [0, 3.7, 0.6],
"1.75": [0, 3.7, 0.6],
"2.0833": [0, 2.16, 0.48],
"2.2917": [0, -0.3, 0.3],
"2.3333": [0, 0.05, 0.33],
"2.375": [0, -0.3, 0.3]
}
},
"body": {
"position": {
"0.0": [0, 0, 0],
"0.75": [0, 0, 0],
"1.2917": [0, 0, 0],
"1.3333": [0, -0.05954, 0.19093],
"1.375": [0, 0, 0],
"1.4167": [0, 0.00436, 0.0999],
"1.4583": [0, 0, 0],
"1.75": [0, 0.98481, -0.17365]
"0.0": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"0.5": {
"post": ["-math.cos(q.anim_time*90*2)*2.6", "math.sin(q.anim_time*90*2)*0.2", "math.sin(q.anim_time*90*2)*-2.6"],
"lerp_mode": "catmullrom"
},
"1.1667": {
"post": ["-math.cos(q.anim_time*90*2)*2.6", "math.sin(q.anim_time*90*2)*0.2", "math.sin(q.anim_time*90*2)*-2.6"],
"lerp_mode": "catmullrom"
},
"1.375": {
"post": [0.3, -0.73, 2.28],
"lerp_mode": "catmullrom"
},
"1.5417": {
"post": [-1.64, -1.13, 2.77],
"lerp_mode": "catmullrom"
},
"1.625": {
"post": [-1.96, -1.39, 4.06],
"lerp_mode": "catmullrom"
},
"1.7083": {
"post": [-2.19, -2.77, 4.5],
"lerp_mode": "catmullrom"
},
"1.8333": {
"post": [-3.71, -4.79, 5.06],
"lerp_mode": "catmullrom"
},
"1.9167": {
"post": [-4.94977, -3.02238, 5.61398],
"lerp_mode": "catmullrom"
},
"2.2083": {
"post": [-5.87185, -2.2078, 6.20958],
"lerp_mode": "catmullrom"
},
"2.5": {
"post": [-4.3217, -4.5458, 4.90724],
"lerp_mode": "catmullrom"
},
"2.6667": {
"post": [-3.91, -4.91, 5.01],
"lerp_mode": "catmullrom"
},
"2.75": {
"post": [-3.92405, -4.96563, 5.12418],
"lerp_mode": "catmullrom"
},
"2.9167": {
"post": [-4.24661, -5.20065, 5.11229],
"lerp_mode": "catmullrom"
},
"3.0": {
"post": [-4.29542, -5.18509, 5.3042],
"lerp_mode": "catmullrom"
}
}
}
}
@@ -100,32 +244,53 @@
"body": {
"rotation": {
"0.0": [0, 0, 0],
"0.125": [7.5, 2.5, 0],
"0.3333": [0, 0, 0],
"0.4167": [0, 7.5, 0],
"0.5": [0, -7.5, 0],
"0.5833": [0, 0, 0],
"0.625": [0, 0, 0]
"0.125": {
"pre": [4.5, 0, 0],
"post": [4.5, 0, 0],
"lerp_mode": "catmullrom"
},
"0.3333": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"0.4167": {
"post": [-0.1296, 2.4461, -3.0023],
"lerp_mode": "catmullrom"
},
"0.5": {
"post": [-0.0867, -2.4636, 2.0016],
"lerp_mode": "catmullrom"
},
"0.5833": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"0.6667": [0, 0, 0]
},
"position": {
"0.0": [0, 0, 0],
"0.125": [0, -0.2, 0.55],
"0.3333": [0, 0, 0.5],
"0.625": [0, 0, 0]
}
},
"head": {
"rotation": {
"0.0": [0, 0, 0],
"0.125": [10, 0, 0],
"0.25": [0, 0, 0]
}
},
"tail": {
"rotation": {
"0.0": [0, 0, 0],
"0.125": [-20, 0, 0],
"0.4583": [0, 0, 0]
"0.125": {
"pre": [0, -0.05, -0.5],
"post": [0, -0.05, -0.5],
"lerp_mode": "catmullrom"
},
"0.3333": {
"post": [0, -0.1, 0.1],
"lerp_mode": "catmullrom"
},
"0.4167": {
"post": [-0.25, -0.08, 0.12],
"lerp_mode": "catmullrom"
},
"0.5": {
"post": [0.08, -0.05, 0.08],
"lerp_mode": "catmullrom"
},
"0.5833": {
"post": [0.015, -0.01, 0.02],
"lerp_mode": "catmullrom"
},
"0.6667": [0, 0, 0]
}
}
},
@@ -22,6 +22,387 @@
}
}
},
"animation.diglett.physical": {
"animation_length": 3,
"bones": {
"ground": {
"rotation": {
"0.0": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"0.2083": {
"post": ["-2.5-math.sin(q.anim_time*90*24)*02", 12.5, "math.sin(q.anim_time*90*17)*02"],
"lerp_mode": "catmullrom"
},
"0.6667": {
"post": ["-2-math.sin(q.anim_time*90*24)*02", -5, "math.sin(q.anim_time*90*17)*02"],
"lerp_mode": "catmullrom"
},
"1.0833": {
"post": ["5-math.sin(q.anim_time*90*24)*02", 5, "math.sin(q.anim_time*90*17)*02"],
"lerp_mode": "catmullrom"
},
"1.125": {
"post": ["-2.5-math.sin(q.anim_time*90*48)*04", 0, "math.sin(q.anim_time*90*32)*05"],
"lerp_mode": "catmullrom"
},
"1.1667": {
"post": [10, 3.1406, 2.1769],
"lerp_mode": "catmullrom"
},
"1.25": {
"post": ["2.5-math.sin(q.anim_time*90*48)*04", 0, "math.sin(q.anim_time*90*32)*05"],
"lerp_mode": "catmullrom"
},
"1.3333": {
"post": ["-2.5-math.sin(q.anim_time*90*48)*2", -0.25, "math.sin(q.anim_time*90*32)*2"],
"lerp_mode": "catmullrom"
},
"1.4167": {
"post": [0.04, -0.24, 0],
"lerp_mode": "catmullrom"
},
"2.0417": {
"post": [0, -0.04, 0],
"lerp_mode": "catmullrom"
},
"2.2083": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"2.375": {
"post": ["-math.sin(q.anim_time*90*24)*02", 5, "math.sin(q.anim_time*90*17)*02"],
"lerp_mode": "catmullrom"
},
"2.5833": {
"post": ["-2.5-math.sin(q.anim_time*90*30)*03", 0, "math.sin(q.anim_time*90*23)*03"],
"lerp_mode": "catmullrom"
},
"2.875": {
"post": ["-math.sin(q.anim_time*90*24)*02", 5, "math.sin(q.anim_time*90*17)*02"],
"lerp_mode": "catmullrom"
},
"3.0": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
}
},
"position": {
"0.0": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"0.1667": {
"post": [3.81, 0, -0.16],
"lerp_mode": "catmullrom"
},
"0.3333": {
"post": [7.36, 0, 2.18],
"lerp_mode": "catmullrom"
},
"0.375": {
"post": [7.39, -1, 2.69],
"lerp_mode": "catmullrom"
},
"0.4583": {
"post": [6.99, 0, 3.6],
"lerp_mode": "catmullrom"
},
"0.625": {
"post": [5.32, 0, 6.24],
"lerp_mode": "catmullrom"
},
"0.875": {
"post": [0, 0, 8],
"lerp_mode": "catmullrom"
},
"1.0": {
"post": [-6.18, 0, 3.1],
"lerp_mode": "catmullrom"
},
"1.125": {
"post": [-8.51, 0, -3.46],
"lerp_mode": "catmullrom"
},
"1.25": {
"post": [1, 0, -15],
"lerp_mode": "catmullrom"
},
"1.2917": {
"post": [1.84, 0.4, -16.22],
"lerp_mode": "catmullrom"
},
"1.3333": {
"post": [1.5, 0, -16],
"lerp_mode": "catmullrom"
},
"2.2083": {
"post": [1.5, 0, -16],
"lerp_mode": "catmullrom"
},
"2.25": {
"post": [1.48, -1, -15.81],
"lerp_mode": "catmullrom"
},
"2.3333": {
"post": [1.44, 0, -15.39],
"lerp_mode": "catmullrom"
},
"2.4583": {
"post": [1.26, 0, -13.4],
"lerp_mode": "catmullrom"
},
"2.75": {
"post": [0.27, 0, -2.89],
"lerp_mode": "catmullrom"
},
"3.0": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
}
}
},
"body": {
"rotation": {
"0.0": {
"post": [0, 1, 0],
"lerp_mode": "catmullrom"
},
"0.125": {
"post": [-0.0639, 0.4994, -10.1039],
"lerp_mode": "catmullrom"
},
"0.25": {
"post": [0, 0, -0.2392],
"lerp_mode": "catmullrom"
},
"0.375": {
"post": [-0.38018, -0.04695, -0.49598],
"lerp_mode": "catmullrom"
},
"1.1667": {
"post": [-0.38018, -0.04695, -0.49598],
"lerp_mode": "catmullrom"
},
"1.2083": {
"post": [3.28242, -7.51775, -0.56308],
"lerp_mode": "catmullrom"
},
"1.25": {
"post": [45, -15, 0],
"lerp_mode": "catmullrom"
},
"1.4583": {
"post": [-8.1232, 5.2505, 0.0419],
"lerp_mode": "catmullrom"
},
"1.875": {
"post": [0, 1, 0],
"lerp_mode": "catmullrom"
},
"2.125": {
"post": [0, 0, -0.2392],
"lerp_mode": "catmullrom"
},
"2.25": {
"post": [-0.38018, -0.04695, -0.49598],
"lerp_mode": "catmullrom"
},
"3.0": {
"post": [0, 1, 0],
"lerp_mode": "catmullrom"
}
},
"position": {
"0.0": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"0.25": {
"post": [0, 0.6, 0.2],
"lerp_mode": "catmullrom"
},
"0.3333": [0, -0.28, 0.21],
"0.375": [0, -2.1, 0.2],
"1.2083": [0, -2.1, 0.2],
"1.25": {
"pre": [0, -0.4, -0.8],
"post": [0, -0.4, -0.8],
"lerp_mode": "catmullrom"
},
"1.875": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"2.125": {
"post": [0, 0.6, 0.2],
"lerp_mode": "catmullrom"
},
"2.2083": [0, -0.28, 0.21],
"2.25": [0, -2.1, 0.2],
"2.6667": [0, -2.1, 0.2],
"2.8333": {
"pre": [0, 0, 0],
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"3.0": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
}
},
"scale": {
"0.0": [1, 1, 1],
"0.2083": [1, 1, 1],
"0.3333": [0.9, 1.2, 0.9],
"0.375": [1, 0.1, 1],
"1.2083": [1, 0.1, 1],
"1.25": [1, 1.3, 1],
"1.3333": [1, 1, 1],
"2.0833": [1, 1, 1],
"2.2083": [0.9, 1.2, 0.9],
"2.25": [1, 0.1, 1],
"2.6667": [1, 0.1, 1],
"2.7917": [1, 1, 1],
"3.0": [1, 1, 1]
}
},
"body2": {
"rotation": {
"0.0": {
"post": [-2.59808, 0, 0],
"lerp_mode": "catmullrom"
},
"0.125": {
"post": [10.0582, 0, -3.4641],
"lerp_mode": "catmullrom"
},
"0.2917": {
"post": [-15.0433, 1.3008, 4.8282],
"lerp_mode": "catmullrom"
},
"0.3333": {
"post": [2.4019, 0, 0],
"lerp_mode": "catmullrom"
},
"1.2083": {
"post": [2.4019, 0, 0],
"lerp_mode": "catmullrom"
},
"1.25": {
"post": [20, 0, 0],
"lerp_mode": "catmullrom"
},
"1.375": {
"post": [24.9889, 0, -0.5265],
"lerp_mode": "catmullrom"
},
"1.5833": {
"post": [8.6796, 1.8689, -15.6325],
"lerp_mode": "catmullrom"
},
"1.9583": {
"post": [4.3843, -5.6, 3.6003],
"lerp_mode": "catmullrom"
},
"2.125": {
"post": [-15.0433, 1.3008, 4.8282],
"lerp_mode": "catmullrom"
},
"2.2083": {
"post": [2.4019, 0, 0],
"lerp_mode": "catmullrom"
},
"2.6667": {
"post": [2.4019, 0, 0],
"lerp_mode": "catmullrom"
},
"2.875": {
"post": [-2.59808, 0, 0],
"lerp_mode": "catmullrom"
},
"3.0": {
"post": [-2.59808, 0, 0],
"lerp_mode": "catmullrom"
}
},
"position": {
"0.0": [0, 0, 0],
"0.25": [0, 0, 0],
"0.3333": [0, -4, 0],
"1.2083": [0, -4, 0],
"1.25": {
"pre": [0, 1, 0],
"post": [0, 1, 0],
"lerp_mode": "catmullrom"
},
"1.375": {
"post": [0, -1, 0],
"lerp_mode": "catmullrom"
},
"1.6667": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"1.875": [0, 0, 0],
"2.125": [0, 0, 0],
"2.2083": [0, -4, 0],
"2.6667": [0, -4, 0],
"2.875": [0, 0, 0],
"3.0": [0, 0, 0]
}
},
"eye_angry_left": {
"position": {
"0.0": [0, 0, 0],
"0.25": {"pre": [0, 0, 0], "post": [0, 0, 0]},
"1.4583": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"2.125": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"eyelid_left": {
"position": {
"0.0": [0, 0, 0],
"2.6667": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"2.9167": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"eyelid_recoil_left": {
"position": {
"0.0": [0, 0, 0],
"0.25": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.4583": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"2.125": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"2.6667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"eye_angry_right": {
"position": {
"0.0": [0, 0, 0],
"0.25": {"pre": [0, 0, 0], "post": [0, 0, 0]},
"1.4583": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"2.125": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"eyelid_right": {
"position": {
"0.0": [0, 0, 0],
"2.6667": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"2.9167": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"eyelid_recoil_right": {
"position": {
"0.0": [0, 0, 0],
"0.25": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.4583": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"2.125": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"2.6667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
}
}
},
"animation.diglett.ground_walk": {
"loop": true,
"animation_length": 4,
@@ -161,27 +542,27 @@
"0.3333": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"0.4583": {"pre": [0, 0, -0.1], "post": [0, 0, -0.13]},
"0.5": {"pre": [0, 0, -0.13], "post": [0, 0, 0]},
"0.8333": {"pre": [0, 0, 0], "post": [0, 0, 0]},
"0.8333": [0, 0, 0],
"0.875": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.4583": {"pre": [0, 0, -0.1], "post": [0, 0, -0.13]},
"1.5": {"pre": [0, 0, -0.13], "post": [0, 0, 0]},
"1.7083": {"pre": [0, 0, 0], "post": [0, 0, 0]},
"1.7083": [0, 0, 0],
"1.75": {"pre": [0, 0, 0], "post": [0, 0, -0.13]}
}
},
"eyelid_left": {
"position": {
"0.0": [0, 0, -0.1],
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, -0.1]},
"0.1667": [0, 0, -0.1],
"0.2917": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"0.3333": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"0.4583": {"pre": [0, 0, -0.1], "post": [0, 0, -0.1]},
"0.4583": [0, 0, -0.1],
"0.5": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"0.8333": {"pre": [0, 0, 0], "post": [0, 0, 0]},
"0.8333": [0, 0, 0],
"0.875": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.4583": {"pre": [0, 0, -0.1], "post": [0, 0, -0.1]},
"1.4583": [0, 0, -0.1],
"1.5": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"1.7083": {"pre": [0, 0, 0], "post": [0, 0, 0]},
"1.7083": [0, 0, 0],
"1.75": {"pre": [0, 0, 0], "post": [0, 0, -0.1]}
}
},
@@ -239,19 +620,19 @@
}
},
"animation.diglett.blink": {
"animation_length": 0.16667,
"animation_length": 0.1667,
"bones": {
"eyelid_right": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": {"pre": [0, 0, -0.1], "post": [0, 0, -0.1]},
"0.125": [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": {"pre": [0, 0, -0.1], "post": [0, 0, -0.1]},
"0.125": [0, 0, -0.1],
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
}
@@ -22,6 +22,387 @@
}
}
},
"animation.diglett_alolan.physical": {
"animation_length": 3,
"bones": {
"ground": {
"rotation": {
"0.0": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"0.2083": {
"post": ["-2.5-math.sin(q.anim_time*90*24)*02", 12.5, "math.sin(q.anim_time*90*17)*02"],
"lerp_mode": "catmullrom"
},
"0.6667": {
"post": ["-2-math.sin(q.anim_time*90*24)*02", -5, "math.sin(q.anim_time*90*17)*02"],
"lerp_mode": "catmullrom"
},
"1.0833": {
"post": ["5-math.sin(q.anim_time*90*24)*02", 5, "math.sin(q.anim_time*90*17)*02"],
"lerp_mode": "catmullrom"
},
"1.125": {
"post": ["-2.5-math.sin(q.anim_time*90*48)*04", 0, "math.sin(q.anim_time*90*32)*05"],
"lerp_mode": "catmullrom"
},
"1.1667": {
"post": [10, 3.1406, 2.1769],
"lerp_mode": "catmullrom"
},
"1.25": {
"post": ["2.5-math.sin(q.anim_time*90*48)*04", 0, "math.sin(q.anim_time*90*32)*05"],
"lerp_mode": "catmullrom"
},
"1.3333": {
"post": ["-2.5-math.sin(q.anim_time*90*48)*2", -0.25, "math.sin(q.anim_time*90*32)*2"],
"lerp_mode": "catmullrom"
},
"1.4167": {
"post": [0.04, -0.24, 0],
"lerp_mode": "catmullrom"
},
"2.0417": {
"post": [0, -0.04, 0],
"lerp_mode": "catmullrom"
},
"2.2083": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"2.375": {
"post": ["-math.sin(q.anim_time*90*24)*02", 5, "math.sin(q.anim_time*90*17)*02"],
"lerp_mode": "catmullrom"
},
"2.5833": {
"post": ["-2.5-math.sin(q.anim_time*90*30)*03", 0, "math.sin(q.anim_time*90*23)*03"],
"lerp_mode": "catmullrom"
},
"2.875": {
"post": ["-math.sin(q.anim_time*90*24)*02", 5, "math.sin(q.anim_time*90*17)*02"],
"lerp_mode": "catmullrom"
},
"3.0": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
}
},
"position": {
"0.0": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"0.1667": {
"post": [3.81, 0, -0.16],
"lerp_mode": "catmullrom"
},
"0.3333": {
"post": [7.36, 0, 2.18],
"lerp_mode": "catmullrom"
},
"0.375": {
"post": [7.39, -1, 2.69],
"lerp_mode": "catmullrom"
},
"0.4583": {
"post": [6.99, 0, 3.6],
"lerp_mode": "catmullrom"
},
"0.625": {
"post": [5.32, 0, 6.24],
"lerp_mode": "catmullrom"
},
"0.875": {
"post": [0, 0, 8],
"lerp_mode": "catmullrom"
},
"1.0": {
"post": [-6.18, 0, 3.1],
"lerp_mode": "catmullrom"
},
"1.125": {
"post": [-8.51, 0, -3.46],
"lerp_mode": "catmullrom"
},
"1.25": {
"post": [1, 0, -15],
"lerp_mode": "catmullrom"
},
"1.2917": {
"post": [1.84, 0.4, -16.22],
"lerp_mode": "catmullrom"
},
"1.3333": {
"post": [1.5, 0, -16],
"lerp_mode": "catmullrom"
},
"2.2083": {
"post": [1.5, 0, -16],
"lerp_mode": "catmullrom"
},
"2.25": {
"post": [1.48, -1, -15.81],
"lerp_mode": "catmullrom"
},
"2.3333": {
"post": [1.44, 0, -15.39],
"lerp_mode": "catmullrom"
},
"2.4583": {
"post": [1.26, 0, -13.4],
"lerp_mode": "catmullrom"
},
"2.75": {
"post": [0.27, 0, -2.89],
"lerp_mode": "catmullrom"
},
"3.0": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
}
}
},
"body": {
"rotation": {
"0.0": {
"post": [0, 1, 0],
"lerp_mode": "catmullrom"
},
"0.125": {
"post": [-0.0639, 0.4994, -10.1039],
"lerp_mode": "catmullrom"
},
"0.25": {
"post": [0, 0, -0.2392],
"lerp_mode": "catmullrom"
},
"0.375": {
"post": [-0.38018, -0.04695, -0.49598],
"lerp_mode": "catmullrom"
},
"1.1667": {
"post": [-0.38018, -0.04695, -0.49598],
"lerp_mode": "catmullrom"
},
"1.2083": {
"post": [3.28242, -7.51775, -0.56308],
"lerp_mode": "catmullrom"
},
"1.25": {
"post": [45, -15, 0],
"lerp_mode": "catmullrom"
},
"1.4583": {
"post": [-8.1232, 5.2505, 0.0419],
"lerp_mode": "catmullrom"
},
"1.875": {
"post": [0, 1, 0],
"lerp_mode": "catmullrom"
},
"2.125": {
"post": [0, 0, -0.2392],
"lerp_mode": "catmullrom"
},
"2.25": {
"post": [-0.38018, -0.04695, -0.49598],
"lerp_mode": "catmullrom"
},
"3.0": {
"post": [0, 1, 0],
"lerp_mode": "catmullrom"
}
},
"position": {
"0.0": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"0.25": {
"post": [0, 0.6, 0.2],
"lerp_mode": "catmullrom"
},
"0.3333": [0, -0.28, 0.21],
"0.375": [0, -2.1, 0.2],
"1.2083": [0, -2.1, 0.2],
"1.25": {
"pre": [0, -0.4, -0.8],
"post": [0, -0.4, -0.8],
"lerp_mode": "catmullrom"
},
"1.875": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"2.125": {
"post": [0, 0.6, 0.2],
"lerp_mode": "catmullrom"
},
"2.2083": [0, -0.28, 0.21],
"2.25": [0, -2.1, 0.2],
"2.6667": [0, -2.1, 0.2],
"2.8333": {
"pre": [0, 0, 0],
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"3.0": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
}
},
"scale": {
"0.0": [1, 1, 1],
"0.2083": [1, 1, 1],
"0.3333": [0.9, 1.2, 0.9],
"0.375": [1, 0.1, 1],
"1.2083": [1, 0.1, 1],
"1.25": [1, 1.3, 1],
"1.3333": [1, 1, 1],
"2.0833": [1, 1, 1],
"2.2083": [0.9, 1.2, 0.9],
"2.25": [1, 0.1, 1],
"2.6667": [1, 0.1, 1],
"2.7917": [1, 1, 1],
"3.0": [1, 1, 1]
}
},
"body2": {
"rotation": {
"0.0": {
"post": [-2.59808, 0, 0],
"lerp_mode": "catmullrom"
},
"0.125": {
"post": [10.0582, 0, -3.4641],
"lerp_mode": "catmullrom"
},
"0.2917": {
"post": [-15.0433, 1.3008, 4.8282],
"lerp_mode": "catmullrom"
},
"0.3333": {
"post": [2.4019, 0, 0],
"lerp_mode": "catmullrom"
},
"1.2083": {
"post": [2.4019, 0, 0],
"lerp_mode": "catmullrom"
},
"1.25": {
"post": [20, 0, 0],
"lerp_mode": "catmullrom"
},
"1.375": {
"post": [24.9889, 0, -0.5265],
"lerp_mode": "catmullrom"
},
"1.5833": {
"post": [8.6796, 1.8689, -15.6325],
"lerp_mode": "catmullrom"
},
"1.9583": {
"post": [4.3843, -5.6, 3.6003],
"lerp_mode": "catmullrom"
},
"2.125": {
"post": [-15.0433, 1.3008, 4.8282],
"lerp_mode": "catmullrom"
},
"2.2083": {
"post": [2.4019, 0, 0],
"lerp_mode": "catmullrom"
},
"2.6667": {
"post": [2.4019, 0, 0],
"lerp_mode": "catmullrom"
},
"2.875": {
"post": [-2.59808, 0, 0],
"lerp_mode": "catmullrom"
},
"3.0": {
"post": [-2.59808, 0, 0],
"lerp_mode": "catmullrom"
}
},
"position": {
"0.0": [0, 0, 0],
"0.25": [0, 0, 0],
"0.3333": [0, -4, 0],
"1.2083": [0, -4, 0],
"1.25": {
"pre": [0, 1, 0],
"post": [0, 1, 0],
"lerp_mode": "catmullrom"
},
"1.375": {
"post": [0, -1, 0],
"lerp_mode": "catmullrom"
},
"1.6667": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"1.875": [0, 0, 0],
"2.125": [0, 0, 0],
"2.2083": [0, -4, 0],
"2.6667": [0, -4, 0],
"2.875": [0, 0, 0],
"3.0": [0, 0, 0]
}
},
"eye_angry_left": {
"position": {
"0.0": [0, 0, 0],
"0.25": [0, 0, 0],
"1.4583": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"2.125": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"eyelid_left": {
"position": {
"0.0": [0, 0, 0],
"2.6667": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"2.9167": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"eyelid_recoil_left": {
"position": {
"0.0": [0, 0, 0],
"0.25": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.4583": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"2.125": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"2.6667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"eye_angry_right": {
"position": {
"0.0": [0, 0, 0],
"0.25": [0, 0, 0],
"1.4583": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"2.125": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"eyelid_right": {
"position": {
"0.0": [0, 0, 0],
"2.6667": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"2.9167": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"eyelid_recoil_right": {
"position": {
"0.0": [0, 0, 0],
"0.25": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.4583": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"2.125": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"2.6667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
}
}
},
"animation.diglett_alolan.ground_walk": {
"loop": true,
"animation_length": 4,
@@ -156,78 +537,33 @@
"eyelid_right": {
"position": {
"0.0": [0, 0, -0.1],
"0.1667": {
"pre": [0, 0, -0.1],
"post": [0, 0, -0.13]
},
"0.2917": {
"pre": [0, 0, -0.13],
"post": [0, 0, 0]
},
"0.3333": {
"pre": [0, 0, 0],
"post": [0, 0, -0.1]
},
"0.4583": {
"pre": [0, 0, -0.1],
"post": [0, 0, -0.13]
},
"0.5": {
"pre": [0, 0, -0.13],
"post": [0, 0, 0]
},
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, -0.13]},
"0.2917": {"pre": [0, 0, -0.13], "post": [0, 0, 0]},
"0.3333": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"0.4583": {"pre": [0, 0, -0.1], "post": [0, 0, -0.13]},
"0.5": {"pre": [0, 0, -0.13], "post": [0, 0, 0]},
"0.8333": [0, 0, 0],
"0.875": {
"pre": [0, 0, 0],
"post": [0, 0, -0.1]
},
"1.4583": {
"pre": [0, 0, -0.1],
"post": [0, 0, -0.13]
},
"1.5": {
"pre": [0, 0, -0.13],
"post": [0, 0, 0]
},
"0.875": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.4583": {"pre": [0, 0, -0.1], "post": [0, 0, -0.13]},
"1.5": {"pre": [0, 0, -0.13], "post": [0, 0, 0]},
"1.7083": [0, 0, 0],
"1.75": {
"pre": [0, 0, 0],
"post": [0, 0, -0.13]
}
"1.75": {"pre": [0, 0, 0], "post": [0, 0, -0.13]}
}
},
"eyelid_left": {
"position": {
"0.0": [0, 0, -0.1],
"0.1667": [0, 0, -0.1],
"0.2917": {
"pre": [0, 0, -0.1],
"post": [0, 0, 0]
},
"0.3333": {
"pre": [0, 0, 0],
"post": [0, 0, -0.1]
},
"0.2917": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"0.3333": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"0.4583": [0, 0, -0.1],
"0.5": {
"pre": [0, 0, -0.1],
"post": [0, 0, 0]
},
"0.5": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"0.8333": [0, 0, 0],
"0.875": {
"pre": [0, 0, 0],
"post": [0, 0, -0.1]
},
"0.875": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.4583": [0, 0, -0.1],
"1.5": {
"pre": [0, 0, -0.1],
"post": [0, 0, 0]
},
"1.5": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"1.7083": [0, 0, 0],
"1.75": {
"pre": [0, 0, 0],
"post": [0, 0, -0.1]
}
"1.75": {"pre": [0, 0, 0], "post": [0, 0, -0.1]}
}
},
"body2": {
@@ -284,26 +620,20 @@
}
},
"animation.diglett_alolan.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": {
"pre": [0, 0, -0.1],
"post": [0, 0, 0]
}
"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": {
"pre": [0, 0, -0.1],
"post": [0, 0, 0]
}
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
}
}
@@ -75,6 +75,712 @@
}
}
},
"animation.dugtrio.physical": {
"animation_length": 3,
"bones": {
"body": {
"rotation": {
"0.0": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"0.25": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"0.9167": {
"post": ["-math.sin(q.anim_time*90*24)*02", 0, "math.sin(q.anim_time*90*17)*02"],
"lerp_mode": "catmullrom"
},
"1.25": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"2.2083": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"2.6667": {
"post": ["-math.sin(q.anim_time*90*24)*02", 0, "math.sin(q.anim_time*90*17)*02"],
"lerp_mode": "catmullrom"
},
"3.0": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
}
},
"position": {
"0.0": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"0.5833": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"0.8333": {
"post": [0, 0, -1.25],
"lerp_mode": "catmullrom"
},
"1.125": {
"post": ["-math.sin(q.anim_time*90*6)*2", 0, -7.1],
"lerp_mode": "catmullrom"
},
"1.25": {
"post": [0, 0, -16],
"lerp_mode": "catmullrom"
},
"1.75": {
"post": [0, 0, -16.7],
"lerp_mode": "catmullrom"
},
"2.2083": {
"post": [0, 0, -16],
"lerp_mode": "catmullrom"
},
"2.4583": {
"post": ["-math.sin(q.anim_time*90*6)*2", 0, -13.4],
"lerp_mode": "catmullrom"
},
"2.75": {
"post": ["-math.sin(q.anim_time*90*6)*2", 0, -2.89],
"lerp_mode": "catmullrom"
},
"3.0": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
}
}
},
"body1": {
"rotation": {
"0.0": {
"post": [7.5, -4, -5],
"lerp_mode": "catmullrom"
},
"0.125": {
"post": [11.9213, -50.9243, -13.7818],
"lerp_mode": "catmullrom"
},
"0.3333": {
"post": [11.6966, -74.0498, -19.4432],
"lerp_mode": "catmullrom"
},
"0.5": {
"post": [12.1827, -67.8747, -22.7017],
"lerp_mode": "catmullrom"
},
"0.625": {
"post": [-1.1013, -13.7699, 2.8238],
"lerp_mode": "catmullrom"
},
"1.1667": {
"post": [3.28242, 7.51775, 0.56308],
"lerp_mode": "catmullrom"
},
"1.25": {
"post": [50.709, 2.0361, -22.8812],
"lerp_mode": "catmullrom"
},
"1.5417": {
"post": [50.709, 2.0361, -22.8812],
"lerp_mode": "catmullrom"
},
"1.9167": {
"post": [16.737, 14.4812, -21.7787],
"lerp_mode": "catmullrom"
},
"2.0833": {
"post": [15, 0, -0.2392],
"lerp_mode": "catmullrom"
},
"2.2083": {
"post": [-0.38018, -0.04695, -0.49598],
"lerp_mode": "catmullrom"
},
"3.0": {
"post": [7.5, -4, -5],
"lerp_mode": "catmullrom"
}
},
"position": {
"0.0": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"0.625": [0, 0, 0],
"0.7083": [0, -1, 0],
"1.1667": [0, -2.1, 0.2],
"1.25": {
"pre": [-1.18301, -0.69289, -1.48301],
"post": [-1.18301, -0.69289, -1.48301],
"lerp_mode": "catmullrom"
},
"1.2917": [-0.9559, -1.11355, -0.74652],
"1.3333": [-1.33194, -0.27231, -1.99076],
"1.375": [-1.21126, -0.41201, -1.64918],
"1.5833": {
"pre": [-0.92, -0.13, -1.18],
"post": [-0.92, -0.13, -1.18],
"lerp_mode": "catmullrom"
},
"2.0833": {
"post": [0, 0.6, 0.2],
"lerp_mode": "catmullrom"
},
"2.1667": [0, -0.28, 0.21],
"2.2083": [0, -2.1, 0.2],
"2.5833": [0, -2.1, 0.2],
"2.7917": {
"pre": [0, 0, 0],
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"3.0": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
}
},
"scale": {
"0.5833": [1, 1, 1],
"0.625": [0.8, 0.75, 0.8],
"0.6667": [1, 0.1, 1],
"1.1667": [1, 0.1, 1],
"1.25": [0.9, 1.2, 0.9],
"1.3333": [1, 1, 1],
"2.0417": [1, 1, 1],
"2.1667": [0.9, 1.2, 0.9],
"2.2083": [1, 0.1, 1],
"2.5833": [1, 0.1, 1],
"2.7083": [1, 1, 1],
"3.0": [1, 1, 1]
}
},
"body1_2": {
"rotation": {
"0.0": {
"post": [-1.73205, 0, -2.59808],
"lerp_mode": "catmullrom"
},
"0.0833": {
"post": [8.2679, 0, -2.5981],
"lerp_mode": "catmullrom"
},
"0.25": {
"post": [-6.7321, 0, -2.5981],
"lerp_mode": "catmullrom"
},
"0.625": {
"post": [10.7679, 0, -2.5981],
"lerp_mode": "catmullrom"
},
"0.6667": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"2.6667": {
"post": [2.4019, 0, 0],
"lerp_mode": "catmullrom"
},
"2.875": {
"post": [-2.59808, 0, 0],
"lerp_mode": "catmullrom"
},
"3.0": {
"post": [-1.73205, 0, -2.59808],
"lerp_mode": "catmullrom"
}
},
"position": {
"0.0": [0, 0, 0],
"0.625": [0, 0, 0],
"0.6667": [0, -5, 0],
"1.1667": [0, -5, 0],
"1.25": [0, -2, 0],
"2.6667": [0, -4, 0],
"2.875": [0, 0, 0],
"3.0": [0, 0, 0]
}
},
"body2": {
"rotation": {
"0.0": {
"post": [3.9762, 6.495, 10.7976],
"lerp_mode": "catmullrom"
},
"0.125": {
"post": [10.3891, 24.9296, 12.6481],
"lerp_mode": "catmullrom"
},
"0.2083": {
"post": [1.3318, 51.3394, 15.2992],
"lerp_mode": "catmullrom"
},
"0.4167": {
"post": [-3.8835, 53.834, 15.0282],
"lerp_mode": "catmullrom"
},
"0.5": {
"post": [7.6917, 14.8915, -0.6214],
"lerp_mode": "catmullrom"
},
"0.5417": {
"post": [0, 17.5, 0],
"lerp_mode": "catmullrom"
},
"1.1667": {
"post": [3.28242, -7.51775, -0.56308],
"lerp_mode": "catmullrom"
},
"1.25": {
"post": [42.509, -8.8475, 30.2404],
"lerp_mode": "catmullrom"
},
"1.6667": {
"post": [42.509, -8.8475, 30.2404],
"lerp_mode": "catmullrom"
},
"1.875": {
"post": [10.6615, -8.0683, 18.5147],
"lerp_mode": "catmullrom"
},
"2.125": {
"post": [0, 0, -0.2392],
"lerp_mode": "catmullrom"
},
"2.25": {
"post": [-0.38018, -0.04695, -0.49598],
"lerp_mode": "catmullrom"
},
"3.0": {
"post": [3.9762, 6.495, 10.7976],
"lerp_mode": "catmullrom"
}
},
"position": {
"0.0": {
"post": [0.7766, 0.14679, -0.3],
"lerp_mode": "catmullrom"
},
"0.125": {
"post": [0.78, -0.45, -0.3],
"lerp_mode": "catmullrom"
},
"0.3333": {
"post": [0.7766, 0.14679, -0.3],
"lerp_mode": "catmullrom"
},
"0.5": {
"post": [0.7766, 0.14679, -0.3],
"lerp_mode": "catmullrom"
},
"0.5417": {
"post": [0.78, -1.55, -0.3],
"lerp_mode": "catmullrom"
},
"1.1667": [0, -2.1, 0.2],
"1.25": {
"pre": [1.18301, -0.69289, -1.48301],
"post": [1.18301, -0.69289, -1.48301],
"lerp_mode": "catmullrom"
},
"1.2917": [0.9559, -1.11355, -0.74652],
"1.3333": [1.33194, -0.27231, -1.99076],
"1.375": [1.21126, -0.41201, -1.64918],
"1.6667": {
"pre": [0.88, -0.12, -1.05],
"post": [0.88, -0.12, -1.05],
"lerp_mode": "catmullrom"
},
"1.7917": {
"post": [1.27, 0.19, -0.61],
"lerp_mode": "catmullrom"
},
"2.125": {
"post": [0, 0.6, 0.2],
"lerp_mode": "catmullrom"
},
"2.2083": [0, -0.28, 0.21],
"2.25": [0, -2.1, 0.2],
"2.6667": [0, -2.1, 0.2],
"2.8333": {
"pre": [0, 0, 0],
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"3.0": {
"post": [0.7766, 0.14679, -0.3],
"lerp_mode": "catmullrom"
}
},
"scale": {
"0.5": [1, 1, 1],
"0.5417": [0.9, 1, 0.9],
"0.5833": [1, 0.1, 1],
"1.1667": [1, 0.1, 1],
"1.25": [0.9, 1.2, 0.9],
"1.3333": [1, 1, 1],
"2.0833": [1, 1, 1],
"2.2083": [0.9, 1.2, 0.9],
"2.25": [1, 0.1, 1],
"2.6667": [1, 0.1, 1],
"2.7917": [1, 1, 1],
"3.0": [1, 1, 1]
}
},
"body3": {
"rotation": {
"0.0": {
"post": [2.0871, -1.0039, 7.5008],
"lerp_mode": "catmullrom"
},
"0.2917": {
"post": [-0.4129, -1.0039, 7.5008],
"lerp_mode": "catmullrom"
},
"0.4583": {
"post": [4.454, -1.0178, 6.3469],
"lerp_mode": "catmullrom"
},
"0.6667": {
"post": [-7.8238, -1.0361, "2.5001+math.sin(q.anim_time*90*6-60)*3"],
"lerp_mode": "catmullrom"
},
"0.9167": {
"post": [-26.56, -1.04, "2.26+math.sin(q.anim_time*90*6-60)*5"],
"lerp_mode": "catmullrom"
},
"1.1667": {
"post": [-35.3238, -1.0361, 2.5001],
"lerp_mode": "catmullrom"
},
"1.2083": {
"post": [32.1762, -1.0361, 2.5001],
"lerp_mode": "catmullrom"
},
"1.25": {
"post": [65.145, -1.0361, 2.5001],
"lerp_mode": "catmullrom"
},
"1.2917": {
"post": [59.6762, -1.0361, 2.5001],
"lerp_mode": "catmullrom"
},
"1.6667": {
"post": [59.6762, -1.0361, 2.5001],
"lerp_mode": "catmullrom"
},
"2.125": {
"post": [15.1947, -1.0361, 2.5001],
"lerp_mode": "catmullrom"
},
"2.2083": {
"post": [2.6947, -1.0361, 2.5001],
"lerp_mode": "catmullrom"
},
"3.0": {
"post": [2.0871, -1.0039, 7.5008],
"lerp_mode": "catmullrom"
}
},
"position": {
"0.0": {
"post": [0, -0.3, 0],
"lerp_mode": "catmullrom"
},
"1.1667": [0, -0.23, 1],
"1.2083": [0, -0.23, -3.04],
"1.25": [0, 0.47, -2.96],
"1.2917": [0, -0.6, -2.87],
"1.3333": [0, 0.05, -2.79],
"1.375": [0, -0.3, -2.7],
"1.4167": [0, 0, -2.62],
"1.5833": [0, -0.25, -2.28],
"2.2083": [0, -0.3, 0],
"2.25": [0, -1.3, 0],
"2.75": [0, -2.1, 0.2],
"2.875": {
"pre": [0, 0, 0],
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"3.0": {
"post": [0, -0.3, 0],
"lerp_mode": "catmullrom"
}
},
"scale": {
"0.0": [1, 1, 1],
"1.125": [1, 1, 1],
"1.2083": [0.8, 1, 1.35],
"1.25": {"pre": [0.8, 1, 1.35], "post": [1.2, 1, 0.9]},
"1.3333": [1, 1, 1],
"2.2083": [1, 1, 1],
"2.2917": [1, 0.1, 1],
"2.75": [1, 0.1, 1],
"2.8333": [1, 1, 1],
"3.0": [1, 1, 1]
}
},
"body3_2": {
"rotation": {
"0.0": {
"post": [1.28558, 0, 1.92836],
"lerp_mode": "catmullrom"
},
"0.2083": {
"post": ["23.7856-math.sin(q.anim_time*90*16)*7.5", 0, 1.9284],
"lerp_mode": "catmullrom"
},
"0.4583": {
"post": [31.2856, 0, 1.9284],
"lerp_mode": "catmullrom"
},
"0.6667": {
"post": [23.35, 0, 1.93],
"lerp_mode": "catmullrom"
},
"0.875": {
"post": [8.7856, 0, "1.9284+math.sin(q.anim_time*90*6-120)*15"],
"lerp_mode": "catmullrom"
},
"1.125": {
"post": [-43.1823, 0, 1.9284],
"lerp_mode": "catmullrom"
},
"1.2083": {
"post": [-57.1266, 0, 1.9284],
"lerp_mode": "catmullrom"
},
"1.25": {
"post": [21.2856, 0, 1.9284],
"lerp_mode": "catmullrom"
},
"1.375": {
"post": [27.6157, 0, 1.9284],
"lerp_mode": "catmullrom"
},
"1.5833": {
"post": [26.5571, 0, 1.994],
"lerp_mode": "catmullrom"
},
"1.8333": {
"post": [44.7157, 0, 2.0597],
"lerp_mode": "catmullrom"
},
"2.125": {
"post": [13.7856, 0, 1.9284],
"lerp_mode": "catmullrom"
},
"2.25": {
"post": [-15.4247, 0, 0.3886],
"lerp_mode": "catmullrom"
},
"2.2917": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"2.75": {
"post": [2.4019, 0, 0],
"lerp_mode": "catmullrom"
},
"2.9167": {
"post": [-2.59808, 0, 0],
"lerp_mode": "catmullrom"
},
"3.0": {
"post": [1.28558, 0, 1.92836],
"lerp_mode": "catmullrom"
}
},
"position": {
"0.0": [0, 0, 0],
"0.7083": [0, 0, 0],
"0.9583": [0, 0, 0],
"1.125": [-0.05508, -1.63581, -0.30179],
"1.2083": [-0.05508, -1.63581, -0.30179],
"1.25": [0, 0, 0],
"2.25": [0, 0, 0],
"2.3333": [0, -8, 0],
"2.75": [0, -4, 0],
"2.9167": [0, 0, 0],
"3.0": [0, 0, 0]
}
},
"eye_left2": {
"position": {
"0.0": [0, 0, 0],
"0.2083": {"pre": [0, 0, 0], "post": [-0.5, 0, 0]},
"0.4583": {"pre": [-0.5, 0, 0], "post": [0, 0, 0]}
}
},
"eyelid_left2": {
"position": {
"0.0": [0, 0, 0],
"0.0833": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"0.2083": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"0.4583": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.25": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"1.625": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.9583": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"3.0": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
},
"eyelid_recoil_left2": {
"position": {
"0.0": [0, 0, 0],
"1.25": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.625": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"3.0": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
},
"eye_right2": {
"position": {
"0.0": [0, 0, 0],
"0.2083": {"pre": [0, 0, 0], "post": [-0.5, 0, 0]},
"0.4583": {"pre": [-0.5, 0, 0], "post": [0, 0, 0]}
}
},
"pupil_right2": {
"position": [0, 0, 0]
},
"eyelid_right2": {
"position": {
"0.0": [0, 0, 0],
"0.0833": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"0.2083": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"0.4583": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.25": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"1.625": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.9583": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"eyelid_happy_right2": {
"position": [1, 0, 0]
},
"eyelid_recoil_right2": {
"position": {
"0.0": [0, 0, 0],
"1.25": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.625": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"eye_left1": {
"position": {
"0.0": [0, 0, 0],
"0.1667": {"pre": [0, 0, 0], "post": [0.5, 0, 0]},
"0.5833": {"pre": [0.5, 0, 0], "post": [0, 0, 0]}
}
},
"eye_angry_left1": {
"position": {
"0.0": [0, 0, 0],
"1.875": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"2.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"3.0": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
},
"eyelid_left1": {
"position": {
"0.0": [0, 0, -0.1],
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"0.5833": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.25": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"1.5": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.875": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"2.1667": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"2.7917": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"eyelid_happy_left1": {
"position": [-1, 0, 0]
},
"eyelid_recoil_left1": {
"position": {
"0.0": [0, 0, 0],
"1.25": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.5": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"eye_right1": {
"position": {
"0.0": [0, 0, 0],
"0.1667": {"pre": [0, 0, 0], "post": [0.5, 0, 0]},
"0.5833": {"pre": [0.5, 0, 0], "post": [0, 0, 0]}
}
},
"eye_angry_right1": {
"position": {
"0.0": [0, 0, 0],
"0.1667": {"pre": [0, 0, 0], "post": [0, -0.5, -0.1]},
"1.875": {"pre": [0, -0.5, -0.1], "post": [0, 0, -0.1]},
"2.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"3.0": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
},
"eyelid_right1": {
"position": {
"0.0": [0, 0, -0.1],
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"0.5833": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.25": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"1.5": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.875": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"2.1667": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"2.7917": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"eyelid_recoil_right1": {
"position": {
"0.0": [0, 0, 0],
"1.25": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.5": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"3.0": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
},
"eyelid_left3": {
"position": {
"0.0": [0, 0, 0],
"0.2083": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"0.5833": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"0.7083": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.0": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"1.3333": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"2.0833": {"pre": [0, 0, -0.1], "post": [0, 0, 0.1]},
"2.25": {"pre": [0, 0, 0.1], "post": [0, 0, -0.1]},
"2.875": {"pre": [0, 0, -0.1], "post": [0, 0, 0.1]}
}
},
"eyelid_recoil_left3": {
"position": {
"0.0": [0, 0, 0],
"1.0": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.3333": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"eyelid_right3": {
"position": {
"0.0": [0, 0, 0],
"0.2083": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"0.5833": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"0.7083": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.0": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"1.3333": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"2.0833": {"pre": [0, 0, -0.1], "post": [0, 0, 0.1]},
"2.25": {"pre": [0, 0, 0.1], "post": [0, 0, -0.1]},
"2.875": {"pre": [0, 0, -0.1], "post": [0, 0, 0.1]}
}
},
"eyelid_recoil_right3": {
"position": {
"0.0": [0, 0, 0],
"1.0": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.3333": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"3.0": {"pre": [0, 0, 0], "post": [0, 0, 0]}
}
}
}
},
"animation.dugtrio.faint": {
"loop": "hold_on_last_frame",
"animation_length": 3,
@@ -328,13 +1034,13 @@
"position": {
"0.2917": [0, 0, 0],
"0.3333": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"0.4583": {"pre": [0, 0, -0.1], "post": [0, 0, -0.1]},
"0.4583": [0, 0, -0.1],
"0.5": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"1.25": {"pre": [0, 0, 0], "post": [0, 0, 0]},
"1.25": [0, 0, 0],
"1.2917": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.4167": {"pre": [0, 0, -0.1], "post": [0, 0, -0.1]},
"1.4167": [0, 0, -0.1],
"1.4583": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"1.75": {"pre": [0, 0, 0], "post": [0, 0, 0]},
"1.75": [0, 0, 0],
"1.7917": {"pre": [0, 0, 0], "post": [0, 0, -0.1]}
}
},
@@ -342,13 +1048,13 @@
"position": {
"0.2917": [0, 0, 0],
"0.3333": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"0.4583": {"pre": [0, 0, -0.1], "post": [0, 0, -0.1]},
"0.4583": [0, 0, -0.1],
"0.5": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"1.25": {"pre": [0, 0, 0], "post": [0, 0, 0]},
"1.25": [0, 0, 0],
"1.2917": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.4167": {"pre": [0, 0, -0.1], "post": [0, 0, -0.1]},
"1.4167": [0, 0, -0.1],
"1.4583": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"1.75": {"pre": [0, 0, 0], "post": [0, 0, 0]},
"1.75": [0, 0, 0],
"1.7917": {"pre": [0, 0, 0], "post": [0, 0, -0.1]}
}
},
@@ -372,13 +1078,13 @@
"position": {
"0.125": [0, 0, 0],
"0.1667": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"0.2917": {"pre": [0, 0, -0.1], "post": [0, 0, -0.1]},
"0.2917": [0, 0, -0.1],
"0.3333": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"0.7083": {"pre": [0, 0, 0], "post": [0, 0, 0]},
"0.7083": [0, 0, 0],
"0.75": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"0.875": {"pre": [0, 0, -0.1], "post": [0, 0, -0.1]},
"0.875": [0, 0, -0.1],
"0.9167": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"1.0417": {"pre": [0, 0, 0], "post": [0, 0, 0]},
"1.0417": [0, 0, 0],
"1.0833": {"pre": [0, 0, 0], "post": [0, 0, -0.1]}
}
},
@@ -386,13 +1092,13 @@
"position": {
"0.125": [0, 0, 0],
"0.1667": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"0.2917": {"pre": [0, 0, -0.1], "post": [0, 0, -0.1]},
"0.2917": [0, 0, -0.1],
"0.3333": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"0.7083": {"pre": [0, 0, 0], "post": [0, 0, 0]},
"0.7083": [0, 0, 0],
"0.75": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"0.875": {"pre": [0, 0, -0.1], "post": [0, 0, -0.1]},
"0.875": [0, 0, -0.1],
"0.9167": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"1.0417": {"pre": [0, 0, 0], "post": [0, 0, 0]},
"1.0417": [0, 0, 0],
"1.0833": {"pre": [0, 0, 0], "post": [0, 0, -0.1]}
}
},
@@ -416,13 +1122,13 @@
"position": {
"0.0": [0, 0, 0],
"0.0417": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, -0.1]},
"0.1667": [0, 0, -0.1],
"0.2083": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"1.25": {"pre": [0, 0, 0], "post": [0, 0, 0]},
"1.25": [0, 0, 0],
"1.2917": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.4167": {"pre": [0, 0, -0.1], "post": [0, 0, -0.1]},
"1.4167": [0, 0, -0.1],
"1.4583": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"2.375": {"pre": [0, 0, 0], "post": [0, 0, 0]},
"2.375": [0, 0, 0],
"2.4167": {"pre": [0, 0, 0], "post": [0, 0, -0.1]}
}
},
@@ -430,13 +1136,13 @@
"position": {
"0.0": [0, 0, 0],
"0.0417": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, -0.1]},
"0.1667": [0, 0, -0.1],
"0.2083": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"1.25": {"pre": [0, 0, 0], "post": [0, 0, 0]},
"1.25": [0, 0, 0],
"1.2917": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.4167": {"pre": [0, 0, -0.1], "post": [0, 0, -0.1]},
"1.4167": [0, 0, -0.1],
"1.4583": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"2.375": {"pre": [0, 0, 0], "post": [0, 0, 0]},
"2.375": [0, 0, 0],
"2.4167": {"pre": [0, 0, 0], "post": [0, 0, -0.1]}
}
}
@@ -462,14 +1168,14 @@
"eyelid_right1": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": {"pre": [0, 0, -0.1], "post": [0, 0, -0.1]},
"0.125": [0, 0, -0.1],
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"eyelid_left1": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": {"pre": [0, 0, -0.1], "post": [0, 0, -0.1]},
"0.125": [0, 0, -0.1],
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
}
@@ -495,14 +1201,14 @@
"eyelid_right2": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": {"pre": [0, 0, -0.1], "post": [0, 0, -0.1]},
"0.125": [0, 0, -0.1],
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"eyelid_left2": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": {"pre": [0, 0, -0.1], "post": [0, 0, -0.1]},
"0.125": [0, 0, -0.1],
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
}
@@ -528,14 +1234,14 @@
"eyelid_right3": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": {"pre": [0, 0, -0.1], "post": [0, 0, -0.1]},
"0.125": [0, 0, -0.1],
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"eyelid_left3": {
"position": {
"0.0": [0, 0, -0.1],
"0.125": {"pre": [0, 0, -0.1], "post": [0, 0, -0.1]},
"0.125": [0, 0, -0.1],
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
}
@@ -75,6 +75,712 @@
}
}
},
"animation.dugtrio_alolan.physical": {
"animation_length": 3,
"bones": {
"body": {
"rotation": {
"0.0": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"0.25": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"0.9167": {
"post": ["-math.sin(q.anim_time*90*24)*02", 0, "math.sin(q.anim_time*90*17)*02"],
"lerp_mode": "catmullrom"
},
"1.25": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"2.2083": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"2.6667": {
"post": ["-math.sin(q.anim_time*90*24)*02", 0, "math.sin(q.anim_time*90*17)*02"],
"lerp_mode": "catmullrom"
},
"3.0": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
}
},
"position": {
"0.0": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"0.5833": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"0.8333": {
"post": [0, 0, -1.25],
"lerp_mode": "catmullrom"
},
"1.125": {
"post": ["-math.sin(q.anim_time*90*6)*2", 0, -7.1],
"lerp_mode": "catmullrom"
},
"1.25": {
"post": [0, 0, -16],
"lerp_mode": "catmullrom"
},
"1.75": {
"post": [0, 0, -16.7],
"lerp_mode": "catmullrom"
},
"2.2083": {
"post": [0, 0, -16],
"lerp_mode": "catmullrom"
},
"2.4583": {
"post": ["-math.sin(q.anim_time*90*6)*2", 0, -13.4],
"lerp_mode": "catmullrom"
},
"2.75": {
"post": ["-math.sin(q.anim_time*90*6)*2", 0, -2.89],
"lerp_mode": "catmullrom"
},
"3.0": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
}
}
},
"body1": {
"rotation": {
"0.0": {
"post": [7.5, -4, -5],
"lerp_mode": "catmullrom"
},
"0.125": {
"post": [11.9213, -50.9243, -13.7818],
"lerp_mode": "catmullrom"
},
"0.3333": {
"post": [11.6966, -74.0498, -19.4432],
"lerp_mode": "catmullrom"
},
"0.5": {
"post": [12.1827, -67.8747, -22.7017],
"lerp_mode": "catmullrom"
},
"0.625": {
"post": [-1.1013, -13.7699, 2.8238],
"lerp_mode": "catmullrom"
},
"1.1667": {
"post": [3.28242, 7.51775, 0.56308],
"lerp_mode": "catmullrom"
},
"1.25": {
"post": [50.709, 2.0361, -22.8812],
"lerp_mode": "catmullrom"
},
"1.5417": {
"post": [50.709, 2.0361, -22.8812],
"lerp_mode": "catmullrom"
},
"1.9167": {
"post": [16.737, 14.4812, -21.7787],
"lerp_mode": "catmullrom"
},
"2.0833": {
"post": [15, 0, -0.2392],
"lerp_mode": "catmullrom"
},
"2.2083": {
"post": [-0.38018, -0.04695, -0.49598],
"lerp_mode": "catmullrom"
},
"3.0": {
"post": [7.5, -4, -5],
"lerp_mode": "catmullrom"
}
},
"position": {
"0.0": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"0.625": [0, 0, 0],
"0.7083": [0, -1, 0],
"1.1667": [0, -2.1, 0.2],
"1.25": {
"pre": [-1.18301, -0.69289, -1.48301],
"post": [-1.18301, -0.69289, -1.48301],
"lerp_mode": "catmullrom"
},
"1.2917": [-0.9559, -1.11355, -0.74652],
"1.3333": [-1.33194, -0.27231, -1.99076],
"1.375": [-1.21126, -0.41201, -1.64918],
"1.5833": {
"pre": [-0.92, -0.13, -1.18],
"post": [-0.92, -0.13, -1.18],
"lerp_mode": "catmullrom"
},
"2.0833": {
"post": [0, 0.6, 0.2],
"lerp_mode": "catmullrom"
},
"2.1667": [0, -0.28, 0.21],
"2.2083": [0, -2.1, 0.2],
"2.5833": [0, -2.1, 0.2],
"2.7917": {
"pre": [0, 0, 0],
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"3.0": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
}
},
"scale": {
"0.5833": [1, 1, 1],
"0.625": [0.8, 0.75, 0.8],
"0.6667": [1, 0.1, 1],
"1.1667": [1, 0.1, 1],
"1.25": [0.9, 1.2, 0.9],
"1.3333": [1, 1, 1],
"2.0417": [1, 1, 1],
"2.1667": [0.9, 1.2, 0.9],
"2.2083": [1, 0.1, 1],
"2.5833": [1, 0.1, 1],
"2.7083": [1, 1, 1],
"3.0": [1, 1, 1]
}
},
"body1_2": {
"rotation": {
"0.0": {
"post": [-1.73205, 0, -2.59808],
"lerp_mode": "catmullrom"
},
"0.0833": {
"post": [8.2679, 0, -2.5981],
"lerp_mode": "catmullrom"
},
"0.25": {
"post": [-6.7321, 0, -2.5981],
"lerp_mode": "catmullrom"
},
"0.625": {
"post": [10.7679, 0, -2.5981],
"lerp_mode": "catmullrom"
},
"0.6667": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"2.6667": {
"post": [2.4019, 0, 0],
"lerp_mode": "catmullrom"
},
"2.875": {
"post": [-2.59808, 0, 0],
"lerp_mode": "catmullrom"
},
"3.0": {
"post": [-1.73205, 0, -2.59808],
"lerp_mode": "catmullrom"
}
},
"position": {
"0.0": [0, 0, 0],
"0.625": [0, 0, 0],
"0.6667": [0, -5, 0],
"1.1667": [0, -5, 0],
"1.25": [0, -2, 0],
"2.6667": [0, -4, 0],
"2.875": [0, 0, 0],
"3.0": [0, 0, 0]
}
},
"body2": {
"rotation": {
"0.0": {
"post": [3.9762, 6.495, 10.7976],
"lerp_mode": "catmullrom"
},
"0.125": {
"post": [10.3891, 24.9296, 12.6481],
"lerp_mode": "catmullrom"
},
"0.2083": {
"post": [1.3318, 51.3394, 15.2992],
"lerp_mode": "catmullrom"
},
"0.4167": {
"post": [-3.8835, 53.834, 15.0282],
"lerp_mode": "catmullrom"
},
"0.5": {
"post": [7.6917, 14.8915, -0.6214],
"lerp_mode": "catmullrom"
},
"0.5417": {
"post": [0, 17.5, 0],
"lerp_mode": "catmullrom"
},
"1.1667": {
"post": [3.28242, -7.51775, -0.56308],
"lerp_mode": "catmullrom"
},
"1.25": {
"post": [42.509, -8.8475, 30.2404],
"lerp_mode": "catmullrom"
},
"1.6667": {
"post": [42.509, -8.8475, 30.2404],
"lerp_mode": "catmullrom"
},
"1.875": {
"post": [10.6615, -8.0683, 18.5147],
"lerp_mode": "catmullrom"
},
"2.125": {
"post": [0, 0, -0.2392],
"lerp_mode": "catmullrom"
},
"2.25": {
"post": [-0.38018, -0.04695, -0.49598],
"lerp_mode": "catmullrom"
},
"3.0": {
"post": [3.9762, 6.495, 10.7976],
"lerp_mode": "catmullrom"
}
},
"position": {
"0.0": {
"post": [0.7766, 0.14679, -0.3],
"lerp_mode": "catmullrom"
},
"0.125": {
"post": [0.78, -0.45, -0.3],
"lerp_mode": "catmullrom"
},
"0.3333": {
"post": [0.7766, 0.14679, -0.3],
"lerp_mode": "catmullrom"
},
"0.5": {
"post": [0.7766, 0.14679, -0.3],
"lerp_mode": "catmullrom"
},
"0.5417": {
"post": [0.78, -1.55, -0.3],
"lerp_mode": "catmullrom"
},
"1.1667": [0, -2.1, 0.2],
"1.25": {
"pre": [1.18301, -0.69289, -1.48301],
"post": [1.18301, -0.69289, -1.48301],
"lerp_mode": "catmullrom"
},
"1.2917": [0.9559, -1.11355, -0.74652],
"1.3333": [1.33194, -0.27231, -1.99076],
"1.375": [1.21126, -0.41201, -1.64918],
"1.6667": {
"pre": [0.88, -0.12, -1.05],
"post": [0.88, -0.12, -1.05],
"lerp_mode": "catmullrom"
},
"1.7917": {
"post": [1.27, 0.19, -0.61],
"lerp_mode": "catmullrom"
},
"2.125": {
"post": [0, 0.6, 0.2],
"lerp_mode": "catmullrom"
},
"2.2083": [0, -0.28, 0.21],
"2.25": [0, -2.1, 0.2],
"2.6667": [0, -2.1, 0.2],
"2.8333": {
"pre": [0, 0, 0],
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"3.0": {
"post": [0.7766, 0.14679, -0.3],
"lerp_mode": "catmullrom"
}
},
"scale": {
"0.5": [1, 1, 1],
"0.5417": [0.9, 1, 0.9],
"0.5833": [1, 0.1, 1],
"1.1667": [1, 0.1, 1],
"1.25": [0.9, 1.2, 0.9],
"1.3333": [1, 1, 1],
"2.0833": [1, 1, 1],
"2.2083": [0.9, 1.2, 0.9],
"2.25": [1, 0.1, 1],
"2.6667": [1, 0.1, 1],
"2.7917": [1, 1, 1],
"3.0": [1, 1, 1]
}
},
"body3": {
"rotation": {
"0.0": {
"post": [2.0871, -1.0039, 7.5008],
"lerp_mode": "catmullrom"
},
"0.2917": {
"post": [-0.4129, -1.0039, 7.5008],
"lerp_mode": "catmullrom"
},
"0.4583": {
"post": [4.454, -1.0178, 6.3469],
"lerp_mode": "catmullrom"
},
"0.6667": {
"post": [-7.8238, -1.0361, "2.5001+math.sin(q.anim_time*90*6-60)*3"],
"lerp_mode": "catmullrom"
},
"0.9167": {
"post": [-26.56, -1.04, "2.26+math.sin(q.anim_time*90*6-60)*5"],
"lerp_mode": "catmullrom"
},
"1.1667": {
"post": [-35.3238, -1.0361, 2.5001],
"lerp_mode": "catmullrom"
},
"1.2083": {
"post": [32.1762, -1.0361, 2.5001],
"lerp_mode": "catmullrom"
},
"1.25": {
"post": [65.145, -1.0361, 2.5001],
"lerp_mode": "catmullrom"
},
"1.2917": {
"post": [59.6762, -1.0361, 2.5001],
"lerp_mode": "catmullrom"
},
"1.6667": {
"post": [59.6762, -1.0361, 2.5001],
"lerp_mode": "catmullrom"
},
"2.125": {
"post": [15.1947, -1.0361, 2.5001],
"lerp_mode": "catmullrom"
},
"2.2083": {
"post": [2.6947, -1.0361, 2.5001],
"lerp_mode": "catmullrom"
},
"3.0": {
"post": [2.0871, -1.0039, 7.5008],
"lerp_mode": "catmullrom"
}
},
"position": {
"0.0": {
"post": [0, -0.3, 0],
"lerp_mode": "catmullrom"
},
"1.1667": [0, -0.23, 1],
"1.2083": [0, -0.23, -3.04],
"1.25": [0, 0.47, -2.96],
"1.2917": [0, -0.6, -2.87],
"1.3333": [0, 0.05, -2.79],
"1.375": [0, -0.3, -2.7],
"1.4167": [0, 0, -2.62],
"1.5833": [0, -0.25, -2.28],
"2.2083": [0, -0.3, 0],
"2.25": [0, -1.3, 0],
"2.75": [0, -2.1, 0.2],
"2.875": {
"pre": [0, 0, 0],
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"3.0": {
"post": [0, -0.3, 0],
"lerp_mode": "catmullrom"
}
},
"scale": {
"0.0": [1, 1, 1],
"1.125": [1, 1, 1],
"1.2083": [0.8, 1, 1.35],
"1.25": {"pre": [0.8, 1, 1.35], "post": [1.2, 1, 0.9]},
"1.3333": [1, 1, 1],
"2.2083": [1, 1, 1],
"2.2917": [1, 0.1, 1],
"2.75": [1, 0.1, 1],
"2.8333": [1, 1, 1],
"3.0": [1, 1, 1]
}
},
"body3_2": {
"rotation": {
"0.0": {
"post": [1.28558, 0, 1.92836],
"lerp_mode": "catmullrom"
},
"0.2083": {
"post": ["23.7856-math.sin(q.anim_time*90*16)*7.5", 0, 1.9284],
"lerp_mode": "catmullrom"
},
"0.4583": {
"post": [31.2856, 0, 1.9284],
"lerp_mode": "catmullrom"
},
"0.6667": {
"post": [23.35, 0, 1.93],
"lerp_mode": "catmullrom"
},
"0.875": {
"post": [8.7856, 0, "1.9284+math.sin(q.anim_time*90*6-120)*15"],
"lerp_mode": "catmullrom"
},
"1.125": {
"post": [-43.1823, 0, 1.9284],
"lerp_mode": "catmullrom"
},
"1.2083": {
"post": [-57.1266, 0, 1.9284],
"lerp_mode": "catmullrom"
},
"1.25": {
"post": [21.2856, 0, 1.9284],
"lerp_mode": "catmullrom"
},
"1.375": {
"post": [27.6157, 0, 1.9284],
"lerp_mode": "catmullrom"
},
"1.5833": {
"post": [26.5571, 0, 1.994],
"lerp_mode": "catmullrom"
},
"1.8333": {
"post": [44.7157, 0, 2.0597],
"lerp_mode": "catmullrom"
},
"2.125": {
"post": [13.7856, 0, 1.9284],
"lerp_mode": "catmullrom"
},
"2.25": {
"post": [-15.4247, 0, 0.3886],
"lerp_mode": "catmullrom"
},
"2.2917": {
"post": [0, 0, 0],
"lerp_mode": "catmullrom"
},
"2.75": {
"post": [2.4019, 0, 0],
"lerp_mode": "catmullrom"
},
"2.9167": {
"post": [-2.59808, 0, 0],
"lerp_mode": "catmullrom"
},
"3.0": {
"post": [1.28558, 0, 1.92836],
"lerp_mode": "catmullrom"
}
},
"position": {
"0.0": [0, 0, 0],
"0.7083": [0, 0, 0],
"0.9583": [0, 0, 0],
"1.125": [-0.05508, -1.63581, -0.30179],
"1.2083": [-0.05508, -1.63581, -0.30179],
"1.25": [0, 0, 0],
"2.25": [0, 0, 0],
"2.3333": [0, -8, 0],
"2.75": [0, -4, 0],
"2.9167": [0, 0, 0],
"3.0": [0, 0, 0]
}
},
"eye_left2": {
"position": {
"0.0": [0, 0, 0],
"0.2083": {"pre": [0, 0, 0], "post": [-0.5, 0, 0]},
"0.4583": {"pre": [-0.5, 0, 0], "post": [0, 0, 0]}
}
},
"eyelid_left2": {
"position": {
"0.0": [0, 0, 0],
"0.0833": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"0.2083": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"0.4583": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.25": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"1.625": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.9583": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"3.0": [0, 0, 0]
}
},
"eyelid_recoil_left2": {
"position": {
"0.0": [0, 0, 0],
"1.25": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.625": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"3.0": [0, 0, 0]
}
},
"eye_right2": {
"position": {
"0.0": [0, 0, 0],
"0.2083": {"pre": [0, 0, 0], "post": [-0.5, 0, 0]},
"0.4583": {"pre": [-0.5, 0, 0], "post": [0, 0, 0]}
}
},
"pupil_right2": {
"position": [0, 0, 0]
},
"eyelid_right2": {
"position": {
"0.0": [0, 0, 0],
"0.0833": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"0.2083": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"0.4583": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.25": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"1.625": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.9583": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"eyelid_happy_right2": {
"position": [1, 0, 0]
},
"eyelid_recoil_right2": {
"position": {
"0.0": [0, 0, 0],
"1.25": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.625": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"eye_left1": {
"position": {
"0.0": [0, 0, 0],
"0.1667": {"pre": [0, 0, 0], "post": [0.5, 0, 0]},
"0.5833": {"pre": [0.5, 0, 0], "post": [0, 0, 0]}
}
},
"eye_angry_left1": {
"position": {
"0.0": [0, 0, 0],
"1.875": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"2.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"3.0": [0, 0, 0]
}
},
"eyelid_left1": {
"position": {
"0.0": [0, 0, -0.1],
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"0.5833": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.25": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"1.5": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.875": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"2.1667": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"2.7917": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"eyelid_happy_left1": {
"position": [-1, 0, 0]
},
"eyelid_recoil_left1": {
"position": {
"0.0": [0, 0, 0],
"1.25": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.5": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"eye_right1": {
"position": {
"0.0": [0, 0, 0],
"0.1667": {"pre": [0, 0, 0], "post": [0.5, 0, 0]},
"0.5833": {"pre": [0.5, 0, 0], "post": [0, 0, 0]}
}
},
"eye_angry_right1": {
"position": {
"0.0": [0, 0, 0],
"0.1667": {"pre": [0, 0, 0], "post": [0, -0.5, -0.1]},
"1.875": {"pre": [0, -0.5, -0.1], "post": [0, 0, -0.1]},
"2.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"3.0": [0, 0, 0]
}
},
"eyelid_right1": {
"position": {
"0.0": [0, 0, -0.1],
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"0.5833": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.25": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"1.5": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.875": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"2.1667": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"2.7917": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"eyelid_recoil_right1": {
"position": {
"0.0": [0, 0, 0],
"1.25": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.5": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"3.0": [0, 0, 0]
}
},
"eyelid_left3": {
"position": {
"0.0": [0, 0, 0],
"0.2083": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"0.5833": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"0.7083": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.0": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"1.3333": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"2.0833": {"pre": [0, 0, -0.1], "post": [0, 0, 0.1]},
"2.25": {"pre": [0, 0, 0.1], "post": [0, 0, -0.1]},
"2.875": {"pre": [0, 0, -0.1], "post": [0, 0, 0.1]}
}
},
"eyelid_recoil_left3": {
"position": {
"0.0": [0, 0, 0],
"1.0": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.3333": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
},
"eyelid_right3": {
"position": {
"0.0": [0, 0, 0],
"0.2083": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"0.5833": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"0.7083": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.0": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"1.3333": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"2.0833": {"pre": [0, 0, -0.1], "post": [0, 0, 0.1]},
"2.25": {"pre": [0, 0, 0.1], "post": [0, 0, -0.1]},
"2.875": {"pre": [0, 0, -0.1], "post": [0, 0, 0.1]}
}
},
"eyelid_recoil_right3": {
"position": {
"0.0": [0, 0, 0],
"1.0": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.3333": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"3.0": [0, 0, 0]
}
}
}
},
"animation.dugtrio_alolan.faint": {
"loop": "hold_on_last_frame",
"animation_length": 3,
@@ -327,29 +1033,59 @@
"eyelid_left1": {
"position": {
"0.2917": [0, 0, 0],
"0.3333": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"0.3333": {
"pre": [0, 0, 0],
"post": [0, 0, -0.1]
},
"0.4583": [0, 0, -0.1],
"0.5": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"0.5": {
"pre": [0, 0, -0.1],
"post": [0, 0, 0]
},
"1.25": [0, 0, 0],
"1.2917": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.2917": {
"pre": [0, 0, 0],
"post": [0, 0, -0.1]
},
"1.4167": [0, 0, -0.1],
"1.4583": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"1.4583": {
"pre": [0, 0, -0.1],
"post": [0, 0, 0]
},
"1.75": [0, 0, 0],
"1.7917": {"pre": [0, 0, 0], "post": [0, 0, -0.1]}
"1.7917": {
"pre": [0, 0, 0],
"post": [0, 0, -0.1]
}
}
},
"eyelid_right1": {
"position": {
"0.2917": [0, 0, 0],
"0.3333": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"0.3333": {
"pre": [0, 0, 0],
"post": [0, 0, -0.1]
},
"0.4583": [0, 0, -0.1],
"0.5": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"0.5": {
"pre": [0, 0, -0.1],
"post": [0, 0, 0]
},
"1.25": [0, 0, 0],
"1.2917": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.2917": {
"pre": [0, 0, 0],
"post": [0, 0, -0.1]
},
"1.4167": [0, 0, -0.1],
"1.4583": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"1.4583": {
"pre": [0, 0, -0.1],
"post": [0, 0, 0]
},
"1.75": [0, 0, 0],
"1.7917": {"pre": [0, 0, 0], "post": [0, 0, -0.1]}
"1.7917": {
"pre": [0, 0, 0],
"post": [0, 0, -0.1]
}
}
},
"ground2": {
@@ -371,29 +1107,59 @@
"eyelid_left2": {
"position": {
"0.125": [0, 0, 0],
"0.1667": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"0.1667": {
"pre": [0, 0, 0],
"post": [0, 0, -0.1]
},
"0.2917": [0, 0, -0.1],
"0.3333": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"0.3333": {
"pre": [0, 0, -0.1],
"post": [0, 0, 0]
},
"0.7083": [0, 0, 0],
"0.75": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"0.75": {
"pre": [0, 0, 0],
"post": [0, 0, -0.1]
},
"0.875": [0, 0, -0.1],
"0.9167": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"0.9167": {
"pre": [0, 0, -0.1],
"post": [0, 0, 0]
},
"1.0417": [0, 0, 0],
"1.0833": {"pre": [0, 0, 0], "post": [0, 0, -0.1]}
"1.0833": {
"pre": [0, 0, 0],
"post": [0, 0, -0.1]
}
}
},
"eyelid_right2": {
"position": {
"0.125": [0, 0, 0],
"0.1667": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"0.1667": {
"pre": [0, 0, 0],
"post": [0, 0, -0.1]
},
"0.2917": [0, 0, -0.1],
"0.3333": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"0.3333": {
"pre": [0, 0, -0.1],
"post": [0, 0, 0]
},
"0.7083": [0, 0, 0],
"0.75": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"0.75": {
"pre": [0, 0, 0],
"post": [0, 0, -0.1]
},
"0.875": [0, 0, -0.1],
"0.9167": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"0.9167": {
"pre": [0, 0, -0.1],
"post": [0, 0, 0]
},
"1.0417": [0, 0, 0],
"1.0833": {"pre": [0, 0, 0], "post": [0, 0, -0.1]}
"1.0833": {
"pre": [0, 0, 0],
"post": [0, 0, -0.1]
}
}
},
"ground3": {
@@ -415,29 +1181,59 @@
"eyelid_left3": {
"position": {
"0.0": [0, 0, 0],
"0.0417": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"0.0417": {
"pre": [0, 0, 0],
"post": [0, 0, -0.1]
},
"0.1667": [0, 0, -0.1],
"0.2083": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"0.2083": {
"pre": [0, 0, -0.1],
"post": [0, 0, 0]
},
"1.25": [0, 0, 0],
"1.2917": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.2917": {
"pre": [0, 0, 0],
"post": [0, 0, -0.1]
},
"1.4167": [0, 0, -0.1],
"1.4583": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"1.4583": {
"pre": [0, 0, -0.1],
"post": [0, 0, 0]
},
"2.375": [0, 0, 0],
"2.4167": {"pre": [0, 0, 0], "post": [0, 0, -0.1]}
"2.4167": {
"pre": [0, 0, 0],
"post": [0, 0, -0.1]
}
}
},
"eyelid_right3": {
"position": {
"0.0": [0, 0, 0],
"0.0417": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"0.0417": {
"pre": [0, 0, 0],
"post": [0, 0, -0.1]
},
"0.1667": [0, 0, -0.1],
"0.2083": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"0.2083": {
"pre": [0, 0, -0.1],
"post": [0, 0, 0]
},
"1.25": [0, 0, 0],
"1.2917": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.2917": {
"pre": [0, 0, 0],
"post": [0, 0, -0.1]
},
"1.4167": [0, 0, -0.1],
"1.4583": {"pre": [0, 0, -0.1], "post": [0, 0, 0]},
"1.4583": {
"pre": [0, 0, -0.1],
"post": [0, 0, 0]
},
"2.375": [0, 0, 0],
"2.4167": {"pre": [0, 0, 0], "post": [0, 0, -0.1]}
"2.4167": {
"pre": [0, 0, 0],
"post": [0, 0, -0.1]
}
}
}
}
@@ -463,14 +1259,20 @@
"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]
}
}
},
"eyelid_left1": {
"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]
}
}
}
}
@@ -496,14 +1298,20 @@
"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]
}
}
},
"eyelid_left2": {
"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]
}
}
}
}
@@ -529,14 +1337,20 @@
"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]
}
}
},
"eyelid_left3": {
"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]
}
}
}
}

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