forked from mirrors/cobblemon
Compare commits
269
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c346f84844 | ||
|
|
d1b8094539 | ||
|
|
b8d79af911 | ||
|
|
a7198fd324 | ||
|
|
bc69ce91f3 | ||
|
|
1de1d8cdc3 | ||
|
|
087bf75500 | ||
|
|
bac435ba7b | ||
|
|
74a6106eb6 | ||
|
|
5ec993ad3c | ||
|
|
73a03d90da | ||
|
|
e6fda6137e | ||
|
|
afae39acc8 | ||
|
|
37264aff0f | ||
|
|
2b60e6de77 | ||
|
|
4f29e7457c | ||
|
|
04a6ab31f4 | ||
|
|
a2cdc847dd | ||
|
|
0bca678f56 | ||
|
|
067c3607aa | ||
|
|
823c1f6444 | ||
|
|
bfc00635cd | ||
|
|
b2e5b85ac5 | ||
|
|
2c27476954 | ||
|
|
aab78d84fc | ||
|
|
cb632c2a65 | ||
|
|
8d219f1338 | ||
|
|
1e6a4ed984 | ||
|
|
64240c31fc | ||
|
|
d2222c3858 | ||
|
|
c7f31c3e14 | ||
|
|
740e846b2d | ||
|
|
246d00aa3f | ||
|
|
06f9d60595 | ||
|
|
d54439ce14 | ||
|
|
32ee4bb72a | ||
|
|
e7d2a46cc0 | ||
|
|
3ee94ec076 | ||
|
|
589293abc4 | ||
|
|
279865cc7c | ||
|
|
b597b149c3 | ||
|
|
b7f592f2a8 | ||
|
|
70e17c22e7 | ||
|
|
51b18ca0f6 | ||
|
|
a83f243a3b | ||
|
|
f5b088c708 | ||
|
|
dc454cbb68 | ||
|
|
3b99e38da2 | ||
|
|
483af57964 | ||
|
|
a941bdddf3 | ||
|
|
246ba4a93b | ||
|
|
3347c084ed | ||
|
|
8175cee454 | ||
|
|
37d54053a5 | ||
|
|
b8846bd74c | ||
|
|
1716e135c4 | ||
|
|
0ac804cfcb | ||
|
|
aecc132814 | ||
|
|
8b47876dff | ||
|
|
ffc108953a | ||
|
|
0a106174fe | ||
|
|
90210bee3c | ||
|
|
8603cd4ad0 | ||
|
|
7b2c6827c2 | ||
|
|
902b4a6d21 | ||
|
|
a847cb5926 | ||
|
|
050c6f5adc | ||
|
|
fb95fb3cf7 | ||
|
|
d507367411 | ||
|
|
faa19cebcb | ||
|
|
aced374367 | ||
|
|
d424a6f1d3 | ||
|
|
71bb1c32de | ||
|
|
f726fcedb9 | ||
|
|
77344ccc2f | ||
|
|
90bc16be90 | ||
|
|
d1b743a01f | ||
|
|
aed651c0a0 | ||
|
|
4c477e1675 | ||
|
|
d1cdc6789c | ||
|
|
cd3127b983 | ||
|
|
68f5eff048 | ||
|
|
c3d2918a2b | ||
|
|
0432525c06 | ||
|
|
a60f27e282 | ||
|
|
5f0182cb7e | ||
|
|
4a3ae9407b | ||
|
|
766c2838d2 | ||
|
|
4cb95589b4 | ||
|
|
a8d3c2dd52 | ||
|
|
cb5d7b6ad7 | ||
|
|
c7dcc64595 | ||
|
|
6573e08da7 | ||
|
|
cd695ade4a | ||
|
|
55cb413cfc | ||
|
|
4f1bf7fcbb | ||
|
|
154ee80ead | ||
|
|
1c9f9bb198 | ||
|
|
6836343f11 | ||
|
|
aa0d1cd943 | ||
|
|
798f1da8b3 | ||
|
|
d98efb52b6 | ||
|
|
2f27a03f08 | ||
|
|
e33025b1fa | ||
|
|
ade2481f42 | ||
|
|
576e2301ce | ||
|
|
a568d45d75 | ||
|
|
bc19a7e4c1 | ||
|
|
616e438f17 | ||
|
|
9bb11c46d5 | ||
|
|
5f470bb703 | ||
|
|
276f13cea5 | ||
|
|
ac069687f1 | ||
|
|
f248c22eed | ||
|
|
65a5687f92 | ||
|
|
ea50fa534b | ||
|
|
4bd3c4af58 | ||
|
|
283d80f7ed | ||
|
|
0238ca80f0 | ||
|
|
d24c5fe874 | ||
|
|
e65e21f2ff | ||
|
|
e1d417718f | ||
|
|
d4308b0a4f | ||
|
|
56650418d2 | ||
|
|
0543b84d34 | ||
|
|
1f50687a59 | ||
|
|
ed04faf0d8 | ||
|
|
1ed020f3e0 | ||
|
|
7e385d8c94 | ||
|
|
ee509b5438 | ||
|
|
ac9394131c | ||
|
|
d058a306a7 | ||
|
|
b9be0c3fcb | ||
|
|
b59b46568a | ||
|
|
408cbc8c49 | ||
|
|
a8ce3c2175 | ||
|
|
80ae127379 | ||
|
|
bd3a9fb3af | ||
|
|
d0eaccb81b | ||
|
|
0b531d967e | ||
|
|
b0d1aec9ab | ||
|
|
f4d47098b5 | ||
|
|
1989b8aa92 | ||
|
|
e290fe9c75 | ||
|
|
06a50cfeeb | ||
|
|
00888c8ad5 | ||
|
|
3963e83717 | ||
|
|
7893e365da | ||
|
|
b6a7051b2c | ||
|
|
2cb1cf2f83 | ||
|
|
f13a4e0e24 | ||
|
|
17e1bbd6a1 | ||
|
|
c36ff0a0fe | ||
|
|
8dbb350230 | ||
|
|
52f9ffb1f6 | ||
|
|
030195e3ff | ||
|
|
d21a52ae68 | ||
|
|
3c1f1dbacb | ||
|
|
787c4851ff | ||
|
|
bf6e7fafd3 | ||
|
|
ea6df764c0 | ||
|
|
f242de272d | ||
|
|
5232e2e9bc | ||
|
|
ca35898243 | ||
|
|
869457d235 | ||
|
|
6736c8160b | ||
|
|
243c50550d | ||
|
|
fe7d3ef23a | ||
|
|
57ad77fc39 | ||
|
|
d70e7bd1b3 | ||
|
|
254cc931ea | ||
|
|
01fe5cffe8 | ||
|
|
3e18995a37 | ||
|
|
ff161c9c9b | ||
|
|
6b7b4f326d | ||
|
|
f50f7dec29 | ||
|
|
a5def20c58 | ||
|
|
b23204f9c9 | ||
|
|
4972de0aaa | ||
|
|
58a1f3d7b4 | ||
|
|
f516edb858 | ||
|
|
161aa952fa | ||
|
|
3b26a13ad6 | ||
|
|
014189217a | ||
|
|
978debb40c | ||
|
|
5be707811e | ||
|
|
ac44a98f8a | ||
|
|
03ecc2ae8d | ||
|
|
1518379107 | ||
|
|
a58c8c59e1 | ||
|
|
37959b5048 | ||
|
|
cbcc9fc6f1 | ||
|
|
d236aaa7da | ||
|
|
a2cd5a671c | ||
|
|
1d6a45bf4d | ||
|
|
5bfe703ed7 | ||
|
|
fc8485388e | ||
|
|
a5593b3131 | ||
|
|
9541bf3267 | ||
|
|
1037fe0a0e | ||
|
|
a6eea3198a | ||
|
|
b28e2313a8 | ||
|
|
0f0b4e6c86 | ||
|
|
e033467054 | ||
|
|
0f092bf6bf | ||
|
|
66ba762360 | ||
|
|
c7c11838a0 | ||
|
|
301d80fabe | ||
|
|
fade5502d9 | ||
|
|
ce55035408 | ||
|
|
d4665ddaeb | ||
|
|
4375c6f667 | ||
|
|
f4a7c6e873 | ||
|
|
3bef1dad4a | ||
|
|
da50ee59cf | ||
|
|
6e8985d97e | ||
|
|
19c4c0d50d | ||
|
|
b23110950e | ||
|
|
60c213c44b | ||
|
|
3df8dea71b | ||
|
|
3cca50b7cc | ||
|
|
1ff5622694 | ||
|
|
411f388bd3 | ||
|
|
5b8d35604a | ||
|
|
619d002bc4 | ||
|
|
7049656f64 | ||
|
|
e6e7c2982d | ||
|
|
82686b0511 | ||
|
|
f4eca30163 | ||
|
|
2814183012 | ||
|
|
bbc3c2a8d6 | ||
|
|
7eeb7feeae | ||
|
|
b2f850c1c8 | ||
|
|
23db346070 | ||
|
|
d3b7d739bb | ||
|
|
eb6c134f4b | ||
|
|
aa0b8d88e8 | ||
|
|
3cf9425247 | ||
|
|
b5578e72bd | ||
|
|
3aea0909a4 | ||
|
|
5adef3336e | ||
|
|
1a96b418bc | ||
|
|
e373e86b60 | ||
|
|
6f3035184c | ||
|
|
7ae8b1957c | ||
|
|
824b9718ee | ||
|
|
ef43f6c087 | ||
|
|
c8a70caf79 | ||
|
|
ba11758e1f | ||
|
|
f0412d6b1d | ||
|
|
f5f87ce1a3 | ||
|
|
f28b269734 | ||
|
|
d545efd843 | ||
|
|
f8682c2123 | ||
|
|
f62e31a1eb | ||
|
|
ea623b08a6 | ||
|
|
ce3d5a413c | ||
|
|
d23fd6e23c | ||
|
|
59395a254d | ||
|
|
5d7c6c8d6f | ||
|
|
6529293d21 | ||
|
|
a1fce624ea | ||
|
|
b7773f7471 | ||
|
|
f927e47bfe | ||
|
|
48a37b2018 | ||
|
|
f6b2da6ed6 | ||
|
|
275779b20e | ||
|
|
2102f8ff88 | ||
|
|
8f462aab40 |
+14
-71
@@ -1,85 +1,28 @@
|
||||
# Changelog
|
||||
## [1.7.2 (MONTH Xth, YEAR)](#1-7-2)
|
||||
## [1.7.4 (MONTH Xth, 2026)](#1-7-4)
|
||||
|
||||
### Additions
|
||||
- Added riding statistics: `Distance by Pokémon on Land`, `Distance by Pokémon in Air` and `Distance by Pokémon in Liquid`.
|
||||
- Added the Partner Mark, which party Pokémon have a very small chance to earn as the player walks, provided they have enough friendship.
|
||||
- Added new effects
|
||||
- Mental Restoration: Reduces "Time Since Last Rest" statistic, which controls Insomnia, by half a minute per second per effect level
|
||||
- Negative Effect Cleanse: Removes all negative effects
|
||||
- Effect Cleanse: Removes all effects
|
||||
- Added more seasonings for sinister tea
|
||||
- Mental Herb - Mental Restoration I for 10 seconds
|
||||
- White Herb - Negative Effect Cleanse
|
||||
- Milk - Effect Cleanse
|
||||
- Moomoo Milk - Effect Cleanse
|
||||
- Added `label` as an alternate key to the `tag` property.
|
||||
- Added Saccharine wood furniture for Adorn.
|
||||
- Added block models for existing items: Potion, Super Potion, Hyper Potion, Max Potion, Full Restore, Antidote, Awakening, Burn Heal, Ice Heal, Paralyze Heal, Full Heal, Ether, Elixir, Max Ether, Max Elixir, X Accuracy, X Attack, X Defence, X Special Attack, X Special Defence, X Speed, Dire Hit, Guard Spec, Weakness Policy, Blunder Policy, Cleanse Tag, and Spell Tag.
|
||||
- Added decorative sign blocks, Plaques.
|
||||
- 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??!
|
||||
|
||||
### New rideable Pokémon
|
||||
|
||||
### Pokémon Added
|
||||
|
||||
### Model updates for the following Pokémon
|
||||
|
||||
### Animation updates for the following Pokémon
|
||||
|
||||
### Changes
|
||||
- Ride sounds have been separated into stereo for passengers and mono for other players. Riding will now sound more spacious.
|
||||
- Added a new config option, `Enable In-Flight Dismounting` (default: off), which lets you dismount while riding a Pokémon in the air.
|
||||
- Battle AI now uses a smarter threshold for switching, reducing unnecessary switches.
|
||||
- AI will always use the most damaging move when at low HP and when it is not switching, improving endgame decision-making.
|
||||
- Added support for optional message variants in battle activate instructions for more context-specific battle text.
|
||||
- Example: `this.add('-activate', pokemon, 'ability: example', '[msg]message1');` will parse to lang key `cobblemon.battle.activate.example.message1`
|
||||
|
||||
### Fixes
|
||||
- Fixed an issue in the OmniPathNodeMaker/Navigation that prevented Combee from pathing into and out of Saccharine Leaves.
|
||||
- Fixed orientation not getting reset after crashing while flying and getting back on the Pokémon.
|
||||
- Fixed Furfrou not being trimmable on NeoForge.
|
||||
- Fixed shiny Pokémon not respecting the silent flag on spawn.
|
||||
- Fixed honey from Saccharine Leaves being harvestable at less than the max age.
|
||||
- Items given from interacting with Saccharine Leaves are placed in the active hotbar slot if possible.
|
||||
- Fix all Pokémon being saved to chunks and never despawning.
|
||||
- Fixed possible error on world generation when Combee are placed in naturally generated bee nests.
|
||||
- Fixed Poké Snacks crashing if there was no available spawn.
|
||||
- Fixed Pokémon spawn influences not being specific to regional forms.
|
||||
- Fixed crashing when viewing another player in spectator mode.
|
||||
- Fixed missing apricorn textures for Adorn blocks.
|
||||
- Fixed crashing when riding due to malformed json file instead of resetting it.
|
||||
- Fixed mochi items consuming two items at a time.
|
||||
- Fix item interaction sometimes not working properly when playing on servers.
|
||||
- Fixed Soothe Bell not being properly tagged as a held item.
|
||||
- Fixed Mint Leaves not being usable for filling the Resurrection Machine.
|
||||
- Added Saccharine Boats and Saccharine Boat with Chests to relevant boat tags.
|
||||
- Fixed the `run_script` Molang function to not fail if the environment's context is null.
|
||||
- Fixed battle item duplication issue.
|
||||
- Fixed the movesets of certain Pokémon being incorrectly sanitized upon reload.
|
||||
- Fixed the ordering of Aprijuice's riding stat boosts to always have the same order.
|
||||
- Fixed the Molang functions `date_local_time`, `date_of`, `date_is_after` to use the correct date format.
|
||||
- Fixed the bottom half of pasture blocks having an incorrect hit-box when facing north or south.
|
||||
- Fixed Galarian Mr. Mime incorrectly being rideable.
|
||||
- Fixed gimmicks not being usable in double / triple battles.
|
||||
- Fixed gimmick buttons showing when already used in the same turn in double / triple battles.
|
||||
- Fixed Apricorn block model rotation for counters/sinks/cupboards/drawers to match that of most recent version of Adorn.
|
||||
- Fixed Fresh Start Mochi EV reset not syncing health changes properly.
|
||||
- Fixed requirements such as `biomeCondition` crashing the game when used to define Pokémon interactions.
|
||||
- Fixed Pokémon interactions not playing sound effects when the volume was not specified.
|
||||
- Fixed Pokémon interaction cooldowns taking longer than intended when the Pokémon was in the player’s party.
|
||||
- Fixed Pokémon interactions occasionally crashing the game when spamming an interaction with a 0 cooldown.
|
||||
- Fixed Pokémon fullness decreasing more than intended when the Pokémon was pastured.
|
||||
- Fixed crashing when sending a Pokémon out after editing its form.
|
||||
- Fixed Super Potion recipes incorrectly using Hondew Berry instead of Aguav Berry.
|
||||
- Fixed `/calculateseatpositions` expecting a locator format that even we don't use. It needs an underscore after "seat".
|
||||
- Fixed invulnerability-bypassed damage being resisted by invulnerable NPC entities.
|
||||
- Fixed selected leading Pokémon in battle not being used when levels are raised.
|
||||
- Fixed killer not being set early enough on a wild wild Pokémon entity from WinInstruction.
|
||||
- Fixes https://gitlab.com/cable-mc/cobblemon/-/issues/1943
|
||||
- Fix occasional crash on retrieving revived fossils
|
||||
- Fixed a compatibility issue with World Game Rules which caused some log spam in specific cases.
|
||||
- Fixed improper validation of Pokémon when performing a trade.
|
||||
|
||||
### Developer
|
||||
- Changed the `owner` parameter in the `OwnerQueryRequirement` interface from `ServerPlayer` to `Player`. This method is now also called on the client to verify whether a Pokémon interaction succeeded, so make sure to update your implementations to handle both server and client contexts.
|
||||
- Added `pnx` to the `BattleFaintedEvent` and `FormeChangeEvent`.
|
||||
- Added register methods for custom instructions to `ShowdownInterpreter`.
|
||||
- Changed callback operations in `BattlePokemon` to allow multiple callbacks and is now mutable.
|
||||
|
||||
### Molang & Datapacks
|
||||
- Ride sounds can now be set as exclusive to passengers.
|
||||
- Ride sounds no longer play when submerged unless specified with a new setting.
|
||||
- Exception handling has been added to `run_molang`, resolving some crashes caused by malformed MoLang expressions.
|
||||
|
||||
### Particles
|
||||
|
||||
### Localization
|
||||
- Updated translations for:
|
||||
|
||||
@@ -0,0 +1,137 @@
|
||||
# Changelog
|
||||
## [1.7.2 (January 25th, 2026)](#1-7-2)
|
||||
|
||||
### Additions
|
||||
- Added Saccharine wood furniture for Adorn.
|
||||
- Added the Partner Mark, which party Pokémon have a very small chance to earn as the player walks, provided they have enough friendship.
|
||||
- Added decorative block models for existing items: Potion, Super Potion, Hyper Potion, Max Potion, Full Restore, Antidote, Awakening, Burn Heal, Ice Heal, Paralyze Heal, Full Heal, Ether, Elixir, Max Ether, Max Elixir, X Accuracy, X Attack, X Defence, X Special Attack, X Special Defence, X Speed, Dire Hit, Guard Spec, Weakness Policy, Blunder Policy, Cleanse Tag, and Spell Tag.
|
||||
- Added decorative sign blocks called Plaques.
|
||||
- Added ride style labels to ride stats in Pokédex, as well as ride style icons in the summary GUI.
|
||||
- Added more seasonings for sinister tea:
|
||||
- Mental Herb - Mental Restoration I for 10 seconds, which staves off Insomnia.
|
||||
- White Herb - Removes negative effects.
|
||||
- Milk, Moomoo Milk - Removes effects.
|
||||
- Added dispenser support for:
|
||||
- Applying a Honey Bottle to Saccharine Logs.
|
||||
- Washing honey off of Saccharine Slathered Logs.
|
||||
- Applying and removing honey on Saccharine Leaves.
|
||||
- Added riding statistics: `Distance by Pokémon on Land`, `Distance by Pokémon in Air` and `Distance by Pokémon in Liquid`.
|
||||
|
||||
### New rideable Pokémon
|
||||
- Honchkrow
|
||||
- Mantine
|
||||
|
||||
### Pokémon Added
|
||||
|
||||
#### Gen 5
|
||||
- Throh
|
||||
- Sawk
|
||||
|
||||
#### Gen 6
|
||||
- Litleo
|
||||
- Pyroar
|
||||
- Spritzee
|
||||
- Aromatisse
|
||||
- Swirlix
|
||||
- Slurpuff
|
||||
|
||||
### Model updates for the following Pokémon
|
||||
- Falinks
|
||||
- Cottonee
|
||||
- Whimsicott
|
||||
- Ferroseed
|
||||
- Ferrothorn
|
||||
- Chingling
|
||||
- Chimecho
|
||||
|
||||
### Animation updates for the following Pokémon
|
||||
- Mantine (ride animations)
|
||||
- Flygon (ride jump animation)
|
||||
- Honchkrow (ride animations)
|
||||
- Croagunk
|
||||
- Toxicroak
|
||||
|
||||
### Changes
|
||||
- Added a new config option, `Enable In-Flight Dismounting` (default: off), which lets you dismount while riding a Pokémon in the air. This is the textbook definition of caveat emptor.
|
||||
- Ride sounds have been separated into stereo for passengers and mono for other players. Riding will now sound more spacious.
|
||||
- Battle AI now uses a smarter threshold for switching, reducing unnecessary switches.
|
||||
- AI will always use the most damaging move when at low HP and when it is not switching, improving endgame decision-making.
|
||||
- Items given from interacting with Saccharine Leaves are placed in the active hotbar slot if possible.
|
||||
- Added `label` as an alternate key to the `tag` property.
|
||||
|
||||
### Fixes
|
||||
- Fixed crashing when viewing another player in spectator mode. Some said this was reason to release this update a month ago. They were probably right.
|
||||
- Fixed crashing when sending a Pokémon out after editing its form.
|
||||
- Fixed all Pokémon being saved to chunks and never despawning even when they should be.
|
||||
- Fixed Poké Snacks crashing if there was no available spawn.
|
||||
- Fixed Poké Snack / Bait effects so that EV Yield, Type, and Egg Group filters now all apply together when weighting spawns. And you thought you were going crazy.
|
||||
- Fixed Furfrou not being trimmable on NeoForge specifically.
|
||||
- Fixed honey from Saccharine Leaves being harvestable at less than the max age.
|
||||
- Fixed possible error on world generation when Combee are placed in naturally generated bee nests.
|
||||
- Fixed Galarian Weezing crashing the world if it decides to blink the wrong way. The same could happen to you!
|
||||
- Fixed Galarian Mr. Mime incorrectly being rideable. Some would argue that regular Mr. Mime shouldn't be rideable, but that would make them wrong.
|
||||
- Fixed missing apricorn textures for Adorn blocks.
|
||||
- Fixed Apricorn block model rotation for counters/sinks/cupboards/drawers to match that of most recent version of Adorn.
|
||||
- Fixed item interaction sometimes not working properly when playing on servers.
|
||||
- Fixed Mint Leaves not being usable for filling the Resurrection Machine.
|
||||
- Fixed Super Potion recipes incorrectly using Hondew Berry instead of Aguav Berry. They look similar, to be fair.
|
||||
- Fixed Wishiwashi not schooling properly.
|
||||
- Fixed battle item duplication issue. How did it work? Wouldn't you like to know, weather boy.
|
||||
- Fixed the ordering of Aprijuice's riding stat boosts so they always have the same order.
|
||||
- Fixed the movesets of certain Pokémon being incorrectly sanitized upon reload, causing some forms to keep losing moves.
|
||||
- Fixed selected leading Pokémon in battle not being used when levels are set.
|
||||
- Fixed the bottom half of pasture blocks having an incorrect hit-box when facing north or south.
|
||||
- Fixed gimmicks not being usable in double and triple battles.
|
||||
- Fixed gimmick buttons showing when already used in the same turn in double and triple battles.
|
||||
- Fixed mochi items consuming two items at a time.
|
||||
- Fixed Fresh Start Mochi's EV reset not syncing health changes properly.
|
||||
- Fixed Pokémon spawn influences not being specific to regional forms.
|
||||
- Fixed memory leak from battles not being cleaned up after ending.
|
||||
- Fixed orientation not getting reset after crashing while flying and getting back on the Pokémon.
|
||||
- Fixed shiny Pokémon not respecting the `silent` flag on spawn.
|
||||
- Fixed 'Plain' prefix not being applied to all low-quality Aprijuice.
|
||||
- Fixed Pokémon interactions not playing sound effects when the volume was not specified.
|
||||
- Fixed Pokémon interaction cooldowns taking longer than intended when the Pokémon was in the player’s party.
|
||||
- Fixed Pokémon interactions occasionally crashing the game when spamming an interaction with a 0 cooldown.
|
||||
- Fixed Pokémon fullness decreasing more than intended when the Pokémon was pastured.
|
||||
- Fixed Scraggy line, Milcery line, and Morpeko spawning on unnatural blocks.
|
||||
- Fixed invulnerability-bypassed damage being resisted by invulnerable NPC entities.
|
||||
- Fixed Fabric network packets not being handled immediately, fixing incompatibilities with Supplementaries, Prometheus, Sleep Tight, and others.
|
||||
- Fixed killer not being set early enough on a wild Pokémon entity from `WinInstruction`.
|
||||
- Fixed requirements such as `biomeCondition` crashing the game when used to define Pokémon interactions.
|
||||
- Fixed an issue that prevented registering custom dispenser behaviours (no longer overrides vanilla behaviour).
|
||||
- Fixed an issue navigation that prevented Combee from pathing into and out of Saccharine Leaves.
|
||||
- Added Saccharine Boats and Saccharine Boat with Chests to relevant boat tags.
|
||||
- Fixed Soothe Bell not being properly tagged as a held item.
|
||||
- Fixed `/calculateseatpositions` expecting a locator format that even we don't use. It needs an underscore after "seat".
|
||||
- Fixed the `run_script` Molang function to not fail if the environment's context is null.
|
||||
- Fixed the Molang functions `date_local_time`, `date_of`, `date_is_after` to use the correct date format.
|
||||
|
||||
### Developer
|
||||
- Changed the `owner` parameter in the `OwnerQueryRequirement` interface from `ServerPlayer` to `Player`. This method is now also called on the client to verify whether a Pokémon interaction succeeded, so make sure to update your implementations to handle both server and client contexts.
|
||||
- Added the `pnx` to the `BattleFaintedEvent` and `FormeChangeEvent`.
|
||||
- Added register methods for custom instructions to `ShowdownInterpreter`.
|
||||
- Changed callback operations in `BattlePokemon` to allow multiple callbacks and be mutable.
|
||||
- Added `display_name`, `description`, and `max_pp` functions to the `MoveTemplate` struct.
|
||||
- Changed the implementations of `AIBattleActor` to be open classes to allow extension.
|
||||
- Changed the resource location of Poké Ball icons in the GUI to use the balls namespace instead of Cobblemon's, allowing mods to properly use their own namespace for these textures.
|
||||
|
||||
### Molang & Datapacks
|
||||
- Ride sounds can now be set as exclusive to passengers.
|
||||
- Ride sounds no longer play when submerged unless specified with a new setting.
|
||||
- Exception handling has been added to `run_molang`, resolving some crashes caused by malformed MoLang expressions.
|
||||
- Added the `create_itemstack`, `has_inventory_space`, `set_inventory_slot`, and `give_item` MoLang functions for item and inventory utility.
|
||||
- Added the `get_move_from_id` MoLang function for general move info queries without requiring a Moveset object to access.
|
||||
- Added support for optional message variants in battle activate instructions for more context-specific battle text.
|
||||
- Example: `this.add('-activate', pokemon, 'ability: example', '[msg]message1');` will parse to lang key `cobblemon.battle.activate.example.message1`.
|
||||
|
||||
### Localization
|
||||
- Updated translations for:
|
||||
- French
|
||||
- Canadian French
|
||||
- Simplified Chinese
|
||||
- Ukrainian
|
||||
- Brazilian Portuguese
|
||||
- Spanish
|
||||
- Korean
|
||||
- Japanese
|
||||
@@ -0,0 +1,23 @@
|
||||
# Changelog
|
||||
## [1.7.3 (January 31st, 2026)](#1-7-3)
|
||||
|
||||
### Fixes
|
||||
- Fixed mounted Pokémon not playing sounds.
|
||||
- Fixed players failing to join servers randomly.
|
||||
- Fixed some Pokémon having no stamina for flying.
|
||||
- Fixed `/pctake` not respecting the actual size of the PC.
|
||||
|
||||
### Developer
|
||||
- Poké Ball GUI textures now respect the ball's namespace, enabling proper texture loading for custom balls from other mods.
|
||||
|
||||
### Molang & Datapacks
|
||||
- Added a `chance` requirement type for Pokémon interactions.
|
||||
|
||||
### Localization
|
||||
- Updated translations for:
|
||||
- French
|
||||
- Canadian French
|
||||
- Korean
|
||||
- Portuguese
|
||||
- Simplified Chinese
|
||||
- Spanish
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.mixin.accessor;
|
||||
|
||||
import net.minecraft.world.item.Item;
|
||||
import net.minecraft.core.dispenser.DispenseItemBehavior;
|
||||
import net.minecraft.world.level.block.DispenserBlock;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.gen.Accessor;
|
||||
|
||||
@Mixin(DispenserBlock.class)
|
||||
public interface DispenserBlockAccessor {
|
||||
@Accessor("DISPENSER_REGISTRY")
|
||||
static Map<Item, DispenseItemBehavior> getItemBehaviors() {
|
||||
throw new AssertionError();
|
||||
}
|
||||
}
|
||||
@@ -35,6 +35,7 @@ import org.spongepowered.asm.mixin.Unique;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
import com.cobblemon.mod.common.client.gui.party.PartyTutorialToasts;
|
||||
|
||||
import static com.google.common.primitives.Floats.min;
|
||||
import static net.minecraft.util.Mth.lerp;
|
||||
@@ -85,11 +86,13 @@ public abstract class MouseHandlerMixin {
|
||||
CobblemonClient.INSTANCE.getStorage().shiftSelected(false);
|
||||
ci.cancel();
|
||||
PartySendBinding.INSTANCE.actioned();
|
||||
PartyTutorialToasts.INSTANCE.onHoldKeyScrollSwitchedSlot();
|
||||
} else if (i < 0) {
|
||||
accumulatedScrollY -= i;
|
||||
CobblemonClient.INSTANCE.getStorage().shiftSelected(true);
|
||||
ci.cancel();
|
||||
PartySendBinding.INSTANCE.actioned();
|
||||
PartyTutorialToasts.INSTANCE.onHoldKeyScrollSwitchedSlot();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -65,10 +65,14 @@ import com.cobblemon.mod.common.api.storage.player.adapter.PlayerDataMongoBacken
|
||||
import com.cobblemon.mod.common.api.storage.player.factory.CachedPlayerDataStoreFactory
|
||||
import com.cobblemon.mod.common.api.tags.CobblemonEntityTypeTags
|
||||
import com.cobblemon.mod.common.api.tags.CobblemonItemTags
|
||||
import com.cobblemon.mod.common.battles.*
|
||||
import com.cobblemon.mod.common.battles.BagItems
|
||||
import com.cobblemon.mod.common.battles.BattleFormat
|
||||
import com.cobblemon.mod.common.battles.BattleRegistry
|
||||
import com.cobblemon.mod.common.battles.BattleSide
|
||||
import com.cobblemon.mod.common.battles.ShowdownThread
|
||||
import com.cobblemon.mod.common.battles.actor.PokemonBattleActor
|
||||
import com.cobblemon.mod.common.battles.pokemon.BattlePokemon
|
||||
import com.cobblemon.mod.common.block.DispenserBehaviorRegistry
|
||||
import com.cobblemon.mod.common.block.dispenser.DispenserBehaviorRegistry
|
||||
import com.cobblemon.mod.common.client.CobblemonPack
|
||||
import com.cobblemon.mod.common.command.argument.*
|
||||
import com.cobblemon.mod.common.config.CobblemonConfig
|
||||
@@ -76,7 +80,12 @@ import com.cobblemon.mod.common.config.LastChangedVersion
|
||||
import com.cobblemon.mod.common.config.constraint.IntConstraint
|
||||
import com.cobblemon.mod.common.config.starter.StarterConfig
|
||||
import com.cobblemon.mod.common.data.CobblemonDataProvider
|
||||
import com.cobblemon.mod.common.events.*
|
||||
import com.cobblemon.mod.common.events.AdvancementHandler
|
||||
import com.cobblemon.mod.common.events.CallbackHandler
|
||||
import com.cobblemon.mod.common.events.EntityCallbackHandler
|
||||
import com.cobblemon.mod.common.events.PokedexHandler
|
||||
import com.cobblemon.mod.common.events.ServerTickHandler
|
||||
import com.cobblemon.mod.common.events.StatHandler
|
||||
import com.cobblemon.mod.common.net.messages.client.settings.ServerSettingsPacket
|
||||
import com.cobblemon.mod.common.permission.LaxPermissionValidator
|
||||
import com.cobblemon.mod.common.platform.events.PlatformEvents
|
||||
@@ -90,11 +99,23 @@ import com.cobblemon.mod.common.pokemon.feature.SlowpokeTailRegrowthSpeciesFeatu
|
||||
import com.cobblemon.mod.common.pokemon.feature.SlowpokeTailRegrowthSpeciesFeatureProvider
|
||||
import com.cobblemon.mod.common.pokemon.feature.TagSeasonResolver
|
||||
import com.cobblemon.mod.common.pokemon.helditem.CobblemonHeldItemManager
|
||||
import com.cobblemon.mod.common.pokemon.properties.*
|
||||
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.HiddenAbilityPropertyType
|
||||
import com.cobblemon.mod.common.pokemon.properties.LabelProperty
|
||||
import com.cobblemon.mod.common.pokemon.properties.NoAIProperty
|
||||
import com.cobblemon.mod.common.pokemon.properties.UnaspectPropertyType
|
||||
import com.cobblemon.mod.common.pokemon.properties.UncatchableProperty
|
||||
import com.cobblemon.mod.common.pokemon.stat.CobblemonStatProvider
|
||||
import com.cobblemon.mod.common.starter.CobblemonStarterHandler
|
||||
import com.cobblemon.mod.common.util.*
|
||||
import com.cobblemon.mod.common.util.DataKeys
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import com.cobblemon.mod.common.util.ifDedicatedServer
|
||||
import com.cobblemon.mod.common.util.isLaterVersion
|
||||
import com.cobblemon.mod.common.util.party
|
||||
import com.cobblemon.mod.common.util.requestWallpapers
|
||||
import com.cobblemon.mod.common.util.server
|
||||
import com.cobblemon.mod.common.world.feature.CobblemonPlacedFeatures
|
||||
import com.cobblemon.mod.common.world.feature.ore.CobblemonOrePlacedFeatures
|
||||
import com.cobblemon.mod.common.world.gamerules.CobblemonGameRules
|
||||
@@ -102,6 +123,17 @@ import com.mongodb.ConnectionString
|
||||
import com.mongodb.MongoClientSettings
|
||||
import com.mongodb.client.MongoClient
|
||||
import com.mongodb.client.MongoClients
|
||||
import java.io.File
|
||||
import java.io.FileReader
|
||||
import java.io.FileWriter
|
||||
import java.io.PrintWriter
|
||||
import java.util.UUID
|
||||
import java.util.concurrent.TimeUnit
|
||||
import kotlin.math.roundToInt
|
||||
import kotlin.properties.Delegates
|
||||
import kotlin.reflect.full.memberProperties
|
||||
import kotlin.reflect.jvm.isAccessible
|
||||
import kotlin.reflect.jvm.javaField
|
||||
import net.minecraft.client.Minecraft
|
||||
import net.minecraft.commands.synchronization.SingletonArgumentInfo
|
||||
import net.minecraft.resources.ResourceKey
|
||||
@@ -114,17 +146,6 @@ import net.minecraft.world.level.Level
|
||||
import net.minecraft.world.level.storage.LevelResource
|
||||
import org.apache.logging.log4j.LogManager
|
||||
import org.apache.logging.log4j.Logger
|
||||
import java.io.File
|
||||
import java.io.FileReader
|
||||
import java.io.FileWriter
|
||||
import java.io.PrintWriter
|
||||
import java.util.*
|
||||
import java.util.concurrent.TimeUnit
|
||||
import kotlin.math.roundToInt
|
||||
import kotlin.properties.Delegates
|
||||
import kotlin.reflect.full.memberProperties
|
||||
import kotlin.reflect.jvm.isAccessible
|
||||
import kotlin.reflect.jvm.javaField
|
||||
|
||||
object Cobblemon {
|
||||
const val MODID = CobblemonBuildDetails.MOD_ID
|
||||
@@ -165,7 +186,7 @@ object Cobblemon {
|
||||
val statistics: CobblemonStats = CobblemonStats
|
||||
|
||||
@JvmStatic
|
||||
val builtinPacks = listOf<CobblemonPack>(
|
||||
val builtinPacks = listOf(
|
||||
CobblemonPack(id = "adorncompatibility", name = "Adorn Compatibility", packType = PackType.CLIENT_RESOURCES, activationBehaviour = ResourcePackActivationBehaviour.ALWAYS_ENABLED, neededMods = setOf("adorn")),
|
||||
CobblemonPack(id = "gyaradosjump", name = "Gyarados Jump Patterns", packType = PackType.CLIENT_RESOURCES, activationBehaviour = ResourcePackActivationBehaviour.DEFAULT_ENABLED),
|
||||
CobblemonPack(id = "regionbiasforms", name = "Region Bias Forms", packType = PackType.CLIENT_RESOURCES, activationBehaviour = ResourcePackActivationBehaviour.DEFAULT_ENABLED),
|
||||
@@ -451,7 +472,7 @@ object Cobblemon {
|
||||
server()?.getLevel(dimension)
|
||||
} else {
|
||||
val mc = Minecraft.getInstance()
|
||||
return mc.singleplayerServer?.getLevel(dimension) ?: mc.level
|
||||
mc.singleplayerServer?.getLevel(dimension) ?: mc.level
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -21,12 +21,15 @@ import com.cobblemon.mod.common.client.net.callback.partymove.OpenPartyMoveCallb
|
||||
import com.cobblemon.mod.common.client.net.cooking.ToggleCookingPotLidHandler
|
||||
import com.cobblemon.mod.common.client.net.data.CobblemonMechanicsSyncHandler
|
||||
import com.cobblemon.mod.common.client.net.data.DataRegistrySyncPacketHandler
|
||||
import com.cobblemon.mod.common.client.net.data.PokemonInteractionsSyncHandler
|
||||
import com.cobblemon.mod.common.client.net.data.RideSettingsSyncHandler
|
||||
import com.cobblemon.mod.common.client.net.debug.OpenRidingStatsDebugGUIHandler
|
||||
import com.cobblemon.mod.common.client.net.dialogue.DialogueClosedHandler
|
||||
import com.cobblemon.mod.common.client.net.dialogue.DialogueOpenedHandler
|
||||
import com.cobblemon.mod.common.client.net.effect.*
|
||||
import com.cobblemon.mod.common.client.net.effect.PokeSnackBlockParticlesHandler
|
||||
import com.cobblemon.mod.common.client.net.effect.RunPosableMoLangHandler
|
||||
import com.cobblemon.mod.common.client.net.effect.SaccharineLogBlockParticlesHandler
|
||||
import com.cobblemon.mod.common.client.net.effect.SpawnSnowstormEntityParticleHandler
|
||||
import com.cobblemon.mod.common.client.net.effect.SpawnSnowstormParticleHandler
|
||||
import com.cobblemon.mod.common.client.net.gui.ExpGainedDataPacketHandler
|
||||
import com.cobblemon.mod.common.client.net.gui.InteractPokemonUIPacketHandler
|
||||
import com.cobblemon.mod.common.client.net.gui.PokedexUIPacketHandler
|
||||
@@ -34,7 +37,11 @@ import com.cobblemon.mod.common.client.net.gui.SummaryUIPacketHandler
|
||||
import com.cobblemon.mod.common.client.net.npc.CloseNPCEditorHandler
|
||||
import com.cobblemon.mod.common.client.net.npc.OpenNPCEditorHandler
|
||||
import com.cobblemon.mod.common.client.net.orientation.ClientboundUpdateOrientationHandler
|
||||
import com.cobblemon.mod.common.client.net.pasture.*
|
||||
import com.cobblemon.mod.common.client.net.pasture.ClosePastureHandler
|
||||
import com.cobblemon.mod.common.client.net.pasture.OpenPastureHandler
|
||||
import com.cobblemon.mod.common.client.net.pasture.PokemonPasturedHandler
|
||||
import com.cobblemon.mod.common.client.net.pasture.PokemonUnpasturedHandler
|
||||
import com.cobblemon.mod.common.client.net.pasture.UpdatePastureConflictFlagHandler
|
||||
import com.cobblemon.mod.common.client.net.pokedex.ServerConfirmedRegisterHandler
|
||||
import com.cobblemon.mod.common.client.net.pokemon.update.ClientboundUpdateRidingStateHandler
|
||||
import com.cobblemon.mod.common.client.net.pokemon.update.PokemonUpdatePacketHandler
|
||||
@@ -52,7 +59,14 @@ import com.cobblemon.mod.common.client.net.storage.party.SetPartyPokemonHandler
|
||||
import com.cobblemon.mod.common.client.net.storage.party.SetPartyReferenceHandler
|
||||
import com.cobblemon.mod.common.client.net.storage.pc.*
|
||||
import com.cobblemon.mod.common.client.net.toast.ToastPacketHandler
|
||||
import com.cobblemon.mod.common.client.net.trade.*
|
||||
import com.cobblemon.mod.common.client.net.trade.TradeAcceptanceChangedHandler
|
||||
import com.cobblemon.mod.common.client.net.trade.TradeCancelledHandler
|
||||
import com.cobblemon.mod.common.client.net.trade.TradeCompletedHandler
|
||||
import com.cobblemon.mod.common.client.net.trade.TradeOfferExpiredHandler
|
||||
import com.cobblemon.mod.common.client.net.trade.TradeOfferNotificationHandler
|
||||
import com.cobblemon.mod.common.client.net.trade.TradeProcessStartedHandler
|
||||
import com.cobblemon.mod.common.client.net.trade.TradeStartedHandler
|
||||
import com.cobblemon.mod.common.client.net.trade.TradeUpdatedHandler
|
||||
import com.cobblemon.mod.common.net.PacketRegisterInfo
|
||||
import com.cobblemon.mod.common.net.messages.client.CalculateSeatPositionsPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.OpenBehaviourEditorPacket
|
||||
@@ -69,12 +83,20 @@ import com.cobblemon.mod.common.net.messages.client.data.*
|
||||
import com.cobblemon.mod.common.net.messages.client.debug.RequestOpenRidingStatsDebugGUIPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.dialogue.DialogueClosedPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.dialogue.DialogueOpenedPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.effect.*
|
||||
import com.cobblemon.mod.common.net.messages.client.effect.PokeSnackBlockParticlesPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.effect.RunPosableMoLangPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.effect.SaccharineLogBlockParticlesPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.effect.SpawnSnowstormEntityParticlePacket
|
||||
import com.cobblemon.mod.common.net.messages.client.effect.SpawnSnowstormParticlePacket
|
||||
import com.cobblemon.mod.common.net.messages.client.npc.CloseNPCEditorPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.npc.OpenNPCEditorPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.orientation.ClientboundUpdateDriverInputPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.orientation.ClientboundUpdateOrientationPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.pasture.*
|
||||
import com.cobblemon.mod.common.net.messages.client.pasture.ClosePasturePacket
|
||||
import com.cobblemon.mod.common.net.messages.client.pasture.OpenPasturePacket
|
||||
import com.cobblemon.mod.common.net.messages.client.pasture.PokemonPasturedPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.pasture.PokemonUnpasturedPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.pasture.UpdatePastureConflictFlagPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.pokedex.ServerConfirmedRegisterPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.pokemon.update.*
|
||||
import com.cobblemon.mod.common.net.messages.client.pokemon.update.evolution.AddEvolutionPacket
|
||||
@@ -94,19 +116,37 @@ import com.cobblemon.mod.common.net.messages.client.storage.party.InitializePart
|
||||
import com.cobblemon.mod.common.net.messages.client.storage.party.MoveClientPartyPokemonPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.storage.party.SetPartyPokemonPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.storage.party.SetPartyReferencePacket
|
||||
import com.cobblemon.mod.common.net.messages.client.storage.pc.*
|
||||
import com.cobblemon.mod.common.net.messages.client.storage.pc.ClosePCPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.storage.pc.InitializePCPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.storage.pc.MoveClientPCPokemonPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.storage.pc.OpenPCPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.storage.pc.RenamePCBoxPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.storage.pc.SetPCBoxPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.storage.pc.SetPCPokemonPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.storage.pc.wallpaper.ChangePCBoxWallpaperPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.storage.pc.wallpaper.RequestPCBoxWallpapersPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.storage.pc.wallpaper.SetPCBoxWallpapersPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.storage.pc.wallpaper.UnlockPCBoxWallpaperPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.toast.ToastPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.trade.*
|
||||
import com.cobblemon.mod.common.net.messages.client.trade.TradeAcceptanceChangedPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.trade.TradeCancelledPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.trade.TradeCompletedPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.trade.TradeOfferExpiredPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.trade.TradeOfferNotificationPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.trade.TradeProcessStartedPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.trade.TradeStartedPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.trade.TradeUpdatedPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.ui.ExpGainedDataPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.ui.InteractPokemonUIPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.ui.PokedexUIPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.ui.SummaryUIPacket
|
||||
import com.cobblemon.mod.common.net.messages.server.*
|
||||
import com.cobblemon.mod.common.net.messages.server.battle.*
|
||||
import com.cobblemon.mod.common.net.messages.server.battle.BattleSelectActionsPacket
|
||||
import com.cobblemon.mod.common.net.messages.server.battle.BattleTeamLeavePacket
|
||||
import com.cobblemon.mod.common.net.messages.server.battle.BattleTeamRequestPacket
|
||||
import com.cobblemon.mod.common.net.messages.server.battle.BattleTeamResponsePacket
|
||||
import com.cobblemon.mod.common.net.messages.server.battle.RemoveSpectatorPacket
|
||||
import com.cobblemon.mod.common.net.messages.server.battle.SpectateBattlePacket
|
||||
import com.cobblemon.mod.common.net.messages.server.behaviour.DamageOnCollisionPacket
|
||||
import com.cobblemon.mod.common.net.messages.server.behaviour.SetEntityBehaviourPacket
|
||||
import com.cobblemon.mod.common.net.messages.server.block.AdjustBlockEntityViewerCountPacket
|
||||
@@ -131,7 +171,11 @@ import com.cobblemon.mod.common.net.messages.server.pasture.UnpasturePokemonPack
|
||||
import com.cobblemon.mod.common.net.messages.server.pokedex.scanner.FinishScanningPacket
|
||||
import com.cobblemon.mod.common.net.messages.server.pokedex.scanner.StartScanningPacket
|
||||
import com.cobblemon.mod.common.net.messages.server.pokemon.interact.InteractPokemonPacket
|
||||
import com.cobblemon.mod.common.net.messages.server.pokemon.update.*
|
||||
import com.cobblemon.mod.common.net.messages.server.pokemon.update.ServerboundUpdateRidingStatePacket
|
||||
import com.cobblemon.mod.common.net.messages.server.pokemon.update.SetActiveMarkPacket
|
||||
import com.cobblemon.mod.common.net.messages.server.pokemon.update.SetItemHiddenPacket
|
||||
import com.cobblemon.mod.common.net.messages.server.pokemon.update.SetMarkingsPacket
|
||||
import com.cobblemon.mod.common.net.messages.server.pokemon.update.SetNicknamePacket
|
||||
import com.cobblemon.mod.common.net.messages.server.pokemon.update.evolution.AcceptEvolutionPacket
|
||||
import com.cobblemon.mod.common.net.messages.server.riding.DismountPokemonPacket
|
||||
import com.cobblemon.mod.common.net.messages.server.riding.ServerboundUpdateDriverInputPacket
|
||||
@@ -139,14 +183,25 @@ import com.cobblemon.mod.common.net.messages.server.riding.ServerboundUpdateRide
|
||||
import com.cobblemon.mod.common.net.messages.server.starter.RequestStarterScreenPacket
|
||||
import com.cobblemon.mod.common.net.messages.server.storage.SwapPCPartyPokemonPacket
|
||||
import com.cobblemon.mod.common.net.messages.server.storage.party.MovePartyPokemonPacket
|
||||
import com.cobblemon.mod.common.net.messages.server.storage.party.PartyTutorialPacket
|
||||
import com.cobblemon.mod.common.net.messages.server.storage.party.ReleasePartyPokemonPacket
|
||||
import com.cobblemon.mod.common.net.messages.server.storage.party.SwapPartyPokemonPacket
|
||||
import com.cobblemon.mod.common.net.messages.server.storage.pc.*
|
||||
import com.cobblemon.mod.common.net.messages.server.trade.*
|
||||
import com.cobblemon.mod.common.net.messages.server.trade.AcceptTradeRequestPacket
|
||||
import com.cobblemon.mod.common.net.messages.server.trade.CancelTradePacket
|
||||
import com.cobblemon.mod.common.net.messages.server.trade.ChangeTradeAcceptancePacket
|
||||
import com.cobblemon.mod.common.net.messages.server.trade.OfferTradePacket
|
||||
import com.cobblemon.mod.common.net.messages.server.trade.PerformTradePacket
|
||||
import com.cobblemon.mod.common.net.messages.server.trade.UpdateTradeOfferPacket
|
||||
import com.cobblemon.mod.common.net.serverhandling.ChallengeHandler
|
||||
import com.cobblemon.mod.common.net.serverhandling.ChallengeResponseHandler
|
||||
import com.cobblemon.mod.common.net.serverhandling.RequestInteractionsHandler
|
||||
import com.cobblemon.mod.common.net.serverhandling.battle.*
|
||||
import com.cobblemon.mod.common.net.serverhandling.battle.BattleSelectActionsHandler
|
||||
import com.cobblemon.mod.common.net.serverhandling.battle.RemoveSpectatorHandler
|
||||
import com.cobblemon.mod.common.net.serverhandling.battle.SpectateBattleHandler
|
||||
import com.cobblemon.mod.common.net.serverhandling.battle.TeamLeaveHandler
|
||||
import com.cobblemon.mod.common.net.serverhandling.battle.TeamRequestHandler
|
||||
import com.cobblemon.mod.common.net.serverhandling.battle.TeamRequestResponseHandler
|
||||
import com.cobblemon.mod.common.net.serverhandling.behaviour.DamageOnCollisionPacketHandler
|
||||
import com.cobblemon.mod.common.net.serverhandling.behaviour.SetEntityBehaviourHandler
|
||||
import com.cobblemon.mod.common.net.serverhandling.block.AdjustBlockEntityViewerCountHandler
|
||||
@@ -165,6 +220,7 @@ import com.cobblemon.mod.common.net.serverhandling.dialogue.InputToDialogueHandl
|
||||
import com.cobblemon.mod.common.net.serverhandling.evolution.AcceptEvolutionHandler
|
||||
import com.cobblemon.mod.common.net.serverhandling.npc.SaveNPCHandler
|
||||
import com.cobblemon.mod.common.net.serverhandling.orientation.ServerboundUpdateOrientationHandler
|
||||
import com.cobblemon.mod.common.net.serverhandling.storage.party.PartyTutorialPacketHandler
|
||||
import com.cobblemon.mod.common.net.serverhandling.pasture.PasturePokemonHandler
|
||||
import com.cobblemon.mod.common.net.serverhandling.pasture.SetPastureConflictHandler
|
||||
import com.cobblemon.mod.common.net.serverhandling.pasture.UnpastureAllPokemonHandler
|
||||
@@ -172,7 +228,11 @@ import com.cobblemon.mod.common.net.serverhandling.pasture.UnpasturePokemonHandl
|
||||
import com.cobblemon.mod.common.net.serverhandling.pokedex.scanner.FinishScanningHandler
|
||||
import com.cobblemon.mod.common.net.serverhandling.pokedex.scanner.StartScanningHandler
|
||||
import com.cobblemon.mod.common.net.serverhandling.pokemon.interact.InteractPokemonHandler
|
||||
import com.cobblemon.mod.common.net.serverhandling.pokemon.update.*
|
||||
import com.cobblemon.mod.common.net.serverhandling.pokemon.update.ServerboundUpdateRidingStateHandler
|
||||
import com.cobblemon.mod.common.net.serverhandling.pokemon.update.SetActiveMarkHandler
|
||||
import com.cobblemon.mod.common.net.serverhandling.pokemon.update.SetItemHiddenHandler
|
||||
import com.cobblemon.mod.common.net.serverhandling.pokemon.update.SetMarkingsHandler
|
||||
import com.cobblemon.mod.common.net.serverhandling.pokemon.update.SetNicknameHandler
|
||||
import com.cobblemon.mod.common.net.serverhandling.riding.DismountPokemonPacketHandler
|
||||
import com.cobblemon.mod.common.net.serverhandling.riding.DriverInputPacketHandler
|
||||
import com.cobblemon.mod.common.net.serverhandling.riding.ServerboundUpdateRiderRotationHandler
|
||||
@@ -186,7 +246,12 @@ import com.cobblemon.mod.common.net.serverhandling.storage.party.MovePartyPokemo
|
||||
import com.cobblemon.mod.common.net.serverhandling.storage.party.ReleasePCPokemonHandler
|
||||
import com.cobblemon.mod.common.net.serverhandling.storage.party.SwapPartyPokemonHandler
|
||||
import com.cobblemon.mod.common.net.serverhandling.storage.pc.*
|
||||
import com.cobblemon.mod.common.net.serverhandling.trade.*
|
||||
import com.cobblemon.mod.common.net.serverhandling.trade.AcceptTradeRequestHandler
|
||||
import com.cobblemon.mod.common.net.serverhandling.trade.CancelTradeHandler
|
||||
import com.cobblemon.mod.common.net.serverhandling.trade.ChangeTradeAcceptanceHandler
|
||||
import com.cobblemon.mod.common.net.serverhandling.trade.OfferTradeHandler
|
||||
import com.cobblemon.mod.common.net.serverhandling.trade.PerformTradeHandler
|
||||
import com.cobblemon.mod.common.net.serverhandling.trade.UpdateTradeOfferHandler
|
||||
import com.cobblemon.mod.common.util.server
|
||||
import net.minecraft.server.level.ServerPlayer
|
||||
|
||||
@@ -332,7 +397,7 @@ object CobblemonNetwork {
|
||||
// Data registries
|
||||
list.add(PacketRegisterInfo(AbilityRegistrySyncPacket.ID, AbilityRegistrySyncPacket::decode, DataRegistrySyncPacketHandler()))
|
||||
list.add(PacketRegisterInfo(CobblemonMechanicsSyncPacket.ID, CobblemonMechanicsSyncPacket::decode, CobblemonMechanicsSyncHandler))
|
||||
list.add(PacketRegisterInfo(PokemonInteractionsSyncPacket.ID, PokemonInteractionsSyncPacket::decode, PokemonInteractionsSyncHandler))
|
||||
list.add(PacketRegisterInfo(PokemonInteractionsSyncPacket.ID, PokemonInteractionsSyncPacket::decode, DataRegistrySyncPacketHandler()))
|
||||
list.add(PacketRegisterInfo(MovesRegistrySyncPacket.ID, MovesRegistrySyncPacket::decode, DataRegistrySyncPacketHandler()))
|
||||
list.add(PacketRegisterInfo(BerryRegistrySyncPacket.ID, BerryRegistrySyncPacket::decode, DataRegistrySyncPacketHandler()))
|
||||
list.add(PacketRegisterInfo(SpeciesRegistrySyncPacket.ID, SpeciesRegistrySyncPacket::decode, DataRegistrySyncPacketHandler()))
|
||||
@@ -460,7 +525,7 @@ object CobblemonNetwork {
|
||||
list.add(PacketRegisterInfo(ReleasePCPokemonPacket.ID, ReleasePCPokemonPacket::decode, ReleasePCPokemonHandler))
|
||||
list.add(PacketRegisterInfo(UnlinkPlayerFromPCPacket.ID, UnlinkPlayerFromPCPacket::decode, UnlinkPlayerFromPCHandler))
|
||||
|
||||
list.add(PacketRegisterInfo(RequestRenamePCBoxPacket.Companion.ID, RequestRenamePCBoxPacket.Companion::decode, RequestRenamePCBoxHandler))
|
||||
list.add(PacketRegisterInfo(RequestRenamePCBoxPacket.ID, RequestRenamePCBoxPacket::decode, RequestRenamePCBoxHandler))
|
||||
list.add(PacketRegisterInfo(PCBoxWallpapersPacket.ID, PCBoxWallpapersPacket::decode, PCBoxWallpapersHandler))
|
||||
list.add(PacketRegisterInfo(RequestChangePCBoxWallpaperPacket.ID, RequestChangePCBoxWallpaperPacket::decode, RequestChangePCBoxWallpaperHandler))
|
||||
list.add(PacketRegisterInfo(MarkPCBoxWallpapersSeenPacket.ID, MarkPCBoxWallpapersSeenPacket::decode, MarkPCBoxWallpapersSeenHandler))
|
||||
@@ -518,6 +583,9 @@ object CobblemonNetwork {
|
||||
list.add(PacketRegisterInfo(PartyPokemonMoveSelectedPacket.ID, PartyPokemonMoveSelectedPacket::decode, PartyPokemonMoveSelectedHandler))
|
||||
list.add(PacketRegisterInfo(PartyMoveSelectCancelledPacket.ID, PartyMoveSelectCancelledPacket::decode, PartyMoveSelectCancelledHandler))
|
||||
|
||||
//Party move tutorial toasts packets
|
||||
list.add(PacketRegisterInfo(PartyTutorialPacket.ID, PartyTutorialPacket::decode, PartyTutorialPacketHandler))
|
||||
|
||||
// Dialogue packets
|
||||
list.add(PacketRegisterInfo(EscapeDialoguePacket.ID, EscapeDialoguePacket::decode, EscapeDialogueHandler))
|
||||
list.add(PacketRegisterInfo(InputToDialoguePacket.ID, InputToDialoguePacket::decode, InputToDialogueHandler))
|
||||
|
||||
@@ -499,8 +499,8 @@ open class PokemonBattle(
|
||||
}
|
||||
|
||||
fun stop() {
|
||||
end()
|
||||
writeShowdownAction(">forcetie") // This will terminate the Showdown connection
|
||||
end()
|
||||
}
|
||||
|
||||
fun checkForInputDispatch() {
|
||||
|
||||
+15
-23
@@ -59,40 +59,32 @@ object PokemonInteractions : JsonDataRegistry<PokemonInteractionSet> {
|
||||
.setPrettyPrinting()
|
||||
.create()
|
||||
|
||||
val speciesInteractions = mutableListOf<PokemonInteractionSet>()
|
||||
val generalInteractions = mutableListOf<PokemonInteractionSet>()
|
||||
val interactions = mutableListOf<PokemonInteractionSet>()
|
||||
|
||||
override fun sync(player: ServerPlayer) {
|
||||
PokemonInteractionsSyncPacket(
|
||||
speciesInteractions,
|
||||
generalInteractions,
|
||||
).sendToPlayer(player)
|
||||
PokemonInteractionsSyncPacket(interactions).sendToPlayer(player)
|
||||
}
|
||||
|
||||
override fun reload(data: Map<ResourceLocation, PokemonInteractionSet>) {
|
||||
speciesInteractions.clear()
|
||||
generalInteractions.clear()
|
||||
val split = data.entries.partition { it.value.requirements.any { requirement -> requirement is PokemonPropertiesRequirement && requirement.target.species != null } }
|
||||
speciesInteractions.addAll(split.first.map {it.value})
|
||||
generalInteractions.addAll(split.second.map {it.value})
|
||||
Cobblemon.LOGGER.info("Loaded {} Pokémon interaction sets", data.size)
|
||||
interactions.clear()
|
||||
val split = data.entries
|
||||
.partition {
|
||||
it.value.requirements.any { requirement -> requirement is PokemonPropertiesRequirement && requirement.target.species != null }
|
||||
}
|
||||
|
||||
// Put the species specific interactions first as they take priority
|
||||
interactions.addAll(split.first.map {it.value})
|
||||
interactions.addAll(split.second.map {it.value})
|
||||
|
||||
Cobblemon.LOGGER.info("Loaded {} Pokémon interaction sets", interactions.size)
|
||||
}
|
||||
|
||||
fun findInteraction(pokemon: PokemonEntity): PokemonInteraction? {
|
||||
val setCheck: (PokemonInteractionSet) -> Boolean = { it.requirements.all { req -> req.check(pokemon.pokemon) }}
|
||||
val interactionCheck: (PokemonInteraction) -> Boolean = { it.requirements.all { req -> req.check(pokemon.pokemon) } && !pokemon.pokemon.isOnInteractionCooldown(it.grouping) }
|
||||
// species-specific interactions take priority
|
||||
val validInteractions = speciesInteractions
|
||||
return interactions
|
||||
.filter(setCheck)
|
||||
.flatMap { it.interactions }
|
||||
.filter(interactionCheck)
|
||||
.toMutableList()
|
||||
if (validInteractions.isEmpty()) { // if all species-specific interactions are absent/on cooldown, fallback to more generic ones
|
||||
validInteractions.addAll(generalInteractions.filter(setCheck).flatMap { it.interactions }
|
||||
.filter(interactionCheck)
|
||||
)
|
||||
}
|
||||
|
||||
return validInteractions.randomOrNull()
|
||||
.firstOrNull(interactionCheck)
|
||||
}
|
||||
}
|
||||
+3
-11
@@ -43,17 +43,9 @@ data class PokemonInteractionSet(
|
||||
|
||||
companion object {
|
||||
fun decode(buffer: FriendlyByteBuf): PokemonInteractionSet {
|
||||
val requirements = buffer.readList { it ->
|
||||
CobblemonRequirementAdapter.decode(it)
|
||||
}
|
||||
val interactions = buffer.readList { it ->
|
||||
PokemonInteraction.decode(it)
|
||||
}
|
||||
|
||||
return PokemonInteractionSet(
|
||||
requirements,
|
||||
interactions,
|
||||
)
|
||||
val requirements = buffer.readList(CobblemonRequirementAdapter::decode)
|
||||
val interactions = buffer.readList(PokemonInteraction::decode)
|
||||
return PokemonInteractionSet(requirements, interactions)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -368,6 +368,11 @@ object MoLangFunctions {
|
||||
val b = format.parse(dateB)
|
||||
DoubleValue(a.after(b))
|
||||
},
|
||||
"get_move_from_id" to java.util.function.Function { params ->
|
||||
val moveId = params.getString(0)
|
||||
val moveTemplate = Moves.getByName(moveId)
|
||||
return@Function moveTemplate?.struct ?: DoubleValue.ZERO
|
||||
},
|
||||
"create_simple_party_provider" to java.util.function.Function { params ->
|
||||
val partyProvider = SimplePartyProvider()
|
||||
return@Function partyProvider.struct
|
||||
@@ -378,6 +383,13 @@ object MoLangFunctions {
|
||||
val pickupItem = ObtainableItem(item = item, pickupPriority = pickupPriority)
|
||||
return@Function pickupItem.struct
|
||||
},
|
||||
"create_itemstack" to java.util.function.Function { params ->
|
||||
val itemId = params.getString(0).asIdentifierDefaultingNamespace()
|
||||
val item = BuiltInRegistries.ITEM.get(itemId) ?: return@Function DoubleValue.ZERO
|
||||
val count = params.getIntOrNull(1) ?: 1
|
||||
val itemStack = ItemStack(item, count)
|
||||
return@Function ObjectValue(itemStack)
|
||||
},
|
||||
"file" to java.util.function.Function { MoLangLoadedFilesCache.struct }
|
||||
)
|
||||
val biomeFunctions = mutableListOf<(Holder<Biome>) -> HashMap<String, java.util.function.Function<MoParams, Any>>>()
|
||||
@@ -583,6 +595,62 @@ object MoLangFunctions {
|
||||
}
|
||||
return@put items
|
||||
}
|
||||
map.put("has_inventory_space") { _ ->
|
||||
val inventory = player.inventory
|
||||
return@put if (inventory.getFreeSlot() != -1) DoubleValue.ONE else DoubleValue.ZERO
|
||||
}
|
||||
map.put("set_inventory_slot") { params ->
|
||||
val slot = params.getInt(0)
|
||||
val inventory = player.inventory
|
||||
if (slot !in 0 until inventory.containerSize) return@put DoubleValue.ZERO
|
||||
|
||||
val value = params.getOrNull<MoValue>(1) ?: return@put DoubleValue.ZERO
|
||||
|
||||
val stack: ItemStack? = when (value) {
|
||||
is ObjectValue<*> -> value.obj as? ItemStack
|
||||
is StringValue -> {
|
||||
val id = ResourceLocation.parse(value.value)
|
||||
val item = player.registryAccess().registryOrThrow(Registries.ITEM).get(id) ?: return@put DoubleValue.ZERO
|
||||
ItemStack(item)
|
||||
}
|
||||
else -> null
|
||||
}
|
||||
|
||||
if (stack == null) return@put DoubleValue.ZERO
|
||||
|
||||
inventory.setItem(slot, stack)
|
||||
return@put DoubleValue.ONE
|
||||
}
|
||||
map.put("give_item") { params ->
|
||||
val inventory = player.inventory
|
||||
val freeSlot = inventory.getFreeSlot()
|
||||
val value = params.getOrNull<MoValue>(0) ?: return@put DoubleValue.ZERO
|
||||
val dropIfFull = params.getBooleanOrNull(1) ?: false
|
||||
|
||||
val stack: ItemStack? = when (value) {
|
||||
is ObjectValue<*> -> value.obj as? ItemStack
|
||||
is StringValue -> {
|
||||
val id = ResourceLocation.parse(value.value)
|
||||
val item = player.registryAccess().registryOrThrow(Registries.ITEM).get(id) ?: return@put DoubleValue.ZERO
|
||||
ItemStack(item)
|
||||
}
|
||||
else -> null
|
||||
}
|
||||
|
||||
if (stack == null) return@put DoubleValue.ZERO
|
||||
|
||||
if (freeSlot == -1) {
|
||||
if (dropIfFull) {
|
||||
player.drop(stack, false)
|
||||
return@put DoubleValue.ONE
|
||||
} else {
|
||||
return@put DoubleValue.ZERO
|
||||
}
|
||||
}
|
||||
|
||||
inventory.setItem(freeSlot, stack)
|
||||
return@put DoubleValue.ONE
|
||||
}
|
||||
map.put("face") { params -> ObjectValue(PlayerDialogueFaceProvider(player.uuid, params.getBooleanOrNull(0) != false)) }
|
||||
map.put("swing_hand") { _ -> player.swing(player.usedItemHand) }
|
||||
map.put("food_level") { _ -> DoubleValue(player.foodData.foodLevel) }
|
||||
@@ -626,8 +694,7 @@ object MoLangFunctions {
|
||||
}
|
||||
map.put("active_dialogue") { _ ->
|
||||
if (player.isInDialogue) {
|
||||
player.activeDialogue?.dialogueId.toString()
|
||||
return@put DoubleValue.ONE
|
||||
return@put player.activeDialogue?.toMoLangStruct() ?: DoubleValue.ZERO
|
||||
} else {
|
||||
DoubleValue.ZERO
|
||||
}
|
||||
@@ -2748,8 +2815,8 @@ object MoLangFunctions {
|
||||
}
|
||||
variable
|
||||
}
|
||||
else -> null
|
||||
} ?: throw IllegalArgumentException("Invalid NBT element type: ${nbt.type}")
|
||||
else -> VariableStruct()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -58,12 +58,15 @@ open class MoveTemplate(
|
||||
val struct: MoStruct by lazy {
|
||||
QueryStruct(hashMapOf())
|
||||
.addFunction("name") { StringValue(name) }
|
||||
.addFunction("display_name") { StringValue(displayName.string) }
|
||||
.addFunction("description") { StringValue(description.string) }
|
||||
.addFunction("type") { StringValue(elementalType.showdownId) }
|
||||
.addFunction("damage_category") { StringValue(damageCategory.name) }
|
||||
.addFunction("power") { DoubleValue(power) }
|
||||
.addFunction("target") { StringValue(target.name) }
|
||||
.addFunction("accuracy") { DoubleValue(accuracy) }
|
||||
.addFunction("pp") { DoubleValue(pp) }
|
||||
.addFunction("max_pp") { DoubleValue(maxPp) }
|
||||
.addFunction("priority") { DoubleValue(priority) }
|
||||
.addFunction("crit_ratio") { DoubleValue(critRatio) }
|
||||
}
|
||||
|
||||
-4
@@ -41,10 +41,6 @@ interface CompositeRidingStrategy<T : CompositeSettings> {
|
||||
toState: RidingBehaviourState,
|
||||
toSettings: RidingBehaviourSettings
|
||||
) {
|
||||
if (vehicle.level().isClientSide) {
|
||||
val fromSettings = if (settings.defaultBehaviour == toSettings) settings.alternateBehaviour else settings.defaultBehaviour
|
||||
|
||||
}
|
||||
toState.stamina.set(fromState.stamina.get())
|
||||
toState.rideVelocity.set(fromState.rideVelocity.get())
|
||||
fromState.reset()
|
||||
|
||||
+5
-6
@@ -187,17 +187,16 @@ class HorseBehaviour : RidingBehaviour<HorseSettings, HorseState> {
|
||||
return
|
||||
}
|
||||
|
||||
var newStam = stam
|
||||
|
||||
val stamDrainRate = (1.0f / vehicle.runtime.resolveDouble(settings.staminaExpr ?: globalHorse.staminaExpr!!)).toFloat() / 20.0f
|
||||
|
||||
if (state.sprinting.get()) {
|
||||
newStam = max(0.0f,stam - stamDrainRate)
|
||||
|
||||
val newStam = if (state.sprinting.get()) {
|
||||
max(0.0f,stam - stamDrainRate)
|
||||
} else {
|
||||
newStam = min(1.0f,stam + stamDrainRate * 4)
|
||||
min(1.0f,stam + stamDrainRate * 4)
|
||||
}
|
||||
|
||||
state.stamina.set(newStam)
|
||||
state.stamina.set(newStam.coerceIn(0F, 1F))
|
||||
}
|
||||
|
||||
override fun updatePassengerRotation(
|
||||
|
||||
+2
-2
@@ -100,7 +100,7 @@ class DolphinBehaviour : RidingBehaviour<DolphinSettings, DolphinState> {
|
||||
driver: Player,
|
||||
input: Vec3
|
||||
) {
|
||||
if(vehicle.level().isClientSide) {
|
||||
if (vehicle.level().isClientSide) {
|
||||
handleBoosting(state, vehicle)
|
||||
tickStamina(settings, state, vehicle)
|
||||
}
|
||||
@@ -147,7 +147,7 @@ class DolphinBehaviour : RidingBehaviour<DolphinSettings, DolphinState> {
|
||||
val stamDrainRate = (1.0f / boostTime).toFloat()
|
||||
|
||||
val newStam = if (state.boosting.get()) max(0.0f,stam - stamDrainRate)
|
||||
else min(1.0f,stam + stamDrainRate)
|
||||
else (stam + stamDrainRate).coerceIn(0F, 1F)
|
||||
|
||||
state.stamina.set(newStam)
|
||||
}
|
||||
|
||||
+62
-63
@@ -26,7 +26,7 @@ import net.minecraft.world.entity.Entity
|
||||
/**
|
||||
* A [SpawningInfluence] that applies some number of SpawnBait effects.
|
||||
*
|
||||
* @author Hiroku, Plastered_Crab
|
||||
* @author Hiroku, Plastered_Crab, ppVon
|
||||
* @since March 18th, 2025
|
||||
*/
|
||||
open class SpawnBaitInfluence(val effects: List<SpawnBait.Effect>, val onUsed: (time: Int, entity: PokemonEntity?) -> Unit = { _, _ -> }) : SpawningInfluence {
|
||||
@@ -50,85 +50,84 @@ open class SpawnBaitInfluence(val effects: List<SpawnBait.Effect>, val onUsed: (
|
||||
}
|
||||
}
|
||||
|
||||
// EV related bait effects
|
||||
// EV, Type, and Egg Group related bait effects
|
||||
override fun affectWeight(detail: SpawnDetail, spawnablePosition: SpawnablePosition, weight: Float): Float {
|
||||
val merged = SpawnBaitUtils.mergeEffects(effects)
|
||||
|
||||
val hasRelevantEffects =
|
||||
merged.any { it.type == Effects.EV } ||
|
||||
merged.any { it.type == Effects.TYPING } ||
|
||||
merged.any { it.type == Effects.EGG_GROUP }
|
||||
|
||||
if (!hasRelevantEffects) {
|
||||
return super.affectWeight(detail, spawnablePosition, weight)
|
||||
}
|
||||
|
||||
val pokemonDetail = detail as? PokemonSpawnDetail
|
||||
?: return super.affectWeight(detail, spawnablePosition, weight)
|
||||
|
||||
val detailSpecies = pokemonDetail.pokemon.species
|
||||
?.let { PokemonSpecies.getByName(it) }
|
||||
?: return super.affectWeight(detail, spawnablePosition, weight)
|
||||
|
||||
val formData = detailSpecies.getForm(pokemonDetail.pokemon.aspects)
|
||||
|
||||
var newWeight = weight
|
||||
var used = false
|
||||
|
||||
// if bait exists and any effects are related to EV yields
|
||||
if (merged.any { it.type == Effects.EV }){
|
||||
if (detail is PokemonSpawnDetail) {
|
||||
val detailSpecies = detail.pokemon.species?.let { PokemonSpecies.getByName(it) }
|
||||
val baitEVStat = effects.firstOrNull { it.type == Effects.EV }?.subcategory?.path?.let { Stats.getStat(it) }
|
||||
if (merged.any { it.type == Effects.EV }) {
|
||||
val evEffect = effects.firstOrNull { it.type == Effects.EV }
|
||||
val baitEVStat = evEffect?.subcategory?.path?.let { Stats.getStat(it) }
|
||||
|
||||
if (detailSpecies != null && baitEVStat != null) {
|
||||
val detailAspects = detail.pokemon.aspects
|
||||
val formData = detailSpecies.getForm(detailAspects)
|
||||
val evYieldValue = formData.evYield[baitEVStat]?.toFloat() ?: 0f
|
||||
return when {
|
||||
evYieldValue > 0 -> {
|
||||
markUsed()
|
||||
super.affectWeight(detail, spawnablePosition, weight)
|
||||
}
|
||||
else -> {
|
||||
markUsed()
|
||||
super.affectWeight(detail, spawnablePosition, 0f)
|
||||
}
|
||||
}
|
||||
if (baitEVStat != null) {
|
||||
val evYieldValue = formData.evYield[baitEVStat]?.toFloat() ?: 0f
|
||||
used = true
|
||||
|
||||
if (evYieldValue <= 0f) {
|
||||
newWeight = 0f
|
||||
} else {
|
||||
LOGGER.debug("Boosted weight value");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// if bait exists and any effects are related to Typing
|
||||
if (merged.any { it.type == Effects.TYPING }){
|
||||
if (detail is PokemonSpawnDetail) {
|
||||
val detailSpecies = detail.pokemon.species?.let { PokemonSpecies.getByName(it) }
|
||||
val baitEffect = effects.firstOrNull { it.type == Effects.TYPING }
|
||||
val baitTypingEffect = baitEffect?.subcategory?.path?.let { ElementalTypes.get(it) }
|
||||
if (newWeight > 0f && merged.any { it.type == Effects.TYPING }) {
|
||||
val baitEffect = effects.firstOrNull { it.type == Effects.TYPING }
|
||||
val baitTypingEffect = baitEffect?.subcategory?.path?.let { ElementalTypes.get(it) }
|
||||
|
||||
if (detailSpecies != null && baitTypingEffect != null) {
|
||||
val detailAspects = detail.pokemon.aspects
|
||||
val formData = detailSpecies.getForm(detailAspects)
|
||||
val isMatchingType = formData.types.contains(baitTypingEffect)
|
||||
return when {
|
||||
isMatchingType -> {
|
||||
markUsed()
|
||||
super.affectWeight(detail, spawnablePosition, weight * baitEffect.value.toFloat())
|
||||
}
|
||||
else -> super.affectWeight(detail, spawnablePosition, weight)
|
||||
}
|
||||
if (baitEffect != null && baitTypingEffect != null) {
|
||||
val isMatchingType = formData.types.contains(baitTypingEffect)
|
||||
used = true
|
||||
|
||||
if (isMatchingType) {
|
||||
newWeight *= baitEffect.value.toFloat()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// if bait exists and any effects are related to Egg Groups
|
||||
if (merged.any { it.type == Effects.EGG_GROUP }) {
|
||||
if (detail is PokemonSpawnDetail) {
|
||||
val detailSpecies = detail.pokemon.species?.let { PokemonSpecies.getByName(it) }
|
||||
if (newWeight > 0f && merged.any { it.type == Effects.EGG_GROUP }) {
|
||||
val eggGroupEffects = effects.filter { it.type == Effects.EGG_GROUP }
|
||||
|
||||
if (detailSpecies != null) {
|
||||
val detailAspects = detail.pokemon.aspects
|
||||
val formData = detailSpecies.getForm(detailAspects)
|
||||
|
||||
// Collect all the egg group effects
|
||||
val eggGroupEffects = effects.filter { it.type == Effects.EGG_GROUP }
|
||||
|
||||
// Check if any of the egg group effects match the species' egg groups
|
||||
val matchingEffect = eggGroupEffects.firstOrNull { effect ->
|
||||
val effectEggGroupKey = effect.subcategory?.path ?: return@firstOrNull false
|
||||
val eggGroup = EggGroup.fromIdentifier(effectEggGroupKey)
|
||||
if (eggGroup == null) {
|
||||
LOGGER.warn("Unknown egg group identifier: $effectEggGroupKey")
|
||||
return@firstOrNull false
|
||||
}
|
||||
formData.eggGroups.contains(eggGroup)
|
||||
}
|
||||
|
||||
if (matchingEffect != null) {
|
||||
markUsed()
|
||||
val multiplier = matchingEffect.value
|
||||
return super.affectWeight(detail, spawnablePosition, (weight * multiplier).toFloat())
|
||||
}
|
||||
val matchingEffect = eggGroupEffects.firstOrNull { effect ->
|
||||
val key = effect.subcategory?.path ?: return@firstOrNull false
|
||||
val eggGroup = EggGroup.fromIdentifier(key)
|
||||
if (eggGroup == null) {
|
||||
LOGGER.warn("Unknown egg group identifier: $key")
|
||||
return@firstOrNull false
|
||||
}
|
||||
formData.eggGroups.contains(eggGroup)
|
||||
}
|
||||
|
||||
if (matchingEffect != null) {
|
||||
used = true
|
||||
newWeight *= matchingEffect.value.toFloat()
|
||||
}
|
||||
}
|
||||
return super.affectWeight(detail, spawnablePosition, weight)
|
||||
|
||||
if (used) markUsed()
|
||||
return super.affectWeight(detail, spawnablePosition, newWeight)
|
||||
}
|
||||
}
|
||||
+3
-1
@@ -28,6 +28,7 @@ data class GeneralPlayerData(
|
||||
var starterUUID: UUID?,
|
||||
var keyItems: MutableSet<ResourceLocation>,
|
||||
var battleTheme: ResourceLocation?,
|
||||
var partySelectTutorialDone: Boolean = false,
|
||||
val extraData: MutableMap<String, PlayerDataExtension>,
|
||||
) : InstancedPlayerData {
|
||||
var advancementData: PlayerAdvancementData = PlayerAdvancementData()
|
||||
@@ -53,7 +54,8 @@ data class GeneralPlayerData(
|
||||
starterSelected,
|
||||
starterUUID,
|
||||
advancementData.totalBattleVictoryCount == 0,
|
||||
battleTheme
|
||||
battleTheme,
|
||||
partySelectTutorialDone
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
+2
-1
@@ -36,7 +36,8 @@ class PlayerDataJsonBackend: JsonBackedPlayerDataStoreBackend<GeneralPlayerData>
|
||||
starterUUID = null,
|
||||
keyItems = Cobblemon.config.defaultKeyItems,
|
||||
extraData = mutableMapOf(),
|
||||
battleTheme = CobblemonSounds.PVP_BATTLE.location
|
||||
battleTheme = CobblemonSounds.PVP_BATTLE.location,
|
||||
partySelectTutorialDone = false
|
||||
)}
|
||||
|
||||
override val gson = GsonBuilder()
|
||||
|
||||
+2
-1
@@ -37,7 +37,8 @@ class PlayerDataMongoBackend(mongoClient: MongoClient, databaseName: String, col
|
||||
starterUUID = null,
|
||||
keyItems = Cobblemon.config.defaultKeyItems,
|
||||
extraData = mutableMapOf(),
|
||||
battleTheme = CobblemonSounds.PVP_BATTLE.location
|
||||
battleTheme = CobblemonSounds.PVP_BATTLE.location,
|
||||
partySelectTutorialDone = false
|
||||
)}
|
||||
|
||||
override val gson = GsonBuilder()
|
||||
|
||||
+6
-2
@@ -34,7 +34,8 @@ data class ClientGeneralPlayerData(
|
||||
var starterSelected: Boolean = false,
|
||||
var starterUUID: UUID? = null,
|
||||
var showChallengeLabel: Boolean = true,
|
||||
val battleTheme: ResourceLocation? = null
|
||||
val battleTheme: ResourceLocation? = null,
|
||||
var partySelectTutorialDone: Boolean = false
|
||||
) : ClientInstancedPlayerData {
|
||||
|
||||
override fun encode(buf: RegistryFriendlyByteBuf) {
|
||||
@@ -46,6 +47,7 @@ data class ClientGeneralPlayerData(
|
||||
buf.writeNullable(starterUUID) { pb, value -> pb.writeString(value.toString()) }
|
||||
buf.writeNullable(resetStarters) { pb, value -> pb.writeBoolean(value) }
|
||||
buf.writeNullable(battleTheme) {pb, value -> pb.writeIdentifier(value)}
|
||||
buf.writeBoolean(partySelectTutorialDone)
|
||||
}
|
||||
companion object {
|
||||
fun decode(buffer: RegistryFriendlyByteBuf): SetClientPlayerDataPacket {
|
||||
@@ -57,6 +59,7 @@ data class ClientGeneralPlayerData(
|
||||
val starterUUID = buffer.readNullable { it.readString() }?.let { UUID.fromString(it) }
|
||||
val resetStarterPrompt = buffer.readNullable { it.readBoolean() }
|
||||
val battleTheme = buffer.readNullable { it.readIdentifier() }
|
||||
val partySelectTutorialDone = buffer.readBoolean()
|
||||
val data = ClientGeneralPlayerData(
|
||||
resetStarterPrompt,
|
||||
promptStarter,
|
||||
@@ -64,7 +67,8 @@ data class ClientGeneralPlayerData(
|
||||
starterSelected,
|
||||
starterUUID,
|
||||
showChallengeLabel,
|
||||
battleTheme
|
||||
battleTheme,
|
||||
partySelectTutorialDone
|
||||
)
|
||||
//Weird to do this, but since the flag doesn't get passed to the decoded obj, do it here
|
||||
//Should be fine, as long as decode doesn't get run on the server for some reason
|
||||
|
||||
@@ -221,6 +221,7 @@ object BattleRegistry {
|
||||
fun closeBattle(battle: PokemonBattle) {
|
||||
battle.onEndHandlers.forEach { it(battle) }
|
||||
battleMap.remove(battle.battleId)
|
||||
ShowdownService.service.endBattle(battle)
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
|
||||
+1
-1
@@ -18,7 +18,7 @@ import java.util.UUID
|
||||
import net.minecraft.network.chat.MutableComponent
|
||||
import net.minecraft.network.chat.Component
|
||||
|
||||
class MultiPokemonBattleActor(
|
||||
open class MultiPokemonBattleActor(
|
||||
pokemonList: List<BattlePokemon>,
|
||||
artificialDecider: BattleAI = RandomBattleAI(),
|
||||
uuid: UUID = UUID.randomUUID()
|
||||
|
||||
@@ -24,17 +24,14 @@ import net.minecraft.network.chat.MutableComponent
|
||||
import net.minecraft.network.chat.Component
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
class PokemonBattleActor(
|
||||
open class PokemonBattleActor(
|
||||
uuid: UUID,
|
||||
val pokemon: BattlePokemon,
|
||||
override val fleeDistance: Float,
|
||||
artificialDecider: BattleAI = RandomBattleAI()
|
||||
artificialDecider: BattleAI = RandomBattleAI(),
|
||||
) : AIBattleActor(uuid, listOf(pokemon), artificialDecider), EntityBackedBattleActor<PokemonEntity>, FleeableBattleActor {
|
||||
|
||||
override val initialPos: Vec3?
|
||||
init {
|
||||
initialPos = entity?.position()
|
||||
}
|
||||
override val initialPos: Vec3? = pokemon.entity?.position()
|
||||
override fun getName() = pokemon.effectedPokemon.species.translatedName
|
||||
override fun nameOwned(name: String): MutableComponent = Component.literal(name)
|
||||
override fun getWorldAndPosition(): Pair<ServerLevel, Vec3>? {
|
||||
|
||||
@@ -17,7 +17,7 @@ import com.cobblemon.mod.common.util.battleLang
|
||||
import java.util.UUID
|
||||
import net.minecraft.network.chat.MutableComponent
|
||||
|
||||
class TrainerBattleActor(
|
||||
open class TrainerBattleActor(
|
||||
val trainerName: String,
|
||||
uuid: UUID,
|
||||
pokemonList: List<BattlePokemon>,
|
||||
|
||||
@@ -27,6 +27,7 @@ interface ShowdownService {
|
||||
fun openConnection()
|
||||
fun closeConnection()
|
||||
fun startBattle(battle: PokemonBattle, messages: Array<String>)
|
||||
fun endBattle(battle: PokemonBattle)
|
||||
fun send(battleId: UUID, messages: Array<String>)
|
||||
fun getRegistryData(type: String): JsonArray
|
||||
fun sendRegistryData(data: Map<String, String>, type: String)
|
||||
|
||||
+5
@@ -129,6 +129,11 @@ class GraalShowdownService : ShowdownService {
|
||||
startBattleFunction.execute(this, battle.battleId.toString(), messages)
|
||||
}
|
||||
|
||||
override fun endBattle(battle: PokemonBattle) {
|
||||
val endBattleFunction = context.getBindings("js").getMember("endBattle")
|
||||
endBattleFunction.execute(battle.battleId.toString())
|
||||
}
|
||||
|
||||
override fun send(battleId: UUID, messages: Array<String>) {
|
||||
sendToShowdown(battleId, messages)
|
||||
}
|
||||
|
||||
+5
@@ -62,6 +62,11 @@ class SocketShowdownService(val host: String = "localhost", val port: Int = 1846
|
||||
send(battle.battleId, messages)
|
||||
}
|
||||
|
||||
override fun endBattle(battle: PokemonBattle) {
|
||||
writer.write(">endbattle ${battle.battleId}\n")
|
||||
acknowledge { Cobblemon.LOGGER.error("Failed to end battle ${battle.battleId}!") }
|
||||
}
|
||||
|
||||
override fun send(battleId: UUID, messages: Array<String>) {
|
||||
for (message in messages) {
|
||||
writer.write("$battleId~$message\n")
|
||||
|
||||
@@ -1,42 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.block
|
||||
|
||||
import net.minecraft.world.item.Item
|
||||
import net.minecraft.core.dispenser.DispenseItemBehavior
|
||||
import net.minecraft.world.item.Items
|
||||
import net.minecraft.world.item.alchemy.PotionContents
|
||||
import net.minecraft.world.item.alchemy.Potions
|
||||
import net.minecraft.world.level.block.DispenserBlock
|
||||
|
||||
object DispenserBehaviorRegistry {
|
||||
private val behaviors = mutableMapOf<Item, DispenseItemBehavior>()
|
||||
|
||||
fun register(items: List<Item>, behaviorProvider: (Item) -> DispenseItemBehavior) {
|
||||
for (item in items) {
|
||||
behaviors[item] = behaviorProvider(item)
|
||||
}
|
||||
}
|
||||
|
||||
fun applyBehaviors() {
|
||||
behaviors.forEach { (item, behavior) ->
|
||||
DispenserBlock.registerBehavior(item, behavior)
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: Seems like there can only 1 behavior per item, so registering the leaves with the honey bottle overrode the honey bottle behavior for the log.
|
||||
// Registering a new behavior with `DispenserBlock.registerBehavior` will override any existing ones for that item, possibly even ones from Minecraft and other mods
|
||||
// Will probably need to use an alternate way of implementing this to avoid conflicts.
|
||||
fun registerDispenserBehaviors() {
|
||||
// register(listOf(PotionContents.createItemStack(Items.POTION, Potions.WATER).item)) { SaccharineLogSlatheredBlock.createBehavior() }
|
||||
// register(listOf(Items.HONEY_BOTTLE)) { SaccharineLogBlock.createBehavior() }
|
||||
// register(listOf(Items.HONEY_BOTTLE, Items.GLASS_BOTTLE)) { item -> SaccharineLeafBlock.createBehavior(item)}
|
||||
applyBehaviors()
|
||||
}
|
||||
}
|
||||
@@ -28,6 +28,8 @@ import net.minecraft.world.entity.player.Player
|
||||
import net.minecraft.world.item.Item
|
||||
import net.minecraft.world.item.ItemStack
|
||||
import net.minecraft.world.item.Items
|
||||
import net.minecraft.world.item.alchemy.PotionContents
|
||||
import net.minecraft.world.item.alchemy.Potions
|
||||
import net.minecraft.world.level.BlockGetter
|
||||
import net.minecraft.world.level.Level
|
||||
import net.minecraft.world.level.LevelAccessor
|
||||
@@ -67,9 +69,16 @@ class SaccharineLeafBlock(settings: Properties) : LeavesBlock(settings) {
|
||||
|
||||
if (blockState.block is SaccharineLeafBlock) {
|
||||
val currentAge = blockState.getValue(AGE)
|
||||
val newAge = when {
|
||||
item == Items.HONEY_BOTTLE && currentAge < MAX_AGE -> (currentAge + 2).coerceAtMost(MAX_AGE)
|
||||
item == Items.GLASS_BOTTLE && currentAge > MIN_AGE -> (currentAge - 2).coerceAtLeast(MIN_AGE)
|
||||
|
||||
val waterBottle = PotionContents.createItemStack(Items.POTION, Potions.WATER).item
|
||||
|
||||
val newAge = when (item) {
|
||||
Items.HONEY_BOTTLE if currentAge < MAX_AGE ->
|
||||
(currentAge + 2).coerceAtMost(MAX_AGE)
|
||||
|
||||
waterBottle if currentAge > MIN_AGE ->
|
||||
(currentAge - 2).coerceAtLeast(MIN_AGE)
|
||||
|
||||
else -> currentAge
|
||||
}
|
||||
|
||||
@@ -79,21 +88,23 @@ class SaccharineLeafBlock(settings: Properties) : LeavesBlock(settings) {
|
||||
stack.shrink(1)
|
||||
|
||||
val dispenserEntity = source.blockEntity
|
||||
val outputItem = if (item == Items.HONEY_BOTTLE) Items.GLASS_BOTTLE else Items.HONEY_BOTTLE
|
||||
val outputItem = Items.GLASS_BOTTLE
|
||||
val outputStack = ItemStack(outputItem)
|
||||
var added = false
|
||||
|
||||
for (i in 0 until dispenserEntity.containerSize) {
|
||||
val slotStack = dispenserEntity.getItem(i)
|
||||
if (dispenserEntity != null) {
|
||||
for (i in 0 until dispenserEntity.containerSize) {
|
||||
val slotStack = dispenserEntity.getItem(i)
|
||||
|
||||
if (slotStack.isEmpty) {
|
||||
dispenserEntity.setItem(i, outputStack.copy())
|
||||
added = true
|
||||
break
|
||||
} else if (slotStack.`is`(outputItem) && slotStack.count < slotStack.maxStackSize) {
|
||||
slotStack.grow(1)
|
||||
added = true
|
||||
break
|
||||
if (slotStack.isEmpty) {
|
||||
dispenserEntity.setItem(i, outputStack.copy())
|
||||
added = true
|
||||
break
|
||||
} else if (slotStack.`is`(outputItem) && slotStack.count < slotStack.maxStackSize) {
|
||||
slotStack.grow(1)
|
||||
added = true
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -25,6 +25,7 @@ import net.minecraft.world.entity.player.Player
|
||||
import net.minecraft.world.item.ItemStack
|
||||
import net.minecraft.world.item.Items
|
||||
import net.minecraft.world.level.Level
|
||||
import net.minecraft.world.level.block.DispenserBlock
|
||||
import net.minecraft.world.level.block.HorizontalDirectionalBlock
|
||||
import net.minecraft.world.level.block.RotatedPillarBlock
|
||||
import net.minecraft.world.level.block.state.BlockState
|
||||
@@ -37,7 +38,7 @@ class SaccharineLogBlock(properties: Properties) : RotatedPillarBlock(properties
|
||||
fun createBehavior(): DispenseItemBehavior {
|
||||
return DispenseItemBehavior { source, stack ->
|
||||
val level = source.level
|
||||
val facing = source.state.getValue(HorizontalDirectionalBlock.FACING)
|
||||
val facing = source.state.getValue(DispenserBlock.FACING)
|
||||
val pos = source.pos.relative(facing)
|
||||
val blockState = level.getBlockState(pos)
|
||||
|
||||
@@ -50,7 +51,13 @@ class SaccharineLogBlock(properties: Properties) : RotatedPillarBlock(properties
|
||||
}
|
||||
}
|
||||
|
||||
fun changeLogTypeDispenser(level: ServerLevel, pos: BlockPos, newState: BlockState, stack: ItemStack, source: BlockSource) {
|
||||
fun changeLogTypeDispenser(
|
||||
level: ServerLevel,
|
||||
pos: BlockPos,
|
||||
newState: BlockState,
|
||||
stack: ItemStack,
|
||||
source: BlockSource
|
||||
) {
|
||||
level.setBlock(pos, newState, 3)
|
||||
level.gameEvent(null, GameEvent.BLOCK_CHANGE, pos)
|
||||
|
||||
@@ -75,11 +82,23 @@ class SaccharineLogBlock(properties: Properties) : RotatedPillarBlock(properties
|
||||
}
|
||||
|
||||
if (!added) {
|
||||
Containers.dropItemStack(level, source.pos.x.toDouble(), source.pos.y.toDouble(), source.pos.z.toDouble(), glassBottle)
|
||||
Containers.dropItemStack(
|
||||
level,
|
||||
source.pos.x.toDouble(),
|
||||
source.pos.y.toDouble(),
|
||||
source.pos.z.toDouble(),
|
||||
glassBottle
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
fun changeLogType(level: Level, pos: BlockPos, newState: BlockState, player: Player? = null, itemStack: ItemStack? = null) {
|
||||
fun changeLogType(
|
||||
level: Level,
|
||||
pos: BlockPos,
|
||||
newState: BlockState,
|
||||
player: Player? = null,
|
||||
itemStack: ItemStack? = null
|
||||
) {
|
||||
level.setBlock(pos, newState, 3)
|
||||
level.gameEvent(null, GameEvent.BLOCK_CHANGE, pos)
|
||||
|
||||
@@ -93,7 +112,15 @@ class SaccharineLogBlock(properties: Properties) : RotatedPillarBlock(properties
|
||||
}
|
||||
}
|
||||
|
||||
override fun useItemOn(stack: ItemStack, state: BlockState, level: Level, pos: BlockPos, player: Player, hand: InteractionHand, hitResult: BlockHitResult): ItemInteractionResult {
|
||||
override fun useItemOn(
|
||||
stack: ItemStack,
|
||||
state: BlockState,
|
||||
level: Level,
|
||||
pos: BlockPos,
|
||||
player: Player,
|
||||
hand: InteractionHand,
|
||||
hitResult: BlockHitResult
|
||||
): ItemInteractionResult {
|
||||
val axis = state.getValue(AXIS)
|
||||
val itemStack = player.getItemInHand(hand)
|
||||
if (!level.isClientSide && itemStack.`is`(Items.HONEY_BOTTLE) && axis == Direction.Axis.Y) {
|
||||
|
||||
@@ -16,7 +16,9 @@ import net.minecraft.core.Direction
|
||||
import net.minecraft.util.StringRepresentable
|
||||
import net.minecraft.world.item.context.BlockPlaceContext
|
||||
import net.minecraft.world.level.BlockGetter
|
||||
import net.minecraft.world.level.LevelAccessor
|
||||
import net.minecraft.world.level.block.Block
|
||||
import net.minecraft.world.level.block.Blocks
|
||||
import net.minecraft.world.level.block.HorizontalDirectionalBlock
|
||||
import net.minecraft.world.level.block.SimpleWaterloggedBlock
|
||||
import net.minecraft.world.level.block.state.BlockState
|
||||
@@ -24,6 +26,8 @@ import net.minecraft.world.level.block.state.StateDefinition
|
||||
import net.minecraft.world.level.block.state.properties.BlockStateProperties.HORIZONTAL_FACING
|
||||
import net.minecraft.world.level.block.state.properties.BlockStateProperties.WATERLOGGED
|
||||
import net.minecraft.world.level.block.state.properties.IntegerProperty
|
||||
import net.minecraft.world.level.material.FluidState
|
||||
import net.minecraft.world.level.material.Fluids
|
||||
import net.minecraft.world.phys.shapes.CollisionContext
|
||||
import net.minecraft.world.phys.shapes.Shapes
|
||||
import net.minecraft.world.phys.shapes.VoxelShape
|
||||
@@ -45,7 +49,7 @@ class StackableItemBlock(settings: Properties, val type: StackableItemBlockType)
|
||||
}
|
||||
|
||||
companion object {
|
||||
val MAX_AMOUNT: Int = 8
|
||||
val MAX_AMOUNT: Int = 4
|
||||
val AMOUNT: IntegerProperty = IntegerProperty.create("amount", 1, MAX_AMOUNT)
|
||||
|
||||
val CODEC: MapCodec<StackableItemBlock> = RecordCodecBuilder.mapCodec { it.group(
|
||||
@@ -163,6 +167,16 @@ class StackableItemBlock(settings: Properties, val type: StackableItemBlockType)
|
||||
builder.add(HORIZONTAL_FACING, AMOUNT, WATERLOGGED)
|
||||
}
|
||||
|
||||
override fun getFluidState(blockState: BlockState): FluidState? = if (blockState.getValue(WATERLOGGED)) Fluids.WATER.getSource(false) else super.getFluidState(blockState)
|
||||
|
||||
override fun updateShape(state: BlockState, direction: Direction, neighborState: BlockState, world: LevelAccessor, pos: BlockPos, neighborPos: BlockPos): BlockState {
|
||||
if (state.getValue(WATERLOGGED)) {
|
||||
world.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world))
|
||||
}
|
||||
return if (state.getValue(HORIZONTAL_FACING).opposite == direction && !state.canSurvive(world, pos)) Blocks.AIR.defaultBlockState()
|
||||
else super.updateShape(state, direction, neighborState, world, pos, neighborPos)
|
||||
}
|
||||
|
||||
override fun getCollisionShape(state: BlockState, level: BlockGetter, pos: BlockPos, context: CollisionContext): VoxelShape {
|
||||
val direction = state.getValue(HORIZONTAL_FACING)
|
||||
val count = state.getValue(AMOUNT)
|
||||
@@ -175,8 +189,9 @@ class StackableItemBlock(settings: Properties, val type: StackableItemBlockType)
|
||||
|
||||
override fun getStateForPlacement(context: BlockPlaceContext): BlockState? {
|
||||
val blockState = context.level.getBlockState(context.clickedPos)
|
||||
val fluidState = context.level.getFluidState(context.clickedPos)
|
||||
return if (blockState.`is`(this)) blockState.setValue(AMOUNT, min(getMaxAmount(type), (blockState.getValue(AMOUNT) + 1)))
|
||||
else super.getStateForPlacement(context)?.setValue(HORIZONTAL_FACING, context.horizontalDirection.opposite)
|
||||
else super.getStateForPlacement(context)?.setValue(HORIZONTAL_FACING, context.horizontalDirection.opposite)?.setValue(WATERLOGGED, fluidState.type === Fluids.WATER)
|
||||
}
|
||||
|
||||
override fun canBeReplaced(state: BlockState, useContext: BlockPlaceContext): Boolean {
|
||||
|
||||
+4
-2
@@ -8,8 +8,6 @@
|
||||
|
||||
package com.cobblemon.mod.common.block
|
||||
|
||||
import com.cobblemon.mod.common.block.StackableItemBlock.Companion.AMOUNT
|
||||
import com.cobblemon.mod.common.block.StackableItemBlock.Companion.MAX_AMOUNT
|
||||
import com.cobblemon.mod.common.util.rotateShape
|
||||
import com.mojang.serialization.MapCodec
|
||||
import com.mojang.serialization.codecs.RecordCodecBuilder
|
||||
@@ -23,6 +21,7 @@ import net.minecraft.world.level.block.state.BlockState
|
||||
import net.minecraft.world.level.block.state.StateDefinition
|
||||
import net.minecraft.world.level.block.state.properties.BlockStateProperties.HORIZONTAL_FACING
|
||||
import net.minecraft.world.level.block.state.properties.BlockStateProperties.WATERLOGGED
|
||||
import net.minecraft.world.level.block.state.properties.IntegerProperty
|
||||
import net.minecraft.world.phys.shapes.CollisionContext
|
||||
import net.minecraft.world.phys.shapes.Shapes
|
||||
import net.minecraft.world.phys.shapes.VoxelShape
|
||||
@@ -40,6 +39,9 @@ class WallAttachedStackableItemBlock(settings: Properties, val type: WallStackab
|
||||
}
|
||||
|
||||
companion object {
|
||||
val MAX_AMOUNT: Int = 8
|
||||
val AMOUNT: IntegerProperty = IntegerProperty.create("amount", 1, MAX_AMOUNT)
|
||||
|
||||
val CODEC: MapCodec<WallAttachedStackableItemBlock> = RecordCodecBuilder.mapCodec { it.group(
|
||||
propertiesCodec(),
|
||||
WallStackableItemBlockType.CODEC.fieldOf("type").forGetter(WallAttachedStackableItemBlock::type)
|
||||
|
||||
+57
@@ -0,0 +1,57 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.block.dispenser
|
||||
|
||||
import net.minecraft.core.dispenser.BlockSource
|
||||
import net.minecraft.core.dispenser.DispenseItemBehavior
|
||||
import net.minecraft.world.item.ItemStack
|
||||
import java.util.concurrent.CopyOnWriteArrayList
|
||||
|
||||
class ChainedDispenseItemBehavior(private val base: DispenseItemBehavior) : DispenseItemBehavior {
|
||||
private val extras = CopyOnWriteArrayList<DispenseItemBehavior>()
|
||||
|
||||
fun add(behavior: DispenseItemBehavior) {
|
||||
extras.add(behavior)
|
||||
}
|
||||
|
||||
override fun dispense(blockSource: BlockSource, itemStack: ItemStack): ItemStack {
|
||||
|
||||
var current = itemStack
|
||||
for (b in extras) {
|
||||
val prev = current.copy()
|
||||
val next = try {
|
||||
b.dispense(blockSource, current)
|
||||
} catch (t: Throwable) {
|
||||
continue
|
||||
}
|
||||
current = next
|
||||
if (handled(prev, current)) {
|
||||
return current
|
||||
}
|
||||
}
|
||||
|
||||
val beforeBase = current.copy()
|
||||
val afterBase = try {
|
||||
base.dispense(blockSource, current)
|
||||
} catch (_: Throwable) {
|
||||
return current
|
||||
}
|
||||
|
||||
if (handled(beforeBase, afterBase)) {
|
||||
return afterBase
|
||||
}
|
||||
|
||||
return afterBase
|
||||
}
|
||||
|
||||
private fun handled(before: ItemStack, after: ItemStack): Boolean {
|
||||
return !ItemStack.matches(before, after)
|
||||
}
|
||||
|
||||
}
|
||||
+90
@@ -0,0 +1,90 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.block.dispenser
|
||||
|
||||
import com.cobblemon.mod.common.block.SaccharineLeafBlock
|
||||
import com.cobblemon.mod.common.block.SaccharineLogBlock
|
||||
import com.cobblemon.mod.common.block.SaccharineLogSlatheredBlock
|
||||
import com.cobblemon.mod.common.mixin.accessor.DispenserBlockAccessor
|
||||
import net.minecraft.core.dispenser.DispenseItemBehavior
|
||||
import net.minecraft.world.item.Item
|
||||
import net.minecraft.world.item.Items
|
||||
import net.minecraft.world.item.alchemy.PotionContents
|
||||
import net.minecraft.world.item.alchemy.Potions
|
||||
import net.minecraft.world.level.block.DispenserBlock
|
||||
|
||||
object DispenserBehaviorRegistry {
|
||||
private val behaviors = mutableMapOf<Item, DispenseItemBehavior>()
|
||||
|
||||
fun register(items: List<Item>, behaviorProvider: (Item) -> DispenseItemBehavior) {
|
||||
register(behaviorProvider, items = items)
|
||||
}
|
||||
|
||||
fun register(vararg behaviorProviders: (Item) -> DispenseItemBehavior, items: List<Item>) {
|
||||
for (item in items) {
|
||||
val providedBehaviors = behaviorProviders.map { provider -> provider(item) }
|
||||
|
||||
val existingLocal = behaviors[item]
|
||||
if (existingLocal is ChainedDispenseItemBehavior) {
|
||||
providedBehaviors.forEach { existingLocal.add(it) }
|
||||
continue
|
||||
}
|
||||
|
||||
val currentRegistered = getCurrentRegisteredBehavior(item)
|
||||
if (currentRegistered is ChainedDispenseItemBehavior) {
|
||||
behaviors[item] = currentRegistered
|
||||
providedBehaviors.forEach { currentRegistered.add(it) }
|
||||
continue
|
||||
}
|
||||
|
||||
val base = currentRegistered ?: DispenseItemBehavior.NOOP
|
||||
val chained = ChainedDispenseItemBehavior(base)
|
||||
providedBehaviors.forEach { chained.add(it) }
|
||||
|
||||
behaviors[item] = chained
|
||||
DispenserBlock.registerBehavior(item, chained)
|
||||
}
|
||||
}
|
||||
|
||||
private fun getCurrentRegisteredBehavior(item: Item): DispenseItemBehavior? {
|
||||
return try {
|
||||
val map = DispenserBlockAccessor.getItemBehaviors()
|
||||
map[item]
|
||||
} catch (t: Throwable) {
|
||||
DispenseItemBehavior.LOGGER.error("Failed to read existing dispenser behaviors via mixin accessor", t)
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
fun registerDispenserBehaviors() {
|
||||
register(
|
||||
{ SaccharineLogSlatheredBlock.createBehavior() },
|
||||
items = listOf(
|
||||
PotionContents.createItemStack(
|
||||
Items.POTION,
|
||||
Potions.WATER
|
||||
).item
|
||||
)
|
||||
)
|
||||
register(
|
||||
{ SaccharineLogBlock.createBehavior() },
|
||||
items = listOf(Items.HONEY_BOTTLE)
|
||||
)
|
||||
register(
|
||||
{ item -> SaccharineLeafBlock.createBehavior(item) },
|
||||
items = listOf(
|
||||
Items.HONEY_BOTTLE,
|
||||
PotionContents.createItemStack(
|
||||
Items.POTION,
|
||||
Potions.WATER
|
||||
).item
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -128,11 +128,11 @@ class FossilMultiblockStructure (
|
||||
|
||||
if(pokemon != null) {
|
||||
pokemon.caughtBall = ballType
|
||||
player.party().add(pokemon)
|
||||
this.fossilState.growthState = "Taken"
|
||||
player.playSound(CobblemonSounds.FOSSIL_MACHINE_RETRIEVE_POKEMON, 1.0F, 1.0F)
|
||||
CobblemonEvents.FOSSIL_REVIVED.post(FossilRevivedEvent(pokemon, player))
|
||||
CobblemonCriteria.RESURRECT_POKEMON.trigger(player, pokemon)
|
||||
player.party().add(pokemon)
|
||||
}
|
||||
|
||||
// Turn the monitor off
|
||||
|
||||
@@ -24,9 +24,10 @@ import com.cobblemon.mod.common.block.entity.TintBlockEntity
|
||||
import com.cobblemon.mod.common.client.battle.ClientBattle
|
||||
import com.cobblemon.mod.common.client.gui.PartyOverlay
|
||||
import com.cobblemon.mod.common.client.gui.PartyOverlayDataControl
|
||||
import com.cobblemon.mod.common.client.gui.RideControlsOverlay
|
||||
import com.cobblemon.mod.common.client.gui.RideOverlay
|
||||
import com.cobblemon.mod.common.client.gui.battle.BattleOverlay
|
||||
import com.cobblemon.mod.common.client.gui.cookingpot.CookingPotScreen
|
||||
import com.cobblemon.mod.common.client.gui.party.PartyTutorialToasts
|
||||
import com.cobblemon.mod.common.client.particle.BedrockParticleOptionsRepository
|
||||
import com.cobblemon.mod.common.client.render.ClientPlayerIcon
|
||||
import com.cobblemon.mod.common.client.render.DeferredRenderer
|
||||
@@ -111,7 +112,7 @@ object CobblemonClient {
|
||||
val overlay: PartyOverlay by lazy { PartyOverlay() }
|
||||
val battleOverlay: BattleOverlay by lazy { BattleOverlay() }
|
||||
val pokedexUsageContext: PokedexUsageContext by lazy { PokedexUsageContext() }
|
||||
val rideControlsOverlay: RideControlsOverlay by lazy { RideControlsOverlay() }
|
||||
val rideControlsOverlay: RideOverlay by lazy { RideOverlay() }
|
||||
|
||||
fun onLogin() {
|
||||
clientPlayerData = ClientGeneralPlayerData()
|
||||
@@ -128,6 +129,8 @@ object CobblemonClient {
|
||||
battleOverlay.onLogout()
|
||||
ClientTaskTracker.clear()
|
||||
checkedStarterScreen = false
|
||||
overlay.resetAttachedToast()
|
||||
PartyTutorialToasts.reset()
|
||||
// CobblemonDataProvider.canReload = true
|
||||
DeferredRenderer.clearAll()
|
||||
ClientPlayerIcon.clear()
|
||||
@@ -165,13 +168,12 @@ object CobblemonClient {
|
||||
PlatformEvents.CLIENT_TICK_POST.subscribe { event ->
|
||||
val player = event.client.player
|
||||
if (player != null) {
|
||||
var selectedItem = player.inventory.getItem(player.inventory.selected)
|
||||
val selectedItem = player.inventory.getItem(player.inventory.selected)
|
||||
if (pokedexUsageContext.scanningGuiOpen &&
|
||||
!(selectedItem.`is`(CobblemonItemTags.POKEDEX)) &&
|
||||
!(player.offhandItem.`is`(CobblemonItemTags.POKEDEX) &&
|
||||
player.isUsingItem == true &&
|
||||
player.usedItemHand == InteractionHand.OFF_HAND
|
||||
)
|
||||
player.isUsingItem &&
|
||||
player.usedItemHand == InteractionHand.OFF_HAND)
|
||||
) {
|
||||
// Stop using Pokédex in main hand if player switches to a different slot in hotbar
|
||||
pokedexUsageContext.stopUsing(PokedexUsageContext.OPEN_SCANNER_BUFFER_TICKS + 1)
|
||||
@@ -216,7 +218,7 @@ object CobblemonClient {
|
||||
}
|
||||
|
||||
fun registerColors() {
|
||||
this.implementation.registerBlockColors(BlockColor { blockState, view, blockPos, tintIndex ->
|
||||
this.implementation.registerBlockColors(BlockColor { _, view, blockPos, _ ->
|
||||
blockPos?.let { pos ->
|
||||
view?.getBlockEntity(pos)?.let { blockEntity ->
|
||||
if (blockEntity is TintBlockEntity) return@BlockColor blockEntity.getTint()
|
||||
|
||||
+1
-3
@@ -507,9 +507,7 @@ class PokemonClientDelegate : PosableState(), PokemonSideDelegate {
|
||||
|
||||
override fun positionRider(passenger: Entity, positionUpdater: MoveFunction) {
|
||||
val locatorName = getSeatLocator(passenger)
|
||||
val locator = this.locatorStates[locatorName]
|
||||
|
||||
if (locator == null) return
|
||||
val locator = this.locatorStates[locatorName] ?: return
|
||||
|
||||
val offset = locator.matrix.getTranslation(Vector3f())
|
||||
.sub(
|
||||
|
||||
@@ -18,10 +18,10 @@ 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.battle.BattleGUI
|
||||
import com.cobblemon.mod.common.client.gui.party.PartyTutorialToasts
|
||||
import com.cobblemon.mod.common.client.gui.toast.CobblemonToast
|
||||
import com.cobblemon.mod.common.client.keybind.boundKey
|
||||
import com.cobblemon.mod.common.client.keybind.keybinds.HidePartyBinding
|
||||
import com.cobblemon.mod.common.client.keybind.keybinds.SummaryBinding
|
||||
import com.cobblemon.mod.common.client.keybind.keybinds.*
|
||||
import com.cobblemon.mod.common.client.render.drawScaledText
|
||||
import com.cobblemon.mod.common.client.render.getDepletableRedGreen
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.FloatingState
|
||||
@@ -29,6 +29,7 @@ import com.cobblemon.mod.common.client.render.renderScaledGuiItemIcon
|
||||
import com.cobblemon.mod.common.pokemon.Gender
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import com.cobblemon.mod.common.util.lang
|
||||
import com.cobblemon.mod.common.util.toAssetPath
|
||||
import java.util.UUID
|
||||
import net.minecraft.client.DeltaTracker
|
||||
import net.minecraft.client.Minecraft
|
||||
@@ -38,6 +39,7 @@ import net.minecraft.client.gui.components.toasts.AdvancementToast
|
||||
import net.minecraft.client.gui.components.toasts.Toast
|
||||
import net.minecraft.client.gui.screens.ChatScreen
|
||||
import net.minecraft.client.gui.screens.Screen
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.util.Mth
|
||||
import kotlin.math.ceil
|
||||
import kotlin.math.floor
|
||||
@@ -148,6 +150,9 @@ class PartyOverlay : Gui(Minecraft.getInstance()) {
|
||||
val portraitFrameOffsetY = 2
|
||||
val selectedSlot = CobblemonClient.storage.selectedSlot
|
||||
|
||||
val partySize = party.slots.count { it != null }
|
||||
PartyTutorialToasts.onOverlayRender(partySize)
|
||||
|
||||
party.forEachIndexed { index, pokemon ->
|
||||
if (pokemon != null) {
|
||||
val selectedOffsetX = if (selectedSlot == index) 6 else 0
|
||||
@@ -467,7 +472,7 @@ class PartyOverlay : Gui(Minecraft.getInstance()) {
|
||||
)
|
||||
}
|
||||
|
||||
val ballIcon = cobblemonResource("textures/gui/ball/" + pokemon.caughtBall.name.path + ".png")
|
||||
val ballIcon = pokemon.caughtBall.name.toAssetPath("textures/gui/ball/", ".png")
|
||||
val ballHeight = 22
|
||||
blitk(
|
||||
matrixStack = matrices,
|
||||
|
||||
+85
-30
@@ -10,6 +10,8 @@ package com.cobblemon.mod.common.client.gui
|
||||
|
||||
import com.cobblemon.mod.common.Cobblemon
|
||||
import com.cobblemon.mod.common.api.gui.blitk
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.RidingBehaviourSettings
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.RidingBehaviourState
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.types.air.*
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.types.composite.CompositeBehaviour
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.types.composite.CompositeState
|
||||
@@ -19,6 +21,7 @@ import com.cobblemon.mod.common.api.riding.behaviour.types.land.VehicleBehaviour
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.types.liquid.BoatBehaviour
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.types.liquid.BurstBehaviour
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.types.liquid.DolphinBehaviour
|
||||
import com.cobblemon.mod.common.api.riding.behaviour.types.liquid.DolphinState
|
||||
import com.cobblemon.mod.common.client.render.drawScaledText
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||
import com.cobblemon.mod.common.util.asTranslated
|
||||
@@ -30,17 +33,28 @@ import net.minecraft.client.gui.GuiGraphics
|
||||
import net.minecraft.client.gui.screens.ChatScreen
|
||||
import net.minecraft.client.gui.screens.Screen
|
||||
import net.minecraft.client.player.Input
|
||||
import net.minecraft.client.player.LocalPlayer
|
||||
import net.minecraft.client.renderer.BiomeColors
|
||||
import net.minecraft.network.chat.MutableComponent
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.util.FastColor
|
||||
import net.minecraft.util.Mth
|
||||
import net.minecraft.world.entity.Entity
|
||||
import net.minecraft.world.level.BlockAndTintGetter
|
||||
import kotlin.math.floor
|
||||
import kotlin.math.max
|
||||
import kotlin.math.round
|
||||
|
||||
class RideControlsOverlay : Gui(Minecraft.getInstance()) {
|
||||
class RideOverlay : Gui(Minecraft.getInstance()) {
|
||||
|
||||
companion object {
|
||||
private const val CONTROLS_FADE_FRAMES = 20F
|
||||
private const val BASELINE_FPS = 60F
|
||||
|
||||
private const val MOTION_FADE_FRAMES = 10
|
||||
private const val MOTION_FRAMES = 10
|
||||
private const val MOTION_OVERLAY_MAX_OPACITY = 0.6F
|
||||
|
||||
private const val HALF_SCALE = 0.5F
|
||||
|
||||
private val mouseResource = cobblemonResource("textures/gui/riding/mouse.png")
|
||||
@@ -59,6 +73,8 @@ class RideControlsOverlay : Gui(Minecraft.getInstance()) {
|
||||
private val keyJumpResource = cobblemonResource("textures/gui/riding/key_jump.png")
|
||||
private val keySneakWideResource = cobblemonResource("textures/gui/riding/key_sneak_wide.png")
|
||||
private val keyJumpWideResource = cobblemonResource("textures/gui/riding/key_jump_wide.png")
|
||||
|
||||
private val motionLinesResource = cobblemonResource("textures/gui/riding/motion_lines_overlay.png")
|
||||
}
|
||||
|
||||
private val screenExemptions: List<Class<out Screen>> = listOf(ChatScreen::class.java)
|
||||
@@ -67,6 +83,9 @@ class RideControlsOverlay : Gui(Minecraft.getInstance()) {
|
||||
private var controlsDurationFrames = controlsMaxDurationFrames
|
||||
private var controlsFadeFrames = CONTROLS_FADE_FRAMES
|
||||
|
||||
private var motionFrameIntervals = 0F
|
||||
private var motionFadeFrames = 0
|
||||
|
||||
private var lastMouseX = 0
|
||||
private var lastMouseY = 0
|
||||
|
||||
@@ -81,43 +100,70 @@ class RideControlsOverlay : Gui(Minecraft.getInstance()) {
|
||||
override fun render(context: GuiGraphics, tickCounter: DeltaTracker) {
|
||||
val minecraft = Minecraft.getInstance()
|
||||
|
||||
// Hiding if a Screen is open and not exempt
|
||||
minecraft.screen?.let { screen ->
|
||||
if ((!screenExemptions.contains(screen.javaClass as Class<out Screen>))) return
|
||||
}
|
||||
|
||||
if (minecraft.options.hideGui || minecraft.debugOverlay.showDebugScreen()) return
|
||||
|
||||
minecraft.player?.let { player ->
|
||||
// Hiding if a Screen is open and not exempt
|
||||
minecraft.screen?.let { screen ->
|
||||
if ((!screenExemptions.contains(screen.javaClass as Class<out Screen>))) return
|
||||
}
|
||||
|
||||
if (minecraft.options.hideGui || minecraft.debugOverlay.showDebugScreen()) return
|
||||
|
||||
val riddenEntity = player.vehicle
|
||||
|
||||
if (riddenEntity != null && riddenEntity is PokemonEntity) {
|
||||
// Only show controls to driver
|
||||
if (riddenEntity === player.controlledVehicle) {
|
||||
renderControls(minecraft, context, tickCounter, riddenEntity)
|
||||
}
|
||||
val ridingBehaviourSettings = riddenEntity.ridingController?.context?.settings ?: return
|
||||
val ridingBehaviourState = riddenEntity.ridingController?.context?.state ?: return
|
||||
|
||||
setCurrentRideBehaviour(ridingBehaviourSettings, ridingBehaviourState)
|
||||
|
||||
val tickDelta = tickCounter.realtimeDeltaTicks.takeIf { !minecraft.isPaused } ?: 0F
|
||||
val updateInterval = (tickDelta / 20F) * BASELINE_FPS
|
||||
|
||||
renderMotionOverlay(minecraft, player, riddenEntity, context, updateInterval, ridingBehaviourSettings, ridingBehaviourState)
|
||||
renderRideControls(minecraft, context, updateInterval, ridingBehaviourSettings, ridingBehaviourState)
|
||||
} else {
|
||||
resetControlsOverlayState()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun renderControls(minecraft: Minecraft, context: GuiGraphics, tickCounter: DeltaTracker, riddenEntity: PokemonEntity) {
|
||||
// Update max duration if user has changed config
|
||||
val configDuration = Cobblemon.config.displayControlSeconds * BASELINE_FPS
|
||||
if (controlsMaxDurationFrames != configDuration) {
|
||||
controlsMaxDurationFrames = configDuration
|
||||
resetControlsOverlayState()
|
||||
fun renderMotionOverlay(minecraft: Minecraft, player: LocalPlayer, riddenEntity: Entity, context: GuiGraphics, updateInterval: Float, ridingBehaviourSettings: RidingBehaviourSettings, ridingBehaviourState: RidingBehaviourState) {
|
||||
if (currentBehaviourKey == JetBehaviour.KEY || currentBehaviourKey == DolphinBehaviour.KEY) {
|
||||
val isBoosting = if (currentBehaviourKey == JetBehaviour.KEY) (ridingBehaviourState as JetState).boosting.get()
|
||||
else (ridingBehaviourState as DolphinState).boosting.get()
|
||||
val interval = round(updateInterval).toInt()
|
||||
|
||||
motionFadeFrames = (motionFadeFrames + (interval * (if (isBoosting) 1 else -1))).coerceIn(0, MOTION_FADE_FRAMES)
|
||||
val opacity = (motionFadeFrames * (1F / MOTION_FADE_FRAMES)).coerceIn(0F, MOTION_OVERLAY_MAX_OPACITY)
|
||||
val tint = if (player.isUnderWater && currentBehaviourKey == DolphinBehaviour.KEY) BiomeColors.getAverageWaterColor(minecraft.level as BlockAndTintGetter, riddenEntity.blockPosition()) else 0xFFFFFF
|
||||
|
||||
motionFrameIntervals += updateInterval * (if (minecraft.options.cameraType.isMirrored) -1 else 1)
|
||||
val frameIndex = floor(motionFrameIntervals).toInt() % MOTION_FRAMES
|
||||
|
||||
blitk(
|
||||
matrixStack = context.pose(),
|
||||
texture = motionLinesResource,
|
||||
x = 0,
|
||||
y = 0,
|
||||
textureHeight = 2560,
|
||||
width = minecraft.window.guiScaledWidth,
|
||||
height = minecraft.window.guiScaledHeight,
|
||||
vOffset = 256 * frameIndex,
|
||||
alpha = opacity,
|
||||
red = FastColor.ARGB32.red(tint) / 255F,
|
||||
green = FastColor.ARGB32.green(tint) / 255F,
|
||||
blue = FastColor.ARGB32.blue(tint) / 255F
|
||||
)
|
||||
} else if (motionFadeFrames > 0) {
|
||||
motionFadeFrames = 0
|
||||
}
|
||||
}
|
||||
|
||||
// Don't render if duration config set to 0 or less
|
||||
if (controlsMaxDurationFrames <= 0F) return
|
||||
private fun setCurrentRideBehaviour(ridingBehaviourSettings: RidingBehaviourSettings, ridingBehaviourState: RidingBehaviourState) {
|
||||
val rideBehaviourKey = ridingBehaviourSettings.key
|
||||
|
||||
val rideBehaviourSettings = riddenEntity.ridingController?.context?.settings ?: return
|
||||
val ridingBehaviourState = riddenEntity.ridingController?.context?.state ?: return
|
||||
val rideBehaviourKey = rideBehaviourSettings.key
|
||||
|
||||
// Update current ride behaviour if changed
|
||||
// If composite, get active behaviour instead
|
||||
// Update current ride behaviour if changed.
|
||||
// If behaviour is composite, get active behaviour instead
|
||||
if (rideBehaviourKey == CompositeBehaviour.KEY) {
|
||||
val activeBehaviour = (ridingBehaviourState as CompositeState).activeBehaviour.get()
|
||||
if (currentBehaviourKey != activeBehaviour) {
|
||||
@@ -128,12 +174,21 @@ class RideControlsOverlay : Gui(Minecraft.getInstance()) {
|
||||
currentBehaviourKey = rideBehaviourKey
|
||||
resetControlsOverlayState()
|
||||
}
|
||||
}
|
||||
|
||||
private fun renderRideControls(minecraft: Minecraft, context: GuiGraphics, updateInterval: Float, ridingBehaviourSettings: RidingBehaviourSettings, ridingBehaviourState: RidingBehaviourState) {
|
||||
// Update max duration if user has changed config
|
||||
val configDuration = Cobblemon.config.displayControlSeconds * BASELINE_FPS
|
||||
if (controlsMaxDurationFrames != configDuration) {
|
||||
controlsMaxDurationFrames = configDuration
|
||||
resetControlsOverlayState()
|
||||
}
|
||||
|
||||
// Don't render if duration config set to 0 or less
|
||||
if (controlsMaxDurationFrames <= 0F) return
|
||||
|
||||
// Render elements if entity has ride behaviour and if display duration has not ended yet
|
||||
if (rideBehaviourSettings != null && controlsFadeFrames > 0) {
|
||||
val tickDelta = tickCounter.realtimeDeltaTicks.takeIf { !minecraft.isPaused } ?: 0F
|
||||
val updateInterval = (tickDelta / 20F) * BASELINE_FPS
|
||||
|
||||
if (ridingBehaviourSettings != null && controlsFadeFrames > 0) {
|
||||
controlsDurationFrames = max(controlsDurationFrames - updateInterval, 0F)
|
||||
if (controlsDurationFrames == 0F && controlsFadeFrames > 0) controlsFadeFrames = max(controlsFadeFrames - updateInterval, 0F)
|
||||
|
||||
+3
-1
@@ -31,12 +31,14 @@ import com.cobblemon.mod.common.util.battleLang
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import com.cobblemon.mod.common.util.lang
|
||||
import com.cobblemon.mod.common.util.math.fromEulerXYZDegrees
|
||||
import com.cobblemon.mod.common.util.toAssetPath
|
||||
import net.minecraft.client.Minecraft
|
||||
import net.minecraft.client.gui.GuiGraphics
|
||||
import net.minecraft.client.gui.narration.NarratableEntry
|
||||
import net.minecraft.client.gui.narration.NarrationElementOutput
|
||||
import net.minecraft.client.resources.sounds.SimpleSoundInstance
|
||||
import net.minecraft.client.sounds.SoundManager
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import org.joml.Quaternionf
|
||||
import org.joml.Vector3f
|
||||
|
||||
@@ -231,7 +233,7 @@ class BattleSwitchPokemonSelection(
|
||||
textureHeight = SELECT_HEIGHT * 2,
|
||||
)
|
||||
|
||||
val ballIcon = cobblemonResource("textures/gui/ball/" + pokemon.caughtBall.name.path + ".png")
|
||||
val ballIcon = pokemon.caughtBall.name.toAssetPath("textures/gui/ball/", ".png")
|
||||
val ballHeight = 22
|
||||
blitk(
|
||||
matrixStack = matrixStack,
|
||||
|
||||
+3
-1
@@ -24,11 +24,13 @@ import com.cobblemon.mod.common.util.asIdentifierDefaultingNamespace
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import com.cobblemon.mod.common.util.lang
|
||||
import com.cobblemon.mod.common.util.math.fromEulerXYZDegrees
|
||||
import com.cobblemon.mod.common.util.toAssetPath
|
||||
import com.google.common.collect.Lists
|
||||
import net.minecraft.client.gui.GuiGraphics
|
||||
import net.minecraft.client.gui.components.Button
|
||||
import net.minecraft.client.sounds.SoundManager
|
||||
import net.minecraft.network.chat.Component
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.util.FormattedCharSequence
|
||||
import net.minecraft.world.item.ItemStack
|
||||
import org.joml.Quaternionf
|
||||
@@ -111,7 +113,7 @@ class PartySlotButton(
|
||||
)
|
||||
context.pose().popPose()
|
||||
|
||||
val ballIcon = cobblemonResource("textures/gui/ball/" + pokemon.pokeball!!.asIdentifierDefaultingNamespace().path + ".png")
|
||||
val ballIcon = pokemon.pokeball!!.asIdentifierDefaultingNamespace().toAssetPath("textures/gui/ball/", ".png")
|
||||
val ballHeight = 22
|
||||
blitk(
|
||||
matrixStack = matrices,
|
||||
|
||||
+99
@@ -0,0 +1,99 @@
|
||||
/*
|
||||
* 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.party
|
||||
|
||||
import com.cobblemon.mod.common.CobblemonItems
|
||||
import com.cobblemon.mod.common.api.text.darkGray
|
||||
import com.cobblemon.mod.common.api.text.red
|
||||
import com.cobblemon.mod.common.client.CobblemonClient
|
||||
import com.cobblemon.mod.common.client.gui.toast.CobblemonToast
|
||||
import com.cobblemon.mod.common.client.keybind.boundKey
|
||||
import com.cobblemon.mod.common.client.keybind.keybinds.DownShiftPartyBinding
|
||||
import com.cobblemon.mod.common.client.keybind.keybinds.PartySendBinding
|
||||
import com.cobblemon.mod.common.client.keybind.keybinds.UpShiftPartyBinding
|
||||
import com.cobblemon.mod.common.net.messages.server.storage.party.PartyTutorialPacket
|
||||
import com.cobblemon.mod.common.util.lang
|
||||
import com.mojang.blaze3d.platform.InputConstants
|
||||
import net.minecraft.client.Minecraft
|
||||
import net.minecraft.client.gui.components.toasts.Toast
|
||||
import net.minecraft.client.gui.components.toasts.AdvancementToast
|
||||
import net.minecraft.network.chat.Component
|
||||
import net.minecraft.util.Mth
|
||||
|
||||
object PartyTutorialToasts {
|
||||
|
||||
private var toastAttached = false
|
||||
|
||||
val upKey = UpShiftPartyBinding.boundKey()
|
||||
val downKey = DownShiftPartyBinding.boundKey()
|
||||
|
||||
val upDisplay =
|
||||
if (upKey.type == InputConstants.Type.KEYSYM && upKey.value == InputConstants.KEY_UP)
|
||||
Component.literal("↑")
|
||||
else upKey.displayName
|
||||
|
||||
val downDisplay =
|
||||
if (downKey.type == InputConstants.Type.KEYSYM && downKey.value == InputConstants.KEY_DOWN)
|
||||
Component.literal("↓")
|
||||
else downKey.displayName
|
||||
|
||||
private val toast = CobblemonToast(
|
||||
Mth.createInsecureUUID(),
|
||||
CobblemonItems.POKEDEX_RED.defaultInstance,
|
||||
lang("ui.party.party_select_title").red(),
|
||||
lang(
|
||||
"ui.party.party_select_description",
|
||||
upDisplay,
|
||||
downDisplay,
|
||||
PartySendBinding.boundKey().displayName
|
||||
).darkGray(),
|
||||
AdvancementToast.BACKGROUND_SPRITE,
|
||||
-1F,
|
||||
0
|
||||
)
|
||||
|
||||
fun reset() {
|
||||
toastAttached = false
|
||||
}
|
||||
|
||||
fun onOverlayRender(partySize: Int) {
|
||||
if (partySize <= 1) return
|
||||
|
||||
if (!CobblemonClient.clientPlayerData.partySelectTutorialDone) {
|
||||
showToast()
|
||||
}
|
||||
}
|
||||
|
||||
fun onArrowKeySwitchedSlot() {
|
||||
if (CobblemonClient.clientPlayerData.partySelectTutorialDone) return
|
||||
if (CobblemonClient.storage.party.count { it != null } < 2) return
|
||||
PartyTutorialPacket().sendToServer()
|
||||
hideToast()
|
||||
}
|
||||
|
||||
fun onHoldKeyScrollSwitchedSlot() {
|
||||
if (CobblemonClient.clientPlayerData.partySelectTutorialDone) return
|
||||
if (CobblemonClient.storage.party.count { it != null } < 2) return
|
||||
PartyTutorialPacket().sendToServer()
|
||||
hideToast()
|
||||
}
|
||||
|
||||
private fun showToast() {
|
||||
val minecraft = Minecraft.getInstance()
|
||||
if (!toastAttached) {
|
||||
toast.nextVisibility = Toast.Visibility.SHOW
|
||||
minecraft.toasts.addToast(toast)
|
||||
toastAttached = true
|
||||
}
|
||||
}
|
||||
|
||||
private fun hideToast() {
|
||||
if (toastAttached) toast.nextVisibility = Toast.Visibility.HIDE
|
||||
}
|
||||
}
|
||||
@@ -40,6 +40,7 @@ import com.cobblemon.mod.common.util.asTranslated
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import com.cobblemon.mod.common.util.isInventoryKeyPressed
|
||||
import com.cobblemon.mod.common.util.lang
|
||||
import com.cobblemon.mod.common.util.toAssetPath
|
||||
import com.mojang.blaze3d.platform.InputConstants
|
||||
import net.minecraft.client.Minecraft
|
||||
import net.minecraft.client.gui.GuiGraphics
|
||||
@@ -463,7 +464,7 @@ class PCGUI(
|
||||
)
|
||||
|
||||
// Poké Ball
|
||||
val ballResource = cobblemonResource("textures/item/poke_balls/" + pokemon.caughtBall.name.path + ".png")
|
||||
val ballResource = pokemon.caughtBall.name.toAssetPath("textures/item/poke_balls/", ".png")
|
||||
blitk(
|
||||
matrixStack = matrices,
|
||||
texture = ballResource,
|
||||
|
||||
+3
-1
@@ -237,9 +237,11 @@ class StatsWidget(val pX: Int, val pY: Int) : SoundlessWidget(
|
||||
blitk(matrixStack = matrices, texture = divider, x = pX + 51, y = pY + 10, height = 27.5, width = 1)
|
||||
blitk(matrixStack = matrices, texture = divider, x = pX + 9, y = pY + 2, height = 6, width = 121)
|
||||
|
||||
val rideStyle = selectedBehaviour.value.key.path.toString().split("/").last().lowercase()
|
||||
drawScaledText(
|
||||
context = context,
|
||||
text = lang("ui.ride_style.${selectedBehaviour.key.name.lowercase()}").bold(),
|
||||
text = lang("ui.ride_style.${selectedBehaviour.key.toString().lowercase()}.${rideStyle}")
|
||||
.append(" | ").append(lang("ui.ride_style.${selectedBehaviour.key.toString().lowercase()}")).bold(),
|
||||
x = pX + 69.5,
|
||||
y = pY + 3,
|
||||
colour = 0x3A96B6,
|
||||
|
||||
@@ -45,6 +45,7 @@ import com.cobblemon.mod.common.pokemon.Pokemon
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import com.cobblemon.mod.common.util.isInventoryKeyPressed
|
||||
import com.cobblemon.mod.common.util.lang
|
||||
import com.cobblemon.mod.common.util.toAssetPath
|
||||
import com.mojang.blaze3d.platform.InputConstants
|
||||
import net.minecraft.client.Minecraft
|
||||
import net.minecraft.client.gui.GuiGraphics
|
||||
@@ -558,7 +559,7 @@ class Summary private constructor(party: Collection<Pokemon?>, private val edita
|
||||
}
|
||||
|
||||
// Poké Ball
|
||||
val ballResource = cobblemonResource("textures/item/poke_balls/" + selectedPokemon.caughtBall.name.path + ".png")
|
||||
val ballResource = selectedPokemon.caughtBall.name.toAssetPath("textures/item/poke_balls/", ".png")
|
||||
blitk(
|
||||
matrixStack = matrices,
|
||||
texture = ballResource,
|
||||
|
||||
+2
-1
@@ -24,6 +24,7 @@ import com.cobblemon.mod.common.pokemon.Pokemon
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import com.cobblemon.mod.common.util.lang
|
||||
import com.cobblemon.mod.common.util.math.fromEulerXYZDegrees
|
||||
import com.cobblemon.mod.common.util.toAssetPath
|
||||
import net.minecraft.client.gui.GuiGraphics
|
||||
import net.minecraft.network.chat.Component
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
@@ -107,7 +108,7 @@ class PartySlotWidget(
|
||||
)
|
||||
}
|
||||
|
||||
val ballIcon = cobblemonResource("textures/gui/ball/" + slotPokemon.caughtBall.name.path + ".png")
|
||||
val ballIcon = slotPokemon.caughtBall.name.toAssetPath("textures/gui/ball/", ".png")
|
||||
val ballHeight = 22
|
||||
blitk(
|
||||
matrixStack = matrices,
|
||||
|
||||
+2
-2
@@ -19,11 +19,11 @@ import com.cobblemon.mod.common.client.render.drawScaledText
|
||||
import com.cobblemon.mod.common.net.messages.server.RequestMoveSwapPacket
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import com.cobblemon.mod.common.util.lang
|
||||
import java.math.RoundingMode
|
||||
import java.text.DecimalFormat
|
||||
import net.minecraft.client.Minecraft
|
||||
import net.minecraft.client.gui.GuiGraphics
|
||||
import net.minecraft.network.chat.Component
|
||||
import java.math.RoundingMode
|
||||
import java.text.DecimalFormat
|
||||
|
||||
class MovesWidget(
|
||||
pX: Int, pY: Int,
|
||||
|
||||
+21
-8
@@ -66,6 +66,7 @@ class StatWidget(
|
||||
private const val MARKER_WIDTH = 8
|
||||
private const val WIDTH = 134
|
||||
private const val HEIGHT = 148
|
||||
private const val RIDE_ICON_SIZE = 32
|
||||
const val SCALE = 0.5F
|
||||
|
||||
private const val WHITE = 0x00FFFFFF
|
||||
@@ -336,14 +337,16 @@ class StatWidget(
|
||||
colour = pentagonColour
|
||||
)
|
||||
|
||||
drawScaledText(
|
||||
context = context,
|
||||
font = CobblemonResources.DEFAULT_LARGE,
|
||||
text = lang("ui.ride_style.${selectedBehaviour.key.name.lowercase()}").bold(),
|
||||
x = x + (WIDTH / 2),
|
||||
y = y + 66,
|
||||
shadow = true,
|
||||
centered = true
|
||||
val rideStyle = selectedBehaviour.value.key.path.toString().split("/").last().lowercase()
|
||||
val iconResource = cobblemonResource("textures/gui/summary/icon_ride_${selectedBehaviour.key.toString().lowercase()}_${rideStyle}.png")
|
||||
blitk(
|
||||
matrixStack = matrices,
|
||||
texture = iconResource,
|
||||
x= (x + 59) / SCALE,
|
||||
y = (y + 62.5) / SCALE,
|
||||
width = RIDE_ICON_SIZE,
|
||||
height = RIDE_ICON_SIZE,
|
||||
scale = SCALE
|
||||
)
|
||||
|
||||
// Stat Labels
|
||||
@@ -368,6 +371,16 @@ class StatWidget(
|
||||
verticesOffset = pentagonVerticesOffset,
|
||||
offsetY = 5.5
|
||||
)
|
||||
|
||||
if (pMouseX >= (x + 59) && pMouseY >= (y + 62.5) && pMouseX <= ((x + 59) + (RIDE_ICON_SIZE * SCALE)) && pMouseY <= ((y + 62.5) + (RIDE_ICON_SIZE * SCALE))) {
|
||||
context.renderTooltip(
|
||||
Minecraft.getInstance().font,
|
||||
lang("ui.ride_style.${selectedBehaviour.key.toString().lowercase()}.${rideStyle}")
|
||||
.append(" | ").append(lang("ui.ride_style.${selectedBehaviour.key.toString().lowercase()}")),
|
||||
pMouseX,
|
||||
pMouseY
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
@@ -20,6 +20,8 @@ import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.util.Mth
|
||||
import java.util.*
|
||||
import kotlin.math.min
|
||||
import net.minecraft.client.gui.Font
|
||||
import net.minecraft.util.FormattedCharSequence
|
||||
|
||||
@Environment(EnvType.CLIENT)
|
||||
class CobblemonToast(
|
||||
@@ -38,11 +40,18 @@ class CobblemonToast(
|
||||
private var lastTime = 0L
|
||||
internal var nextVisibility: Toast.Visibility = Toast.Visibility.SHOW
|
||||
|
||||
fun getLines(font: Font, maxWidth: Int): List<FormattedCharSequence> {
|
||||
return font.split(this.description, maxWidth)
|
||||
}
|
||||
|
||||
override fun render(context: GuiGraphics, manager: ToastComponent, startTime: Long): Toast.Visibility {
|
||||
context.blitSprite(this.frameTexture, 0, 0, this.width(), this.height())
|
||||
val maxWidth = 125
|
||||
val textRenderer = manager.minecraft.font
|
||||
|
||||
context.blitSprite(this.frameTexture, 0, 0, this.width(), this.height() + (getLines(textRenderer, maxWidth).size - 1) * 10)
|
||||
|
||||
context.drawString(textRenderer, this.title, 30, 7, this.title.style.color?.value ?: -1, false)
|
||||
context.drawString(textRenderer, this.description, 30, 18, this.description.style.color?.value ?: -1, false)
|
||||
context.drawWordWrap(textRenderer, this.description, 30, 18, maxWidth, this.description.style.color?.value ?: -1)
|
||||
context.renderFakeItem(this.icon, 8, 8)
|
||||
if (this.hasProgressBar()) {
|
||||
context.fill(3, 28, 157, 29, -1)
|
||||
|
||||
@@ -32,6 +32,7 @@ import com.cobblemon.mod.common.pokemon.Pokemon
|
||||
import com.cobblemon.mod.common.util.asTranslated
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import com.cobblemon.mod.common.util.lang
|
||||
import com.cobblemon.mod.common.util.toAssetPath
|
||||
import com.mojang.blaze3d.platform.InputConstants
|
||||
import net.minecraft.client.Minecraft
|
||||
import net.minecraft.client.gui.GuiGraphics
|
||||
@@ -584,7 +585,7 @@ class TradeGUI(
|
||||
|
||||
// Poké Ball
|
||||
val nameXOffset = if (isOpposing) 75 else 0
|
||||
val ballResource = cobblemonResource("textures/item/poke_balls/" + pokemon.caughtBall.name.path + ".png")
|
||||
val ballResource = pokemon.caughtBall.name.toAssetPath("textures/item/poke_balls/", ".png")
|
||||
blitk(
|
||||
matrixStack = context.pose(),
|
||||
texture = ballResource,
|
||||
|
||||
+2
@@ -9,6 +9,7 @@
|
||||
package com.cobblemon.mod.common.client.keybind.keybinds
|
||||
|
||||
import com.cobblemon.mod.common.client.CobblemonClient
|
||||
import com.cobblemon.mod.common.client.gui.party.PartyTutorialToasts
|
||||
import com.cobblemon.mod.common.client.keybind.CobblemonKeyBinding
|
||||
import com.cobblemon.mod.common.client.keybind.KeybindCategories
|
||||
import com.mojang.blaze3d.platform.InputConstants
|
||||
@@ -21,5 +22,6 @@ object DownShiftPartyBinding : CobblemonKeyBinding(
|
||||
) {
|
||||
override fun onPress() {
|
||||
CobblemonClient.storage.shiftSelected(true)
|
||||
PartyTutorialToasts.onArrowKeySwitchedSlot()
|
||||
}
|
||||
}
|
||||
+2
@@ -9,6 +9,7 @@
|
||||
package com.cobblemon.mod.common.client.keybind.keybinds
|
||||
|
||||
import com.cobblemon.mod.common.client.CobblemonClient
|
||||
import com.cobblemon.mod.common.client.gui.party.PartyTutorialToasts
|
||||
import com.cobblemon.mod.common.client.keybind.CobblemonKeyBinding
|
||||
import com.cobblemon.mod.common.client.keybind.KeybindCategories
|
||||
import com.mojang.blaze3d.platform.InputConstants
|
||||
@@ -21,5 +22,6 @@ object UpShiftPartyBinding : CobblemonKeyBinding(
|
||||
) {
|
||||
override fun onPress() {
|
||||
CobblemonClient.storage.shiftSelected(false)
|
||||
PartyTutorialToasts.onArrowKeySwitchedSlot()
|
||||
}
|
||||
}
|
||||
+1
-3
@@ -16,10 +16,8 @@ object SetClientPlayerDataHandler : ClientNetworkPacketHandler<SetClientPlayerDa
|
||||
override fun handle(packet: SetClientPlayerDataPacket, client: Minecraft) {
|
||||
if (packet.isIncremental) {
|
||||
packet.type.incrementalAfterDecodeAction.invoke(packet.playerData)
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
packet.type.afterDecodeAction.invoke(packet.playerData)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
-27
@@ -1,27 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.client.net.data
|
||||
|
||||
import com.cobblemon.mod.common.api.interaction.PokemonInteractions
|
||||
import com.cobblemon.mod.common.api.net.ClientNetworkPacketHandler
|
||||
import com.cobblemon.mod.common.net.messages.client.data.PokemonInteractionsSyncPacket
|
||||
import net.minecraft.client.Minecraft
|
||||
|
||||
object PokemonInteractionsSyncHandler : ClientNetworkPacketHandler<PokemonInteractionsSyncPacket> {
|
||||
|
||||
override fun handle(
|
||||
packet: PokemonInteractionsSyncPacket,
|
||||
client: Minecraft,
|
||||
) {
|
||||
PokemonInteractions.speciesInteractions.clear()
|
||||
PokemonInteractions.speciesInteractions.addAll(packet.speciesInteractions)
|
||||
PokemonInteractions.generalInteractions.clear()
|
||||
PokemonInteractions.generalInteractions.addAll(packet.generalInteractions)
|
||||
}
|
||||
}
|
||||
+21
-23
@@ -17,35 +17,33 @@ import net.minecraft.util.Mth
|
||||
|
||||
object ClientboundUpdateOrientationHandler : ClientNetworkPacketHandler<ClientboundUpdateOrientationPacket> {
|
||||
override fun handle(packet: ClientboundUpdateOrientationPacket, client: Minecraft) {
|
||||
client.executeIfPossible {
|
||||
val level = client.level ?: return@executeIfPossible
|
||||
val player = client.player ?: return@executeIfPossible
|
||||
val vehicle = level.getEntity(packet.entityId)
|
||||
val vehicleController = if (vehicle is OrientationControllable) vehicle.orientationController else return@executeIfPossible
|
||||
val level = client.level ?: return
|
||||
val player = client.player ?: return
|
||||
val vehicle = level.getEntity(packet.entityId)
|
||||
val vehicleController = if (vehicle is OrientationControllable) vehicle.orientationController else return
|
||||
|
||||
// If the client is also the driver of this entity then don't update it as the driver is the source
|
||||
// of truth on vehicle orientation updates.
|
||||
if (vehicle.controllingPassenger != player) {
|
||||
packet.active?.let { shouldUseCustomOrientation ->
|
||||
// If the client is also the driver of this entity then don't update it as the driver is the source
|
||||
// of truth on vehicle orientation updates.
|
||||
if (vehicle.controllingPassenger != player) {
|
||||
packet.active?.let { shouldUseCustomOrientation ->
|
||||
|
||||
val playerIsPassenger = vehicle.passengers.contains(player)
|
||||
val playerIsPassenger = vehicle.passengers.contains(player)
|
||||
|
||||
// If the player has just switched to riding a custom orientation ride then set their
|
||||
// ride x and y rots local to the vehicle rots(if the controller wasn't active and will now be active)
|
||||
// This ensures that on transition your camera stays in the same spot
|
||||
if (!vehicleController.isActive() && shouldUseCustomOrientation && playerIsPassenger) {
|
||||
// Set local to the vehicle x and yrot
|
||||
val playerRotater = player as RidePassenger?
|
||||
if (playerRotater != null) {
|
||||
playerRotater.`cobblemon$setRideXRot`(Mth.wrapDegrees(player.getXRot() - vehicle.getXRot()))
|
||||
playerRotater.`cobblemon$setRideYRot`(Mth.wrapDegrees(player.getYRot() - vehicle.getYRot()))
|
||||
}
|
||||
// If the player has just switched to riding a custom orientation ride then set their
|
||||
// ride x and y rots local to the vehicle rots(if the controller wasn't active and will now be active)
|
||||
// This ensures that on transition your camera stays in the same spot
|
||||
if (!vehicleController.isActive() && shouldUseCustomOrientation && playerIsPassenger) {
|
||||
// Set local to the vehicle x and yrot
|
||||
val playerRotater = player as RidePassenger?
|
||||
if (playerRotater != null) {
|
||||
playerRotater.`cobblemon$setRideXRot`(Mth.wrapDegrees(player.getXRot() - vehicle.getXRot()))
|
||||
playerRotater.`cobblemon$setRideYRot`(Mth.wrapDegrees(player.getYRot() - vehicle.getYRot()))
|
||||
}
|
||||
|
||||
vehicle.orientationController.active = shouldUseCustomOrientation
|
||||
}
|
||||
vehicle.orientationController.updateOrientation { _ -> packet.orientation }
|
||||
|
||||
vehicle.orientationController.active = shouldUseCustomOrientation
|
||||
}
|
||||
vehicle.orientationController.updateOrientation { _ -> packet.orientation }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+8
-10
@@ -15,16 +15,14 @@ import net.minecraft.client.Minecraft
|
||||
|
||||
object ClientboundUpdateRidingStateHandler : ClientNetworkPacketHandler<ClientboundUpdateRidingStatePacket> {
|
||||
override fun handle(packet: ClientboundUpdateRidingStatePacket, client: Minecraft) {
|
||||
client.executeIfPossible {
|
||||
val player = client.player ?: return@executeIfPossible
|
||||
val entity = player.level().getEntity(packet.entity) ?: return@executeIfPossible
|
||||
if (entity !is PokemonEntity) return@executeIfPossible
|
||||
if (entity.controllingPassenger == player) return@executeIfPossible
|
||||
val buffer = packet.data ?: return@executeIfPossible
|
||||
if (entity.ridingController?.context?.settings?.key != packet.behaviour) {
|
||||
entity.ridingController?.changeBehaviour(packet.behaviour)
|
||||
}
|
||||
entity.ridingController?.context?.state?.decode(buffer)
|
||||
val player = client.player ?: return
|
||||
val entity = player.level().getEntity(packet.entity) ?: return
|
||||
if (entity !is PokemonEntity) return
|
||||
if (entity.controllingPassenger == player) return
|
||||
val buffer = packet.data ?: return
|
||||
if (entity.ridingController?.context?.settings?.key != packet.behaviour) {
|
||||
entity.ridingController?.changeBehaviour(packet.behaviour)
|
||||
}
|
||||
entity.ridingController?.context?.state?.decode(buffer)
|
||||
}
|
||||
}
|
||||
|
||||
+7
-9
@@ -15,15 +15,13 @@ import net.minecraft.client.player.RemotePlayer
|
||||
|
||||
object ClientboundUpdateDriverInputHandler : ClientNetworkPacketHandler<ClientboundUpdateDriverInputPacket> {
|
||||
override fun handle(packet: ClientboundUpdateDriverInputPacket, client: Minecraft) {
|
||||
client.executeIfPossible {
|
||||
val level = client.level ?: return@executeIfPossible
|
||||
val entity = level.getEntity(packet.entityId)
|
||||
if (entity is RemotePlayer) {
|
||||
entity.xxa = packet.driverInput.x
|
||||
entity.zza = packet.driverInput.z
|
||||
entity.jumping = packet.driverInput.y == 1.0f
|
||||
entity.isShiftKeyDown = packet.driverInput.y == -1.0f
|
||||
}
|
||||
val level = client.level ?: return
|
||||
val entity = level.getEntity(packet.entityId)
|
||||
if (entity is RemotePlayer) {
|
||||
entity.xxa = packet.driverInput.x
|
||||
entity.zza = packet.driverInput.z
|
||||
entity.jumping = packet.driverInput.y == 1.0f
|
||||
entity.isShiftKeyDown = packet.driverInput.y == -1.0f
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+3
-5
@@ -15,11 +15,9 @@ import net.minecraft.sounds.SoundEvent
|
||||
|
||||
internal object UnvalidatedPlaySoundS2CPacketHandler : ClientNetworkPacketHandler<UnvalidatedPlaySoundS2CPacket> {
|
||||
override fun handle(packet: UnvalidatedPlaySoundS2CPacket, client: Minecraft) {
|
||||
client.executeIfPossible {
|
||||
// This prevents clients that might not have the required resources installed from getting spammed about missing sound
|
||||
if (client.soundManager.getSoundEvent(packet.sound) != null) {
|
||||
client.level?.playSound(client.player, packet.x, packet.y, packet.z, SoundEvent.createVariableRangeEvent(packet.sound), packet.category, packet.volume, packet.pitch)
|
||||
}
|
||||
// This prevents clients that might not have the required resources installed from getting spammed about missing sound
|
||||
if (client.soundManager.getSoundEvent(packet.sound) != null) {
|
||||
client.level?.playSound(client.player, packet.x, packet.y, packet.z, SoundEvent.createVariableRangeEvent(packet.sound), packet.category, packet.volume, packet.pitch)
|
||||
}
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -15,6 +15,6 @@ import net.minecraft.client.Minecraft
|
||||
|
||||
object ToastPacketHandler : ClientNetworkPacketHandler<ToastPacket> {
|
||||
override fun handle(packet: ToastPacket, client: Minecraft) {
|
||||
client.executeIfPossible { ToastTracker.handle(packet, client) }
|
||||
ToastTracker.handle(packet, client)
|
||||
}
|
||||
}
|
||||
+9
-7
@@ -82,7 +82,6 @@ object MountedCameraRenderer {
|
||||
var offset = Vec3(0.0, currEyeHeight - (driver.bbHeight / 2), 0.0)
|
||||
var eyeOffset = Vec3(0.0, currEyeHeight - (driver.bbHeight / 2), 0.0)
|
||||
|
||||
val shouldFlip = !(vehicleController.active && vehicleController.orientation != null) // Do not flip the offset for 3rd person reverse unless we are using normal mc camera rotation.
|
||||
val isFirstPerson = Minecraft.getInstance().options.cameraType == CameraType.FIRST_PERSON
|
||||
|
||||
eyeOffset = eyeOffset.add(getFirstPersonOffset(model, locatorName))
|
||||
@@ -91,9 +90,9 @@ object MountedCameraRenderer {
|
||||
if (isFirstPerson) {
|
||||
getFirstPersonOffset(model, locatorName)
|
||||
} else /* if (Cobblemon.config.thirdPersonViewBobbing) */ {
|
||||
getThirdPersonOffset(thirdPersonReverse, model.thirdPersonCameraOffset, locatorName, shouldFlip)
|
||||
getThirdPersonOffset(thirdPersonReverse, model.thirdPersonCameraOffset, locatorName)
|
||||
} /* else {
|
||||
getThirdPersonOffset(thirdPersonReverse, model.thirdPersonCameraOffsetNoViewBobbing, locatorName, shouldFlip)
|
||||
getThirdPersonOffset(thirdPersonReverse, model.thirdPersonCameraOffsetNoViewBobbing, locatorName)
|
||||
} */
|
||||
)
|
||||
|
||||
@@ -325,19 +324,20 @@ object MountedCameraRenderer {
|
||||
thirdPersonReverse: Boolean,
|
||||
cameraOffsets: Map<String, Vec3>,
|
||||
locatorName: String,
|
||||
shouldFlip: Boolean = true
|
||||
): Vec3 {
|
||||
val offset = if (thirdPersonReverse && cameraOffsets.containsKey(locatorName + "_reverse")) {
|
||||
cameraOffsets[locatorName + "_reverse"]!!
|
||||
} else if (thirdPersonReverse && cameraOffsets.containsKey("seat_default_reverse")) {
|
||||
cameraOffsets[locatorName + "seat_default_reverse"]!!
|
||||
} else if (cameraOffsets.containsKey(locatorName)) {
|
||||
cameraOffsets[locatorName]!!
|
||||
} else if (cameraOffsets.containsKey("seat_default")) {
|
||||
cameraOffsets["seat_default"]!!
|
||||
} else {
|
||||
Vec3.ZERO
|
||||
}
|
||||
|
||||
// Don't need to account for this since orientation is derived from camera rotation and that z is already flipped.
|
||||
// Flip only when not on a rollable.
|
||||
return if (thirdPersonReverse && shouldFlip) offset.multiply(1.0, 1.0, -1.0) else offset
|
||||
return if (thirdPersonReverse) offset.multiply(1.0, 1.0, -1.0) else offset
|
||||
}
|
||||
|
||||
private fun getFirstPersonOffset(model: PosableModel, locatorName: String): Vec3 {
|
||||
@@ -345,6 +345,8 @@ object MountedCameraRenderer {
|
||||
|
||||
return if (cameraOffsets.containsKey(locatorName)) {
|
||||
cameraOffsets[locatorName]!!
|
||||
} else if (cameraOffsets.containsKey("seat_default")) {
|
||||
cameraOffsets["seat_default"]!!
|
||||
} else {
|
||||
Vec3.ZERO
|
||||
}
|
||||
|
||||
+3
@@ -568,6 +568,9 @@ open class PosableModel(@Transient override val rootPart: Bone) : ModelFrame {
|
||||
// Is there any reason why we should actually change the pose?
|
||||
if (entity != null && (poseName == null || currentPose == null || !currentPose.isSuitable(state) || entityPoseType !in currentPose.poseTypes)) {
|
||||
val desirablePose = getFirstSuitablePose(state, entityPoseType)
|
||||
if (desirablePose == currentPose) {
|
||||
return currentPose
|
||||
}
|
||||
// If this if succeeds then it just no longer fits this pose
|
||||
if (currentPose != null) {
|
||||
// Don't apply pose correction until the current primary animation is complete.
|
||||
|
||||
-60
@@ -1,60 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen3
|
||||
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.PosableState
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.CobblemonPose
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
import net.minecraft.client.model.geom.ModelPart
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
class ChimechoModel(root: ModelPart) : PokemonPosableModel(root) {
|
||||
override val rootPart = root.registerChildWithAllChildren("chimecho")
|
||||
|
||||
override var portraitScale = 3.6F
|
||||
override var portraitTranslation = Vec3(-0.1, -0.4, 0.0)
|
||||
|
||||
override var profileScale = 1.0F
|
||||
override var profileTranslation = Vec3(0.0, 0.3, 0.0)
|
||||
|
||||
lateinit var sleep: CobblemonPose
|
||||
lateinit var hover: CobblemonPose
|
||||
lateinit var fly: CobblemonPose
|
||||
|
||||
override val cryAnimation = CryProvider { bedrockStateful("chimecho", "cry") }
|
||||
|
||||
override fun registerPoses() {
|
||||
val blink = quirk { bedrockStateful("chimecho", "blink") }
|
||||
sleep = registerPose(
|
||||
poseType = PoseType.SLEEP,
|
||||
animations = arrayOf(bedrock("chimecho", "sleep"))
|
||||
)
|
||||
|
||||
hover = registerPose(
|
||||
poseName = "hover",
|
||||
poseTypes = PoseType.STATIONARY_POSES + PoseType.UI_POSES,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
bedrock("chimecho", "air_idle")
|
||||
)
|
||||
)
|
||||
|
||||
fly = registerPose(
|
||||
poseName = "flying",
|
||||
poseTypes = PoseType.MOVING_POSES,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
bedrock("chimecho", "air_fly")
|
||||
)
|
||||
)
|
||||
}
|
||||
override fun getFaintAnimation(state: PosableState) = if (state.isPosedIn(hover, fly, sleep)) bedrockStateful("chimecho", "faint") else null
|
||||
}
|
||||
-89
@@ -1,89 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen4
|
||||
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.CobblemonPose
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
import com.cobblemon.mod.common.entity.PoseType.Companion.MOVING_POSES
|
||||
import com.cobblemon.mod.common.entity.PoseType.Companion.SHOULDER_POSES
|
||||
import com.cobblemon.mod.common.entity.PoseType.Companion.STATIONARY_POSES
|
||||
import com.cobblemon.mod.common.entity.PoseType.Companion.UI_POSES
|
||||
import net.minecraft.client.model.geom.ModelPart
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
class ChinglingModel(root: ModelPart) : PokemonPosableModel(root) {
|
||||
override val rootPart = root.registerChildWithAllChildren("chingling")
|
||||
|
||||
override var portraitScale = 2.8F
|
||||
override var portraitTranslation = Vec3(0.0, -2.4, 0.0)
|
||||
|
||||
override var profileScale = 1.3F
|
||||
override var profileTranslation = Vec3(0.0, -0.2, 0.0)
|
||||
|
||||
lateinit var sleep: CobblemonPose
|
||||
lateinit var standing: CobblemonPose
|
||||
lateinit var walk: CobblemonPose
|
||||
lateinit var hover: CobblemonPose
|
||||
lateinit var fly: CobblemonPose
|
||||
|
||||
override val cryAnimation = CryProvider { bedrockStateful("chingling", "cry") }
|
||||
|
||||
override fun registerPoses() {
|
||||
val blink = quirk { bedrockStateful("chingling", "blink") }
|
||||
val sleepquirk = quirk { bedrockStateful("chingling", "sleep_quirk") }
|
||||
sleep = registerPose(
|
||||
poseType = PoseType.SLEEP,
|
||||
quirks = arrayOf(sleepquirk),
|
||||
animations = arrayOf(bedrock("chingling", "sleep"))
|
||||
)
|
||||
|
||||
standing = registerPose(
|
||||
poseName = "standing",
|
||||
poseTypes = STATIONARY_POSES - PoseType.HOVER + UI_POSES + SHOULDER_POSES,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
bedrock("chingling", "ground_idle")
|
||||
)
|
||||
)
|
||||
|
||||
walk = registerPose(
|
||||
poseName = "walk",
|
||||
poseTypes = MOVING_POSES - PoseType.FLY,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
bedrock("chingling", "ground_walk")
|
||||
)
|
||||
)
|
||||
|
||||
hover = registerPose(
|
||||
poseName = "hover",
|
||||
poseType = PoseType.HOVER,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
bedrock("chingling", "air_idle")
|
||||
)
|
||||
)
|
||||
|
||||
fly = registerPose(
|
||||
poseName = "fly",
|
||||
poseType = PoseType.FLY,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
bedrock("chingling", "air_fly")
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
//override fun getFaintAnimation(
|
||||
// pokemonEntity: PokemonEntity,
|
||||
// state: PosableState<PokemonEntity>
|
||||
//) = if (state.isPosedIn(standing, walk, hover, fly, sleep )) bedrockStateful("chingling", "faint") else null
|
||||
}
|
||||
-63
@@ -1,63 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen5
|
||||
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
import net.minecraft.client.model.geom.ModelPart
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
class CottoneeModel (root: ModelPart) : PokemonPosableModel(root), HeadedFrame{
|
||||
override val rootPart = root.registerChildWithAllChildren("cottonee")
|
||||
|
||||
override val head = getPart("body")
|
||||
|
||||
override var portraitScale = 2.0F
|
||||
override var portraitTranslation = Vec3(-0.1, -1.5, 0.0)
|
||||
|
||||
override var profileScale = 0.9F
|
||||
override var profileTranslation = Vec3(0.0, 0.35, 0.0)
|
||||
|
||||
lateinit var standing: Pose
|
||||
lateinit var walk: Pose
|
||||
|
||||
override val cryAnimation = CryProvider { bedrockStateful("cottonee", "cry") }
|
||||
|
||||
override fun registerPoses() {
|
||||
val blink = quirk { bedrockStateful("cottonee", "blink") }
|
||||
|
||||
standing = registerPose(
|
||||
poseName = "standing",
|
||||
poseTypes = PoseType.STATIONARY_POSES + PoseType.UI_POSES,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(disableY = true)
|
||||
//bedrock("cottonee", "ground_idle")
|
||||
)
|
||||
)
|
||||
|
||||
walk = registerPose(
|
||||
poseName = "walk",
|
||||
poseTypes = PoseType.MOVING_POSES,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(disableY = true)
|
||||
//bedrock("cottonee", "ground_walk")
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// override fun getFaintAnimation(
|
||||
// pokemonEntity: PokemonEntity,
|
||||
// state: PosableState<PokemonEntity>
|
||||
// ) = if (state.isPosedIn(standing, walk)) bedrockStateful("cottonee", "faint") else null
|
||||
}
|
||||
-71
@@ -1,71 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen5
|
||||
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.CobblemonPose
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
import com.cobblemon.mod.common.util.isBattling
|
||||
import net.minecraft.client.model.geom.ModelPart
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
class FerroseedModel (root: ModelPart) : PokemonPosableModel(root) {
|
||||
override val rootPart = root.registerChildWithAllChildren("ferroseed")
|
||||
|
||||
override var portraitScale = 1.8F
|
||||
override var portraitTranslation = Vec3(-0.15, -0.74, 0.0)
|
||||
|
||||
override var profileScale = 0.66F
|
||||
override var profileTranslation = Vec3(0.0, 0.58, 0.0)
|
||||
|
||||
lateinit var standing: CobblemonPose
|
||||
lateinit var walk: CobblemonPose
|
||||
lateinit var battleIdle: CobblemonPose
|
||||
lateinit var sleep: CobblemonPose
|
||||
override fun registerPoses() {
|
||||
val blink = quirk { bedrockStateful("ferroseed", "blink") }
|
||||
|
||||
sleep = registerPose(
|
||||
poseName = "sleep",
|
||||
poseType = PoseType.SLEEP,
|
||||
animations = arrayOf(
|
||||
bedrock("ferroseed", "sleep")
|
||||
)
|
||||
)
|
||||
|
||||
standing = registerPose(
|
||||
poseName = "standing",
|
||||
poseTypes = PoseType.STATIONARY_POSES + PoseType.UI_POSES,
|
||||
condition = { !it.isBattling },
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
bedrock("ferroseed", "ground_idle")
|
||||
)
|
||||
)
|
||||
|
||||
walk = registerPose(
|
||||
poseName = "walk",
|
||||
poseTypes = PoseType.MOVING_POSES,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
bedrock("ferroseed", "ground_walk"),
|
||||
)
|
||||
)
|
||||
|
||||
battleIdle = registerPose(
|
||||
poseName = "battle_idle",
|
||||
poseTypes = PoseType.STATIONARY_POSES,
|
||||
condition = { it.isBattling },
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
bedrock("ferroseed", "battle_idle")
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
-71
@@ -1,71 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen5
|
||||
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.CobblemonPose
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
import com.cobblemon.mod.common.util.isBattling
|
||||
import net.minecraft.client.model.geom.ModelPart
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
class FerrothornModel(root: ModelPart) : PokemonPosableModel(root) {
|
||||
override val rootPart = root.registerChildWithAllChildren("ferrothorn")
|
||||
|
||||
override var portraitScale = 1.07F
|
||||
override var portraitTranslation = Vec3(-0.41, 0.55, 0.0)
|
||||
|
||||
override var profileScale = 0.39F
|
||||
override var profileTranslation = Vec3(-0.08, 0.9, -6.0)
|
||||
|
||||
lateinit var standing: CobblemonPose
|
||||
lateinit var walk: CobblemonPose
|
||||
lateinit var battleIdle: CobblemonPose
|
||||
lateinit var sleep: CobblemonPose
|
||||
override fun registerPoses() {
|
||||
val blink = quirk { bedrockStateful("ferrothorn", "blink") }
|
||||
|
||||
sleep = registerPose(
|
||||
poseName = "sleep",
|
||||
poseType = PoseType.SLEEP,
|
||||
animations = arrayOf(
|
||||
bedrock("ferrothorn", "sleep")
|
||||
)
|
||||
)
|
||||
|
||||
standing = registerPose(
|
||||
poseName = "standing",
|
||||
poseTypes = PoseType.STATIONARY_POSES + PoseType.UI_POSES,
|
||||
condition = { !it.isBattling },
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
bedrock("ferrothorn", "ground_idle")
|
||||
)
|
||||
)
|
||||
|
||||
walk = registerPose(
|
||||
poseName = "walk",
|
||||
poseTypes = PoseType.MOVING_POSES,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
bedrock("ferrothorn", "ground_walk"),
|
||||
)
|
||||
)
|
||||
|
||||
battleIdle = registerPose(
|
||||
poseName = "battle_idle",
|
||||
poseTypes = PoseType.STATIONARY_POSES,
|
||||
condition = { it.isBattling },
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
bedrock("ferrothorn", "battle_idle")
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
-73
@@ -1,73 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen5
|
||||
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.animation.BimanualSwingAnimation
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.animation.BipedWalkAnimation
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BimanualFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BipedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
import net.minecraft.client.model.geom.ModelPart
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
class WhimsicottModel (root: ModelPart) : PokemonPosableModel(root), HeadedFrame, BipedFrame, BimanualFrame {
|
||||
override val rootPart = root.registerChildWithAllChildren("whimsicott")
|
||||
override val head = getPart("head")
|
||||
|
||||
override val leftArm = getPart("arm_left")
|
||||
override val rightArm = getPart("arm_right")
|
||||
override val leftLeg = getPart("leg_left")
|
||||
override val rightLeg = getPart("leg_right")
|
||||
|
||||
override var portraitScale = 2.0F
|
||||
override var portraitTranslation = Vec3(0.0, -0.6, 0.0)
|
||||
|
||||
override var profileScale = 0.8F
|
||||
override var profileTranslation = Vec3(0.0, 0.55, 0.0)
|
||||
|
||||
lateinit var standing: Pose
|
||||
lateinit var walk: Pose
|
||||
|
||||
override val cryAnimation = CryProvider { bedrockStateful("whimsicott", "cry") }
|
||||
|
||||
override fun registerPoses() {
|
||||
val blink = quirk { bedrockStateful("whimsicott", "blink") }
|
||||
standing = registerPose(
|
||||
poseName = "standing",
|
||||
poseTypes = PoseType.STATIONARY_POSES + PoseType.UI_POSES,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(disableX = true),
|
||||
bedrock("whimsicott", "ground_idle")
|
||||
)
|
||||
)
|
||||
|
||||
walk = registerPose(
|
||||
poseName = "walk",
|
||||
poseTypes = PoseType.MOVING_POSES,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(disableX = true),
|
||||
bedrock("whimsicott", "ground_idle"),
|
||||
BipedWalkAnimation(this, periodMultiplier = 0.6F, amplitudeMultiplier = 0.9F),
|
||||
BimanualSwingAnimation(this, swingPeriodMultiplier = 0.6F, amplitudeMultiplier = 0.9F)
|
||||
//bedrock("whimsicott", "ground_walk")
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// override fun getFaintAnimation(
|
||||
// pokemonEntity: PokemonEntity,
|
||||
// state: PosableState<PokemonEntity>
|
||||
// ) = if (state.isPosedIn(standing, walk)) bedrockStateful("whimsicott", "faint") else null
|
||||
}
|
||||
-100
@@ -1,100 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen8
|
||||
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.CobblemonPose
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
import com.cobblemon.mod.common.util.isBattling
|
||||
import net.minecraft.client.model.geom.ModelPart
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
|
||||
class FalinksModel (root: ModelPart) : PokemonPosableModel(root){
|
||||
override val rootPart = root.registerChildWithAllChildren("falinks")
|
||||
|
||||
override var portraitScale = 1.9F
|
||||
override var portraitTranslation = Vec3(-1.0, -1.2, 0.0)
|
||||
|
||||
override var profileScale = 0.5F
|
||||
override var profileTranslation = Vec3(0.1, 0.9, 0.0)
|
||||
|
||||
lateinit var standing: CobblemonPose
|
||||
lateinit var battlestanding: CobblemonPose
|
||||
lateinit var battlestanding2: CobblemonPose
|
||||
lateinit var walk: CobblemonPose
|
||||
lateinit var uipose: CobblemonPose
|
||||
lateinit var sleep: CobblemonPose
|
||||
|
||||
override fun registerPoses() {
|
||||
val blink = quirk { bedrockStateful("falinks", "blink") }
|
||||
val blink2 = quirk { bedrockStateful("falinks", "blink2") }
|
||||
val blink3 = quirk { bedrockStateful("falinks", "blink3") }
|
||||
val blink4 = quirk { bedrockStateful("falinks", "blink4") }
|
||||
val blink5 = quirk { bedrockStateful("falinks", "blink5") }
|
||||
val blink6 = quirk { bedrockStateful("falinks", "blink6") }
|
||||
|
||||
sleep = registerPose(
|
||||
poseName = "sleep",
|
||||
poseType = PoseType.SLEEP,
|
||||
animations = arrayOf(
|
||||
bedrock("falinks", "sleep")
|
||||
)
|
||||
)
|
||||
|
||||
standing = registerPose(
|
||||
poseName = "standing",
|
||||
poseTypes = PoseType.STATIONARY_POSES,
|
||||
quirks = arrayOf(blink, blink2, blink3, blink4, blink5, blink6),
|
||||
condition = { !it.isBattling },
|
||||
animations = arrayOf(
|
||||
bedrock("falinks", "ground_idle")
|
||||
)
|
||||
)
|
||||
|
||||
battlestanding2 = registerPose(
|
||||
poseName = "battlestanding2",
|
||||
poseTypes = PoseType.STATIONARY_POSES,
|
||||
quirks = arrayOf(blink, blink2, blink3, blink4, blink5, blink6),
|
||||
condition = { it.isBattling && ((it.getEntity()?.uuid?.mostSignificantBits ?: 2) % 2).toInt() == 0 },
|
||||
animations = arrayOf(
|
||||
bedrock("falinks", "battle_idle2")
|
||||
)
|
||||
)
|
||||
|
||||
battlestanding = registerPose(
|
||||
poseName = "battlestanding",
|
||||
poseTypes = PoseType.STATIONARY_POSES,
|
||||
quirks = arrayOf(blink, blink2, blink3, blink4, blink5, blink6),
|
||||
condition = { it.isBattling },
|
||||
animations = arrayOf(
|
||||
bedrock("falinks", "battle_idle")
|
||||
)
|
||||
)
|
||||
|
||||
walk = registerPose(
|
||||
poseName = "walk",
|
||||
poseTypes = PoseType.MOVING_POSES,
|
||||
quirks = arrayOf(blink, blink2, blink3, blink4, blink5, blink6),
|
||||
condition = { !it.isBattling },
|
||||
animations = arrayOf(
|
||||
bedrock("falinks", "ground_walk")
|
||||
)
|
||||
)
|
||||
|
||||
uipose = registerPose(
|
||||
poseName = "uipose",
|
||||
poseTypes = PoseType.UI_POSES,
|
||||
quirks = arrayOf(blink, blink2, blink3, blink4, blink5, blink6),
|
||||
animations = arrayOf(
|
||||
bedrock("falinks", "summary_idle")
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
-7
@@ -408,8 +408,6 @@ object VaryingModelRepository {
|
||||
inbuilt("tandemaus", ::TandemausModel)
|
||||
inbuilt("maushold", ::MausholdModel)
|
||||
inbuilt("mausholdfour", ::MausholdfourModel)
|
||||
inbuilt("chingling", ::ChinglingModel)
|
||||
inbuilt("chimecho", ::ChimechoModel)
|
||||
inbuilt("fidough", ::FidoughModel)
|
||||
inbuilt("dachsbun", ::DachsbunModel)
|
||||
inbuilt("chatot", ::ChatotModel)
|
||||
@@ -424,7 +422,6 @@ object VaryingModelRepository {
|
||||
inbuilt("surskit", ::SurskitModel)
|
||||
inbuilt("masquerain", ::MasquerainModel)
|
||||
inbuilt("carnivine", ::CarnivineModel)
|
||||
inbuilt("falinks", ::FalinksModel)
|
||||
inbuilt("stufful", ::StuffulModel)
|
||||
inbuilt("bewear", ::BewearModel)
|
||||
inbuilt("scatterbug", ::ScatterbugModel)
|
||||
@@ -495,8 +492,6 @@ object VaryingModelRepository {
|
||||
inbuilt("zigzagoon_galarian", :: ZigzagoonGalarianModel)
|
||||
inbuilt("linoone_galarian", :: LinooneGalarianModel)
|
||||
inbuilt("obstagoon", :: ObstagoonModel)
|
||||
inbuilt("cottonee", :: CottoneeModel)
|
||||
inbuilt("whimsicott", :: WhimsicottModel)
|
||||
inbuilt("wishiwashi_solo", :: WishiwashiSoloModel)
|
||||
inbuilt("wishiwashi_schooling", :: WishiwashiSchoolingModel)
|
||||
inbuilt("meowth_alolan", ::MeowthAlolanModel)
|
||||
@@ -589,8 +584,6 @@ object VaryingModelRepository {
|
||||
inbuilt("makuhita", ::MakuhitaModel)
|
||||
inbuilt("hariyama", ::HariyamaModel)
|
||||
inbuilt("alomomola", ::AlomomolaModel)
|
||||
inbuilt("ferroseed", ::FerroseedModel)
|
||||
inbuilt("ferrothorn", ::FerrothornModel)
|
||||
inbuilt("carbink", ::CarbinkModel)
|
||||
inbuilt("goomy", ::GoomyModel)
|
||||
inbuilt("goomy_hisui_bias", ::GoomyHisuiBiasModel)
|
||||
|
||||
@@ -8,11 +8,11 @@
|
||||
|
||||
package com.cobblemon.mod.common.command
|
||||
|
||||
import com.cobblemon.mod.common.Cobblemon
|
||||
import com.cobblemon.mod.common.api.permission.CobblemonPermissions
|
||||
import com.cobblemon.mod.common.api.storage.pc.PCPosition
|
||||
import com.cobblemon.mod.common.api.storage.pc.POKEMON_PER_BOX
|
||||
import com.cobblemon.mod.common.api.text.red
|
||||
import com.cobblemon.mod.common.api.text.text
|
||||
import com.cobblemon.mod.common.util.*
|
||||
import com.mojang.brigadier.Command
|
||||
import com.mojang.brigadier.CommandDispatcher
|
||||
@@ -35,7 +35,7 @@ object PcTakeCommand {
|
||||
.then(
|
||||
Commands.argument("box", IntegerArgumentType.integer(1))
|
||||
.then(
|
||||
Commands.argument("slot", IntegerArgumentType.integer(1, 30))
|
||||
Commands.argument("slot", IntegerArgumentType.integer(1, POKEMON_PER_BOX))
|
||||
.executes(::execute)
|
||||
)
|
||||
)
|
||||
@@ -60,8 +60,8 @@ object PcTakeCommand {
|
||||
val slot = IntegerArgumentType.getInteger(context, "slot")
|
||||
val pc = target.pc()
|
||||
|
||||
if (box > POKEMON_PER_BOX) {
|
||||
context.source.sendFailure(commandLang("pctake.too_many_boxes", POKEMON_PER_BOX))
|
||||
if (box > pc.boxes.size) {
|
||||
context.source.sendFailure(commandLang("pctake.too_many_boxes", pc.boxes.size))
|
||||
return 0
|
||||
}
|
||||
|
||||
|
||||
@@ -90,8 +90,10 @@ interface MoLangScriptingEntity {
|
||||
behavioursAreCustom = nbt.getBoolean(DataKeys.SCRIPTED_BEHAVIOURS_ARE_CUSTOM)
|
||||
behaviours.clear()
|
||||
behaviours.addAll(nbt.getList(DataKeys.SCRIPTED_BEHAVIOURS, ListTag.TAG_STRING.toInt()).map { ResourceLocation.parse(it.asString) })
|
||||
data = MoLangFunctions.readMoValueFromNBT(nbt.getCompound(DataKeys.SCRIPTED_DATA)) as VariableStruct
|
||||
config = if (nbt.contains(DataKeys.SCRIPTED_CONFIG)) MoLangFunctions.readMoValueFromNBT(nbt.getCompound(DataKeys.SCRIPTED_CONFIG)) as VariableStruct else VariableStruct()
|
||||
val dataKey = if (nbt.contains(DataKeys.SCRIPTED_DATA)) DataKeys.SCRIPTED_DATA else "Data" // migrate old use of "Data"
|
||||
data = MoLangFunctions.readMoValueFromNBT(nbt.getCompound(dataKey)) as VariableStruct
|
||||
val configKey = if (nbt.contains(DataKeys.SCRIPTED_CONFIG)) DataKeys.SCRIPTED_CONFIG else "Config" // migrate old use of "Config"
|
||||
config = if (nbt.contains(configKey)) MoLangFunctions.readMoValueFromNBT(nbt.getCompound(configKey)) as VariableStruct else VariableStruct()
|
||||
}
|
||||
|
||||
fun registerFunctionsForScripting(struct: QueryStruct) {
|
||||
|
||||
@@ -12,6 +12,7 @@ import com.cobblemon.mod.common.api.battles.model.actor.AIBattleActor
|
||||
import com.cobblemon.mod.common.api.battles.model.actor.ActorType
|
||||
import com.cobblemon.mod.common.api.battles.model.actor.BattleActor
|
||||
import com.cobblemon.mod.common.api.battles.model.actor.EntityBackedBattleActor
|
||||
import com.cobblemon.mod.common.api.battles.model.ai.BattleAI
|
||||
import com.cobblemon.mod.common.api.net.NetworkPacket
|
||||
import com.cobblemon.mod.common.api.storage.party.PartyStore
|
||||
import com.cobblemon.mod.common.battles.ai.StrongBattleAI
|
||||
@@ -23,14 +24,15 @@ import com.cobblemon.mod.common.util.effectiveName
|
||||
import com.cobblemon.mod.common.util.update
|
||||
import java.util.concurrent.CompletableFuture
|
||||
|
||||
class NPCBattleActor(
|
||||
open class NPCBattleActor(
|
||||
val npc: NPCEntity,
|
||||
pokemonList: List<BattlePokemon>,
|
||||
val skill: Int
|
||||
val skill: Int,
|
||||
artificialDecider: BattleAI = StrongBattleAI(skill),
|
||||
) : AIBattleActor(
|
||||
gameId = npc.uuid,
|
||||
pokemonList = pokemonList.let { if (npc.npc.randomizePartyOrder) it.shuffled() else it },
|
||||
battleAI = StrongBattleAI(skill)
|
||||
battleAI = artificialDecider
|
||||
), EntityBackedBattleActor<NPCEntity> {
|
||||
override val entity = npc
|
||||
override val type = ActorType.NPC
|
||||
|
||||
@@ -59,6 +59,7 @@ class AprijuiceItem(val type: Apricorn): CobblemonItem(Properties().stacksTo(16)
|
||||
val prefixKey = when {
|
||||
hasBoosts && quality == CookingQuality.HIGH -> "item.cobblemon.aprijuice.prefix.delicious"
|
||||
hasBoosts && quality == CookingQuality.MEDIUM -> "item.cobblemon.aprijuice.prefix.tasty"
|
||||
hasBoosts && quality == CookingQuality.LOW -> "item.cobblemon.aprijuice.prefix.plain"
|
||||
!hasBoosts -> "item.cobblemon.aprijuice.prefix.plain"
|
||||
else -> null
|
||||
}
|
||||
|
||||
+1
-1
@@ -31,7 +31,7 @@ class BaitEffectsComponent(
|
||||
}
|
||||
|
||||
override fun equals(other: Any?): Boolean {
|
||||
return other is BaitEffectsComponent && effects.size == other.effects.size && effects.all { it in other.effects }
|
||||
return other is BaitEffectsComponent && effects == other.effects
|
||||
}
|
||||
|
||||
override fun hashCode(): Int {
|
||||
|
||||
+1
-3
@@ -49,9 +49,7 @@ class FoodColourComponent(
|
||||
}
|
||||
|
||||
override fun equals(other: Any?): Boolean {
|
||||
return other is FoodColourComponent &&
|
||||
colours.size == other.colours.size &&
|
||||
colours.mapIndexed { index, value -> value == other.colours[index] }.all { it }
|
||||
return other is FoodColourComponent && colours == other.colours // List == List in kotlin checks for element order and index.
|
||||
}
|
||||
|
||||
fun getColoursAsARGB(): List<Int> {
|
||||
|
||||
+2
-1
@@ -20,11 +20,12 @@ class BerryRegistrySyncPacket(berries: Collection<Berry>) : DataRegistrySyncPack
|
||||
}
|
||||
|
||||
override val id = ID
|
||||
|
||||
override fun encodeEntry(buffer: RegistryFriendlyByteBuf, entry: Berry) {
|
||||
entry.encode(buffer)
|
||||
}
|
||||
|
||||
override fun decodeEntry(buffer: RegistryFriendlyByteBuf): Berry? = Berry.decode(buffer)
|
||||
override fun decodeEntry(buffer: RegistryFriendlyByteBuf): Berry = Berry.decode(buffer)
|
||||
|
||||
override fun synchronizeDecoded(entries: Collection<Berry>) {
|
||||
Berries.reload(entries.associateBy { it.identifier })
|
||||
|
||||
+15
-25
@@ -9,40 +9,30 @@
|
||||
package com.cobblemon.mod.common.net.messages.client.data
|
||||
|
||||
import com.cobblemon.mod.common.api.interaction.PokemonInteractionSet
|
||||
import com.cobblemon.mod.common.api.net.NetworkPacket
|
||||
import com.cobblemon.mod.common.api.interaction.PokemonInteractions
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import net.minecraft.network.RegistryFriendlyByteBuf
|
||||
|
||||
class PokemonInteractionsSyncPacket(
|
||||
val speciesInteractions: List<PokemonInteractionSet>,
|
||||
val generalInteractions: List<PokemonInteractionSet>,
|
||||
) : NetworkPacket<PokemonInteractionsSyncPacket> {
|
||||
entries: Collection<PokemonInteractionSet>,
|
||||
) : DataRegistrySyncPacket<PokemonInteractionSet, PokemonInteractionsSyncPacket>(entries) {
|
||||
override val id = ID
|
||||
|
||||
override fun encode(buffer: RegistryFriendlyByteBuf) {
|
||||
buffer.writeCollection(speciesInteractions) { it, speciesInteraction ->
|
||||
speciesInteraction.encode(it)
|
||||
}
|
||||
buffer.writeCollection(generalInteractions) { it, generalInteraction ->
|
||||
generalInteraction.encode(it)
|
||||
}
|
||||
override fun encodeEntry(buffer: RegistryFriendlyByteBuf, entry: PokemonInteractionSet) {
|
||||
entry.encode(buffer)
|
||||
}
|
||||
|
||||
override fun decodeEntry(buffer: RegistryFriendlyByteBuf): PokemonInteractionSet {
|
||||
return PokemonInteractionSet.decode(buffer)
|
||||
}
|
||||
|
||||
override fun synchronizeDecoded(entries: Collection<PokemonInteractionSet>) {
|
||||
PokemonInteractions.interactions.clear()
|
||||
PokemonInteractions.interactions.addAll(entries)
|
||||
}
|
||||
|
||||
companion object {
|
||||
val ID = cobblemonResource("pokemon_interactions_sync")
|
||||
|
||||
fun decode(buffer: RegistryFriendlyByteBuf): PokemonInteractionsSyncPacket {
|
||||
val speciesInteractions = buffer.readList { it ->
|
||||
PokemonInteractionSet.decode(it)
|
||||
}
|
||||
val generalInteractions = buffer.readList { it ->
|
||||
PokemonInteractionSet.decode(it)
|
||||
}
|
||||
|
||||
return PokemonInteractionsSyncPacket(
|
||||
speciesInteractions,
|
||||
generalInteractions,
|
||||
)
|
||||
}
|
||||
fun decode(buffer: RegistryFriendlyByteBuf): PokemonInteractionsSyncPacket = PokemonInteractionsSyncPacket(emptyList()).apply { decodeBuffer(buffer) }
|
||||
}
|
||||
}
|
||||
+20
-22
@@ -31,29 +31,27 @@ abstract class SpawnExtraDataEntityPacket<T: NetworkPacket<T>, E : Entity>(var v
|
||||
abstract fun checkType(entity: Entity): Boolean
|
||||
|
||||
fun spawnAndApply(client: Minecraft) {
|
||||
client.execute {
|
||||
val player = client.player ?: return@execute
|
||||
val world = player.level() as? ClientLevel ?: return@execute
|
||||
// This is a copy pasta of ClientPlayNetworkHandler#onEntitySpawn
|
||||
// This exists due to us needing to do everything it does except spawn the entity in the world.
|
||||
// We invoke applyData then we add the entity to the world.
|
||||
PacketUtils.ensureRunningOnSameThread(this.vanillaSpawnPacket, player.connection, client)
|
||||
val entityType = this.vanillaSpawnPacket.type
|
||||
val entity = entityType.create(world) ?: return@execute
|
||||
entity.recreateFromPacket(this.vanillaSpawnPacket)
|
||||
entity.deltaMovement = Vec3(
|
||||
this.vanillaSpawnPacket.xa,
|
||||
this.vanillaSpawnPacket.ya,
|
||||
this.vanillaSpawnPacket.za
|
||||
)
|
||||
// Cobblemon start
|
||||
if (this.checkType(entity)) {
|
||||
this.applyData(entity as E, world)
|
||||
}
|
||||
// Cobblemon end
|
||||
world.addEntity(entity)
|
||||
(player.connection as ClientPlayNetworkHandlerInvoker).callPlaySpawnSound(entity)
|
||||
val player = client.player ?: return
|
||||
val world = player.level() as? ClientLevel ?: return
|
||||
// This is a copy pasta of ClientPlayNetworkHandler#onEntitySpawn
|
||||
// This exists due to us needing to do everything it does except spawn the entity in the world.
|
||||
// We invoke applyData then we add the entity to the world.
|
||||
PacketUtils.ensureRunningOnSameThread(this.vanillaSpawnPacket, player.connection, client)
|
||||
val entityType = this.vanillaSpawnPacket.type
|
||||
val entity = entityType.create(world) ?: return
|
||||
entity.recreateFromPacket(this.vanillaSpawnPacket)
|
||||
entity.deltaMovement = Vec3(
|
||||
this.vanillaSpawnPacket.xa,
|
||||
this.vanillaSpawnPacket.ya,
|
||||
this.vanillaSpawnPacket.za
|
||||
)
|
||||
// Cobblemon start
|
||||
if (this.checkType(entity)) {
|
||||
this.applyData(entity as E, world)
|
||||
}
|
||||
// Cobblemon end
|
||||
world.addEntity(entity)
|
||||
(player.connection as ClientPlayNetworkHandlerInvoker).callPlaySpawnSound(entity)
|
||||
}
|
||||
|
||||
companion object {
|
||||
|
||||
+10
-12
@@ -18,14 +18,22 @@ import com.cobblemon.mod.common.entity.PlatformType
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||
import com.cobblemon.mod.common.pokemon.Gender
|
||||
import com.cobblemon.mod.common.util.*
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import com.cobblemon.mod.common.util.readEnumConstant
|
||||
import com.cobblemon.mod.common.util.readIdentifier
|
||||
import com.cobblemon.mod.common.util.readString
|
||||
import com.cobblemon.mod.common.util.readText
|
||||
import com.cobblemon.mod.common.util.writeEnumConstant
|
||||
import com.cobblemon.mod.common.util.writeIdentifier
|
||||
import com.cobblemon.mod.common.util.writeString
|
||||
import com.cobblemon.mod.common.util.writeText
|
||||
import java.util.UUID
|
||||
import net.minecraft.client.multiplayer.ClientLevel
|
||||
import net.minecraft.network.RegistryFriendlyByteBuf
|
||||
import net.minecraft.network.chat.MutableComponent
|
||||
import net.minecraft.network.protocol.game.ClientboundAddEntityPacket
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.world.entity.Entity
|
||||
import java.util.*
|
||||
|
||||
class SpawnPokemonPacket(
|
||||
var ownerId: UUID?,
|
||||
@@ -51,7 +59,6 @@ class SpawnPokemonPacket(
|
||||
var spawnYaw: Float,
|
||||
var friendship: Int,
|
||||
var freezeFrame: Float,
|
||||
var passengers: IntArray,
|
||||
var tickSpawned: Int,
|
||||
var rideBoosts: Map<RidingStat, Float>,
|
||||
var rideStamina: Float,
|
||||
@@ -85,7 +92,6 @@ class SpawnPokemonPacket(
|
||||
entity.entityData.get(PokemonEntity.SPAWN_DIRECTION),
|
||||
entity.entityData.get(PokemonEntity.FRIENDSHIP),
|
||||
entity.entityData.get(PokemonEntity.FREEZE_FRAME),
|
||||
entity.passengers.map { it.id }.toIntArray(),
|
||||
entity.tickCount,
|
||||
entity.entityData.get(PokemonEntity.RIDE_BOOSTS),
|
||||
entity.entityData.get(PokemonEntity.RIDE_STAMINA),
|
||||
@@ -117,7 +123,6 @@ class SpawnPokemonPacket(
|
||||
buffer.writeFloat(this.spawnYaw)
|
||||
buffer.writeInt(this.friendship)
|
||||
buffer.writeFloat(this.freezeFrame)
|
||||
buffer.writeVarIntArray(this.passengers)
|
||||
buffer.writeInt(this.tickSpawned)
|
||||
buffer.writeMap(
|
||||
rideBoosts,
|
||||
@@ -173,11 +178,6 @@ class SpawnPokemonPacket(
|
||||
entity.entityData.set(PokemonEntity.SCALE_MODIFIER, scaleModifier)
|
||||
entity.isSilent = silent
|
||||
|
||||
entity.ejectPassengers()
|
||||
passengers.forEach {
|
||||
val passenger = level.getEntity(it) ?: return@forEach
|
||||
passenger.startRiding(entity)
|
||||
}
|
||||
entity.tickSpawned = this.tickSpawned
|
||||
entity.delegate.updateAge(this.tickSpawned)
|
||||
}
|
||||
@@ -210,7 +210,6 @@ class SpawnPokemonPacket(
|
||||
val spawnAngle = buffer.readFloat()
|
||||
val friendship = buffer.readInt()
|
||||
val freezeFrame = buffer.readFloat()
|
||||
val passengers = buffer.readVarIntArray()
|
||||
val tickSpawned = buffer.readInt()
|
||||
val rideBoosts = buffer.readMap(
|
||||
{ buffer.readEnumConstant(RidingStat::class.java) },
|
||||
@@ -244,7 +243,6 @@ class SpawnPokemonPacket(
|
||||
spawnAngle,
|
||||
friendship,
|
||||
freezeFrame,
|
||||
passengers,
|
||||
tickSpawned,
|
||||
rideBoosts,
|
||||
rideStamina,
|
||||
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
* 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.server.storage.party
|
||||
|
||||
import com.cobblemon.mod.common.api.net.NetworkPacket
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import net.minecraft.network.RegistryFriendlyByteBuf
|
||||
|
||||
class PartyTutorialPacket : NetworkPacket<PartyTutorialPacket> {
|
||||
override val id = ID
|
||||
|
||||
override fun encode(buffer: RegistryFriendlyByteBuf) {}
|
||||
|
||||
companion object {
|
||||
val ID = cobblemonResource("party_select_tutorial")
|
||||
fun decode(buffer: RegistryFriendlyByteBuf): PartyTutorialPacket = PartyTutorialPacket()
|
||||
}
|
||||
}
|
||||
+28
@@ -0,0 +1,28 @@
|
||||
/*
|
||||
* 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.serverhandling.storage.party
|
||||
|
||||
import com.cobblemon.mod.common.Cobblemon
|
||||
import com.cobblemon.mod.common.api.net.ServerNetworkPacketHandler
|
||||
import com.cobblemon.mod.common.api.storage.player.PlayerInstancedDataStoreTypes
|
||||
import com.cobblemon.mod.common.net.messages.server.storage.party.PartyTutorialPacket
|
||||
import net.minecraft.server.MinecraftServer
|
||||
import net.minecraft.server.level.ServerPlayer
|
||||
|
||||
object PartyTutorialPacketHandler : ServerNetworkPacketHandler<PartyTutorialPacket> {
|
||||
override fun handle(packet: PartyTutorialPacket, server: MinecraftServer, player: ServerPlayer) {
|
||||
val pd = Cobblemon.playerDataManager.getGenericData(player)
|
||||
|
||||
if (!pd.partySelectTutorialDone) {
|
||||
pd.partySelectTutorialDone = true
|
||||
Cobblemon.playerDataManager.saveSingle(pd, PlayerInstancedDataStoreTypes.GENERAL)
|
||||
pd.sendToPlayer(player)
|
||||
}
|
||||
}
|
||||
}
|
||||
+1
@@ -67,6 +67,7 @@ object CobblemonRequirementAdapter : RequirementAdapter {
|
||||
this.registerType(PropertyRangeRequirement.ADAPTER_VARIANT, PropertyRangeRequirement::class)
|
||||
this.registerType(AdvancementRequirement.ADAPTER_VARIANT, AdvancementRequirement::class)
|
||||
this.registerType(OwnerHoldsItemRequirement.ADAPTER_VARIANT, OwnerHoldsItemRequirement::class)
|
||||
this.registerType(ChanceRequirement.ADAPTER_VARIANT, ChanceRequirement::class)
|
||||
}
|
||||
|
||||
val gson: Gson by lazy {
|
||||
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.pokemon.requirements
|
||||
|
||||
import com.cobblemon.mod.common.api.molang.ExpressionLike
|
||||
import com.cobblemon.mod.common.api.pokemon.requirement.Requirement
|
||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||
import com.cobblemon.mod.common.util.asExpressionLike
|
||||
import com.cobblemon.mod.common.util.genericRuntime
|
||||
import com.cobblemon.mod.common.util.resolveFloat
|
||||
import kotlin.random.Random
|
||||
|
||||
/**
|
||||
* A requirement that will only pass the check if some random chance is satisfied.
|
||||
*
|
||||
* @author Hiroku
|
||||
* @since January 30th, 2026
|
||||
*/
|
||||
class ChanceRequirement : Requirement {
|
||||
companion object {
|
||||
const val ADAPTER_VARIANT = "chance"
|
||||
}
|
||||
|
||||
val chance: ExpressionLike = "1".asExpressionLike()
|
||||
|
||||
override fun check(pokemon: Pokemon): Boolean {
|
||||
genericRuntime.environment.query.addFunction("pokemon") { pokemon.struct }
|
||||
val chance = genericRuntime.resolveFloat(chance)
|
||||
return Random.nextFloat() < chance
|
||||
}
|
||||
}
|
||||
@@ -45,14 +45,15 @@ class ActiveTrade(val player1: TradeParticipant, val player2: TradeParticipant)
|
||||
|
||||
fun performTrade(tradeParticipant: TradeParticipant) {
|
||||
val offer = getOpposingOffer(tradeParticipant)
|
||||
|
||||
if (offer.accepted && getOffer(tradeParticipant).accepted) {
|
||||
TradeManager.performTrade(
|
||||
activeTrade = this,
|
||||
player1 = player1,
|
||||
player2 = player2,
|
||||
pokemon1 = player1Offer.pokemon!!,
|
||||
pokemon2 = player2Offer.pokemon!!
|
||||
)
|
||||
completeTrade()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -98,11 +98,23 @@ object TradeManager : RequestManager<TradeManager.TradeRequest>() {
|
||||
}
|
||||
}
|
||||
|
||||
fun performTrade(player1: TradeParticipant, pokemon1: Pokemon, player2: TradeParticipant, pokemon2: Pokemon) {
|
||||
CobblemonEvents.TRADE_EVENT_PRE.postThen(TradeEvent.Pre(player1, pokemon2, player2, pokemon1)) {
|
||||
val party1 = player1.party
|
||||
val party2 = player2.party
|
||||
fun performTrade(
|
||||
activeTrade: ActiveTrade,
|
||||
player1: TradeParticipant,
|
||||
pokemon1: Pokemon,
|
||||
player2: TradeParticipant,
|
||||
pokemon2: Pokemon
|
||||
) {
|
||||
val party1 = player1.party
|
||||
val party2 = player2.party
|
||||
|
||||
if (pokemon1 !in party1 || pokemon2 !in party2) {
|
||||
Cobblemon.LOGGER.warn("Attempted to perform a trade with Pokémon that aren't in the party anymore. Could be attempted duping between ${player1.name} and ${player2.name}")
|
||||
activeTrade.cancelTrade()
|
||||
return
|
||||
}
|
||||
|
||||
CobblemonEvents.TRADE_EVENT_PRE.postThen(TradeEvent.Pre(player1, pokemon2, player2, pokemon1)) {
|
||||
party1.remove(pokemon1)
|
||||
party2.remove(pokemon2)
|
||||
|
||||
@@ -120,6 +132,8 @@ object TradeManager : RequestManager<TradeManager.TradeRequest>() {
|
||||
it.attemptEvolution(pokemon2, pokemon1)
|
||||
}
|
||||
|
||||
activeTrade.completeTrade()
|
||||
|
||||
CobblemonEvents.TRADE_EVENT_POST.post(TradeEvent.Post(player1, pokemon2, player2, pokemon1))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -261,8 +261,8 @@ object DataKeys {
|
||||
|
||||
const val SCRIPTED_BEHAVIOURS_ARE_CUSTOM = "BehavioursAreCustom"
|
||||
const val SCRIPTED_BEHAVIOURS = "Behaviours"
|
||||
const val SCRIPTED_DATA = "Data"
|
||||
const val SCRIPTED_CONFIG = "Config"
|
||||
const val SCRIPTED_DATA = "ScriptingData"
|
||||
const val SCRIPTED_CONFIG = "ScriptingConfig"
|
||||
|
||||
// PokemonProperties
|
||||
const val ELEMENTAL_TYPE = "ElementalType"
|
||||
|
||||
@@ -36,6 +36,11 @@ fun String.asIdentifierDefaultingNamespace(namespace: String = Cobblemon.MODID):
|
||||
return if (id.contains(":")) ResourceLocation.fromNamespaceAndPath(id.substringBefore(":"), id.substringAfter(":")) else ResourceLocation.fromNamespaceAndPath(namespace, id)
|
||||
}
|
||||
|
||||
fun ResourceLocation.toAssetPath(prefix: String = "", suffix: String = ""): ResourceLocation {
|
||||
return ResourceLocation.fromNamespaceAndPath(this.namespace, "$prefix$path$suffix")
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Attempts to parse an [ResourceLocation] from the [StringReader].
|
||||
* Unlike [ResourceLocation.fromCommandInput] this will default the namespace to the given [namespace] if non-present.
|
||||
|
||||
+122
@@ -271,6 +271,119 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.mantine.ride_jump": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"torso": {
|
||||
"rotation": ["0+q.r.velocity_y(0)*-30+math.sin(q.anim_time*90*16)*1", 0, 0],
|
||||
"position": [0, "0+math.sin(q.anim_time*90*16-90)*0.1", 0]
|
||||
},
|
||||
"antenna_right": {
|
||||
"rotation": ["-10+q.r.velocity_y(0)*20+math.sin(q.anim_time*90*16-90)*3", 15, -12.5]
|
||||
},
|
||||
"antenna_right2": {
|
||||
"rotation": ["0+math.sin(q.anim_time*90*16-150)*3", 0, 17.5]
|
||||
},
|
||||
"antenna_right3": {
|
||||
"rotation": ["0+math.sin(q.anim_time*90*16-210)*8", 0, 10]
|
||||
},
|
||||
"antenna_left": {
|
||||
"rotation": ["-10+q.r.velocity_y(0)*20+math.sin(q.anim_time*90*16-90)*3", -15, 12.5]
|
||||
},
|
||||
"antenna_left2": {
|
||||
"rotation": ["0+math.sin(q.anim_time*90*16-150)*3", 0, -17.5]
|
||||
},
|
||||
"antenna_left3": {
|
||||
"rotation": ["0+math.sin(q.anim_time*90*16-210)*8", 0, -10]
|
||||
},
|
||||
"wing_right": {
|
||||
"rotation": [0, 0, "-2.5+q.r.velocity_y(0)*-20+math.sin(q.anim_time*90*16-90)*-1"]
|
||||
},
|
||||
"wing_right2": {
|
||||
"rotation": [0, 0, "-7.5+q.r.velocity_y(0)*-10+math.sin(q.anim_time*90*16-120)*-1"]
|
||||
},
|
||||
"wing_right3": {
|
||||
"rotation": [0, 0, "-5+q.r.velocity_y(0)*-5+math.sin(q.anim_time*90*16-180)*-1"]
|
||||
},
|
||||
"wing_right4": {
|
||||
"rotation": [0, 0, "5+q.r.velocity_y(0)*-5+math.sin(q.anim_time*90*16-250)*-3"]
|
||||
},
|
||||
"wing_left": {
|
||||
"rotation": [0, 0, "2.5+q.r.velocity_y(0)*20+math.sin(q.anim_time*90*16-90)*1"]
|
||||
},
|
||||
"wing_left2": {
|
||||
"rotation": [0, 0, "7.5+q.r.velocity_y(0)*10+math.sin(q.anim_time*90*16-120)*1"]
|
||||
},
|
||||
"wing_left3": {
|
||||
"rotation": [0, 0, "5+q.r.velocity_y(0)*5+math.sin(q.anim_time*90*16-180)*1"]
|
||||
},
|
||||
"wing_left4": {
|
||||
"rotation": [0, 0, "-5+q.r.velocity_y(0)*5+math.sin(q.anim_time*90*16-250)*3"]
|
||||
},
|
||||
"tail": {
|
||||
"rotation": ["-12.5+q.r.velocity_y(0)*-10+math.sin(q.anim_time*90*16-45)*1", 0, 0]
|
||||
},
|
||||
"tail2": {
|
||||
"rotation": ["5+q.r.velocity_y(0)*-10+math.sin(q.anim_time*90*16-90)*1", 0, 0]
|
||||
},
|
||||
"tail3": {
|
||||
"rotation": ["7.5+q.r.velocity_y(0)*-10+math.sin(q.anim_time*90*16-130)*3", 0, 0]
|
||||
},
|
||||
"tail4": {
|
||||
"rotation": ["10+q.r.velocity_y(0)*-10+math.sin(q.anim_time*90*16-180)*6", 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.mantine.ride_water_swim": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"torso": {
|
||||
"rotation": ["0+q.r.pitch_change(0)*-8", "0+q.r.yaw_change(0)*12", "0+q.r.roll_change(0)*-12"]
|
||||
},
|
||||
"antenna_right2": {
|
||||
"rotation": [0, 0, "0+q.r.yaw_change(0)*12"]
|
||||
},
|
||||
"antenna_left2": {
|
||||
"rotation": [0, 0, "0+q.r.yaw_change(0)*12"]
|
||||
},
|
||||
"wing_right": {
|
||||
"rotation": [0, "0+q.r.pitch_change(0)*8", "0+q.r.roll_change(0)*12"]
|
||||
},
|
||||
"wing_right2": {
|
||||
"rotation": [0, 0, "0+q.r.roll_change(0)*12"]
|
||||
},
|
||||
"wing_right3": {
|
||||
"rotation": [0, 0, "0+q.r.roll_change(0)*12"]
|
||||
},
|
||||
"wing_right4": {
|
||||
"rotation": [0, 0, "0+q.r.roll_change(0)*12"]
|
||||
},
|
||||
"wing_left": {
|
||||
"rotation": [0, "0+q.r.pitch_change(0)*-8", "0+q.r.roll_change(0)*12"]
|
||||
},
|
||||
"wing_left2": {
|
||||
"rotation": [0, 0, "0+q.r.roll_change(0)*12"]
|
||||
},
|
||||
"wing_left3": {
|
||||
"rotation": [0, 0, "0+q.r.roll_change(0)*12"]
|
||||
},
|
||||
"wing_left4": {
|
||||
"rotation": [0, 0, "0+q.r.roll_change(0)*12"]
|
||||
},
|
||||
"tail": {
|
||||
"rotation": ["0+q.r.pitch_change(0)*-8", "0+q.r.yaw_change(0)*-12", 0]
|
||||
},
|
||||
"tail2": {
|
||||
"rotation": ["0+q.r.pitch_change(0)*-8", "0+q.r.yaw_change(0)*-4", 0]
|
||||
},
|
||||
"tail3": {
|
||||
"rotation": ["0+q.r.pitch_change(0)*-8", 0, 0]
|
||||
},
|
||||
"tail4": {
|
||||
"rotation": ["0+q.r.pitch_change(0)*-8", 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.mantine.sleep": {
|
||||
"loop": true,
|
||||
"animation_length": 4,
|
||||
@@ -588,7 +701,16 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.mantine.walkspeedtest": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"mantine": {
|
||||
"position": [0, 0, "-q.anim_time*90*0.4"]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.mantine.cry": {
|
||||
"animation_length": 1.25,
|
||||
"sound_effects": {
|
||||
"0.0417": {
|
||||
"effect": "pokemon.mantine.cry"
|
||||
|
||||
+8
@@ -1005,6 +1005,14 @@
|
||||
"position": [-0.1, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.treecko.cry": {
|
||||
"animation_length": 1.25,
|
||||
"sound_effects": {
|
||||
"0.0417": {
|
||||
"effect": "pokemon.treecko.cry"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+8
@@ -167,6 +167,14 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.grovyle.cry": {
|
||||
"animation_length": 1.25,
|
||||
"sound_effects": {
|
||||
"0.0417": {
|
||||
"effect": "pokemon.grovyle.cry"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+8
@@ -551,6 +551,14 @@
|
||||
"position": [0, 0.3, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.sceptile.cry": {
|
||||
"animation_length": 1.25,
|
||||
"sound_effects": {
|
||||
"0.0417": {
|
||||
"effect": "pokemon.sceptile.cry"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+182
@@ -3373,6 +3373,188 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.flygon.ride_jump": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"body": {
|
||||
"rotation": [0, "-Math.cos((query.anim_time)*90*12)*-0.1", "Math.sin((query.anim_time)*90*12-12)*-0.1"],
|
||||
"position": [0, 4, 1]
|
||||
},
|
||||
"torso": {
|
||||
"rotation": ["70+q.r.velocity_y(0)*-15", 0, 0]
|
||||
},
|
||||
"chest": {
|
||||
"rotation": ["-15+q.r.velocity_y(0)*4", 0, 0]
|
||||
},
|
||||
"neck": {
|
||||
"rotation": ["-4+q.r.velocity_y(0)*4-(q.r.velocity_y(0)-0.5)*Math.cos((query.anim_time)*90*12-30)*0.1", 0, 0]
|
||||
},
|
||||
"neck2": {
|
||||
"rotation": ["-20+q.r.velocity_y(0)*10-(q.r.velocity_y(0)-0.5)*Math.cos((query.anim_time)*90*12-60)*0.2", 0, 0]
|
||||
},
|
||||
"neck3": {
|
||||
"rotation": ["-15+q.r.velocity_y(0)*2-(q.r.velocity_y(0)-0.5)*Math.cos((query.anim_time)*90*12-90)*-0.3", 0, 0]
|
||||
},
|
||||
"head_angle": {
|
||||
"rotation": ["-10+q.r.velocity_y(0)*-2-(q.r.velocity_y(0)-0.5)*Math.cos((query.anim_time)*90*12-90)*-0.1", 0, 0]
|
||||
},
|
||||
"antenna_left": {
|
||||
"rotation": ["25+q.r.velocity_y(0)*-3-Math.cos((query.anim_time)*90*12-120)*0.5", 5, 0]
|
||||
},
|
||||
"antenna_left2": {
|
||||
"rotation": ["-25+q.r.velocity_y(0)*-10-Math.cos((query.anim_time)*90*12-150)*0.5", 0, 0]
|
||||
},
|
||||
"antenna_left3": {
|
||||
"rotation": ["-15+q.r.velocity_y(0)*-6-Math.cos((query.anim_time)*90*12-180)*1-Math.cos((query.anim_time)*90*30-180)*1", 0, 0]
|
||||
},
|
||||
"antenna_right": {
|
||||
"rotation": ["25+q.r.velocity_y(0)*-3-Math.cos((query.anim_time)*90*12-130)*0.5", -5, 0]
|
||||
},
|
||||
"antenna_right2": {
|
||||
"rotation": ["-25+q.r.velocity_y(0)*-10-Math.cos((query.anim_time)*90*12-160)*0.5", 0, 0]
|
||||
},
|
||||
"antenna_right3": {
|
||||
"rotation": ["-15+q.r.velocity_y(0)*-6-Math.cos((query.anim_time)*90*12-190)*1-Math.cos((query.anim_time)*90*30-1900)*1", 0, 0]
|
||||
},
|
||||
"arm_left": {
|
||||
"rotation": [70, "math.clamp(15+q.r.velocity_y(0)*25,15,45)", 75],
|
||||
"position": [0, "-1+q.r.velocity_y(0)*-1", "-1+q.r.velocity_y(0)*-1"]
|
||||
},
|
||||
"arm_left2": {
|
||||
"rotation": [0, 0, "-90+q.r.velocity_y(0)*-5"]
|
||||
},
|
||||
"hand_left": {
|
||||
"rotation": ["-10+q.r.velocity_y(0)*10", 0, "(45+q.r.velocity_y(0)*-20)"]
|
||||
},
|
||||
"finger_back_left_rotation": {
|
||||
"rotation": [0, 0, 30]
|
||||
},
|
||||
"finger_back_left2": {
|
||||
"rotation": [0, 0, 52.5]
|
||||
},
|
||||
"finger_center_left": {
|
||||
"rotation": [0, 0, 37.5]
|
||||
},
|
||||
"finger_center_left2": {
|
||||
"rotation": [0, 0, 37.5]
|
||||
},
|
||||
"finger_front_left_rotation": {
|
||||
"rotation": [0, 0, 45]
|
||||
},
|
||||
"finger_front_left2": {
|
||||
"rotation": [0, 0, 22.5]
|
||||
},
|
||||
"arm_right": {
|
||||
"rotation": [70, "-(math.clamp(15+q.r.velocity_y(0)*25,15,45))", -75],
|
||||
"position": [0, "-1+q.r.velocity_y(0)*-1", "-1+q.r.velocity_y(0)*-1"]
|
||||
},
|
||||
"arm_right2": {
|
||||
"rotation": [0, 0, "90+q.r.velocity_y(0)*-5"]
|
||||
},
|
||||
"hand_right": {
|
||||
"rotation": ["-10+q.r.velocity_y(0)*10", 0, "-((45+q.r.velocity_y(0)*-20))"]
|
||||
},
|
||||
"finger_back_right_rotation": {
|
||||
"rotation": [0, 0, -30]
|
||||
},
|
||||
"finger_back_right2": {
|
||||
"rotation": [0, 0, -52.5]
|
||||
},
|
||||
"finger_center_right": {
|
||||
"rotation": [0, 0, -37.5]
|
||||
},
|
||||
"finger_center_right2": {
|
||||
"rotation": [0, 0, -37.5]
|
||||
},
|
||||
"finger_front_right_rotation": {
|
||||
"rotation": [0, 0, -45]
|
||||
},
|
||||
"finger_front_right2": {
|
||||
"rotation": [0, 0, -22.5]
|
||||
},
|
||||
"wing_left": {
|
||||
"rotation": [
|
||||
"(16+q.r.velocity_y(0)*6.5)",
|
||||
"(-35+q.r.velocity_y(0)*9+(q.r.velocity_y(0)-0.9)*(Math.cos((query.anim_time)*90*12)*0.2+Math.cos((query.anim_time)*90*30)*0.6))",
|
||||
"(57.5+q.r.velocity_y(0)*7.5)"
|
||||
]
|
||||
},
|
||||
"wing_left2": {
|
||||
"rotation": [0, "(math.clamp(q.r.velocity_y(0)*20,-5,12)+Math.cos((query.anim_time)*90*30-30)*-1)", 0]
|
||||
},
|
||||
"wing_right": {
|
||||
"rotation": [
|
||||
"(16+q.r.velocity_y(0)*6.5)",
|
||||
"-((-35+q.r.velocity_y(0)*9+(q.r.velocity_y(0)-0.9)*(Math.cos((query.anim_time)*90*12-10)*0.2+Math.cos((query.anim_time)*90*30-10)*0.6)))",
|
||||
"-((57.5+q.r.velocity_y(0)*7.5))"
|
||||
]
|
||||
},
|
||||
"wing_right2": {
|
||||
"rotation": [0, "-((math.clamp(q.r.velocity_y(0)*20,-5,12)+Math.cos((query.anim_time)*90*30-30)*-1))", 0]
|
||||
},
|
||||
"tail": {
|
||||
"rotation": ["-80-q.r.velocity_y(0)*15-Math.cos((query.anim_time)*90*12)*0.05", "-Math.sin((query.anim_time)*90*6)*0.1", 0],
|
||||
"position": [0, "-0.5+q.r.velocity_y(0)*0.25", 2]
|
||||
},
|
||||
"tail2": {
|
||||
"rotation": ["5-q.r.velocity_y(0)*-10-Math.cos((query.anim_time)*90*12-20)*0.1", "-Math.sin((query.anim_time)*90*6-20)*0.5", 0]
|
||||
},
|
||||
"tail3": {
|
||||
"rotation": ["5-q.r.velocity_y(0)*-10-Math.cos((query.anim_time)*90*12-40)*0.2", "-Math.sin((query.anim_time)*90*6-40)*0.4", 0]
|
||||
},
|
||||
"tail4": {
|
||||
"rotation": ["10-q.r.velocity_y(0)*-5-Math.cos((query.anim_time)*90*12-60)*0.5", "-Math.sin((query.anim_time)*90*6-60)*0.5", 0]
|
||||
},
|
||||
"tail5": {
|
||||
"rotation": ["5+q.r.velocity_y(0)*-5-Math.cos((query.anim_time)*90*12-80)*1", "-Math.sin((query.anim_time)*90*6-80)*-1", 0]
|
||||
},
|
||||
"tail6": {
|
||||
"rotation": ["10-q.r.velocity_y(0)*15-Math.cos((query.anim_time)*90*12-100)*3", "-Math.sin((query.anim_time)*90*6-100)*-1", 0]
|
||||
},
|
||||
"tail_fins": {
|
||||
"rotation": ["5-q.r.velocity_y(0)*20-Math.cos((query.anim_time)*90*12-120)*-3", "-Math.sin((query.anim_time)*90*6-120)*-1", 0]
|
||||
},
|
||||
"leg_left": {
|
||||
"rotation": ["5+q.r.velocity_y(0)*32.5", 0, 0],
|
||||
"position": [0, "-3+q.r.velocity_y(0)*-1", "2+q.r.velocity_y(0)*-1"]
|
||||
},
|
||||
"leg_left2": {
|
||||
"rotation": ["6+q.r.velocity_y(0)*8.5", 0, 0],
|
||||
"position": [0, -1.25, "math.clamp(q.r.velocity_y(0)*1.75,0,2)"]
|
||||
},
|
||||
"foot_left": {
|
||||
"rotation": ["10.5+q.r.velocity_y(0)*5.5", 0, 0]
|
||||
},
|
||||
"foot_left2": {
|
||||
"rotation": ["8+q.r.velocity_y(0)*12", 0, 0],
|
||||
"position": [0, "math.clamp(q.r.velocity_y(0)*0.125,0,1)", "0.2+math.clamp(q.r.velocity_y(0)*0.675,-0.2,1)"]
|
||||
},
|
||||
"leg_right": {
|
||||
"rotation": ["5+q.r.velocity_y(0)*32.5", 0, 0],
|
||||
"position": [0, "-3+q.r.velocity_y(0)*-1", "2+q.r.velocity_y(0)*-1"]
|
||||
},
|
||||
"leg_right2": {
|
||||
"rotation": ["6+q.r.velocity_y(0)*8.5", 0, 0],
|
||||
"position": [0, -1.25, "math.clamp(q.r.velocity_y(0)*1.75,0,2)"]
|
||||
},
|
||||
"foot_right": {
|
||||
"rotation": ["10.5+q.r.velocity_y(0)*5.5", 0, 0]
|
||||
},
|
||||
"foot_right2": {
|
||||
"rotation": ["8+q.r.velocity_y(0)*12", 0, 0],
|
||||
"position": [0, "math.clamp(q.r.velocity_y(0)*0.125,0,1)", "0.2+math.clamp(q.r.velocity_y(0)*0.675,-0.2,1)"]
|
||||
},
|
||||
"tail_fin_center": {
|
||||
"rotation": ["6-Math.cos((query.anim_time)*90*30-80)*-6", 0, 0]
|
||||
},
|
||||
"tail_fin_left": {
|
||||
"rotation": ["-0-Math.cos((query.anim_time)*90*30-90)*-5", "(-10+q.r.velocity_y(0)*-15)", 0]
|
||||
},
|
||||
"tail_fin_right": {
|
||||
"rotation": ["-0-Math.cos((query.anim_time)*90*30-100)*-5", "-(-10+q.r.velocity_y(0)*-15)", 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.flygon.shock": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
|
||||
+303
-47
@@ -3,18 +3,19 @@
|
||||
"animations": {
|
||||
"animation.chimecho.ground_idle": {
|
||||
"loop": true,
|
||||
"animation_length": 864.1667,
|
||||
"bones": {
|
||||
"body": {
|
||||
"rotation": ["math.sin(q.anim_time*90*0.5+15)*2", 0, "math.sin(q.anim_time*90*1+35)*5"],
|
||||
"position": [0, "math.sin(q.anim_time*90*2)*2*math.sin(q.anim_time*90*1)*0.2", 0]
|
||||
},
|
||||
"arm_left": {
|
||||
"rotation": ["math.sin(q.anim_time*90*2-30)*4*math.sin(q.anim_time*90*1-30)*-1", 0, 0],
|
||||
"position": [-1, 0.5, -0.25]
|
||||
},
|
||||
"arm_right": {
|
||||
"rotation": ["math.sin(q.anim_time*90*2-30)*4*math.sin(q.anim_time*90*1-30)*-1", 0, 0],
|
||||
"position": [1, 0.5, -0.25]
|
||||
"position": [-0.5, 0.25, -0.25]
|
||||
},
|
||||
"arm_left": {
|
||||
"rotation": ["math.sin(q.anim_time*90*2-30)*4*math.sin(q.anim_time*90*1-30)*-1", 0, 0],
|
||||
"position": [0.5, 0.25, -0.25]
|
||||
},
|
||||
"tail": {
|
||||
"rotation": ["math.sin(q.anim_time*90*2-30)*-5*math.sin(q.anim_time*90*1-30)*-2", 0, 0]
|
||||
@@ -40,13 +41,13 @@
|
||||
"rotation": ["math.sin(q.anim_time*90*0.5+15)*2", 0, "math.sin(q.anim_time*90*1+35)*5"],
|
||||
"position": [0, "math.sin(q.anim_time*90*2)*2*math.sin(q.anim_time*90*1)*0.2", 0]
|
||||
},
|
||||
"arm_left": {
|
||||
"rotation": ["math.sin(q.anim_time*90*2-30)*4*math.sin(q.anim_time*90*1-30)*-1", 0, 0],
|
||||
"position": [-1, 0.5, -0.25]
|
||||
},
|
||||
"arm_right": {
|
||||
"rotation": ["math.sin(q.anim_time*90*2-30)*4*math.sin(q.anim_time*90*1-30)*-1", 0, 0],
|
||||
"position": [1, 0.5, -0.25]
|
||||
"position": [-0.5, 0.25, -0.25]
|
||||
},
|
||||
"arm_left": {
|
||||
"rotation": ["math.sin(q.anim_time*90*2-30)*4*math.sin(q.anim_time*90*1-30)*-1", 0, 0],
|
||||
"position": [0.5, 0.25, -0.25]
|
||||
},
|
||||
"tail": {
|
||||
"rotation": ["math.sin(q.anim_time*90*2-30)*-5*math.sin(q.anim_time*90*1-30)*-2", 0, 0]
|
||||
@@ -72,13 +73,11 @@
|
||||
"rotation": ["5+math.sin(q.anim_time*90*4+50)*1", 0, "math.sin(q.anim_time*90*1+35)*-2"],
|
||||
"position": [0, "math.sin(q.anim_time*90*4)*0.3", "math.sin(q.anim_time*90*4)*-0.2"]
|
||||
},
|
||||
"arm_left": {
|
||||
"rotation": ["math.sin(q.anim_time*90*4-30)*5", 0, 0],
|
||||
"position": [-0.25, 0, 0]
|
||||
},
|
||||
"arm_right": {
|
||||
"rotation": ["math.sin(q.anim_time*90*4-20)*5", 0, 0],
|
||||
"position": [0.25, 0, 0]
|
||||
"rotation": ["math.sin(q.anim_time*90*4-30)*5", 0, 0]
|
||||
},
|
||||
"arm_left": {
|
||||
"rotation": ["math.sin(q.anim_time*90*4-20)*5", 0, 0]
|
||||
},
|
||||
"tail": {
|
||||
"rotation": ["math.sin(q.anim_time*90*4-30)*-2", 0, 0]
|
||||
@@ -104,13 +103,11 @@
|
||||
"rotation": ["5+math.sin(q.anim_time*90*4+50)*1", 0, "math.sin(q.anim_time*90*1+35)*-2"],
|
||||
"position": [0, "math.sin(q.anim_time*90*4)*0.3", "math.sin(q.anim_time*90*4)*-0.2"]
|
||||
},
|
||||
"arm_left": {
|
||||
"rotation": ["math.sin(q.anim_time*90*4-30)*5", 0, 0],
|
||||
"position": [-0.25, 0, 0]
|
||||
},
|
||||
"arm_right": {
|
||||
"rotation": ["math.sin(q.anim_time*90*4-20)*5", 0, 0],
|
||||
"position": [0.25, 0, 0]
|
||||
"rotation": ["math.sin(q.anim_time*90*4-30)*5", 0, 0]
|
||||
},
|
||||
"arm_left": {
|
||||
"rotation": ["math.sin(q.anim_time*90*4-20)*5", 0, 0]
|
||||
},
|
||||
"tail": {
|
||||
"rotation": ["math.sin(q.anim_time*90*4-30)*-2", 0, 0]
|
||||
@@ -140,10 +137,10 @@
|
||||
"math.sin(q.anim_time*90*4-90)*-0.8"
|
||||
]
|
||||
},
|
||||
"arm_left": {
|
||||
"arm_right": {
|
||||
"rotation": ["math.sin(q.anim_time*90*4-30)*8", 0, 0]
|
||||
},
|
||||
"arm_right": {
|
||||
"arm_left": {
|
||||
"rotation": ["math.sin(q.anim_time*90*4-20)*8", 0, 0]
|
||||
},
|
||||
"tail": {
|
||||
@@ -170,21 +167,21 @@
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"body": {
|
||||
"position": [0, -15, 2]
|
||||
"position": [0, -17.5, 2]
|
||||
},
|
||||
"eyelid_right": {
|
||||
"position": [0, 0, -0.1]
|
||||
"position": [0, 0, -0.2]
|
||||
},
|
||||
"eyelid_left": {
|
||||
"position": [0, 0, -0.1]
|
||||
"position": [0, 0, -0.2]
|
||||
},
|
||||
"head": {
|
||||
"rotation": ["-4+math.sin(q.anim_time*90*1)*-1-1", "-0.1+math.sin(q.anim_time*90*1)*-0.5", -3]
|
||||
},
|
||||
"arm_left": {
|
||||
"arm_right": {
|
||||
"rotation": ["-2.5+math.sin(q.anim_time*90*1-30)*2", 0.2, 42.5]
|
||||
},
|
||||
"arm_right": {
|
||||
"arm_left": {
|
||||
"rotation": ["2.5+math.sin(q.anim_time*90*1-30)*2", 0, -37.5]
|
||||
},
|
||||
"tail": {
|
||||
@@ -201,6 +198,15 @@
|
||||
},
|
||||
"ribbon4": {
|
||||
"rotation": [-2, -1, "math.sin(q.anim_time*90*1-80)*5"]
|
||||
},
|
||||
"eyes": {
|
||||
"position": [0, 0, 0.1]
|
||||
},
|
||||
"eyes_ditto": {
|
||||
"position": [0, 0, 0.1]
|
||||
},
|
||||
"eyes_blink_ditto": {
|
||||
"position": [0, 0, -0.1]
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -283,22 +289,22 @@
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"2.0": {
|
||||
"post": [2.4, -12.3, 0.85],
|
||||
"post": [2.4, -13.3, 0.85],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"2.0833": {
|
||||
"post": [1.6, -11.5, 0.85],
|
||||
"post": [1.6, -12.5, 0.85],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"2.2083": {
|
||||
"post": [0.9, -11.9, 0.85],
|
||||
"post": [0.9, -12.9, 0.85],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"2.3333": {
|
||||
"post": [1.53, -11.89, 0.85],
|
||||
"post": [1.53, -12.89, 0.85],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"2.4583": [1.4, -12, 0.85]
|
||||
"2.4583": [1.4, -13, 0.85]
|
||||
}
|
||||
},
|
||||
"head": {
|
||||
@@ -358,7 +364,7 @@
|
||||
"1.9167": [0, 0, -0.1]
|
||||
}
|
||||
},
|
||||
"arm_left": {
|
||||
"arm_right": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.1667": [-7.36, -2.27, 0.53],
|
||||
@@ -387,7 +393,7 @@
|
||||
"2.4167": [-20.46837, 12.38579, 5.5139]
|
||||
}
|
||||
},
|
||||
"arm_right": {
|
||||
"arm_left": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.1667": [-7.36, 2.27, -0.53],
|
||||
@@ -623,8 +629,29 @@
|
||||
"2.4583": [18.18235, 2.90113, 3.04049],
|
||||
"2.6667": [3.86, 2.9, 3.04],
|
||||
"2.8333": [28.96168, -1.75342, 1.21027],
|
||||
"2.9167": [37.33288, -2.65201, 0.21221],
|
||||
"3.0": [30.70408, -3.55061, -0.78586]
|
||||
"2.9167": [40.53288, -2.65201, 0.21221],
|
||||
"3.0": [42.30408, -3.55061, -0.78586]
|
||||
}
|
||||
},
|
||||
"mouth_open": {
|
||||
"position": {
|
||||
"0.7917": [0, 0, 0],
|
||||
"0.8333": [0, 0, -0.1],
|
||||
"1.5833": [0, 0, -0.1],
|
||||
"1.625": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"mouth_smile": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.8333": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0, 0.1]
|
||||
},
|
||||
"1.625": {
|
||||
"pre": [0, 0, 0.1],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -656,17 +683,23 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"mouth": {
|
||||
"mouth_open": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.25": [0, 0, -0.1],
|
||||
"1.25": [0, 0, -0.1],
|
||||
"1.5": [0, 0, 0]
|
||||
"0.25": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
|
||||
"1.3333": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"mouth_smile": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.25": {"pre": [0, 0, 0], "post": [0, 0, 0.1]},
|
||||
"1.3333": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
|
||||
}
|
||||
}
|
||||
},
|
||||
"sound_effects": {
|
||||
"0.0417": {
|
||||
"0.25": {
|
||||
"effect": "pokemon.chimecho.cry"
|
||||
}
|
||||
}
|
||||
@@ -677,16 +710,239 @@
|
||||
"eyelid_left": {
|
||||
"position": {
|
||||
"0.0": [0, 0, -0.1],
|
||||
"0.125": [0, 0, -0.1],
|
||||
"0.1667": [0, 0, 0]
|
||||
"0.1667": {
|
||||
"pre": [0, 0, -0.1],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"eyelid_right": {
|
||||
"position": {
|
||||
"0.0": [0, 0, -0.1],
|
||||
"0.125": [0, 0, -0.1],
|
||||
"0.1667": [0, 0, 0]
|
||||
"0.1667": {
|
||||
"pre": [0, 0, -0.1],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"eyes_ditto": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0.1],
|
||||
"0.1667": {
|
||||
"pre": [0, 0, 0.1],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"eyes_blink_ditto": {
|
||||
"position": {
|
||||
"0.0": [0, 0, -0.1],
|
||||
"0.1667": {
|
||||
"pre": [0, 0, -0.1],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.chimecho.happy": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"mouth": {
|
||||
"position": [0, 0, 0.1]
|
||||
},
|
||||
"mouth_open": {
|
||||
"position": [0, 0, -0.1]
|
||||
},
|
||||
"eyes_happy": {
|
||||
"position": [0, 0, -0.2]
|
||||
},
|
||||
"mouth_smile": {
|
||||
"position": [0, 0, 0.1]
|
||||
},
|
||||
"eyelid_left_happy": {
|
||||
"position": [0, 0, -0.1]
|
||||
},
|
||||
"eyelid_right_happy": {
|
||||
"position": [0, 0, -0.1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.chimecho.shocked": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"mouth": {
|
||||
"position": [0, 0, 0.1]
|
||||
},
|
||||
"eye_right": {
|
||||
"scale": [0.6, 0.6, 1]
|
||||
},
|
||||
"eye_left": {
|
||||
"scale": [0.6, 0.6, 1]
|
||||
},
|
||||
"mouth_open_shocked": {
|
||||
"position": [0, 0, -0.1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.chimecho.intrigued": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"mouth": {
|
||||
"position": [0, 0, 0.1]
|
||||
},
|
||||
"mouth_0": {
|
||||
"position": [0, 0, -0.1]
|
||||
},
|
||||
"mouth_smile": {
|
||||
"position": [0, 0, 0.1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.chimecho.angry": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"mouth": {
|
||||
"rotation": [0, 0, 180],
|
||||
"position": [0, -0.5, 0]
|
||||
},
|
||||
"eyebrows": {
|
||||
"position": [0, 0, -0.1]
|
||||
},
|
||||
"mouth_smile": {
|
||||
"position": [0, 0, 0.1]
|
||||
},
|
||||
"eyelid_left_angry": {
|
||||
"position": [0, 0, -0.1]
|
||||
},
|
||||
"eyelid_right_angry": {
|
||||
"position": [0, 0, -0.1]
|
||||
},
|
||||
"mouth_frown": {
|
||||
"position": [0, 0, -0.1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.chimecho.sad": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"mouth": {
|
||||
"rotation": [0, 0, 180],
|
||||
"position": [0, -0.5, 0]
|
||||
},
|
||||
"eyebrow_right": {
|
||||
"position": [-1, 0, 0]
|
||||
},
|
||||
"eyebrows": {
|
||||
"position": [0, 0, -0.1]
|
||||
},
|
||||
"eyebrow_left": {
|
||||
"position": [1, 0, 0]
|
||||
},
|
||||
"mouth_smile": {
|
||||
"position": [0, 0, 0.1]
|
||||
},
|
||||
"eyelid_left_sad": {
|
||||
"position": [0, 0, -0.1]
|
||||
},
|
||||
"eyelid_right_sad": {
|
||||
"position": [0, 0, -0.1]
|
||||
},
|
||||
"mouth_frown": {
|
||||
"position": [0, 0, -0.1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.chimecho.achieved_peace": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"mouth": {
|
||||
"position": [0, 0, 0.1]
|
||||
},
|
||||
"mouth_open": {
|
||||
"position": [0, 0, -0.1]
|
||||
},
|
||||
"eyes_happy": {
|
||||
"position": [0, 0, -0.2]
|
||||
},
|
||||
"detail_right": {
|
||||
"position": [0, 1, 0]
|
||||
},
|
||||
"detail_left": {
|
||||
"position": [0, 1, 0]
|
||||
},
|
||||
"mouth_smile": {
|
||||
"position": [0, 0, 0.1]
|
||||
},
|
||||
"eyelid_left": {
|
||||
"position": [0, 0, -0.1]
|
||||
},
|
||||
"eyelid_right": {
|
||||
"position": [0, 0, -0.1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.chimecho.mellow": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"mouth": {
|
||||
"position": [0, 0, 0]
|
||||
},
|
||||
"eyes": {
|
||||
"position": [0, 0, 0]
|
||||
},
|
||||
"mouth_open": {
|
||||
"position": [0, 0, 0]
|
||||
},
|
||||
"eyes_happy": {
|
||||
"position": [0, 0, 0]
|
||||
},
|
||||
"eyebrow_left": {
|
||||
"position": [0.5, 0, -0.1]
|
||||
},
|
||||
"eyebrow_right": {
|
||||
"position": [-0.5, 0, -0.1]
|
||||
},
|
||||
"mouth_smile": {
|
||||
"position": [0, 0, 0.1]
|
||||
},
|
||||
"eyelid_left_annoyed": {
|
||||
"position": [0, 0, -0.1]
|
||||
},
|
||||
"eyelid_right_annoyed": {
|
||||
"position": [0, 0, -0.1]
|
||||
},
|
||||
"mouth_neutral": {
|
||||
"position": [0, 0, -0.1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.chimecho.scream": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"mouth": {
|
||||
"position": [0, 0, 0.1]
|
||||
},
|
||||
"eyebrows": {
|
||||
"position": [0, 0, -0.1]
|
||||
},
|
||||
"mouth_scream": {
|
||||
"position": [0, 0, -0.1]
|
||||
},
|
||||
"mouth_smile": {
|
||||
"position": [0, 0, 0.1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.chimecho.ditto_face": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"face": {
|
||||
"position": [0, 0, 0.1],
|
||||
"scale": 0
|
||||
},
|
||||
"face_ditto": {
|
||||
"position": [0, 0, -0.1]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+3906
-641
File diff suppressed because it is too large
Load Diff
+460
-323
@@ -15,51 +15,132 @@
|
||||
"arm_left": {
|
||||
"rotation": [0, 0, "40+math.sin(q.anim_time*90*4-40)*-4"]
|
||||
},
|
||||
"arm_right": {
|
||||
"rotation": [0, 0, "-40+math.sin(q.anim_time*90*4-40)*4"]
|
||||
},
|
||||
"ribbon_right": {
|
||||
"rotation": [0, "12.5+math.sin(q.anim_time*90*2-10)*-4", "math.sin(q.anim_time*90*4-10)*-4"]
|
||||
},
|
||||
"ribbon_right2": {
|
||||
"rotation": [0, "20+math.sin(q.anim_time*90*2-10)*-10", "math.sin(q.anim_time*90*4-10)*-4"]
|
||||
},
|
||||
"ribbon_end_right": {
|
||||
"rotation": [0, "17.5+math.sin(q.anim_time*90*2-70)*-20", 0]
|
||||
},
|
||||
"ribbon_end_right2": {
|
||||
"rotation": [0, "15+math.sin(q.anim_time*90*2-70)*-15", 0],
|
||||
"position": [-0.2, 0, 0.2]
|
||||
},
|
||||
"ribbon_end_right3": {
|
||||
"rotation": [0, "17.5+math.sin(q.anim_time*90*2-70)*-20", 0]
|
||||
},
|
||||
"leg_left": {
|
||||
"rotation": ["math.sin(q.anim_time*90*4-10)*4+4", 0, 0],
|
||||
"foot_left": {
|
||||
"rotation": ["math.sin(q.anim_time*90*4-10)*4+4", -15, 0],
|
||||
"position": [0, "math.sin(q.anim_time*90*4)*0.2+0.1", "math.sin(q.anim_time*90*4)*0.1"]
|
||||
},
|
||||
"leg_right": {
|
||||
"rotation": ["math.sin(q.anim_time*90*4-10)*4+4", 0, 0],
|
||||
"position": [0, "math.sin(q.anim_time*90*4)*0.2+0.1", 0]
|
||||
},
|
||||
"body": {
|
||||
"position": [0, "math.sin(q.anim_time*90*4)*-0.1", "math.sin(q.anim_time*90*4)*-0.15"]
|
||||
},
|
||||
"ribbon_left": {
|
||||
"rotation": [0, "-12.5+math.sin(q.anim_time*90*2-10)*4", "-(math.sin(q.anim_time*90*4-10)*- 4)"]
|
||||
"rotation": [0, "-20+math.sin(q.anim_time*90*1-10)*4", "-25-(math.sin(q.anim_time*90*2-10)*- 4)"]
|
||||
},
|
||||
"ribbon_left2": {
|
||||
"rotation": [0, "-20+math.sin(q.anim_time*90*2-10)*10", "-(math.sin(q.anim_time*90*4-10)*-4)"]
|
||||
"rotation": [0, "0+math.sin(q.anim_time*90*1-10)*6", "-20-(math.sin(q.anim_time*90*2-10)*-6)"]
|
||||
},
|
||||
"ribbon_end_left": {
|
||||
"rotation": [0, "-17.5+math.sin(q.anim_time*90*2-70)*20", 0]
|
||||
"ribbon_left3": {
|
||||
"rotation": [0, "-20+math.sin(q.anim_time*90*1-10)*6", "-15-(math.sin(q.anim_time*90*2-10)*-6)"]
|
||||
},
|
||||
"ribbon_end_left2": {
|
||||
"rotation": [0, "-15+math.sin(q.anim_time*90*2-70)*15", 0],
|
||||
"position": [0.2, 0, 0.2]
|
||||
"ribbon_tip_top_left": {
|
||||
"rotation": [0, 22.5, -15]
|
||||
},
|
||||
"ribbon_end_left3": {
|
||||
"rotation": [0, "-17.5+math.sin(q.anim_time*90*2-70)*20", 0]
|
||||
"ribbon_tip_middle_left": {
|
||||
"rotation": [0, 10, 0],
|
||||
"position": [0, 0, 0.1]
|
||||
},
|
||||
"ribbon_tip_bottom_left": {
|
||||
"rotation": [0, 22.5, 15]
|
||||
},
|
||||
"ribbon_right": {
|
||||
"rotation": [0, "20-math.sin(q.anim_time*90*1-10)*4", "25+(math.sin(q.anim_time*90*2-10)*- 4)"]
|
||||
},
|
||||
"ribbon_right2": {
|
||||
"rotation": [0, "0-math.sin(q.anim_time*90*1-10)*6", "20+(math.sin(q.anim_time*90*2-10)*-6)"]
|
||||
},
|
||||
"ribbon_right3": {
|
||||
"rotation": [0, "20-math.sin(q.anim_time*90*1-10)*6", "15+(math.sin(q.anim_time*90*2-10)*-6)"]
|
||||
},
|
||||
"ribbon_tip_top_right": {
|
||||
"rotation": [0, -22.5, 15]
|
||||
},
|
||||
"ribbon_tip_middle_right": {
|
||||
"rotation": [0, -10, 0],
|
||||
"position": [0, 0, 0.1]
|
||||
},
|
||||
"ribbon_tip_bottom_right": {
|
||||
"rotation": [0, -22.5, -15]
|
||||
},
|
||||
"arm_right": {
|
||||
"rotation": [0, 0, "-40+math.sin(q.anim_time*90*4-40)*4"]
|
||||
},
|
||||
"foot_right": {
|
||||
"rotation": ["math.sin(q.anim_time*90*4-10)*4+4", 15, 0],
|
||||
"position": [0, "math.sin(q.anim_time*90*4)*0.2+0.1", 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.chingling.ground_walk": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"torso": {
|
||||
"rotation": ["math.sin(q.anim_time*90*4-10)*3", "math.sin(q.anim_time*90*2-20)*-2", "math.sin(q.anim_time*90*4-20)*8"]
|
||||
},
|
||||
"tongue": {
|
||||
"position": ["math.sin(q.anim_time*90*4+90)*-0.8", "math.sin(q.anim_time*90*4*2+50)*-0.1", 0]
|
||||
},
|
||||
"arm_left": {
|
||||
"rotation": [0, 0, "40+math.sin(q.anim_time*90*4-40)*-4+math.sin(q.anim_time*90*4*2-40)*-2"]
|
||||
},
|
||||
"foot_left": {
|
||||
"rotation": ["math.clamp(math.sin(q.anim_time*90*4+50-180)*-5,0,5)+math.clamp(math.sin(q.anim_time*90*4-180)*10,-6,10)+1", 0, 0],
|
||||
"position": [
|
||||
0,
|
||||
"math.clamp(math.sin(q.anim_time*90*4+140-180)*-0.5,0,1)+math.clamp(math.sin(q.anim_time*90*4+140-180)*-1,-0.2,0)",
|
||||
"math.sin(q.anim_time*90*4+50-180)*1"
|
||||
]
|
||||
},
|
||||
"body": {
|
||||
"rotation": [0, 0, 0],
|
||||
"position": [0, "math.sin(q.anim_time*90*4*2)*0.2+0.1", 0]
|
||||
},
|
||||
"ribbon_left": {
|
||||
"rotation": [0, "-20+math.sin(q.anim_time*90*1-10)*4", "-25-(math.sin(q.anim_time*90*2-10)*- 4)"]
|
||||
},
|
||||
"ribbon_left2": {
|
||||
"rotation": [0, "0+math.sin(q.anim_time*90*1-10)*6", "-20-(math.sin(q.anim_time*90*2-10)*-6)"]
|
||||
},
|
||||
"ribbon_left3": {
|
||||
"rotation": [0, "-20+math.sin(q.anim_time*90*1-10)*6", "-15-(math.sin(q.anim_time*90*2-10)*-6)"]
|
||||
},
|
||||
"ribbon_tip_top_left": {
|
||||
"rotation": [0, 22.5, -15]
|
||||
},
|
||||
"ribbon_tip_middle_left": {
|
||||
"rotation": [0, 10, 0],
|
||||
"position": [0, 0, 0.1]
|
||||
},
|
||||
"ribbon_tip_bottom_left": {
|
||||
"rotation": [0, 22.5, 15]
|
||||
},
|
||||
"ribbon_right": {
|
||||
"rotation": [0, "20-math.sin(q.anim_time*90*1-10)*4", "25+(math.sin(q.anim_time*90*2-10)*- 4)"]
|
||||
},
|
||||
"ribbon_right2": {
|
||||
"rotation": [0, "0-math.sin(q.anim_time*90*1-10)*6", "20+(math.sin(q.anim_time*90*2-10)*-6)"]
|
||||
},
|
||||
"ribbon_right3": {
|
||||
"rotation": [0, "20-math.sin(q.anim_time*90*1-10)*6", "15+(math.sin(q.anim_time*90*2-10)*-6)"]
|
||||
},
|
||||
"ribbon_tip_top_right": {
|
||||
"rotation": [0, -22.5, 15]
|
||||
},
|
||||
"ribbon_tip_middle_right": {
|
||||
"rotation": [0, -10, 0],
|
||||
"position": [0, 0, 0.1]
|
||||
},
|
||||
"ribbon_tip_bottom_right": {
|
||||
"rotation": [0, -22.5, -15]
|
||||
},
|
||||
"arm_right": {
|
||||
"rotation": [0, 0, "-40+math.sin(q.anim_time*90*4-40)*4+math.sin(q.anim_time*90*4*2-40)*2"]
|
||||
},
|
||||
"foot_right": {
|
||||
"rotation": ["math.clamp(math.sin(q.anim_time*90*4+50)*-5,0,5)+math.clamp(math.sin(q.anim_time*90*4+0)*10,-6,10)+1", 0, 0],
|
||||
"position": [
|
||||
0,
|
||||
"math.clamp(math.sin(q.anim_time*90*4+140)*-0.5,0,1)+math.clamp(math.sin(q.anim_time*90*4+140)*-1,-0.2,0)",
|
||||
"math.sin(q.anim_time*90*4+50)*1"
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -106,7 +187,7 @@
|
||||
"1.0": [0, 0.1, 0]
|
||||
}
|
||||
},
|
||||
"leg_left": {
|
||||
"foot_left": {
|
||||
"rotation": {
|
||||
"0.0": ["-1+math.clamp(math.sin(q.anim_time*90*4+10)*40*1,0,50)+10", 0, 0],
|
||||
"0.4583": ["-1+math.clamp(math.sin(q.anim_time*90*4+10)*30*1,0,30)-10", 0, 0],
|
||||
@@ -130,6 +211,47 @@
|
||||
"1.0": [0, 0, "40+math.sin(q.anim_time*90*4-80)*8"]
|
||||
}
|
||||
},
|
||||
"legs": {
|
||||
"position": [0, 0.25, 0]
|
||||
},
|
||||
"ribbon_left": {
|
||||
"rotation": [0, "-40-math.sin(q.anim_time*90*4-10)*-5", "-math.sin(q.anim_time*90*4)*-20"]
|
||||
},
|
||||
"ribbon_left2": {
|
||||
"rotation": [0, "-10-math.sin(q.anim_time*90*4-10)*-5", "(math.sin(q.anim_time*90*4-10)*2)"]
|
||||
},
|
||||
"ribbon_left3": {
|
||||
"rotation": [0, "-15-math.sin(q.anim_time*90*4-10)*-5", "(math.sin(q.anim_time*90*4-10)*2)"]
|
||||
},
|
||||
"ribbon_tip_top_left": {
|
||||
"rotation": [0, "-17.5-math.sin(q.anim_time*90*4-70)*-20-math.sin(q.anim_time*90*15)*-8", -15]
|
||||
},
|
||||
"ribbon_tip_middle_left": {
|
||||
"rotation": [0, "-15-math.sin(q.anim_time*90*4-70)*-15-math.sin(q.anim_time*90*15)*-8", 0],
|
||||
"position": [0, 0, 0.25]
|
||||
},
|
||||
"ribbon_tip_bottom_left": {
|
||||
"rotation": [0, "-17.5-math.sin(q.anim_time*90*4-70)*-20-math.sin(q.anim_time*90*15)*-8", 15]
|
||||
},
|
||||
"ribbon_right": {
|
||||
"rotation": [0, "40+math.sin(q.anim_time*90*4-10)*-5", "math.sin(q.anim_time*90*4)*-20"]
|
||||
},
|
||||
"ribbon_right2": {
|
||||
"rotation": [0, "10+math.sin(q.anim_time*90*4-10)*-5", "-(math.sin(q.anim_time*90*4-10)*2)"]
|
||||
},
|
||||
"ribbon_right3": {
|
||||
"rotation": [0, "15+math.sin(q.anim_time*90*4-10)*-5", "-(math.sin(q.anim_time*90*4-10)*2)"]
|
||||
},
|
||||
"ribbon_tip_top_right": {
|
||||
"rotation": [0, "17.5+math.sin(q.anim_time*90*4-70)*-20+math.sin(q.anim_time*90*15)*-8", 15]
|
||||
},
|
||||
"ribbon_tip_middle_right": {
|
||||
"rotation": [0, "15+math.sin(q.anim_time*90*4-70)*-15+math.sin(q.anim_time*90*15)*-8", 0],
|
||||
"position": [0, 0, 0.25]
|
||||
},
|
||||
"ribbon_tip_bottom_right": {
|
||||
"rotation": [0, "17.5+math.sin(q.anim_time*90*4-70)*-20+math.sin(q.anim_time*90*15)*-8", -15]
|
||||
},
|
||||
"arm_right": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, "-40+math.sin(q.anim_time*90*4-80)*-8"],
|
||||
@@ -138,39 +260,7 @@
|
||||
"1.0": [0, 0, "-40+math.sin(q.anim_time*90*4-80)*-8"]
|
||||
}
|
||||
},
|
||||
"ribbon_right": {
|
||||
"rotation": [0, "40+math.sin(q.anim_time*90*4-10)*-5", "math.sin(q.anim_time*90*4)*-20"]
|
||||
},
|
||||
"ribbon_right2": {
|
||||
"rotation": [0, "20+math.sin(q.anim_time*90*4-10)*-10", "-(math.sin(q.anim_time*90*4-10)*4)"]
|
||||
},
|
||||
"ribbon_end_right": {
|
||||
"rotation": [0, "17.5+math.sin(q.anim_time*90*4-70)*-20+math.sin(q.anim_time*90*15)*-8", 0]
|
||||
},
|
||||
"ribbon_end_right2": {
|
||||
"rotation": [0, "15+math.sin(q.anim_time*90*4-70)*-15+math.sin(q.anim_time*90*15)*-8", 0],
|
||||
"position": [-0.2, 0, 0.2]
|
||||
},
|
||||
"ribbon_end_right3": {
|
||||
"rotation": [0, "17.5+math.sin(q.anim_time*90*4-70)*-20+math.sin(q.anim_time*90*15)*-8", 0]
|
||||
},
|
||||
"ribbon_left": {
|
||||
"rotation": [0, "-40+math.sin(q.anim_time*90*4-10)*5", "math.sin(q.anim_time*90*4)*20"]
|
||||
},
|
||||
"ribbon_left2": {
|
||||
"rotation": [0, "-20+math.sin(q.anim_time*90*4-10)*10+math.sin(q.anim_time*90*15)*1", "-(math.sin(q.anim_time*90*4-10)*-4)"]
|
||||
},
|
||||
"ribbon_end_left": {
|
||||
"rotation": [0, "-17.5+math.sin(q.anim_time*90*4-70)*20+math.sin(q.anim_time*90*15)*8", 0]
|
||||
},
|
||||
"ribbon_end_left2": {
|
||||
"rotation": [0, "-15+math.sin(q.anim_time*90*4-70)*15+math.sin(q.anim_time*90*15)*8", 0],
|
||||
"position": [0.2, 0, 0.2]
|
||||
},
|
||||
"ribbon_end_left3": {
|
||||
"rotation": [0, "-17.5+math.sin(q.anim_time*90*4-70)*20+math.sin(q.anim_time*90*15)*8", 0]
|
||||
},
|
||||
"leg_right": {
|
||||
"foot_right": {
|
||||
"rotation": {
|
||||
"0.0": ["-1+math.clamp(math.sin(q.anim_time*90*4+10)*40*1,0,50)+10", 0, 0],
|
||||
"0.4583": ["-1+math.clamp(math.sin(q.anim_time*90*4+10)*30*1,0,30)-10", 0, 0],
|
||||
@@ -190,7 +280,7 @@
|
||||
"bones": {
|
||||
"body": {
|
||||
"rotation": ["math.sin(q.anim_time*90*2+90)*-2", 0, "math.sin(q.anim_time*90*2+30)*-2"],
|
||||
"position": ["math.sin(q.anim_time*90*0.2)*-0.5", "math.sin(q.anim_time*90*2)*-1", 0]
|
||||
"position": ["math.sin(q.anim_time*90*0.2)*-0.5", "2+math.sin(q.anim_time*90*2)*-1", 0]
|
||||
},
|
||||
"torso": {
|
||||
"position": [0, "math.sin(q.anim_time*90*2-20)*-0.1", 0]
|
||||
@@ -201,46 +291,55 @@
|
||||
"arm_left": {
|
||||
"rotation": [0, 0, "35+math.sin(q.anim_time*90*2-80)*-10"]
|
||||
},
|
||||
"foot_left": {
|
||||
"rotation": ["40+math.sin(q.anim_time*90*3-40)*-10", -15, 0]
|
||||
},
|
||||
"ribbon_left": {
|
||||
"rotation": [0, "-12.5+math.sin(q.anim_time*90*1-10)*4", "-25-(math.sin(q.anim_time*90*2-10)*- 4)"]
|
||||
},
|
||||
"ribbon_left2": {
|
||||
"rotation": [0, "0+math.sin(q.anim_time*90*1-10)*6", "-20-(math.sin(q.anim_time*90*2-10)*-6)"]
|
||||
},
|
||||
"ribbon_tip_top_left": {
|
||||
"rotation": [0, 22.5, -15]
|
||||
},
|
||||
"ribbon_tip_middle_left": {
|
||||
"rotation": [0, 10, 0],
|
||||
"position": [0, 0, 0.1]
|
||||
},
|
||||
"ribbon_tip_bottom_left": {
|
||||
"rotation": [0, 22.5, 15]
|
||||
},
|
||||
"legs": {
|
||||
"position": [0, 0.5, 0]
|
||||
},
|
||||
"ribbon_left3": {
|
||||
"rotation": [0, "-20+math.sin(q.anim_time*90*1-10)*6", "-15-(math.sin(q.anim_time*90*2-10)*-6)"]
|
||||
},
|
||||
"ribbon_right": {
|
||||
"rotation": [0, "12.5-math.sin(q.anim_time*90*1-10)*4", "25+(math.sin(q.anim_time*90*2-10)*- 4)"]
|
||||
},
|
||||
"ribbon_right2": {
|
||||
"rotation": [0, "0-math.sin(q.anim_time*90*1-10)*6", "20+(math.sin(q.anim_time*90*2-10)*-6)"]
|
||||
},
|
||||
"ribbon_right3": {
|
||||
"rotation": [0, "20-math.sin(q.anim_time*90*1-10)*6", "15+(math.sin(q.anim_time*90*2-10)*-6)"]
|
||||
},
|
||||
"ribbon_tip_top_right": {
|
||||
"rotation": [0, -22.5, 15]
|
||||
},
|
||||
"ribbon_tip_middle_right": {
|
||||
"rotation": [0, -10, 0],
|
||||
"position": [0, 0, 0.1]
|
||||
},
|
||||
"ribbon_tip_bottom_right": {
|
||||
"rotation": [0, -22.5, -15]
|
||||
},
|
||||
"arm_right": {
|
||||
"rotation": [0, 0, "-35+math.sin(q.anim_time*90*2-80)*10"]
|
||||
},
|
||||
"ribbon_right": {
|
||||
"rotation": [0, "20+math.sin(q.anim_time*90*1-10)*-4", "NaN-(math.sin(q.anim_time*90*2-10)*4)"]
|
||||
},
|
||||
"ribbon_right2": {
|
||||
"rotation": [0, 0, 0]
|
||||
},
|
||||
"ribbon_end_right": {
|
||||
"rotation": [0, "17.5+math.sin(q.anim_time*90*1-70)*-20", 0]
|
||||
},
|
||||
"ribbon_end_right2": {
|
||||
"rotation": [0, "15+math.sin(q.anim_time*90*1-70)*-15", 0],
|
||||
"position": [-0.2, 0, 0.2]
|
||||
},
|
||||
"ribbon_end_right3": {
|
||||
"rotation": [0, "17.5+math.sin(q.anim_time*90*1-70)*-20", 0]
|
||||
},
|
||||
"ribbon_left": {
|
||||
"rotation": [0, "-20+math.sin(q.anim_time*90*1-10)*4", "-(math.sin(q.anim_time*90*2-10)*- 4)"]
|
||||
},
|
||||
"ribbon_left2": {
|
||||
"rotation": [0, 0, 0]
|
||||
},
|
||||
"ribbon_end_left": {
|
||||
"rotation": [0, "-17.5+math.sin(q.anim_time*90*1-70)*20", 0]
|
||||
},
|
||||
"ribbon_end_left2": {
|
||||
"rotation": [0, "-15+math.sin(q.anim_time*90*1-70)*15", 0],
|
||||
"position": [0.2, 0, 0.2]
|
||||
},
|
||||
"ribbon_end_left3": {
|
||||
"rotation": [0, "-17.5+math.sin(q.anim_time*90*1-70)*20", 0]
|
||||
},
|
||||
"leg_left": {
|
||||
"rotation": ["25+math.sin(q.anim_time*90*3-40)*-10", -5, 0]
|
||||
},
|
||||
"leg_right": {
|
||||
"rotation": ["25+math.sin(q.anim_time*90*3-20)*-10", 5, 0]
|
||||
"foot_right": {
|
||||
"rotation": ["40+math.sin(q.anim_time*90*3-20)*-10", 15, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -249,7 +348,7 @@
|
||||
"bones": {
|
||||
"body": {
|
||||
"rotation": ["10+math.sin(q.anim_time*90*4+80)*-3", 0, "-math.sin(q.anim_time*90*2+30)*-3"],
|
||||
"position": ["math.sin(q.anim_time*90*2)*-0.5", "math.sin(q.anim_time*90*4)*-1", "math.sin(q.anim_time*90*4)*0.5"]
|
||||
"position": ["math.sin(q.anim_time*90*2)*-0.5", "2+math.sin(q.anim_time*90*4)*-1", "math.sin(q.anim_time*90*4)*0.5"]
|
||||
},
|
||||
"torso": {
|
||||
"position": [0, "math.sin(q.anim_time*90*2-20)*-0.1", 0]
|
||||
@@ -260,51 +359,144 @@
|
||||
"arm_left": {
|
||||
"rotation": [0, -20, "35+math.sin(q.anim_time*90*4-40)*-10"]
|
||||
},
|
||||
"arm_right": {
|
||||
"rotation": [0, 20, "-35+math.sin(q.anim_time*90*4-40)*10"]
|
||||
"foot_left": {
|
||||
"rotation": ["25+math.sin(q.anim_time*90*4-20)*-10", -5, 0]
|
||||
},
|
||||
"ribbon_left": {
|
||||
"rotation": [0, "-40-math.sin(q.anim_time*90*4-10)*-4", "-(math.sin(q.anim_time*90*4-10)*4)"]
|
||||
},
|
||||
"ribbon_left2": {
|
||||
"rotation": [0, "-15-math.sin(q.anim_time*90*4-10)*-5-math.sin(q.anim_time*90*15)*-0.5", "(math.sin(q.anim_time*90*4-10)*2)"]
|
||||
},
|
||||
"ribbon_left3": {
|
||||
"rotation": [0, "-15-math.sin(q.anim_time*90*4-10)*-5-math.sin(q.anim_time*90*15)*-0.5", "(math.sin(q.anim_time*90*4-10)*2)"]
|
||||
},
|
||||
"ribbon_tip_top_left": {
|
||||
"rotation": [0, "-12.5-math.sin(q.anim_time*90*4-70)*-20-math.sin(q.anim_time*90*15)*-8", -12.5]
|
||||
},
|
||||
"ribbon_tip_middle_left": {
|
||||
"rotation": [0, "-15-math.sin(q.anim_time*90*4-70)*-15-math.sin(q.anim_time*90*15)*-8", 0],
|
||||
"position": [0, 0, 0.25]
|
||||
},
|
||||
"ribbon_tip_bottom_left": {
|
||||
"rotation": [0, "-12.5-math.sin(q.anim_time*90*4-70)*-20-math.sin(q.anim_time*90*15)*-8", 12.5]
|
||||
},
|
||||
"ribbon_right": {
|
||||
"rotation": [0, "40+math.sin(q.anim_time*90*4-10)*-4", "(math.sin(q.anim_time*90*4-10)*4)"]
|
||||
},
|
||||
"ribbon_right2": {
|
||||
"rotation": [0, "20+math.sin(q.anim_time*90*4-10)*-10+math.sin(q.anim_time*90*15)*-1", "NaN-(math.sin(q.anim_time*90*4-10)*4)"]
|
||||
"rotation": [0, "15+math.sin(q.anim_time*90*4-10)*-5+math.sin(q.anim_time*90*15)*-0.5", "-(math.sin(q.anim_time*90*4-10)*2)"]
|
||||
},
|
||||
"ribbon_end_right": {
|
||||
"rotation": [0, "17.5+math.sin(q.anim_time*90*4-70)*-20+math.sin(q.anim_time*90*15)*-8", 0]
|
||||
"ribbon_right3": {
|
||||
"rotation": [0, "15+math.sin(q.anim_time*90*4-10)*-5+math.sin(q.anim_time*90*15)*-0.5", "-(math.sin(q.anim_time*90*4-10)*2)"]
|
||||
},
|
||||
"ribbon_end_right2": {
|
||||
"ribbon_tip_top_right": {
|
||||
"rotation": [0, "12.5+math.sin(q.anim_time*90*4-70)*-20+math.sin(q.anim_time*90*15)*-8", 12.5]
|
||||
},
|
||||
"ribbon_tip_middle_right": {
|
||||
"rotation": [0, "15+math.sin(q.anim_time*90*4-70)*-15+math.sin(q.anim_time*90*15)*-8", 0],
|
||||
"position": [-0.2, 0, 0.2]
|
||||
"position": [0, 0, 0.25]
|
||||
},
|
||||
"ribbon_end_right3": {
|
||||
"rotation": [0, "17.5+math.sin(q.anim_time*90*4-70)*-20+math.sin(q.anim_time*90*15)*-8", 0]
|
||||
"ribbon_tip_bottom_right": {
|
||||
"rotation": [0, "12.5+math.sin(q.anim_time*90*4-70)*-20+math.sin(q.anim_time*90*15)*-8", -12.5]
|
||||
},
|
||||
"ribbon_left": {
|
||||
"rotation": [0, "-40+math.sin(q.anim_time*90*4-10)*4", "(math.sin(q.anim_time*90*4-10)*-4)"]
|
||||
"arm_right": {
|
||||
"rotation": [0, 20, "-35+math.sin(q.anim_time*90*4-40)*10"]
|
||||
},
|
||||
"ribbon_left2": {
|
||||
"rotation": [0, "-20+math.sin(q.anim_time*90*4-10)*10+math.sin(q.anim_time*90*15)*1", "-(math.sin(q.anim_time*90*4-10)*-4)"]
|
||||
},
|
||||
"ribbon_end_left": {
|
||||
"rotation": [0, "-17.5+math.sin(q.anim_time*90*4-70)*20+math.sin(q.anim_time*90*15)*8", 0]
|
||||
},
|
||||
"ribbon_end_left2": {
|
||||
"rotation": [0, "-15+math.sin(q.anim_time*90*4-70)*15+math.sin(q.anim_time*90*15)*8", 0],
|
||||
"position": [0.2, 0, 0.2]
|
||||
},
|
||||
"ribbon_end_left3": {
|
||||
"rotation": [0, "-17.5+math.sin(q.anim_time*90*4-70)*20+math.sin(q.anim_time*90*15)*8", 0]
|
||||
},
|
||||
"leg_left": {
|
||||
"rotation": ["25+math.sin(q.anim_time*90*4-20)*-10", -5, 0]
|
||||
},
|
||||
"leg_right": {
|
||||
"foot_right": {
|
||||
"rotation": ["25+math.sin(q.anim_time*90*4-30)*-15", 5, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.chingling.sleep": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"body": {
|
||||
"rotation": [-80.5, 0, 0],
|
||||
"position": [0, "-0.5+math.sin(q.anim_time*90*1)*0.1", 0]
|
||||
},
|
||||
"torso": {
|
||||
"rotation": ["math.sin(q.anim_time*90*1)*-1+11", 0, 0]
|
||||
},
|
||||
"tongue": {
|
||||
"rotation": ["math.sin(q.anim_time*90*1-40)*-2", 0, 0],
|
||||
"position": ["math.sin(q.anim_time*90*0.5-30)*0.4", "math.sin(q.anim_time*90*1-30)*0.1", 0]
|
||||
},
|
||||
"arm_left": {
|
||||
"rotation": [12, "-25+math.sin(q.anim_time*90*1-30)*5", "42+math.sin(q.anim_time*90*1-10)*-3"]
|
||||
},
|
||||
"foot_left": {
|
||||
"rotation": ["40+math.sin(q.anim_time*90*1+60)*10", -9, -12],
|
||||
"position": [0.4, 0, "0.5+math.sin(q.anim_time*90*1+60)*0.2"]
|
||||
},
|
||||
"ribbon_left": {
|
||||
"rotation": [-15.5, "-5.5+math.sin(q.anim_time*90*1)*-1", -25]
|
||||
},
|
||||
"ribbon_left2": {
|
||||
"rotation": [0, 0, -22.5]
|
||||
},
|
||||
"ribbon_left3": {
|
||||
"rotation": [0, 0, -22.5]
|
||||
},
|
||||
"ribbon_tip_top_left": {
|
||||
"rotation": [0, -22.5, -15]
|
||||
},
|
||||
"ribbon_tip_bottom_left": {
|
||||
"rotation": [0, -22.5, 15]
|
||||
},
|
||||
"legs": {
|
||||
"position": [0, 0.5, 0]
|
||||
},
|
||||
"ribbons": {
|
||||
"rotation": ["-math.sin(q.anim_time*90*1)*-2", 0, 0]
|
||||
},
|
||||
"ribbon_right": {
|
||||
"rotation": [-20, 5, 20]
|
||||
},
|
||||
"ribbon_right3": {
|
||||
"rotation": [0, -2.5, -22.5]
|
||||
},
|
||||
"ribbon_tip_top_right": {
|
||||
"rotation": [0, 22.5, 15]
|
||||
},
|
||||
"ribbon_tip_bottom_right": {
|
||||
"rotation": [0, 22.5, -15]
|
||||
},
|
||||
"arm_right": {
|
||||
"rotation": [12, "25+math.sin(q.anim_time*90*1-70)*-5", "-42+math.sin(q.anim_time*90*1-50)*3"]
|
||||
},
|
||||
"foot_right": {
|
||||
"rotation": ["40+math.sin(q.anim_time*90*1+50)*3", 5, 20],
|
||||
"position": [-0.3, 0, "0.6+math.sin(q.anim_time*90*1+30)*0.1"]
|
||||
},
|
||||
"eyelid_left": {
|
||||
"position": [0, -2, -0.1]
|
||||
},
|
||||
"eyelid_right": {
|
||||
"position": [0, -2, -0.1]
|
||||
},
|
||||
"eyes_ditto": {
|
||||
"position": [0, 0, 0.1]
|
||||
},
|
||||
"eyes_closed_ditto": {
|
||||
"position": [0, 0, -0.1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.chingling.sleep_quirk": {
|
||||
"animation_length": 1.6667,
|
||||
"bones": {
|
||||
"tongue": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.25": ["math.sin(q.anim_time*90*14-50)*-1", 0, 0],
|
||||
"1.6667": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.chingling.cry": {
|
||||
"animation_length": 1.66667,
|
||||
"animation_length": 1.6667,
|
||||
"bones": {
|
||||
"torso": {
|
||||
"rotation": {
|
||||
@@ -340,6 +532,10 @@
|
||||
"post": [-7, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"1.25": {
|
||||
"post": [-2.03, 0, -0.13],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"1.4167": {
|
||||
"post": [2.5, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
@@ -348,39 +544,99 @@
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
}
|
||||
},
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.125": [0, 0, 0],
|
||||
"0.2083": [0, 1, 0],
|
||||
"1.25": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"tongue": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.25": ["math.sin(q.anim_time*90*14-50)*-1", 0, 0],
|
||||
"0.125": [0, 0, 0],
|
||||
"0.2083": [0.45, -1, 0],
|
||||
"0.25": ["math.sin(q.anim_time*90*14-50)*-1", -1, 0],
|
||||
"1.6667": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"ribbon_right2": {
|
||||
"rotation": {
|
||||
"0.25": [0, 0, 0],
|
||||
"0.2917": [0, 0, 2.5],
|
||||
"0.3333": [0, 0, 0],
|
||||
"0.4167": [0, 0, 5],
|
||||
"0.5": [0, 0, 0],
|
||||
"0.5417": [0, 0, 2.5],
|
||||
"0.5833": [0, 0, 0],
|
||||
"0.6667": [0, 0, 5],
|
||||
"1.25": [0, 0, 0]
|
||||
"eyes": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.2083": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0.25, 0]
|
||||
},
|
||||
"1.25": {
|
||||
"pre": [0, 0.25, 0],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"ribbon_left2": {
|
||||
"rotation": {
|
||||
"0.25": [0, 0, 0],
|
||||
"0.2917": [0, 0, -2.5],
|
||||
"0.3333": [0, 0, 0],
|
||||
"0.4167": [0, 0, -5],
|
||||
"0.5": [0, 0, 0],
|
||||
"0.5417": [0, 0, -2.5],
|
||||
"0.5833": [0, 0, 0],
|
||||
"0.6667": [0, 0, -5],
|
||||
"1.25": [0, 0, 0]
|
||||
"mouths_closed": {
|
||||
"scale": {
|
||||
"0.0": [1, 1, 1],
|
||||
"0.2083": {
|
||||
"pre": [1, 1, 1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"1.25": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [1, 1, 1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"mouth_open_sad": {
|
||||
"scale": {
|
||||
"0.0": [1, 1, 1],
|
||||
"0.2083": {
|
||||
"pre": [1, 1, 1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"1.25": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [1, 1, 1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"pupil_right": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.2083": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 1.5, 0]
|
||||
},
|
||||
"1.25": {
|
||||
"pre": [0, 1.5, 0],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"pupil_left": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.2083": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 1.5, 0]
|
||||
},
|
||||
"1.25": {
|
||||
"pre": [0, 1.5, 0],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"face_ditto": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.2083": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 1.45, 0]
|
||||
},
|
||||
"1.25": {
|
||||
"pre": [0, 1.45, 0],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -390,175 +646,56 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.chingling.ground_walk": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"torso": {
|
||||
"rotation": ["math.sin(q.anim_time*90*4-10)*3", "math.sin(q.anim_time*90*2-20)*-2", "math.sin(q.anim_time*90*4-20)*8"]
|
||||
},
|
||||
"tongue": {
|
||||
"position": ["math.sin(q.anim_time*90*4+90)*-0.8", "math.sin(q.anim_time*90*4*2+50)*-0.1", 0]
|
||||
},
|
||||
"arm_left": {
|
||||
"rotation": [0, 0, "40+math.sin(q.anim_time*90*4-40)*-4+math.sin(q.anim_time*90*4*2-40)*-2"]
|
||||
},
|
||||
"arm_right": {
|
||||
"rotation": [0, 0, "-40+math.sin(q.anim_time*90*4-40)*4+math.sin(q.anim_time*90*4*2-40)*2"]
|
||||
},
|
||||
"ribbon_right": {
|
||||
"rotation": [0, "20+math.sin(q.anim_time*90*4-40)*-5", "math.sin(q.anim_time*90*4-10)*-4"]
|
||||
},
|
||||
"ribbon_right2": {
|
||||
"rotation": [0, "20+math.sin(q.anim_time*90*4-40)*-10", "math.sin(q.anim_time*90*4-10)*-4"]
|
||||
},
|
||||
"ribbon_end_right": {
|
||||
"rotation": [0, "17.5+math.sin(q.anim_time*90*4-70)*-20", 0]
|
||||
},
|
||||
"ribbon_end_right2": {
|
||||
"rotation": [0, "15+math.sin(q.anim_time*90*4-70)*-15", 0],
|
||||
"position": [-0.2, 0, 0.2]
|
||||
},
|
||||
"ribbon_end_right3": {
|
||||
"rotation": [0, "17.5+math.sin(q.anim_time*90*4-70)*-20", 0]
|
||||
},
|
||||
"leg_left": {
|
||||
"rotation": ["math.clamp(math.sin(q.anim_time*90*4+50-180)*-5,0,5)+math.clamp(math.sin(q.anim_time*90*4-180)*10,-6,10)+1", 0, 0],
|
||||
"position": [
|
||||
0,
|
||||
"math.clamp(math.sin(q.anim_time*90*4+140-180)*-0.5,0,1)+math.clamp(math.sin(q.anim_time*90*4+140-180)*-1,-0.2,0)",
|
||||
"math.sin(q.anim_time*90*4+50-180)*1"
|
||||
]
|
||||
},
|
||||
"leg_right": {
|
||||
"rotation": ["math.clamp(math.sin(q.anim_time*90*4+50)*-5,0,5)+math.clamp(math.sin(q.anim_time*90*4+0)*10,-6,10)+1", 0, 0],
|
||||
"position": [
|
||||
0,
|
||||
"math.clamp(math.sin(q.anim_time*90*4+140)*-0.5,0,1)+math.clamp(math.sin(q.anim_time*90*4+140)*-1,-0.2,0)",
|
||||
"math.sin(q.anim_time*90*4+50)*1"
|
||||
]
|
||||
},
|
||||
"body": {
|
||||
"rotation": [0, 0, 0],
|
||||
"position": [0, "math.sin(q.anim_time*90*4*2)*0.2+0.1", 0]
|
||||
},
|
||||
"ribbon_left": {
|
||||
"rotation": [0, "-20+math.sin(q.anim_time*90*4-40)*-5", "-(math.sin(q.anim_time*90*4-10)*-4)"]
|
||||
},
|
||||
"ribbon_left2": {
|
||||
"rotation": [0, "-20+math.sin(q.anim_time*90*4-40)*-10", "-(math.sin(q.anim_time*90*4-10)*-4)"]
|
||||
},
|
||||
"ribbon_end_left": {
|
||||
"rotation": [0, "-17.5+math.sin(q.anim_time*90*4-70)*-20", 0]
|
||||
},
|
||||
"ribbon_end_left2": {
|
||||
"rotation": [0, "-15+math.sin(q.anim_time*90*4-70)*-15", 0],
|
||||
"position": [0.2, 0, 0.2]
|
||||
},
|
||||
"ribbon_end_left3": {
|
||||
"rotation": [0, "-17.5+math.sin(q.anim_time*90*4-70)*-20", 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.chingling.sleep": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"body": {
|
||||
"rotation": [-80.5, 0, 0],
|
||||
"position": [0, "-0.7+math.sin(q.anim_time*90*1)*0.1", 0]
|
||||
},
|
||||
"torso": {
|
||||
"rotation": ["math.sin(q.anim_time*90*1)*-1+1", 0, 0]
|
||||
},
|
||||
"tongue": {
|
||||
"rotation": ["math.sin(q.anim_time*90*1-40)*-2", 0, 0],
|
||||
"position": ["math.sin(q.anim_time*90*0.5-30)*0.4", "math.sin(q.anim_time*90*1-30)*0.1", 0]
|
||||
},
|
||||
"arm_left": {
|
||||
"rotation": [12, "-25+math.sin(q.anim_time*90*1-30)*5", "42+math.sin(q.anim_time*90*1-10)*-3"]
|
||||
},
|
||||
"arm_right": {
|
||||
"rotation": [12, "25+math.sin(q.anim_time*90*1-70)*-5", "-42+math.sin(q.anim_time*90*1-50)*3"]
|
||||
},
|
||||
"eyelid_right": {
|
||||
"position": [0, 0, -0.1]
|
||||
},
|
||||
"eyelid_left": {
|
||||
"position": [0, 0, -0.1]
|
||||
},
|
||||
"ribbon_right": {
|
||||
"rotation": [-5, "22+math.sin(q.anim_time*90*1)*1", -2]
|
||||
},
|
||||
"ribbon_right2": {
|
||||
"rotation": ["-2+math.sin(q.anim_time*90*1)*1", "-16+math.sin(q.anim_time*90*1)*-2", -10]
|
||||
},
|
||||
"ribbon_end_right": {
|
||||
"rotation": [0, "2.5+math.sin(q.anim_time*90*1)*3", -12.5],
|
||||
"position": [-0.1, 0, 0]
|
||||
},
|
||||
"ribbon_end_right2": {
|
||||
"rotation": [-2, "-2+math.sin(q.anim_time*90*1)*3", -15],
|
||||
"position": [-0.3, 0, 0]
|
||||
},
|
||||
"ribbon_end_right3": {
|
||||
"rotation": [0, "-2.5+math.sin(q.anim_time*90*1)*3", -27.5],
|
||||
"position": [0.2, 0.2, 0]
|
||||
},
|
||||
"ribbon_left": {
|
||||
"rotation": [-5, "-22+math.sin(q.anim_time*90*1)*-1", 2]
|
||||
},
|
||||
"ribbon_left2": {
|
||||
"rotation": [-15, "10+math.sin(q.anim_time*90*1)*2 ", -43]
|
||||
},
|
||||
"ribbon_end_left": {
|
||||
"rotation": [-2.5, "-12+math.sin(q.anim_time*90*1)*-3", -19],
|
||||
"position": [-0.2, -0.1, 0]
|
||||
},
|
||||
"ribbon_end_left2": {
|
||||
"rotation": [1.5, "-10+math.sin(q.anim_time*90*1)*-3", -10],
|
||||
"position": [0.3, 0, 0]
|
||||
},
|
||||
"ribbon_end_left3": {
|
||||
"rotation": [1, "-7+math.sin(q.anim_time*90*1)*-3", -6],
|
||||
"position": [0.1, 0, 0]
|
||||
},
|
||||
"leg_left": {
|
||||
"rotation": ["40+math.sin(q.anim_time*90*1+60)*10", -9, -12],
|
||||
"position": [0.4, -0.2, "0.5+math.sin(q.anim_time*90*1+60)*0.2"]
|
||||
},
|
||||
"leg_right": {
|
||||
"rotation": ["40+math.sin(q.anim_time*90*1+50)*3", 5, 20],
|
||||
"position": [-0.3, -0.3, "0.6+math.sin(q.anim_time*90*1+30)*0.1"]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.chingling.sleep_quirk": {
|
||||
"animation_length": 1.66667,
|
||||
"bones": {
|
||||
"tongue": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.25": ["math.sin(q.anim_time*90*14-50)*-1", 0, 0],
|
||||
"1.6667": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.chingling.blink": {
|
||||
"animation_length": 0.16667,
|
||||
"animation_length": 0.1667,
|
||||
"bones": {
|
||||
"eyelid_right": {
|
||||
"position": {
|
||||
"0.0": [0, 0, -0.1],
|
||||
"0.125": [0, 0, -0.1],
|
||||
"0.1667": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"eyelid_left": {
|
||||
"position": {
|
||||
"0.0": [0, 0, -0.1],
|
||||
"0.125": [0, 0, -0.1],
|
||||
"0.1667": [0, 0, 0]
|
||||
"0.0": [0, -2, -0.1],
|
||||
"0.1667": {
|
||||
"pre": [0, -2, -0.1],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"eyelid_right": {
|
||||
"position": {
|
||||
"0.0": [0, -2, -0.1],
|
||||
"0.1667": {
|
||||
"pre": [0, -2, -0.1],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"eyes_ditto": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0.1],
|
||||
"0.1667": {
|
||||
"pre": [0, 0, 0.1],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"eyes_closed_ditto": {
|
||||
"position": {
|
||||
"0.0": [0, 0, -0.1],
|
||||
"0.1667": {
|
||||
"pre": [0, 0, -0.1],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.chingling.face_ditto": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"eyes": {
|
||||
"position": [0, 0, 0.1],
|
||||
"scale": 0
|
||||
},
|
||||
"face_ditto": {
|
||||
"position": [0, 0, -6]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+6360
-99
File diff suppressed because it is too large
Load Diff
+7522
-80
File diff suppressed because it is too large
Load Diff
+327
-79
@@ -492,19 +492,19 @@
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"torso": {
|
||||
"rotation": ["0+q.r.input_forward(0)*10", 0, "0+q.r.input_right(0)*-20"]
|
||||
"rotation": ["0+q.r.velocity_forward(0)*10", 0, "0+q.r.velocity_right(0)*-20"]
|
||||
},
|
||||
"arm_left": {
|
||||
"rotation": [0, "0+math.max(q.r.input_right(0)*-20,0)", 0]
|
||||
"rotation": [0, "0+math.max(q.r.velocity_right(0)*-20,0)", 0]
|
||||
},
|
||||
"arm_left2": {
|
||||
"rotation": [0, "0+math.max(q.r.input_right(0)*-20,0)", 0]
|
||||
"rotation": [0, "0+math.max(q.r.velocity_right(0)*-20,0)", 0]
|
||||
},
|
||||
"arm_right": {
|
||||
"rotation": [0, "0+math.min(q.r.input_right(0)*-20,0)", 0]
|
||||
"rotation": [0, "0+math.min(q.r.velocity_right(0)*-20,0)", 0]
|
||||
},
|
||||
"arm_right2": {
|
||||
"rotation": [0, "0+math.min(q.r.input_right(0)*-20,0)", 0]
|
||||
"rotation": [0, "0+math.min(q.r.velocity_right(0)*-20,0)", 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -2873,6 +2873,16 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"locator_hand_primary": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.8333": [0, 0, 0],
|
||||
"0.875": [-1, 0, 0],
|
||||
"1.875": [-1, 0, 0],
|
||||
"1.9167": [0, 0, 0],
|
||||
"3.0": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"finger_ring_right": {
|
||||
"rotation": {
|
||||
"0.0": {
|
||||
@@ -5129,6 +5139,16 @@
|
||||
"lerp_mode": "catmullrom"
|
||||
}
|
||||
}
|
||||
},
|
||||
"locator_mouth": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.875": [0, 0, 0],
|
||||
"0.9167": [0, 5, -1],
|
||||
"2.375": [0, 5, -1],
|
||||
"2.4167": [0, 0, 0],
|
||||
"3.0": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -10801,169 +10821,358 @@
|
||||
"chest_eyes_light": {
|
||||
"scale": {
|
||||
"1.0417": [0, 0, 0],
|
||||
"1.0833": {"pre": [0, 0, 0], "post": [1, 1, 1]},
|
||||
"1.0833": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [1, 1, 1]
|
||||
},
|
||||
"1.2917": [1, 1, 1],
|
||||
"1.3333": {"pre": [1, 1, 1], "post": [0, 0, 0]},
|
||||
"1.3333": {
|
||||
"pre": [1, 1, 1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"1.5": [0, 0, 0],
|
||||
"1.5417": {"pre": [0, 0, 0], "post": [1, 1, 1]},
|
||||
"1.5417": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [1, 1, 1]
|
||||
},
|
||||
"1.7083": [1, 1, 1],
|
||||
"1.75": {"pre": [1, 1, 1], "post": [0, 0, 0]},
|
||||
"1.75": {
|
||||
"pre": [1, 1, 1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"1.8333": [0, 0, 0],
|
||||
"1.875": {"pre": [0, 0, 0], "post": [1, 1, 1]},
|
||||
"1.875": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [1, 1, 1]
|
||||
},
|
||||
"1.9583": [1, 1, 1],
|
||||
"2.0": {"pre": [1, 1, 1], "post": [0, 0, 0]},
|
||||
"2.0": {
|
||||
"pre": [1, 1, 1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"2.0417": [0, 0, 0],
|
||||
"2.0833": {"pre": [0, 0, 0], "post": [1, 1, 1]}
|
||||
"2.0833": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [1, 1, 1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"chest_jaw_light": {
|
||||
"scale": {
|
||||
"1.0417": [0, 0, 0],
|
||||
"1.0833": {"pre": [0, 0, 0], "post": [1, 1, 1]},
|
||||
"1.0833": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [1, 1, 1]
|
||||
},
|
||||
"1.2917": [1, 1, 1],
|
||||
"1.3333": {"pre": [1, 1, 1], "post": [0, 0, 0]},
|
||||
"1.3333": {
|
||||
"pre": [1, 1, 1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"1.5": [0, 0, 0],
|
||||
"1.5417": {"pre": [0, 0, 0], "post": [1, 1, 1]},
|
||||
"1.5417": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [1, 1, 1]
|
||||
},
|
||||
"1.7083": [1, 1, 1],
|
||||
"1.75": {"pre": [1, 1, 1], "post": [0, 0, 0]},
|
||||
"1.75": {
|
||||
"pre": [1, 1, 1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"1.8333": [0, 0, 0],
|
||||
"1.875": {"pre": [0, 0, 0], "post": [1, 1, 1]},
|
||||
"1.875": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [1, 1, 1]
|
||||
},
|
||||
"1.9583": [1, 1, 1],
|
||||
"2.0": {"pre": [1, 1, 1], "post": [0, 0, 0]},
|
||||
"2.0": {
|
||||
"pre": [1, 1, 1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"2.0417": [0, 0, 0],
|
||||
"2.0833": {"pre": [0, 0, 0], "post": [1, 1, 1]}
|
||||
"2.0833": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [1, 1, 1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"arm_left1_light": {
|
||||
"scale": {
|
||||
"0.0": [0, 0, 0],
|
||||
"1.0417": [0, 0, 0],
|
||||
"1.0833": {"pre": [0, 0, 0], "post": [1, 1, 1]},
|
||||
"1.0833": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [1, 1, 1]
|
||||
},
|
||||
"1.2917": [1, 1, 1],
|
||||
"1.3333": {"pre": [1, 1, 1], "post": [0, 0, 0]},
|
||||
"1.3333": {
|
||||
"pre": [1, 1, 1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"1.5": [0, 0, 0],
|
||||
"1.5417": {"pre": [0, 0, 0], "post": [1, 1, 1]},
|
||||
"1.5417": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [1, 1, 1]
|
||||
},
|
||||
"1.7083": [1, 1, 1],
|
||||
"1.75": {"pre": [1, 1, 1], "post": [0, 0, 0]},
|
||||
"1.75": {
|
||||
"pre": [1, 1, 1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"1.8333": [0, 0, 0],
|
||||
"1.875": {"pre": [0, 0, 0], "post": [1, 1, 1]},
|
||||
"1.875": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [1, 1, 1]
|
||||
},
|
||||
"1.9583": [1, 1, 1],
|
||||
"2.0": {"pre": [1, 1, 1], "post": [0, 0, 0]},
|
||||
"2.0": {
|
||||
"pre": [1, 1, 1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"2.0417": [0, 0, 0],
|
||||
"2.0833": {"pre": [0, 0, 0], "post": [1, 1, 1]}
|
||||
"2.0833": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [1, 1, 1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"arm_left1_light2": {
|
||||
"scale": {
|
||||
"0.0": [0, 0, 0],
|
||||
"1.0417": [0, 0, 0],
|
||||
"1.0833": {"pre": [0, 0, 0], "post": [1, 1, 1]},
|
||||
"1.0833": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [1, 1, 1]
|
||||
},
|
||||
"1.2917": [1, 1, 1],
|
||||
"1.3333": {"pre": [1, 1, 1], "post": [0, 0, 0]},
|
||||
"1.3333": {
|
||||
"pre": [1, 1, 1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"1.5": [0, 0, 0],
|
||||
"1.5417": {"pre": [0, 0, 0], "post": [1, 1, 1]},
|
||||
"1.5417": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [1, 1, 1]
|
||||
},
|
||||
"1.7083": [1, 1, 1],
|
||||
"1.75": {"pre": [1, 1, 1], "post": [0, 0, 0]},
|
||||
"1.75": {
|
||||
"pre": [1, 1, 1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"1.8333": [0, 0, 0],
|
||||
"1.875": {"pre": [0, 0, 0], "post": [1, 1, 1]},
|
||||
"1.875": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [1, 1, 1]
|
||||
},
|
||||
"1.9583": [1, 1, 1],
|
||||
"2.0": {"pre": [1, 1, 1], "post": [0, 0, 0]},
|
||||
"2.0": {
|
||||
"pre": [1, 1, 1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"2.0417": [0, 0, 0],
|
||||
"2.0833": {"pre": [0, 0, 0], "post": [1, 1, 1]}
|
||||
"2.0833": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [1, 1, 1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"arm_right1_light": {
|
||||
"scale": {
|
||||
"0.0": [0, 0, 0],
|
||||
"1.0417": [0, 0, 0],
|
||||
"1.0833": {"pre": [0, 0, 0], "post": [1, 1, 1]},
|
||||
"1.0833": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [1, 1, 1]
|
||||
},
|
||||
"1.2917": [1, 1, 1],
|
||||
"1.3333": {"pre": [1, 1, 1], "post": [0, 0, 0]},
|
||||
"1.3333": {
|
||||
"pre": [1, 1, 1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"1.5": [0, 0, 0],
|
||||
"1.5417": {"pre": [0, 0, 0], "post": [1, 1, 1]},
|
||||
"1.5417": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [1, 1, 1]
|
||||
},
|
||||
"1.7083": [1, 1, 1],
|
||||
"1.75": {"pre": [1, 1, 1], "post": [0, 0, 0]},
|
||||
"1.75": {
|
||||
"pre": [1, 1, 1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"1.8333": [0, 0, 0],
|
||||
"1.875": {"pre": [0, 0, 0], "post": [1, 1, 1]},
|
||||
"1.875": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [1, 1, 1]
|
||||
},
|
||||
"1.9583": [1, 1, 1],
|
||||
"2.0": {"pre": [1, 1, 1], "post": [0, 0, 0]},
|
||||
"2.0": {
|
||||
"pre": [1, 1, 1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"2.0417": [0, 0, 0],
|
||||
"2.0833": {"pre": [0, 0, 0], "post": [1, 1, 1]}
|
||||
"2.0833": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [1, 1, 1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"arm_right1_light2": {
|
||||
"scale": {
|
||||
"0.0": [0, 0, 0],
|
||||
"1.0417": [0, 0, 0],
|
||||
"1.0833": {"pre": [0, 0, 0], "post": [1, 1, 1]},
|
||||
"1.0833": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [1, 1, 1]
|
||||
},
|
||||
"1.2917": [1, 1, 1],
|
||||
"1.3333": {"pre": [1, 1, 1], "post": [0, 0, 0]},
|
||||
"1.3333": {
|
||||
"pre": [1, 1, 1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"1.5": [0, 0, 0],
|
||||
"1.5417": {"pre": [0, 0, 0], "post": [1, 1, 1]},
|
||||
"1.5417": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [1, 1, 1]
|
||||
},
|
||||
"1.7083": [1, 1, 1],
|
||||
"1.75": {"pre": [1, 1, 1], "post": [0, 0, 0]},
|
||||
"1.75": {
|
||||
"pre": [1, 1, 1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"1.8333": [0, 0, 0],
|
||||
"1.875": {"pre": [0, 0, 0], "post": [1, 1, 1]},
|
||||
"1.875": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [1, 1, 1]
|
||||
},
|
||||
"1.9583": [1, 1, 1],
|
||||
"2.0": {"pre": [1, 1, 1], "post": [0, 0, 0]},
|
||||
"2.0": {
|
||||
"pre": [1, 1, 1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"2.0417": [0, 0, 0],
|
||||
"2.0833": {"pre": [0, 0, 0], "post": [1, 1, 1]}
|
||||
"2.0833": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [1, 1, 1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"head_light": {
|
||||
"scale": {
|
||||
"0.0": [0, 0, 0],
|
||||
"1.0417": [0, 0, 0],
|
||||
"1.0833": {"pre": [0, 0, 0], "post": [1, 1, 1]},
|
||||
"1.0833": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [1, 1, 1]
|
||||
},
|
||||
"1.2917": [1, 1, 1],
|
||||
"1.3333": {"pre": [1, 1, 1], "post": [0, 0, 0]},
|
||||
"1.3333": {
|
||||
"pre": [1, 1, 1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"1.5": [0, 0, 0],
|
||||
"1.5417": {"pre": [0, 0, 0], "post": [1, 1, 1]},
|
||||
"1.5417": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [1, 1, 1]
|
||||
},
|
||||
"1.7083": [1, 1, 1],
|
||||
"1.75": {"pre": [1, 1, 1], "post": [0, 0, 0]},
|
||||
"1.75": {
|
||||
"pre": [1, 1, 1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"1.8333": [0, 0, 0],
|
||||
"1.875": {"pre": [0, 0, 0], "post": [1, 1, 1]},
|
||||
"1.875": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [1, 1, 1]
|
||||
},
|
||||
"1.9583": [1, 1, 1],
|
||||
"2.0": {"pre": [1, 1, 1], "post": [0, 0, 0]},
|
||||
"2.0": {
|
||||
"pre": [1, 1, 1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"2.0417": [0, 0, 0],
|
||||
"2.0833": {"pre": [0, 0, 0], "post": [1, 1, 1]}
|
||||
"2.0833": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [1, 1, 1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"crown_light": {
|
||||
"scale": {
|
||||
"0.0": [0, 0, 0],
|
||||
"1.0417": [0, 0, 0],
|
||||
"1.0833": {"pre": [0, 0, 0], "post": [1, 1, 1]},
|
||||
"1.0833": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [1, 1, 1]
|
||||
},
|
||||
"1.2917": [1, 1, 1],
|
||||
"1.3333": {"pre": [1, 1, 1], "post": [0, 0, 0]},
|
||||
"1.3333": {
|
||||
"pre": [1, 1, 1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"1.5": [0, 0, 0],
|
||||
"1.5417": {"pre": [0, 0, 0], "post": [1, 1, 1]},
|
||||
"1.5417": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [1, 1, 1]
|
||||
},
|
||||
"1.7083": [1, 1, 1],
|
||||
"1.75": {"pre": [1, 1, 1], "post": [0, 0, 0]},
|
||||
"1.75": {
|
||||
"pre": [1, 1, 1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"1.8333": [0, 0, 0],
|
||||
"1.875": {"pre": [0, 0, 0], "post": [1, 1, 1]},
|
||||
"1.875": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [1, 1, 1]
|
||||
},
|
||||
"1.9583": [1, 1, 1],
|
||||
"2.0": {"pre": [1, 1, 1], "post": [0, 0, 0]},
|
||||
"2.0": {
|
||||
"pre": [1, 1, 1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"2.0417": [0, 0, 0],
|
||||
"2.0833": {"pre": [0, 0, 0], "post": [1, 1, 1]}
|
||||
"2.0833": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [1, 1, 1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"torso_jaw_light": {
|
||||
"scale": {
|
||||
"1.0417": [0, 0, 0],
|
||||
"1.0833": {"pre": [0, 0, 0], "post": [1, 1, 1]},
|
||||
"1.0833": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [1, 1, 1]
|
||||
},
|
||||
"1.2917": [1, 1, 1],
|
||||
"1.3333": {"pre": [1, 1, 1], "post": [0, 0, 0]},
|
||||
"1.3333": {
|
||||
"pre": [1, 1, 1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"1.5": [0, 0, 0],
|
||||
"1.5417": {"pre": [0, 0, 0], "post": [1, 1, 1]},
|
||||
"1.5417": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [1, 1, 1]
|
||||
},
|
||||
"1.7083": [1, 1, 1],
|
||||
"1.75": {"pre": [1, 1, 1], "post": [0, 0, 0]},
|
||||
"1.75": {
|
||||
"pre": [1, 1, 1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"1.8333": [0, 0, 0],
|
||||
"1.875": {"pre": [0, 0, 0], "post": [1, 1, 1]},
|
||||
"1.875": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [1, 1, 1]
|
||||
},
|
||||
"1.9583": [1, 1, 1],
|
||||
"2.0": {"pre": [1, 1, 1], "post": [0, 0, 0]},
|
||||
"2.0": {
|
||||
"pre": [1, 1, 1],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"2.0417": [0, 0, 0],
|
||||
"2.0833": {"pre": [0, 0, 0], "post": [1, 1, 1]}
|
||||
"2.0833": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [1, 1, 1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"torso": {
|
||||
@@ -11090,11 +11299,20 @@
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"1.6667": [0, 5.5, 0],
|
||||
"1.7083": {"pre": [0, 5.5, 0], "post": [0, -5, 0]},
|
||||
"1.7083": {
|
||||
"pre": [0, 5.5, 0],
|
||||
"post": [0, -5, 0]
|
||||
},
|
||||
"1.9583": [0, 5.5, 0],
|
||||
"2.0": {"pre": [0, 5.5, 0], "post": [0, -5, 0]},
|
||||
"2.0": {
|
||||
"pre": [0, 5.5, 0],
|
||||
"post": [0, -5, 0]
|
||||
},
|
||||
"2.0833": [0, 5.5, 0],
|
||||
"2.125": {"pre": [0, 5.5, 0], "post": [0, -5, 0]},
|
||||
"2.125": {
|
||||
"pre": [0, 5.5, 0],
|
||||
"post": [0, -5, 0]
|
||||
},
|
||||
"2.2083": [0, 5.5, 0]
|
||||
},
|
||||
"scale": {
|
||||
@@ -11338,30 +11556,54 @@
|
||||
"face_neutral": {
|
||||
"position": {
|
||||
"0.0417": [0, 0, 0],
|
||||
"0.0833": {"pre": [0, 0, 0], "post": [0, 0, 6]}
|
||||
"0.0833": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0, 6]
|
||||
}
|
||||
}
|
||||
},
|
||||
"face_angry": {
|
||||
"position": {
|
||||
"1.375": [0, 0, 0],
|
||||
"1.4167": {"pre": [0, 0, 0], "post": [0, 0, -6]}
|
||||
"1.4167": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0, -6]
|
||||
}
|
||||
}
|
||||
},
|
||||
"face_unamused": {
|
||||
"position": {
|
||||
"0.4583": [0, 0, 0],
|
||||
"0.5": {"pre": [0, 0, 0], "post": [0, 0, -6]},
|
||||
"0.5": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0, -6]
|
||||
},
|
||||
"1.375": [0, 0, -6],
|
||||
"1.4167": {"pre": [0, 0, -6], "post": [0, 0, 0]}
|
||||
"1.4167": {
|
||||
"pre": [0, 0, -6],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"face_shock": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0417": {"pre": [0, 0, 0], "post": [0, 0, 0]},
|
||||
"0.0833": {"pre": [0, 0, 0], "post": [0, 0, -6]},
|
||||
"0.4583": {"pre": [0, 0, -6], "post": [0, 0, -6]},
|
||||
"0.5": {"pre": [0, 0, -6], "post": [0, 0, 0]}
|
||||
"0.0417": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0, 0]
|
||||
},
|
||||
"0.0833": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0, -6]
|
||||
},
|
||||
"0.4583": {
|
||||
"pre": [0, 0, -6],
|
||||
"post": [0, 0, -6]
|
||||
},
|
||||
"0.5": {
|
||||
"pre": [0, 0, -6],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"neck_ornament_left1": {
|
||||
@@ -13130,6 +13372,12 @@
|
||||
},
|
||||
"chest_eyes_light": {
|
||||
"scale": 0
|
||||
},
|
||||
"chest_jaw_light": {
|
||||
"scale": 0
|
||||
},
|
||||
"torso_jaw_light": {
|
||||
"scale": 0
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
+286
@@ -0,0 +1,286 @@
|
||||
{
|
||||
"format_version": "1.8.0",
|
||||
"animations": {
|
||||
"animation.throh.ground_idle": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"torso": {
|
||||
"rotation": [0, 2.5, 0]
|
||||
},
|
||||
"chest": {
|
||||
"rotation": [2.5, 0, 0]
|
||||
},
|
||||
"arm_left": {
|
||||
"rotation": [10, 0, 0]
|
||||
},
|
||||
"arm_left_rotation": {
|
||||
"rotation": [-0.44067, 9.99038, 39.96148]
|
||||
},
|
||||
"arm_left2": {
|
||||
"rotation": [0, 27.5, 0]
|
||||
},
|
||||
"hand_left": {
|
||||
"rotation": [1.33781, 14.94159, 5.17544]
|
||||
},
|
||||
"finger_back_left": {
|
||||
"rotation": [-2.3273, -24.89837, 5.51385]
|
||||
},
|
||||
"finger_back_left2": {
|
||||
"rotation": [0, 25, 0]
|
||||
},
|
||||
"finger_middle_left": {
|
||||
"rotation": [0, 0, -35]
|
||||
},
|
||||
"finger_middle_left2": {
|
||||
"rotation": [0, 0, 17.5]
|
||||
},
|
||||
"finger_front_left": {
|
||||
"rotation": [14.47281, 32.60072, 18.55513]
|
||||
},
|
||||
"finger_front_left2": {
|
||||
"rotation": [0, -17.5, 0]
|
||||
},
|
||||
"leg_left": {
|
||||
"rotation": [-1.5, -6.5, -5]
|
||||
},
|
||||
"leg_left2": {
|
||||
"rotation": [5, 0, 0]
|
||||
},
|
||||
"leg_right": {
|
||||
"rotation": [-1.5, 6.5, 5]
|
||||
},
|
||||
"arm_right": {
|
||||
"rotation": [10, 0, 0]
|
||||
},
|
||||
"arm_right_rotation": {
|
||||
"rotation": [-0.44067, -9.99038, -39.96148]
|
||||
},
|
||||
"arm_right2": {
|
||||
"rotation": [0, -27.5, 0]
|
||||
},
|
||||
"hand_right": {
|
||||
"rotation": [1.33781, -14.94159, -5.17544]
|
||||
},
|
||||
"finger_back_right": {
|
||||
"rotation": [-2.3273, 24.89837, -5.51385]
|
||||
},
|
||||
"finger_back_right2": {
|
||||
"rotation": [0, -25, 0]
|
||||
},
|
||||
"finger_middle_right2": {
|
||||
"rotation": [0, 0, -17.5]
|
||||
},
|
||||
"finger_front_right": {
|
||||
"rotation": [14.47281, -32.60072, -18.55513]
|
||||
},
|
||||
"finger_front_right2": {
|
||||
"rotation": [0, 17.5, 0]
|
||||
},
|
||||
"head": {
|
||||
"rotation": [0, -2.5, 0]
|
||||
},
|
||||
"foot_left": {
|
||||
"rotation": [-3, 0, 5],
|
||||
"position": [0, 0.5, 0]
|
||||
},
|
||||
"leg_right2": {
|
||||
"rotation": [5, 0, 0]
|
||||
},
|
||||
"foot_right": {
|
||||
"rotation": [-3, 0, -5],
|
||||
"position": [0, 0.5, 0]
|
||||
},
|
||||
"body": {
|
||||
"position": [0, -0.8, 0]
|
||||
},
|
||||
"belt_left2": {
|
||||
"rotation": [5, 0, 5]
|
||||
},
|
||||
"belt_right": {
|
||||
"rotation": [-7.5, 0, 0]
|
||||
},
|
||||
"belt_right2": {
|
||||
"rotation": [5, 0, -5]
|
||||
},
|
||||
"finger_middle_right": {
|
||||
"rotation": [0, 0, 35]
|
||||
},
|
||||
"belt_left": {
|
||||
"rotation": [-5, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.throh.battle_idle": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"torso": {
|
||||
"rotation": [0, 2.5, 0]
|
||||
},
|
||||
"chest": {
|
||||
"rotation": [0, 0, 0]
|
||||
},
|
||||
"arm_left": {
|
||||
"rotation": [-17.5, 0, 0]
|
||||
},
|
||||
"arm_left_rotation": {
|
||||
"rotation": [0, 0, 5]
|
||||
},
|
||||
"arm_left2": {
|
||||
"rotation": [0, 65, 0]
|
||||
},
|
||||
"hand_left": {
|
||||
"rotation": [2.66399, 14.76689, 10.34527]
|
||||
},
|
||||
"finger_back_left": {
|
||||
"rotation": [0, -25, 0]
|
||||
},
|
||||
"finger_back_left2": {
|
||||
"rotation": [0, 25, 0]
|
||||
},
|
||||
"finger_middle_left": {
|
||||
"rotation": [0, 0, -35]
|
||||
},
|
||||
"finger_middle_left2": {
|
||||
"rotation": [0, 0, 17.5]
|
||||
},
|
||||
"finger_front_left": {
|
||||
"rotation": [11.28582, 33.71632, 12.73216]
|
||||
},
|
||||
"finger_front_left2": {
|
||||
"rotation": [0, -17.5, 0]
|
||||
},
|
||||
"legs": {
|
||||
"rotation": [0, 10, 0]
|
||||
},
|
||||
"leg_left": {
|
||||
"rotation": [2, -12.5, -11]
|
||||
},
|
||||
"leg_left2": {
|
||||
"rotation": [5, 0, 0]
|
||||
},
|
||||
"leg_right": {
|
||||
"rotation": [0, 5, 10]
|
||||
},
|
||||
"arm_right": {
|
||||
"rotation": [-15, 0, 0]
|
||||
},
|
||||
"arm_right_rotation": {
|
||||
"rotation": [0, 0, -45]
|
||||
},
|
||||
"arm_right2": {
|
||||
"rotation": [0, -42.5, 0]
|
||||
},
|
||||
"hand_right": {
|
||||
"rotation": [0, -17.5, 0]
|
||||
},
|
||||
"finger_back_right": {
|
||||
"rotation": [0, 25, 0]
|
||||
},
|
||||
"finger_back_right2": {
|
||||
"rotation": [0, -20, 0]
|
||||
},
|
||||
"finger_middle_right2": {
|
||||
"rotation": [0, 0, -30]
|
||||
},
|
||||
"finger_front_right": {
|
||||
"rotation": [11.28582, -33.71632, -12.73216]
|
||||
},
|
||||
"finger_front_right2": {
|
||||
"rotation": [0, 17.5, 0]
|
||||
},
|
||||
"head": {
|
||||
"rotation": [0, -2.5, 0]
|
||||
},
|
||||
"foot_left": {
|
||||
"rotation": [-4.5, 0, 10.5],
|
||||
"position": [0, 0.6, 0]
|
||||
},
|
||||
"leg_right2": {
|
||||
"rotation": [5, 0, 0]
|
||||
},
|
||||
"foot_right": {
|
||||
"rotation": [-3.5, 0, -9.5],
|
||||
"position": [0, 0.6, 0]
|
||||
},
|
||||
"body": {
|
||||
"position": [0, -1, 0]
|
||||
},
|
||||
"belt_left2": {
|
||||
"rotation": [5, 0, 5]
|
||||
},
|
||||
"belt_right": {
|
||||
"rotation": [-7.5, 0, 0]
|
||||
},
|
||||
"belt_right2": {
|
||||
"rotation": [5, 0, -5]
|
||||
},
|
||||
"finger_middle_right": {
|
||||
"rotation": [0, 0, 35]
|
||||
},
|
||||
"belt_left": {
|
||||
"rotation": [-5, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.throh.blink": {
|
||||
"animation_length": 0.1667,
|
||||
"bones": {
|
||||
"eyelid_left": {
|
||||
"position": {
|
||||
"0.0": [0, 0, -0.1],
|
||||
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eyelid_right": {
|
||||
"position": {
|
||||
"0.0": [0, 0, -0.1],
|
||||
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eye_left": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0.1],
|
||||
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eye_right": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0.1],
|
||||
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eyes_ditto": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0.1],
|
||||
"0.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"eyes_blink_ditto": {
|
||||
"position": {
|
||||
"0.0": [0, 0, -0.1],
|
||||
"0.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.throh.ditto_face": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"eyes": {
|
||||
"position": [0, 0, 0.1]
|
||||
},
|
||||
"face_ditto": {
|
||||
"position": [0, 0, -0.1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.throh.cry": {
|
||||
"animation_length": 1.25,
|
||||
"sound_effects": {
|
||||
"0.0417": {
|
||||
"effect": "pokemon.throh.cry"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+322
@@ -0,0 +1,322 @@
|
||||
{
|
||||
"format_version": "1.8.0",
|
||||
"animations": {
|
||||
"animation.sawk.ground_idle": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"body": {
|
||||
"position": [0, -1.7, 0]
|
||||
},
|
||||
"torso": {
|
||||
"rotation": [2.5, 0, 0]
|
||||
},
|
||||
"robe_back": {
|
||||
"rotation": [2.5, 0, 0]
|
||||
},
|
||||
"robe_left": {
|
||||
"rotation": [0, 0, -22.5]
|
||||
},
|
||||
"robe_right": {
|
||||
"rotation": [0, 0, 22.5]
|
||||
},
|
||||
"belt_left": {
|
||||
"rotation": [-2.5, 0, -5]
|
||||
},
|
||||
"belt_left2": {
|
||||
"rotation": [2.45177, 0.08843, 7.02123]
|
||||
},
|
||||
"belt_right": {
|
||||
"rotation": [-2.5, 0, 5]
|
||||
},
|
||||
"belt_right2": {
|
||||
"rotation": [2.45177, -0.08843, -7.02123]
|
||||
},
|
||||
"chest": {
|
||||
"rotation": [0, 0, 0]
|
||||
},
|
||||
"arm_left": {
|
||||
"rotation": [-2.35666, -17.34551, 62.85952]
|
||||
},
|
||||
"arm_left2": {
|
||||
"rotation": [0, 40, 0]
|
||||
},
|
||||
"hand_left": {
|
||||
"rotation": [0.44067, 9.99038, 2.53852]
|
||||
},
|
||||
"finger_back_left": {
|
||||
"rotation": [-6.46066, -13.56626, 25.76926]
|
||||
},
|
||||
"finger_back_left2": {
|
||||
"rotation": [0, 0, 27.5]
|
||||
},
|
||||
"finger_front_left": {
|
||||
"rotation": [2.26708, 7.15102, 17.64168]
|
||||
},
|
||||
"finger_front_left2": {
|
||||
"rotation": [0, 0, 25]
|
||||
},
|
||||
"thumb_left": {
|
||||
"rotation": [19.52546, 35.63104, 31.32977]
|
||||
},
|
||||
"thumb_left2": {
|
||||
"rotation": [0, -35, 0]
|
||||
},
|
||||
"arm_right": {
|
||||
"rotation": [-2.35666, 17.34551, -62.85952]
|
||||
},
|
||||
"arm_right2": {
|
||||
"rotation": [0, -40, 0]
|
||||
},
|
||||
"hand_right": {
|
||||
"rotation": [0.44067, -9.99038, -2.53852]
|
||||
},
|
||||
"finger_back_right": {
|
||||
"rotation": [-6.46066, 13.56626, -25.76926]
|
||||
},
|
||||
"finger_back_right2": {
|
||||
"rotation": [0, 0, -27.5]
|
||||
},
|
||||
"finger_front_right": {
|
||||
"rotation": [2.26708, -7.15102, -17.64168]
|
||||
},
|
||||
"finger_front_right2": {
|
||||
"rotation": [0, 0, -25]
|
||||
},
|
||||
"thumb_right": {
|
||||
"rotation": [19.52546, -35.63104, -31.32977]
|
||||
},
|
||||
"thumb_right2": {
|
||||
"rotation": [0, 35, 0]
|
||||
},
|
||||
"leg_left": {
|
||||
"rotation": [-13.5, -18.75, -5],
|
||||
"position": [-0.15, 0, 0]
|
||||
},
|
||||
"leg_left2": {
|
||||
"rotation": [25, 0, 0]
|
||||
},
|
||||
"foot_left": {
|
||||
"rotation": [-10, 0, 5]
|
||||
},
|
||||
"leg_right": {
|
||||
"rotation": [-13.5, 18.75, 5],
|
||||
"position": [0.15, 0, 0]
|
||||
},
|
||||
"leg_right2": {
|
||||
"rotation": [25, 0, 0]
|
||||
},
|
||||
"foot_right": {
|
||||
"rotation": [-10, 0, -5]
|
||||
},
|
||||
"head": {
|
||||
"rotation": [2, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.sawk.battle_idle": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"body": {
|
||||
"rotation": [0, -25, 0],
|
||||
"position": [0, -7.75, 0]
|
||||
},
|
||||
"torso": {
|
||||
"rotation": [2, -12.5, 2.5],
|
||||
"position": [0, 0, -0.5]
|
||||
},
|
||||
"robe_front": {
|
||||
"rotation": [-2.5, 0, 0]
|
||||
},
|
||||
"robe_left": {
|
||||
"rotation": [0, 0, -57.5]
|
||||
},
|
||||
"robe_right": {
|
||||
"rotation": [0, 0, 45]
|
||||
},
|
||||
"belt_left": {
|
||||
"rotation": [-2.5, 0, -5]
|
||||
},
|
||||
"belt_left2": {
|
||||
"rotation": [0, 0, 7.5]
|
||||
},
|
||||
"belt_right": {
|
||||
"rotation": [-5, 0, 0]
|
||||
},
|
||||
"belt_right2": {
|
||||
"rotation": [0, 0, -10]
|
||||
},
|
||||
"chest": {
|
||||
"rotation": [3.5, -1.5, -5.5]
|
||||
},
|
||||
"arm_left": {
|
||||
"rotation": [33.37349, 23.33783, 39.65943]
|
||||
},
|
||||
"arm_left2": {
|
||||
"rotation": [0, 85, 0]
|
||||
},
|
||||
"hand_left": {
|
||||
"rotation": [-17.5, 0, 17.5],
|
||||
"position": [0, 0, -1]
|
||||
},
|
||||
"finger_back_left": {
|
||||
"rotation": [-1.6575, -12.39135, 65.17995]
|
||||
},
|
||||
"finger_back_left2": {
|
||||
"rotation": [0, 0, 77.5]
|
||||
},
|
||||
"finger_front_left": {
|
||||
"rotation": [0, 0, 47.5]
|
||||
},
|
||||
"finger_front_left2": {
|
||||
"rotation": [0, 0, 67.5]
|
||||
},
|
||||
"thumb_left": {
|
||||
"rotation": [0, 12.5, 50]
|
||||
},
|
||||
"thumb_left2": {
|
||||
"rotation": [0, -75, 0]
|
||||
},
|
||||
"leg_left": {
|
||||
"rotation": [-56.5, -73.5, -13],
|
||||
"position": [0, 0, 1]
|
||||
},
|
||||
"leg_left2": {
|
||||
"rotation": [65.5, 0, 0]
|
||||
},
|
||||
"leg_right": {
|
||||
"rotation": [-70, 45, 0]
|
||||
},
|
||||
"leg_right2": {
|
||||
"rotation": [57.5, 0, 0]
|
||||
},
|
||||
"arm_right": {
|
||||
"rotation": [-35.13942, -12.52777, -43.0439]
|
||||
},
|
||||
"arm_right2": {
|
||||
"rotation": [-7.97707, -72.32584, 8.25248]
|
||||
},
|
||||
"finger_back_right": {
|
||||
"rotation": [-6.03887, 13.82381, -20.54269]
|
||||
},
|
||||
"finger_front_right": {
|
||||
"rotation": [3.22206, -27.28953, -8.41338]
|
||||
},
|
||||
"finger_front_right2": {
|
||||
"rotation": [0, 0, -2.5]
|
||||
},
|
||||
"thumb_right": {
|
||||
"rotation": [0, -65, 0]
|
||||
},
|
||||
"thumb_right2": {
|
||||
"rotation": [0, 15, 0]
|
||||
},
|
||||
"wrist_right": {
|
||||
"rotation": [-20.5421, -26.64464, 41.49118]
|
||||
},
|
||||
"wrist_left": {
|
||||
"rotation": [-87.5, 0, 0]
|
||||
},
|
||||
"foot_left": {
|
||||
"rotation": [3.5, 0, 4],
|
||||
"position": [0, 0.5, 0]
|
||||
},
|
||||
"hand_right": {
|
||||
"rotation": [7.5, 10, 0]
|
||||
},
|
||||
"finger_back_right2": {
|
||||
"rotation": [0, 0, -17.5]
|
||||
},
|
||||
"foot_right": {
|
||||
"rotation": [12.5, 0, 0],
|
||||
"position": [0, 0.7, -0.25]
|
||||
},
|
||||
"head": {
|
||||
"rotation": [-1, 40, -1.5]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.sawk.blink": {
|
||||
"animation_length": 0.1667,
|
||||
"bones": {
|
||||
"eyelid_left": {
|
||||
"position": {
|
||||
"0.0": [0.1, 0, -0.1],
|
||||
"0.1667": {
|
||||
"pre": [0.1, 0, -0.1],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"eye_left": {
|
||||
"position": {
|
||||
"0.0": [-0.1, 0, 0.1],
|
||||
"0.1667": {
|
||||
"pre": [-0.1, 0, 0.1],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"eye_right": {
|
||||
"position": {
|
||||
"0.0": [0.1, 0, 0.1],
|
||||
"0.1667": {
|
||||
"pre": [0.1, 0, 0.1],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"eyelid_right": {
|
||||
"position": {
|
||||
"0.0": [-0.1, 0, -0.1],
|
||||
"0.1667": {
|
||||
"pre": [-0.1, 0, -0.1],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"eyes_ditto": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0.1],
|
||||
"0.1667": {
|
||||
"pre": [0, 0, 0.1],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"eyes_blink_ditto": {
|
||||
"position": {
|
||||
"0.0": [0, 0, -0.1],
|
||||
"0.1667": {
|
||||
"pre": [0, 0, -0.1],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.sawk.ditto_face": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"eyes": {
|
||||
"position": [0, 0, 0.1],
|
||||
"scale": 0
|
||||
},
|
||||
"eyebrow_right": {
|
||||
"position": [0, 0, 0.1],
|
||||
"scale": 0
|
||||
},
|
||||
"face_ditto": {
|
||||
"position": [0, 0, -0.1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.sawk.cry": {
|
||||
"animation_length": 1.25,
|
||||
"sound_effects": {
|
||||
"0.0417": {
|
||||
"effect": "pokemon.sawk.cry"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user