Compare commits

..
Author SHA1 Message Date
JPAKx4 b1817322fa camera stuffs 2025-11-21 22:33:14 -06:00
Nick 3a2ff9de75 1.7.1 SNAPSHOT in prep for next development cycle 2025-11-21 17:06:08 -08:00
Paul b249896316 more changelog [skip-ci] 2025-11-22 09:37:51 +10:00
Test 1cb6979b90 More changelog cleanup [skip-ci] 2025-11-21 20:56:30 +00:00
Polymeta e983d2c1db Merge branch 'implement_pokemon' into 'main'
marked togedemaru as implemented

See merge request cable-mc/cobblemon!2029
2025-11-21 20:16:07 +00:00
violet 9ee0cf941b Merge remote-tracking branch 'origin/implement_pokemon' into implement_pokemon 2025-11-21 14:29:35 -05:00
violet 8436c93317 marked togedemaru as implemented 2025-11-21 14:29:19 -05:00
Paul 7f0329acb7 Loads of changelog restructuring, separated old versions out into their own files [skip-ci] 2025-11-21 23:49:00 +10:00
Polymeta 83489b7230 nothing to see here
Signed-off-by: Polymeta <40173118+Polymeta@users.noreply.github.com>
2025-11-21 13:09:27 +00:00
Landon 081a25f04b Merge branch 'does-anyone-even-read-these' into 'main'
Fix mutation of vector after changing from Vector3f to Vec3

See merge request cable-mc/cobblemon!2028
2025-11-21 12:42:41 +00:00
Landon Wills 38bdfae0db Fix mutation of vector after changing from Vector3f to Vec3 2025-11-21 06:57:06 -05:00
Landon bd3a9e30f1 Merge branch 'fix-npc-behavior-json' into 'main'
Fix NPC Behavior Json key

See merge request cable-mc/cobblemon!2026
2025-11-21 11:02:11 +00:00
Hiroku 7ce968f467 Merge branch 'implement_pokemon' into 'main'
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA...

See merge request cable-mc/cobblemon!2027
2025-11-21 10:33:34 +00:00
Hiroku 9ac8cc56f0 Merge branch 'main' into 'implement_pokemon'
# Conflicts:
#   common/src/main/resources/data/cobblemon/species/generation5/patrat.json
#   common/src/main/resources/data/cobblemon/species/generation9/tadbulb.json
2025-11-21 09:45:22 +00:00
Polymeta 98159e1e0e Merge branch 'smeargle-tail-reset' into 'main'
Fixed smeargle tail changing colour between relogs

See merge request cable-mc/cobblemon!2024
2025-11-21 09:44:00 +00:00
violet 025b5aae74 edited treecko line, braixen, and delphox's files 2025-11-21 04:27:03 -05:00
Deltric 2fddb21585 Fixed NPC behavior key fix, yes that's right behavior not behaviour @Hiroku. 2025-11-21 01:32:54 -06:00
violet 6b75976236 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 2025-11-21 02:17:36 -05:00
Paul fdf419ec8f Rescraped for willFlee scraper bug, restoring flee behaviour for hundreds of pokes 2025-11-21 17:12:20 +10:00
Paul d2ceb2d58a Fixed wooper and whiscash forms being fished by all rods 2025-11-21 17:11:11 +10:00
Hiroku 6d8311a66c Merge branch '1.7-spawns-update' into 'main'
Updated spawns for 1/100 chance form Pokémon.

See merge request cable-mc/cobblemon!2025
2025-11-21 07:07:00 +00:00
Veraxiel 18a3d1c22c Updated spawns for 1/100 chance form Pokémon. 2025-11-21 01:54:50 -05:00
Hiroku b382a1b2db Merge branch '1.7-tag-cleanup' into 'main'
1.7 tag cleanup

See merge request cable-mc/cobblemon!2017
2025-11-21 06:29:22 +00:00
Paul dd17fa138e Fixed smeargle tail changing colour between relogs 2025-11-21 16:27:56 +10:00
Test 09dd623ea7 Amend dolphin controls overlay 2025-11-21 06:24:56 +00:00
Landon 8c01bb831f Merge branch 'path-faster-and-less-and-faster' into 'main'
Following the owner should not be so aggressive. Path cooldown, and consider...

See merge request cable-mc/cobblemon!2019
2025-11-21 06:09:10 +00:00
Paul 2cb4372496 Removed cry from slowpoke tail'ing 2025-11-21 15:04:43 +10:00
Hiroku 7597b2d98e Merge branch 'fated-faint' into 'main'
Crafting Fix

See merge request cable-mc/cobblemon!2023
2025-11-21 04:54:05 +00:00
dhi_holo 5ac2729a77 Crafting Fix
EV Feathers now unlock in recipe book, and Mochi cannot be crafted in a table, now requires campfire pot cooking
2025-11-21 14:46:13 +10:00
Hiroku bec1fca7a5 Merge branch 'brewer-only' into 'main'
Quick Brewing Only-ification

See merge request cable-mc/cobblemon!2022
2025-11-21 04:19:04 +00:00
dhi_holo 32d145f3cc Quick Brewing Only-ification
Removed 8 recipes that were meant to be removed, added translation for a newer tag that was missed over
2025-11-21 13:34:52 +10:00
Paul a5f1a14e21 Merge remote-tracking branch 'weblate/lang-updates'
# Conflicts:
#	common/src/main/resources/assets/cobblemon/lang/pt_br.json
2025-11-21 11:43:28 +10:00
Landon 57784b8620 Merge branch 'camera-farlands' into 'main'
Switch to using Doubles when positioning camera.

See merge request cable-mc/cobblemon!2021
2025-11-20 23:28:26 +00:00
JPAKx4 a29b3342a1 Switch to using Doubles when positioning camera. 2025-11-20 16:41:13 -06:00
Polymeta 64d6560caf Merge branch 'cobble-jail-here-i-come' into 'main'
Small fixes

See merge request cable-mc/cobblemon!2018
2025-11-20 22:10:32 +00:00
Polymeta 2e314e48fb Merge branch 'Car-fixes' into 'main'
Car fixes

See merge request cable-mc/cobblemon!2016
2025-11-20 21:19:50 +00:00
Nick e8d1e3766b Merge branch 'fix-pc-deserialisation' into 'main'
Fix PC JSON loading

See merge request cable-mc/cobblemon!2020
2025-11-20 12:09:54 -08:00
Landon Wills 012682268e Add safe check for nbt 2025-11-20 14:22:32 -05:00
Landon Wills 38428e4ea9 Fix PC JSON loading 2025-11-20 14:19:17 -05:00
Paul 567132bc0c Even more aggressive optimizations for the nodemaker 2025-11-20 23:07:59 +10:00
Paul e7209e4000 More aggressive optimizations for the nodemaker 2025-11-20 22:40:19 +10:00
Landon Wills 273b520c0b Shave iterations off of node type checks 2025-11-20 02:13:27 -05:00
Guilherme Pereira 0f02313a14 prevent pokemon from being busy when capturing player gets killed 2025-11-20 03:13:55 -03:00
Guilherme Pereira 3249e4bbb1 prevent pokemon from doing damage when being captured 2025-11-20 03:13:15 -03:00
geumuandWeblate 36aca65003 Translated using Weblate (Korean)
Currently translated at 67.0% (6010 of 8962 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ko/
2025-11-20 05:48:24 +00:00
Watuneni iteiteandWeblate c6635213a2 Translated using Weblate (Japanese)
Currently translated at 99.2% (8897 of 8962 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ja/
2025-11-20 05:48:23 +00:00
JazzMcNade bf6fab3936 Only check for nearby danger nodes if the hitbox is small 2025-11-19 23:18:11 -06:00
Watuneni iteiteandWeblate b76158d1d7 Translated using Weblate (Japanese)
Currently translated at 99.2% (8896 of 8962 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ja/
2025-11-20 02:32:39 +00:00
geumuandWeblate 916ec97fce Translated using Weblate (Korean)
Currently translated at 66.6% (5972 of 8962 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ko/
2025-11-20 02:32:36 +00:00
Veraxiel 36b38d36cb Updated biome tags. 2025-11-19 21:00:27 -05:00
Veraxiel f1163977e1 Updated biome and seasoning tags. Updated Sinister Tea recipe filter. 2025-11-19 20:59:42 -05:00
Carmendar a7dd6d52c8 Charizard and Mudsdale Look tweaks. 2025-11-19 19:29:19 -06:00
Watuneni iteiteandWeblate 6898804e83 Translated using Weblate (Japanese)
Currently translated at 96.9% (8686 of 8962 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ja/
2025-11-20 00:40:19 +00:00
Carmendar 2331603b27 Tyrantrum sleep t-pose fix. 2025-11-19 18:30:38 -06:00
Carmendar c8e9cbbe59 Furfrou cry fix 2025-11-19 18:30:11 -06:00
Carmendar d374635648 Aerodactyl Battle Cry and Texture fix 2025-11-19 18:29:39 -06:00
Weblate 87502f36c4 Update translation files
Updated by "Remove blank strings" add-on in Weblate.

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/
2025-11-19 16:43:18 +00:00
Nico MerenqandWeblate bed511d403 Translated using Weblate (Russian)
Currently translated at 78.3% (7019 of 8962 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ru/
2025-11-19 16:43:14 +00:00
阿鱼andWeblate 4170b00e31 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (8962 of 8962 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/zh_Hans/
2025-11-19 16:43:13 +00:00
geumuandWeblate 3cc90daaf0 Translated using Weblate (Korean)
Currently translated at 66.2% (5937 of 8962 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ko/
2025-11-19 16:43:12 +00:00
Weblate 9a1d6461d9 Update translation files
Updated by "Remove blank strings" add-on in Weblate.

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/
2025-11-19 11:12:29 +00:00
Watuneni iteiteandWeblate 2dc76ffe3e Translated using Weblate (Japanese)
Currently translated at 96.4% (8646 of 8962 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ja/
2025-11-19 11:12:25 +00:00
geumuandWeblate 87225d8981 Translated using Weblate (Korean)
Currently translated at 65.6% (5886 of 8962 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ko/
2025-11-19 11:12:24 +00:00
Paul 58c6ea0269 Following the owner should not be so aggressive. Path cooldown, and consider hitbox when deciding if it needs to start walking closer 2025-11-19 19:16:42 +10:00
Paul 034bd2eec6 Only use strict walking pathing when the hitbox is small 2025-11-19 19:16:02 +10:00
geumuandWeblate c3d7537b3e Translated using Weblate (Korean)
Currently translated at 65.0% (5832 of 8962 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ko/
2025-11-19 00:43:57 +00:00
geumuandWeblate 31c55a9b6f Translated using Weblate (Korean)
Currently translated at 65.0% (5832 of 8962 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ko/
2025-11-18 17:39:25 +00:00
Weblate e9e4158666 Update translation files
Updated by "Remove blank strings" add-on in Weblate.

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/
2025-11-18 09:44:12 +00:00
Watuneni iteiteandWeblate b15917898f Translated using Weblate (Japanese)
Currently translated at 95.7% (8582 of 8962 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ja/
2025-11-18 09:44:07 +00:00
TeggyandWeblate ef3179bfa2 Translated using Weblate (Spanish)
Currently translated at 84.8% (7602 of 8962 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/es/
2025-11-18 09:44:06 +00:00
阿鱼andWeblate f0afb8b3d9 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 99.9% (8959 of 8962 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/zh_Hans/
2025-11-18 09:44:05 +00:00
geumuandWeblate 17e58b0ce5 Translated using Weblate (Korean)
Currently translated at 63.7% (5714 of 8962 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ko/
2025-11-18 09:44:04 +00:00
Nico MerenqandWeblate 250724ef1f Translated using Weblate (Russian)
Currently translated at 77.9% (6988 of 8962 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ru/
2025-11-15 15:05:37 +00:00
Patch Notes GuyandWeblate 3e1837543d Translated using Weblate (Ukrainian)
Currently translated at 77.5% (6948 of 8962 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/uk/
2025-11-15 10:45:37 +00:00
Nico MerenqandWeblate 1add7ea4cb Translated using Weblate (Russian)
Currently translated at 77.1% (6916 of 8962 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ru/
2025-11-15 06:14:04 +00:00
Felipe Bermudes OrmeñoandWeblate e497cd445a Translated using Weblate (Spanish (Mexico))
Currently translated at 26.7% (2394 of 8962 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/es_MX/
2025-11-15 06:14:02 +00:00
Nico MerenqandWeblate e382e89e06 Translated using Weblate (Russian)
Currently translated at 76.6% (6868 of 8962 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ru/
2025-11-14 17:21:23 +00:00
Gustavo PuerariandWeblate faf64a6092 Translated using Weblate (Portuguese (Brazil))
Currently translated at 98.2% (8804 of 8962 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/pt_BR/
2025-11-14 17:21:21 +00:00
geumuandWeblate aa8d0a9d48 Translated using Weblate (Korean)
Currently translated at 61.5% (5513 of 8962 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ko/
2025-11-14 10:22:59 +00:00
Zack the GhastandWeblate 7a8dbbb4ce Translated using Weblate (Portuguese (Portugal))
Currently translated at 67.6% (6059 of 8962 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/pt_PT/
2025-11-14 08:26:53 +00:00
Watuneni iteiteandWeblate b8e1abc80b Translated using Weblate (Japanese)
Currently translated at 94.6% (8484 of 8962 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ja/
2025-11-14 08:26:52 +00:00
YasitoandWeblate 12df9d29f5 Translated using Weblate (French)
Currently translated at 100.0% (8962 of 8962 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr/
2025-11-14 08:26:51 +00:00
YasitoandWeblate 2df0542631 Translated using Weblate (French (Canada))
Currently translated at 100.0% (8962 of 8962 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/fr_CA/
2025-11-14 08:26:50 +00:00
dhi_holoandWeblate e22b79a47c Translated using Weblate (English (en_PT))
Currently translated at 28.4% (2550 of 8962 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/en_PT/
2025-11-14 08:26:49 +00:00
Weblate 0c4bbef855 Update translation files
Updated by "Remove blank strings" add-on in Weblate.

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/
2025-11-13 13:42:34 +00:00
Nico MerenqandWeblate 6fb34b5ee3 Translated using Weblate (Russian)
Currently translated at 76.0% (6819 of 8962 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/ru/
2025-11-13 13:42:29 +00:00
dhi_holoandWeblate f345b19d57 Translated using Weblate (English (en_PT))
Currently translated at 26.7% (2399 of 8962 strings)

Translation: Cobblemon/Mod
Translate-URL: http://lang.cobblemon.com/projects/cobblemon/mod/en_PT/
2025-11-13 13:42:29 +00:00
716 changed files with 18313 additions and 13361 deletions
-26
View File
@@ -1,26 +0,0 @@
### Additions
- Rebuilt Pokémon AI to use Minecraft's Brain system, allowing for more complex behaviours and interactions.
- As an early pass of this, pastured Pokémon will now sleep when appropriate, and may come up to you when they see you.
- Probably also added a whole bunch of bugs.
- Dog Pokémon (Growlithe, Arcanine, etc.) intimidate Skeletons.
- Cat Pokémon (Meowth, Persian, etc.) intimidate Creepers and Phantoms.
- Sleep-related Pokémon (Munsharna, Komala, etc.) intimidate Phantoms.
- Some Pokémon naturally hunt each other.
- Some Pokémon herd together.
- Added a Behaviour Editor to the NPC editing screen.
- Added /behaviouredit command for opening the Behaviour Editor on Pokémon and NPCs.
- Editing variables for Pokémon is not yet supported.
### Developer
- baseScale in NPCs has been removed from classes and presets, and in the entity it is replaced with hitboxScale and renderScale.
- Added `EntityCallbacks` to `NPCEntity` and `PokemonEntity`. You can trigger custom callback types by using `[Entity].callbacks.process(...)`
### Fixes
- Fixed Pokémon with a moving walk target frequently spinning in place as they re-calculate their path.
### MoLang & Datapacks
- Added a `behaviours` datapack folder which motivates the Behaviour Editor screen on NPCs and Pokémon.
- Added "callback" support on PokemonEntity and NPCEntity that allows MoLang scripts to be executed in response to certain scenarios.
- Added very many behaviours to choose from.
- Removed many NPC presets that now exist as behaviours. This is a breaking change if you are using NPCs with these presets.
- NPCs with these presets should be modified to instead list under `"behaviours"` all the equivalent behaviours.
-35
View File
@@ -1,35 +0,0 @@
### Additions
- Added the Campfire Pot, made from apricorns and placed onto campfires.
- This pot can be used to make bait for fishing, Poké Cakes, Lure Cakes, local specialties, and potions (less efficiently than a brewing stand).
- There is a different pot for each apricorn colour because at this point I think we may have an addiction.
- Added Aprijuice, made from the Campfire Pot using apricorns with seasoning to give flavours.
- Aprijuice can be fed to ride-able Pokémon to improve their riding characteristics, depending on the flavour and the Pokémon's nature.
- Added Lure Cakes, made from the Campfire Pot using honey and berries.
- Lure Cakes can be used to modify the spawn rate of Pokémon in the wild.
- Added the Saccharine Tree, which can be found in the wild and is used to obtain Honey Bottles.
- The leaves of the tree can be harvested to obtain honey, which can be used in the Campfire Pot to make Lure Cakes.
- The Log of the tree can be interacted with using a honey bottle to create a Honey-Slathered Saccharine Log, which increases the change of spawning a Pokémon with a Hidden Ability.
- Added Hearty Grains
- Clicking on the Progress Arrow will show the JEI Recipe Book for the Campfire Pot, which will show all recipes that can be made with it.
- Added a Ton of Redstone Compatibility.
- Dispenser can now Honey and Unhoney:
- Saccharine Log
- Saccharine Leaves
- Redstone can Close and Open the Lid of a Cooking Pot
- Powered = Closed
- Unpowered = Open
- Hoppers can be used to insert items into a Cooking pot
- Top = Seasonals
- All Sides = Crafting
- Bottom = Extract the Result
- Observer will recognise when a Cooking pot is Closed or Opened
- Comparator Calculates a Signal Strength depending on the items inside the cooking pot
- Sculk Sensor
- Saccharine Leaves
- Opening and Closing the Cooking Pot
- Saccharine Log
### Datapack and Addon Changes
- Renamed the fishing_baits datapack folder to spawn_bait_effects.
- Added `seasonings` datapack folder for controlling usable items in the campfire pot and what colour and flavour they apply.
- Added campfire pot recipe type, which you could use to make anything work as fishing bait.
-13
View File
@@ -1,13 +0,0 @@
### Additions
- Added functionality for marks.
- Added data for all marks and ribbons from the mainline Pokémon games.
- Implemented fishing, personality, weather, and time related marks, that can rarely be granted to a wild-spawned Pokémon.
- Added marks screen within the summary UI.
- Added `/givemark <player> <partySlot> <mark>` command to give a mark to a Pokémon.
- Added `/takemark <player> <partySlot> <mark>` command to remove a mark from a Pokémon.
- Added `/giveallmarks <player> <partySlot>` command to give all available marks to a Pokémon.
### MoLang & Datapacks
- Added Flows for `bobber_spawn_pokemon_post`, `pokemon_entity_spawn`, and `fossil_revived`.
- Added `marks` datapack folder.
- Added MoLang functions `entity.is_in_rain`, `pokemon.add_marks(Mark...)`, `pokemon.add_potential_marks(Mark...)`, `pokemon.add_marks_with_chance(Mark...)`, `pokemon.apply_potential_marks`, and `world.is_snowing_at(x, y, z)`.
-38
View File
@@ -1,38 +0,0 @@
### Additions
- Added ability to rename PC Boxes by clicking on the name of a box.
- Added box options buttons for boxes, toggleable by clicking the right icon button in the bottom bar.
- The option buttons on the left side allow for sorting the box by name, level, Pokédex number, gender, and type. Shift clicking allows for sorting in reverse order.
- The button on the right allows for changing the box wallpaper.
- 10 additional color-based wallpapers have been added.
- 5 unlockable biome-based wallpapers have been added, which can be unlocked by visiting:
- Forest biome
- Ocean biome
- Cave Biome
- The End
- The Nether
- Added filter functionality in PC UI, which supports `PokemonProperties` (e.g. `shiny=yes` shows all shiny Pokémon).
- Names can be filtered by exact or partial matches, e.g. entering "cha" will show Charmander, Charmeleon, etc.
- Added `/changewallpaper <player> <boxNumber> <wallpaper>` command to change a box wallpaper through commands.
- Added `/renamebox <player> <boxNumber> <name>` command to rename a PC box through commands.
- Added IVs and EVs stat displays in PC.
- The displays can be cycled through by scrolling when the display is hovered over.
- Added ability to cycle through boxes by scrolling when the box is hovered over.
- PC will now open to last box viewed within a session.
### Changes
- Slots in pastures will now have darker backgrounds and italicised Pokémon names if the Pokémon is not owned by the player.
- The pasture slot will show the name of the Pokémon owner when hovered if the Pokémon is not owned.
- Increased the default PC box count from 30 to 40 to accommodate the fact that we have way more Pokémon now. If you've changed this config option then you'll need to edit it again after starting up with 1.7!
### Developer
- Added `RenamePCBoxEvent.Pre` and `RenamePCBoxEvent.Post` events to prevent players from renaming a box or changing their input.
- Added `ChangePCBoxWallpaperEvent.Pre` and `ChangePCBoxWallpaperEvent.Post` to prevent players from changing wallpapers or changing their selection.
- Added `WallpaperCollectionEvent` which gets called when clients connect to a server, allowing the server to handle which of the client-found wallpapers it's allowed to move (collected wallpapers can be removed for example to make it "vanish" client-side).
- Added `WallpaperUnlockedEvent`.
- Renamed `SetPCBoxPokemonPacket` and the respective handler to `SetPCBoxPacket`.
### Addons
- Added Flows for `player_tick_pre`, `player_tick_post`, `advancement_earned`, `right_clicked_entity`, `right_clicked_block`, `player_died`, `wallpaper_unlocked`.
- Flows now have `q.` for any context properties in addition to the `c.` properties, making it a bit more convenient when calling other scripts from Flows.
- Added `unlockable_pc_box_wallpapers` datapack folder for wallpapers that need to be unlocked before they're usable.
- Wallpapers are loaded from `assets/<namespace>/textures/gui/pc/wallpaper/` and all wallpapers in this folder are available to the client to choose by default.
-4
View File
@@ -1,4 +0,0 @@
### Additions
- Added the ability to ride Pokémon by shift-right clicking and selecting the ride option.
- Added /calculateseatpositions command for approximating hitbox locations for riding configurations.
-10
View File
@@ -1,10 +0,0 @@
### Additions
- Added support for NPCs to use Pokémon models and vice versa. This will require changes in addons that add fossil types due to naming conflicts between fossils and the Pokémon species.
- Added `/changejointscale` command to change the scale of a joint in a model. Unbelievably funny.
### Developer
- Removed all VaryingModelRepository subclasses into the parent class.
### Addons
- Added `transformedParts` to the root of poser JSONs so it now exists in both poses and the model overall.
-25
View File
@@ -1,25 +0,0 @@
### Additions
- Pokémon can now spawn in herds, either as distinct herd groupings or simply several Pokémon spawning at once.
### Fixes
- Fixed the "enabled" property in spawn files not actually being respected. Where do they find these devs?
- Fixed Terralith's shrubland not counting as plains for spawning purposes the way it was intended to.
### Developer
- Spawning Influences now have the context of what the other buckets are when adjusting bucket weights. This will break existing influences that do bucket weight adjustment.
- Renamed heaps of things in the spawning system to make more sense.
- SpawningContext is now SpawnablePosition
- WorldSlice is SpawningZone
- SpawningProspector is now SpawningZoneGenerator
- Majorly refactored the hierarchy of Spawner
- The base Spawner interface provides more functions to allow single-point and area spawning given appropriate inputs.
- TickingSpawner is removed in favour of outside code handling ticking logic.
- AreaSpawner is removed.
- BasicSpawner is the first implementation of Spawner which can be used for any purpose.
- PlayerSpawners are now mixin'd into ServerPlayer and ticked from ServerPlayer#tick.
- A hierarchy diagram can be found at `./docs/spawner-hierarchy.png` in the mod repository.
- The SpawnerManager class has been removed as its functionality is all now handled elsewhere.
- Renamed things in Spawn Rules to go with the other renames:
- contextSelector is now spawnablePositionSelector
- context is now spawnable_position
+394 -2429
View File
File diff suppressed because it is too large Load Diff
+2
View File
@@ -0,0 +1,2 @@
## [1.0.0 (November 12th, 2022)](#1-0-0)
- Initial release.
+56
View File
@@ -0,0 +1,56 @@
## [1.1.0 - The Swim and Sleep Update (November 27th, 2022)](#1-1-0)
#### "Ideally not at the same time."
### Additions
- Added a new GUI for viewing party information, rearranging moves, and evolving Pokémon. It looks too good.
- Starter Pokémon will sleep on top of you if sent out when you get on a bed.
- Added sleeping animations for starters, the Weedle family, and the Caterpie family. More to come.
- Added Alolan Rattata and Alolan Raticate, Sableye, Deerling and Sawsbuck, and Pyukumukurutudulu or whatever it's called.
- Added swimming AI so Pokémon don't sink to the bottom in water.
- Aquatic Pokémon like Magikarp desperately move to water if they're on land.
- Added status condition indicators in the party overlay.
- Added HP labels to the battle interface so that you can see how much health you actually have.
- Added spawn data for all final and special evolutions previously lacking spawn data.
- Added shiny textures for many Pokémon (thank you MageFX!): Aerodactyl, Articuno, Zapdos, Moltres, Chansey, the Dratini family, Electabuzz, Goldeen and Seaking, Hitmonchan and Hitmonlee, Jynx, Kabuto and Kabutops, Magmar, Lickitung, Mr. Mime, Omanyte and Omastar, Rhyhorn and Rhydon, Koffing and Weezing, Porygon, Scyther, Seadra, Staryu and Starmie, and Tangela. Phew!
- Added a couple of new advancements.
- Added new items: Calcium, Carbos, HP Up, Iron, Protein, and Zinc. Currently only obtainable in Creative Mode (It's a surprise tool that will help us later).
### Changes
- Significantly improved AI pathing for larger entities so they won't keep trying to move to places they cannot possibly fit.
- Changed the starter menu and summary menu keybinds to `M` by default.
- Pokémon that are sent out slowly raise friendship. Before this it was faster and even worked when not sent out (wildly unbalanced).
- Updated Link Cable and Protector item sprites to be prettier.
- Slightly polished the Poké Ball opening and Poké Ball item use sounds.
- `/givepokemon random`, `/spawnpokemon random`, and `/spawnallpokemon` will now only choose implemented Pokémon.
- The battle message box now displays even when the battle GUI is minimised so that you can still see what's going on.
- Moved the `R` prompt in battle to be higher on the screen so that it's not as distracting.
### Fixes
- Fixed shinies and form variations not displaying in the party or PC.
- Fixed servers getting stuck on shutdown due to non-closed showdown server connections.
- Fixed a niche situation where players could challenge themselves. It's a little inspirational if you think about it.
- Fixed Pokémon natures not saving such that every time you restarted they had a totally different nature.
- Fixed some underground Pokémon spawning above ground instead. I'm told other weird spawns were probably fixed at the same time.
- Fixed Pokémon sometimes running in place. "It's still possible, but much less likely" - Yeah, ok devs.
- Fixed mod incompatibility with many Architectury API mods, including *Biome Makeover* and *Earth2Java*.
- Fixed a mod incompatibility with Minecraft Transit Railway Fabric and probably a bunch of other Fabric mods.
- Fixed being unable to customize keybinds on Forge.
- Fixed Summary keybinding being labeled as PokéNav. That comes later.
- Fixed apricorns spawning without leaves which meant sometimes apricorns were growing on the side of dirt and stone which doesn't make much sense to me.
- Fixed messages appearing in the console whenever a healer is used.
- Fixed spawning in several biome tag categories.
- Fixed resource pack support for Pokémon models and textures.
- **Model Fixes**
- Fixed Paras and Nidoqueen looking very weird.
- Fixed Hitmonchan asserting dominance with a T-pose as well as Grimer and Muk pointing their hands to the sky.
- Fixed specific Pokémon suddenly pausing their animation after staying still for a long time.
- Fixed Mankey's feet being buried in the ground.
- Updated the Substitute model and updated its shiny texture to be better for the red-green colorblind.
- Improved Horsea, Seadra, and Kingdra animations, especially on land.
- **Battle Fixes**
- Fixed an issue with battles where Pokémon had a different max HP causing some desync issues with the health bars.
- Fixed Magnitude battle messages.
- Moves that are disabled or out of PP now show transparently in the battle GUI instead of being hidden completely.
- Statuses like sleep and frozen no longer last forever if it was carried over from a previous battle.
### Localization
- Added species, ability, and move translations for `ko_ko`, `jp_jp`, `fr_fr`, `es_es`, `it_it`, and `zh_cn`.
+3
View File
@@ -0,0 +1,3 @@
## [1.1.1 (November 27th, 2022)](#1-1-1)
### Fixes
- Fixed a critical issue with servers where Pokémon data didn't properly synchronize and so you couldn't see any.
+52
View File
@@ -0,0 +1,52 @@
## [1.2.0 - The Customization Update (January 1st, 2023)](#1-2-0)
#### "There are going to be so many fakemon..."
### Additions
- Added models for Natu and Xatu, Murkrow and Honchkrow, Wailmer and Wailord.
- Added new PC interface and it is beautiful.
- Reworked the battle system so that battles load faster, cause fewer bugs, and can run on shared server hosts. This is a very big change that also reduced the size of the mod by 50mb!
- Added full resource pack and data pack customization of models, textures, animations, spawning, and spawn file presets to make custom Pokémon species and variations very easy to create. You can find the guide for creating custom Pokémon on [our website](https://cobblemon.com/guides/custompokemon.html)!
- Added water surface spawning for Pokémon like Lapras.
- Added emissive texture support to Pokémon render layers.
- Added compatibility for Mod Menu ([CurseForge](https://www.curseforge.com/minecraft/mc-mods/modmenu), [Modrinth](https://modrinth.com/mod/modmenu)).
- Added blank ambient Pokémon cries so cries can be added via resource packs.
- Added new sounds for GUIs and item uses.
- Added `nature` and `pokeball` options to commands such as `/spawnpokemon` and `/givepokemon`.
### Changes
- Reinforced party and PC saving to make data corruption from crashes less bad.
- Added a config option for whether the starter config will be exported, making it more maintainable as we add starter Pokémon.
- Battles now start with the options menu open for convenience.
- Doubled the default charge rate of healers. You'd need to reset your config under `./config/cobblemon/main.json` to see this change!
- Changed the default Apricorn seed chance config value from 6% to 10%.
- The mod now correctly reports our dependency on Architectury API so people don't get super confused when things don't work.
- Pokémon now look at their opponents during battle.
- Updated Sableye's animations to be super freaky.
- Changed the healer advancements to make the healing machine's mechanics more obvious.
### Fixes
- Fixed an incompatibility with [Porting Lib](https://github.com/Fabricators-of-Create/Porting-Lib) used by Fabric ports of mods such as Create or Twilight Forest.
- Fixed HP and max HP values in the battle GUI not being correct.
- Fixed some animations on snake-type Pokémon being super slow.
- Fixed a typo in the English name for Calcium. Calcuim.
- Fixed Pokémon gradually becoming rarer around you if you move long distances.
- Fixed a shoulder mount crash on Fabric.
- Fixed a rare issue where chunks would take a really long time to generate.
- Fixed a singleplayer bug where battles wouldn't work after leaving then rejoining a world.
- Fixed stat calculations for everything except HP. HP was fine though :).
- Fixed a randomized Pokémon spawning in mountains that corrupted the data of whatever party or PC it got into. Yikes.
- Fixed a rare crash involving literally random number generation. A random crash involving random numbers.
- Fixed all regular Mewtwo having the stats and types of Mega Mewtwo X - same deal with many other Pokémon.
- Fixed the framing of many Pokémon in GUIs.
- Fixed texture glitches with Rattata and Nidoqueen (again!).
- Fixed dropped item forms of all Pokéballs and the Healing Machine, and slightly adjusted all other display settings
- Fixed issues with forms not showing the correct evolution in the evolution menu.
- Fixed some alternate forms not having the alternate stats and types.
- Fixed moves that only work in double battles not being selectable at all (such as Helping Hand and Aromatic Mist).
- Fixed abilities not remaining legal in some forms.
- Fixed Poké Ball capture effects not triggering after a successful capture, such as the Heal Ball's healing effect.
- Fixed multiple-hit moves sending gibberish into the battle chat.
- Fixed Pyukumuku not being appropriately scaled.
- Fixed shiny and other variations of Pokémon not showing in the battle GUI.
- Fixed Eevee being poorly positioned and un-animated on shoulders.
- Fixed a Pokémon's hitbox not updating when it evolves while sent out.
- Fixed a Pokémon's PP going from zero to above the maximum when entering another battle.
+150
View File
@@ -0,0 +1,150 @@
## [1.3.0 - The Foundation Update (March 17th, 2023)](#1-3-0)
#### "Now we can start doing the really cool stuff."
### Dependencies
- Upgraded Fabric API dependence to 0.75.1+1.19.2
- Upgraded Architectury API dependence to 6.5.69
- Cobblemon Forge now depends on Kotlin for Forge.
### Additions
- Added new models and animations for Poké Balls and reworked their mechanics to feel much smoother instead of being pure frustration.
- Added party scrolling via holding R and using the mouse wheel so you don't need to take your hand off your mouse.
- Added a cap of Pokémon spawns in an area because waiting a while made things insane. This is controlled by a new `pokemonPerChunk` config option.
- Added models and animations for heaps of Pokémon (101): Riolu, Lucario, Chimchar, Monferno, Infernape, Turtwig, Grotle, Torterra, Popplio, Brionne, Primarina, Treeko, Grovyle, Sceptile, Snivy, Servine, Serperior, Tepig, Pignite, Emboar, Oshawott, Dewott, Samurott, Grookey, Thwackey, Rillaboom, Scorbunny, Raboot, Cinderace, Sobble, Drizzile, Inteleon, Fennekin, Braixen, Delphox, Froakie, Frogadier, Greninja, Chespin, Quilladin, Chesnaught, Miltank, Torkoal, Kricketot, Kricketune, Heatmor, Durant, Wooloo, Dubwool, Pumpkaboo, Gourgeist, Sigilyph, Cryogonal, Whismur, Loudred, Exploud, Misdreavus, Mismagius, Tatsugiri, Eiscue, Luvdisc, Stantler, Wyrdeer, Gible, Gabite, Garchomp, Sneasel, Weavile, Elgyem, Beheeyem, Baltoy, Claydol, Nacli, Naclstack, Alcremie, Milcery, Dhelmise, Morelull, Shiinotic, Xerneas, Klink, Klang, Klinklang, Joltik, Galvantula, Honedge, Duoblade, Aegislash, Spiritomb, Mawile, Carvanha, Sharpedo, Seedot, Nuzleaf, Shiftry, Lotad, Lombre, Ludicolo, Pineco, Forretress, and Spinda.
- Added generation 3, 4, 5, 6, 7, and 8 Starter Pokémon to the starter select screen.
- Added particle effect support for model animations
- Added particle effect and animation for Gastly.
- Added sleep and faint animations to many Pokémon.
- Added item holding for Pokémon. Any Minecraft item can be given to a Pokémon by holding shift and right-clicking them. Traditional Pokémon held items will have their expected battle effects.
- Added heaps of held items with crafting recipes: Assault Vest, Big Root, Black Belt, Black Sludge, Charcoal, Choice Band, Choice Scarf, Choice Specs, Dragon Fang, Exp. Share, Focus Band, Hard Stone, Heavy-Duty Boots, Leftovers, Light Clay, Lucky Egg, Magnet, Miracle Seed, Muscle Band, Mystic Water, Never-Melt Ice, Poison Barb, Quick Claw, Rocky Helmet, Safety Goggles, Sharp Beak, Silk Scarf, Silver Powder, Soft Sand, Spell Tag, Twisted Spoon, and Wise Glasses.
- Added heaps of evolution items with crafting recipes: Milcery's sweets items, Chipped Pot, Cracked Pot, Deep Sea Scale, Deep Sea Tooth, Dragon Scale, Galarica Cuff, Galarica Wreath, Peat Block, Prism Scale, Razor Claw, Razor Fang, Reaper Cloth, Sachet, Sweet Apple, Tart Apple, and Whipped Dream.
- Existing evolution items all now either have a crafting recipe or drop from Pokémon.
- Added the Item [tags](https://minecraft.fandom.com/wiki/Tag) `cobblemon:held/experience_share` and `cobblemon:held/lucky_egg` allowing you to mark any items you desire to have the effects implied in the tag name.
- Added an interface that appears when interacting with your Pokémon while sneaking. The interface allows for interactive options such as shouldering and exchanging held items.
- Added blinking animations to many Pokémon.
- Added animated texture support.
- Added translucent option for aspect layers.
- Added glowing textures to many Pokémon and it looks amazing.
- Added the Saturation shoulder effect.
- Added the Haste shoulder effect, initially for Joltik.
- Added the Water Breathing shoulder effect, initially for Wooper.
- Added the Speed shoulder effect, initially for Pichu and Pikachu.
- [Dispensers](https://minecraft.fandom.com/wiki/Dispenser) can now use shears to automatically harvest fully grown Apricorns.
- Added milking to Miltank.
- Added shearing to Wooloo and Dubwool.
- Added data for generation 9 Pokémon species, moves, and ability data. They're all still Substitute models, but their moves and abilities work.
- Added support for custom Pokémon to implement 'quirks' such as blinks.
- Added sound effect for harvesting Apricorns.
- Added icon to summary and PC interfaces to indicated if a Pokémon is shiny.
- Added the `/spawnpokemonat <pos> <properties>` command, the `pos` argument uses the same syntax as the Minecraft [summon](https://minecraft.fandom.com/wiki/Commands/summon) command.
- Added the `/giveallpokemon` command which is definitely safe and not insane.
- Added compatibility with Carry On by preventing the mod being able to interact with Cobblemon entities, the mod caused too many gameplay detrimental features to stay enabled.
- Added healing to your party when you sleep in a bed.
- Added the 'ability' Pokémon Property so commands can specify the ability.
- Added block tag support to the 'neededBaseBlocks' and 'neededNearbyBlocks' spawn condition.
- Added a config option for disallowing players from damaging Pokémon by hand.
- Apricorn seeds can now be used with the [Composter](https://minecraft.fandom.com/wiki/Composter), these have the layer increase chance of 65% like Apricorns and various Minecraft crops.
- Added support for Pokémon species data appending making it so datapack developers no longer need to overwrite files.
- Added an implementation of every [catch rate](https://bulbapedia.bulbagarden.net/wiki/Catch_rate) from generation 1 to 9, these can be used by changing the `captureCalculator` config value:
- `generation_1` Sets the calculator to the generation 1 implementation.
- `generation_2` Sets the calculator to the generation 2 implementation.
- `generation_2_fixed` Sets the calculator to the generation 2 implementation with the status multiplier bug fixed.
- `generation_3_4` Sets the calculator to the generation 3 and 4 implementation.
- `generation_5` Sets the calculator to the generation 5 implementation.
- `generation_6` Sets the calculator to the generation 6 implementation.
- `generation_7` Sets the calculator to the generation 7 implementation.
- `generation_8` Sets the calculator to the generation 8 implementation.
- `generation_9` Sets the calculator to the generation 9 implementation.
- `cobblemon` Sets the calculator to the custom Cobblemon implementation. This is the default value.
- `debug` Sets the calculator to the debug/cheat implementation, every attempt will be a successful critical capture.
### Changes
- Pokémon now save to the world by default, meaning the same Pokémon will remain in the world and not disappear after you log out and log back in. They still despawn over time though.
- Significantly sped up the Poké Ball shake animation so it takes less time to try to catch Pokémon.
- Update the PC and Healing Machine models and bounding boxes.
- The Healing Machine and PC now emit light when fully charged or when turned on respectively.
- The PC block screen will now turn on when being used.
- The Healing Machine will now visually display its charge level using 6 stages.
- The Healing Machine will now emit a redstone signal with the strength of 1 for every 10% charge it has when attached to a [Redstone Comparator](https://minecraft.fandom.com/wiki/Redstone_Comparator).
- Made it so that particles are not shown whenever you have a shoulder Pokémon that gives potion effects.
- Changed hitbox and size definitions for Decidueye, Blastoise, and Magmortar
- Apricorns can now be harvested with Axes, the speed will scale with enchantments and tool material, only dropping the Apricorn if fully grown, these will still destroy the Apricorn so the manual harvest still is recommended unless you're just keen on destroying trees.
- Apricorns are now a part of the vanilla tag `minecraft:blocks/mineable/axe`.
- Apricorns are now compatible with any mod that breaks a whole tree at once.
- Apricorns no longer have a config value for the seed drop chance these are now a part of their loot table which can be found in `cobblemon/loot_tables/blocks/<color>_apricorn.json`.
- Advancements were redone to be slightly more interesting, with improved names, descriptions, and sorting.
- Updated models and textures for Tentacool line, Gengar, Slowpoke line, Tyrogue line, Doduo line, Dratini, Dragonair, Quagsire, and Piplup line. There were probably others, the team lost track.
- Improved sending out Pokémon at the start of battle so that they are positioned in a less annoying way.
- Name Tags will no longer be used on Pokémon and Poke Ball entities, this prevents the item from being wasted.
- Lowered spawn rate of Tauros.
- Sableye now spawns near gem ores as well as amethyst.
- Added evolution stones and items to item tags
- Pokémon now play their cry animations when clicked on the starter selection screen.
### Fixes
- Fixed catch rates being entirely too difficult.
- Fixed various strange battle issues such as Flying types being vulnerable to Ground type moves and status effects hitting despite vulnerabilities.
- Fixed shiny Gyarados not using the red Gyarados texture.
- Improved the framing of all in-game Pokémon in the party and PC GUIs so they aren't halfway out of the screen or something else crazy.
- Fixed incompatibility with Kotlin for Forge (by depending on Kotlin for Forge ourselves)
- Fixed Gengar, Goodra, and many other Pokémon showing the types of an alternate form despite those not being modelled yet.
- Fixed datapack Pokémon not being able to battle.
- Fixed Pokémon always being created with a moveset as if they're level 1 instead of their current level.
- Fixed an issue of Pokémon not rendering in GUIs on some Mac displays.
- Fixed a soft-duplicate that could occur when a party Pokémon is pushed through a Nether Portal or left in a boat.
- Fixed Pokémon that faint from poison appearing to be on full health and suckering you into false hope.
- Fixed incorrect spawns of Tentacool, Tentacruel, Dragonite, Politoed, Tangrowth, Lickilicky, Electivire, and Magmortar.
- Fixed crashes involving opening the Pokémon summary GUI with an empty party.
- Fixed lower brightness settings causing Pokémon to appear much too dark in menus such as the party and PC.
- Fixed Showdown sometimes failing to start, causing crashes.
- Fixed Showdown initialization happening several times when you login, more depending on how many times you have relogged this session.
- Fixed Showdown failing to update on first attempt. We totally weren't accidentally deleting our target directory or anything, nope.
- Fixed HP recovery related battle actions not animating for the client nor updating the in-game Pokémon HP.
- Fixed moves that force a switch such as Teleport and U-Turn soft locking battles.
- Fixed missing battle text for Bide, Speed Boost, Belly Drum, Anger Point, and Haze.
- Fixed battle messages for many field effects starting, ending, and actions caused by them such as blocking certain moves.
- Improved battle messages for effects that prevent a move from being executed such as a Taunt, requiring a recharge, flinched, etc.
- Fixed move names not being translated in battle messages.
- Fixed stat change messages for boosts over 3 stages.
- Fixed experience calculation not being completely accurate.
- Fixed positioning of Poké Balls when rendered in Healing Machines.
- Fixed a desync issue on servers where all Pokémon seemed like they were special forms when they weren't.
- Fixed an incompatibility with [Exordium](https://www.curseforge.com/minecraft/mc-mods/exordium).
- Fixed datapack Pokémon language key generation. A Pokémon under the namespace `example` named `Pogemon` will now correctly look for the lang key `example.species.pogemon.name`.
- Fixed client not receiving messages for the different "stages" for the move Bide.
- Fixed the Medium Slow and Medium Fast experience group IDs, they're now `medium_slow` and `medium_fast`. Any custom datapack Pokémon will require an update.
- Fixed Pokémon friendship being capped to the maximum level config value instead of the friendship one when loading Pokémon data.
- Fixed Poké Balls taking forever to capture Pokémon if you are underwater or up in the air where it takes a long time to hit the ground.
- Fixed Pokémon being unable to spawn on blocks such as snow layers.
- Fixed Pokémon spawning inside of trees.
- Fixed Pokémon experience not loading after a restart and instead going back to the minimal amount for the current level.
- Fixed being able to use `/healpokemon` in battle.
- Fixed being able to select fainted party members in the switch menu causing the battle to lock.
- Fixed `/spawnpokemon` command not supporting any command source other than players.
- Fixed issues with Charizard's sleep pose.
- Fixed players being able to use multiple healer machines at once.
- Fixed Pokémon layers not rendering when a Pokémon is on your shoulder.
- Fixed Caterpie and Weedle not moving or looking at players. That was meant to be Metapod and Kakuna; how embarrassing.
- Fixed Pokémon not carrying over the correct equivalent original ability when evolving from stages that only had one ability.
- Fixed Deerling and Sawsbuck not spawning with the correct season.
- Fixed issue of not being able to drag the scroll bar in summary and battle interfaces.
- Fixed optional aspects not saving and loading properly.
- Fixed layering logic so multiple texture layers can exist on a Pokémon (probably).
- Fixed not all Poké Balls being associated with the `cobblemon:pokeballs` item tag.
- Fixed the `/pokemoneditother` command not working.
- Fixed ambient sound file path for Porygon2.
- Fixed forms not being able to unset the secondary type of a Pokémon in the stat JSON.
- Fixed moves that haven't carried over from generation 8 onwards having the description they did in the generation 8 games instead of their last valid one.
- Fixed shoulder mounted pokemon not returning to party on healer use and on evolution
### Developer
- Reworked CatchRateModifier, as such, existing implementations need to be updated.
- Fixed minimumDistanceBetweenEntities option being half of what it's set as.
- Fixed the contents of CobblemonEvents, CobblemonBlocks etc having getters instead of just being public static properties.
- Added ApricornHarvestEvent.
- Added a new item for representing Pokémon within native UI menus or item frames which display as the Pokémon's model. It's called a PokemonItem, with static functions to build one.
### Localization
- Added complete translations for French, German, Simplified Mandarin, Brazilian Portuguese, and Pirate English.
- Added partial translations for Traditional Mandarin, Italian, and Spanish. We'd love more help with this!
- Thank you to all of the fantastic volunteer translators for taking the time to help with this!
+96
View File
@@ -0,0 +1,96 @@
## [1.3.1 (March 31st, 2023)](#1-3-1)
### Additions
- Added Slugma, Magcargo, Nosepass, and Probopass.
- Elgyem family now drops Chorus Fruit, Geodude family now drops Black Augurite.
- Added missing spawn files for Golett and Bergmite family.
- Apricorns can now be smelted into dyes.
- Added animations to Staryu line and Porygon line.
- Added faint animations to Klink line.
- Add lava surface spawn preset.
- Added an `any` evolution requirement allowing you to define `possibilities` of other evolution requirements, for example, this allows you to create an evolution that requires the Pokémon to be shiny or a female.
- Added the `/spawnpokemonfrompool [amount]` or `/forcespawn [amount]` command to spawn Pokémon(s) in the surrounding area using the natural spawn rates/pool of that area, this will be a cheat command in the Minecraft permission system or use the permission `cobblemon.command.spawnpokemon` if a permission mod is present. On a successful execution of the command, the amount of Pokémon spawned will be the output.
- Added the `/pokebox` and `/pokeboxall` commands to move Pokémon(s) to the PC from a Player's party, this will be a cheat command in the Minecraft permission system or use the permission `cobblemon.command.pokebox` if a permission mod is present. On a successful execution of the command the output will be the number of pokemon moved to the Player's PC.
- Added the `/pc` command which opens up the PC UI the same way interacting with the block would, this will be a cheat command in the Minecraft permission system or use the permission `cobblemon.command.pc` if a permission mod is present.
### Changes
- You can now click the portraits of other Pokémon in the starter selection screen to navigate directly to them.
- You can now click the right and left arrow keys to navigate PC boxes.
- Link Cables will now require Pokémon to hold any held item normally required for their evolution.
- After a battle, the last Pokémon used now becomes the selected one in your party.
- The `/teach` command can now only allow the Pokémon to be given moves in their learnset, this can be controlled with the permission `cobblemon.command.teach.bypass`, to account for that change the base command now requires the permission `cobblemon.command.teach.base`, this change is meant only for people using a mod capable of providing permissions such as [LuckPerms](https://luckperms.net/).
- Apricorns will no longer collide with their block form when picked, this should improve the experience in automatic farms.
- Increased spawn chances for many Pokémon requiring specific blocks to be nearby.
- Put Cryogonal in more snowy biomes.
- Ditto as well as the Eevee, Gible, and Riolu families have been made more common.
- Lowered spawn rate of Gyarados on the surface of water.
- Apricorn leaves can now be used in the [Composter](https://minecraft.fandom.com/wiki/Composter) block, these have the same chance to raise the compost pile the Minecraft leaves do.
- Updated Gengar's model and texture.
- Updated Swinub line model and animations.
- Tweaked portrait frames for the Pidgey line and for Walking Wake.
- Changed all buff shoulder effects to only give a level 1 buff instead of level 2.
- Made Weavile a little bigger.
- Changed the recipes for Mystic Water, Miracle Seed, and Charcoal Stick to utilise the evolution stones, as well as Never-Melt Ice having an alternate recipe using the Ice Stone.
- Replaced the `Failed to handle` battle messages to `Missing interpretation` to make it more clear that mechanics do work just still pending dedicated messages.
- Healing Machine and PC are now mine-able with pickaxes and Apricorn leaves are mine-able using hoes.
### Fixes
- Fixed killing a Dodrio killing your game. Dodrio will never look the same to us.
- Fixed non-Fire-type Pokémon being immune to lava.
- Fixed custom Pokémon not being usable in battle, properly. A last minute fix caused this to break again; what are these devs not paid for?
- Fixed being locked in an endless healing queue if you broke the healing machine during use.
- Fixed an issue with the experience calculation when the Exp. Share is held.
- Fixed Friendship-based attacks not using friendship values from your Pokémon.
- Fixed Link Cables consuming held items they shouldn't due to not validating the held item of a Pokémon.
- Fixed a crash when Aromatherapy cured the status of party members.
- Fixed moves learnt on evolution not being given when said evolution happens. If you were affected by this issue your existing Pokémon will now be able to relearn those moves.
- Fixed console spam when rendering Pokémon model items.
- Fixed battle messages for 50+ moves and abilities and items.
- Fixed the possible duplicate when capturing Pokémon (probably, this one's hard to reproduce to confirm it's fixed).
- Previously duplicated Pokémon are cleaned from PCs and parties on restart.
- Fixed an issue with some particle effects applying after a Pokémon has died or on top of the wrong Pokémon when using specific mods.
- Fixed Pokémon not looking at each other in battle.
- Fixed Experience Candy and Experience Share attempting to bring Pokémon above level cap causing crashes.
- Fixed level 100 Pokémon having experience go over the cap total amount they should have.
- Fixed `/pokemonspawnat` having the argument positions reverted making it impossible for Brigadier to understand when to suggest coordinates. It is now the intended `/spawnpokemonat <pos> <properties>`.
- Fixed performance issues with shouldered Pokémon in certain systems.
- Fixed learnset issues for Pokémon whose only modern debut was LGPE/BDSP/LA.
- Fixed shiny Zubat, Grimer, Omanyte, Elgyem, Delphox and Aegislash displaying their normal texture.
- Fixed sleeping in beds allowing fainted Pokémon to receive experience after a battle ends somehow.
- Fixed an issue where a Pokémon will claim to have learnt a new move they already have in their moveset when learnt at an earlier level in their previous evolution. I realize that's confusing.
- Fixed Dispensers not being able to shear Wooloo. This will also extend to other mods that check if an entity is valid to shear.
- Fixed the currently held item of your Pokémon not dropping to the ground when removing it if your inventory was full.
- Fixed creative mode allowing you to make your Pokémon hold more than 1 of the same item.
- Fixed a Pokémon duplication glitch when teleporting between worlds.
- Fixed dedicated servers being able to reload Cobblemon data with the vanilla `/reload` command causing unintended behavior for clients.
- Fixed underground Pokémon spawning above ground.
- Fixed Pokémon portrait not reverting back to the Pokémon after a failed capture during battle.
- Fixed edge texture artifacts on pane elements for Tentacool and Tentacruel models.
- Fixed crash caused by Pokémon pathing
- Fixed Pokémon not returning to their balls when being healed in a healing machine
- Fixed all Gen IX Pokémon as well as forms added in PLA and Wyrdeer, Kleavor, Ursaluna, Basculegion, Sneasler, Overqwil, and Enamorus having 0 exp yields.
- Fixed Irons Leaves having bluetooth back legs. If you saw it, you know what I mean.
- Fixed Golurk not having shoulder plates on its shoulders.
- Fixed some water Pokémon walking onto land from the water even though they are fish.
- Fixed Porygon2 and PorygonZ being too small.
- Fixed Snivy line head look animation.
- Fixed Staryu line not being able to swim.
- Fixed an incompatibility with [Thorium](https://modrinth.com/mod/thorium) patch for [MC-84873](https://bugs.mojang.com/browse/MC-84873).
- Fixed Pidgeotto wings when walking.
- Fixed Delphox walk animation.
- Fixed Froakie line sleep animations in battle.
- Fixed Pokémon missing the non-level up moves they could relearn when rejoining a world until a new move was added to their relearn list.
- Fixed instantly fleeing from Pokémon set to be unfleeable.
- Fixed Pumpkaboo line forms not working. (Currently sizes aren't visual but check base stats to see which size you have.)
- Fixed a bug that caused already interpreted messages for moves to be mistaken as uninterpreted.
- Fixed a Pokémon spawner bug that caused Pokémon to not spawn due to dropped item entities.
- Fixed a bug that causes Pokémon model items to be invisible.
### Developer
- Add events that are fired just before and after a Pokémon is released (ReleasePokemonEvent.Pre and .Post)
### Localization
- Added complete translations for Japanese, Thai, and Canadian French.
- Added partial translations for Russian, Ukrainian, Mexican Spanish, and Korean.
- Updated every existing language's translation.
- All the translators that contributed are amazing.
+443
View File
@@ -0,0 +1,443 @@
## [1.4.0 - The Friends and Farms Update (October 13th, 2023)](#1-4-0)
#### "No, we don't provide the friends."
### Additions
- Added pasture blocks, used to let your PC Pokémon roam around an area.
- Added nicknaming from the summary menu of a Pokémon (click their name).
- Added trading between players. Press R while looking at another player and you'll figure the rest out.
- Added mints for changing Pokémon stats. These are most commonly found at high altitudes.
- Added [Revival Herbs](https://wiki.cobblemon.com/index.php/Revival_Herb), with pep-up flowers when fully grown, growing in lush caves.
- Added [Medicinal Leeks](https://wiki.cobblemon.com/index.php/Medicinal_Leek), growing on the surface of rivers and ponds. It is a potion ingredient and can be cooked as food!.
- Added [Big Roots](https://wiki.cobblemon.com/index.php/Big_Root), generating from cave ceiling dirt which sometimes spread as energy roots.
- Added [69 Berry Trees](https://wiki.cobblemon.com/index.php/Berry_Tree) and [Berries](https://wiki.cobblemon.com/index.php/Berry). Some are found in village farms, some from planting different berries close to each other.
- Added mulches: Mulch Base, Growth Mulch, Surprise Mulch, Coarse Mulch, Humid Mulch, Rich Mulch, Loamy Mulch, Peat Mulch, and Sandy Mulch
- Added [Vivichokes](https://wiki.cobblemon.com/index.php/Vivichoke), obtainable from wandering villager trades and some loot chests.
- Added medicine brewing using medicinal leeks and berries in brewing stands.
- Added Pokémon cries when in battles and being sent out.
- Added medicinal items: Berry Juice, Heal Powder, Remedy, Fine Remedy, Superb Remedy, Revive, Max Revive, Potion, Super Potion, Hyper Potion, Max Potion, Full Restore, Full Heal, Antidote, Awakening, Burn Heal, Ice Heal, and Paralyze Heal.
- Added battle items: X Attack, X Defence, X Sp.Atk, X Sp.Def, X Speed, Dire Hit, and Guard Spec.
- Added EV items: Power Anklet, Power Band, Power Belt, Power Bracelet, Power Lens, Power Weight.
- Added food items: Roasted Leek, Leek and Potato Stew, Braised Vivichoke, and Vivichoke Dip
- Added evolution items: Auspicious Armor and Malicious Armor, which can be used to evolve Charcadet into Armarouge or Ceruledge respectively.
- Added (mostly brewing) recipes for HP Up, Protein, Iron, Calcium, Zinc, Carbos, PP Up, PP Max, and Medicinal Leek to Magenta Dye.
- Added held items: Bright Powder, Destiny Knot
- Added AI for Nosepass to point towards world spawn when idle. We just think it's neat.
- Added shoulder mounting for Mimikyu.
- Added flying placeholder animations to Pidgey, Pidgeotto, Pidgeot, Golbat, Crobat, Scyther, Scizor, Zapdos, Moltres, Articuno, Dragonite, Rowlet, Dartrix, and Decidueye.
- Added loot to various vanilla chest loot tables (Link Cable in Ancient Cities, Woodland Mansions, End Cities, and Igloos, Vivichoke Seeds in Jungle Temples, Dungeons, and Plains, Savanna, Snowy, and Taiga Villages, and all 7 Apricorn Sprouts in Desert, Plains, Savanna, Snowy, and Taiga Villages, as well as the Bonus Chest, which can also have 5 of the basic Poké Ball types)
- Added a `doShinyStarters` gamerule to make it quick and easy to be offered shiny starters.
- Added a `doPokemonLoot` gamerule to toggle Pokémon dropping items/exp on death.
- Added ability activation announcement when in battle.
- Added animations for Wailord and made it BIGGER.
- Added Cherry Torterra variant.
- Added 2 new face spots for Spinda. The number of unique Spindas increases...
- Added Forretress Shulker variant.
- Added the `/teststore <player> <store> <properties>` command allowing command block/mcfunction users to query a party, PC or both for Pokémon matching specific properties and returning the match count, this will be a cheat command in the Minecraft permission system or use the permission `cobblemon.command.teststore` if a permission mod is present.
- Added the `/querylearnset <player> <slot> <move>` command allowing command block/mcfunction users to query a party slot and check if the Pokémon can learn a specific move returning a 1 if yes otherwise 0, this will be a cheat command in the Minecraft permission system or use the permission `cobblemon.command.querylearnset` if a permission mod is present.
- Added the `/testpcslot <player> <slot> <properties>` command allowing command block/mcfunction users to query a pc slot and check if the Pokémon matches specific properties returning a 1 if yes otherwise 0, this will be a cheat command in the Minecraft permission system or use the permission `cobblemon.command.testpcslot` if a permission mod is present.
- Added the `/testpartyslot <player> <slot> <properties>` command allowing command block/mcfunction users to query a party slot and check if the Pokémon matches a specific properties returning a 1 if yes otherwise 0, this will be a cheat command in the Minecraft permission system or use the permission `cobblemon.command.testpartyslot` if a permission mod is present.
- Added the `/clearparty <player>` command for emptying a player's party.
- Added the `/clearpc <player>` command for emptying a player's PC.
- Added the `/pokemonrestart <reset_starters>` and the `/pokemonrestartother <player> <reset_starters>` command allowing command block/mcfunction users to reset a players Pokémon data.
### Pokémon Added
#### Gen 2
- Chikorita
- Bayleef
- Meganium
- Totodile
- Croconaw
- Feraligatr
- Cyndaquil
- Quilava
- Typhlosion
- Spinarak
- Ariados
- Shuckle
- Chinchou
- Lanturn
- Aipom
- Gligar
- Hoothoot
- Noctowl
- Mareep
- Flaaffy
- Ampharos
- Sudowoodo
- Snubbull
- Granbull
- Phanpy
- Donphan
- Teddiursa
- Ursaring
#### Gen 3
- Taillow
- Swellow
- Relicanth
- Duskull
- Dusclops
- Shroomish
- Breloom
- Cacnea
- Cacturne
- Poochyena
- Mightyena
- Wingull
- Pelipper
- Numel
- Camerupt
- Clamperl
- Huntail
- Gorebyss
- Surskit
- Masquerain
- Chimecho
- Barboach
- Whiscash
- Volbeat
- Illumise
- Zigzagoon
- Linoone
- Ralts
- Kirlia
- Gardevoir
- Nincada
- Ninjask
- Shedinja
- Beldum
- Metang
- Metagross
#### Gen 4
- Carnivine
- Shinx
- Luxio
- Luxray
- Ambipom
- Gliscor
- Dusknoir
- Chingling
- Bonsly
- Chatot
- Combee
- Vespiquen
- Buizel
- Floatzel
- Starly
- Staravia
- Staraptor
- Gallade
#### Gen 5
- Bouffalant
- Roggenrola
- Boldore
- Gigalith
- Venipede
- Whirlipede
- Scolipede
- Yamask
- Cofagrigus
- Patrat
- Watchog
- Lillipup
- Herdier
- Stoutland
- Cottonee
- Whimsicott
- Pidove
- Tranquill
- Unfezant
- Timburr
- Gurdurr
- Conkeldurr
#### Gen 6
- Scatterbug
- Spewpa
- Vivillon
- Skrelp
- Dragalge
- Bunnelby
- Diggersby
- Phantump
- Trevenant
- Fletchling
- Fletchinder
- Talonflame
#### Gen 7
- Wishiwashi
- Cutiefly
- Ribombee
- Stufful
- Bewear
- Comfey
- Alolan Exeggutor
- Alolan Raichu
- Alolan Meowth
- Alolan Persian
- Komala
- Wimpod
- Golisopod
- Crabrawler
- Crabominable
- Mudbray
- Mudsdale
#### Gen 8
- Arrokuda
- Barraskewda
- Nickit
- Thievul
- Falinks
- Galarian Farfetch'd
- Sirfetch'd
- Rookidee
- Corvisquire
- Corviknight
- Galarian Ponyta
- Galarian Rapidash
- Yamper
- Boltund
- Galarian Zigzagoon
- Galarian Linoone
- Obstagoon
- Galarian Meowth
- Perrserker
- Ursaluna
#### Gen 9
- Sprigatito
- Floragato
- Meowscarada
- Fuecoco
- Crocalor
- Skeledirge
- Quaxly
- Quaxwell
- Quaquaval
- Flittle
- Espathra
- Garganacl
- Fidough
- Dachsbun
- Armarouge
- Ceruledge
- Cetoddle
- Cetitan
- Shroodle
- Grafaiai
- Tandemaus
- Maushold
- Varoom
- Revavroom
- Squawkabilly
- Glimmet
- Glimmora
- Annihilape
- Tinkatink
- Tinkatuff
- Tinkaton
- Maschiff
- Mabosstiff
- Lechonk
- Oinkologne
- Paldean Wooper
- Clodsire
### Changes
- Removed the existing shoulder effects from Pokémon until we have more balanced versions of them (they're too powerful!)
- Updated models and textures of Weedle, Dwebble and Crustle, Spiritomb, Koffing and Weezing, Kadabra and Alakazam, Emolga, Oshawott, Doduo and Dodrio, Dratini and Dragonair and Dragonite, Sneasel and Weavile, Gyarados, Hitmonlee and Hitmonchan, Chesnaught, Spinda, Mamoswine, Steelix, Misdreavus and Mismagius, Buneary and Lopunny, Golduck, Meowth and Persian, Fennekin and Braixen and Delphox, Snivy and Servine and Serperior, Ratatta and Raticate, Nidorina and Nidoqueen, Nidoran Male and Nidoking, Riolu and Lucario, Haunter and Gengar, Mankey and Primeape, Mew and Mewtwo, Arcanine, Magnemite and Magneton and Magnezone, Exeggcute and Exeggutor, Elekid and Electabuzz and Electivire, Pichu and Pikachu and Raichu, Wooper, Drowzee and Hypno, Aerodactyl, Spearow and Fearow, Lickitung and Lickilicky, Pidgey and Pidgeotto and Pidgeot, Scyther and Scizor and Kleavor, Popplio and Brionne and Primarina, Torchic and Combusken and Blaziken, Happiny and Chansey and Blissey.
- Updated animations for Steelix, Turtwig and Grotle and Torterra, Ponyta and Rapidash, Piplup and Prinplup and Empoleon, Drowzee and Hypno, Farfetch'd, Exeggcute and Exeggutor, Bidoof, Chimecho, Lickitung and Lickilicky, Popplio and Brionne, Luvdisc, Chimchar and Monferno and Infernape, Sobble and Drizzile and Inteleon, Greninja, Heatmor, Aerodactyl, Ditto, Lotad and Lombre and Ludicolo, Pumpkaboo and Gourgeist.
- Updated sprites for EV medicines, the rare candy, and the apricorn door item.
- Updated textures for apricorn doors and all the evolution stone ores.
- Ponyta and Rapidash now have animated textures; they look insane.
- Updated Apricorn Leaves color.
- Wild Pokémon now heal if you are defeated by them or flee from them.
- Doubled the default time between ambient Pokémon cries (they have cries if you're using a resource pack to add them)
- Moved spawn attempts per tick to a config option (ticksBetweenSpawnAttempts)
- PCs can now be waterlogged
- Starter selection prompt now appears as a tutorial-esque toast instead of plain text
- Reorganised the advancements recipes folder
- Pokéedit command now supports IVs and EVs.
- Reorganised creative categories
- Pokémon can now wander into non-solid blocks such as foliage
- Thrown Poké Balls now despawn after 30 seconds so that they don't fly forever.
- Dive Balls will now have the same motion speed underwater as if they were thrown in the air.
- Hardcoded potion shoulder effects have been removed. You can now use any potion vanilla or otherwise with the parameters you'd like, for more information see the [Datapack & Resourcepack Creators](#datapack-&-resourcepack-creators) section.
- Clicking categories of the Stat subsection or the party reorder button in the Summary screen will now produce a click sound.
- Updated PC Recipe.
- Improved Pokémon AI and movement.
- Friendship will slowly increase when Pokémon are shoulder-mounted.
- Master Balls are now unable to be burned when dropped into fire/lava. They're made from stronger stuff.
- Pokémon will appear red when hurt, like regular entities, except when they're fainting.
- Pokémon's air meter no longer depletes while battling underwater.
- Sleeping partially restores PP of Pokémon
- Shoulder mounts now match the shoulder position a bit more accurately when sneaking.
- Poison Heal will now cause poisoned Pokémon to heal outside of battle.
- Updated Poké Ball, PC, UI, evolution and Healing Machine sounds.
### Added cries to the following Pokémon:
- All starters and their evolutions
- Caterpie, Metapod, Butterfree
- Weedle, Kakuna, Beedrill
- Pidgey, Pidgeotto, Pidgeot
- Rattata, Raticate
- Spearow, Fearow
- Ekans, Arbok
- Pichu, Pikachu, Raichu, Alolan Raichu
- Cleffa, Clefairy, Clefable
- Mankey, Primeape, Annihilape
- Ponyta, Rapidash, Galarian Ponyta, Galarian Rapidash
- Farfetch'd, Galarian Farfetch'd, Sirfetch'd
- Onix, Steelix
- Tauros
- Ditto
- Eevee, Vaporeon, Jolteon, Flareon, Espeon, Umbreon, Leafeon, Glaceon, Sylveon
- Hoothoot, Noctowl
- Mareep, Flaaffy, Ampharos
- Aipom, Ambipom
- Wooper, Quagsire, Clodsire
- Snubbull, Granbull
- Miltank
- Poochyena, Mightyena
- Taillow, Swellow
- Ralts, Kirlia, Gardevoir, Gallade
- Shroomish, Breloom
- Nincada, Ninjask, Shedinja
- Buneary, Lopunny
- Chingling
- Chatot
- Riolu, Lucario
- Pidove, Tranquill, Unfezant
- Roggenrola, Boldore, Gigalith
- Venipede, Whirlipede, Scolipede
- Maractus
- Dwebble, Crustle
- Yamask, Cofagrigus
- Bunnelby, Diggersby
- Fletchling, Fletchinder, Talonflame
- Scatterbug, Spewpa, Vivillon
- Honedge, Doublade, Aegislash
- Skrelp, Dragalge
- Phantump, Trevenant
- Pumpkaboo, Gourgeist
- Bergmite, Avalugg
- Mudbray, Mudsdale
- Stufful, Bewear
- Mimikyu
- Rookidee, Corvisquire, Corviknight
- Nickit, Thievul
- Wooloo, Dubwool
- Yamper, Boltund
- Tandemaus
- Fidough, Dachsbun
- Squawkabilly
- Nacli, Naclstack, Garganacl
- Charcadet, Armarouge, Ceruledge
- Maschiff, Mabosstiff
- Shroodle, Grafaiai
- Flittle, Espathra
- Tinkatink, Tinkatuff, Tinkaton
- Varoom, Revavroom
- Glimmet, Glimmora
- Cetoddle, Cetitan
- Tatsugiri
### Fixes
- Fixed spawning moon phase dependent Pokémon only when the moon phase is wrong (that's a funny woopsy)
- Fixed large Pokémon spawning partially inside walls where they suffocate.
- Fixed custom Pokémon in your party or PC not being removed when the addon is removed, causing major issues.
- Fixed messages for entry hazards, screens, weather, damage, healing, Tailwind, Perish Song, Destiny Bond, Shed Skin, Uproar, Forewarn, Disguise, Arena Trap, Yawn, Curse, Clamp, Whirlpool, Liquid Ooze, Miracle Eye, Safeguard, Magic Bounce, Lock On, Focus Energy, Confusion, and more.
- Fixed Porygon not evolving with an Upgrade.
- Fixed super sized Pumpkaboo not having any moves.
- Fixed Infernape look animation.
- Fixed Garchomp T-posing while swimming which was very funny.
- Fixed a bug that caused sleeping Pokémon to stay asleep. Forever. The years passing them by as they dream of a world without hate...
- Fixed a bug that would freeze a battle when a Pokémon gets trapped by an ability, making the trap abilities even scarier and trap-like than they were before.
- Fixed the Poké Ball close animation canceling whenever colliding with a block.
- Fixed lighting and Pokémon label issues when a Pokémon item frame is nearby.
- Fixed Pokémon being able to spawn outside the world border as a tease.
- Fixed deepslate water stone ore items looking like deepslate fire stone ores. Huh?
- Fixed a bunch of client-side logging errors when Pokémon are shoulder mounted. You didn't notice? Good.
- Fixed a crash when wild Pokémon have to struggle under specific circumstances.
- Fixed uncolored pixels on Yanma's shiny texture.
- Fixed apricorn tree leaves looking gross on the Fast graphics mode.
- Fixed hoes not breaking apricorn tree leaves any faster.
- Fixed Shiftry's PC model position.
- Fixed the `/pc` command not playing the opening sound.
- Fixed different forms of Pokémon not being able to appear as different sizes.
- Fixed the Healing Machine soft locking you from using others when removed by non-players.
- Fixed animations being sped up when using the Replay Mod.
- Fixed particle animations not running when a Pokémon is off-screen.
- Fixed Pokémon variants and layers not rendering correctly when shouldered and playing on a dedicated server, existing shoulders affected will need to be retrieved and shouldered again.
- Fixed shoulder effects not staying applied through situations that remove potion effects such as drinking milk.
- Fixed Shedinja not being able to recover naturally.
- Fixed Shedinja evolving to use the consumed Poké Ball and removed the held item to prevent dupes.
- Fixed Shedinja healing above 1 HP.
- Fixed Shedinja, basically.
- Fixed shearing Pokémon dropping 0-2 wool instead of 1-3.
- Fixed some alignment issues in the stat hexagon of the summary menu. OCD people rejoice.
- Fixed capture calculations not applying ball bonuses entirely correctly.
- Fixed battles soft-locking when consecutive Pokémon faint on switch-in.
- Fixed timing and color of battle window messages.
- Fixed players being able to trade, battle and let out their Pokémon while in spectator mode.
- Fixed Galarian Yamask not being able to evolve and by proxy the `damage_taken` evolution requirement.
- Fixed Bisharp not being able to evolve and by proxy the `defeat` evolution requirement.
- Fixed White-Striped Basculin not being able to evolve because of a broken `recoil` evolution requirement.
- Fixed Primeape, Qwilfish and Stantler not being able to evolve because of a broken `use_move` evolution requirement.
- Fixed Bramblin, Pawmo, and Rellor not being able to evolve because of a broken `blocks_traveled` evolution requirement.
- Fixed displayName property in spawn files not doing what it's meant to do.
- Fixed Pokémon not sleeping in the wild like we wanted them to.
### Developer
- Added SpawnEvent, ThrownPokeballHitEvent, PokemonSentEvent, PokemonRecalledEvent.
- Added BattleFledEvent, BattleStartedEvent, BattleFaintedEvent.
- Added persistent NBT property inside Pokémon to store quick and simple data.
- Species and FormData have had their evolutions, pre-evolution and labels properties exposed. It is still recommended to work using a Pokémon instance when possible.
- Added capture check to BattleVictoryEvent.
- The various hardcoded potion shoulder effects have been removed, make use of PotionBaseEffect.
- Added ContextManager for tracking causes and contexts of conditions created during a battle. See BattleContext for types of conditions that are tracked.
- Added MongoDB support for storing Pokémon and Player data. Must be enabled in config, requires MongoDB core and sync drivers (4.10.0+).
- CobblemonShowdown updated to version 10.
- Generation of a battle can be set in BattleFormat.
- Pokémon now have `teraType`, `dmaxLevel`, and `gmaxFactor` properties. Gimmicks can be used during battle by adding the respective identifiers to `keyItems` in PlayerData: `key_stone`, `z_ring`, `dynamax_band`, and `tera_orb`. Dynamax is only supported in Gen 8 battles. Mega Evolution and Z-Power require custom held items to be added (e.g. an item with the path `gengarite` will allow Gengar to Mega Evolve). Currently custom Z-Crystals and Mega Stones are not supported.
### Datapack & Resourcepack Creators
- All potion related shoulder effects have had their IDs changed. They now all share the same type being `potion_effect` and use the vanilla Potion data [parameters](https://minecraft.fandom.com/wiki/Potion#Item_data). For example, here is the converted Pidgey asset:
- `json
{
"type": "potion_effect",
"effect": "minecraft:slow_falling",
"amplifier": 0,
"ambient": true,
"showParticles": false,
"showIcon": false
}
`
- Renamed the `walked_steps` evolution requirement to `blocks_traveled`.
- Added support for scale in animations.
- Added support for jump keyframes (i.e. pre and post keyframes)
- Added structure spawning conditions
- Added Advancement trigger for defeating Pokémon and collecting varieties of Pokémon.
- Added support for "isBattle" and "isTouchingWater" properties on resource pack Pokémon poses. This allows your custom Pokémon to be posed differently when in battle.
- Added support for "isVisible" on a transformed part on resource pack Pokémon poses. This allows your custom Pokémon to have bones disappear in specific poses, such as hiding Greninja's throwing star when not in a battle pose.
- Added support for battle music. Sounds can be added to the `battle.pvp.default` and `battle.pvw.default` sound events.
- Added 'enabled' optional property on model layers, allowing later variations to disable previously-defined layers. See [this issue](https://gitlab.com/cable-mc/cobblemon/-/issues/335) for how this looks.
- Cobblemon items can now all have their own tooltips via resourcepacks. To add a tooltip, add a lang entry like "item.cobblemon.{item_id}.tooltip". If you want to add multiple tooltip lines you can do so with "item.cobblemon.{item_id}.tooltip_1" and upwards.
- Item interaction evolutions and held item requirements now support NBT by creating an object JSON containing the key `item` for what used to be the existing condition support and a `nbt` key for the NBT format, this is the string [format](https://minecraft.fandom.com/wiki/NBT_format) expected in commands. Existing data does not need to be updated.
- Fixed faint animations not working properly in add-ons.
- Fixed non-existent species in spawn pool files causing random species to spawn.
### Localization
- Added partial translations for Dutch, Polish, Swedish, Hungarian, Czech, Cyprus Greek, and even Esperanto.
- Updated translation for French and Canadian French, Simplified Chinese, Japanese, Korean, Spanish and Mexican Spanish, Pirate English, German, Thai, Turkish, Portuguese and Brazilian Portuguese, Ukrainian, and Russian.
+130
View File
@@ -0,0 +1,130 @@
## [1.4.1 (December 23rd, 2023)](#1-4-1)
### Additions
- Added battle spectating. Press R on a player in a battle and you can spectate and bully them for their tactics.
- Added the Litwick and Drifloon lines.
- Cobblemon now has compatibility with [Adorn](https://modrinth.com/mod/adorn), allowing you to craft Apricorn wood furniture.
- Berries can now be used in recipes from [Farmer's Delight](https://modrinth.com/mod/farmers-delight) and [Farmer's Delight (Fabric)](https://modrinth.com/mod/farmers-delight-fabric), as well as any other mods using the same berry tags.
- Boats, signs and hanging signs are now craftable with Apricorn wood.
- Added the Fairy Feather, Iron Ball, Cleanse Tag, Flame Orb, Life Orb, Smoke Ball, and Toxic Orb held items.
- Added the Inferno, Void, and Forsaken patterns for Vivillon. These can be obtained by evolving a Spewpa in the Nether, End, or Deep Dark respectively.
- Bees can now be fed using Pep-Up Flowers.
- Mooshtank can now be milked with a bowl for Mushroom Stew.
- Updated Showdown version to use generation 9 battle data.
- Added cries to Beldum, Metang and Metagross.
- Added a `/bedrockparticle` command to run Snowstorm-format particle effects.
- Added data for Dipplin, Fezandipiti, Munkidori, Ogerpon, Okidogi, Poltchageist and Sinistcha.
- Added additional nickname trigger "Grumm" for Inkay's evolution.
### Changes
- Using Potions, Status Heals, Ethers, and Antidotes will now return a glass bottle
- Using a Remedy, Fine Remedy, or Superb Remedy will no longer lower friendship with a Pokémon.
- The Healing Machine now has a [much more difficult recipe](https://wiki.cobblemon.com/index.php/Healing_Machine), placing it later game.
- Made the EXP. Share recipe cheaper.
- Turtwig can now be put on your shoulder.
- Updated Zubat line model, texture, and animations.
- Updated Geodude line models and textures.
- Added animations for Hitmontop, Tyrogue, and Mightyena.
- Tweaked animations for Dusknoir, Ratatta, Bewear, Exeggutor, and Alolan Exeggutor.
- Sized Kantonian Exeggutor down. Still big, but not TOO big.
- Tweaked cries for Pikachu, Raichu and Alolan Raichu.
- Fixed Swimming behaviors for Wimpod line, Oshawott line, Quaxly line, and Clodsire
- Changed the way level scaling works in spawning. By default, anything with a spawn range of up to 5 either side of the party highest level and everything else will spawn per its specified ranges.
- The nature of Pokémon will now be displayed italicized when a mint has been applied. Hovering over the nature will display the mint that was applied.
- Slightly lowered the volume of all cries.
- Giving Pokémon items now plays a sound
- Updated the Poké Ball model and animations.
- Pasture blocks will now also connect their bottom left and right sides to walls, iron bars, glass panes, and any other modded block that follows the same connection rules.
- The config option `consumeHeldItems` has been removed, please see the Datapack & Resourcepack Creators section for instructions on the updated method.
- Heal Powder can now be composted with a 75% chance of adding a layer
- Mental, Power, White, and Mirror Herbs can now be composted with a 100% chance of adding a layer.
- Added glowing eyes to Hoothoot and Noctowl.
- Mining Evolution Stone Ores with a Fortune pickaxe will now increase the amount of items received.
- Black Augurite can now be used to craft stone axes and obsidian.
- Using Experience Candies brings up the Party Pokémon Select screen when not targeting a Pokémon.
- Added tab completion for statuses to commands.
- Remedies can now be cooked in a Smoker and on a Campfire.
- Vertically flipped the Destiny Knot recipe.
### Fixes
- Fixed Raticate, Onix, Unfezant, Bergmite, Avalugg, Boltund and Revavroom cries not playing.
- Fixed Alolan Ratticate animations causing a crash.
- Fixed Quaxwell not doing its cry.
- Fixed Shroomish not using its idle.
- Fixed how Weight and Height is calculated for Pokémon, fixing the damage from moves like Low Kick.
- Fixed a staggering number of battle messages.
- Fixed various stone related blocks not being valid for Big Roots to spread onto on the Fabric version.
- Updated the registration of compostable items to improve compatibility with Fabric forks such as Quilt. Please note this does not mean we officially support Quilt, this change was only done since it was possible by correcting the registration to use the new intended way in the Fabric API.
- Fixed Dispensers being unable to shear grown Apricorns.
- Fixed Bowl not being given back to player after using Berry Juice
- Fixed missing text for attempting to catch an uncatchable Pokémon
- Fixed Moonphases for Clefairy line
- Fixed issue where Potions, Super Potions, and Hyper Potions did not work during battle
- Fixed the compatibility patch with the Forge version of [Carry On](https://modrinth.com/mod/carry-on) due to a bug on the mod, the Fabric version was unchanged and is still compatible.
- Added the ability to place Berries on modded Farmland blocks.
- Shouldered Pokémon now hop off when selected in team and R is pressed. This also is in effect in battles leading to shouldered Pokémon jumping of the shoulder of the trainer when it is their turn.
- Made more items compostable and changed the process for making items compostable.
- Added the ability for Hoppers to fill Brewing Stands with Medicinal Brews and Potions.
- Apricorn blocks are now flammable. Probably should have started that way, but we got there.
- The default pose for Pokémon being passengers is now "standing".
- Fixed issue where some IVs were changing every time a player logged back in.
- Fixed advancement crash from bad datapack evolution data.
- Fixed global influences being applied to TickingSpawners twice.
- Reverted the default SpawningSelector back to FlatContextWeightedSelector. This fixes multiple weight related issues, including weights with SpawningInfluences.
- Apricorn Planting advancement should work again.
- Advancement "Vivillonaire" should now allow High Plains and Icy Snow Vivillon to register.
- Fixed the last battle critical hits evolution requirement not working.
- Fixed the damage taken evolution requirement not saving progress.
- Fixed the defeated Pokémon evolution requirement not saving progress.
- Fixed potion brewing recipes not showing up JEI and similar mods on the Forge version.
- Fixed an exploit that could convert a single piece of Blaze Powder into an extra Medicinal Brew on the Forge version.
- Fixed an issue where health percentages would show incorrectly after healing
- Fixed the move Revival Blessing not allowing you to select from fainted party members.
- Fixed villagers not being able to pick up and plant mint seeds, vivichoke seeds, and revival herbs.
- Fixed Exeggcute faint.
- Fixed various spawn configuration issues across the board.
- Fixed a possible visual duplication of sent out Pokémon.
- Fixed battle text for Trace, Receiver, and Power of Alchemy.
- Fixed tooltips being appended too late in items.
- Fixed battles ending background music when battle music is not present.
- Fixed battles ending background music, instead of pausing, when battle music is played.
- Fixed a bunch of regionals to actually be obtainable, namely the unmodelled ones
- Fixed battle text for moves that were missing.
- Fixed a formatting error that affected Pokémon nicknames when the storage type is JSON.
- Fixed a crash that could occur on some servers relating to chunk loading and teleporting.
- Fixed an issue with Inkay's evolution requirement.
- Fixed conflicting evolution requirements that would cause the Ocean, River, Sun, and Tundra variants of Vivillon to be unobtainable through evolution.
- Fixed the Modern variant of Vivillon not being obtainable through evolution.
- Fixed Pokémon pathing through berry bushes, harming themselves in the process.
### Developer
- Fixed the `SpawnEvent` not respecting usage of `Cancelable#cancel`.
- Added the `EvolutionTestedEvent`, this allows listening and overriding the final result of evolution requirement tests.
- Rebuilt the scheduling API to more clearly force side choices and allow more local temporal frames of reference for tasks.
- Added utility script that can be used to generate all Spawn JSONS for all pokemon from the spawning spreadsheet in 1 click ([cobblemon_spawn_csv_to_json.py](utilityscripts%2Fcobblemon_spawn_csv_to_json.py)).
- The `HeldItemManager` has a new method `shouldConsumeItem`, this will return false by default to prevent breaking changes, see the documentation and update your implementations as needed.
- Added and implemented minSkyLight and maxSkyLight as config options for SpawnConditions
- Player specific battle themes can now be assigned to `PlayerData#battleTheme`.
- Changed design of `BattleStartedPreEvent`. Will now expose the `PokemonBattle`.
### Datapack & Resourcepack Creators
- Added 3 new item tags: `cobblemon:held/consumed_in_npc_battle`, `cobblemon:held/consumed_in_pvp_battle` & `cobblemon:held/consumed_in_wild_battle` these will determine which items get consumed in the implied battle types by Cobblemon, keep in mind the controller for this behaviour can be overriden by 3rd party.
- Unique wild encounter themes can now be associated with a specific species (or form) by assigning a SoundEvent identifier to the `battleTheme` field in the species' data configuration.
- Added a `structure` evolution condition, used to check if a Pokémon is in a given structure.
### Localization
- Updated translations for:
- French and Canadian French
- Simplified and Traditional Chinese
- Spanish and Mexican Spanish
- Pirate English
- German
- Thai
- Portuguese and Brazilian Portuguese
- Polish
- Italian
- Dutch
- Ukrainian
- Russian
Thank you so much to all of our community translators that bring the mod to the rest of the world!
+362
View File
@@ -0,0 +1,362 @@
## [1.5.0 - The Ruins and Revival Update (May 12th, 2024)](#1-5-0)
#### "You're telling me that Mojang has added archaeology to the game? Hmm... that gives me an idea."
### Additions
- Added 17 ruin structures, where you can find Pokémon-themed Armor Trims and Pottery Sherds, Tumblestones, and more.
- Added 23 fossil structures, where you can brush Suspicious Sand/Gravel for [Fossils](https://wiki.cobblemon.com/index.php/Fossil). You can add [custom fossils using datapacks](https://wiki.cobblemon.com/index.php/Fossils_File).
- Added the Data Monitor, Fossil Compartment, and Restoration Tank blocks. Placed in the correct formation, you can use these to create a [Restoration Machine](https://wiki.cobblemon.com/index.php/Resurrection_Machine) where you can bring fossils back to life. Use organic material to fill the tank first!
- Added 3 variants of [Tumblestone](https://wiki.cobblemon.com/index.php/Tumblestone), which can be planted near Lava or Magma to grow harvestable Tumblestone Clusters.
- Added Tumblestone Blocks, a storage block crafted from 9 Tumblestones.
- Added Ancient Poké Balls, which are aesthetic variants crafted from Tumblestones.
- Added the Ancient Feather, Wing, and Jet Balls, which fly further than regular Poké Balls.
- Added the Ancient Heavy, Leaden, and Gigaton Balls, which are heavier and don't fly as far as regular Poké Balls. These will receive more functionality in a future update.
- Added visual effects for many Poké Balls when sending out or capturing Pokémon.
- Added a new send-out ball toss animation that showcases the ball used for the Pokémon.
- Added simple move animations for Pokémon in battle with a proof of concept (Flamethrower) for more complicated animations. More and more specific animations will come in future updates.
- Added Original Trainer to the summary menu. To edit the OT through commands, you must specify originaltrainertype=<Player/NPC>, and originaltrainer=<Username or UUID/NPC Name>
- Added support for planting Apricorn trees, berries, and mints in [Botany Pots](https://modrinth.com/mod/botany-pots)
- Added the hidden "True Vivillionaire" advancement.
- Added the [Display Case](https://wiki.cobblemon.com/index.php/Display_Case) block. Use it to display your archaeological findings, Poké Balls, or other items.
- Added 6 Pokémon-themed Pottery Sherds, obtained from ruin structures. Sherds... sh-erds. Weird word.
- Added a Pokémon-themed armor trim, obtained from ruin structures.
- Added Nether Fire Stone Ore to, surprisingly, the Nether.
- Added Terracotta Sun Stone Ore to Badlands biomes.
- Added the EV Boosting Feathers.
- Added [Gilded Chests](https://wiki.cobblemon.com/index.php/Gilded_Chest), available in all Apricorn colors.
- Added Relic Coins, Relic Coin Pouches, and Relic Coin Sacks. Gimmighoul might be interested in these.
- Added Type Gems. These will have additional uses later, so you should start collecting them.
- Added new held items: Ability Shield, Absorb Bulb, Air Balloon, Binding Band, Blunder Policy, Cell Battery, Covert Cloak, Damp Rock, Eject Button, Eviolite, Expert Belt, Float Stone, Focus Sash, Heat Rock, Icy Rock, Iron Ball, Light Ball, Loaded Dice, Red Card, Shell Bell, Sticky Barb, Smooth Rock, Soothe Bell and Weakness Policy.
- Added Hisui starters to the starter selection menu. They come inside of ancient Poké Balls.
- Added a bubble quirk to Krabby that only plays during clear sunsets. It looks familiar...
- Added forfeit option to PVP battles.
- Added visual changes for entities affected by Illusion, Imposter, or Transform in battle.
- Added shoulder mounting for Squirtle, Ralts, Roggenrola, Charcadet, Sizzlipede, Litwick, Cutiefly, Flabebe, Flittle, and Scatterbug
- Added species data for Hydrapple, Iron Boulder, Iron Crown, Pecharunt, Raging Bolt, and Terapagos
- Added various new tags for search-ability and better mod compatibility.
- Added the [Ability Capsule](https://bulbapedia.bulbagarden.net/wiki/Ability_Capsule) and [Patch](https://bulbapedia.bulbagarden.net/wiki/Ability_Patch). These have no way of getting them (for now) and only work as intended with the traditional ability format of 1 to 2 common abilities and 1 hidden ability.
### Pokémon Added
#### Gen 2
- Sentret
- Furret
- Qwilfish
- Heracross
- Skarmory
- Larvitar
- Pupitar
- Tyranitar
#### Gen 3
- Lileep
- Cradily
- Anorith
- Armaldo
- Tropius
- Roselia
- Aron
- Lairon
- Aggron
- Solrock
- Lunatone
- Makuhita
- Hariyama
- Trapinch
- Vibrava
- Flygon
#### Gen 4
- Shieldon
- Bastiodon
- Cranidos
- Rampardos
- Budew
- Roserade
- Hippopotas
- Hippowdon
#### Gen 5
- Tirtouga
- Carracosta
- Archen
- Archeops
- Zorua
- Zoroark
- Petilil
- Lilligant
- Darumaka
- Darmanitan
- Woobat
- Swoobat
- Sandile
- Krokorok
- Krookodile
- Frillish
- Jellicent
- Cubchoo
- Beartic
- Deino
- Zweilous
- Hydreigon
- Larvesta
- Volcarona
- Alomomola
- Ferroseed
- Ferrothorn
#### Gen 6
- Tyrunt
- Tyrantrum
- Amaura
- Aurorus
- Goomy
- Sliggoo
- Goodra
- Carbink
- Flabébé
- Floette
- Florges
- Klefki
#### Gen 7
- Turtonator
- Fomantis
- Lurantis
- Salandit
- Salazzle
- Jangmo-o
- Hakamo-o
- Kommo-o
- Alolan Diglett
- Alolan Dugtrio
#### Gen 8
- Gossifleur
- Eldegoss
- Arctozolt
- Arctovish
- Dracozolt
- Dracovish
- Basculegion
- Hisuian Decidueye
- Hisuian Typhlosion
- Hisuian Samurott
- Hisuian Lilligant
- Hisuian Sliggoo
- Hisuian Goodra
- Hisuian Zorua
- Hisuian Zoroark
- Hisuian Voltorb
- Hisuian Electrode
- Hisuian Qwilfish
- Overqwil
- Hisuian Sneasel
- Sneasler
- Stonjourner
- Cufant
- Copperajah
- Dreepy
- Drakloak
- Dragapult
- Impidimp
- Morgrem
- Grimmsnarl
#### Gen 9
- Gimmighoul
- Using Relic Coins, you can increase Gimmighoul's Coin Stash. Upon reaching 999, it can be evolved into Gholdengo.
- Additionally, if you give Gimmighoul a Netherite Scrap, you can increase its Netherite Stash. But what will that do to when you evolve it?
- Gholdengo
#### Cobblemon Exclusives
- Hisui Bias Rowlet
- Hisui Bias Dartrix
- Hisui Bias Cyndaquil
- Hisui Bias Quilava
- Hisui Bias Oshawott
- Hisui Bias Dewott
- Hisui Bias Goomy
- Hisui Bias Petilil
These are our compromise for having both regular and Hisuian forms of these Pokémon in the game. Hisui Biased variations will evolve into the Hisuian evolutions under most conditions. They are otherwise purely cosmetic differences.
### Added cries to the following Pokémon
- Alolan Raticate
- Vulpix, Ninetales
- Zubat, Golbat, Crobat
- Meowth, Persian
- Psyduck, Golduck
- Growlithe, Arcanine
- Geodude, Graveler, Golem
- Doduo, Dodrio
- Seel, Dewgong
- Muk, Grimer
- Krabby, Kingler
- Voltorb, Electrode, Hisuian Voltorb, Hisuian Electrode
- Tangela, Tangrowth
- Snorlax
- Cubone, Marowak
- Koffing, Weezing
- Aerodactyl
- Elekid, Electabuzz, Electivire
- Omanyte, Omastar
- Kabuto, Kabutops
- Lapras
- Scyther
- Hisui Bias Cyndaquil, Hisui Bias Quilava
- Igglybuff
- Yanma, Yanmega
- Gligar, Gliscor
- Qwilfish, Hisuian Qwilfish, Overqwil
- Sneasel, Hisuian Sneasel, Weavile, Sneasler
- Larvitar, Pupitar, Tyranitar
- Swinub, Piloswine, Mamoswine
- Aron, Lairon, Aggron
- Trapinch, Vibrava, Flygon
- Cacnea, Cacturne
- Barboach, Whiscash
- Lileep, Cradily
- Anorith, Armaldo
- Tropius
- Chimecho
- Bidoof, Bibarel
- Buizel, Floatzel
- Gible, Gabite, Garchomp
- Hisui Bias Oshawott, Hisui Bias Dewott
- Petilil, Lilligant, Hisui Bias Petilil, Hisuian Lilligant
- Basculin, Basculegion
- Sandile, Krokolok, Krookodile
- Darumaka, Darmanitan
- Archen, Archeops
- Zorua, Zoroark, Hisuian Zorua, Hisuian Zoroark
- Tyrunt, Tyrantrum
- Amaura Aurorus
- Carbink
- Goomy, Sliggoo, Goodra, Hisui Bias Goomy, Hisuian Sliggoo, Hisuian Goodra
- Klefki
- Hisui Bias Rowlet, Hisui Bias Dartrix
- Komala
- Impidimp, Morgrem, Grimmsnarl
- Cufant, Copperajah
- Dreepy, Drakloak, Dragapult
- Dracozolt, Arctozolt, Dracovish, Arctovish
- Lechonk, Oinkologne
- Maushold family of three and four
### Changes
- Alolan Pikachu and Exeggcute changed to Alola Bias.
- Pokémon now transition more smoothly between different poses.
- Updated models for Mimikyu, Alcremie, Squirtle, Wartortle, Blastoise, Pidgey, Pidgeotto, Pidgeot, Omanyte, Omastar, Growlithe, Arcanine, Nidoran Male, Nidoran Female, Lapras, Swinub, Piloswine, Basculin, Rowlet, Dartrix, Decidueye, Kabuto, Kabutops, Piplup, Prinplup, Elekid, Electabuzz, Cubone, Marowak, Paras, Mawile, Drifloon, Drifblim, Venonat, Venomoth, Yanma, Yanmega, Psyduck, Dusknoir, Diglett, Dugtrio, Natu, Xatu, Oshawott, Samurott, Torchic, Grovyle, Sceptile, Sizzlipede, Mismagius, and Raboot.
- Updated animations for Squirtle, Wartortle, Blastoise, Pidgey, Pidgeotto, Diglett, Dugtrio, Magikarp, Dragonite, Omanyte, Omastar, Kabuto, Pinsir, Chinchou, Lanturn, Ralts, Kirlia, Gardevoir, Gallade, Buizel, Garchomp, Pumpkaboo, Falinks, Lechonk, Litwick, Lampent, Chandelure, Carnivine, Galarian Meowth, Galarian Rapidash, Venonat, Venomoth, Phanphy, Donphan, Dratini, Dragonair, Happiny, Chansey, Blissey, Volbeat, Illumise, Numel, Sizzlipede, Centiskorch, Obstagoon, Timburr, Gurdurr, Conkeldurr, Drifloon, and Drifblim.
- Resized Drifloon.
- Added more held items to the held item tag, and Metal Coat to the held item tab.
- Added all ores to the modloader ore tags, and added tags for each ore type to the mod (both blocks and items).
- Changed the Destiny Knot to be crafted with a Ghast Tear rather than a diamond. We have big plans for the Destiny Knot...
- You can now punch grown apricorns to harvest them. We saw so many content creators breaking apricorns with their fists that it was making us die inside.
- The "Poké Ball" Vivillon variant is now obtainable by evolving a Spewpa after obtaining the "Aspiring Vivillionaire" advancement.
- Renamed the "Vivillionaire" advancement to "Aspiring Vivillionaire"
- Removed the Inferno, Forsaken, Poké Ball, and Void patterns from the Aspiring Vivillionaire advancement.
- Updated the biome tags for Spewpa's evolutions into the various Vivillon patterns. You should mostly be getting one evolution option at a time now.
- Apricorn Sprouts can now be planted directly on Apricorn leaves to create a new Apricorn of the same color.
- Added tooltips to interaction GUIs to make it clearer what they do.
- Poké Ball recipes now use tags for their center ingredient, rather than specifically Copper Ingots, Iron Ingots, Gold Ingots, and Diamonds, allowing for further datapack customisation and mod compatibility.
- Starter Toast now closes once the corresponding button is pressed once.
- Moved some items into the vanilla Food & Drinks category.
- Stacked Cobblemon Potion Bases can now be quick moved into Brewing Stands.
- Changed the Healing Machine recipe to swap the Max Revive for a Revive so that it is a bit easier to craft.
- Upped the rate that Gastly drop Ghast Tears from 2.5% to 5%, further helping the crafting of a Healing Machine.
- Pokémon with a low Blaze Powder drop chance now drop it more frequently in the Nether.
- Reorganised a few advancements.
- Pokémon entity shadows now scale when the Pokémon is being sent out or recalled.
- Remade Torkoal particles, now they only appear when in battle.
- Improved the shiny icon within summary and PC interfaces.
- Changed the Poison Barb sprite so that it doesn't look like a sword when held. It's a Poison Barb, not a Poison Sword. Wait, that gives me an idea.
- Moon Stone ore generates more frequently in Taigas and has been added to Magical and Spooky biomes. Ooo... Sorry.
- Density, Season, and Nether biome tags have been moved and renamed within the biome tags directory.
- Added particles to Lucario when in battle. Lucario is special.
- Movesets updated for Blueberry DLC.
### Fixes
- Re-added the recipe for the Iron vitamin. Well, technically it's a mineral.
- Fixed Exeggcute and Pikachu not being able to evolve.
- Fixed evolution priority for Exeggcute and Pikachu regional evolutions. Using a thunder stone on Kantonian Pikachu on the beach will give Alolan Raichu. A second thunder stone would then give Kantonian Raichu.
- Fixed battle text for the Poison Touch Ability.
- Finally found Sudowoodo and Bonsly. They were missing spawn data. Same with Drifloon and Litwick. Uh... sorry about that.
- Fixed Squawkabilly forms not being recognized.
- Fixed the bounce animation for Poké Balls being delayed by like, a full second. It's enough to drive you mad.
- Note blocks now play the correct sound on the Apricorn Plank-based blocks.
- Fixed an issue with transformed parts in posers causing whacky positional issues.
- Fixed Poké Balls freezing in an open state if you're looking away at the moment that it's meant to close. This actually fixes some other things but it's hard to explain.
- Fixed thrown Poké Balls technically having no name.
- Fixed very many issues with Bedrock particle effects. There are probably many more. Life goes on.
- Fixed Arbok patterns not being as specific in spawning as they were intended to be.
- Fixed Pokémon not avoiding danger at all when pathfinding.
- Fixed Pokémon pathing over snow layers and carpets.
- Fixed the Sobble line not being able to swim or breathe underwater.
- Fixed mod incompatibility with [Just Enough Resources](https://modrinth.com/mod/just-enough-resources-jer).
- Fixed mod incompatibility with [Visual Overhaul](https://modrinth.com/mod/visual-overhaul).
- Fixed an issue that allowed Pokémon to spawn on rails.
- Fixed the data set on Pokémon when abilities are given via properties such as in `/spawnpokemon`.
- Fixed Pokémon sometimes losing hidden abilities when evolving. This fix will only take effect for newly created Pokémon because of technical reasons that were explained to me but which I then forgot.
- Fixed capture messages not displaying in battle.
- Fixed the Illusion ability causing the wrong Pokémon to be targeted in battle.
- Fixed battles started with fainted party members causing a soft-lock on defeat.
- Fixed some issues with eyes in the faint animations of Hitmonlee and Phantump
- Fixed missing evolution moves, for example Stone Axe for Kleavor.
- Cleaned up empty evolutions declaration in species data (And no, I'm not listing all 169. No I don't care what you pay me, I'm not doing it).
- Fixed non-consumable held items being consumed or swapped in battle permanently.
### Developer
- Significantly changed the way the properties in PokemonEntity work. This could break some plugins (not in a big way, but changes will be needed for some things).
- Rebuilt the scheduling API to more clearly force side choices and temporal frames of reference for tasks. The developers say that how it works is cool but I stopped listening.
- Added dialogue API and data registry. This is powerful, and there is a full example in the Cobblemon mod you can trigger using `/opendialogue <username> cobblemon:example`. The example JSON is inside the data folder of the mod.
- Opened up the ItemDropEntry class to allow for it to be extended.
- Added a new "advancement" evolution variant that takes an advancement identifier and succeeds if the player has the advancement.
- Made the spawning API capable of non-entity spawning. You can make it 'spawn' commands if you want. Go nuts.
- Made `PokemonProperties.parse` more interoperable with Java. Save yourself and stop using Java.
- Added the `HeldItemEvent`, this comes with 2 implementation `HeldItemEvent.Pre` and `HeldItemEvent.Post`.
- Corrections to the ability implementation have been made that make `Ability.forced` function as intended and never reroll an ability for a Pokémon, please check your implementations to ensure the corrected behavior is intended for your use case.
- `Pokemon.ability` no longer has a public setter. Please migrate to using `Pokemon#updateAbility`, this handles the ability coordinate storage for you when necessary.
- `Ability.forced`, `Ability.index` and `Ability.priority` have all had their setters internalized, there is no longer any need to manually adjust these migrate to the method mentioned above to handle that process for you.
- `AbilityChanger` has been added to API alongside some implementations, this is subject to change as the ability capsule and patch currently only expect the traditional behaviour in the Pokémon games of 1 or 2 regular abilities and 1 hidden ability.
- `Pokemon#rollAbility` has been added which re9rolls for a legal ability for the Pokémon.
- `docs/cobblemon-tags` tags and spawn-presets can now be auto-generated from the current tags in the Cobblemon mod with the `generateSpawnPresetList.py` and `generateTagList.py` scripts.
- `public_spawns_to_json.py` script has been added to give the powerful spawn.json generator a simplistic UI.
- Updated Showdown with Gen 9 DLC.
- Changed mixins to be Java 17 for compatibility level instead of 16, removing a warning from startup logs.
### Datapack & Resourcepack Creators
- The maximum amount of fossils that can fit in the Fossil Analyzer can be adjusted in the config.
- Custom fossils can be defined using a list of items and the resulting Pokémon. An example of `aerodactyl.json`:
`JSON
{
"result": "aerodactyl",
"fossils": [
"cobblemon:old_amber_fossil"
]
}
`
- Fetus models can be defined in `bedrock/fossils`.
- Fetus textures can be defined in `textures/fossils`.
- Fuel for the Restoration Machine is registered inside the `natural_materials` folder. To register more fuels, create a JSON file containing an array of objects. Each object supports the following fields:
- `content`: Integer containing the amount of fuel to add.
- `item` OR `tag`: Identifier of the item or item tag to be inserted.
- `returnItem`: Identifier of an item to return to the player after consumption.
- Added 3 new item tags: `ancient_poke_balls`, `fossils`, and `tumblestones`.
- Added a spawn rules system to modify general spawning behaviour, see the [wiki](https://wiki.cobblemon.com/index.php/Spawn_Rules) for more information.
- Added dialogue datapack folder and `/opendialogue` command.
- Added the item tag `cobblemon:held/leaves_leftovers` this can be used to flag apple-like items that can create leftovers when eaten.
- You can now add support for dynamic lighting implementations, Cobblemon ships with a default implementation for [LambDynamicLights](https://modrinth.com/mod/lambdynamiclights) and the [Dynamic Lights Reforged](https://www.curseforge.com/minecraft/mc-mods/dynamiclights-reforged), add the following to any species or form:
`JSON
{
"lightingData": {
"lightLevel": 14,
"_lightLevelCommentRemoveMe": "Above supports 0 to 15",
"liquidGlowMode": "LAND",
"_liquidGlowModeCommentRemoveMe": "Above supports LAND, UNDERWATER or BOTH"
}
}
`
- Following up on this change `light_source` was removed as a possible shoulder effect due to becoming unnecessary and never having had a default implementation.
- Added the item tag `cobblemon:ability_changers`, contains the `cobblemon:ability_capsule` & `cobblemon:ability_patch` by default.
- Added the item tag `cobblemon:held/is_friendship_booster`, allows items to give the Soothe Bell effect of a boost of 1.5x Friendship gained, contains `cobblemon:soothe_bell` by default.
+105
View File
@@ -0,0 +1,105 @@
## [1.5.1 (May 27th, 2024)](#1-5-1)
### Additions
- Added unique send out particles for Cherish, Dream, Beast, and Ancient Origin balls.
- Made Wooloo and Dubwool dye-able like sheep. So cute!
- Added stat up and down particles.
- Most status effects now have particles! These include: Paralysis, Poison, Sleep, Confusion, Infatuation.
#### Move Particle Effects
- Confusion
- Cotton Guard
- Growl
- Ice Punch
- Fire Punch
- Thunder Punch
- Minimize
- Quick Attack
- Protect
- Swords Dance
- Sand Attack
- Poison Powder
- Sleep Powder
- Stun Spore
- Powder
- Rage Powder
- Spore
- Thunder Wave
### Changes
- Sounds for Relic Coin Sacks have been correctly renamed. Relic Coin Pouches received new sounds for breaking and placing.
- Readjusted Petilil portraits so they fit a bit better.
- Improved handling of Pokémon taken from the Restoration Tank block to be a bit more stable.
- Made Mulch cheaper to craft.
### Fixes
- Fixed a bug in which adding organic material to the restoration tank via right click was adding the full count of the stack currently in hand - but only taking 1 of the item.
- Fixed a niche issue where some properties of entities were not initialized correctly, causing Pokémon that appeared to be level 1 until you battle them.
- Fixed Fossilized Drake being missing from the Fossils item tag.
- Fixed Gilded Chest block entity not being cleared on block break, creating spooky ghost blocks. Old ones can be fixed by placing something like a furnace where it was, then breaking the furnace.
- Fixed sherd brokenness on Forge.
- Fixed Supplementaries incompatibility.
- Fixed Fossil Compartment crash with Jade / WAILA forks.
- Fixed pasture block PC lookups when the player is offline.
- Fixed an untranslated battle message that occurs when using a move that just ran out of PP (e.g. Fire Blast that just got spited mid-turn).
- Fixed held items being eaten even when the held item evolutions are already unlocked.
- Fixed Hisuian Decidueye not being Grass/Fighting.
- Fixed both Decidueye forms learning both Triple Arrows and Spirit Shackle.
- Fixed Pineco being unable to evolve into Shulker Forretress.
- Fixed Kabutops T-posing when underwater. It doesn't have proper swimming animations yet, though.
- Fixed Pidgey's missing walk animation.
- Fixed Cyndaquil's hidden flames clipping if it was swimming.
- Fixed Chimecho and Chingling being unable to spawn near bells. They are meant to!
- Fixed Tyrantrum and Wailord Party Overlay models peeking through the chat box. It was kinda funny though.
- Fixed hitbox sizes for Seedot, Nuzleaf, and Shiftry.
- Fixed Budew and Lechonk sliding if they walked for too long.
- Fixed Shedinja T-posing in battle.
- Fixed recoil evolution condition not working, making things like Basculegion unobtainable.
- Fixed issue where poser debug tools didn't work on JSON posers.
- Fixed issue where gilded chests don't close when going far away.
- Fixed issue where the restoration tank's renderer was reading old data, making it appear wrong.
- Fixed issue where the lights on the restoration tank would not animate if it was facing east. Very specific.
- Fixed client crash with the fossil machine when updating block state on a chunk that is unloaded in the client. I don't understand this but the devs are sure that all of those are real words.
- Fixed Restoration Tank crash with Create upon the tank block's destruction.
- Fixed Restoration Tank over consuming items when interacting with Create blocks.
- Fixed addons that add very many moves to a learn-set causing disappearing Pokémon (visually) issues on servers.
- Fixed Hyper Cutter and Big Pecks incorrectly stating that it prevented accuracy from being lowered in battle.
- Fixed missing messages for Rough Skin and Iron Barbs in battle.
- Fixed a bug where sometimes Pokémon sendouts wouldn't create an entity, or the entity would spawn at 0 0 0 which is not a good place for a Pokémon to be. Or any of us, really.
- Fixed issue in which a locked gilded chest would animate to the open state when the client fails to open it, such as when it is locked.
- Fixed a bug where aspects of a form would not be properly reflected on form changes (eg. Normal -> Hisui).
- Fixed generic battle effect sounds not sounding the way they were intended to.
- Fixed particle effects often not having access to some specific entity functions from MoLang.
- Fixed particles sometimes lasting a single tick too long, causing (very quick) visual glitches.
- Fixed particle rotations being inverted.
- Fixed particle events not spawning at the instigating particle's location.
- Fixed a bunch of spam during world generation.
- Fixed a bug in which throwing a Poké Ball at a player owned Pokémon with the ability Illusion would reveal its true species. Hilarious meta strategy.
- Fixed root-part animations not working for JSON posed Pokémon. You didn't notice this but if we didn't fix this in this update then if you use Quick Attack a lot you'd have seen a whole lot of [this](https://cdn.discordapp.com/attachments/1076993968803434627/1242660506783715369/Minecraft__1.20.1_-_Singleplayer_2024-05-21_22-08-17.mp4?ex=66549408&is=66534288&hm=ff95ee293eb15634fd63e6546534ea279540a1c892605e8d561593ca2c5600c5&) which is damn funny but very unintended.
### Developer
- Changed SpawnAction#complete to return a nullable generic R (the spawn action result) instead of a boolean. Provides more information this way.
- Added an event that fires when a fossil is revived, with or without a player.
- Added IVS and EVS property extractors.
- Fixed PCStore#resize not allowing PC boxes size reduction.
### Data Pack & Resource Pack Creators
- Added support for MoLang conditions for quirks and poses.
- Changed the AttackDefenceRatio requirement to StatCompare and StatEqual. There is some backwards compatibility for AttackDefenceRatio, though.
- Changed "dimensions" spawn condition to check with dimension IDs instead of effects, so custom dimension IDs can be used.
- Added parametric motion and rotation support to particle effects.
- Added entity_scale as a molang var for particles (likely only applicable to Pokemon)
- Added support for primary quirk animations using the following format:
`JSON
{
"quirks": [
"q.bedrock_primary_quirk('<pokemon>', '<animation>', <minSeconds>, <maxSeconds>, <loopTimes>, '<excludedLabels>', q.curve('<waveFunction>'))"
]
}
`
- Added support for custom stashes, similar to Gimmighoul's coin and scrap stashes.
- Added the ability to create custom brewing stand recipes.
### Localization
- Updated translations for:
- Simplified and Traditional Chinese.
- Spanish.
+5
View File
@@ -0,0 +1,5 @@
## [1.5.2 (May 27th, 2024)](#1-5-2)
### Fixes
- Fixed Wooloo and Dubwool dyeing making your game start dying. Only if you do it on a server.
- Fixed Gimmighoul causing PCs and parties to look glitched out, also only in a server.
- Fixed players being able to dye other people's sheep Pokémon.
+487
View File
@@ -0,0 +1,487 @@
## [1.6.0 - The Record Catch Update (December 25th, 2024)](#1-6-0)
#### "Now that there's a fishing mechanic, the mod is actually good!"
### Additions
- Added the Pokédex as a craftable item that can be placed on lecterns.
- Added Pokémon (and item) fishing using modified fishing rods - Poké Rods! You'll need a Poké Rod smithing template, a fishing rod, and some type of Poké Ball. Each Poké Ball makes a differently themed rod because it's cool.
- Added Lure Ball functionality, increasing the catch rate of Pokémon that were caught on a fishing rod.
- Added Repeat Ball functionality, increasing the catch rate of Pokémon that are already registered as caught in a player's Pokédex.
- Added flat level battling with options to set all Pokémon to level 50, 100, or 5 for the duration of a battle. No experience or EVs are granted for a flat battle.
- Added support for Double Battles, Triple Battles, and Multi-battles.
- Added raft platforms for non-swimming, non-flying Pokémon to stand on during battles that take place on the water's surface (Flying Pokémon will fly over water in battle, and water breathing Pokémon will swim in water during battle).
- Added smarter send-out positions for Pokémon in battle. They should get in your way less!
- CriticalCaptures and Pokédex progress capture multiplier now work with the Pokédex.
- Added shiny Pokémon particle effects and sounds to help find them.
- Added effects for the burn status effect.
- Added effects for the moves: Seismic Toss, Withdraw, Bite, Crunch, Super Fang, Hyper Fang, Pursuit, Mist, Haze, Lick, Kinesis, Psychic, Water Sport, and Mud Sport.
- Added extra visuals to early berry growth stages.
- Added Polished Tumblestone and Tumblestone Brick block sets from Tumblestone, Black Tumblestone, and Sky Tumblestone.
- Moves impacted by the abilities Pixelate, Refrigerate, Aerilate, Galvanize, and Normalize now display as their altered typing.
- Added Fire, Water, Thunder, Leaf, Ice, Sun, Moon, Shiny, Dawn, and Dusk Stone storage blocks.
- Added Eject Pack, Metronome, Protective Pads, Punching Glove, Room Service, Scope Lens, Shed Shell, Terrain Extender, Throat Spray, Utility Umbrella, Wide Lens, and Zoom Lens held items.
- Added a full evolution particle effect for Pokémon that are sent out when evolution is started.
- Added a Nurse profession that can be unlocked by having villagers claim a healing machine block.
- Pokémon are now animated when seen in any GUI that isn't the party GUI.
- Added animation and sounds for trading.
- Added icons for pending trade, team-up, and battle requests from other players.
- Quirk animations can now occur for Pokémon that are shoulder mounted.
- Added new sounds for Poké Balls bouncing off of Pokémon and landing on the ground during capture.
- Added a unique set of sounds for Ancient Poké Balls.
- Added a sound for using Exp Candy and Rare Candy items.
- Added revamped Poké Ball animation for Pokémon breaking out.
- Added battle log messages for switching out Pokémon.
- Added config setting `displayEntityNameLabel` and `displayEntityLabelsWhenCrouchingOnly` to control what and when is displayed for the pokemon label.
- Added `no_ai` and `freeze_frame` options to the `/spawnpokemon` command.
- Added `moves` option to Pokémon properties, allowing you to set the moves of a Pokémon in commands and spawn files using comma-separated move names.
- Added a `natural` block state property for the healing machine block; when property is set to true, the block will have a different texture and drop an iron ingot instead of itself.
- Added a `battleInvulnerability` gamerule to make players invulnerable to any damage during a battle.
- Added a `mobTargetInBattle` gamerule to exclude players from being targeted by mobs during a battle.
- Added a `/freezepokemon` command to pause a Pokémon's animation at a specific point in time.
- Added `/spawnnpc` and `/spawnnpcat` commands.
- Added `hiddenability=false` option to `/spawnpokemon` and `/pokemonedit` commands, allowing the Pokémon's ability to be reverted to a normal ability.
- Added `aspect` and `unaspect` PokemonProperty arguments (which also includes commands such as `/pokemonedit`, `/spawnpokemon`, and `/givepokemon`) to allow forcing or un-forcing an aspect on a Pokémon.
- Added `type` alternatively `elemental_type` PokemonProperty argument, this is only used for filtering and is not applied to Pokémon. Example `type=fire` would be true for Charmander but false for Squirtle.
### Structures Added
- Fishing boat structure that contain an Explorer Map leading to a shipwreck cove and a Poké Rod Smithing Template.
- Stonjourner Henge Ruins, Luna Henge Ruins, and Sol Henge Ruins.
- Submerged Shipwreck Cove and Lush Shipwreck Cove.
- Pokémon Centers to all 5 village types.
### Pokémon Added
#### Gen 1
- Alola Bias Cubone (built-in resource pack)
- Alolan Marowak
#### Gen 2
- Ledyba
- Ledian
- Sunkern
- Sunflora
- Wobbuffet
- Girafarig
- Corsola
- Remoraid
- Octillery
- Mantine
- Smeargle
- Delibird
#### Gen 3
- Slakoth
- Vigoroth
- Slaking
- Corphish
- Crawdaunt
- Feebas
- Milotic
- Wynaut
- Absol
- Spheal
- Sealeo
- Walrein
- Bagon
- Shelgon
- Salamence
- Kecleon
#### Gen 4
- Mantyke
- Finneon
- Lumineon
- Shellos
- Gastrodon
- Rotom
#### Gen 5
- Purrloin
- Liepard
- Scraggy
- Scrafty
#### Gen 6
- Clauncher
- Clawitzer
#### Gen 7
- Pikipek
- Trumbeak
- Toucannon
- Mareanie
- Toxapex
- Sandygast
- Palossand
- Bruxish
#### Gen 8
- Cramorant
- Hatenna
- Hattrem
- Hatterene
- Pincurchin
#### Gen 9
- Wattrel
- Kilowattrel
- Veluza
- Farigiraf
- Klawf
- Finizen
- Palafin
- Wiglett
- Wugtrio
- Flamigo
- Dondozo
#### Unique Forms
- Magikarp Jump variants for Magikarp
- Magikarp Jump variants for Gyarados (built-in resource pack, enabled by default on Fabric)
### Added cries to the following Pokémon
- Sandshrew, Sandslash
- Magnemite, Magneton, Magnezone
- Gastly, Haunter, Gengar
- Rhyhorn, Rhydon, Rhyperior
- Happiny, Chansey
- Horsea, Seadra, Kingdra
- Magby, Magmar, Magmortar
- Porygon, Porygon2, Porygon-Z
- Sentret, Furret
- Misdreavus, Mismagius
- Corsola
- Mantyke, Mantine
- Girafarig, Farigiraf
- Wynaut, Wobbuffet
- Lunatone
- Solrock
- Corphish, Crawdaunt
- Feebas, Milotic
- Kecleon
- Absol
- Spheal, Sealeo, Walrein
- Relicanth
- Bagon, Shelgon, Salamence
- Munchlax
- Finneon, Lumineon
- Purrloin, Liepard
- Timburr, Gurdurr, Conkeldurr
- Joltik, Galvantula
- Elgyem, Beheeyem
- Golett, Golurk
- Deino, Zweilous, Hydreigon
- Flabébé, Floette, Florges
- Clauncher, Clawitzer
- Mareanie, Toxapex
- Wimpod, Golisopod
- Bruxish
- Hatenna, Hattrem, Hatterene
- Pincurchin
- Klawf
- Finizen, Palafin \[Zero\], Palafin \[Hero\]
- Dondozo
### Added shoulder mounts for the following Pokémon
- Weedle
- Caterpie
- Spearow
- Mew
- Murkrow
- Smoochum
- Larvitar
- Tailow
- Plusle
- Minun
- Beldum
- Starly
- Buneary
- Combee
- Pachirisu
- Tepig
- Pidove
- Petilil, Hisui Bias Petilil
- Zorua, Hisui Bias Zorua
- Elgyem
- Fletchling
- Skrelp
- Klefki
- Litten
- Fomantis
- Morelull
- Dreepy
- Sprigatito
- Shroodle
- Tatsugiri
- Glimmet
- Gimmighoul \[Roaming\]
### Animation updates for the following Pokémon
- Bellsprout, Weepinbell, Victreebel
- Shellder, Cloyster
- Porygon, Porygon2, Porygon-Z
- Furret
- Swinub, Piloswine, Mamoswine
- Skarmory
- Tyrogue
- Spinda
- Torkoal
- Nincada, Ninjask
- Lunatone
- Solrock
- Buneary, Lopunny
- Magnezone
- Alomomola
- Tepig, Pignite, Emboar
- Flabebe, Floette, Florges
- Litten, Torracat, Incineroar
- Fomantis, Lurantis
- Dreepy, Drakloak
- Kleavor
- Scorbunny
- Gimmighoul \[Roaming\]
### Model updates for the following Pokémon
- Bulbasaur, Ivysaur, Venusaur
- Charmander, Charmeleon, Charizard
- Caterpie
- Kakuna, Beedrill
- Lapras
- Porygon, Porygon2, Porygon-Z
- Igglybuff, Jigglypuff, Wigglytuff
- Poliwhirl, Poliwrath
- Bellsprout, Weepinbell, Victreebel
- Shellder, Cloyster
- Gastly, Haunter
- Onix
- Krabby, Kingler
- Rhyhorn, Rhydon, Rhyperior
- Horsea, Seadra, Kingdra
- Goldeen, Seaking
- Magby, Magmar, Magmortar
- Magikarp, Gyarados
- Munchlax, Snorlax
- Swinub, Piloswine, Mamoswine
- Mudkip, Marshtomp, Swampert
- Baltoy, Claydol
- Carvanha
- Relicanth
- Prinplup, Empoleon
- Gible, Gabite, Garchomp
- Riolu, Lucario
- Snivy, Servine, Serperior
- Tepig, Pignite, Emboar
- Krookodile
- Dwebble, Crustle
- Joltik, Galvantula
- Klink, Klang, Klinglang
- Golett, Golurk
- Fennekin, Braixen, Delphox
- Phantump, Trevenant
- Litten, Torracat, Incineroar
- Popplio, Brionne, Primarina
- Mudbray
- Lurantis
- Scorbunny, Cinderace
- Quaxly
- Skeledirge
- Tatsugiri
### Changes
- Buffed Dusk Ball catch multipliers: Increased multiplier to 3.5 (from 3.0) in light level 0. Increased multiplier to 3.0 (from 1.5) in light levels 1-7.
- Altered the item model for Medicinal Leeks and Roasted Leeks to be held like sticks and other rod items.
- Adjusted some berry balance values like yield and growth times.
- Adjusted volumes of sounds made by Display Cases, Berry Bushes, Energy Root, Medicinal Leek, Vivichoke, Mints, Revival Herbs and Gilded Chests.
- Changes to mulch buffs/durations.
- Updated potion sprites.
- Changed Link Cable recipe to be much cheaper.
- Updated sounds for Medicinal Leeks, Big Roots, Energy Roots and Revival Herbs.
- Updated UI sounds for clicking and evolving Pokémon.
- Updated cries for Chansey, Crobat, Hoothoot, Noctowl.
- Removed the interchangeable evolution results for the first stage Hisuian starters to prevent confusion. The method still exists for stage 2 to 3, but stage 1 to 2 was not distinguishable enough for many users.
- Vivillon wings will stop being clear when you remove any Vivillon related resourcepacks. The default pattern will be the meadow wings.
- Wild Pokémon interaction range increased to 12 blocks (from 10 blocks).
- Player trade range increased to 12 blocks (from 10 blocks).
- PvP battle range increased to 32 blocks (from 10 blocks).
- Spectate range increased to 64 blocks (from 10 blocks).
- The inventory key now closes our GUIs if they are open, mirroring how Minecraft screens usually work.
- The noise from the pasture and PC blocks being interacted with now activates Sculk sensors.
- Updated dialogue GUI assets with proper assets not made by a programmer. Well, it was still a programmer, but- someone who can also draw!
- Updated party switching interface when in battle.
- Relic coin pouches can now be waterlogged.
- The "Press R to start battle prompt" will now disappear after a player's first battle has been won. You've probably figured that detail out by then.
- The default number of digits for the Pokédex number in the summary has been increased, from 3 to 4. There sure are a lot of Pokémon these days.
- The pasture block model's screen is now off by default.
- The Poké Balls creative tab is now named Utility Items as it also encompasses Poké Rod and Pokédex items.
- Moves can now be benched without specifying a replacement move, allowing for empty move slots.
- Moves learned via Sketch now persist after battle.
- Hidden Power now displays its effective typing.
- Updated particles for moves: Confusion, Protect, Sand Attack, and Quick Attack.
- Updated particles for status effects: Paralysis, Poison, and Sleep.
- Updated particles on Gastly.
- Revamped stat buff and de-buff particles.
- Improved the performance of display cases that contain Pokémon photos.
- Updated sounds for Poké Balls closing, opening and for Pokémon breaking out.
- Improved the performance of display cases that contain Pokémon Model items.
- Removed species Base Stats from the summary interface as it is now viewable within the Pokédex.
- Changed summary tab text labels to icons. You'll get used to them. Or else.
- Clicking the summary interface exit button while the swap moves or evolve screen is open will cause the interface to switch back to the party screen. The button will exit the interface otherwise.
- Ancient Poke Balls now jump once rather than shaking 3 times when capturing Pokémon.
- The jump height indicate the number of shakes that would have occurred.
- A high wobbly jump indicates 1 shake.
- A high jump indicates 2 shakes.
- A medium jump indicates 3 shakes.
- A short jump indicates that you caught the Pokémon.
- Pokémon sent out during battle will spawn facing their opponent.
- Pokémon sent out outside a battle will spawn facing their trainer.
- Wailord is now 25% bigger. ... [But I have an idea.](https://tenor.com/view/star-wars-more-gif-21856591)
- Region-biased Pokémon forms are now optional to a built-in resource pack. This pack is enabled by default for Fabric. For NeoForge users, all our built-in resource packs default to disabled because that's all it supports right now.
- Update item sprites for Cell Battery, Chipped Pot, Covert Cloak, Cracked Pot, Masterpiece Teacup, Red Card, Sachet, and Unremarkable Teacup.
### Fixes
- Fixed Ability Patches not reverting Hidden Abilities back to Normal Abilities.
- Fixed awarding Pokémon experience upon forfeiting battles.
- Scaled down Amaura's fetus model to avoid clipping through the tank while animating.
- Fixed Cubone's cry not having a sound (as if that Pokémon needed to be more tragic).
- Fixed the sendout sound erroneously playing when a wild Pokémon breaks out of a Poké ball.
- Flamethrower is no longer missing sounds.
- Fixed the Seafloor spawning context not being a usable context.
- Fixed Pokemon spawning in non-full blocks like slabs.
- Fixed Gilded Chests not dropping the chest itself when broken, only the contents.
- Fixed Pokémon losing their Hidden Ability through evolution if the middle stage did not have a Hidden Ability.
- Hidden Power no longer plays the water type action effect (It now plays the normal type action effect).
- Fixed Crumbling Arch structures not blending in with the world.
- Fixed Energy Root being usable on a fainted Pokémon.
- Fixed Pokémon not being sent out when starting a battle while recalling said Pokémon.
- Fixed species comparison not using namespace for both sides in `PokemonProperties.isSubsetOf`.
- Fixed `PokemonProperties#asString` prefixing nicknames with a '$'.
- Fixed shearable Pokémon not dropping correct wool colors.
- Fixed pasture spawning Pokémon inside solid blocks when closest spawning position is blocked off.
- Fixed Tumbling Down advancement not being granted by tumblestone variants.
- Improve error handling when loading spawn sets to ensure invalid configurations don't crash the server.
- Fixed empty `JsonPlayerData` files resulting in players being unable to join server/world.
- Sound for evolving Pokémon through the Summary Menu is now correctly playing again.
- Fix Starter prompt not showing up.
- Fixed owned Poké balls floating upwards if pausing the game mid-transition (which looked absolutely hilarious).
- Fixed all mouse buttons working for Battle UI navigation (now it's only primary/left click).
- Fixed trading Pokémon setting their friendship to 0 instead of the base value.
- Fixed a scenario where a Pokémon that rolled to spawn with a special Tera type sometimes having a Tera type that is already a part of their natural typing.
- Fixed PokemonProperty argument suggestions for `tera` and `tera_type` not suggesting `stellar`.
- Fixed being able to stack Relic Coin Pouches on top of each other.
- Fixed model loader generating misleading crash-reports when client is crashing - that resurrection tank error wasn't our fault! We're innocent, your honour!
- Big Roots and Energy Roots now share the same sounds as intended.
- Fixed sounds made by blocks playing at a lower pitch than intended.
- Fixed Chimchar and Monferno comically T posing whenever they sleep.
- Fixed Cetitan's cry breaking its walk and sleep animations.
- Fixed the Magby line not having any placeholder walk animations.
- Fixed Duskull and Dusclops using skylight levels for their nether spawn data. There is no sun in the Nether!
- Fixed Hisuian Zoroark using base Zoroark stats.
- Fixed Bellossom clipping into the player head when shoulder mounted.
- Fixed Shroomish's look range to prevent it from looking higher than it should.
- Fixed Maushold's faint animations not playing. It's even sadder than Tandemaus!
- Fixed Slowking's battle idle.
- Fixed Grafaiai's walk speed to prevent model sliding.
- Fixed Alolan Exeggutor's tail not showing in the party UI. It will now also stand in front of all Pokémon in the party menu :)
- Fixed Timburr duplicating its log while fainting.
- Fixed hitbox sizes for Grotle and Torterra being set to default values.
- Fixed Hisuian Sneasel using Johtonian Sneasel's cry. Johto-nian. Jotonion. Jotunheim?
- Fixed Trevenant T-posing after 8 seconds of sleeping. I also do that.
- Fixed Bewear T-posing for a bit if a wild one faints where you can see.
- Fixed Noctowl's placeholder fly animation.
- Corrected Lotad blinking animation.
- Fixed reviving items causing errors when used in battle.
- Fixed messages for Focus Sash, Confusion, Mummy, Ice Face, Own Tempo, and Revive.
- Improve error handling when loading spawn-sets to ensure invalid configurations don't crash the server.
- Fixed Crumbling Arch Ruins generating a giant cube of air and removed the chest.
- Fixed possible crash on large population servers due to concurrent access of data.
- Quickly sending out and recalling Pokémon now looks smoother and can no longer be spammed to cause desync issues.
- Pokémon are now invulnerable during sendout animation and intangible during recall animation.
- Scrolling with party keybinding now behaves properly when using high scroll speed or scroll sensitivity.
- Fixed battle log GUI flashing when Battle GUI is opened.
- Bag Items used during a turn will now be refunded if the battle ends before the next turn begins.
- Pokémon whose current owner is not its Original Trainer now gain extra experience.
- Fixed Fossil Resurrection advancement not being granted.
- Fixed village generation caps not applying for berry farms. You were not meant to see more than two berry farms per village! This has been broken for ages but no one noticed... Hmmm... We could just remove it from here...
- Fixed the Ice Face ability activation being displayed incorrectly in a battle.
- Fixed edge case of F1 and R locking you in battle with no R functionality (requiring ESC to get out).
- Fixed Poké Ball render orientation in battle interface when capturing.
- Fixed sync issues with recently learned moves where their PP would not go down until you logout and in.
- Fixed some Pokémon photos in display cases flashing if the Pokémon has gender differences.
- Fixed Bidoof and Jigglypuff sleep animations stopping after some time, causing them to be 'asleep' while T-posing menacingly.
- Fixed entities not changing poses unless you're looking at them.
- Fixed cries not playing on send-out if the Pokémon is off-screen.
- Fixed text row selection highlight in battle log.
- Fixed top black border rendering in scroll interfaces in summary UI.
- Fixed aspect tracking for Advancements.
- Fixed illusion not copying aspects or caught ball.
- Prevent summary stats tab from making sounds when clicking on an already open tab.
- Fixed display case not being able to be fed items from underneath.
- Fixed Pokémon battling in water continuously sinking to the bottom.
- Fixed passive healing and wake from faint not disabling when their config values are set to 0.
- Fixed an issue where rebinding the R key to a mouse button prevented players from closing the battle interface using that button.
### Developer
- `SpawnCause` is now an implementation of `SpawningInfluence`.
- Many types related to `Pokemon` including itself now have dedicated `Codec`, please migrate to them from the NBT/JSON/PacketBuffer write/read methods.
- `PokemonBattle` now starts on turn 0.
- Renamed Pokemon.hp to Pokemon.maxHealth to make it clearer. Backwards compatibility is provided but it is an active deprecation, please migrate away from it.
- Serialization of PokemonStores and Pokemon themselves now require registry access, which will break some sidemods. This sucked for us more than it will suck for you! If you have a world or player instance, you can get it from there.
- ``TeraTypes`` now implements ``Iterable``.
- Added `forcedAspects` to Pokémon to make it easier to easily add basic aspects to a Pokémon in a way that persists. We already know that everyone is going to overuse this.
- Made the `Pokemon.aspects` setter private. This could technically break side-mods but if you are affected by this then you were using it wrong! Use `Pokemon.forcedAspects` to fix it.
- Cobblemon's main logger is properly static now.
- `PokemonEntity.enablePoseTypeRecalculation` can be used to disable automatic pose type recalculation.
- Added CollectEggEvent and HatchEggEvent for compatibility usage.
- Added events for:
- Showdown Instructions
- Mega Showdown Instruction
- Terastallize Showdown Instruction
- ZPower Showdown Instruction
- Bait Consumed, Bait Set, and an event to register custom BaitEffect Functions
- Bobber Bucket Chosen
- Bobber Spawn Pokémon
- Pokérod Cast
- Pokérod Reel
- Pokémon Heal (with context)
- Added HealingSource, an interface applied to all sources of healing from player actions, for easier tracking of healing sources.
- Move Change
- Shiny Chance Calculation Event (with player context)
- Dex Information Changed (Pre and Post); this event is fired when the Pokédex is updated with new information.
- Rebuilt large swaths of the model animation code to simplify it.
- Renamed a bunch of things from %Poseable% to %Posable% because spelling.
- Renamed StatelessAnimation to PoseAnimation.
- Renamed StatefulAnimation to ActiveAnimation.
- Documented the animation system.
- Allowed for SpawnSnowstormEntityParticleHandler to handle non-posable entities (due to being non-posable, locators are useless - to set the offset use the settings in the particle itself).
- Added property chaining support for duplicate CustomPokemonPropertyType elements.
### Data Pack & Resource Pack Creators
- Added experimental `flow` datapack directory for handling events using MoLang event handlers.
- Added support for "shedders" similar to Shedinja's evolution logic.
- Fixed the placeholder `WingFlapIdle` animation so the wings are not rotating opposite to each other.
- 'player' type dialogue faces can now be explicitly stated so that NPC mods that use fake players can show in dialogue portraits.
- Added `isLeftSide` field for dialogue faces. This determines what side of dialogue box the portrait is on.
- `sounds/attacks` directory has been renamed to `sounds/move`.
- Moves sharing generic sounds now have unique sound events, allowing them to be changed with resource packs.
- All move sound events have been renamed to `move.<NAME>.<SOURCE>` for consistency.
- Status moves have been moved out of the `attacks` directory and split into volatile and nonvolatile.
- `status.badlypoison.actor` sound event has been renamed to `status.toxpoison.actor`
- Mulch and berry harvesting sound events have been renamed and moved to their respective directories in `sounds/block`.
- All sounds related to evolving Pokémon have been moved to the `sounds/evolution` directory.
- Sound events for all blocks now start with `block`.
- Gimmighoul chest and item interaction sounds have been moved to where its cry is.
- Unused sound files and sound events have been removed.
- Poké Ball sounds are now in their animation files, making them more flexible to edit.
- Added MoLang compatibility in the isVisible property for transformed parts.
- Added `q.has_aspect('some_aspect')` function to animations, posers, and entity particle effects.
- Added support for conditional pose animations.
- Added a new universal locator called "top".
- Added `eggs_collected` and `eggs_hatched` Advancement triggers.
- Added missing `minYaw` configuration to the `q.look()` function for JSON posers.
- Some pose condition names have been changed:
- `isTouchingWaterOrRain` has been changed to `isInWaterOrRain`
- `isSubermegedInWater` has been changed to `isUnderWater`
### Localization
- Updated translations for:
- Czech, German, Greek, Spanish, Mexican Spanish, French, Canadian French, Hungarian, Italian, Japanese, Korean, Dutch, Polish, Portuguese, Brazilian Portuguese, Russian, Ukrainian, Simplified Chinese, and Traditional Chinese
- Migrated translation project to Weblate at https://lang.cobblemon.com/projects/cobblemon/mod/
+219
View File
@@ -0,0 +1,219 @@
## [1.6.1 (January 26th, 2025)](#1-6-1)
### Additions
- Added crossover paintings from Close Combat: Premonition, Altar, Slumber, and Nomad.
- Added Galarica Nuts, used for crafting Galarica Cuffs and Wreaths. Dropped from certain Pokémon. Take a wild guess which.
- Added compatibility with Repurposed Structures. (Thank you, TelepathicGrunt!)
- Added an evolution method for Karrablast to evolve into Escavalier in singleplayer.
- Pokédexes can now be placed in Chiseled Bookshelves.
- Added optional box argument to the /pc command.
- Pokédex and Dialogue screens now close when the inventory keybind is pressed.
- Added config setting `maxPokedexScanningDetectionRange` to control from what distance the player can scan Pokémon using the Pokédex.
- Added config setting `hideUnimplementedPokemonInThePokedex` which hides unimplemented Pokémon from the Pokédex when set to true.
- Added debug renderer for posable entity locators.
- Added crossover paintings from Close Combat, Premonition, Altar, Slumber, and Nomad.
- Added optional box argument to the /pc command
### Changes
- Pokémon will now be dynamically revealed to the Pokédex as they're seen instead of revealing entire parties at the end of battle regardless.
- Unseen wild Pokémon will update their name from '???' to their real name as soon as a battle starts to reflect the battle UI showing the actual species name.
- Pokémon under the illusion effect will reveal their disguise to the Pokédex first and then the base Pokémon once the disguise is broken.
- Added more support for a variety of Fabric/NeoForge Convention tags.
- Reformatted some tags to be more consistent.
- Edited some recipes to utilize tags instead of direct item ids, for greater mod compatibility.
- Berries will drop if broken at age 0
- Improved Fortune drops on Mint Seeds
- New Slowpoke shiny texture.
- Updated drops for many Pokémon.
- Completely resynced Pokémon move and stat data based on later games. Learnsets have changed considerably to maximise available moves.
- Cobblemon save data now saves .old files where applicable as a means to recover from file corruption due to crashes or similar abrupt stops
### Pokémon Added
#### Gen 5
- Ducklett
- Swanna
- Shelmet
- Accelgor
- Karrablast
- Escavalier
- Rufflet
- Braviary
- Foongus
- Amoonguss
#### Gen 6
- Binacle
- Barbaracle
#### Gen 7
- Dewpider
- Araquanid
- Alolan Geodude
- Alolan Graveler
- Alolan Golem
#### Gen 8
- Galarian Slowpoke
- Galarian Slowbro
- Galarian Slowking
#### Gen 9
- Paldean Tauros
### Added cries to the following Pokémon
- All Nidorans
- Shellder, Cloyster
- Pinsir
- Tyrogue, Hitmontop
- Spinda
### Animation updates for the following Pokémon
- Primeape
- Munchlax
- Snorlax
- Poliwrath
- Goldeen
- Seaking
- Dondozo
- Wobbuffet
- Charcadet
- Armarouge
- Ceruledge
- Geodude
- Graveler
- Golem
- Sandile
- Krokorok
- Krookodile
### Model updates for the following Pokémon
- Slowpoke
- Slowbro
- Slowking
- Eiscue
- Tauros
- Goldeen
- Seaking
- Charcadet
- Armarouge
- Ceruledge
- Pinsir
- Geodude
- Graveler
- Golem
- Magnezone
### Cry updates for the following Pokémon
- Sceptile
### Changes
- Completely re-synced Pokémon move and stat data based on later games. Learnsets have changed considerably to maximise available moves.
- Pokémon will now be dynamically revealed to the Pokédex as they're seen in battle instead of revealing entire parties at the end of battle.
- Unseen wild Pokémon will update their name from '???' to their real name as soon as a battle starts to match how the battle UI shows the actual species name.
- Pokémon under the illusion effect will reveal their disguise to the Pokédex first and then the base Pokémon once the disguise is broken.
- Berries will now drop from berry trees if broken at age 0 so you aren't punished for mistaken planting.
- Increased Fortune drops on Mint Seeds.
- Updated Slowpoke's shiny texture.
- Updated drops for many Pokémon.
- Adjusted the evolution sound to match the timing of the particle effect.
- Made berry trees shear-able by dispenser blocks. I'm sure nobody will make unholy contraptions with this.
- Edited some recipes to utilize tags instead of direct item IDs, for better mod compatibility.
- Added more support for a variety of Fabric/NeoForge conventional tags.
- Reformatted some tags to be more consistent.
### Fixes
- Fixed Pokédex sometimes crashing when switching forms.
- Fixed Pokédex interface not transitioning out when closed.
- Fixed texture dimensions for the player and Pokémon interact interface.
- Fixed crash related to Tom's Simple Storage mod and the Fossil Machine.
- Fixed not being able to retrieve a fossil from the Fossil Machine with an empty hand.
- Fixed Pokémon being collidable (collidible? collissionable? kaleidoscopable?) while being captured by a Poké Ball.
- Fixed `full_party`, `own_zangoose_seviper`, `use_revive` and `use_candy` Advancement triggers.
- Fixed `healing_machine` Advancement by using the correct 1.21 trigger.
- Fix Display Cases not dropping items if destroyed through explosions.
- Fixed an issue where the first Pokémon in the pastured Pokémon list clipped into the interface.
- Fixed all Pokémon facing South on spawn.
- Fixed bait being consumed even when not reeling in any Pokémon.
- Fixed Miltank milk magically disappearing out of your bucket.
- Fixed Pokémon nicknames migrating from 1.5.2 not being displayed properly.
- Fixed capitalization in one of our config options. It was a very important fix. Very important. Old configs are fine.
- Fixed Poké Rods not working if Lure or Luck of the Sea enchantments get removed by other mods.
- Fixed crashes related to Pokémon when they are ready to evolve while holding an enchanted item. Very specific.
- Fixed a crash that sometimes occurred when evolving Nincada.
- Fixed Cobblemon plants not being compostable on NeoForge.
- Fixed hide UI (F1 key) not hiding the party overlay.
- Fixed NPC MoLang command `player_lose_command` not working.
- Fixed misaligned tooltips with edit boxes in the NPC editor screen.
- Fixed Pokémon riding two boats when attempting to deploy a platform on water.
- Fixed the summary screen showing there's experience to reach the next level when they are at the level cap.
- Fixed Pokémon forgetting moves when evolving on specific cases.
- Fixed Adorn compatibility, including improvements when using JEI/REI (Apricorn items now show up under the collapsed entries rather than standalone).
- Fixed error message appearing on battle log when using Solar Beam with Sunny Day.
- Fixed Pokémon Model offsets for larger species.
- Fixed `/pokedex grant all` command not giving male/female/shininess completion for some Pokémon.
- Fixed `/pokedex grant only` and `/pokedex remove only` not respecting the form parameter passed.
- Fixed variant forms appearing incorrectly in the Pokédex when the normal form had not been unlocked.
- Fixed Pokémon occasionally being shot into the sky during battle. No Pokémon were harmed by this bug, probably.
- Fixed NPC editing GUI not updating aspects until a game restart.
- Fixed some users being unable to open their PC if a Pokémon in it had a lot of PP raises beyond normal bounds. How did you get those, anyway? Tell me or the Bellossom gets it.
- Fixed some color variants (Dubwool, Conkeldurr and Undyed wooloo) being missing in the Pokédex.
- Fixed invalid species or held items causing Players to not be able to load into their world anymore (commonly happening after removing addons/mods).
- Fixed Wooloo variants not being automatically registered in the owner's Pokédex when dyed.
- Fixed Vivichoke Dip and Leek & Potato Stew not returning a bowl upon consumption.
- Fixed Fossil Restoration Tank not accepting Hay Bales as organic material.
- Fixed Potion items applying double their intended healing value.
- Fixed Fast Ball capture bonuses applying to all Pokémon, making it the Best Ball instead of the Mediocre Edge-Case Ball.
- Fixed "learned new move" messages appearing for already-known moves on Pokémon evolutions.
- Fixed Pokémon Item Models breaking shadows nearby when being placed in Display Cases or Item Frames.
- Fixed berries not giving bonus yields when planted in their preferred biomes. I'm sure we've fixed that 5 times now.
- Fixed the NeoForge version not supporting "SodiumDynamicLights".
- Fixed players disconnecting from servers if they made changes to certain config options.
- Fixed players with shouldered Pokémon not being able to rejoin their 1.5.2 worlds using 1.6.
- Fixed `PokemonProperties` utilizing `ability=<some ability>` being treated as a forced ability even when it is a legal ability for the Pokémon.
- Fixed type formatting in Pokédex scanner mode when dual types require two lines.
- Fixed trading sometimes crashing the game or server.
- Fixed Wild shiny sounds not respecting the `shinyNoticeParticlesDistance` config setting.
- Fixed Pokémon being able to evolve mid-battle.
- Fixed NPC held items being able to be stolen by players. Don't be a thief!
- Fixed evolutions that require a held item consuming it as soon as meeting requirements when it should only be consumed upon evolution.
- Fixed Pokémon showing only the default form when selecting them as a target in battle.
- Fixed a possible error coming out of reeling fishing rods in specific situations.
- Fixed incorrect weights being used when Poké Fishing with Luck of the Sea.
- Parametric particle motion now works.
- Event-spawned particles now work.
- Particles can now have independent coordinate spaces.
- Fixed suffocation of Pokémon when a pokeball breaks near a wall
### Developer
- Updated the Pokédex data updated events to always include a `Pokemon` instance, and optionally a `DisguiseData` instance.
- Updated fields in `SpawnNPCPacket` and `SpawnPokemonPacket` to be visible and mutable.
- Updated `UnvalidatedPlaySoundS2CPacket` to be public instead of internal and made its fields mutable.
- Added `hideNameTag` field and `HideNPCNameTag` nbt tag to `NPCEntity` to allow hiding the name tag of the NPC.
- Added the player to `PokerodReelEvent` so you know who is doing the reeling.
### MoLang & Datapacks
- Added flows for:
- `forme_change`: Triggered when a Pokémon changes form in battle.
- `mega_evolution`: Triggered when a Pokémon mega evolves in battle. (Note: Third-party mods are required for this feature currently)
- `zpower_used`: Triggered when a Pokémon uses a Z-Power move in battle. (Note: Third-party mods are required for this feature currently)
- `terastallization`: Triggered when a Pokémon terastallizes in battle. (Note: Third-party mods are required for this feature currently)
- `battle_fainted`: Triggered when a Pokémon faints in battle.
- `battle_fled`: Triggered when a player flees from battle.
- `battle_started_pre`: Triggered when a battle starts. Cancelable!
- `battle_started_post`: Triggered when a battle starts.
- `apricorn_harvested`: Triggered when an Apricorn is harvested.
- `thrown_pokeball_hit`: Triggered when a thrown Pokéball hits a Pokémon.
- `level_up`: Triggered when a Pokémon levels up.
- `pokemon_fainted`: Triggered when a Pokémon faints.
- `pokemon_gained`: Triggered when a player gains a Pokémon.
- Added MoLang functions:
- For Pokémon:
- `pokemon.apply(PokemonProperties)`: Applies the given properties to the Pokémon.
- `pokemon.owner`: Returns the owner of the Pokémon or 0.0 if there is no owner or they are not online.
- For all entities:
- `entity.is_standing_on_blocks(depth, blocks...)`: Returns whether the specified entity is standing on a specific block or set of blocks. Example usage: `q.is_standing_on_blocks(2, minecraft:sand)`
- Added NPC field:
- `hideNameTag`: Hides the name tag of the NPC.
- Added `baseScale` property to NPCs.
- Added MoLang particle queries for getting distance to targeted entities.
@@ -10,13 +10,13 @@ package com.cobblemon.mod.common
import com.cobblemon.mod.common.api.ai.CobblemonAttackTargetData
import com.cobblemon.mod.common.api.ai.CobblemonWanderControl
import com.cobblemon.mod.common.api.ai.config.CobblemonMineTargetData
import com.cobblemon.mod.common.api.dialogue.ActiveDialogue
import com.cobblemon.mod.common.api.moves.animations.ActionEffectContext
import com.mojang.serialization.Codec
import com.mojang.serialization.codecs.ListCodec
import com.mojang.serialization.codecs.PrimitiveCodec
import net.minecraft.core.BlockPos
import net.minecraft.core.GlobalPos
import net.minecraft.core.UUIDUtil
import net.minecraft.world.entity.LivingEntity
import net.minecraft.world.entity.ai.memory.MemoryModuleType
@@ -92,8 +92,6 @@ object CobblemonMemories {
val DISABLE_WALK_TO_WANTED_ITEM = register<Boolean>("disable_walk_to_wanted_item")
@JvmField
val TIME_TRYING_TO_REACH_WANTED_ITEM = register<Int>("time_trying_to_wanted_item")
@JvmField
val MINE_TARGET = register<CobblemonMineTargetData>("poke_skill_mine_target")
@JvmStatic
fun <U> register(id: String, codec: Codec<U>): MemoryModuleType<U> {
@@ -147,7 +147,6 @@ import com.cobblemon.mod.common.net.messages.server.RequestMoveSwapPacket
import com.cobblemon.mod.common.net.messages.server.RequestPlayerInteractionsPacket
import com.cobblemon.mod.common.net.messages.server.SelectStarterPacket
import com.cobblemon.mod.common.net.messages.server.SendOutPokemonPacket
import com.cobblemon.mod.common.net.messages.server.UsePokeSkillPacket
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
@@ -178,7 +177,6 @@ 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.skills.PokeSkillMinePacket
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
@@ -203,7 +201,6 @@ 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.UsePokeSkillHandler
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
@@ -235,7 +232,6 @@ 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.skills.PokeSkillMinePacketHandler
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
@@ -329,7 +325,6 @@ object CobblemonNetwork {
list.add(PacketRegisterInfo(MarkingsUpdatePacket.ID, MarkingsUpdatePacket::decode, PokemonUpdatePacketHandler()))
list.add(PacketRegisterInfo(RideBoostsUpdatePacket.ID, RideBoostsUpdatePacket::decode, PokemonUpdatePacketHandler()))
list.add(PacketRegisterInfo(RideStaminaUpdatePacket.ID, RideStaminaUpdatePacket::decode, PokemonUpdatePacketHandler()))
list.add(PacketRegisterInfo(SkillCooldownsUpdatePacket.ID, SkillCooldownsUpdatePacket::decode, PokemonUpdatePacketHandler()))
// Evolution start
list.add(PacketRegisterInfo(AddEvolutionPacket.ID, AddEvolutionPacket::decode, PokemonUpdatePacketHandler()))
@@ -427,7 +422,6 @@ object CobblemonNetwork {
list.add(PacketRegisterInfo(BehaviourSyncPacket.ID, BehaviourSyncPacket::decode, DataRegistrySyncPacketHandler()))
list.add(PacketRegisterInfo(MarkRegistrySyncPacket.ID, MarkRegistrySyncPacket::decode, DataRegistrySyncPacketHandler()))
list.add(PacketRegisterInfo(RideSettingsSyncPacket.ID, RideSettingsSyncPacket::decode, RideSettingsSyncHandler))
list.add(PacketRegisterInfo(PokeSkillsRegistrySyncPacket.ID, PokeSkillsRegistrySyncPacket::decode, DataRegistrySyncPacketHandler()))
// Effects
list.add(PacketRegisterInfo(SpawnSnowstormParticlePacket.ID, SpawnSnowstormParticlePacket::decode, SpawnSnowstormParticleHandler))
@@ -517,7 +511,6 @@ object CobblemonNetwork {
// Interaction Packets
list.add(PacketRegisterInfo(InteractPokemonPacket.ID, InteractPokemonPacket::decode, InteractPokemonHandler))
list.add(PacketRegisterInfo(RequestPlayerInteractionsPacket.ID, RequestPlayerInteractionsPacket::decode, RequestInteractionsHandler))
list.add(PacketRegisterInfo(UsePokeSkillPacket.ID, UsePokeSkillPacket::decode, UsePokeSkillHandler))
// Storage Packets
list.add(PacketRegisterInfo(SendOutPokemonPacket.ID, SendOutPokemonPacket::decode, SendOutPokemonHandler))
@@ -617,9 +610,6 @@ object CobblemonNetwork {
list.add(PacketRegisterInfo(SetEntityBehaviourPacket.ID, SetEntityBehaviourPacket::decode, SetEntityBehaviourHandler))
list.add(PacketRegisterInfo(DamageOnCollisionPacket.ID, DamageOnCollisionPacket::decode, DamageOnCollisionPacketHandler))
// Poké Skills
list.add(PacketRegisterInfo(PokeSkillMinePacket.ID, PokeSkillMinePacket::decode, PokeSkillMinePacketHandler))
// Debug
list.add(PacketRegisterInfo(RequestOpenRidingStatsDebugGUIPacket.ID, RequestOpenRidingStatsDebugGUIPacket::decode, RequestOpenRidingStatsDebugGUIHandler))
@@ -1,68 +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
import com.cobblemon.mod.common.CobblemonNetwork.sendPacket
import com.cobblemon.mod.common.api.data.JsonDataRegistry
import com.cobblemon.mod.common.api.molang.ExpressionLike
import com.cobblemon.mod.common.api.moves.animations.ActionEffectTimeline
import com.cobblemon.mod.common.api.reactive.SimpleObservable
import com.cobblemon.mod.common.entity.pokemon.PokeSkill
import com.cobblemon.mod.common.net.messages.client.data.PokeSkillsRegistrySyncPacket
import com.cobblemon.mod.common.pokemon.Pokemon
import com.cobblemon.mod.common.util.adapters.ActionEffectTimelineAdapter
import com.cobblemon.mod.common.util.adapters.ExpressionLikeAdapter
import com.cobblemon.mod.common.util.adapters.IdentifierAdapter
import com.cobblemon.mod.common.util.adapters.TextAdapter
import com.cobblemon.mod.common.util.cobblemonResource
import com.google.gson.GsonBuilder
import com.google.gson.reflect.TypeToken
import net.minecraft.network.chat.Component
import net.minecraft.resources.ResourceLocation
import net.minecraft.server.level.ServerPlayer
import net.minecraft.server.packs.PackType
import net.minecraft.world.entity.player.Player
/**
* The JSON data registry for all the possible [PokeSkill]s.
*
* @author Hiroku
* @since August 31st, 2025
*/
object CobblemonPokeSkills : JsonDataRegistry<PokeSkill> {
override val id = cobblemonResource("poke_skills")
override val type = PackType.SERVER_DATA
override val observable = SimpleObservable<CobblemonPokeSkills>()
override val typeToken = TypeToken.get(PokeSkill::class.java)
override val resourcePath = "poke_skills"
override val gson = GsonBuilder()
.setPrettyPrinting()
.registerTypeAdapter(ExpressionLike::class.java, ExpressionLikeAdapter)
.registerTypeAdapter(ActionEffectTimeline::class.java, ActionEffectTimelineAdapter)
.registerTypeAdapter(ResourceLocation::class.java, IdentifierAdapter)
.registerTypeAdapter(Component::class.java, TextAdapter)
.create()
var skills = mapOf<ResourceLocation, PokeSkill>()
fun getAccessibleSkills(player: Player, pokemon: Pokemon): List<PokeSkill> {
return skills.values.filter { it.canAccess(player, pokemon) }
}
override fun reload(data: Map<ResourceLocation, PokeSkill>) {
data.forEach { (id, skill) -> skill.id = id }
skills = data
observable.emit(this)
Cobblemon.LOGGER.info("Loaded ${skills.size} PokéSkills")
}
override fun sync(player: ServerPlayer) {
player.sendPacket(PokeSkillsRegistrySyncPacket(skills.values.toList()))
}
}
@@ -1,9 +0,0 @@
package com.cobblemon.mod.common.api.ai.config
import net.minecraft.core.BlockPos
import net.minecraft.core.Direction
class CobblemonMineTargetData(
val blockPos: BlockPos,
val direction: Direction,
)
@@ -1,36 +0,0 @@
package com.cobblemon.mod.common.api.ai.config.task
import com.cobblemon.mod.common.CobblemonMemories
import com.cobblemon.mod.common.api.ai.BehaviourConfigurationContext
import com.cobblemon.mod.common.api.ai.WrapperLivingEntityTask.Companion.wrapped
import com.cobblemon.mod.common.api.npc.configuration.MoLangConfigVariable
import com.cobblemon.mod.common.entity.ai.PokeSkillMineTask
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
import net.minecraft.world.entity.LivingEntity
import net.minecraft.world.entity.ai.behavior.BehaviorControl
import net.minecraft.world.entity.ai.memory.MemoryModuleType
class PokeSkillMineTaskConfig : SingleTaskConfig {
override fun getVariables(
entity: LivingEntity,
behaviourConfigurationContext: BehaviourConfigurationContext
): List<MoLangConfigVariable> {
return listOf()
}
override fun createTask(
entity: LivingEntity,
behaviourConfigurationContext: BehaviourConfigurationContext
): BehaviorControl<in LivingEntity>? {
if (entity !is PokemonEntity) {
return null
}
behaviourConfigurationContext.addMemories(
CobblemonMemories.MINE_TARGET,
MemoryModuleType.WALK_TARGET,
)
return PokeSkillMineTask().wrapped<PokemonEntity>()
}
}
@@ -123,7 +123,6 @@ interface TaskConfig {
cobblemonResource("target_entity") to TargetEntityTaskConfig::class.java,
cobblemonResource("memory_aspect") to MemoryAspectTaskConfig::class.java,
cobblemonResource("activity_change") to ActivityChangeTaskConfig::class.java,
cobblemonResource("poke_skill_mine") to PokeSkillMineTaskConfig::class.java,
)
}
@@ -22,7 +22,6 @@ import com.cobblemon.mod.common.Cobblemon
import com.cobblemon.mod.common.CobblemonActivities
import com.cobblemon.mod.common.CobblemonBlockEntities
import com.cobblemon.mod.common.CobblemonMemories
import com.cobblemon.mod.common.CobblemonPokeSkills
import com.cobblemon.mod.common.CobblemonUnlockableWallpapers
import com.cobblemon.mod.common.Environment
import com.cobblemon.mod.common.api.ai.CobblemonBlockPosTracker
@@ -77,7 +76,6 @@ import com.cobblemon.mod.common.battles.BattleFormat
import com.cobblemon.mod.common.battles.BattleRegistry
import com.cobblemon.mod.common.battles.actor.PlayerBattleActor
import com.cobblemon.mod.common.battles.actor.PokemonBattleActor
import com.cobblemon.mod.common.client.CobblemonClient
import com.cobblemon.mod.common.client.render.models.blockbench.wavefunction.WaveFunctions
import com.cobblemon.mod.common.entity.MoLangScriptingEntity
import com.cobblemon.mod.common.entity.PosableEntity
@@ -96,9 +94,6 @@ import com.cobblemon.mod.common.pokemon.Gender
import com.cobblemon.mod.common.pokemon.IVs
import com.cobblemon.mod.common.pokemon.Pokemon
import com.cobblemon.mod.common.pokemon.Species
import com.cobblemon.mod.common.pokemon.activestate.ActivePokemonState
import com.cobblemon.mod.common.pokemon.activestate.SentOutState
import com.cobblemon.mod.common.pokemon.activestate.ShoulderedState
import com.cobblemon.mod.common.pokemon.ai.ObtainableItem
import com.cobblemon.mod.common.pokemon.ai.ObtainableItemCondition
import com.cobblemon.mod.common.pokemon.evolution.variants.ItemInteractionEvolution
@@ -109,7 +104,6 @@ import com.mojang.datafixers.util.Either
import java.util.UUID
import kotlin.math.sqrt
import kotlin.random.Random
import net.minecraft.client.player.AbstractClientPlayer
import net.minecraft.commands.arguments.EntityAnchorArgument
import net.minecraft.core.BlockPos
import net.minecraft.core.Holder
@@ -612,33 +606,7 @@ object MoLangFunctions {
return@put DoubleValue.ZERO
}
}
if (player is AbstractClientPlayer) {
map.put("is_battling") {
DoubleValue(CobblemonClient.battle?.spectating == false) // Checks not-null and not-spectating at the same time, trust
}
}
if (player is ServerPlayer) {
map.put("ride") { params ->
val entity = (params.get<MoValue>(0) as? ObjectValue<*>)?.obj as? Entity ?: return@put DoubleValue.ZERO
player.startRiding(entity)
}
map.put("has_respawn_position") {
DoubleValue(player.respawnPosition != null)
}
map.put("respawn_position") {
player.respawnPosition?.toArrayStruct() ?: DoubleValue.ZERO
}
map.put("respawn_dimension") {
StringValue(player.respawnDimension.location().toString())
}
map.put("teleport_to_respawn") {
val respawnPosition = player.respawnPosition?.center ?: return@put DoubleValue.ZERO
player.teleportTo(respawnPosition.x, respawnPosition.y, respawnPosition.z)
DoubleValue.ONE
}
map.put("is_battling") {
DoubleValue(player.isInBattle())
}
map.put("seen_credits") { _ ->
DoubleValue(player.seenCredits)
}
@@ -866,13 +834,6 @@ object MoLangFunctions {
map.put("delta_movement") {
return@put listOf(entity.deltaMovement.x, entity.deltaMovement.y, entity.deltaMovement.z).asArrayValue(::DoubleValue)
}
map.put("set_position") { params ->
val x = params.getDouble(0)
val y = params.getDouble(1)
val z = params.getDouble(2)
entity.setPos(x, y, z)
return@put DoubleValue.ONE
}
map.put("tags") {
val tags = entity.tags
val array = ArrayStruct(hashMapOf())
@@ -1009,7 +970,6 @@ object MoLangFunctions {
map.put("vertical_velocity") { DoubleValue(entity.deltaMovement.y) }
map.put("is_on_ground") { _ -> DoubleValue(entity.onGround()) }
map.put("world") { _ -> entity.level().worldRegistry.wrapAsHolder(entity.level()).asWorldMoLangValue() }
map.put("dimension") { _ -> StringValue(entity.level().dimension().location().toString()) }
map.put("biome") { _ -> entity.level().getBiome(entity.blockPosition()).asBiomeMoLangValue() }
map.put("is_passenger") { DoubleValue(entity.isPassenger) }
map.put("find_nearby_block") { params ->
@@ -1276,10 +1236,6 @@ object MoLangFunctions {
return@put DoubleValue.ZERO
}
}
map.put("is_passenger") { params ->
val passengerEntity = (params.get<MoValue>(0) as? ObjectValue<*>)?.obj as? LivingEntity ?: return@put DoubleValue.ZERO
return@put DoubleValue(passengerEntity in entity.passengers)
}
if (entity is PathfinderMob) {
map.put("walk_to") { params ->
val x = params.getDouble(0)
@@ -1744,7 +1700,7 @@ object MoLangFunctions {
return@put aspects.asArrayValue { StringValue(it) }
}
map.put("form_name") {
StringValue(pokemon.form.name)
StringValue(pokemon.form.name.toString())
}
// Yes, this is the lazy call for a single hardcoded pre-evolution.
// Lol. Lmao, even.
@@ -1937,29 +1893,6 @@ object MoLangFunctions {
evolution?.forceEvolve(pokemon)
StringValue(evolution.toString())
}
map.put("is_sent_out") {
DoubleValue(pokemon.state is SentOutState)
}
map.put("is_shouldered") {
DoubleValue(pokemon.state is ShoulderedState)
}
map.put("entity") {
(pokemon.state as? ActivePokemonState)?.entity?.struct ?: DoubleValue.ZERO
}
map.put("is_rideable") {
return@put DoubleValue(!pokemon.riding.behaviours.isNullOrEmpty())
}
map.put("has_status") { params ->
val status = params.getString(0).asIdentifierDefaultingNamespace()
return@put DoubleValue(pokemon.status?.status?.name == status)
}
map.put("add_skill_cooldown") { params ->
val skillId = params.getString(0).asIdentifierDefaultingNamespace()
val cooldownTicks = params.getIntOrNull(1)
val skill = CobblemonPokeSkills.skills[skillId] ?: return@put DoubleValue.ZERO
pokemon.addSkillCooldown(skillId, cooldownTicks ?: skill.cooldownTicks)
return@put DoubleValue.ONE
}
map
}
)
@@ -2364,7 +2297,7 @@ object MoLangFunctions {
map.put("max_selectable_times") { DoubleValue(dropEntry.maxSelectableTimes.toDouble()) }
map.put("can_drop") { params ->
val pokemon = params.getOrNull<ObjectValue<Pokemon>>(0)?.obj
DoubleValue(dropEntry.canDrop(pokemon))
DoubleValue(if (dropEntry.canDrop(pokemon)) 1.0 else 0.0)
}
map
}
@@ -2626,11 +2559,11 @@ object MoLangFunctions {
)
value.functions.put("is_in") {
val tag = TagKey.create(key, ResourceLocation.parse(it.getString(0).replace("#", "")))
return@put DoubleValue(value.obj.`is`(tag))
return@put DoubleValue(if (value.obj.`is`(tag)) 1.0 else 0.0)
}
value.functions.put("is_of") {
val identifier = ResourceLocation.parse(it.getString(0))
return@put DoubleValue(value.obj.`is`(identifier))
return@put DoubleValue(if (value.obj.`is`(identifier)) 1.0 else 0.0)
}
return value
}
@@ -50,7 +50,7 @@ class ActionEffectTimeline(
}
fun chainKeyframes(context: ActionEffectContext, iterator: Iterator<ActionEffectKeyframe>, finalFuture: CompletableFuture<Unit>) {
if (!iterator.hasNext() || context.cancelled) {
if (!iterator.hasNext()) {
finalFuture.complete(Unit)
} else {
val keyframe = iterator.next()
@@ -70,7 +70,6 @@ class ActionEffectContext(
val runtime: MoLangRuntime,
var canBeInterrupted: Boolean = false,
var interrupted: Boolean = false,
var cancelled: Boolean = false,
var currentKeyframes: MutableList<ActionEffectKeyframe> = mutableListOf(),
var level: Level? = null
) {
@@ -57,7 +57,6 @@ object ActionEffects : JsonDataRegistry<ActionEffectTimeline> {
ActionEffectKeyframe.register<RunActionEffectKeyframe>("run_action_effect")
ActionEffectKeyframe.register<EntityParticlesActionEffectKeyframe>("entity_particles")
ActionEffectKeyframe.register<EntitySoundActionEffectKeyframe>("entity_sound")
ActionEffectKeyframe.register<CancelActionEffectKeyframe>("cancel")
}
override val gson = GsonBuilder()
@@ -1,19 +0,0 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.api.moves.animations.keyframes
import com.cobblemon.mod.common.api.moves.animations.ActionEffectContext
import java.util.concurrent.CompletableFuture
class CancelActionEffectKeyframe : ConditionalActionEffectKeyframe() {
override fun playWhenTrue(context: ActionEffectContext): CompletableFuture<Unit> {
context.cancelled = true
return CompletableFuture.completedFuture(Unit)
}
}
@@ -8,6 +8,8 @@
package com.cobblemon.mod.common.api.moves.animations.keyframes
import com.bedrockk.molang.runtime.struct.QueryStruct
import com.cobblemon.mod.common.Cobblemon
import com.cobblemon.mod.common.api.molang.ExpressionLike
import com.cobblemon.mod.common.api.moves.animations.ActionEffectContext
import com.cobblemon.mod.common.api.scheduling.delayedFuture
@@ -102,7 +102,7 @@ open class PlayerPartyStore(
for (pokemon in this) {
// Awake from fainted
if (pokemon.isFainted()) {
// Skip awaken logic check if config value is 0
//Skip awaken logic check if config value is 0
if (Cobblemon.config.faintAwakenHealthPercent > 0) {
pokemon.faintedTimer -= 1
if (pokemon.faintedTimer <= -1) {
@@ -119,7 +119,7 @@ open class PlayerPartyStore(
}
// Passive healing while less than full health
else if (pokemon.currentHealth < pokemon.maxHealth) {
// Skip passive healing logic check if config value is 0
//Skip passive healing logic check if config value is 0
if (Cobblemon.config.healPercent > 0) {
pokemon.healTimer--
if (pokemon.healTimer <= -1) {
@@ -159,7 +159,7 @@ open class PlayerPartyStore(
// Interaction Cooldown
if (pokemon.interactionCooldowns.any()) {
pokemon.tickInteractionCooldowns()
pokemon.tickInteractionCooldown()
}
pokemon.features.filterIsInstance<TickingSpeciesFeature>().forEach { it.onSecondPassed(player.serverLevel(), pokemon, null) }
@@ -180,8 +180,12 @@ open class PCStore(
removeDuplicates()
unlockedWallpapers.addAll(nbt.getList(DataKeys.STORE_UNLOCKED_WALLPAPERS, Tag.TAG_STRING.toInt()).map { ResourceLocation.parse(it.asString) })
unseenWallpapers.addAll(nbt.getList(DataKeys.STORE_UNSEEN_WALLPAPERS, Tag.TAG_STRING.toInt()).map { ResourceLocation.parse(it.asString) })
if (nbt.contains(DataKeys.STORE_UNLOCKED_WALLPAPERS)) {
unlockedWallpapers.addAll(nbt.getList(DataKeys.STORE_UNLOCKED_WALLPAPERS, Tag.TAG_STRING.toInt()).map { ResourceLocation.parse(it.asString) })
}
if (nbt.contains(DataKeys.STORE_UNSEEN_WALLPAPERS)) {
unseenWallpapers.addAll(nbt.getList(DataKeys.STORE_UNSEEN_WALLPAPERS, Tag.TAG_STRING.toInt()).map { ResourceLocation.parse(it.asString) })
}
return this
}
@@ -226,8 +230,12 @@ open class PCStore(
removeDuplicates()
unlockedWallpapers.addAll(json.getAsJsonArray(DataKeys.STORE_UNLOCKED_WALLPAPERS).map { ResourceLocation.parse(it.asString) })
unseenWallpapers.addAll(json.getAsJsonArray(DataKeys.STORE_UNSEEN_WALLPAPERS).map { ResourceLocation.parse(it.asString) })
if (json.has(DataKeys.STORE_UNLOCKED_WALLPAPERS)) {
unlockedWallpapers.addAll(json.getAsJsonArray(DataKeys.STORE_UNLOCKED_WALLPAPERS).map { ResourceLocation.parse(it.asString) })
}
if (json.has(DataKeys.STORE_UNSEEN_WALLPAPERS)) {
unseenWallpapers.addAll(json.getAsJsonArray(DataKeys.STORE_UNSEEN_WALLPAPERS).map { ResourceLocation.parse(it.asString) })
}
return this
}
@@ -17,6 +17,7 @@ import com.cobblemon.mod.common.api.pasture.PastureLinkManager
import com.cobblemon.mod.common.api.scheduling.afterOnServer
import com.cobblemon.mod.common.api.text.italicise
import com.cobblemon.mod.common.api.text.red
import com.cobblemon.mod.common.api.text.textClickHandlers
import com.cobblemon.mod.common.block.PastureBlock
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
import com.cobblemon.mod.common.net.messages.client.effect.SpawnSnowstormEntityParticlePacket
@@ -112,7 +113,7 @@ class PokemonPastureBlockEntity(pos: BlockPos, state: BlockState) :
pokemon.tickMetabolism()
}
if (pokemon.interactionCooldowns.any()) {
pokemon.tickInteractionCooldowns()
pokemon.tickInteractionCooldown()
}
}
blockEntity.togglePastureOn(blockEntity.getInRangeViewerCount(world, blockEntity.blockPos) > 0)
@@ -165,7 +165,7 @@ object CobblemonClient {
PlatformEvents.CLIENT_TICK_POST.subscribe { event ->
val player = event.client.player
if (player != null) {
val selectedItem = player.inventory.getItem(player.inventory.selected)
var selectedItem = player.inventory.getItem(player.inventory.selected)
if (pokedexUsageContext.scanningGuiOpen &&
!(selectedItem.`is`(CobblemonItemTags.POKEDEX)) &&
!(player.offhandItem.`is`(CobblemonItemTags.POKEDEX) &&
@@ -180,8 +180,6 @@ object CobblemonClient {
return@subscribe
}
storage.party.forEach { it?.tickSkillCooldowns() }
val nearbyPokemon = player.level().getEntities(
player,
AABB.ofSize(player.position(), 16.0, 16.0, 16.0)
@@ -141,7 +141,11 @@ class RideControlsOverlay : Gui(Minecraft.getInstance()) {
showSneakKey = false
}
BurstBehaviour.KEY -> {}
DolphinBehaviour.KEY -> {}
DolphinBehaviour.KEY -> {
disableHorizontalMovementKeys = true
showSneakKey = false
showJumpKey = false
}
GliderBehaviour.KEY -> {}
HelicopterBehaviour.KEY -> {}
HorseBehaviour.KEY -> {
@@ -28,7 +28,7 @@ class InteractWheelButton(
private val tooltipText: String?,
x: Int,
y: Int,
private val isEnabled: () -> Boolean,
private val isEnabled: Boolean,
private val colour: () -> Vector3f?,
onPress: OnPress,
private val canHover: (Double, Double) -> Boolean
@@ -74,12 +74,12 @@ class InteractWheelButton(
y = y,
width = width,
height = height,
vOffset = if (isHovered(mouseX.toFloat(), mouseY.toFloat()) && isEnabled()) height else 0,
vOffset = if (isHovered(mouseX.toFloat(), mouseY.toFloat()) && isEnabled) height else 0,
textureHeight = height * 2,
alpha = if (isEnabled()) 1f else 0.4F
alpha = if (isEnabled) 1f else 0.4F
)
if (isEnabled() && isHovered(mouseX.toFloat(), mouseY.toFloat())){
if(isEnabled && isHovered(mouseX.toFloat(), mouseY.toFloat())){
tooltipText?.let {
context.renderTooltip(Minecraft.getInstance().font, Component.translatable(it), mouseX, mouseY)
}
@@ -95,7 +95,7 @@ class InteractWheelButton(
y = iconY,
width = ICON_SIZE,
height = ICON_SIZE,
alpha = if (isEnabled()) 1F else 0.2F,
alpha = if (isEnabled) 1F else 0.2F,
red = colour.x,
green = colour.y,
blue = colour.z,
@@ -114,7 +114,7 @@ class InteractWheelButton(
y = iconY - ICON_SIZE,
width = ICON_SIZE,
height = ICON_SIZE,
alpha = if (isEnabled()) 1F else 0.4F,
alpha = if (isEnabled) 1F else 0.4F,
red = colour.x,
green = colour.y,
blue = colour.z,
@@ -95,7 +95,7 @@ class InteractWheelGUI(private val options: Multimap<Orientation, InteractWheelO
tooltipText = option?.tooltipText,
x = x,
y = y,
isEnabled = { option != null && option.enabled() },
isEnabled = option != null && option.enabled,
colour = option?.colour ?: { null },
onPress = { option?.onPress?.invoke() },
canHover = { a: Double, b: Double -> !isMouseInCenter(a, b)}
@@ -9,24 +9,20 @@
package com.cobblemon.mod.common.client.gui.interact.wheel
import com.cobblemon.mod.common.CobblemonNetwork
import com.cobblemon.mod.common.CobblemonPokeSkills
import com.cobblemon.mod.common.api.events.CobblemonEvents
import com.cobblemon.mod.common.api.events.pokemon.interaction.PokemonInteractionGUICreationEvent
import com.cobblemon.mod.common.client.CobblemonClient
import com.cobblemon.mod.common.client.gui.interact.battleRequest.BattleConfigureGUI
import com.cobblemon.mod.common.net.messages.client.PlayerInteractOptionsPacket
import com.cobblemon.mod.common.net.messages.server.UsePokeSkillPacket
import com.cobblemon.mod.common.net.messages.server.battle.SpectateBattlePacket
import com.cobblemon.mod.common.net.messages.server.pokemon.interact.InteractPokemonPacket
import com.cobblemon.mod.common.net.messages.server.trade.AcceptTradeRequestPacket
import com.cobblemon.mod.common.net.messages.server.trade.OfferTradePacket
import com.cobblemon.mod.common.pokemon.Pokemon
import com.cobblemon.mod.common.util.cobblemonResource
import com.google.common.collect.ArrayListMultimap
import com.google.common.collect.Multimap
import java.util.UUID
import net.minecraft.client.Minecraft
import net.minecraft.client.player.AbstractClientPlayer
import net.minecraft.network.chat.Component
import org.joml.Vector3f
@@ -34,7 +30,7 @@ fun createPokemonInteractGui(pokemonID: UUID, canMountShoulder: Boolean, canGive
val mountShoulder = InteractWheelOption(
iconResource = cobblemonResource("textures/gui/interact/interact_wheel_icon_shoulder.png"),
tooltipText = "cobblemon.ui.interact.mount.shoulder",
enabled = { canMountShoulder },
enabled = canMountShoulder,
onPress = {
if (canMountShoulder) {
InteractPokemonPacket(pokemonID, InteractTypePokemon.SHOULDER).sendToServer()
@@ -45,7 +41,7 @@ fun createPokemonInteractGui(pokemonID: UUID, canMountShoulder: Boolean, canGive
val giveHeldItem = InteractWheelOption(
iconResource = cobblemonResource("textures/gui/interact/interact_wheel_icon_held_item.png"),
tooltipText = "cobblemon.ui.interact.give.item",
enabled = { canGiveHeld },
enabled = canGiveHeld,
onPress = {
if (canGiveHeld) {
InteractPokemonPacket(pokemonID, InteractTypePokemon.HELD_ITEM).sendToServer()
@@ -56,7 +52,7 @@ fun createPokemonInteractGui(pokemonID: UUID, canMountShoulder: Boolean, canGive
val giveCosmeticItem = InteractWheelOption(
iconResource = cobblemonResource("textures/gui/interact/interact_wheel_icon_cosmetic_item.png"),
tooltipText = "cobblemon.ui.interact.give.cosmetic_item",
enabled = { canGiveCosmetic },
enabled = canGiveCosmetic,
onPress = {
if (canGiveCosmetic) {
InteractPokemonPacket(pokemonID, InteractTypePokemon.COSMETIC_ITEM).sendToServer()
@@ -68,7 +64,7 @@ fun createPokemonInteractGui(pokemonID: UUID, canMountShoulder: Boolean, canGive
val ride = InteractWheelOption(
iconResource = cobblemonResource("textures/gui/interact/interact_wheel_icon_ride.png"),
tooltipText = "cobblemon.ui.interact.ride",
enabled = { canRide },
enabled = canRide,
onPress = {
if (canRide) {
InteractPokemonPacket(pokemonID, InteractTypePokemon.RIDE).sendToServer()
@@ -181,35 +177,6 @@ fun createPlayerInteractGui(optionsPacket: PlayerInteractOptionsPacket): Interac
return InteractWheelGUI(options, Component.translatable("cobblemon.ui.interact.player"))
}
fun createPokeSkillGui(player: AbstractClientPlayer, pokemon: Pokemon): InteractWheelGUI {
val accessibleSkills = CobblemonPokeSkills.getAccessibleSkills(player, pokemon)
val options: Multimap<Orientation, InteractWheelOption> = ArrayListMultimap.create()
for (skill in accessibleSkills) {
val skillOption = InteractWheelOption(
iconResource = skill.icon,
enabled = { skill.id !in pokemon.skillCooldownsTicks },
tooltipText = skill.name,
onPress = {
CobblemonNetwork.sendToServer(UsePokeSkillPacket(skillId = skill.id, pokemonId = pokemon.uuid))
closeGUI()
}
)
when (options.size()) {
0 -> options.put(Orientation.NORTH, skillOption)
1 -> options.put(Orientation.NORTHEAST, skillOption)
2 -> options.put(Orientation.SOUTHEAST, skillOption)
3 -> options.put(Orientation.SOUTH, skillOption)
4 -> options.put(Orientation.SOUTHWEST, skillOption)
5 -> options.put(Orientation.NORTHWEST, skillOption)
6 -> options.put(Orientation.WEST, skillOption)
7 -> options.put(Orientation.EAST, skillOption)
else -> break // We only have 8 slots
}
}
return InteractWheelGUI(options, Component.translatable("cobblemon.ui.interact.poke_skill"))
}
private fun getLangKey(status: PlayerInteractOptionsPacket.OptionStatus) : String {
return when (status) {
PlayerInteractOptionsPacket.OptionStatus.TOO_FAR -> "cobblemon.ui.interact.too_far"
@@ -14,7 +14,7 @@ import org.joml.Vector3f
data class InteractWheelOption(
val iconResource: ResourceLocation,
val secondaryIconResource: ResourceLocation? = null,
val enabled: () -> Boolean = { true },
val enabled: Boolean = true,
val tooltipText: String?,
val colour: () -> Vector3f? = { null },
val onPress: () -> Unit
@@ -38,7 +38,6 @@ object CobblemonKeyBinds {
val PARTY_OVERLAY_DOWN = this.queue(DownShiftPartyBinding)
val PARTY_OVERLAY_UP = this.queue(UpShiftPartyBinding)
val SEND_OUT_POKEMON = this.queue(PartySendBinding)
val OPEN_POKE_SKILLS_WHEEL = this.queue(OpenPokeSkillsWheelBinding)
fun register(registrar: (KeyMapping) -> Unit) {
this.keyBinds.forEach(registrar::invoke)
@@ -1,17 +0,0 @@
package com.cobblemon.mod.common.client.keybind.keybinds
import com.cobblemon.mod.common.client.keybind.CobblemonKeyBinding
import com.cobblemon.mod.common.client.keybind.KeybindCategories
import com.cobblemon.mod.common.net.messages.server.pokemon.skills.PokeSkillMinePacket
import com.mojang.blaze3d.platform.InputConstants
object OpenPokeSkillsWheelBinding : CobblemonKeyBinding(
"key.cobblemon.open_poke_skills_wheel",
InputConstants.Type.KEYSYM,
InputConstants.KEY_B,
KeybindCategories.COBBLEMON_CATEGORY
) {
override fun onPress() {
PokeSkillMinePacket().sendToServer()
}
}
@@ -15,7 +15,6 @@ import com.cobblemon.mod.common.battles.BattleFormat
import com.cobblemon.mod.common.client.CobblemonClient
import com.cobblemon.mod.common.client.battle.ClientBattle
import com.cobblemon.mod.common.client.gui.battle.BattleGUI
import com.cobblemon.mod.common.client.gui.interact.wheel.createPokeSkillGui
import com.cobblemon.mod.common.client.keybind.CobblemonBlockingKeyBinding
import com.cobblemon.mod.common.client.keybind.KeybindCategories
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
@@ -27,12 +26,12 @@ import com.cobblemon.mod.common.pokemon.Pokemon
import com.cobblemon.mod.common.util.isUsingPokedex
import com.cobblemon.mod.common.util.traceFirstEntityCollision
import com.mojang.blaze3d.platform.InputConstants
import kotlin.math.pow
import net.minecraft.client.Minecraft
import net.minecraft.client.player.LocalPlayer
import net.minecraft.world.entity.LivingEntity
import net.minecraft.world.entity.player.Player
import net.minecraft.world.level.ClipContext
import kotlin.math.pow
object PartySendBinding : CobblemonBlockingKeyBinding(
"key.cobblemon.throwpartypokemon",
@@ -40,7 +39,6 @@ object PartySendBinding : CobblemonBlockingKeyBinding(
InputConstants.KEY_R,
KeybindCategories.COBBLEMON_CATEGORY
) {
const val POKE_SKILL_TIME = 0.7F
var canApplyChange = true
var heldDownSeconds = 0F
@@ -55,19 +53,7 @@ object PartySendBinding : CobblemonBlockingKeyBinding(
override fun onTick() {
if (wasDown) {
if (heldDownSeconds < 100) {
val couldRunSkill = heldDownSeconds < POKE_SKILL_TIME
heldDownSeconds += Minecraft.getInstance().timer.getGameTimeDeltaPartialTick(false)
if (couldRunSkill && heldDownSeconds >= POKE_SKILL_TIME && canApplyChange) {
val player = Minecraft.getInstance().player
val selectedPokemon = CobblemonClient.storage.party.get(CobblemonClient.storage.selectedSlot)
if (selectedPokemon != null && player != null) {
canApplyChange = false
val gui = createPokeSkillGui(player, selectedPokemon)
Minecraft.getInstance().setScreen(gui)
}
}
}
} else {
heldDownSeconds = 0F
@@ -119,8 +105,7 @@ object PartySendBinding : CobblemonBlockingKeyBinding(
entityClass = LivingEntity::class.java,
ignoreEntity = player,
maxDistance = Cobblemon.config.battleSpectateMaxDistance,
collideBlock = ClipContext.Fluid.NONE
)
collideBlock = ClipContext.Fluid.NONE)
if (canSendOutPokemon(player, targetEntity)) {
sendToServer(SendOutPokemonPacket(CobblemonClient.storage.selectedSlot))
} else {
@@ -142,13 +127,10 @@ object PartySendBinding : CobblemonBlockingKeyBinding(
//The server sends a packet back that opens the player interaction menu with the proper options
sendToServer(RequestPlayerInteractionsPacket(entity.uuid, entity.id, pokemon.uuid))
}
is PokemonEntity -> {
if (!entity.canBattle(player) || entity.position()
.distanceToSqr(player.position()) > Cobblemon.config.battleWildMaxDistance.pow(2)
) return
sendToServer(BattleChallengePacket(entity.id, pokemon.uuid, BattleFormat.GEN_9_SINGLES))
}
if (!entity.canBattle(player) || entity.position().distanceToSqr(player.position()) > Cobblemon.config.battleWildMaxDistance.pow(2)) return
sendToServer(BattleChallengePacket(entity.id, pokemon.uuid, BattleFormat.GEN_9_SINGLES))
}
}
}
@@ -23,6 +23,7 @@ import com.cobblemon.mod.common.duck.CameraDuck
import com.cobblemon.mod.common.duck.RidePassenger
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
import com.cobblemon.mod.common.util.math.geometry.toRadians
import com.cobblemon.mod.common.util.toVec3d
import com.mojang.blaze3d.Blaze3D
import net.minecraft.client.Camera
import net.minecraft.client.CameraType
@@ -37,6 +38,7 @@ import org.joml.Quaternionf
import org.joml.Vector3f
import kotlin.math.min
import kotlin.math.sign
import kotlin.math.sqrt
object MountedCameraRenderer {
private var returnTimer: Float = 0f
@@ -77,15 +79,16 @@ object MountedCameraRenderer {
// Get additional offset from poser and add to the eyeHeight offset
val currEyeHeight: Double = Mth.lerp(instance.partialTickTime.toDouble(), eyeHeight, eyeHeightOld)
val offset = Vector3f(0f, (currEyeHeight - (driver.bbHeight / 2)).toFloat(), 0f)
val eyeOffset = Vector3f(0f, (currEyeHeight - (driver.bbHeight / 2)).toFloat(), 0f)
var offset = Vec3(0.0, currEyeHeight - (driver.bbHeight / 2), 0.0)
var eyeOffset = Vec3(0.0, currEyeHeight - (driver.bbHeight / 2), 0.0)
val locatorOffset = Vec3(locator.matrix.getTranslation(Vector3f()))
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.add(getFirstPersonOffset(model, locatorName))
eyeOffset = eyeOffset.add(getFirstPersonOffset(model, locatorName))
// Get the offset based on first person, third person, or third person with view bobbing enabled from the posers.
offset.add(
offset = offset.add(
if (isFirstPerson) {
getFirstPersonOffset(model, locatorName)
} else /* if (Cobblemon.config.thirdPersonViewBobbing) */ {
@@ -100,17 +103,15 @@ object MountedCameraRenderer {
else Quaternionf()
.rotateY((Math.PI.toFloat() - Mth.lerp(instance.partialTickTime, vehicle.yRotO, vehicle.yRot).toRadians()))
rotation.transform(offset)
rotation.transform(eyeOffset)
offset = rotation.transform(offset.toVector3f()).toVec3d()
eyeOffset = rotation.transform(eyeOffset.toVector3f()).toVec3d()
val eyeLocatorOffset = Vec3(locator.matrix.getTranslation(Vector3f()))
val eyePos = eyeLocatorOffset.add(entityPos).toVector3f()
val eyePos = locatorOffset.add(entityPos)
// Get the camera position before offsets are applied (which are done with maxZoom to account for clipping). If 3rd person viewbobbing is enabled or the player is
// in first person then base the camera position off the seat locator offset
val pos = /* if (isFirstPerson || Cobblemon.config.thirdPersonViewBobbing) { */
Vec3(locator.matrix.getTranslation(Vector3f()))
.add(entityPos).toVector3f()
locatorOffset.add(entityPos)
/* } else {
val pokemonCenter = Vector3f(0f, driver.bbHeight/2, 0f)
@@ -124,18 +125,18 @@ object MountedCameraRenderer {
} */
val offsetDistance = offset.length()
val offsetDirection = offset.mul(1 / offsetDistance)
val offsetDirection = offset.scale(1 / offsetDistance)
val eyeOffsetDistance = eyeOffset.length()
val eyeOffsetDirection = eyeOffset.mul(1 / eyeOffsetDistance)
val eyeOffsetDirection = eyeOffset.scale(1 / eyeOffsetDistance)
// Use getMaxZoom to calculate clipping
val maxZoom: Float = getMaxZoom(offsetDistance, offsetDirection, pos, instance)
val eyeMaxZoom: Float = getMaxZoom(eyeOffsetDistance, eyeOffsetDirection, eyePos, instance)
val maxZoom: Double = getMaxZoom(offsetDistance, offsetDirection, pos, instance)
val eyeMaxZoom: Double = getMaxZoom(eyeOffsetDistance, eyeOffsetDirection, eyePos, instance)
val playerRotater = driver as RidePassenger
playerRotater.`cobblemon$setRideEyePos`(Vec3(eyeOffsetDirection.mul(eyeMaxZoom).add(eyePos)))
return Vec3(offsetDirection.mul(maxZoom).add(pos))
playerRotater.`cobblemon$setRideEyePos`(eyeOffsetDirection.scale(eyeMaxZoom).add(eyePos))
return offsetDirection.scale(maxZoom).add(pos)
}
// Return value is false if the vanilla camera rotations should be applied.
@@ -324,41 +325,40 @@ object MountedCameraRenderer {
cameraOffsets: Map<String, Vec3>,
locatorName: String,
shouldFlip: Boolean = true
): Vector3f {
val offset = if (thirdPersonReverse && cameraOffsets.containsKey(locatorName + "_reverse")) {
cameraOffsets[locatorName + "_reverse"]!!.toVector3f()
): Vec3 {
var offset = if (thirdPersonReverse && cameraOffsets.containsKey(locatorName + "_reverse")) {
cameraOffsets[locatorName + "_reverse"]!!
} else if (cameraOffsets.containsKey(locatorName)) {
cameraOffsets[locatorName]!!.toVector3f()
cameraOffsets[locatorName]!!
} else {
Vector3f(0f, 0f, 0f)
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.
if (thirdPersonReverse && shouldFlip) offset.z *= -1
if (thirdPersonReverse && shouldFlip) offset = offset.multiply(1.0, 1.0, -1.0)
return offset
}
private fun getFirstPersonOffset(model: PosableModel, locatorName: String): Vector3f {
private fun getFirstPersonOffset(model: PosableModel, locatorName: String): Vec3 {
val cameraOffsets = model.firstPersonCameraOffset
return if (cameraOffsets.containsKey(locatorName)) {
cameraOffsets[locatorName]!!.toVector3f()
cameraOffsets[locatorName]!!
} else {
Vector3f(0f, 0f, 0f)
Vec3.ZERO
}
}
private fun getMaxZoom(maxZoom: Float, directionVector: Vector3f, positionVector: Vector3f, instance: Camera): Float {
private fun getMaxZoom(maxZoom: Double, directionVector: Vec3, positionVector: Vec3, instance: Camera): Double {
var maxZoom = maxZoom
val pos = Vec3(positionVector)
for (i in 0 .. 7) {
val g = ((i and 1) * 2 - 1).toFloat()
val h = ((i shr 1 and 1) * 2 - 1).toFloat()
val j = ((i shr 2 and 1) * 2 - 1).toFloat()
val vec3 = pos.add((g * 0.1f).toDouble(), (h * 0.1f).toDouble(), (j * 0.1f).toDouble())
val vec32 = vec3.add(Vec3(directionVector).scale(maxZoom.toDouble()))
val vec3 = positionVector.add((g * 0.1f).toDouble(), (h * 0.1f).toDouble(), (j * 0.1f).toDouble())
val vec32 = vec3.add(directionVector.scale(maxZoom))
val level = (instance as CameraDuck).`cobblemon$getLevel`()
val hitResult: HitResult = level.clip(
ClipContext(
@@ -370,9 +370,9 @@ object MountedCameraRenderer {
)
)
if (hitResult.type != HitResult.Type.MISS) {
val k = hitResult.getLocation().distanceToSqr(pos).toFloat()
val k = hitResult.getLocation().distanceToSqr(positionVector)
if (k < Mth.square(maxZoom)) {
maxZoom = Mth.sqrt(k)
maxZoom = sqrt(k)
}
}
}
@@ -14,7 +14,6 @@ import com.cobblemon.mod.common.CobblemonBehaviours
import com.cobblemon.mod.common.CobblemonCallbacks
import com.cobblemon.mod.common.CobblemonCosmeticItems
import com.cobblemon.mod.common.CobblemonMechanics
import com.cobblemon.mod.common.CobblemonPokeSkills
import com.cobblemon.mod.common.CobblemonRideSettings
import com.cobblemon.mod.common.CobblemonUnlockableWallpapers
import com.cobblemon.mod.common.api.abilities.Abilities
@@ -78,7 +77,6 @@ object CobblemonDataProvider : DataProvider {
this.register(GlobalSpeciesFeatures, reloadable = false)
this.register(SpeciesFeatureAssignments, reloadable = false)
this.register(ActionEffects, reloadable = true)
this.register(CobblemonPokeSkills, reloadable = true)
this.register(Moves, reloadable = false)
this.register(Abilities, reloadable = false)
this.register(CobblemonBehaviours, reloadable = false)
@@ -22,7 +22,6 @@ import net.minecraft.world.entity.ai.memory.WalkTarget
import net.minecraft.world.entity.ai.util.DefaultRandomPos
import net.minecraft.world.level.pathfinder.Path
import net.minecraft.world.level.pathfinder.PathType
import net.minecraft.world.level.pathfinder.WalkNodeEvaluator
import net.minecraft.world.phys.Vec3
class FollowWalkTargetTask(
@@ -1,91 +0,0 @@
package com.cobblemon.mod.common.entity.ai
import com.cobblemon.mod.common.CobblemonMemories
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
import com.google.common.collect.ImmutableMap
import net.minecraft.core.BlockPos
import net.minecraft.core.Direction
import net.minecraft.server.level.ServerLevel
import net.minecraft.world.entity.ai.behavior.Behavior
import net.minecraft.world.entity.ai.behavior.BlockPosTracker
import net.minecraft.world.entity.ai.memory.MemoryModuleType
import net.minecraft.world.entity.ai.memory.MemoryStatus
import net.minecraft.world.entity.ai.memory.WalkTarget
class PokeSkillMineTask : Behavior<PokemonEntity>(
ImmutableMap.of(
CobblemonMemories.MINE_TARGET, MemoryStatus.VALUE_PRESENT,
MemoryModuleType.WALK_TARGET, MemoryStatus.REGISTERED,
),
Int.MAX_VALUE,
Int.MAX_VALUE,
) {
override fun checkExtraStartConditions(level: ServerLevel, entity: PokemonEntity): Boolean {
val mineTarget = entity.brain.getMemory(CobblemonMemories.MINE_TARGET).orElse(null) ?: return false
val blockPos = mineTarget.blockPos
return !level.isEmptyBlock(blockPos)
}
override fun canStillUse(level: ServerLevel, entity: PokemonEntity, gameTime: Long): Boolean {
val mineTarget = entity.brain.getMemory(CobblemonMemories.MINE_TARGET).orElse(null) ?: return false
val blockPos = mineTarget.blockPos
return !level.isEmptyBlock(blockPos)
}
override fun tick(level: ServerLevel, entity: PokemonEntity, gameTime: Long) {
val mineTarget = entity.brain.getMemory(CobblemonMemories.MINE_TARGET).orElse(null) ?: return
val blockPos = mineTarget.blockPos
val direction = mineTarget.direction
val walkPos = blockPos.relative(direction)
entity.brain.setMemory(
MemoryModuleType.WALK_TARGET,
WalkTarget(BlockPosTracker(walkPos), 1f, 0)
)
val distSq = entity.distanceToSqr(blockPos.center)
if (distSq <= 5.0) {
val blocksToMine = get3x3AreaAround(blockPos, direction)
for (blockToMine in blocksToMine ) {
val state = level.getBlockState(blockToMine)
if (!state.isAir) {
level.destroyBlock(blockToMine, true, entity)
}
}
entity.brain.eraseMemory(CobblemonMemories.MINE_TARGET)
}
}
fun get3x3AreaAround(pos: BlockPos, face: Direction): List<BlockPos> {
val list = mutableListOf<BlockPos>()
when (face) {
Direction.UP, Direction.DOWN -> {
// Horizontal 3×3 (x/z)
for (dx in -1..1)
for (dz in -1..1)
list += pos.offset(dx, 0, dz)
}
Direction.NORTH, Direction.SOUTH -> {
// Vertical 3×3 (x/y)
for (dx in -1..1)
for (dy in -1..1)
list += pos.offset(dx, dy, 0)
}
Direction.EAST, Direction.WEST -> {
// Vertical 3×3 (z/y)
for (dz in -1..1)
for (dy in -1..1)
list += pos.offset(0, dy, dz)
}
}
return list
}
}
@@ -417,9 +417,12 @@ class EmptyPokeBallEntity : ThrowableItemProjectile, PosableEntity, WaterDragMod
discard()
}
after(seconds = 0.1F) {
pokemon.after(seconds = 0.1F) {
pokemon.beamMode = 0
pokemon.busyLocks.remove(this)
}
after(seconds = 0.1F) {
captureFuture.complete(false)
val ballType =
this.pokeBall.name.path.lowercase().replace("_", "")
@@ -1,118 +0,0 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.entity.pokemon
import com.bedrockk.molang.runtime.MoLangRuntime
import com.bedrockk.molang.runtime.value.StringValue
import com.cobblemon.mod.common.api.molang.ExpressionLike
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asMostSpecificMoLangValue
import com.cobblemon.mod.common.api.molang.MoLangFunctions.setup
import com.cobblemon.mod.common.api.moves.animations.ActionEffectContext
import com.cobblemon.mod.common.api.moves.animations.ActionEffectTimeline
import com.cobblemon.mod.common.api.moves.animations.TargetsProvider
import com.cobblemon.mod.common.api.moves.animations.UsersProvider
import com.cobblemon.mod.common.api.pokemon.status.Statuses
import com.cobblemon.mod.common.pokemon.Pokemon
import com.cobblemon.mod.common.util.asExpressionLike
import com.cobblemon.mod.common.util.codec.EXPRESSION_LIKE_CODEC
import com.cobblemon.mod.common.util.isInBattle
import com.cobblemon.mod.common.util.resolveBoolean
import com.cobblemon.mod.common.util.withQueryValue
import com.mojang.serialization.Codec
import com.mojang.serialization.codecs.RecordCodecBuilder
import net.minecraft.network.codec.ByteBufCodecs
import net.minecraft.resources.ResourceLocation
import net.minecraft.server.level.ServerPlayer
import net.minecraft.world.entity.player.Player
/**
* The reference object for a skill that a Pokémon can use in the overworld.
*
* @author Hiroku
* @since August 31st, 2025
*/
class PokeSkill(
val name: String,
val enabled: Boolean = true,
val actionEffect: ActionEffectTimeline,
val icon: ResourceLocation,
val cooldownTicks: Int,
val accessCondition: ExpressionLike = "true".asExpressionLike(),
val useCondition: ExpressionLike = "true".asExpressionLike()
) {
companion object {
val runtime = MoLangRuntime().setup()
val CODEC = RecordCodecBuilder.create<PokeSkill> { instance ->
instance.group(
Codec.STRING.fieldOf("name").forGetter { it.name },
Codec.BOOL.fieldOf("enabled").forGetter { it.enabled },
Codec.unit<ActionEffectTimeline> { ActionEffectTimeline.NONE }.fieldOf("actionEffect").forGetter { it.actionEffect },
ResourceLocation.CODEC.fieldOf("icon").forGetter { it.icon },
Codec.INT.fieldOf("cooldownTicks").forGetter { it.cooldownTicks },
EXPRESSION_LIKE_CODEC.fieldOf("accessCondition").forGetter { it.accessCondition },
EXPRESSION_LIKE_CODEC.fieldOf("useCondition").forGetter { it.useCondition }
).apply(instance, ::PokeSkill)
}
val PACKET_CODEC = ByteBufCodecs.fromCodecWithRegistries(CODEC)
}
@Transient
lateinit var id: ResourceLocation
fun canAccess(player: Player, pokemon: Pokemon): Boolean {
if (!enabled) {
return false
}
runtime.withQueryValue("player", player.asMostSpecificMoLangValue())
runtime.withQueryValue("pokemon", pokemon.struct)
val hasAccess = runtime.resolveBoolean(accessCondition)
return hasAccess
}
fun canUse(player: Player, pokemon: Pokemon): Boolean {
val status = pokemon.status?.status
if (id in pokemon.skillCooldownsTicks || player.isInBattle() || status == Statuses.SLEEP || status == Statuses.FROZEN) {
return false
}
runtime.withQueryValue("player", player.asMostSpecificMoLangValue())
runtime.withQueryValue("pokemon", pokemon.struct)
val canUse = runtime.resolveBoolean(useCondition)
return canUse
}
fun use(
player: ServerPlayer,
pokemon: Pokemon,
// context information!!!
): Boolean {
if (!canUse(player, pokemon)) return false
val runtime = MoLangRuntime().setup()
runtime.withQueryValue("player", player.asMostSpecificMoLangValue())
runtime.withQueryValue("pokemon", pokemon.struct)
runtime.withQueryValue("skill_id", StringValue(id.toString()))
// put the context in the coconut
// blablabalbalbal doing that now
val providers = mutableListOf<Any>(TargetsProvider(player))
pokemon.entity?.let { providers.add(UsersProvider(it)) }
// build the context
val actionEffectContext = ActionEffectContext(
actionEffect = actionEffect,
runtime = runtime,
providers = providers,
)
// run the thing. Store the context on the pokemon so we know we have one running? prevent it from doing another? idk man
val future = actionEffect.run(actionEffectContext)
return true
}
}
@@ -1257,6 +1257,11 @@ open class PokemonEntity(
override fun canBeSeenAsEnemy() = super.canBeSeenAsEnemy() && !isBusy
override fun doHurtTarget(target: Entity): Boolean {
if (beamMode != 0) return false
return super.doHurtTarget(target)
}
override fun hurt(source: DamageSource, amount: Float): Boolean {
return if (super.hurt(source, amount)) {
effects.mockEffect?.takeIf { it is IllusionEffect && this.battleId == null }?.end(this)
@@ -9,6 +9,7 @@
package com.cobblemon.mod.common.entity.pokemon.ai.tasks
import com.bedrockk.molang.Expression
import com.cobblemon.mod.common.CobblemonMemories
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asMostSpecificMoLangValue
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
import com.cobblemon.mod.common.util.mainThreadRuntime
@@ -17,6 +18,7 @@ import com.cobblemon.mod.common.util.resolveFloat
import com.cobblemon.mod.common.util.resolveInt
import com.cobblemon.mod.common.util.withQueryValue
import kotlin.math.abs
import kotlin.math.ceil
import net.minecraft.core.BlockPos
import net.minecraft.util.RandomSource
import net.minecraft.world.entity.Entity
@@ -44,20 +46,24 @@ object MoveToOwnerTask {
if (!condition) {
return@Trigger false
}
val teleportDistance = mainThreadRuntime.resolveFloat(teleportDistance)
val maxDistance = mainThreadRuntime.resolveFloat(maxDistance)
val speedMultiplier = mainThreadRuntime.resolveFloat(speedMultiplier)
val completionRange = mainThreadRuntime.resolveInt(completionRange)
if (entity.distanceTo(owner) > teleportDistance) {
val horizontalHitboxRadius = maxOf(entity.boundingBox.xsize, entity.boundingBox.zsize) / 2
if (entity.distanceTo(owner) - horizontalHitboxRadius > teleportDistance) {
if (tryTeleport(entity, owner)) {
entity.brain.eraseMemory(MemoryModuleType.LOOK_TARGET)
entity.brain.eraseMemory(MemoryModuleType.WALK_TARGET)
}
return@Trigger true
} else if (entity.distanceTo(owner) > maxDistance && it.tryGet(walkTarget).isEmpty) {
} else if (entity.distanceTo(owner) - horizontalHitboxRadius > maxDistance && it.tryGet(walkTarget).isEmpty && !entity.brain.hasMemoryValue(CobblemonMemories.PATH_COOLDOWN)) {
entity.brain.setMemoryWithExpiry(CobblemonMemories.PATH_COOLDOWN, true, 60L)
entity.brain.setMemory(MemoryModuleType.LOOK_TARGET, EntityTracker(owner, true))
entity.brain.setMemory(MemoryModuleType.WALK_TARGET, WalkTarget(owner, speedMultiplier, completionRange))
entity.brain.setMemory(MemoryModuleType.WALK_TARGET, WalkTarget(owner, speedMultiplier, maxOf(completionRange, ceil(horizontalHitboxRadius).toInt()) - 1))
return@Trigger true
}
return@Trigger false
@@ -20,13 +20,12 @@ object ServerTickHandler {
secondsTick++
// Party tick
for (player in server.playerList.players) {
val party = player.party()
party.forEach { it.tickSkillCooldowns() }
if (secondsTick == 20) {
secondsTick = 0
party.onSecondPassed(player)
if (secondsTick == 20) {
secondsTick = 0
// Party tick
for (player in server.playerList.players) {
player.party().onSecondPassed(player)
}
}
}
@@ -1,38 +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.net.messages.client.data
import com.cobblemon.mod.common.CobblemonPokeSkills
import com.cobblemon.mod.common.entity.pokemon.PokeSkill
import com.cobblemon.mod.common.util.cobblemonResource
import net.minecraft.network.RegistryFriendlyByteBuf
class PokeSkillsRegistrySyncPacket(
pokeSkills: Collection<PokeSkill>
) : DataRegistrySyncPacket<PokeSkill, PokeSkillsRegistrySyncPacket>(pokeSkills) {
override val id = ID
override fun encodeEntry(buffer: RegistryFriendlyByteBuf, entry: PokeSkill) {
PokeSkill.PACKET_CODEC.encode(buffer, entry)
}
override fun decodeEntry(buffer: RegistryFriendlyByteBuf): PokeSkill? {
return PokeSkill.PACKET_CODEC.decode(buffer)
}
override fun synchronizeDecoded(entries: Collection<PokeSkill>) {
CobblemonPokeSkills.reload(entries.associateBy { it.id })
}
companion object {
val ID = cobblemonResource("poke_skill_sync")
fun decode(buffer: RegistryFriendlyByteBuf) = PokeSkillsRegistrySyncPacket(emptyList()).apply { decodeBuffer(buffer) }
}
}
@@ -1,51 +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.net.messages.client.pokemon.update
import com.cobblemon.mod.common.net.IntSize
import com.cobblemon.mod.common.pokemon.Pokemon
import com.cobblemon.mod.common.util.cobblemonResource
import com.cobblemon.mod.common.util.readSizedInt
import com.cobblemon.mod.common.util.writeSizedInt
import net.minecraft.network.RegistryFriendlyByteBuf
import net.minecraft.resources.ResourceLocation
/**
* Packet that adds a single skill cooldown to a Pokémon's skill cooldowns map.
*
* @author Hiroku
* @since August 31st, 2025
*/
class SkillCooldownsUpdatePacket(
pokemon: () -> Pokemon?,
val skillId: ResourceLocation,
val cooldownTicks: Int
) : SingleUpdatePacket<Pair<ResourceLocation, Int>, SkillCooldownsUpdatePacket>(pokemon, skillId to cooldownTicks) {
override val id: ResourceLocation = ID
override fun encodeValue(buffer: RegistryFriendlyByteBuf) {
buffer.writeResourceLocation(skillId)
buffer.writeSizedInt(IntSize.U_SHORT, cooldownTicks)
}
override fun set(pokemon: Pokemon, value: Pair<ResourceLocation, Int>) {
val (skillId, cooldownTicks) = value
pokemon.skillCooldownsTicks[skillId] = cooldownTicks
}
companion object {
val ID = cobblemonResource("skill_cooldowns_update")
fun decode(buffer: RegistryFriendlyByteBuf): SkillCooldownsUpdatePacket {
val pokemon = decodePokemon(buffer)
val skillId = buffer.readResourceLocation()
val cooldownTicks = buffer.readSizedInt(IntSize.U_SHORT)
return SkillCooldownsUpdatePacket(pokemon, skillId, cooldownTicks)
}
}
}
@@ -1,47 +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.net.messages.server
import com.cobblemon.mod.common.api.net.NetworkPacket
import java.util.UUID
import net.minecraft.network.RegistryFriendlyByteBuf
import net.minecraft.resources.ResourceLocation
/**
* Packet sent by the client to the server to indicate that it wants to use a Poké Skill.
*
* The server will validate if the skill can be used, and if so, will execute it.
*
* @param skillId The ID of the skill to use.
* @param pokemonId The UUID of the Pokémon using the skill.
*
* @author Hiroku
* @since August 31st, 2025
*/
class UsePokeSkillPacket(
val skillId: ResourceLocation,
val pokemonId: UUID,
) : NetworkPacket<UsePokeSkillPacket> {
override val id: ResourceLocation = ID
override fun encode(buffer: RegistryFriendlyByteBuf) {
buffer.writeResourceLocation(skillId)
buffer.writeUUID(pokemonId)
}
companion object {
val ID = ResourceLocation("cobblemon", "use_poke_skill")
fun decode(buffer: RegistryFriendlyByteBuf): UsePokeSkillPacket {
return UsePokeSkillPacket(
buffer.readResourceLocation(),
buffer.readUUID()
)
}
}
}
@@ -1,16 +0,0 @@
package com.cobblemon.mod.common.net.messages.server.pokemon.skills
import com.cobblemon.mod.common.api.net.NetworkPacket
import com.cobblemon.mod.common.util.cobblemonResource
import net.minecraft.network.RegistryFriendlyByteBuf
class PokeSkillMinePacket() : NetworkPacket<PokeSkillMinePacket> {
override val id = ID
override fun encode(buffer: RegistryFriendlyByteBuf) {
}
companion object {
val ID = cobblemonResource("poke_skill_mine")
fun decode(buffer: RegistryFriendlyByteBuf) = PokeSkillMinePacket()
}
}
@@ -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.net.serverhandling
import com.cobblemon.mod.common.CobblemonPokeSkills
import com.cobblemon.mod.common.api.net.ServerNetworkPacketHandler
import com.cobblemon.mod.common.net.messages.server.UsePokeSkillPacket
import com.cobblemon.mod.common.util.party
import net.minecraft.server.MinecraftServer
import net.minecraft.server.level.ServerPlayer
object UsePokeSkillHandler : ServerNetworkPacketHandler<UsePokeSkillPacket> {
override fun handle(packet: UsePokeSkillPacket, server: MinecraftServer, player: ServerPlayer) {
val party = player.party()
val pokemon = party[packet.pokemonId] ?: return // Who?
val skill = CobblemonPokeSkills.getAccessibleSkills(player, pokemon).firstOrNull { it.id == packet.skillId } ?: return // What skill?
if (skill.canUse(player, pokemon)) {
skill.use(player, pokemon)
}
}
}
@@ -1,43 +0,0 @@
package com.cobblemon.mod.common.net.serverhandling.pokemon.skills
import com.cobblemon.mod.common.Cobblemon
import com.cobblemon.mod.common.CobblemonMemories
import com.cobblemon.mod.common.api.ai.config.CobblemonMineTargetData
import com.cobblemon.mod.common.api.net.ServerNetworkPacketHandler
import com.cobblemon.mod.common.net.messages.server.pokemon.skills.PokeSkillMinePacket
import com.cobblemon.mod.common.pokemon.activestate.ActivePokemonState
import com.cobblemon.mod.common.pokemon.activestate.ShoulderedState
import com.cobblemon.mod.common.util.raycast
import net.minecraft.server.MinecraftServer
import net.minecraft.server.level.ServerPlayer
import net.minecraft.world.level.ClipContext
import net.minecraft.world.phys.HitResult
object PokeSkillMinePacketHandler : ServerNetworkPacketHandler<PokeSkillMinePacket> {
override fun handle(
packet: PokeSkillMinePacket,
server: MinecraftServer,
player: ServerPlayer
) {
val rayCastHitResult = player.raycast(5f, ClipContext.Fluid.NONE)
if (rayCastHitResult.type != HitResult.Type.BLOCK) {
return
}
val party = Cobblemon.storage.getParty(player)
val pokemon = party.get(0) ?: return
val state = pokemon.state
if (state is ShoulderedState || state !is ActivePokemonState) {
return
}
val pokemonEntity = state.entity
if (pokemonEntity == null) {
return
}
val mineTargetData = CobblemonMineTargetData(rayCastHitResult.blockPos, rayCastHitResult.direction)
pokemonEntity.brain.setMemory(CobblemonMemories.MINE_TARGET, mineTargetData)
}
}
@@ -678,8 +678,6 @@ open class Pokemon : ShowdownIdentifiable {
val riding: RidingProperties
get() = this.form.riding
var skillCooldownsTicks: MutableMap<ResourceLocation, Int> = mutableMapOf()
init {
storeCoordinates.subscribe { if (it != null && it.store !is PCStore && this.tetheringId != null) afterOnServer(seconds = 0.05F) { this.tetheringId = null } }
storeCoordinates.subscribe {
@@ -1039,23 +1037,13 @@ open class Pokemon : ShowdownIdentifiable {
this.interactionCooldowns.remove(group)
}
open fun tickInteractionCooldowns() {
open fun tickInteractionCooldown() {
this.interactionCooldowns.entries.forEach { (key, value) ->
val newValue = value - 1
if (newValue <= 0)
this.interactionCooldowns -= key
if(newValue <= 0)
this.interactionCooldowns.remove(key)
else
this.interactionCooldowns[key] = newValue
}
}
fun tickSkillCooldowns() {
this.skillCooldownsTicks.entries.forEach { (key, value) ->
val newValue = value - 1
if (newValue <= 0)
this.skillCooldownsTicks -= key
else
this.skillCooldownsTicks[key] = newValue
this.interactionCooldowns.put(key, newValue)
}
}
@@ -1376,6 +1364,10 @@ open class Pokemon : ShowdownIdentifiable {
return result
}
fun recalculateCharacteristic() {
this.characteristic = Characteristic.calculate(this.ivs, this.uuid)
}
open fun copyFrom(other: Pokemon): Pokemon {
this.isClient = other.isClient
this.uuid = other.uuid
@@ -1437,6 +1429,7 @@ open class Pokemon : ShowdownIdentifiable {
this.potentialMarks.clear()
this.potentialMarks += other.marks
this.markings = other.markings
this.recalculateCharacteristic()
this.updateAspects()
this.refreshOriginalTrainer()
this.initialize()
@@ -2108,11 +2101,6 @@ open class Pokemon : ShowdownIdentifiable {
return true
}
fun addSkillCooldown(skillId: ResourceLocation, cooldownTicks: Int) {
skillCooldownsTicks[skillId] = cooldownTicks
onChange(SkillCooldownsUpdatePacket({ this }, skillId, cooldownTicks))
}
fun notify(packet: PokemonUpdatePacket<*>) {
storeCoordinates.get()?.run { sendPacketToPlayers(store.getObservingPlayers(), packet) }
}
@@ -16,6 +16,9 @@ import com.google.common.collect.Maps
import it.unimi.dsi.fastutil.longs.Long2ObjectFunction
import it.unimi.dsi.fastutil.longs.Long2ObjectMap
import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap
import java.util.EnumSet
import java.util.function.Predicate
import kotlin.math.max
import net.minecraft.core.BlockPos
import net.minecraft.core.Direction
import net.minecraft.tags.BlockTags
@@ -27,15 +30,17 @@ import net.minecraft.world.level.PathNavigationRegion
import net.minecraft.world.level.block.BaseRailBlock
import net.minecraft.world.level.block.Blocks
import net.minecraft.world.level.block.FenceGateBlock
import net.minecraft.world.level.block.state.BlockState
import net.minecraft.world.level.material.FluidState
import net.minecraft.world.level.pathfinder.*
import net.minecraft.world.level.pathfinder.Node
import net.minecraft.world.level.pathfinder.NodeEvaluator
import net.minecraft.world.level.pathfinder.PathComputationType
import net.minecraft.world.level.pathfinder.PathType
import net.minecraft.world.level.pathfinder.PathfindingContext
import net.minecraft.world.level.pathfinder.Target
import net.minecraft.world.level.pathfinder.WalkNodeEvaluator
import net.minecraft.world.phys.AABB
import net.minecraft.world.phys.Vec3
import java.util.*
import java.util.function.Predicate
import kotlin.math.max
import net.minecraft.world.level.block.state.BlockState
/**
@@ -118,7 +123,7 @@ class OmniPathNodeMaker : NodeEvaluator() {
return if (!canFly() && d - nodeFloorLevel > this.getMobJumpHeight()) {
null
} else {
var pathType2: PathType = this.getPathTypeOfMob(this.currentContext, x, y, z, this.mob)
var pathType2: PathType = this.getNodeType(this.mob, x, y, z)
if (pathType2 == PathType.WALKABLE && direction == Direction.UP) {
pathType2 = PathType.OPEN
@@ -190,7 +195,7 @@ class OmniPathNodeMaker : NodeEvaluator() {
if (y - i > mob.maxFallDistance) {
return this.getBlockedNode(x, i, z)
}
val pathType: PathType = this.getPathTypeOfMob(this.currentContext, x, i, z, this.mob)
val pathType: PathType = this.getNodeType(this.mob, x, i, z)
val f = mob.getPathfindingMalus(pathType)
if (pathType != PathType.OPEN) {
return if (f >= 0.0f) {
@@ -206,7 +211,7 @@ class OmniPathNodeMaker : NodeEvaluator() {
var node = node
--y
while (y > mob.level().minBuildHeight) {
val pathType: PathType = this.getPathTypeOfMob(this.currentContext, x, y, z, this.mob)
val pathType: PathType = this.getNodeType(this.mob, x, y, z)
if (pathType != PathType.WATER) {
return node
}
@@ -309,13 +314,17 @@ class OmniPathNodeMaker : NodeEvaluator() {
val upperMap = Maps.newEnumMap<Direction, Node?>(Direction::class.java)
val lowerMap = Maps.newEnumMap<Direction, Node?>(Direction::class.java)
val upIsOpen = mob.canFit(node.asBlockPos().above())
val d = getFloorLevel(BlockPos(node.x, node.y, node.z))
// Hitbox thing looks confusing but if the hitbox volume is more than like, 5, it starts getting pretty
// fucking slow to use the findAcceptedNodeWalk function
val strictlyWalkPathing = !canFly() && !mob.isInWater && mob.boundingBox.size < MAX_HITBOX_SIZE_FOR_WALKING
val doVerticalNeighbourChecks = (canFly() || mob.isInWater) && mob.boundingBox.size < MAX_HITBOX_FOR_VERTICAL_NEIGHBOURS
// Non-diagonal surroundings in 3d space
for (direction in Direction.entries) {
var pathNode: Node?
if (mob.isInWater || canFly()) {
if (!strictlyWalkPathing) {
pathNode = this.getNode(node.x + direction.stepX, node.y + direction.stepY, node.z + direction.stepZ)
?: continue
} else {
@@ -342,7 +351,7 @@ class OmniPathNodeMaker : NodeEvaluator() {
val x = node.x + direction.stepX + direction2.stepX
val z = node.z + direction.stepZ + direction2.stepZ
var pathNode2: Node?
if (mob.isInWater || canFly()) {
if (!strictlyWalkPathing) {
pathNode2 = this.getNode(x, node.y, z) ?: continue
} else {
pathNode2 = findAcceptedNodeWalk(
@@ -356,18 +365,15 @@ class OmniPathNodeMaker : NodeEvaluator() {
) ?: continue
}
// Skip 'inaccessible' diagonals if we're pathing from a blocked node since we're trying to get unstuck
if (isAccessibleDiagonal(
pathNode2,
map[direction],
map[direction2]
) || (node.type == PathType.BLOCKED && !pathNode2.closed)
) {
if (isAccessibleDiagonal(pathNode2, map[direction], map[direction2]) || (node.type == PathType.BLOCKED && !pathNode2.closed)) {
if (!isDiagonalValidForNonPokemon(node, map[direction], map[direction2]))
continue
successors[i++] = pathNode2
}
}
if (canFly() || mob.isInWater) {
if (doVerticalNeighbourChecks) {
val upIsOpen = mob.canFit(node.asBlockPos().above())
// Upward non-diagonals
for (direction in Direction.Plane.HORIZONTAL.iterator()) {
var pathNode2: Node? = null
@@ -389,8 +395,7 @@ class OmniPathNodeMaker : NodeEvaluator() {
node.z + direction.stepZ + direction2.stepZ
) ?: continue
if (isAccessibleDiagonal(pathNode2, upperMap[direction], upperMap[direction2])
) {
if (isAccessibleDiagonal(pathNode2, upperMap[direction], upperMap[direction2])) {
successors[i++] = pathNode2
}
}
@@ -506,9 +511,13 @@ class OmniPathNodeMaker : NodeEvaluator() {
val below = BlockPos(x, y - 1, z)
val blockState = pfContext.getCachedBlockState(pos)
val blockStateBelow = pfContext.getCachedBlockState(below)
val isWater = blockState.fluidState.`is`(FluidTags.WATER)
val isLava = blockState.fluidState.`is`(FluidTags.LAVA)
val canBreatheUnderFluid = canSwimUnderFluid(blockState.fluidState)
val isFluid = !blockState.fluidState.isEmpty
val isWater = isFluid && blockState.fluidState.`is`(FluidTags.WATER)
val isLava = isFluid && !isWater && blockState.fluidState.`is`(FluidTags.LAVA)
val canBreatheUnderFluid = isFluid && canSwimUnderFluid(blockState.fluidState)
val belowSolid = blockStateBelow.isSolid
val solid = blockState.isSolid
/*
* There are a lot of commented out pairs of checks here. I was experimenting with how to simultaneously
@@ -521,61 +530,93 @@ class OmniPathNodeMaker : NodeEvaluator() {
* It seems to work now but nothing works forever so my other attempts are here for reference.
*/
var figuredNode = if (blockState.`is`(BlockTags.FENCES) || blockState.`is`(BlockTags.WALLS)) {
// var figuredNode = if (blockState.`is`(BlockTags.FENCES) || blockState.`is`(BlockTags.WALLS)) {
// PathType.FENCE
// } else if (blockStateBelow.block is FenceGateBlock) {
// if (blockStateBelow.getValue(FenceGateBlock.OPEN)) {
// PathType.OPEN
// } else {
// PathType.FENCE
// }
// } else if (isWater && !canSwimInWater() && canBreatheUnderFluid && blockState.isPathfindable(PathComputationType.LAND) ) {
// if (pfContext.getPathTypeFromState(pos.x, pos.y - 1, pos.z) == PathType.BLOCKED) {
// PathType.WALKABLE
// } else {
// PathType.OPEN
// }
// } else if (isLava && canSwimInLava()) {
// PathType.LAVA
// } else if (isWater) {
// PathType.WATER
// // This breaks lifting off from snow layers and carpets
//// } else if (blockState.canPathfindThrough(world, pos, NavigationType.LAND) && !blockStateBelow.canPathfindThrough(world, below, NavigationType.AIR)) {
//// PathType.WALKABLE
//// } else if (blockState.canPathfindThrough(world, pos, NavigationType.AIR) && blockStateBelow.canPathfindThrough(world, below, NavigationType.AIR)) {
//// PathType.OPEN
// } else if (blockState.`is`(BlockTags.TRAPDOORS) || blockState.`is`(Blocks.LILY_PAD) || blockState.`is`(Blocks.BIG_DRIPLEAF)) {
// PathType.TRAPDOOR
// } else if (blockState.isPathfindable(PathComputationType.LAND)) {
// PathType.OPEN
// // This breaks walking up slabs
//// } else if (blockState.canPathfindThrough(world, pos, NavigationType.LAND) && blockStateBelow.isSideSolid(world, below, Direction.UP, SideShapeType.FULL)) {
//// PathType.WALKABLE
//// } else if (blockState.canPathfindThrough(world, pos, NavigationType.AIR) && !blockStateBelow.isSideSolid(world, below, Direction.UP, SideShapeType.FULL)) {
//// PathType.OPEN
// } else if (blockState.`is`(BlockTags.LEAVES) && blockState.block == CobblemonBlocks.SACCHARINE_LEAVES && canPathThroughLeaves()) {
// return PathType.OPEN
// } else PathType.BLOCKED
// This is the 1.6.1 logic but with some optimizations
val figuredNode = if (belowSolid && (blockStateBelow.`is`(BlockTags.FENCES) || blockStateBelow.`is`(BlockTags.WALLS) || (blockStateBelow.block is FenceGateBlock && !blockStateBelow.getValue(FenceGateBlock.OPEN)))) {
PathType.FENCE
} else if (blockStateBelow.block is FenceGateBlock) {
if (blockStateBelow.getValue(FenceGateBlock.OPEN)) {
PathType.OPEN
} else {
PathType.FENCE
}
} else if (isWater && !canSwimInWater() && canBreatheUnderFluid && blockState.isPathfindable(PathComputationType.LAND) ) {
if (pfContext.getPathTypeFromState(pos.x, pos.y - 1, pos.z) == PathType.BLOCKED) {
PathType.WALKABLE
} else {
PathType.OPEN
}
} else if (isLava && canSwimInLava()) {
PathType.LAVA
} else if (isWater) {
} else if (isWater && belowSolid && !canSwimInWater() && canBreatheUnderFluid) {
PathType.WALKABLE
} else if (isWater || (isLava && canSwimInLava())) {
PathType.WATER
// This breaks lifting off from snow layers and carpets
// } else if (blockState.canPathfindThrough(world, pos, NavigationType.LAND) && !blockStateBelow.canPathfindThrough(world, below, NavigationType.AIR)) {
// PathType.WALKABLE
// } else if (blockState.canPathfindThrough(world, pos, NavigationType.AIR) && blockStateBelow.canPathfindThrough(world, below, NavigationType.AIR)) {
// PathType.OPEN
} else if (blockState.`is`(BlockTags.TRAPDOORS) || blockState.`is`(Blocks.LILY_PAD) || blockState.`is`(Blocks.BIG_DRIPLEAF)) {
PathType.TRAPDOOR
} else if (blockState.isPathfindable(PathComputationType.LAND)) {
} else if (!solid && belowSolid) {
PathType.WALKABLE
} else if (!solid && !belowSolid) {
PathType.OPEN
// This breaks walking up slabs
// } else if (blockState.canPathfindThrough(world, pos, NavigationType.LAND) && blockStateBelow.isSideSolid(world, below, Direction.UP, SideShapeType.FULL)) {
// PathType.WALKABLE
// } else if (blockState.canPathfindThrough(world, pos, NavigationType.AIR) && !blockStateBelow.isSideSolid(world, below, Direction.UP, SideShapeType.FULL)) {
// PathType.OPEN
} else if (blockState.`is`(BlockTags.LEAVES) && blockState.block == CobblemonBlocks.SACCHARINE_LEAVES && canPathThroughLeaves()) {
return PathType.OPEN
} else PathType.BLOCKED
if (figuredNode == PathType.OPEN && pos.y >= pfContext.level().getMinBuildHeight() + 1) {
val var10000: PathType = when (pfContext.getPathTypeFromState(pos.x, pos.y - 1, pos.z)) {
PathType.OPEN, PathType.LAVA, PathType.WALKABLE -> PathType.OPEN
PathType.DAMAGE_OTHER -> PathType.DAMAGE_OTHER
PathType.STICKY_HONEY -> PathType.STICKY_HONEY
PathType.POWDER_SNOW -> PathType.DANGER_POWDER_SNOW
PathType.DAMAGE_CAUTIOUS -> PathType.DAMAGE_CAUTIOUS
PathType.TRAPDOOR -> PathType.DANGER_TRAPDOOR
PathType.WATER -> if (canWalkOnWater()) PathType.WALKABLE else PathType.OPEN
PathType.FENCE -> {
if (canFly())
PathType.BLOCKED
else
WalkNodeEvaluator.checkNeighbourBlocks(pfContext, pos.x, pos.y, pos.z, PathType.WALKABLE)
}
else -> WalkNodeEvaluator.checkNeighbourBlocks(pfContext, pos.x, pos.y, pos.z, PathType.WALKABLE)
}
figuredNode = var10000
}
// if (figuredNode == PathType.OPEN && pos.y >= pfContext.level().getMinBuildHeight() + 1) {
// val var10000: PathType = when (getPathType(pfContext, pos.x, pos.y - 1, pos.z)) {
// PathType.OPEN, PathType.LAVA, PathType.WALKABLE -> PathType.OPEN
// PathType.DAMAGE_OTHER -> PathType.DAMAGE_OTHER
// PathType.STICKY_HONEY -> PathType.STICKY_HONEY
// PathType.POWDER_SNOW -> PathType.DANGER_POWDER_SNOW
// PathType.DAMAGE_CAUTIOUS -> PathType.DAMAGE_CAUTIOUS
// PathType.TRAPDOOR -> PathType.DANGER_TRAPDOOR
// PathType.WATER -> if (canWalkOnWater()) PathType.WALKABLE else PathType.OPEN
// PathType.FENCE -> {
// if (canFly())
// PathType.BLOCKED
// else {
// if (mob.boundingBox.size < MAX_HITBOX_SIZE_FOR_WALKING)
// WalkNodeEvaluator.checkNeighbourBlocks(pfContext, pos.x, pos.y, pos.z, PathType.WALKABLE)
// else
// PathType.WALKABLE
// }
// }
// else -> {
// if (mob.boundingBox.size < MAX_HITBOX_SIZE_FOR_WALKING)
// WalkNodeEvaluator.checkNeighbourBlocks(pfContext, pos.x, pos.y, pos.z, PathType.WALKABLE)
// else
// PathType.WALKABLE
// }
// }
// figuredNode = var10000
// }
return adjustNodeType(pfContext, canOpenDoors, canPassDoors, below, figuredNode)
}
@@ -585,9 +626,11 @@ class OmniPathNodeMaker : NodeEvaluator() {
val sizeX = (mob.boundingBox.maxX - mob.boundingBox.minX).toInt() + 1
val sizeY = (mob.boundingBox.maxY - mob.boundingBox.minY).toInt() + 1
val sizeZ = (mob.boundingBox.maxZ - mob.boundingBox.minZ).toInt() + 1
// TODO -- This is experimental code to see if this is meaningful. We should clean this up later when time permits.
val returnedEarlyPathType = mutableListOf<PathType>()
val type = findNearbyNodeTypes(
pfContext, x, y, z, sizeX, sizeY, sizeZ, canOpenDoors, canPassDoors, set, PathType.BLOCKED,
BlockPos(x, y, z)
pfContext, x, y, z, sizeX, sizeY, sizeZ, canOpenDoors, canPassDoors, set, PathType.BLOCKED, BlockPos(x, y, z), returnedEarlyPathType
)
if (PathType.LEAVES in set) {
@@ -602,20 +645,20 @@ class OmniPathNodeMaker : NodeEvaluator() {
} else if (PathType.DANGER_OTHER in set) {
return PathType.DANGER_OTHER
}
return if (PathType.FENCE in set) {
PathType.FENCE
} else if (PathType.UNPASSABLE_RAIL in set) {
return if (PathType.UNPASSABLE_RAIL in set) {
PathType.UNPASSABLE_RAIL
} else if (PathType.DAMAGE_OTHER in set) {
PathType.DAMAGE_OTHER
} else {
val result = returnedEarlyPathType.firstOrNull()
if (result != null) {
return result
}
var pathType2: PathType = PathType.BLOCKED
val nearbyTypeIterator = set.iterator()
while (nearbyTypeIterator.hasNext()) {
val nearbyType = nearbyTypeIterator.next()
if (mob.getPathfindingMalus(nearbyType) < 0) {
return nearbyType
}
// The || is because we prefer WALKABLE where possible - OPEN is legit but if there's either OPEN or WALKABLE then WALKABLE is better since land pokes can read that.
if (mob.getPathfindingMalus(nearbyType) > mob.getPathfindingMalus(pathType2) || nearbyType == PathType.WALKABLE) {
pathType2 = nearbyType
@@ -643,7 +686,8 @@ class OmniPathNodeMaker : NodeEvaluator() {
canEnterOpenDoors: Boolean,
nearbyTypes: EnumSet<PathType>,
type: PathType,
pos: BlockPos
pos: BlockPos,
returnedEarlyPathType: MutableList<PathType>
): PathType {
var type = type
for (i in 0 until sizeX) {
@@ -659,6 +703,18 @@ class OmniPathNodeMaker : NodeEvaluator() {
}
}
nearbyTypes.add(currentType)
when (currentType) {
PathType.FENCE -> return type
PathType.LEAVES -> return type
PathType.DAMAGE_CAUTIOUS -> return type
PathType.UNPASSABLE_RAIL -> return type
PathType.DAMAGE_OTHER -> return type
else -> {}
}
if (mob.getPathfindingMalus(currentType) < 0) {
returnedEarlyPathType.add(currentType)
return currentType
}
}
}
}
@@ -673,6 +729,11 @@ class OmniPathNodeMaker : NodeEvaluator() {
type: PathType
): PathType {
val blockState = pfContext.getCachedBlockState(pos)
if (blockState.isAir && type != PathType.RAIL) {
return PathType.OPEN
}
val block = blockState.block
if (blockState.`is`(Blocks.CACTUS) || blockState.`is`(Blocks.SWEET_BERRY_BUSH)) {
@@ -702,6 +763,11 @@ class OmniPathNodeMaker : NodeEvaluator() {
} else type
}
companion object {
const val MAX_HITBOX_SIZE_FOR_WALKING = 1.6F
const val MAX_HITBOX_FOR_VERTICAL_NEIGHBOURS = 2F
}
fun canWalk(): Boolean {
return if (this.mob is OmniPathingEntity) {
(this.mob as OmniPathingEntity).canWalk()
@@ -22,7 +22,6 @@ import com.cobblemon.mod.common.entity.ai.FollowWalkTargetTask
import com.cobblemon.mod.common.entity.ai.GetAngryAtAttackerTask
import com.cobblemon.mod.common.entity.ai.LookAroundTaskWrapper
import com.cobblemon.mod.common.entity.ai.MoveToAttackTargetTask
import com.cobblemon.mod.common.entity.ai.PokeSkillMineTask
import com.cobblemon.mod.common.entity.ai.StayAfloatTask
import com.cobblemon.mod.common.entity.ai.SwapActivityTask
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
@@ -202,8 +201,7 @@ object PokemonBrain {
CobblemonMemories.HERD_LEADER,
CobblemonMemories.HERD_SIZE,
CobblemonMemories.ATTACK_TARGET_DATA,
CobblemonMemories.NEARBY_SWEET_BERRY_BUSH,
CobblemonMemories.MINE_TARGET,
CobblemonMemories.NEARBY_SWEET_BERRY_BUSH
)
private fun coreTasks(pokemon: Pokemon) = buildList<Pair<Int, BehaviorControl<in PokemonEntity>>> {
@@ -255,7 +253,6 @@ object PokemonBrain {
}
add(0 toDF SwapActivityTask.possessing(MemoryModuleType.ATTACK_TARGET, Activity.FIGHT))
add(0 toDF SwapActivityTask.possessing(MemoryModuleType.AVOID_TARGET, Activity.AVOID))
add(0 toDF PokeSkillMineTask())
// add(0 toDF HuntPlayerTask()) // commenting this out to test other things
add(1 toDF FertilizerTask())
@@ -75,7 +75,6 @@ class SlowpokeTailRegrowthSpeciesFeature(var regrowthSeconds: Int = 0) : Species
pokemonEntity.pokemon.updateAspects()
pokemonEntity.pokemon.markFeatureDirty(this)
pokemonEntity.jitterDropItem(itemEntity)
pokemonEntity.playAnimation("cry")
}
override fun onSecondPassed(
@@ -10,7 +10,6 @@ package com.cobblemon.mod.common.pokemon.status.statuses.persistent
import com.cobblemon.mod.common.pokemon.status.PersistentStatus
import com.cobblemon.mod.common.util.cobblemonResource
class FrozenStatus : PersistentStatus(
name = cobblemonResource("frozen"),
showdownName = "frz",
@@ -20,7 +20,6 @@ object DataKeys {
const val POKEMON_FRIENDSHIP = "Friendship"
const val POKEMON_FULLNESS = "Fullness"
const val POKEMON_INTERACTION_COOLDOWN = "InteractionCooldown"
const val POKEMON_SKILL_COOLDOWNS = "SkillCooldowns"
const val POKEMON_IVS = "IVs"
const val POKEMON_IVS_BASE = "Base"
@@ -99,16 +99,10 @@ fun ServerPlayer.didSleep(): Boolean {
return true
}
fun Player.isInBattle() = if (this is ServerPlayer) {
BattleRegistry.getBattleByParticipatingPlayer(this) != null
} else {
CobblemonClient.battle?.spectating == false
}
fun ServerPlayer.isInBattle() = BattleRegistry.getBattleByParticipatingPlayer(this) != null
var ServerPlayer.spawner: PlayerSpawner
get() = (this as PlayerSpawnerAccessor).getPlayerSpawner()
set(value) = (this as PlayerSpawnerAccessor).setPlayerSpawner(value)
fun ServerPlayer.getBattleState(): Pair<PokemonBattle, BattleActor>? {
val battle = BattleRegistry.getBattleByParticipatingPlayer(this)
if (battle != null) {
@@ -1,31 +0,0 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.util.adapters
import com.cobblemon.mod.common.api.moves.animations.ActionEffectTimeline
import com.cobblemon.mod.common.api.moves.animations.ActionEffects
import com.cobblemon.mod.common.util.asIdentifierDefaultingNamespace
import com.google.gson.JsonDeserializationContext
import com.google.gson.JsonDeserializer
import com.google.gson.JsonElement
import java.lang.reflect.Type
/**
* Adapter for deserializing a reference to an [ActionEffectTimeline] from its identifier.
*
* @author Hiroku
* @since August 31st, 2025
*/
object ActionEffectTimelineAdapter : JsonDeserializer<ActionEffectTimeline> {
override fun deserialize(json: JsonElement, type: Type, ctx: JsonDeserializationContext): ActionEffectTimeline {
val identifier = json.asString.asIdentifierDefaultingNamespace()
val timeline = ActionEffects.actionEffects[identifier]
return timeline ?: throw IllegalArgumentException("No ActionEffectTimeline found for id $identifier")
}
}
@@ -77,13 +77,12 @@ object NPCClassAdapter : JsonDeserializer<NPCClass> {
obj.get("autoHealParty")?.let { npcClass.autoHealParty = it.asBoolean }
obj.get("randomizePartyOrder")?.let { npcClass.randomizePartyOrder = it.asBoolean }
obj.get("battleTheme")?.let { npcClass.battleTheme = it.asString.asIdentifierDefaultingNamespace() }
obj.get("ai")?.let { npcClass.behaviours.addAll(it.asJsonArray.map<JsonElement, BehaviourConfig> { ctx.deserialize(it, BehaviourConfig::class.java) }.toMutableList()) }
listOf("behaviours", "behaviors", "ai").firstNotNullOfOrNull { obj.get(it) }?.let { npcClass.behaviours.addAll(it.asJsonArray.map<JsonElement, BehaviourConfig> { ctx.deserialize(it, BehaviourConfig::class.java) }.toMutableList()) }
obj.get("isMovable")?.let { npcClass.isMovable = it.asBoolean }
obj.get("isInvulnerable")?.let { npcClass.isInvulnerable = it.asBoolean }
obj.get("isLeashable")?.let { npcClass.isLeashable = it.asBoolean }
obj.get("allowProjectileHits")?.let { npcClass.allowProjectileHits = it.asBoolean }
obj.get("hideNameTag")?.let { npcClass.hideNameTag = it.asBoolean }
return npcClass
}
}
@@ -10,8 +10,6 @@ package com.cobblemon.mod.common.util.codec
import com.bedrockk.molang.Expression
import com.bedrockk.molang.MoLang
import com.cobblemon.mod.common.api.molang.ExpressionLike
import com.cobblemon.mod.common.util.asExpressionLike
import com.cobblemon.mod.common.util.getString
import com.mojang.serialization.Codec
import com.mojang.serialization.Codec.optionalField
@@ -31,17 +29,6 @@ val EXPRESSION_CODEC = object : PrimitiveCodec<Expression> {
}
}
val EXPRESSION_LIKE_CODEC = object : PrimitiveCodec<ExpressionLike> {
override fun <T> read(ops: DynamicOps<T>, input: T): DataResult<ExpressionLike> {
return ops.getStringValue(input).map { it.asExpressionLike() }
}
override fun <T> write(ops: DynamicOps<T>, value: ExpressionLike): T {
return ops.createString(value.getString())
}
}
// special codec that always writes default value
// vanilla changed the behaviour of Codec#optionalFieldOf(String, A) so that it OMITS default values when encoding
// later on decoding it assumes no value -> default, but we want some default being encoded anyways so it can be targeted by commands
@@ -35,7 +35,6 @@ internal data class ClientPokemonP3(
val rideBoosts: Map<String, Float>,
val currentFullness: Int,
val interactionCooldowns: Map<ResourceLocation, Int>,
val skillCooldownTicks: Map<ResourceLocation, Int>,
) : Partial<Pokemon> {
override fun into(other: Pokemon): Pokemon {
@@ -54,7 +53,6 @@ internal data class ClientPokemonP3(
this.rideBoosts.let { other.setRideBoosts(it.mapKeys { RidingStat.valueOf(it.key) }) }
other.currentFullness = this.currentFullness
other.interactionCooldowns = this.interactionCooldowns.toMutableMap()
other.skillCooldownsTicks = this.skillCooldownTicks.toMutableMap()
return other
}
@@ -77,8 +75,7 @@ internal data class ClientPokemonP3(
Codec.unboundedMap(Codec.STRING, Codec.FLOAT).fieldOf(DataKeys.POKEMON_RIDE_BOOSTS).forGetter(ClientPokemonP3::rideBoosts),
Codec.intRange(0, 100).fieldOf(DataKeys.POKEMON_FULLNESS).forGetter(ClientPokemonP3::currentFullness),
Codec.unboundedMap(ResourceLocation.CODEC, Codec.INT).fieldOf(DataKeys.POKEMON_INTERACTION_COOLDOWN).forGetter(ClientPokemonP3::interactionCooldowns),
Codec.unboundedMap(ResourceLocation.CODEC, Codec.INT).fieldOf(DataKeys.POKEMON_SKILL_COOLDOWNS).forGetter(ClientPokemonP3::skillCooldownTicks)
).apply(instance, ::ClientPokemonP3)
).apply(instance, ::ClientPokemonP3)
}
internal fun from(pokemon: Pokemon): ClientPokemonP3 = ClientPokemonP3(
@@ -95,7 +92,6 @@ internal data class ClientPokemonP3(
pokemon.getRideBoosts().mapKeys { it.key.name },
pokemon.currentFullness,
pokemon.interactionCooldowns,
pokemon.skillCooldownsTicks,
)
}
}
@@ -20,7 +20,6 @@ import com.cobblemon.mod.common.util.codec.optionalFieldOfWithDefault
import com.mojang.serialization.Codec
import com.mojang.serialization.MapCodec
import com.mojang.serialization.codecs.RecordCodecBuilder
import java.util.Optional
import net.minecraft.nbt.CompoundTag
import net.minecraft.nbt.StringTag
import net.minecraft.nbt.Tag
@@ -44,7 +43,6 @@ internal data class PokemonP3(
val rideStamina: Float,
val currentFullness: Int,
val interactionCooldowns: Map<ResourceLocation, Int>,
val skillCooldownTicks: Map<ResourceLocation, Int>,
) : Partial<Pokemon> {
override fun into(other: Pokemon): Pokemon {
@@ -81,7 +79,8 @@ internal data class PokemonP3(
other.rideStamina = this.rideStamina
other.currentFullness = this.currentFullness
other.interactionCooldowns = this.interactionCooldowns.toMutableMap()
other.skillCooldownsTicks = this.skillCooldownTicks.toMutableMap()
other.recalculateCharacteristic()
other.updateAspects()
return other
}
@@ -103,7 +102,6 @@ internal data class PokemonP3(
Codec.FLOAT.optionalFieldOf(DataKeys.POKEMON_RIDE_STAMINA, 1F).forGetter(PokemonP3::rideStamina),
Codec.intRange(0, 100).optionalFieldOf(DataKeys.POKEMON_FULLNESS, 0).forGetter(PokemonP3::currentFullness),
Codec.unboundedMap(ResourceLocation.CODEC, Codec.INT).optionalFieldOf(DataKeys.POKEMON_INTERACTION_COOLDOWN, emptyMap<ResourceLocation, Int>()).forGetter(PokemonP3::interactionCooldowns),
Codec.unboundedMap(ResourceLocation.CODEC, Codec.INT).optionalFieldOf(DataKeys.POKEMON_SKILL_COOLDOWNS, emptyMap<ResourceLocation, Int>()).forGetter { it.skillCooldownTicks },
).apply(instance) {
originalTrainerType,
originalTrainer,
@@ -119,8 +117,7 @@ internal data class PokemonP3(
rideBoosts,
rideStamina,
currentFullness,
interactionCooldown,
skillCooldownTicks -> PokemonP3(
interactionCooldown -> PokemonP3(
originalTrainerType,
originalTrainer,
forcedAspects.toSet(),
@@ -136,7 +133,6 @@ internal data class PokemonP3(
rideStamina,
currentFullness,
interactionCooldown,
skillCooldownTicks,
)
}
}
@@ -161,7 +157,6 @@ internal data class PokemonP3(
pokemon.rideStamina,
pokemon.currentFullness,
pokemon.interactionCooldowns,
pokemon.skillCooldownsTicks,
)
}
}
@@ -200,34 +200,7 @@
"rotation": [-0.4165, -7.26605, 3.29302]
},
"stick": {
"rotation": [30, 45, 0],
"scale": 0.7
}
}
},
"animation.treecko.blink": {
"animation_length": 0.1667,
"bones": {
"eyelid_left": {
"position": {
"0.0": [0.1, 0, 0],
"0.125": [0.1, 0, 0],
"0.1667": {"pre": [0.1, 0, 0], "post": [0, 0, 0]}
}
},
"eyelid_right": {
"position": {
"0.0": [-0.1, 0, 0],
"0.125": [-0.1, 0, 0],
"0.1667": {"pre": [-0.1, 0, 0], "post": [0, 0, 0]}
}
},
"eye_right": {
"position": {
"0.0": [0.1, 0, 0],
"0.125": [0.1, 0, 0],
"0.1667": {"pre": [0.1, 0, 0], "post": [0, 0, 0]}
}
"rotation": [30, 45, 0]
}
}
},
@@ -727,6 +700,42 @@
"lerp_mode": "catmullrom"
}
}
},
"stick": {
"rotation": [30, 45, 0]
}
}
},
"animation.treecko.blink": {
"animation_length": 0.1667,
"bones": {
"eyelid_left": {
"position": {
"0.0": [0.1, 0, 0],
"0.125": [0.1, 0, 0],
"0.1667": {"pre": [0.1, 0, 0], "post": [0, 0, 0]}
}
},
"eyelid_right": {
"position": {
"0.0": [-0.1, 0, 0],
"0.125": [-0.1, 0, 0],
"0.1667": {"pre": [-0.1, 0, 0], "post": [0, 0, 0]}
}
},
"eye_right": {
"position": {
"0.0": [0.1, 0, 0],
"0.125": [0.1, 0, 0],
"0.1667": {"pre": [0.1, 0, 0], "post": [0, 0, 0]}
}
},
"eye_left": {
"position": {
"0.0": [-0.1, 0, 0],
"0.125": [-0.1, 0, 0],
"0.1667": {"pre": [-0.1, 0, 0], "post": [0, 0, 0]}
}
}
}
},
@@ -996,14 +1005,6 @@
"position": [-0.1, 0, 0]
}
}
},
"animation.treecko.cry": {
"animation_length": 1.2,
"sound_effects": {
"0.04": {
"effect": "pokemon.treecko.cry"
}
}
}
}
}
@@ -131,288 +131,7 @@
"rotation": [-7.5, 0, 0]
},
"stick": {
"rotation": [30, 40, 0],
"scale": 0.7
}
}
},
"animation.grovyle.test2": {
"loop": true,
"bones": {
"torso": {
"rotation": [-5, 0, 0]
},
"torso2": {
"rotation": [2.5, 0, 0]
},
"neck": {
"rotation": [20, 0, 0]
},
"head": {
"rotation": [10, 0, 0]
},
"leaf7": {
"rotation": [12.5, 0, 0]
},
"jaw": {
"rotation": [0, 0, 0]
},
"arm_left": {
"rotation": [-52.5, 5, 27.5]
},
"arm_left2": {
"rotation": [0, 65, 0]
},
"hand_left": {
"rotation": [2.38443, -0.75155, 49.98436]
},
"arm_leaves_left": {
"rotation": [-10, -17.5, 0]
},
"finger_front_left": {
"rotation": [0, 0, 2.5]
},
"finger_back_left": {
"rotation": [0, 0, 5]
},
"tail_left": {
"rotation": [-15, 12.5, -2.5]
},
"tail_left2": {
"rotation": [7.5, 0, 0]
},
"leg_left": {
"rotation": [0, -22.5, 0]
},
"leg_left2": {
"rotation": [0, 0, 0]
},
"foot_left": {
"rotation": [0, 0, 0]
},
"toe_inner_left": {
"rotation": [0, 10, 0]
},
"toe_outer_left": {
"rotation": [0, -10, 0]
},
"tail_right": {
"rotation": [-15, -12.5, 2.5]
},
"leg_right": {
"rotation": [0, 22.5, 0]
},
"leg_right2": {
"rotation": [0, 0, 0]
},
"foot_right": {
"rotation": [0, 0, 0]
},
"toe_inner_right": {
"rotation": [0, -10, 0]
},
"toe_outer_right": {
"rotation": [0, 10, 0]
},
"arm_right": {
"rotation": [-52.5, -5, -27.5]
},
"arm_right2": {
"rotation": [0, -65, 0]
},
"hand_right": {
"rotation": [2.38443, 0.75155, -49.98436]
},
"finger_front_right": {
"rotation": [0, 0, -2.5]
},
"finger_back_right": {
"rotation": [0, 0, -5]
},
"arm_leaves_right": {
"rotation": [-10, 17.5, 0]
},
"tail_right2": {
"rotation": [7.5, 0, 0]
},
"finger_front_left2": {
"rotation": [0, 0, 65]
},
"finger_back_left2": {
"rotation": [0, 0, 87.5]
},
"finger_front_right2": {
"rotation": [0, 0, -65]
},
"finger_back_right2": {
"rotation": [0, 0, -87.5]
}
}
},
"animation.grovyle.test3": {
"loop": true,
"bones": {
"torso": {
"rotation": [45.38165, -3.51814, -7.08167]
},
"torso2": {
"rotation": [-9.97857, 3.32943, 4.4913]
},
"neck": {
"rotation": [-20.01754, 2.34914, -0.85553]
},
"head": {
"rotation": [-10, 0, 0]
},
"leaf7": {
"rotation": [22.5, 0, 0]
},
"jaw": {
"rotation": [42.5, 0, 0]
},
"arm_left": {
"rotation": [-12.58328, 9.94037, 39.45082]
},
"arm_left2": {
"rotation": [0, 82.5, 0]
},
"hand_left": {
"rotation": [7.5, 0, 32.5]
},
"arm_leaves_left": {
"rotation": [-21.78282, -11.4487, 11.10461]
},
"finger_front_left": {
"rotation": [0, 0, 10]
},
"finger_back_left": {
"rotation": [0, 0, 22.5]
},
"tail_left": {
"rotation": [-17.99085, 11.53327, -4.85721]
},
"tail_left2": {
"rotation": [-15, 0, 0]
},
"leg_left": {
"rotation": [-37.5, -22.5, 0],
"position": [0.5, 0.5, -1]
},
"leg_left2": {
"rotation": [5, 0, 0]
},
"foot_left": {
"rotation": [0, 0, 0]
},
"toe_inner_left": {
"rotation": [10, 10, 0]
},
"toe_outer_left": {
"rotation": [20, -10, 0]
},
"tail_right": {
"rotation": [-28.32455, -16.15901, -4.25872]
},
"leg_right": {
"rotation": [38, 7.5, 2.5],
"position": [0, -0.5, -0.5]
},
"leg_right2": {
"rotation": [5, 0, 0]
},
"foot_right": {
"rotation": [27.5, 0, 0]
},
"toe_inner_right": {
"rotation": [-24.71447, -5.46269, -2.12052],
"position": [0, -0.1, 0.6]
},
"toe_outer_right": {
"rotation": [-24.71447, 5.46269, 2.12052],
"position": [0, -0.1, 0.6]
},
"arm_right": {
"rotation": [-14.26018, -29.40676, -34.54418]
},
"arm_right2": {
"rotation": [0, -70, 0]
},
"hand_right": {
"rotation": [7.5, 0, -32.5]
},
"finger_front_right": {
"rotation": [0, 0, -10]
},
"finger_back_right": {
"rotation": [0, 0, -22.5]
},
"arm_leaves_right": {
"rotation": [-26.39218, 18.05776, -8.74472]
},
"tail_right2": {
"rotation": [-15, 0, 0]
},
"body": {
"position": [0, 1.75, 0]
},
"leaf3": {
"rotation": [2.5, 0, 0]
},
"leaf4": {
"rotation": [7.5, 0, 0]
},
"leaf5": {
"rotation": [5, 0, 0]
},
"leaf6": {
"rotation": [5, 0, 0]
},
"toe_back_left": {
"rotation": [-5, 0, 0]
},
"toe_back_right": {
"rotation": [-10, 0, 0]
},
"toe_outer_left2": {
"rotation": [10, 0, 0]
},
"toe_inner_left2": {
"rotation": [10, 0, 0]
},
"toe_inner_right2": {
"rotation": [-45, 0, 0],
"position": [0, -0.55, 1.4]
},
"toe_outer_right2": {
"rotation": [-45, 0, 0],
"position": [0, -0.55, 1.4]
},
"arm_leaf_middle_left": {
"rotation": [15, 0, 0]
},
"arm_leaf_inner_left": {
"rotation": [5.76917, -1.99557, 14.05033]
},
"arm_leaf_outer_left": {
"rotation": [10, 0, 0]
},
"arm_leaf_middle_right": {
"rotation": [5, 0, 0]
},
"arm_leaf_inner_right": {
"rotation": [2.5, 0, 0]
},
"finger_front_left2": {
"rotation": [0, 0, 22.5]
},
"finger_back_left2": {
"rotation": [0, 0, 30]
},
"finger_front_right2": {
"rotation": [0, 0, -22.5]
},
"finger_back_right2": {
"rotation": [0, 0, -30]
"rotation": [30, 40, 0]
}
}
},
@@ -448,115 +167,6 @@
}
}
}
},
"animation.grovyle.happy": {
"loop": true,
"bones": {
"eye_left": {
"position": [-0.1, 0, 0]
},
"eye_right": {
"position": [0.1, 0, 0]
},
"eyelid_happy_left": {
"position": [0.1, 0, 0]
},
"eyelid_happy_right": {
"position": [-0.1, 0, 0]
}
}
},
"animation.grovyle.angry": {
"loop": true,
"bones": {
"eye_emote_right": {
"scale": [1, 1.5, 1]
},
"eye_brow_right": {
"position": [0, -0.3, 0]
},
"eye_brow_right2": {
"position": [0, 0.5, 0]
},
"eye_brow_left": {
"position": [0, -0.3, 0]
},
"eye_brow_left2": {
"position": [0, 0.5, 0]
},
"eye_emote_left": {
"scale": [1, 1.5, 1]
}
}
},
"animation.grovyle.sad": {
"loop": true,
"bones": {
"eye_brow_right": {
"position": [0, 0.5, 0]
},
"eye_brow_right2": {
"position": [0, -0.5, 0]
},
"eye_brow_left": {
"position": [0, 0.5, 0]
},
"eye_brow_left2": {
"position": [0, -0.5, 0]
}
}
},
"animation.grovyle.shocked": {
"loop": true,
"bones": {
"pupil_left": {
"position": [0, 0, -0.1],
"scale": [1, 0.5, 0.5]
},
"pupil_right": {
"position": [0, 0, -0.1],
"scale": [1, 0.5, 0.5]
},
"eye_emote_right": {
"position": [0, -0.5, 0],
"scale": [1, 2, 1]
},
"eye_brow_right": {
"position": [0, 0.3, 0]
},
"eye_brow_left": {
"position": [0, 0.3, 0]
},
"eye_emote_left": {
"position": [0, -0.5, 0],
"scale": [1, 2, 1]
}
}
},
"animation.grovyle.hurt": {
"loop": true,
"bones": {
"eye_left": {
"position": [-0.1, 0, 0]
},
"eye_right": {
"position": [0.1, 0, 0]
},
"eyelid_hurt_left": {
"position": [0.1, 0, 0]
},
"eyelid_hurt_right": {
"position": [-0.1, 0, 0]
}
}
},
"animation.grovyle.cry": {
"animation_length": 1.2,
"sound_effects": {
"0.04": {
"effect": "pokemon.grovyle.cry"
}
}
}
}
}
@@ -134,8 +134,7 @@
"rotation": [0, -5, 0]
},
"stick": {
"rotation": [16, 40, 0],
"scale": 0.7
"rotation": [16, 40, 0]
}
}
},
@@ -552,14 +551,6 @@
"position": [0, 0.3, 0]
}
}
},
"animation.sceptile.cry": {
"animation_length": 1.2,
"sound_effects": {
"0.04": {
"effect": "pokemon.sceptile.cry"
}
}
}
}
}
@@ -1466,245 +1466,6 @@
}
}
},
"animation.delphox.battle_idle2_wip": {
"loop": true,
"bones": {
"robe_left": {
"rotation": [28.44706, -2.60661, -11.92606],
"position": [1, 0, 0]
},
"robe_left2_rotation": {
"rotation": [-17.10967, 3.73172, 11.93845],
"position": [0, -1, 0]
},
"robe_left3_rotation": {
"rotation": [-7.5, 0, 0]
},
"body": {
"position": [0, -4, 0]
},
"torso": {
"rotation": [7.5, 0, 0],
"position": [0, 0, -0.5]
},
"waist": {
"rotation": [10, 0, 0]
},
"chest": {
"rotation": [7.5, 0, 0]
},
"arm_left": {
"rotation": [-22.98431, -46.52795, 43.07189]
},
"arm_left2": {
"rotation": [0, 102.5, 0]
},
"arm_left_ruff": {
"rotation": [22.5, 0, 0]
},
"arm_left_ruff2": {
"rotation": [12.5, 0, 0]
},
"finger_front_left": {
"rotation": [7.24677, 10.21235, 35.6484]
},
"finger_middle_left": {
"rotation": [0, 0, 32.5]
},
"finger_back_left": {
"rotation": [-0.95723, -2.30959, 67.5193]
},
"arm_right": {
"rotation": [-12.02654, -6.06267, -39.90871]
},
"arm_right2": {
"rotation": [0, -75, 0]
},
"arm_right_ruff": {
"rotation": [10, 0, 0]
},
"arm_right_ruff2": {
"rotation": [15, 0, 0]
},
"hand_right": {
"rotation": [-66.84879, -8.30424, 0.07837]
},
"finger_front_right": {
"rotation": [4.58217, -5.94383, -37.73802]
},
"finger_middle_right": {
"rotation": [0, 0, -72.5]
},
"finger_back_right": {
"rotation": [0, 0, -102.5]
},
"neck": {
"rotation": [12.39141, 0.17576, -1.61889]
},
"head": {
"rotation": [-22.48072, 0.95645, 2.30991]
},
"ear_left_ruff_main": {
"rotation": [0.18349, -15.01207, 0.11941]
},
"ear_ruff_top_left": {
"rotation": [0, -5, 0]
},
"ear_ruff_top_left2": {
"rotation": [0, -12.5, 12.5]
},
"ear_ruff_top_left3": {
"rotation": [0, -12.5, -15]
},
"ear_ruff_top_left4": {
"rotation": [1.6575, -12.39135, -7.67995]
},
"ear_ruff_middle_left": {
"rotation": [-5, 10, 0]
},
"ear_ruff_middle_left2": {
"rotation": [-4.19074, -27.0475, 13.8468]
},
"ear_ruff_middle_left3": {
"rotation": [-3.48264, -23.99186, -7.64423]
},
"ear_ruff_middle_left4": {
"rotation": [0, -17.5, -22.5]
},
"ear_ruff_bottom_left": {
"rotation": [0, -2.5, 15]
},
"ear_ruff_bottom_left2": {
"rotation": [-1.6575, -12.39135, 7.67995]
},
"ear_ruff_bottom_left3": {
"rotation": [2.20462, -12.3071, -10.23772]
},
"ear_right_ruff_main": {
"rotation": [0.18349, 15.01207, -0.11941]
},
"ear_ruff_top_right": {
"rotation": [0, 5, 0]
},
"ear_ruff_top_right2": {
"rotation": [0, 12.5, -12.5]
},
"ear_ruff_top_right3": {
"rotation": [0, 12.5, 15]
},
"ear_ruff_top_right4": {
"rotation": [1.6575, 12.39135, 7.67995]
},
"ear_ruff_middle_right": {
"rotation": [-5, -10, 0]
},
"ear_ruff_middle_right2": {
"rotation": [-4.19074, 27.0475, -13.8468]
},
"ear_ruff_middle_right3": {
"rotation": [-3.48264, 23.99186, 7.64423]
},
"ear_ruff_middle_right4": {
"rotation": [0, 17.5, 22.5]
},
"ear_ruff_bottom_right": {
"rotation": [0, 2.5, -15]
},
"ear_ruff_bottom_right2": {
"rotation": [-1.6575, 12.39135, -7.67995]
},
"ear_ruff_bottom_right3": {
"rotation": [2.20462, 12.3071, 10.23772]
},
"torso_fur_left2": {
"rotation": [10, 0, 0]
},
"torso_fur_left3": {
"rotation": [0, 0, -5]
},
"torso_fur_right2": {
"rotation": [0, 0, 0]
},
"tail": {
"rotation": [0, -5, 0]
},
"leg_left": {
"rotation": [0, 0, -2.5],
"position": [0, 0, 2]
},
"leg_left2": {
"rotation": [27.47282, 1.84293, -1.68956]
},
"leg_left3": {
"rotation": [-27.5, 0, 0]
},
"foot_left": {
"rotation": [-0.52095, -0.47356, 5.04797]
},
"leg_right": {
"rotation": [-37.47365, 1.5216, 1.98385]
},
"leg_right2": {
"rotation": [30, 0, 0]
},
"leg_right3": {
"rotation": [-16.47272, 1.76749, 1.76833]
},
"foot_right": {
"rotation": [24.89748, 3.11641, -4.51656]
},
"foot_right2": {
"rotation": [0, 0, 0]
},
"tail2": {
"rotation": [-17.56274, -4.76804, 1.50701]
},
"tail3": {
"rotation": [-22.5, 0, 0]
},
"tail4": {
"rotation": [25.18908, 6.79382, 3.18458]
},
"tail5": {
"rotation": [25.18908, 6.79382, 3.18458]
},
"tail6": {
"rotation": [30, 0, 0]
},
"tail7": {
"rotation": [-27.5, 0, 0]
},
"wand": {
"rotation": [115.18907, -6.79382, 69.31542],
"position": [7.5, -2, -2]
},
"fire": {
"rotation": [-24.24769, 6.27967, 13.64973]
},
"torso_cloak": {
"rotation": [0, 0, 0]
},
"ear_ruff_shock_left": {
"rotation": [0, -5, 0],
"scale": 0
},
"ear_ruff_shock_right": {
"rotation": [0, 5, 0],
"scale": 0
},
"robe_right": {
"rotation": [28.44706, -2.60661, -11.92606],
"position": [1, 0, 0]
},
"robe_right2_rotation": {
"rotation": [-17.10967, 3.73172, 11.93845],
"position": [0, -1, 0]
},
"robe_right3_rotation": {
"rotation": [-7.5, 0, 0]
}
}
},
"animation.delphox.blink": {
"animation_length": 0.1667,
"bones": {
@@ -1728,156 +1489,71 @@
}
}
},
"animation.delphox.surprise_hair": {
"animation_length": 0.0417,
"animation.delphox.cry": {
"animation_length": 1.75,
"bones": {
"ear_ruff_top_left": {
"rotation": [0.86996, -0.48705, -9.93723]
},
"ear_ruff_top_left2": {
"rotation": [0, 0, 0]
},
"ear_ruff_top_left3": {
"rotation": [0, 0, -10]
},
"ear_ruff_top_left4": {
"rotation": [0, 0, -25]
},
"ear_ruff_middle_left": {
"rotation": [0, 0, 7.5]
},
"ear_ruff_middle_left2": {
"rotation": [0, 0, -12.5]
},
"ear_ruff_middle_left3": {
"rotation": [-1.63786, -2.36303, 19.89762]
},
"ear_ruff_middle_left4": {
"rotation": [0, 0, -25]
},
"ear_ruff_bottom_left": {
"head": {
"rotation": {
"0.0": [0.1467, 0.51916, 9.98614],
"0.0417": [0.23463, 0.48579, 19.98647]
"0.0": [0, 0, 0],
"0.0833": [-2.5, 0, 0],
"0.125": [-2.24, 0, 0],
"0.2083": [-0.23, 0, 0],
"0.25": [0, 0, 0],
"0.3333": [-3.67, 0, 0],
"0.375": [-4, 0, 0],
"0.4167": [-3.7, 0, 0],
"0.5833": [0, 0, 0],
"0.625": [-0.21, 0, 0],
"0.7917": [-4.57, 0, 0],
"0.8333": [-5, 0, 0],
"0.9167": [-4.8, 0, 0],
"1.3333": [-0.2, 0, 0],
"1.4583": [0, 0, 0]
}
},
"ear_ruff_bottom_left2": {
"rotation": [-0.08929, 0.02949, 17.49954]
},
"ear_ruff_bottom_left3": {
"rotation": [0, 0, 2.5]
},
"ear_ruff_top_right": {
"rotation": [0.86996, 0.48705, 9.93723]
},
"ear_ruff_top_right2": {
"rotation": [0, 0, 0]
},
"ear_ruff_top_right3": {
"rotation": [0, 0, 10]
},
"ear_ruff_top_right4": {
"rotation": [0, 0, 25]
},
"ear_ruff_middle_right2": {
"rotation": [0, 0, 12.5]
},
"ear_ruff_middle_right3": {
"rotation": [-1.63786, 2.36303, -19.89762]
},
"ear_ruff_middle_right4": {
"rotation": [0, 0, 25]
},
"ear_ruff_middle_right": {
"rotation": [0, 0, -7.5]
},
"ear_ruff_bottom_right": {
"rotation": [0.1467, -0.51916, -9.98614]
},
"ear_ruff_bottom_right2": {
"rotation": [-0.08929, -0.02949, -17.49954]
},
"ear_ruff_bottom_right3": {
"rotation": [0, 0, -2.5]
},
"ear_ruff_shock_left_top": {
"rotation": [0, 0, -22.5]
},
"ear_ruff_shock_left_middle": {
"rotation": [0, 0, 7.5]
},
"ear_ruff_shock_left_bottom": {
"rotation": [0, 0, 25]
},
"ear_ruff_shock_right_top": {
"rotation": [0, 0, 22.5]
},
"ear_ruff_shock_right_middle": {
"rotation": [0, 0, -7.5]
},
"ear_ruff_shock_right_bottom": {
"rotation": [0, 0, -25]
}
}
},
"animation.delphox.shock": {
"loop": true,
"bones": {
"jaw": {
"rotation": [62.5, 0, 0]
"rotation": {
"0.0": [0, 0, 0],
"0.0417": [34.6, 0, 0],
"0.0833": [38, 0, 0],
"0.125": [20, 0, 0],
"0.1667": [15.4, 0, 0],
"0.2083": [20, 0, 0],
"0.2917": [49.07, 0, 0],
"0.3333": [54, 0, 0],
"0.375": [47.9, 0, 0],
"0.5": [15, 0, 0],
"0.5417": [11.9, 0, 0],
"0.5833": [15, 0, 0],
"0.7083": [62.35, 0, 0],
"0.75": [67.3, 0, 0],
"0.8333": [70.1, 0, 0],
"0.9167": [67.3, 0, 0],
"0.9583": [61.7, 0, 0],
"1.4167": [4.77, 0, 0],
"1.5417": [0, 0, 0]
}
},
"pupil_left": {
"scale": [0.6, 0.6, 1]
},
"pupil_right": {
"scale": [0.6, 0.6, 1]
"fangs": {
"position": {
"0.0": [0, 0, 0],
"0.0417": [0, -0.6, 0],
"0.125": [0, -0.6, 0],
"0.1667": [0, 0, 0],
"0.2083": [0, 0, 0],
"0.25": [0, -0.6, 0],
"0.4583": [0, -0.6, 0],
"0.5": [0, 0, 0],
"0.5833": [0, 0, 0],
"0.625": [0, -0.6, 0],
"1.25": [0, -0.6, 0],
"1.2917": [0, 0, 0]
}
}
}
},
"animation.delphox.angry": {
"loop": true,
"bones": {
"eye_angry_left": {
"position": [0.1, 0, -0.1]
},
"eye_angry_right": {
"position": [-0.1, 0, -0.1]
}
}
},
"animation.delphox.sad": {
"loop": true,
"bones": {
"eye_sad_left": {
"position": [0.1, 0, -0.1]
},
"eye_sad_right": {
"position": [-0.1, 0, -0.1]
}
}
},
"animation.delphox.happy": {
"loop": true,
"bones": {
"eyelid_happy_left": {
"position": [0.1, 0, -0.1]
},
"eyelid_happy_right": {
"position": [-0.1, 0, -0.1]
},
"jaw": {
"rotation": [62.5, 0, 0]
}
}
},
"animation.delphox.hurt": {
"loop": true,
"bones": {
"eyelid_recoil_left": {
"position": [0.1, 0, -0.1]
},
"eyelid_recoil_right": {
"position": [-0.1, 0, -0.1]
},
"sound_effects": {
"0.0": {
"effect": "pokemon.delphox.cry"
}
}
}
@@ -61,7 +61,6 @@
}
},
"animation.furfrou.cry": {
"loop": true,
"animation_length": 0.75,
"bones": {
"head": {
@@ -207,9 +207,9 @@
{
"name": "locator_item_hat",
"parent": "head_correction",
"pivot": [0, 21.5, -0.4],
"pivot": [0, 23.5, -0.4],
"locators": {
"item_hat": [0, 21.5, -0.4]
"item_hat": [0, 23.5, -0.4]
}
},
{
@@ -259,14 +259,7 @@
"parent": "jaw",
"pivot": [-2.8, 14.4, -2.8],
"cubes": [
{"origin": [-3.1, 14.4, -4.1], "size": [1, 2, 2], "pivot": [-1.6, 14.4, -2.1], "rotation": [45, 0, 0], "uv": [15, 52]},
{"origin": [-3.1, 15.4, -5.1], "size": [1, 2, 2], "pivot": [-1.6, 14.4, -2.1], "rotation": [45, 0, 0], "uv": [21, 52]},
{"origin": [-3.1, 17.4, -7.1], "size": [1, 2, 2], "pivot": [-1.6, 14.4, -2.1], "rotation": [45, 0, 0], "uv": [21, 56]},
{"origin": [-3.1, 16.4, -6.1], "size": [1, 2, 2], "pivot": [-1.6, 14.4, -2.1], "rotation": [45, 0, 0], "uv": [15, 56]},
{"origin": [-3.1, 19.4, -9.1], "size": [1, 2, 2], "pivot": [-1.6, 14.4, -2.1], "rotation": [45, 0, 0], "uv": [21, 60]},
{"origin": [-3.1, 18.4, -8.1], "size": [1, 2, 2], "pivot": [-1.6, 14.4, -2.1], "rotation": [45, 0, 0], "uv": [15, 60]},
{"origin": [-3.1, 20.4, -7.1], "size": [1, 2, 2], "pivot": [-1.6, 14.4, -2.1], "rotation": [45, 0, 0], "uv": [27, 52]},
{"origin": [-3.1, 22.4, -7.1], "size": [1, 1, 1], "pivot": [-1.6, 14.4, -2.1], "rotation": [45, 0, 0], "uv": [28, 56]}
{"origin": [-2.7, 14.7, -7.3], "size": [0, 2, 5], "uv": [1, 56]}
]
},
{
@@ -116,9 +116,9 @@
{
"name": "locator_item_hat",
"parent": "head_correction",
"pivot": [0, 31, -2],
"pivot": [0, 32, -2],
"locators": {
"item_hat": [0, 31, -2]
"item_hat": [0, 32, -2]
}
},
{
@@ -132,9 +132,9 @@
{
"name": "locator_item_face",
"parent": "head_correction",
"pivot": [0, 28.8, -5.5],
"pivot": [0, 29.55, -7.5],
"locators": {
"item_face": [0, 28.8, -5.5]
"item_face": [0, 29.55, -7.5]
}
},
{
@@ -175,15 +175,9 @@
{
"name": "stick",
"parent": "jaw",
"pivot": [-1.7, 26.9, -4.1],
"pivot": [-1.7, 26.9, -3.8],
"cubes": [
{"origin": [-2.2, 26.9, -5.4], "size": [1, 2, 2], "pivot": [-1.7, 26.9, -3.4], "rotation": [45, 0, 0], "uv": [40, 38]},
{"origin": [-2.2, 27.9, -6.4], "size": [1, 2, 2], "pivot": [-1.7, 26.9, -3.4], "rotation": [45, 0, 0], "uv": [40, 42]},
{"origin": [-2.2, 29.9, -8.4], "size": [1, 2, 2], "pivot": [-1.7, 26.9, -3.4], "rotation": [45, 0, 0], "uv": [44, 40]},
{"origin": [-2.2, 28.9, -7.4], "size": [1, 2, 2], "pivot": [-1.7, 26.9, -3.4], "rotation": [45, 0, 0], "uv": [44, 36]},
{"origin": [-2.2, 31.9, -10.4], "size": [1, 2, 2], "pivot": [-1.7, 26.9, -3.4], "rotation": [45, 0, 0], "uv": [48, 42]},
{"origin": [-2.2, 31.9, -7.4], "size": [1, 2, 2], "pivot": [-1.7, 26.9, -3.4], "rotation": [45, 0, 0], "uv": [40, 34]},
{"origin": [-2.2, 30.9, -9.4], "size": [1, 2, 2], "pivot": [-1.7, 26.9, -3.4], "rotation": [45, 0, 0], "uv": [48, 38]}
{"origin": [-1.7, 26.2, -8.4], "size": [0, 2, 5], "uv": [38, 29]}
]
},
{
@@ -128,9 +128,9 @@
{
"name": "locator_item_hat",
"parent": "head_correction",
"pivot": [0, 37, -3.75],
"pivot": [0, 38.75, -3.5],
"locators": {
"item_hat": [0, 37, -3.75]
"item_hat": [0, 38.75, -3.5]
}
},
{
@@ -144,9 +144,9 @@
{
"name": "locator_item_face",
"parent": "head_correction",
"pivot": [0, 36, -6.75],
"pivot": [0, 36, -7.75],
"locators": {
"item_face": [0, 36, -6.75]
"item_face": [0, 36, -7.75]
}
},
{
@@ -186,15 +186,9 @@
{
"name": "stick",
"parent": "jaw",
"pivot": [-1.8, 32.3, -5.6],
"pivot": [-1, 32.3, -5.95],
"cubes": [
{"origin": [-2.3, 32.3, -6.7], "size": [1, 2, 2], "pivot": [-1.8, 32.3, -4.7], "rotation": [45, 0, 0], "uv": [52, 35]},
{"origin": [-2.3, 33.3, -7.7], "size": [1, 2, 2], "pivot": [-1.8, 32.3, -4.7], "rotation": [45, 0, 0], "uv": [52, 39]},
{"origin": [-2.3, 35.3, -9.7], "size": [1, 2, 2], "pivot": [-1.8, 32.3, -4.7], "rotation": [45, 0, 0], "uv": [39, 52]},
{"origin": [-2.3, 34.3, -8.7], "size": [1, 2, 2], "pivot": [-1.8, 32.3, -4.7], "rotation": [45, 0, 0], "uv": [33, 52]},
{"origin": [-2.3, 37.3, -11.7], "size": [1, 2, 2], "pivot": [-1.8, 32.3, -4.7], "rotation": [45, 0, 0], "uv": [62, 58]},
{"origin": [-2.3, 34.3, -11.7], "size": [1, 2, 2], "pivot": [-1.8, 32.3, -4.7], "rotation": [45, 0, 0], "uv": [66, 60]},
{"origin": [-2.3, 36.3, -10.7], "size": [1, 2, 2], "pivot": [-1.8, 32.3, -4.7], "rotation": [45, 0, 0], "uv": [52, 26]}
{"origin": [-1.5, 31.2, -10.85], "size": [0, 2, 5], "uv": [61, 57]}
]
},
{
@@ -60,36 +60,27 @@
"parent": "hand_wand",
"pivot": [-21, 26.75, 0.5],
"cubes": [
{"origin": [-21.6, 34.25, 7], "size": [1, 2, 2], "pivot": [-21.6, 27.75, 0.5], "rotation": [45, 0, 0], "uv": [1, 71]},
{"origin": [-21.6, 33.25, 6], "size": [1, 2, 2], "pivot": [-21.6, 27.75, 0.5], "rotation": [45, 0, 0], "uv": [7, 71]},
{"origin": [-21.6, 31.25, 4], "size": [1, 2, 2], "pivot": [-21.6, 27.75, 0.5], "rotation": [45, 0, 0], "uv": [7, 75]},
{"origin": [-21.6, 30.25, 3], "size": [1, 2, 2], "pivot": [-21.6, 27.75, 0.5], "rotation": [45, 0, 0], "uv": [1, 79]},
{"origin": [-21.6, 32.25, 5], "size": [1, 2, 2], "pivot": [-21.6, 27.75, 0.5], "rotation": [45, 0, 0], "uv": [1, 75]},
{"origin": [-21.6, 26.25, -1], "size": [1, 2, 2], "pivot": [-21.6, 27.75, 0.5], "rotation": [45, 0, 0], "uv": [1, 87]},
{"origin": [-21.6, 24.25, -2], "size": [1, 3, 2], "pivot": [-21.6, 27.75, 0.5], "rotation": [45, 0, 0], "uv": [7, 91]},
{"origin": [-21.6, 23.25, -4], "size": [1, 3, 3], "pivot": [-21.6, 27.75, 0.5], "rotation": [45, 0, 0], "uv": [1, 95]},
{"origin": [-21.6, 22.25, -3], "size": [1, 1, 1], "pivot": [-21.6, 27.75, 0.5], "rotation": [45, 0, 0], "uv": [5, 71]},
{"origin": [-21.6, 21.25, -5], "size": [1, 2, 2], "pivot": [-21.6, 27.75, 0.5], "rotation": [45, 0, 0], "uv": [7, 87]},
{"origin": [-21.6, 20.25, -6], "size": [1, 2, 2], "pivot": [-21.6, 27.75, 0.5], "rotation": [45, 0, 0], "uv": [1, 91]},
{"origin": [-21.6, 24.25, -7], "size": [1, 2, 3], "pivot": [-21.6, 27.75, 0.5], "rotation": [45, 0, 0], "uv": [1, 101]},
{"origin": [-21.6, 27.25, 0], "size": [1, 2, 2], "pivot": [-21.6, 27.75, 0.5], "rotation": [45, 0, 0], "uv": [7, 83]},
{"origin": [-21.6, 29.25, 2], "size": [1, 2, 2], "pivot": [-21.6, 27.75, 0.5], "rotation": [45, 0, 0], "uv": [7, 79]},
{"origin": [-21.6, 28.25, 1], "size": [1, 2, 2], "pivot": [-21.6, 27.75, 0.5], "rotation": [45, 0, 0], "uv": [1, 83]},
{"origin": [-21.6, 30.25, 0], "size": [1, 3, 2], "pivot": [-21.7, 27.75, 0.5], "rotation": [45, 0, 0], "uv": [121, 122]},
{"origin": [-21.6, 29.25, -2], "size": [1, 2, 3], "pivot": [-21.7, 27.75, 0.5], "rotation": [45, 0, 0], "uv": [119, 117]},
{"origin": [-21.6, 31.25, -1], "size": [1, 1, 1], "pivot": [-21.7, 27.75, 0.5], "rotation": [45, 0, 0], "uv": [110, 125]},
{"origin": [-21.6, 26.25, 4], "size": [1, 1, 1], "pivot": [-21.7, 27.75, 0.5], "rotation": [45, 0, 0], "uv": [110, 123]},
{"origin": [-21.6, 25.25, 2], "size": [1, 3, 2], "pivot": [-21.7, 27.75, 0.5], "rotation": [45, 0, 0], "uv": [115, 122]},
{"origin": [-21.6, 27.25, 3], "size": [1, 2, 3], "pivot": [-21.7, 27.75, 0.5], "rotation": [45, 0, 0], "uv": [111, 117]}
{"origin": [-21.5, 22.75, -1], "size": [1, 5, 1], "pivot": [-21, 22.75, 0], "rotation": [150, 0, 0], "uv": [80, 8]},
{"origin": [-21.5, 18.25, 0], "size": [1, 19, 1], "inflate": 0.01, "uv": [124, 44]}
]
},
{
"name": "ribbon",
"parent": "wand",
"pivot": [-21, 31.5, 0.5],
"cubes": [
{"origin": [-21.5, 30, 0], "size": [1, 3, 1], "inflate": 0.15, "uv": [120, 124]},
{"origin": [-21, 29, 1.15], "size": [0, 5, 2], "uv": [124, 116]},
{"origin": [-21, 29, -2.15], "size": [0, 5, 2], "uv": [124, 121]}
]
},
{
"name": "fire",
"parent": "wand",
"pivot": [-21, 38.75, 0.5],
"pivot": [-21, 34.75, 0.5],
"cubes": [
{"origin": [-21, 38.75, -2.5], "size": [0, 10, 6], "uv": [88, 65]},
{"origin": [-24, 38.75, 0.5], "size": [6, 10, 0], "uv": [108, 71]}
{"origin": [-21, 34.75, -2.5], "size": [0, 10, 6], "uv": [88, 65]},
{"origin": [-24, 34.75, 0.5], "size": [6, 10, 0], "uv": [108, 71]}
]
},
{
@@ -874,25 +865,10 @@
"name": "stick_tail",
"parent": "tail",
"pivot": [0, 22.5, 9],
"rotation": [-10, 0, 0],
"rotation": [-12.5, 0, 0],
"cubes": [
{"origin": [-0.5, 22.35, 5], "size": [1, 3, 3], "pivot": [0.5, 26.85, 9.5], "rotation": [-140, 0, 0], "uv": [13, 87]},
{"origin": [-0.5, 23.35, 7], "size": [1, 3, 2], "pivot": [0.5, 26.85, 9.5], "rotation": [-140, 0, 0], "uv": [19, 83]},
{"origin": [-0.5, 25.35, 8], "size": [1, 2, 2], "pivot": [0.5, 26.85, 9.5], "rotation": [-140, 0, 0], "uv": [13, 79]},
{"origin": [-0.5, 23.35, 10], "size": [1, 3, 2], "pivot": [0.5, 26.85, 9.5], "rotation": [-140, 0, 0], "uv": [121, 111]},
{"origin": [-0.5, 28.35, 8], "size": [1, 3, 2], "pivot": [0.5, 26.85, 9.5], "rotation": [-140, 0, 0], "uv": [115, 111]},
{"origin": [-0.5, 25.35, 11], "size": [1, 2, 3], "pivot": [0.5, 26.85, 9.5], "rotation": [-140, 0, 0], "uv": [119, 106]},
{"origin": [-0.5, 27.35, 6], "size": [1, 2, 3], "pivot": [0.5, 26.85, 9.5], "rotation": [-140, 0, 0], "uv": [111, 106]},
{"origin": [-0.5, 24.35, 12], "size": [1, 1, 1], "pivot": [0.5, 26.85, 9.5], "rotation": [-140, 0, 0], "uv": [110, 114]},
{"origin": [-0.5, 29.35, 7], "size": [1, 1, 1], "pivot": [0.5, 26.85, 9.5], "rotation": [-140, 0, 0], "uv": [110, 112]},
{"origin": [-0.5, 26.35, 9], "size": [1, 2, 2], "pivot": [0.5, 26.85, 9.5], "rotation": [-140, 0, 0], "uv": [19, 75]},
{"origin": [-0.5, 27.35, 10], "size": [1, 2, 2], "pivot": [0.5, 26.85, 9.5], "rotation": [-140, 0, 0], "uv": [13, 75]},
{"origin": [-0.5, 28.35, 11], "size": [1, 2, 2], "pivot": [0.5, 26.85, 9.5], "rotation": [-140, 0, 0], "uv": [19, 71]},
{"origin": [-0.5, 29.35, 12], "size": [1, 2, 2], "pivot": [0.5, 26.85, 9.5], "rotation": [-140, 0, 0], "uv": [13, 71]},
{"origin": [-0.5, 23.35, 2], "size": [1, 2, 3], "pivot": [0.5, 26.85, 9.5], "rotation": [-140, 0, 0], "uv": [13, 93]},
{"origin": [-0.5, 20.35, 4], "size": [1, 2, 2], "pivot": [0.5, 26.85, 9.5], "rotation": [-140, 0, 0], "uv": [19, 79]},
{"origin": [-0.5, 19.35, 3], "size": [1, 2, 2], "pivot": [0.5, 26.85, 9.5], "rotation": [-140, 0, 0], "uv": [13, 83]},
{"origin": [-0.5, 21.35, 6], "size": [1, 1, 1], "pivot": [0.5, 26.85, 9.5], "rotation": [-140, 0, 0], "uv": [17, 71]}
{"origin": [-0.5, 30, 8.5], "size": [1, 5, 1], "pivot": [0, 30, 9.5], "rotation": [-30, 0, 0], "uv": [76, 8]},
{"origin": [-0.5, 20.5, 8.5], "size": [1, 14, 1], "inflate": 0.01, "uv": [120, 49]}
]
},
{
@@ -61,40 +61,64 @@
"pivot": [-25, 35.75, 0],
"rotation": [90, 0, 0],
"cubes": [
{"origin": [-25.5, 28.75, -0.5], "size": [1, 2, 2], "pivot": [-27.5, 28.75, -0.5], "rotation": [45, 0, 0], "uv": [236, 77]},
{"origin": [-25.5, 29.75, 0.5], "size": [1, 2, 2], "pivot": [-27.5, 28.75, -0.5], "rotation": [45, 0, 0], "uv": [242, 77]},
{"origin": [-25.5, 31.75, 2.5], "size": [1, 2, 2], "pivot": [-27.5, 28.75, -0.5], "rotation": [45, 0, 0], "uv": [242, 81]},
{"origin": [-25.5, 30.75, 1.5], "size": [1, 2, 2], "pivot": [-27.5, 28.75, -0.5], "rotation": [45, 0, 0], "uv": [236, 81]},
{"origin": [-25.5, 33.75, 4.5], "size": [1, 3, 2], "pivot": [-27.5, 28.75, -0.5], "rotation": [45, 0, 0], "uv": [248, 90]},
{"origin": [-25.5, 35.75, 5.5], "size": [1, 2, 2], "pivot": [-27.5, 28.75, -0.5], "rotation": [45, 0, 0], "uv": [236, 85]},
{"origin": [-25.5, 36.75, 6.5], "size": [1, 2, 2], "pivot": [-27.5, 28.75, -0.5], "rotation": [45, 0, 0], "uv": [242, 85]},
{"origin": [-25.5, 38.75, 8.5], "size": [1, 2, 2], "pivot": [-27.5, 28.75, -0.5], "rotation": [45, 0, 0], "uv": [242, 89]},
{"origin": [-25.5, 40.75, 9.5], "size": [1, 1, 1], "pivot": [-27, 28.75, -0.5], "rotation": [45, 0, 0], "uv": [240, 77]},
{"origin": [-25.5, 39.75, 10.5], "size": [1, 5, 2], "pivot": [-27.5, 28.75, -0.5], "rotation": [45, 0, 0], "uv": [236, 93]},
{"origin": [-25.5, 39.75, 12.5], "size": [1, 3, 1], "pivot": [-27.5, 28.75, -0.5], "rotation": [45, 0, 0], "uv": [248, 95]},
{"origin": [-25.5, 40.75, 13.5], "size": [1, 2, 2], "pivot": [-27.5, 28.75, -0.5], "rotation": [45, 0, 0], "uv": [248, 77]},
{"origin": [-25.5, 41.75, 14.5], "size": [1, 2, 2], "pivot": [-27.5, 28.75, -0.5], "rotation": [45, 0, 0], "uv": [248, 81]},
{"origin": [-25.5, 42.75, 15.5], "size": [1, 4, 2], "pivot": [-27.5, 28.75, -0.5], "rotation": [45, 0, 0], "uv": [242, 93]},
{"origin": [-25.5, 44.75, 11.5], "size": [1, 1, 1], "pivot": [-27, 28.75, -0.5], "rotation": [45, 0, 0], "uv": [246, 77]},
{"origin": [-25.5, 32.75, 3.5], "size": [1, 3, 2], "pivot": [-27.5, 28.75, -0.5], "rotation": [45, 0, 0], "uv": [248, 85]},
{"origin": [-25.5, 37.75, 7.5], "size": [1, 2, 2], "pivot": [-27.5, 28.75, -0.5], "rotation": [45, 0, 0], "uv": [236, 89]},
{"origin": [-25.5, 38.75, 4.5], "size": [1, 2, 3], "pivot": [-27.5, 28.75, -0.5], "rotation": [45, 0, 0], "uv": [247, 117]},
{"origin": [-25.5, 39.75, 6.5], "size": [1, 3, 2], "pivot": [-27.5, 28.75, -0.5], "rotation": [45, 0, 0], "uv": [249, 122]},
{"origin": [-25.5, 40.75, 5.5], "size": [1, 1, 1], "pivot": [-27.5, 28.75, -0.5], "rotation": [45, 0, 0], "uv": [238, 123]},
{"origin": [-25.5, 36.75, 9.5], "size": [1, 2, 3], "pivot": [-27.5, 28.75, -0.5], "rotation": [45, 0, 0], "uv": [239, 117]},
{"origin": [-25.5, 34.75, 8.5], "size": [1, 3, 2], "pivot": [-27.5, 28.75, -0.5], "rotation": [45, 0, 0], "uv": [243, 122]},
{"origin": [-25.5, 35.75, 10.5], "size": [1, 1, 1], "pivot": [-27.5, 28.75, -0.5], "rotation": [45, 0, 0], "uv": [238, 125]}
{"origin": [-25.5, 29.75, -0.5], "size": [1, 7, 1], "uv": [124, 27]}
]
},
{
"name": "wand2",
"parent": "wand",
"pivot": [-25, 36.75, 0.5],
"rotation": [10, 0, 0],
"cubes": [
{"origin": [-25.5, 36.75, -0.5], "size": [1, 10, 1], "inflate": 0.01, "uv": [124, 3]}
]
},
{
"name": "ribbon",
"parent": "wand2",
"pivot": [-25, 44.15, 0],
"cubes": [
{"origin": [-25.5, 42.65, -0.5], "size": [1, 3, 1], "inflate": 0.15, "uv": [252, 124]},
{"origin": [-25, 41.65, 0.65], "size": [0, 5, 2], "uv": [248, 117]},
{"origin": [-25, 41.65, -2.65], "size": [0, 5, 2], "uv": [252, 117]}
]
},
{
"name": "wand3",
"parent": "wand2",
"pivot": [-25, 46.75, -0.5],
"rotation": [-32.5, 0, 0],
"cubes": [
{"origin": [-25.5, 46.75, -0.5], "size": [1, 6, 1], "inflate": 0.02, "uv": [120, 31]}
]
},
{
"name": "wand_detail",
"parent": "wand3",
"pivot": [-25, 47.25, -0.5],
"rotation": [-27.5, 0, 0],
"cubes": [
{"origin": [-25.5, 47.25, -3.5], "size": [1, 1, 3], "uv": [120, 16]}
]
},
{
"name": "fire",
"parent": "wand",
"parent": "wand3",
"pivot": [-25, 52.25, 0],
"cubes": [
{"origin": [-25, 51.75, -3], "size": [0, 10, 6], "uv": [138, 108]},
{"origin": [-28, 51.75, 0], "size": [6, 10, 0], "uv": [156, 114]}
]
},
{
"name": "wand4",
"parent": "wand3",
"pivot": [-25, 52.75, 0.5],
"rotation": [52.5, 0, 0],
"cubes": [
{"origin": [-25.5, 52.75, -0.5], "size": [1, 3, 1], "uv": [124, 22]}
]
},
{
"name": "body",
"parent": "delphox",
@@ -30,7 +30,11 @@
"isBattle": false,
"isTouchingWater": false,
"animations": [
"q.look('head_ai')",
"q.look('neck', 0.5, 0.5, 15, -15, 30, -30)",
"q.look('neck2', 0.5, 0.5, 10, -10, 25, -25)",
"q.look('neck3', 0.45, 0.45, 10, -10, 20, -20)",
"q.look('neck4', 0.35, 0.35, 5, -5, 15, -15)",
"q.look('head', 0.4, 0.25, 5, -5, 10, -10)",
"q.bedrock('charizard', 'ground_idle')",
{
"condition": "q.is_holding_item",
@@ -44,7 +48,11 @@
"isBattle": true,
"isTouchingWater": false,
"animations": [
"q.look('head_ai')",
"q.look('neck', 0.5, 0.5, 15, -15, 30, -30)",
"q.look('neck2', 0.5, 0.5, 10, -10, 25, -25)",
"q.look('neck3', 0.45, 0.45, 10, -10, 20, -20)",
"q.look('neck4', 0.35, 0.35, 5, -5, 15, -15)",
"q.look('head', 0.4, 0.25, 5, -5, 10, -10)",
"q.bedrock('charizard', 'battle_idle')",
{
"condition": "q.is_holding_item",
@@ -63,7 +71,11 @@
"poseTypes": ["HOVER"],
"isBattle": true,
"animations": [
"q.look('head_ai')",
"q.look('neck', 0.5, 0.5, 15, -15, 30, -30)",
"q.look('neck2', 0.5, 0.5, 10, -10, 25, -25)",
"q.look('neck3', 0.45, 0.45, 10, -10, 20, -20)",
"q.look('neck4', 0.35, 0.35, 5, -5, 15, -15)",
"q.look('head', 0.4, 0.25, 5, -5, 10, -10)",
"q.bedrock('charizard', 'air_idle')",
{
"condition": "q.is_holding_item",
@@ -85,7 +97,11 @@
"poseTypes": ["STAND", "WALK"],
"condition": "q.in_air",
"animations": [
"q.look('head_ai')",
"q.look('neck', 0.5, 0.5, 15, -15, 30, -30)",
"q.look('neck2', 0.5, 0.5, 10, -10, 25, -25)",
"q.look('neck3', 0.45, 0.45, 10, -10, 20, -20)",
"q.look('neck4', 0.35, 0.35, 5, -5, 15, -15)",
"q.look('head', 0.4, 0.25, 5, -5, 10, -10)",
"q.bedrock('charizard', 'ride_jump')",
{
"condition": "q.is_holding_item",
@@ -104,7 +120,11 @@
"isTouchingWater": false,
"condition": "!q.in_air && q.is_sprinting",
"animations": [
"q.look('head_ai')",
"q.look('neck', 0.5, 0.5, 15, -15, 30, -30)",
"q.look('neck2', 0.5, 0.5, 10, -10, 25, -25)",
"q.look('neck3', 0.45, 0.45, 10, -10, 20, -20)",
"q.look('neck4', 0.35, 0.35, 5, -5, 15, -15)",
"q.look('head', 0.4, 0.25, 5, -5, 10, -10)",
"q.bedrock('charizard', 'ground_run')",
{
"condition": "q.is_ridden",
@@ -125,7 +145,11 @@
"isTouchingWater": false,
"condition": "!q.in_air",
"animations": [
"q.look('head_ai')",
"q.look('neck', 0.5, 0.5, 15, -15, 30, -30)",
"q.look('neck2', 0.5, 0.5, 10, -10, 25, -25)",
"q.look('neck3', 0.45, 0.45, 10, -10, 20, -20)",
"q.look('neck4', 0.35, 0.35, 5, -5, 15, -15)",
"q.look('head', 0.4, 0.25, 5, -5, 10, -10)",
"q.bedrock('charizard', 'ground_idle')",
{
"condition": "q.is_holding_item",
@@ -144,7 +168,11 @@
"isTouchingWater": false,
"condition": "!q.in_air && !q.is_sprinting",
"animations": [
"q.look('head_ai')",
"q.look('neck', 0.5, 0.5, 15, -15, 30, -30)",
"q.look('neck2', 0.5, 0.5, 10, -10, 25, -25)",
"q.look('neck3', 0.45, 0.45, 10, -10, 20, -20)",
"q.look('neck4', 0.35, 0.35, 5, -5, 15, -15)",
"q.look('head', 0.4, 0.25, 5, -5, 10, -10)",
"q.bedrock('charizard', 'ground_walk')",
{
"condition": "q.is_ridden",
@@ -163,7 +191,11 @@
"poseTypes": ["HOVER"],
"isBattle": false,
"animations": [
"q.look('head_ai')",
"q.look('neck', 0.5, 0.5, 15, -15, 30, -30)",
"q.look('neck2', 0.5, 0.5, 10, -10, 25, -25)",
"q.look('neck3', 0.45, 0.45, 10, -10, 20, -20)",
"q.look('neck4', 0.35, 0.35, 5, -5, 15, -15)",
"q.look('head', 0.4, 0.25, 5, -5, 10, -10)",
"q.bedrock('charizard', 'air_idle')",
{
"condition": "q.is_holding_item",
@@ -179,7 +211,11 @@
"isBattle": false,
"condition": "!q.is_gliding",
"animations": [
"q.look('head_ai')",
"q.look('neck', 0.5, 0.5, 15, -15, 30, -30)",
"q.look('neck2', 0.5, 0.5, 10, -10, 25, -25)",
"q.look('neck3', 0.45, 0.45, 10, -10, 20, -20)",
"q.look('neck4', 0.35, 0.35, 5, -5, 15, -15)",
"q.look('head', 0.4, 0.25, 5, -5, 10, -10)",
"q.bedrock('charizard', 'air_fly')",
{
"condition": "q.is_ridden",
@@ -200,7 +236,11 @@
"isBattle": false,
"condition": "q.is_gliding",
"animations": [
"q.look('head_ai')",
"q.look('neck', 0.5, 0.5, 15, -15, 30, -30)",
"q.look('neck2', 0.5, 0.5, 10, -10, 25, -25)",
"q.look('neck3', 0.45, 0.45, 10, -10, 20, -20)",
"q.look('neck4', 0.35, 0.35, 5, -5, 15, -15)",
"q.look('head', 0.4, 0.25, 5, -5, 10, -10)",
"q.bedrock('charizard', 'air_glide')",
"q.bedrock('charizard', 'ride_air_dive')",
{
@@ -221,7 +261,11 @@
"isTouchingWater": true,
"isUnderWater": false,
"animations": [
"q.look('head_ai')",
"q.look('neck', 0.5, 0.5, 15, -15, 30, -30)",
"q.look('neck2', 0.5, 0.5, 10, -10, 25, -25)",
"q.look('neck3', 0.45, 0.45, 10, -10, 20, -20)",
"q.look('neck4', 0.35, 0.35, 5, -5, 15, -15)",
"q.look('head', 0.4, 0.25, 5, -5, 10, -10)",
"q.bedrock('charizard', 'surfacewater_idle')",
{
"condition": "q.is_holding_item",
@@ -243,7 +287,11 @@
"isTouchingWater": true,
"isUnderWater": false,
"animations": [
"q.look('head_ai')",
"q.look('neck', 0.5, 0.5, 15, -15, 30, -30)",
"q.look('neck2', 0.5, 0.5, 10, -10, 25, -25)",
"q.look('neck3', 0.45, 0.45, 10, -10, 20, -20)",
"q.look('neck4', 0.35, 0.35, 5, -5, 15, -15)",
"q.look('head', 0.4, 0.25, 5, -5, 10, -10)",
"q.bedrock('charizard', 'surfacewater_swim')",
{
"condition": "q.is_holding_item",
@@ -31,7 +31,7 @@
"q.bedrock_quirk('aerodactyl', 'blink')"
],
"namedAnimations": {
"cry": "q.bedrock_primary('aerodactyl', 'battle_cry', q.curve('symmetrical_wide'))"
"cry": "q.bedrock_stateful('aerodactyl', 'battle_cry', q.curve('symmetrical_wide'))"
}
},
"battle-flying": {
@@ -111,6 +111,7 @@
"poseTypes": ["FLY"],
"condition": "!q.is_gliding",
"animations": [
"q.pitch_tilt('body')",
"q.look('neck', 0.5, 1, 10, -10, 20, -20)",
"q.look('head', 1, 0.25, 10, -15, 5, -5)",
"q.bedrock('dragonite', 'air_glide')",
@@ -158,6 +159,7 @@
"isUnderWater": true,
"poseTypes": ["SWIM"],
"animations": [
"q.pitch_tilt('body')",
"q.look('neck', 0.5, 1, 10, -10, 20, -20)",
"q.look('head', 1, 0.25, 10, -15, 5, -5)",
"q.bedrock('dragonite', 'water_swim')"
@@ -1,6 +1,6 @@
{
"portraitScale": 1.17,
"portraitTranslation": [-0.69, 0.99, 0],
"portraitScale": 1.39,
"portraitTranslation": [-0.84, 1.25, 0],
"profileScale": 0.48,
"profileTranslation": [0, 0.96, 0],
"rootBone": "swampert",
@@ -65,7 +65,7 @@
"transformedParts": [
{
"part": "body",
"position": [9, -1, 0]
"position": [9, 5, 0]
}
]
},
@@ -83,7 +83,7 @@
"transformedParts": [
{
"part": "body",
"position": [-9, -1, 0]
"position": [-9, 5, 0]
}
]
}
@@ -1,6 +1,6 @@
{
"portraitScale": 1.22,
"portraitTranslation": [-1.56, 1.41, 0],
"portraitTranslation": [-1.68, 1.23, 0],
"profileScale": 0.35,
"profileTranslation": [0, 1.15, 0],
"rootBone": "salamence",
@@ -62,7 +62,7 @@
"transformedParts": [
{
"part": "body",
"position": [10, 0, 0]
"position": [5, 0, 0]
}
]
},
@@ -73,7 +73,7 @@
"transformedParts": [
{
"part": "body",
"position": [-10, 0, 0]
"position": [-5, 0, 0]
}
]
}
@@ -36,6 +36,28 @@
"q.bedrock('tynamo', 'ground_idle')"
],
"quirks": ["q.bedrock_quirk('tynamo', 'blink')"]
},
"shoulder_left": {
"poseTypes": ["SHOULDER_LEFT"],
"animations": ["q.look('head')", "q.bedrock('tynamo', 'ground_idle')"],
"quirks": ["q.bedrock_quirk('tynamo', 'blink')"],
"transformedParts": [
{
"part": "body",
"position": [1, 0, 0]
}
]
},
"shoulder_right": {
"poseTypes": ["SHOULDER_RIGHT"],
"animations": ["q.look('head')", "q.bedrock('tynamo', 'ground_idle')"],
"quirks": ["q.bedrock_quirk('tynamo', 'blink')"],
"transformedParts": [
{
"part": "body",
"position": [-1, 0, 0]
}
]
}
}
}
@@ -92,7 +92,7 @@
"SLEEP"
],
"animations": [
"q.bedrock('tyrantrum', 'sleep')"
"q.bedrock('tyrantrum', 'ground_idle')"
]
}
}
@@ -24,7 +24,9 @@
"poseTypes": ["STAND", "FLOAT", "NONE", "PORTRAIT", "PROFILE"],
"condition": "q.has_entity ? !q.in_air : 1.0",
"animations": [
"q.look('head')",
"q.look('neck', 0.5, 0.5, 15, -15, 30, -30)",
"q.look('neck2', 0.5, 0.5, 10, -10, 25, -25)",
"q.look('head', 0.4, 0.25, 5, -5, 10, -10)",
"q.bedrock('mudsdale', 'ground_idle')",
"q.bedrock_stateful('mudsdale', 'blink')"
],
@@ -40,7 +42,9 @@
"condition": "q.in_air",
"isBattle": false,
"animations": [
"q.look('head')",
"q.look('neck', 0.5, 0.5, 15, -15, 30, -30)",
"q.look('neck2', 0.5, 0.5, 10, -10, 25, -25)",
"q.look('head', 0.4, 0.25, 5, -5, 10, -10)",
"q.bedrock('mudsdale', 'ride_jump')",
"q.bedrock('mudsdale', 'ride_ground_run')",
"q.bedrock_stateful('mudsdale', 'blink')"
@@ -53,7 +57,9 @@
"poseTypes": ["WALK", "SWIM"],
"condition": "!q.is_sprinting",
"animations": [
"q.look('head')",
"q.look('neck', 0.5, 0.5, 15, -15, 30, -30)",
"q.look('neck2', 0.5, 0.5, 10, -10, 25, -25)",
"q.look('head', 0.4, 0.25, 5, -5, 10, -10)",
"q.bedrock('mudsdale', 'ground_walk')",
"q.bedrock_stateful('mudsdale', 'blink')",
{
@@ -67,7 +73,9 @@
"poseTypes": ["WALK", "SWIM"],
"condition": "q.is_sprinting",
"animations": [
"q.look('head')",
"q.look('neck', 0.5, 0.5, 15, -15, 30, -30)",
"q.look('neck2', 0.5, 0.5, 10, -10, 25, -25)",
"q.look('head', 0.4, 0.25, 5, -5, 10, -10)",
"q.bedrock('mudsdale', 'ground_run')",
"q.bedrock_stateful('mudsdale', 'blink')",
{
@@ -1,12 +1,11 @@
{
"portraitScale": 1.5,
"portraitTranslation": [-0.09, 0.5, 0],
"portraitScale": 1.56,
"portraitTranslation": [-0.02, 0.52, 0],
"profileScale": 0.51,
"profileTranslation": [0.0, 1.0, 0.0],
"rootBone": "tadbulb",
"animations": {
"faint": "q.bedrock_primary('tadbulb', 'faint', q.curve('one'))",
"cry": "q.bedrock_stateful('tadbulb', 'cry')",
"recoil": "q.bedrock_stateful('tadbulb', 'recoil')",
"physical": "q.bedrock_primary('tadbulb', 'physical', q.curve('symmetrical_wide'))",
"special": "q.bedrock_primary('tadbulb', 'special', q.curve('symmetrical'))",
@@ -14,7 +13,7 @@
},
"poses": {
"battle-standing": {
"poseTypes": ["STAND"],
"poseTypes": ["STAND", "HOVER", "FLOAT"],
"isBattle": true,
"animations": [
"q.look('head')",
@@ -28,7 +27,7 @@
}
},
"standing": {
"poseTypes": ["STAND", "NONE"],
"poseTypes": ["STAND", "HOVER", "FLOAT", "NONE", "PORTRAIT", "PROFILE"],
"isBattle": false,
"animations": [
"q.look('head')",
@@ -37,8 +36,7 @@
"quirks": ["q.bedrock_quirk('tadbulb', 'blink')"]
},
"walking": {
"poseTypes": ["WALK", "SWIM"],
"isBattle": false,
"poseTypes": ["WALK"],
"condition": "!q.is_sprinting",
"animations": [
"q.look('head')",
@@ -47,8 +45,7 @@
"quirks": ["q.bedrock_quirk('tadbulb', 'blink')"]
},
"running": {
"poseTypes": ["WALK", "SWIM"],
"isBattle": false,
"poseTypes": ["WALK"],
"condition": "q.is_sprinting",
"animations": [
"q.look('head')",
@@ -56,12 +53,42 @@
],
"quirks": ["q.bedrock_quirk('tadbulb', 'blink')"]
},
"fly": {
"poseTypes": ["WALK", "FLY", "SWIM"],
"animations": [
"q.pitch_tilt('body')",
"q.bedrock('tadbulb', 'ground_walk')"
],
"quirks": ["q.bedrock_quirk('tadbulb', 'blink')"]
},
"sleep": {
"poseTypes": ["SLEEP"],
"namedAnimations": {
"cry": "q.bedrock_stateful('dummy', 'cry')"
},
"animations": ["q.bedrock('tadbulb', 'sleep')"]
},
"shoulder_left": {
"poseTypes": ["SHOULDER_LEFT"],
"animations": ["q.look('head')", "q.bedrock('tadbulb', 'ground_idle')"],
"quirks": ["q.bedrock_quirk('tadbulb', 'blink')"],
"transformedParts": [
{
"part": "body",
"position": [3, 0, 0]
}
]
},
"shoulder_right": {
"poseTypes": ["SHOULDER_RIGHT"],
"animations": ["q.look('head')", "q.bedrock('tadbulb', 'ground_idle')"],
"quirks": ["q.bedrock_quirk('tadbulb', 'blink')"],
"transformedParts": [
{
"part": "body",
"position": [-3, 0, 0]
}
]
}
}
}
@@ -6,7 +6,6 @@
"rootBone": "bellibolt",
"animations": {
"faint": "q.bedrock_primary('bellibolt', 'faint', q.curve('one'))",
"cry": "q.bedrock_stateful('bellibolt', 'cry')",
"recoil": "q.bedrock_stateful('bellibolt', 'recoil')",
"physical": "q.bedrock_primary('bellibolt', 'physical', q.curve('symmetrical_wide'))",
"special": "q.bedrock_primary('bellibolt', 'special', q.curve('symmetrical_wide'))",
@@ -7,11 +7,26 @@
"poser": "cobblemon:braixen",
"model": "cobblemon:braixen.geo",
"texture": "cobblemon:textures/pokemon/0654_braixen/braixen.png",
"layers": []
"layers": [
{
"name": "emissive",
"emissive": true,
"texture": "cobblemon:textures/pokemon/0654_braixen/braixen_emissive.png",
"translucent": true
}
]
},
{
"aspects": ["shiny"],
"texture": "cobblemon:textures/pokemon/0654_braixen/braixen_shiny.png"
"texture": "cobblemon:textures/pokemon/0654_braixen/braixen_shiny.png",
"layers": [
{
"name": "emissive",
"emissive": true,
"texture": "cobblemon:textures/pokemon/0654_braixen/braixen_emissive_shiny.png",
"translucent": true
}
]
},
{
"aspects": ["cosmetic_item-silk_scarf"],
@@ -7,11 +7,26 @@
"poser": "cobblemon:delphox",
"model": "cobblemon:delphox.geo",
"texture": "cobblemon:textures/pokemon/0655_delphox/delphox.png",
"layers": []
"layers": [
{
"name": "emissive",
"emissive": true,
"texture": "cobblemon:textures/pokemon/0655_delphox/delphox_emissive.png",
"translucent": true
}
]
},
{
"aspects": ["shiny"],
"texture": "cobblemon:textures/pokemon/0655_delphox/delphox_shiny.png"
"texture": "cobblemon:textures/pokemon/0655_delphox/delphox_shiny.png",
"layers": [
{
"name": "emissive",
"emissive": true,
"texture": "cobblemon:textures/pokemon/0655_delphox/delphox_emissive_shiny.png",
"translucent": true
}
]
},
{
"aspects": ["cosmetic_item-silk_scarf"],
@@ -234,7 +234,7 @@
"item.cobblemon.soothe_bell": "Bell o' soothing",
"item.cobblemon.spell_tag": "Voodoo page",
"item.cobblemon.sticky_barb": "Sticky barb",
"item.cobblemon.terrain_extender": "Bottle o' terrains",
"item.cobblemon.terrain_extender": "Bottle o' islands",
"item.cobblemon.throat_spray": "Oral spray",
"item.cobblemon.twisted_spoon": "Useless spoon",
"item.cobblemon.utility_umbrella": "Weather'd parasol",
@@ -337,8 +337,8 @@
"item.cobblemon.medicinal_brew": "Brew o' potions",
"item.cobblemon.revive": "Candy o' resurrection",
"item.cobblemon.max_revive": "Candy o' total resurrection",
"item.cobblemon.pp_up": "Syrup o' PP increase",
"item.cobblemon.pp_max": "Syrup o' PP limit",
"item.cobblemon.pp_up": "Syrup o' pp increase",
"item.cobblemon.pp_max": "Syrup o' pp limit",
"item.cobblemon.x_attack": "Power pills",
"item.cobblemon.x_defence": "Strength pills",
"item.cobblemon.x_accuracy": "Shot rate pills",
@@ -515,7 +515,7 @@
"cobblemon.ui.starter.chooseyourstarter": "Press %1$s to pick a first mate 'nd adventure!",
"cobblemon.ui.moves": "Actions",
"cobblemon.ui.moves.switch": "Switch actions",
"cobblemon.ui.moves.pp": "%1$sPP",
"cobblemon.ui.moves.pp": "%1$spp",
"cobblemon.ui.stats": "Values",
"cobblemon.ui.stats.stat": "Value",
"cobblemon.ui.stats.base": "Core",
@@ -682,7 +682,7 @@
"item.cobblemon.hondew_berry": "Hondew berry",
"item.cobblemon.hondew_berry.tooltip": "Can't be eaten directly",
"item.cobblemon.hopo_berry": "Hopo berry",
"item.cobblemon.hopo_berry.tooltip": "Can't be eaten directly",
"item.cobblemon.hopo_berry.tooltip": "Restores 10 pp to a skill when fed t' a monster",
"item.cobblemon.iapapa_berry": "Iapapa berry",
"item.cobblemon.iapapa_berry.tooltip": "Restores a third o' a monster's health, confuses those with lower'd Strength, eaten at quarter health",
"item.cobblemon.jaboca_berry": "Jaboca berry",
@@ -698,7 +698,7 @@
"item.cobblemon.lansat_berry": "Lansat berry",
"item.cobblemon.lansat_berry.tooltip": "Eater gains energy o' focus at quarter health",
"item.cobblemon.leppa_berry": "Leppa berry",
"item.cobblemon.leppa_berry.tooltip": "Restores 10PP to an action",
"item.cobblemon.leppa_berry.tooltip": "Restores 10 pp to a skill when it hits 0",
"item.cobblemon.liechi_berry": "Liechi berry",
"item.cobblemon.liechi_berry.tooltip": "Raises eater's Power by a stage, eaten at quarter health",
"item.cobblemon.lum_berry": "Lum berry",
@@ -880,7 +880,7 @@
"advancements.cobblemon.obtain_fossil": "Consult th' fossil",
"advancements.cobblemon.obtain_fossil.description": "Unearth a fossil from ancient times",
"advancements.cobblemon.evolve_gholdengo_netherite": "Bury thee in th' treasure o' Davy Jones",
"advancements.cobblemon.evolve_gholdengo_netherite.description": "Transmogrify a plunderin' devil into a Blackbeard's clobber-coated Gholdengo",
"advancements.cobblemon.evolve_gholdengo_netherite.description": "Transmogrify a Gimmighoul into a Blackbeard's clobber-coated Gholdengo",
"advancements.cobblemon.resurrect_pokemon": "Dead men tell some tales",
"advancements.cobblemon.resurrect_pokemon.description": "Use a machine o' resurrection to bring a monster back from beyond death",
"advancements.cobblemon.obtain_tumblestone": "Tumbl'd rocks abound",
@@ -1015,7 +1015,7 @@
"cobblemon.battle.fieldstart.mistyterrain": "Mist swirls around th' area!",
"cobblemon.battle.fieldstart.mudsport": "Thund'r elementals be weakened!",
"cobblemon.battle.fieldstart.psychicterrain": "Th' battlefield got weird!",
"cobblemon.battle.fieldstart.trickroom": "%1$s twisted th' dimensions!",
"cobblemon.battle.fieldstart.trickroom": "%1$s twist'd th' dimensions!",
"cobblemon.battle.fieldstart.watersport": "Flames be weakened!",
"cobblemon.battle.fieldstart.wonderroom": "Ye strength 'nd resilience be swapped!",
"cobblemon.battle.fieldend.electricterrain": "Th' charge disappeared from th' battlefield.",
@@ -1025,7 +1025,7 @@
"cobblemon.battle.fieldend.mistyterrain": "Th' mist disappeared from th' battlefield.",
"cobblemon.battle.fieldend.mudsport": "Th' effects of mud sport have faded.",
"cobblemon.battle.fieldend.psychicterrain": "Th' weirdness disappeared from th' battlefield!",
"cobblemon.battle.fieldend.trickroom": "Th' twisted dimensions returned to normal!",
"cobblemon.battle.fieldend.trickroom": "Th' twist'd dimensions returned to normal!",
"cobblemon.battle.fieldend.watersport": "Th' effects of water sport have faded.",
"cobblemon.battle.fieldend.wonderroom": "Wonder room wore off, 'nd strength and resilience returned to normal!",
"cobblemon.battle.fieldactivate.perishsong": "All monsters tha' heard th' siren song will fall in three rounds!",
@@ -1087,7 +1087,7 @@
"cobblemon.battle.activate.stickyweb": "%1$s be stuck in th' web!",
"cobblemon.battle.activate.courtchange": "%1$s swapped th' battle effects affecting each side o' th' field!",
"cobblemon.battle.activate.guardsplit": "%1$s shared their guard with th' target!",
"cobblemon.battle.activate.spite": "Th' PP o' %1$s's %2$s reduced by %3$s!",
"cobblemon.battle.activate.spite": "Th' pp o' %1$s's %2$s reduced by %3$s!",
"cobblemon.battle.activate.lockon": "%1$s locked sights on %2$s!",
"cobblemon.battle.activate.protosynthesis": "Th' scorchin' sun trigger'd %1$s's protosynthesis!",
"cobblemon.battle.activate.bide": "%1$s be storin' power!",
@@ -1122,7 +1122,7 @@
"cobblemon.battle.activate.quickguard": "%1$s be protected by their hasty guard",
"cobblemon.battle.activate.safeguard": "%1$s be shield'd by th' veils!",
"cobblemon.battle.activate.sketch": "%1$s sketch'd %3$s!",
"cobblemon.battle.activate.grudge": "%1$s's %3$s be outta PP due to th' grudge!",
"cobblemon.battle.activate.grudge": "%1$s's %3$s be outta pp due to th' grudge!",
"cobblemon.battle.activate.speedswap": "%1$s swapped speeds with th' target!",
"cobblemon.battle.activate.switcheroo": "%1$s traded loot!",
"cobblemon.battle.activate.skillswap": "%1$s swapp'd skills!",
@@ -1442,11 +1442,11 @@
"gamerule.doShinyStarters": "First mates will be sparkled",
"gamerule.doPokemonLoot": "Drop monster loot",
"cobblemon.command.checkspawns.invalid-bucket": "Invalid spawn bucket",
"cobblemon.command.checkspawns.spawns": "Manifest o' spawns:",
"cobblemon.command.checkspawns.spawns": "Manifest o' spawns",
"cobblemon.command.checkspawns.nothing": "Nothing be able to spawn here at time.",
"cobblemon.interaction.ev.add": "%1$s gained %3$s %2$s EVs!",
"cobblemon.interaction.ev.deduct": "%1$s lost %3$s %2$s EVs!",
"cobblemon.interaction.pp.restore": "Ye restore th' PP o' %1$s.",
"cobblemon.interaction.pp.restore": "Ye restore th' pp o' %1$s.",
"cobblemon.interaction.friendsip.add": "%1$s grows closer t' ye!",
"cobblemon.interaction.status.cure": "%1$s be cured of th' status conditions!",
"cobblemon.interaction.hp.heal": "%1$s restored a bit o' health!",
@@ -1534,19 +1534,6 @@
"tag.item.cobblemon.feathers": "Feathers",
"tag.item.cobblemon.ability_changers": "Changers o' traits",
"tag.item.cobblemon.held.is_friendship_booster": "Boosters o' allydom",
"cobblemon.species.pikachu.name": "Rat o' ash",
"cobblemon.species.magnemite.name": "Mite o' mag",
"cobblemon.species.magneton.name": "Ton o' mag",
"cobblemon.species.eevee.name": "Cat o' nine",
"cobblemon.species.vaporeon.name": "Sea o' nine",
"cobblemon.species.flareon.name": "Flame o' nine",
"cobblemon.species.jolteon.name": "Spark o' nine",
"cobblemon.species.espeon.name": "Mind o' nine",
"cobblemon.species.umbreon.name": "Demon o' nine",
"cobblemon.species.leafeon.name": "Leaf o' nine",
"cobblemon.species.glaceon.name": "Frost o' nine",
"cobblemon.species.sylveon.name": "Fae o' nine",
"cobblemon.species.gimmighoul.name": "Plunderin' devil",
"cobblemon.ui.pokedex.info.form.gimmighoul": "Coffer form",
"item.cobblemon.smithing_template.pokerod.ingredients": "Monster capturers",
"item.cobblemon.poke_rod": "Monster rod",
@@ -1611,12 +1598,11 @@
"cobblemon.challenge.canceled.sender": "Ye canceled yer challenge to %1$s.",
"cobblemon.battle.clearboost": "%1$s's improvements were careened!",
"cobblemon.challenge.multi.accept.sender": "%1$s's fleet accepted th' challenge!",
"cobblemon.species.spoink.name": "Swine Spring",
"cobblemon.challenge.decline.sender": "%1$s declined yer challenge...",
"cobblemon.challenge.error.insufficient_pokemon.other": "%1$s doesn't have any monsters to battle with!",
"advancements.cobblemon.craft_pokedex.description": "Craft an index o' monsters out of some fruitnuts, steel, copper, 'nd some shiny powder",
"cobblemon.config.ui.minimum_level_range_max": "Minimum level range max",
"cobblemon.cooking.cooking_quality.medium": "Mediocre",
"cobblemon.cooking.cooking_quality.medium": "mediocre",
"cobblemon.ui.challenge.challenge_title": "Battle request",
"cobblemon.config.ui.display_entity_level_label": "Display entity level label",
"cobblemon.entity.pokemon": "Monster",
@@ -1670,7 +1656,7 @@
"cobblemon.seasoning_food_header": "nutritional",
"cobblemon.seasoning_flavor_header": "flavorful",
"cobblemon.seasoning_bait_effect_info_header": "Baitin' info:",
"cobblemon.seasoning_food_info_header": "Satin' info:",
"cobblemon.seasoning_food_info_header": "Nutritional info:",
"cobblemon.seasoning_flavor_info_header": "Flavor info:",
"cobblemon.seasoning_flavor.spicy": "Spicy",
"cobblemon.seasoning_flavor.dry": "Dry",
@@ -1682,8 +1668,8 @@
"cobblemon.tooltip.mob_effect_entry": "%1$s %2$s (%3$s)",
"block.cobblemon.potted_black_apricorn_sapling": "Dirt vase o' black fruitnut meager shrub",
"block.cobblemon.potted_blue_apricorn_sapling": "Dirt vase o' blue fruitnut meager shrub",
"cobblemon.cooking.cooking_quality.high": "Mast'rful",
"cobblemon.cooking.cooking_quality.low": "Poor",
"cobblemon.cooking.cooking_quality.high": "mast'rful",
"cobblemon.cooking.cooking_quality.low": "poor",
"block.cobblemon.potted_green_apricorn_sapling": "Dirt vase o' green fruitnut meager shrub",
"block.cobblemon.potted_pink_apricorn_sapling": "Dirt vase o' pink fruitnut meager shrub",
"block.cobblemon.potted_red_apricorn_sapling": "Dirt vase o' red fruitnut meager shrub",
@@ -1763,7 +1749,7 @@
"cobblemon.container.campfire_pot": "Pot o' campin'",
"cobblemon.container.campfire_pot.recipe_book.toggle_recipes": "Showing cookable",
"cobblemon.ui.starter.narrator.backbutton": "Back button pressed",
"cobblemon.ui.moves.forget": "Forget action",
"cobblemon.ui.moves.forget": "Forget skill",
"cobblemon.ui.info.gender": "Gend'r",
"cobblemon.ui.pokedex.region.alola": "Land o' light",
"cobblemon.ui.pokedex.region.galar": "Land o' dark",
@@ -1787,7 +1773,7 @@
"cobblemon.tooltip.see_more_info": "Hold shift t' see records",
"cobblemon.item_class.fishing_bait": "Fishin' bait",
"cobblemon.subtitle.wallpaper.unlock": "Box backdrop unlocked",
"cobblemon.held_item.forbidden": "Ye can't give %1$s for %2$s to hold.",
"cobblemon.held_item.forbidden": "Ye can't give %1$s t' %2$s.",
"cobblemon.cosmetic_item": "Cosmetic item",
"cobblemon.cosmetic_item.already_wearing": "%1$s already be wearing %2$s!",
"cobblemon.challenge.multi.expired.sender": "The challenge to %1$s's fleet has timed out!",
@@ -1953,7 +1939,7 @@
"cobblemon.battle.start.confusion": "%1$s now be confused!",
"cobblemon.battle.activate.allyswitch": "%1$s 'nd %2$s swapped spots!",
"cobblemon.battle.activate.insomnia": "Th' monster be suffering from insomnia, 'nd cannot fall asleep.",
"cobblemon.battle.activate.leppaberry": "%1$s restored PP t' %3$s using its leppa berry!",
"cobblemon.battle.activate.leppaberry": "%1$s restored pp t' %3$s using its leppa berry!",
"cobblemon.battle.activate.lingeringaroma": "A lingering aroma clings t' %2$s!",
"block.cobblemon.chiseled_sky_tumblestone_bricks": "Bricks o' carv'd heaven tumbl'd rocks",
"block.cobblemon.polished_black_tumblestone_stairs": "Stairs o' good lookin' black tumbl'd rocks",
@@ -1977,16 +1963,16 @@
"cobblemon.fishing_bait_effect_header": "Baitin' info:",
"cobblemon.fishing_bait_effects.nature.tooltip": "%1$s%% - Attract %2$s essence",
"cobblemon.fishing_bait_effects.iv.tooltip": "%1$s%% - %2$s IV +%3$s",
"cobblemon.fishing_bait_effects.ev.tooltip": "%1$s%% - Attract %2$s EV yields",
"cobblemon.fishing_bait_effects.ev.tooltip": "%1$s%% - %2$s ev yields be attract'd",
"cobblemon.fishing_bait_effects.bite_time.tooltip": "%1$s%% - Reduce bite time %3$s%%",
"cobblemon.type.suffix": "%1$s element",
"block.cobblemon.poke_cake": "Monster cake",
"cobblemon.fishing_bait_effects.gender_chance.tooltip": "%1$s%% - Attract %2$s gender",
"cobblemon.fishing_bait_effects.gender_chance.tooltip": "%1$s%% - %2$s gender be attract'd",
"cobblemon.fishing_bait_effects.level_raise.tooltip": "%1$s%% - Boost level +%3$s",
"cobblemon.fishing_bait_effects.typing.tooltip": "%1$s%% - %3$s× chance for %2$s elements",
"cobblemon.fishing_bait_effects.typing.tooltip": "%1$s%% - %3$s× chance fer %2$s elements",
"cobblemon.fishing_bait_effects.egg_group.tooltip": "%1$s%% - %3$s× chance for %2$s partn'r preference",
"cobblemon.fishing_bait_effects.shiny_reroll.tooltip": "%1$s%% - %3$s× shiny chance",
"cobblemon.fishing_bait_effects.ha_chance.tooltip": "%1$s%% - Attract secret trait",
"cobblemon.fishing_bait_effects.ha_chance.tooltip": "%1$s%% - Attract hidden trait",
"cobblemon.fishing_bait_effects.pokemon_chance.tooltip": "%1$s%% - Reel in a monster",
"cobblemon.egg_group.monster": "Monsterous",
"cobblemon.egg_group.water_1": "Shore",
@@ -2028,7 +2014,7 @@
"cobblemon.ui.pc.wallpaper": "Backdrop",
"cobblemon.ui.pc.filter": "Filt'r",
"cobblemon.ui.pc.filter.tooltip": "Format: pikachu shiny held_item lvl=1...",
"cobblemon.ui.sort.name": "Sort by name",
"cobblemon.ui.sort.name": "Sort by title",
"cobblemon.ui.sort.level": "Sort by level",
"cobblemon.ui.sort.pokedex_number": "Sort by index number",
"cobblemon.ui.sort.gender": "Sort by gend'r",
@@ -2179,7 +2165,7 @@
"cobblemon.challenge.multi.error.missing_team": "Not all captains be in a valid fleet!",
"cobblemon.ui.team.leave_title": "Deraft",
"cobblemon.team.sent": "Invited %1$s to raft up for multi battles.",
"cobblemon.team.error.missing_pokemon.sender": "Yer opponent doesn't have any usable monsters!",
"cobblemon.team.error.missing_pokemon.sender": "Ye foe don't have any usable monsters!",
"cobblemon.team.error.missing_pokemon.receiver": "Ye don't have any usable monsters!",
"cobblemon.config.ui.category.riding": "Sailin'",
"cobblemon.config.ui.max_pokemon_level": "Max monster level",
@@ -2219,7 +2205,7 @@
"cobblemon.config.ui.infinite_healer_charge": "Infinite healer charge",
"cobblemon.config.ui.infinite_healer_charge.tooltip": "Whether bed o' sciences have infinite pow'r t' heal monsters.",
"cobblemon.config.ui.max_healer_charge": "Max healer charge",
"cobblemon.config.ui.max_healer_charge.tooltip": "The maximum amount of full health restoration bed o' science can have. 1 charge is equivalent to a candy o' total resurrection, plus PP restoration.",
"cobblemon.config.ui.max_healer_charge.tooltip": "The maximum amount of full health restoration bed o' science can have. 1 charge is equivalent to a candy o' total resurrection, plus pp restoration.",
"cobblemon.config.ui.faint_awaken_health_percent": "Faint awaken health percent",
"cobblemon.config.ui.faint_awaken_health_percent.tooltip": "How much health to restore when defaultFaintTimer is up.",
"cobblemon.config.ui.heal_percent": "Heal percent",
@@ -2247,6 +2233,370 @@
"cobblemon.battle.select_target": "Select target",
"cobblemon.battle.start.flashfire": "The pow'r of %1$s's flame element actions rose!",
"cobblemon.battle.activate.custapberry": "%1$s can act ahead o' time, thanks t' its custap berry!",
"cobblemon.species.magnezone.name": "Zone o' mag",
"cobblemon.ui.pokedex.info.form.gimmighoul-roaming": "Roamin' form"
"cobblemon.ui.pokedex.info.form.gimmighoul-roaming": "Roamin' form",
"item.cobblemon.link_cable.tooltip": "Permits transmogrification o' monsters th't need t' be barter'd",
"item.cobblemon.electirizer.tooltip": "Transmogrifies Electabuzz ta' Electivire if held when barter'd",
"item.cobblemon.strawberry_sweet.tooltip": "Transmogrifies Milcery ta' Alcremie wearin' a candy o' strawberry",
"item.cobblemon.love_sweet.tooltip": "Transmogrifies Milcery ta' Alcremie wearin' a candy o' romance",
"item.cobblemon.water_stone.tooltip": "Transmogrifies certain monsters",
"item.cobblemon.ability_patch.tooltip": "Unlocks th' hidden trait o' th' monster",
"item.cobblemon.sassy_mint.tooltip": "Changes a monster's stats to match that o' a cheeky essence",
"item.cobblemon.cell_battery.tooltip_1": "Increases th' wielder's power when hit by a thund'r element skill",
"item.cobblemon.covert_cloak.tooltip": "Protects th' wielder from added effects o' a damaging skill",
"item.cobblemon.leftovers.tooltip": "Restores th' health o' th' wielder gradually",
"item.cobblemon.grass_gem.tooltip_2": "Gets used up",
"item.cobblemon.resist_feather.tooltip": "Raises a monster's strength evs by 1",
"item.cobblemon.eviolite.tooltip": "Increases th' wielder's strength and resilience if it could transmogrify further",
"item.cobblemon.kings_rock.tooltip_1": "If th' holdin' monster lands their shot, th' foe may flinch",
"item.cobblemon.prism_scale.tooltip": "Transmogrifies Feebas ta' Milotic if held when barter'd",
"item.cobblemon.hard_stone.tooltip": "Increases th' wielder's stones element skills",
"item.cobblemon.clover_sweet.tooltip": "Transmogrifies Milcery ta' Alcremie wearin' a candy o' luck",
"item.cobblemon.misty_seed.tooltip": "Increases th' wielder's strength on fae island",
"item.cobblemon.dubious_disc.tooltip": "Transmogrifies Porygon2 ta' Porygon-Z if held when barter'd",
"item.cobblemon.chipped_pot.tooltip": "Transmogrifies true Sinistea ta' Polteageist",
"item.cobblemon.masterpiece_teacup.tooltip": "Transmogrifies masterpiece Poltchageist ta' masterpiece Sinistcha",
"item.cobblemon.ice_stone.tooltip": "Transmogrifies certain monsters",
"item.cobblemon.muscle_feather.tooltip": "Raises a monster's power evs by 1",
"item.cobblemon.fairy_feather.tooltip": "Increases th' wielder's fae element skills",
"item.cobblemon.miracle_seed.tooltip": "Increases th' wielder's plant element skills",
"item.cobblemon.punching_glove.tooltip": "Boosts th' damage o' th' wielder's punching skills, and makes 'em avoid contact effects",
"item.cobblemon.normal_gem.tooltip_2": "Gets used up",
"item.cobblemon.charcoal_stick.tooltip": "Increases th' wielder's flame element skills",
"tag.item.cobblemon.held.terrain_seeds": "Island seeds",
"advancements.cobblemon.use_iv_candy": "Sugarrry stats",
"cobblemon.move.electricterrain": "Charg'd terrain",
"item.cobblemon.whipped_dream.tooltip": "Transmogrifies Swirlix ta' Slurpuff if held when barter'd",
"item.cobblemon.ability_shield.tooltip": "Prev'nts the wielder's trait from bein' alter'd or disabl'd",
"item.cobblemon.air_balloon.tooltip_1": "Lifts th' wielder off th' deck",
"item.cobblemon.air_balloon.tooltip_2": "Lost on hit",
"item.cobblemon.assault_vest.tooltip": "Increases th' wielder's resilience, but stops use o' effect skills",
"item.cobblemon.auspicious_armor.tooltip": "Transmogrifies Charcadet ta' Armarouge",
"item.cobblemon.malicious_armor.tooltip": "Transmogrifies Charcadet ta' Ceruledge",
"item.cobblemon.binding_band.tooltip": "Increases damage from th' residual bindings",
"item.cobblemon.black_belt.tooltip": "Increases th' wielder's attacker element skills",
"item.cobblemon.black_glasses.tooltip": "Increases th' wielder's demon element skills",
"item.cobblemon.black_sludge.tooltip": "If th' wielder be of th' toxin element, their health restores durin' combat. Damages those o' other elements",
"item.cobblemon.blunder_policy.tooltip_1": "Increases th' wielder's speed if their shot misses",
"item.cobblemon.blunder_policy.tooltip_2": "Gets used up",
"item.cobblemon.choice_band.tooltip": "Increases th' wielder's power, but prevents tactic shifting",
"item.cobblemon.choice_specs.tooltip": "Increases th' wielder's magic, but prevents tactic shifting",
"item.cobblemon.cleanse_tag.tooltip": "Unknown effects",
"item.cobblemon.dragon_fang.tooltip": "Increases th' wielder's drake element skills",
"item.cobblemon.eject_button.tooltip_1": "Swaps th' holder out when hit by a damaging skill",
"item.cobblemon.eject_button.tooltip_2": "Gets used up",
"item.cobblemon.eject_pack.tooltip_1": "Swaps th' holder out if any stat drops",
"item.cobblemon.eject_pack.tooltip_2": "Gets used up",
"item.cobblemon.electric_seed.tooltip": "Increases th' wielder's strength on charg'd island",
"item.cobblemon.everstone.tooltip": "Stops transmogrification o' th' wielder",
"item.cobblemon.exp_share.tooltip": "Gives th' wielder a share o' experience from fights without joining th' fray",
"item.cobblemon.expert_belt.tooltip": "Increases th' damage fr'm sinking skills",
"item.cobblemon.float_stone.tooltip": "Wielder's weight be halv'd",
"item.cobblemon.focus_band.tooltip": "Lets th' wielder focus in, sometimes letting 'em endure th' blow",
"item.cobblemon.focus_sash.tooltip_1": "Lets th' wielder focus in, letting 'em endure a single blow",
"item.cobblemon.focus_sash.tooltip_2": "Gets used up",
"item.cobblemon.heavy_duty_boots.tooltip": "Prev'nts traps set on th' deck",
"item.cobblemon.iron_ball.tooltip": "Th' wielder be weigh'd down to th' deck, and their speed halv'd",
"item.cobblemon.light_clay.tooltip": "Screen skills last longer",
"item.cobblemon.lucky_egg.tooltip": "Improves th' count o' magic orbs gained by th' wielder",
"item.cobblemon.magnet.tooltip": "Increases th' wielder's thund'r element skills",
"item.cobblemon.metronome.tooltip": "Increases th' damage o' skills repeated",
"item.cobblemon.poison_barb.tooltip": "Increases th' wielder's toxin element skills",
"item.cobblemon.protective_pads.tooltip": "Protects th' wielder from contact effects",
"item.cobblemon.razor_claw.tooltip_1": "Boosts th' critical chance for th' wielder",
"item.cobblemon.razor_claw.tooltip_2": "Transmogrifies Sneasel ta' Sneasler or Weavile based on time o' day",
"item.cobblemon.razor_fang.tooltip_1": "If th' holdin' monster lands their shot, th' foe may flinch",
"item.cobblemon.razor_fang.tooltip_2": "Transmogrifies Gligar ta' Gliscor if held at night",
"item.cobblemon.red_card.tooltip_1": "Monsters that damage th' wielder are forced t' swap out",
"item.cobblemon.red_card.tooltip_2": "Gets used up",
"item.cobblemon.ring_target.tooltip": "Th' wielder can be hit by all elements",
"item.cobblemon.rocky_helmet.tooltip": "Makes monsters that make contact with th' wielder to take damage",
"item.cobblemon.room_service.tooltip_1": "Reduces th' wielder's speed if twist'd deck be active",
"item.cobblemon.room_service.tooltip_2": "Gets used up",
"item.cobblemon.scope_lens.tooltip": "Boosts th' critical chance for th' wielder",
"item.cobblemon.sharp_beak.tooltip": "Increases th' wielder's soarer element skills",
"item.cobblemon.shell_helmet.tooltip": "Transmogrifies Karrablast ta' Escavalier",
"item.cobblemon.soft_sand.tooltip": "Increases th' wielder's land element skills",
"item.cobblemon.weakness_policy.tooltip_2": "Gets used up",
"item.cobblemon.spell_tag.tooltip": "Increases th' wielder's spirit element skills",
"item.cobblemon.twisted_spoon.tooltip": "Increases th' wielder's mental element skills",
"item.cobblemon.power_herb.tooltip_2": "Gets used up",
"item.cobblemon.psychic_seed.tooltip": "Increases th' wielder's strength on mental island",
"item.cobblemon.smoke_ball.tooltip": "Unknown effects",
"cobblemon.ui.ride_style.liquid": "Seas",
"cobblemon.ui.pokedex.info.form.wooper-paldea": "Land o' sharden",
"block.cobblemon.saccharine_log_slathered": "Slathered log o' saccharine",
"cobblemon.ui.ride_style.air": "Skies",
"cobblemon.mark.ribbon_ability": "Ability ribbon",
"item.cobblemon.eggant_berry": "Eggant berry",
"advancements.cobblemon.place_campfire_pot": "Time to cook",
"advancements.cobblemon.place_campfire_pot.description": "Place a pot o' campin' on a lit campfire",
"advancements.cobblemon.use_iv_candy.description": "Use a candy that alters a monster's ivs",
"cobblemon.move.trickroom": "Twist'd deck",
"cobblemon.move.grassyterrain": "Plant'd island",
"cobblemon.move.mistyterrain": "Fae island",
"item.cobblemon.bugwort": "Ward o' bug",
"item.cobblemon.dragon_scale.tooltip": "Transmogrifies Seadra ta' Kingdra if held when barter'd",
"item.cobblemon.kings_rock.tooltip_2": "Transmogrifies Poliwhirl ta' Politoed 'nd Slowpoke ta' Slowking if held when barter'd",
"item.cobblemon.metal_coat.tooltip_1": "Increases th' wielder's metal element skills",
"item.cobblemon.metal_coat.tooltip_2": "Transmogrifies Onix ta' Steelix 'nd Scyther ta' Scizor if held when barter'd",
"item.cobblemon.upgrade.tooltip": "Transmogrifies Porygon ta' Porygon2 if held when barter'd",
"item.cobblemon.deep_sea_scale.tooltip_1": "Increases Clamperl's resilience",
"item.cobblemon.deep_sea_scale.tooltip_2": "Transmogrifies Clamperl ta' Gorebyss if held when barter'd",
"item.cobblemon.deep_sea_tooth.tooltip_1": "Increases Clamperl's magic",
"item.cobblemon.deep_sea_tooth.tooltip_2": "Transmogrifies Clamperl ta' Huntail if held when barter'd",
"item.cobblemon.magmarizer.tooltip": "Transmogrifies Magmar ta' Magmortar if held when barter'd",
"item.cobblemon.oval_stone.tooltip": "Transmogrifies Happiny ta' Chansey if held during th' day",
"item.cobblemon.protector.tooltip": "Transmogrifies Rhydon ta' Rhyperior if held when barter'd",
"item.cobblemon.reaper_cloth.tooltip": "Transmogrifies Dusclops ta' Dusknoir if held when barter'd",
"item.cobblemon.sachet.tooltip": "Transmogrifies Spritzee ta' Aromatisse if held when barter'd",
"item.cobblemon.flower_sweet.tooltip": "Transmogrifies Milcery ta' Alcremie wearin' a candy o' dandy",
"item.cobblemon.star_sweet.tooltip": "Transmogrifies Milcery ta' Alcremie wearin' a candy o' navigation",
"item.cobblemon.ribbon_sweet.tooltip": "Transmogrifies Milcery ta' Alcremie wearin' a candy decoration",
"item.cobblemon.cracked_pot.tooltip": "Transmogrifies fake Sinistea ta' Polteageist",
"item.cobblemon.unremarkable_teacup.tooltip": "Transmogrifies counterfeit Poltchageist ta' counterfeit Sinistcha",
"item.cobblemon.sweet_apple.tooltip": "Transmogrifies Applin ta' Appletun",
"item.cobblemon.tart_apple.tooltip": "Transmogrifies Applin ta' Flapple",
"item.cobblemon.syrupy_apple.tooltip": "Transmogrifies Applin ta' Dipplin",
"item.cobblemon.galarica_cuff.tooltip": "Transmogrifies Slowpoke o' th' land o' dark ta' Slowbro o' th' land o' dark",
"item.cobblemon.galarica_wreath.tooltip": "Transmogrifies Slowpoke o' th' land o' dark ta' Slowking o' th' land o' dark",
"item.cobblemon.black_augurite.tooltip": "Transmogrifies Scyther ta' Kleavor",
"item.cobblemon.peat_block.tooltip": "Transmogrifies Ursaring ta' Ursaluna when gift'd und'r a full moon",
"item.cobblemon.metal_alloy.tooltip": "Transmogrifies Duraludon ta' Archaludon",
"item.cobblemon.scroll_of_darkness.tooltip": "Transmogrifies Kubfu ta' Single Strike Style Urshifu",
"item.cobblemon.scroll_of_waters.tooltip": "Transmogrifies Kubfu ta' Rapid Strike Style Urshifu",
"item.cobblemon.dawn_stone.tooltip": "Transmogrifies certain monsters",
"item.cobblemon.dusk_stone.tooltip": "Transmogrifies certain monsters",
"item.cobblemon.fire_stone.tooltip": "Transmogrifies certain monsters",
"item.cobblemon.exp_candy_s.tooltip": "Raises a monster's magic orb count by 800",
"item.cobblemon.ability_capsule.tooltip": "Swaps th' trait o' th' monster 'round",
"item.cobblemon.timid_mint.tooltip": "Changes a monster's stats to match that o' an feeble essence",
"item.cobblemon.absorb_bulb.tooltip_1": "Increases th' wielder's magic wh'n hit by an ocean element skill",
"item.cobblemon.absorb_bulb.tooltip_2": "Gets used up",
"item.cobblemon.cell_battery.tooltip_2": "Gets used up",
"item.cobblemon.choice_scarf.tooltip": "Increases th' wielder's speed, but prevents tactic shifting",
"item.cobblemon.muscle_band.tooltip": "Increases th' wielder's melee skills",
"item.cobblemon.mystic_water.tooltip": "Increases th' wielder's ocean element skills",
"item.cobblemon.never_melt_ice.tooltip": "Increases th' wielder's froz'n element skills",
"item.cobblemon.quick_claw.tooltip": "Lets th' wielder strike first on occasion",
"item.cobblemon.silk_scarf.tooltip": "Increases th' wielder's basic element skills",
"item.cobblemon.silver_powder.tooltip": "Increases th' wielder's critter element skills",
"item.cobblemon.throat_spray.tooltip_2": "Gets used up",
"item.cobblemon.mental_herb.tooltip_2": "Gets used up",
"item.cobblemon.mirror_herb.tooltip_2": "Gets used up",
"item.cobblemon.white_herb.tooltip_2": "Gets used up",
"item.cobblemon.berry_sweet.tooltip": "Transmogrifies Milcery ta' Alcremie wearin' a candy o' berry",
"item.cobblemon.leaf_stone.tooltip": "Transmogrifies certain monsters",
"item.cobblemon.moon_stone.tooltip": "Transmogrifies certain monsters",
"item.cobblemon.shiny_stone.tooltip": "Transmogrifies certain monsters",
"item.cobblemon.sun_stone.tooltip": "Transmogrifies certain monsters",
"item.cobblemon.thunder_stone.tooltip": "Transmogrifies certain monsters",
"item.cobblemon.rare_candy.tooltip": "Raises a monster's level a single time",
"item.cobblemon.exp_candy_xs.tooltip": "Raises a monster's magic orb count by 100",
"item.cobblemon.exp_candy_m.tooltip": "Raises a monster's magic orb count by 3000",
"item.cobblemon.exp_candy_l.tooltip": "Raises a monster's magic orb count by 10000",
"item.cobblemon.exp_candy_xl.tooltip": "Raises a monster's magic orb count by 30000",
"item.cobblemon.calcium.tooltip": "Raises a monster's magic evs by 10",
"item.cobblemon.carbos.tooltip": "Raises a monster's speed evs by 10",
"item.cobblemon.hp_up.tooltip": "Raises a monster's health evs by 10",
"item.cobblemon.iron.tooltip": "Raises a monster's strength evs by 10",
"item.cobblemon.protein.tooltip": "Raises a monster's power evs by 10",
"item.cobblemon.zinc.tooltip": "Raises a monster's resilience evs by 10",
"item.cobblemon.potion.tooltip": "Restores 20 health to a monster",
"item.cobblemon.super_potion.tooltip": "Restores 60 health to a monster",
"item.cobblemon.hyper_potion.tooltip": "Restores 120 health to a monster",
"item.cobblemon.full_restore.tooltip": "Fully heals th' health 'nd status effects of a monster",
"item.cobblemon.max_potion.tooltip": "Fully heals th' health of a monster",
"item.cobblemon.health_feather.tooltip": "Raises a monster's health evs by 1",
"item.cobblemon.genius_feather.tooltip": "Raises a monster's magic evs by 1",
"item.cobblemon.clever_feather.tooltip": "Raises a monster's resilience evs by 1",
"item.cobblemon.swift_feather.tooltip": "Raises a monster's speed evs by 1",
"item.cobblemon.lonely_mint.tooltip": "Changes a monster's stats to match that o' an outcast essence",
"item.cobblemon.adamant_mint.tooltip": "Changes a monster's stats to match that o' a stiff board essence",
"item.cobblemon.naughty_mint.tooltip": "Changes a monster's stats to match that o' a rascal essence",
"item.cobblemon.brave_mint.tooltip": "Changes a monster's stats to match that o' an adventur'us essence",
"item.cobblemon.bold_mint.tooltip": "Changes a monster's stats to match that o' a resolute essence",
"item.cobblemon.impish_mint.tooltip": "Changes a monster's stats to match that o' a jaunty essence",
"item.cobblemon.lax_mint.tooltip": "Changes a monster's stats to match that o' a sloppy essence",
"item.cobblemon.relaxed_mint.tooltip": "Changes a monster's stats to match that o' a sea breezy essence",
"item.cobblemon.careful_mint.tooltip": "Changes a monster's stats to match that o' a leery essence",
"item.cobblemon.modest_mint.tooltip": "Changes a monster's stats to match that o' a prud'nt essence",
"item.cobblemon.mild_mint.tooltip": "Changes a monster's stats to match that o' a balmy essence",
"item.cobblemon.quiet_mint.tooltip": "Changes a monster's stats to match that o' a clamm'd essence",
"item.cobblemon.rash_mint.tooltip": "Changes a monster's stats to match that o' a daring essence",
"item.cobblemon.calm_mint.tooltip": "Changes a monster's stats to match that o' a serene essence",
"item.cobblemon.gentle_mint.tooltip": "Changes a monster's stats to match that o' an affable essence",
"item.cobblemon.hasty_mint.tooltip": "Changes a monster's stats to match that o' a rapids essence",
"item.cobblemon.jolly_mint.tooltip": "Changes a monster's stats to match that o' a chipp'r essence",
"item.cobblemon.naive_mint.tooltip": "Changes a monster's stats to match that o' a green essence",
"item.cobblemon.serious_mint.tooltip": "Changes a monster's stats to match that o' a sober essence",
"item.cobblemon.grassy_seed.tooltip": "Increases th' wielder's strength on plant'd island",
"item.cobblemon.light_ball.tooltip": "Improves Pikachu's power and magic",
"item.cobblemon.water_gem.tooltip_2": "Gets used up",
"item.cobblemon.ghost_gem.tooltip_2": "Gets used up",
"item.cobblemon.ground_gem.tooltip_2": "Gets used up",
"item.cobblemon.fire_gem.tooltip_2": "Gets used up",
"item.cobblemon.dragon_gem.tooltip_2": "Gets used up",
"item.cobblemon.pewter_crunchies": "Pewter tack",
"item.cobblemon.rage_candy_bar": "Bar o' rage",
"item.cobblemon.lava_cookie": "Magma cookie",
"item.cobblemon.old_gateau": "Gateau",
"item.cobblemon.jubilife_muffin": "Muffin o' jubilife",
"item.cobblemon.casteliacone": "Cold cone",
"item.cobblemon.lumiose_galette": "Light galette",
"item.cobblemon.shalour_sable": "Shalour sablé",
"item.cobblemon.big_malasada": "Malasada",
"item.cobblemon.smoked_tail_curry": "Smokey curry",
"item.cobblemon.open_faced_sandwich": "Land o' shard sandwich",
"cobblemon.move.psychicterrain": "Mental terrain",
"item.cobblemon.wide_lens.tooltip": "Increases th' wielder's shot rate",
"item.cobblemon.superb_remedy.tooltip": "Restores 120 health to a monster, but reduces their allyship with ye",
"item.cobblemon.steel_gem.tooltip_1": "Increases th' wielder's first metal element skill",
"item.cobblemon.electric_gem.tooltip_1": "Increases th' wielder's first thund'r element skill",
"item.cobblemon.dark_gem.tooltip_1": "Increases th' wielder's first demon element skill",
"item.cobblemon.clever_mochi.tooltip": "Raises a monster's resilience evs by 4",
"item.cobblemon.loaded_dice.tooltip": "Multi-shot skills always hit 'least four rounds",
"item.cobblemon.safety_goggles.tooltip": "Wielder be protect'd from powd'rs, spores, 'nd painful weathers",
"item.cobblemon.shell_bell.tooltip": "Restores th' wielder's health by a bit o' what they do in damage",
"item.cobblemon.soothe_bell.tooltip": "Improves gained allyship",
"item.cobblemon.weakness_policy.tooltip_1": "Increases th' wielder's power 'nd magic when hit by a sinking skill",
"item.cobblemon.mental_herb.tooltip_1": "Cures th' user o' siren charms 'nd other mental ails",
"item.cobblemon.power_herb.tooltip_1": "Charrrg'd skills of th' user fire off immediately",
"item.cobblemon.destiny_knot.tooltip": "If th' wielder falls to th' siren's charms, th' monster th't cast 'em falls too",
"item.cobblemon.flame_orb.tooltip": "Wielder be burnt",
"item.cobblemon.medicinal_leek.tooltip_1": "Used t' brew brew o' potions",
"item.cobblemon.medicinal_leek.tooltip_2": "Also boosts th' critical chance for Farfetch'd 'nd Sirfetch'd twofold",
"item.cobblemon.energy_root.tooltip": "Restores 80 health to a monster, but reduces their allyship with ye",
"item.cobblemon.revival_herb.tooltip": "Resurrects a monster to quarter health, but reduces their allyship with ye",
"item.cobblemon.fine_remedy.tooltip": "Restores 60 health to a monster, but reduces their allyship with ye",
"item.cobblemon.revive.tooltip": "Resurrects a monster to half health",
"item.cobblemon.max_revive.tooltip": "Resurrects a monster to full health",
"item.cobblemon.pp_up.tooltip": "Increases th' wielder's total pp o' a skill by 20%",
"item.cobblemon.pp_max.tooltip": "Increases th' wielder's total pp o' a skill to th' full 60%",
"item.cobblemon.x_accuracy.tooltip": "Increases th' monster's shot rate by a stage while they're on deck",
"item.cobblemon.x_speed.tooltip": "Increases th' monster's speed by a stage while they're on deck",
"item.cobblemon.x_special_defence.tooltip": "Increases th' monster's resilience by a stage while they're on deck",
"item.cobblemon.x_special_attack.tooltip": "Increases th' monster's magic by a stage while they're on deck",
"item.cobblemon.dire_hit.tooltip": "Increases th' monster's critical chance while they're on deck",
"item.cobblemon.quick_candy.tooltip_1": "Raises a monster's effective speed ivs by 1",
"block.cobblemon.big_root.tooltip": "Increases th' wielder's health drain gains",
"item.cobblemon.health_candy.tooltip_1": "Raises a monster's effective health ivs by 1",
"item.cobblemon.mighty_candy.tooltip_1": "Raises a monster's effective power ivs by 1",
"cobblemon.subtitle.pokemon.shiny_shine": "Owned shiny monster sparkles",
"cobblemon.subtitle.pokemon.wild_shiny_shine": "Wild shiny monster sparkles!",
"cobblemon.subtitle.pokemon.owned_shiny_ambient": "Passive shiny monster sparkles",
"cobblemon.subtitle.pokemon.shiny_ambient": "Wild shiny monster sparkles!",
"item.cobblemon.pomeg_berry.tooltip_2": "Not eaten during battles",
"item.cobblemon.qualot_berry.tooltip_1": "Drops a monster's strength evs by 10, and boons allyship",
"item.cobblemon.qualot_berry.tooltip_2": "Not eaten during battles",
"item.cobblemon.tamato_berry.tooltip_1": "Drops a monster's speed evs by 10, and boons allyship",
"entity.cobblemon.pokemon": "Monster",
"entity.cobblemon.empty_pokeball": "Unoccupied captur'r",
"entity.cobblemon.poke_bobber": "Monster float'r",
"entity.cobblemon.boat": "Vessel",
"entity.cobblemon.chest_boat": "Vessel wit' coffer",
"entity.cobblemon.npc": "Sailor",
"painting.cobblemon.premonition.title": "Premonition",
"painting.cobblemon.premonition.author": "PKMNCC",
"painting.cobblemon.slumber.title": "Slumb'r",
"painting.cobblemon.slumber.author": "PKMNCC",
"painting.cobblemon.altar.title": "Ancient altar",
"painting.cobblemon.altar.author": "PKMNCC",
"painting.cobblemon.nomad.title": "Travel'rs",
"painting.cobblemon.nomad.author": "PKMNCC",
"cobblemon.snapshots.warning.title": "Cobbl'd ship version warnin'",
"cobblemon.snapshots.warning.description": "Ye be usin' %s snapshot o' cobblemon. It still be und'r construction, meanin' it may not be safe fer yer seas. Knowing this, would we like t' still proceed?",
"cobblemon.snapshots.warning.dont_show_again": "She'll be fine",
"cobblemon.snapshots.warning.dont_show_again_tip": "This acklowledgem'nt may be ignor'd for future cobblemon snapshots (e.g. 1.7.0 vs 1.8.0)",
"item.cobblemon.shed_shell.tooltip": "Lets th' wielder swap out regardless o' context",
"item.cobblemon.terrain_extender.tooltip": "Keeps ya' harbor'd at islands longer, r'gardless if from skills or traits",
"item.cobblemon.throat_spray.tooltip_1": "Increases th' wielder's magic when a sound skill be used",
"item.cobblemon.sticky_barb.tooltip": "Damages those it's stuck ta', sticks t' those who hit",
"item.cobblemon.utility_umbrella.tooltip": "Th' wielder be protect'd from rain or shine",
"item.cobblemon.zoom_lens.tooltip": "Increases th' wielder's shot rate",
"item.cobblemon.wise_glasses.tooltip": "Increases th' wielder's magical skills",
"item.cobblemon.mirror_herb.tooltip_1": "Lets th' user mirror th' foe's stat increases onto themselfs",
"item.cobblemon.white_herb.tooltip_1": "Restores any dropp'd stats",
"item.cobblemon.power_bracer.tooltip": "Wearer gains 8 power evs when gaining experience in a fight",
"item.cobblemon.bright_powder.tooltip": "Drops th' foe's shot rate a tenth",
"item.cobblemon.metal_powder.tooltip": "Boosts a Ditto yet to alt'r shape's strength and resilience by half base",
"item.cobblemon.power_lens.tooltip": "Wearer gains 8 magic evs when gaining experience in a fight",
"item.cobblemon.quick_powder.tooltip": "Boosts a Ditto yet to alt'r shape's speed by double",
"item.cobblemon.power_anklet.tooltip": "Wearer gains 8 speed evs when gaining experience in a fight",
"item.cobblemon.power_band.tooltip": "Wearer gains 8 resilience evs when gaining experience in a fight",
"item.cobblemon.power_belt.tooltip": "Wearer gains 8 strength evs when gaining experience in a fight",
"item.cobblemon.toxic_orb.tooltip": "Wielder be poison'd",
"item.cobblemon.life_orb.tooltip": "Spends th' wielder's life t' increase their skills",
"item.cobblemon.damp_rock.tooltip": "Keeps th' ship in the rain long'r",
"item.cobblemon.heat_rock.tooltip": "Keeps th' ship in the burnin' sun long'r",
"item.cobblemon.smooth_rock.tooltip": "Keeps th' ship in the sands long'r",
"item.cobblemon.icy_rock.tooltip": "Keeps th' ship in the frosty rain long'r",
"item.cobblemon.berry_juice.tooltip": "Restores 20 health to a monster, usually drunk under half health",
"item.cobblemon.paralyze_heal.tooltip": "Frees a monster o' th' shocks",
"item.cobblemon.health_mochi.tooltip": "Raises a monster's health evs by 4",
"item.cobblemon.resist_mochi.tooltip": "Raises a monster's strength evs by 4",
"item.cobblemon.genius_mochi.tooltip": "Raises a monster's magic evs by 4",
"item.cobblemon.fresh_start_mochi.tooltip": "Clears out all a monster's evs",
"item.cobblemon.brittle_candy.tooltip_1": "Drops a monster's effective strength ivs by 1",
"item.cobblemon.power_weight.tooltip": "Wearer gains 8 health evs when gaining experience in a fight",
"item.cobblemon.remedy.tooltip": "Restores 20 health to a monster, but reduces their allyship with ye",
"item.cobblemon.heal_powder.tooltip": "Restores th' status of a monster, but reduces their allyship with ye",
"item.cobblemon.x_attack.tooltip": "Increases th' monster's power by a stage while they're on deck",
"item.cobblemon.x_defence.tooltip": "Increases th' monster's strength by a stage while they're on deck",
"item.cobblemon.water_gem.tooltip_1": "Increases th' wielder's first ocean element skill",
"item.cobblemon.fire_gem.tooltip_1": "Increases th' wielder's first flame element skill",
"item.cobblemon.fairy_gem.tooltip_2": "Gets used up",
"item.cobblemon.psychic_gem.tooltip_2": "Gets used up",
"item.cobblemon.guard_spec.tooltip": "Prev'nts th' monster's stats from bein' dropp'd while they're on deck",
"item.cobblemon.moomoo_milk.tooltip": "Clears out th' monster's stat alterations",
"item.cobblemon.full_heal.tooltip": "Fully heals any status effects of a monster",
"item.cobblemon.antidote.tooltip": "Cures a monster's poison",
"item.cobblemon.awakening.tooltip": "Wakes a monster",
"item.cobblemon.burn_heal.tooltip": "Cools off a monster's burn",
"item.cobblemon.ice_heal.tooltip": "Thaws out a monster",
"item.cobblemon.ether.tooltip": "Recovers 10 pp to a monster's skill",
"item.cobblemon.max_ether.tooltip": "Recovers all o' th' pp of a monster's skill",
"item.cobblemon.elixir.tooltip": "Recovers 10 pp on all a monster's skills",
"item.cobblemon.max_elixir.tooltip": "Recovers all o' th' pp on all a monster's skills",
"item.cobblemon.normal_gem.tooltip_1": "Increases th' wielder's first basic element skill",
"item.cobblemon.grass_gem.tooltip_1": "Increases th' wielder's first plant element skill",
"item.cobblemon.dragon_gem.tooltip_1": "Increases th' wielder's first drake element skill",
"item.cobblemon.ghost_gem.tooltip_1": "Increases th' wielder's first spirit element skill",
"item.cobblemon.ground_gem.tooltip_1": "Increases th' wielder's first land element skill",
"item.cobblemon.steel_gem.tooltip_2": "Gets used up",
"item.cobblemon.fairy_gem.tooltip_1": "Increases th' wielder's first fae element skill",
"item.cobblemon.rock_gem.tooltip_1": "Increases th' wielder's first stones element skill",
"item.cobblemon.rock_gem.tooltip_2": "Gets used up",
"item.cobblemon.psychic_gem.tooltip_1": "Increases th' wielder's first mental element skill",
"item.cobblemon.electric_gem.tooltip_2": "Gets used up",
"item.cobblemon.bug_gem.tooltip_1": "Increases th' wielder's first critter element skill",
"item.cobblemon.bug_gem.tooltip_2": "Gets used up",
"item.cobblemon.poison_gem.tooltip_1": "Increases th' wielder's first toxin element skill",
"item.cobblemon.poison_gem.tooltip_2": "Gets used up",
"item.cobblemon.ice_gem.tooltip_1": "Increases th' wielder's first froz'n element skill",
"item.cobblemon.ice_gem.tooltip_2": "Gets used up",
"item.cobblemon.dark_gem.tooltip_2": "Gets used up",
"item.cobblemon.fighting_gem.tooltip_1": "Increases th' wielder's first attacker element skill",
"item.cobblemon.fighting_gem.tooltip_2": "Gets used up",
"item.cobblemon.flying_gem.tooltip_1": "Increases th' wielder's first soarer element skill",
"item.cobblemon.flying_gem.tooltip_2": "Gets used up",
"item.cobblemon.muscle_mochi.tooltip": "Raises a monster's power evs by 4",
"item.cobblemon.swift_mochi.tooltip": "Raises a monster's speed evs by 4",
"item.cobblemon.tough_candy.tooltip_1": "Raises a monster's effective strength ivs by 1",
"item.cobblemon.smart_candy.tooltip_1": "Raises a monster's effective magic ivs by 1",
"item.cobblemon.courage_candy.tooltip_1": "Raises a monster's effective resilience ivs by 1",
"item.cobblemon.sickly_candy.tooltip_1": "Drops a monster's effective health ivs by 1",
"item.cobblemon.weak_candy.tooltip_1": "Drops a monster's effective power ivs by 1",
"item.cobblemon.numb_candy.tooltip_1": "Drops a monster's effective magic ivs by 1",
"item.cobblemon.coward_candy.tooltip_1": "Drops a monster's effective resilience ivs by 1",
"item.cobblemon.slow_candy.tooltip_1": "Drops a monster's effective speed ivs by 1",
"key.cobblemon.toggleridingstatsgui": "Toggle ride stats screen",
"cobblemon.cosmetic_item.give": "%1$s be given %2$s t' wear.",
"item.cobblemon.grepa_berry.tooltip_1": "Drops a monster's resilience evs by 10, and boons allyship",
"item.cobblemon.hondew_berry.tooltip_1": "Drops a monster's magic evs by 10, and boons allyship",
"item.cobblemon.grepa_berry.tooltip_2": "Not eaten during battles",
"item.cobblemon.hondew_berry.tooltip_2": "Not eaten during battles",
"item.cobblemon.kelpsy_berry.tooltip_1": "Drops a monster's power evs by 10, and boons allyship",
"item.cobblemon.kelpsy_berry.tooltip_2": "Not eaten during battles",
"item.cobblemon.pomeg_berry.tooltip_1": "Drops a monster's health evs by 10, and boons allyship",
"item.cobblemon.tamato_berry.tooltip_2": "Not eaten during battles"
}
@@ -842,8 +842,6 @@
"cobblemon.fossilmachine.protected": "This fossil belongs to %s!",
"cobblemon.poke_skill.quick_ride.name": "Quick Ride",
"itemGroup.cobblemon.blocks": "Cobblemon: Blocks",
"itemGroup.cobblemon.utility_item": "Cobblemon: Utility Items",
"itemGroup.cobblemon.agriculture": "Cobblemon: Agriculture",
@@ -3499,6 +3497,7 @@
"tag.item.cobblemon.berries.pp_recovery": "PP Recovery Berries",
"tag.item.cobblemon.berries.stat_buff": "Battle Berries",
"tag.item.cobblemon.berries.status_recovery": "Status Recovery Berries",
"tag.item.cobblemon.berries.filling": "Filling Berries",
"tag.item.cobblemon.berries.colour.white": "White Berries",
"tag.item.cobblemon.berries.colour.brown": "Brown Berries",
"tag.item.cobblemon.berries.colour.red": "Red Berries",
@@ -8642,5 +8642,29 @@
"cobblemon.snapshots.warning.title": "Aviso: Versión de prueba de Cobblemon",
"cobblemon.snapshots.warning.description": "Estás usando una versión de prueba %s de Cobblemon. Contiene funcionalidad aún en desarrollo, y puede que no sea seguro usarla en tus mundos. ¿Deseas continuar sabiendo estos riesgos?",
"key.cobblemon.toggleridingstatsgui": "Mostrar estadísticas de montura",
"item.cobblemon.moomoo_milk.tooltip": "Al usarlo en combate, revierte todos los cambios de estado del Pokémon."
"item.cobblemon.moomoo_milk.tooltip": "Al usarlo en combate, revierte todos los cambios de estado del Pokémon.",
"cobblemon.config.ui.poke_snack_pokemon_per_chunk.tooltip": "Cuántos Pokémon puede haber dentro de un chunck cuando aparecen por Poké Snacks.",
"cobblemon.config.ui.pc_profile_animations.never_animate.tooltip": "Ningún retrato aparece animado",
"cobblemon.config.ui.animate_battle_tiles": "Retratos animados en combate",
"cobblemon.config.ui.summary_profile_animations.never_animate": "Ninguna animación",
"cobblemon.config.ui.summary_profile_animations.always_animate.tooltip": "Todo el equipo tiene animaciones a menos que estén debilitados",
"cobblemon.seasoning_ride_boosts_info_header": "Mejora en estadísticas de montura:",
"cobblemon.seasoning_ride_boost_entry": "%1$s: %2$s",
"item.cobblemon.eggant_berry": "Baya Eggant",
"cobblemon.command.molang.out": "Resultado MoLang: %1$s",
"cobblemon.command.npcdelete.not_player": "Solo un jugador puede ejecutar este comando.",
"cobblemon.command.npcdelete.deleted": "%1$s ha sido eliminado.",
"cobblemon.config.ui.poke_snack_pokemon_per_chunk": "Apariciones por chunk con Poké Snacks",
"cobblemon.config.ui.animate_battle_tiles.tooltip": "Determina si los retratos en combate de los Pokémon deben estar animados.",
"cobblemon.config.ui.pc_profile_animations": "Animaciones en el PC",
"cobblemon.config.ui.pc_profile_animations.never_animate": "Ninguna animación",
"cobblemon.config.ui.pc_profile_animations.animate_selected": "Animación al seleccionar",
"cobblemon.config.ui.pc_profile_animations.animate_selected.tooltip": "Pokémon seleccionados aparecen animados a menos que estén debilitados",
"cobblemon.config.ui.pc_profile_animations.always_animate": "Animar siempre",
"cobblemon.config.ui.pc_profile_animations.always_animate.tooltip": "Todo el PC tiene animaciones a menos que estén debilitados",
"cobblemon.config.ui.summary_profile_animations": "Animaciones en el perfil resumen",
"cobblemon.config.ui.summary_profile_animations.never_animate.tooltip": "Ningún retrato aparece animado",
"cobblemon.config.ui.summary_profile_animations.animate_selected": "Animación al seleccionar",
"cobblemon.config.ui.summary_profile_animations.animate_selected.tooltip": "Pokémon seleccionados aparecen animados a menos que estén debilitados",
"cobblemon.config.ui.summary_profile_animations.always_animate": "Animar siempre"
}
@@ -2537,5 +2537,42 @@
"cobblemon.mark.ribbon_contest_hoenn_smart_3.desc": "¡Ganador del nivel avanzado del concurso de ingenio!",
"cobblemon.mark.ribbon_contest_hoenn_smart_4": "Cinta Ingenio Experto",
"cobblemon.mark.ribbon_contest_hoenn_smart_4.desc": "¡Ganador del nivel experto del concurso de ingenio!",
"cobblemon.mark.ribbon_contest_hoenn_tough_1": "Cinta Dureza"
"cobblemon.mark.ribbon_contest_hoenn_tough_1": "Cinta Dureza",
"item.cobblemon.moomoo_milk.tooltip": "Elimina todos los cambios de stats en el Pokémon objetivo durante la pelea.",
"item.cobblemon.cream_puff.deluxe": "Pokélito de Crema Deluxe",
"cobblemon.seasoning_ride_boosts_info_header": "Mejoras de estadísticas de montura:",
"cobblemon.seasoning_ride_boost_entry": "%1$s: %2$s",
"block.cobblemon.saccharine_log_slathered": "Tronco de Sacarina cubierto de Miel",
"item.cobblemon.ponigiri": "Ponigiri",
"item.cobblemon.poke_puff": "Pokélito %s",
"item.cobblemon.jelly_doughnut": "Dona de Jalea",
"item.cobblemon.sinister_tea": "Té Siniestro",
"item.cobblemon.poke_puff.frosted": "Pokélito %s con crema",
"item.cobblemon.poke_puff.fancy": "Pokélito %s decorado",
"item.cobblemon.poke_puff.deluxe": "Pokélito %s deluxe",
"item.cobblemon.cream_puff": "Pokélito de crema",
"item.cobblemon.cream_puff.frosted": "Pokélito de crema con crema",
"item.cobblemon.cream_puff.fancy": "Pokélito de Crema Decorado",
"flavour.cobblemon.poke_puff.spicy": "Picante",
"flavour.cobblemon.poke_puff.dry": "Seco",
"flavour.cobblemon.poke_puff.sweet": "Dulce",
"flavour.cobblemon.poke_puff.bitter": "Amargo",
"flavour.cobblemon.poke_puff.sour": "Agrio",
"flavour.cobblemon.poke_puff.mild": "Suave",
"tooltip.cobblemon.poke_puff.nature.neutral": "Neutro",
"cobblemon.tooltip.poke_puff.friendship_effects": "Efectos en la amistad",
"item.cobblemon.health_candy": "Dulce de Salud",
"tooltip.cobblemon.poke_puff.friendship_increase": "Amistad +%1$s a cambio de la naturaleza %2$s",
"tooltip.cobblemon.poke_puff.friendship_decrease": "Amistad -%1$s por otras naturalezas",
"item.cobblemon.health_candy.tooltip_1": "Aumenta el IV de PS del Pokémon en 1",
"item.cobblemon.mighty_candy": "Caramelo Músculo",
"item.cobblemon.mighty_candy.tooltip_1": "Aumenta el IV de Ataque del Pokémon en 1",
"item.cobblemon.tough_candy": "Dulce Aguante",
"item.cobblemon.tough_candy.tooltip_1": "Aumenta el IV de Defensa del Pokémon en 1",
"item.cobblemon.smart_candy": "Dulce Inteligencia",
"item.cobblemon.smart_candy.tooltip_1": "Aumenta el IV de Ataque Especial del Pokémon en 1",
"item.cobblemon.courage_candy": "Dulce Coraje",
"item.cobblemon.courage_candy.tooltip_1": "Aumenta el IV de Defensa Especial del Pokémon en 1",
"item.cobblemon.quick_candy": "Dulce Rapidez",
"item.cobblemon.quick_candy.tooltip_1": "Aumenta el IV de VElocidad del Pokémon en 1"
}
@@ -646,9 +646,9 @@
"item.cobblemon.babiri_berry": "Baie Babiri",
"item.cobblemon.babiri_berry.tooltip": "Réduit de moitié les dégâts subis par une capacité super efficace de type Acier",
"item.cobblemon.belue_berry": "Baie Myrte",
"item.cobblemon.belue_berry.tooltip": "Ne peut être consommée par le porteur",
"item.cobblemon.belue_berry.tooltip": "Ne peut être consommée durant les combats",
"item.cobblemon.bluk_berry": "Baie Remu",
"item.cobblemon.bluk_berry.tooltip": "Ne peut être consommée par le porteur",
"item.cobblemon.bluk_berry.tooltip": "Ne peut être consommée durant les combats",
"item.cobblemon.charti_berry": "Baie Charti",
"item.cobblemon.charti_berry.tooltip": "Réduit de moitié les dégâts subis par une capacité super efficace de type Roche",
"item.cobblemon.cheri_berry": "Baie Ceriz",
@@ -664,11 +664,11 @@
"item.cobblemon.colbur_berry": "Baie Lampou",
"item.cobblemon.colbur_berry.tooltip": "Réduit de moitié les dégâts subis par une capacité super efficace de type Ténèbres",
"item.cobblemon.cornn_berry": "Baie Siam",
"item.cobblemon.cornn_berry.tooltip": "Ne peut être consommée par le porteur",
"item.cobblemon.cornn_berry.tooltip": "Ne peut être consommée durant les combats",
"item.cobblemon.custap_berry": "Baie Chérim",
"item.cobblemon.custap_berry.tooltip": "Attaque en premier si le porteur a moins d'1/4 de ses PV max",
"item.cobblemon.durin_berry": "Baie Durin",
"item.cobblemon.durin_berry.tooltip": "Ne peut être consommée par le porteur",
"item.cobblemon.durin_berry.tooltip": "Ne peut être consommée durant les combats",
"item.cobblemon.enigma_berry": "Baie Enigma",
"item.cobblemon.enigma_berry.tooltip": "Restaure 1/4 des PV lorsque le porteur subit une capacité super efficace",
"item.cobblemon.figy_berry": "Baie Figuy",
@@ -682,7 +682,7 @@
"item.cobblemon.hondew_berry": "Baie Lonme",
"item.cobblemon.hondew_berry.tooltip": "Ne peut être consommée par le porteur",
"item.cobblemon.hopo_berry": "Baie Bouhlon",
"item.cobblemon.hopo_berry.tooltip": "Ne peut être consommée par le porteur",
"item.cobblemon.hopo_berry.tooltip": "Restaure 10 PP d'une capacité sélectionnée lorsqu'elle est donnée à un Pokémon",
"item.cobblemon.iapapa_berry": "Baie Papaya",
"item.cobblemon.iapapa_berry.tooltip": "Restaure 1/3 des PV lorsque le porteur a moins d'1/4 de ses PV max ; rend confus si le Pokémon n'aime pas les Baies acides",
"item.cobblemon.jaboca_berry": "Baie Jaboca",
@@ -706,23 +706,23 @@
"item.cobblemon.mago_berry": "Baie Mago",
"item.cobblemon.mago_berry.tooltip": "Restaure 1/3 des PV lorsque le porteur a moins d'1/4 de ses PV max ; rend confus si le Pokémon n'aime pas les Baies sucrées",
"item.cobblemon.magost_berry": "Baie Mangou",
"item.cobblemon.magost_berry.tooltip": "Ne peut être consommée par le porteur",
"item.cobblemon.magost_berry.tooltip": "Ne peut être consommée durant les combats",
"item.cobblemon.maranga_berry": "Baie Rangma",
"item.cobblemon.maranga_berry.tooltip": "Augmente la Défense Spéciale lorsque le porteur subit une capacité spéciale",
"item.cobblemon.micle_berry": "Baie Micle",
"item.cobblemon.micle_berry.tooltip": "Augmente la Précision de la prochaine capacité de ×1,2 lorsque le porteur a moins d'1/4 de ses PV max",
"item.cobblemon.nanab_berry": "Baie Nanab",
"item.cobblemon.nanab_berry.tooltip": "Ne peut être consommée par le porteur",
"item.cobblemon.nanab_berry.tooltip": "Ne peut être consommée durant les combats",
"item.cobblemon.touga_berry": "Baie Touga",
"item.cobblemon.touga_berry.tooltip": "Soigne le porteur de la confusion",
"item.cobblemon.nomel_berry": "Baie Tronci",
"item.cobblemon.nomel_berry.tooltip": "Ne peut être consommée par le porteur",
"item.cobblemon.nomel_berry.tooltip": "Ne peut être consommée durant les combats",
"item.cobblemon.occa_berry": "Baie Chocco",
"item.cobblemon.occa_berry.tooltip": "Réduit de moitié les dégâts subis par une capacité super efficace de type Feu",
"item.cobblemon.oran_berry": "Baie Oran",
"item.cobblemon.oran_berry.tooltip": "Restaure 10 PV lorsque le porteur a moins d'1/2 de ses PV max",
"item.cobblemon.pamtre_berry": "Baie Palma",
"item.cobblemon.pamtre_berry.tooltip": "Ne peut être consommée par le porteur",
"item.cobblemon.pamtre_berry.tooltip": "Ne peut être consommée durant les combats",
"item.cobblemon.passho_berry": "Baie Pocpoc",
"item.cobblemon.passho_berry.tooltip": "Réduit de moitié les dégâts subis par une capacité super efficace de type Eau",
"item.cobblemon.payapa_berry": "Baie Yapap",
@@ -734,17 +734,17 @@
"item.cobblemon.petaya_berry": "Baie Pitaye",
"item.cobblemon.petaya_berry.tooltip": "Augmente l'Attaque Spéciale lorsque le porteur a moins d'1/4 de ses PV max",
"item.cobblemon.pinap_berry": "Baie Nanana",
"item.cobblemon.pinap_berry.tooltip": "Ne peut être consommée par le porteur",
"item.cobblemon.pinap_berry.tooltip": "Ne peut être consommée durant les combats",
"item.cobblemon.pomeg_berry": "Baie Grena",
"item.cobblemon.pomeg_berry.tooltip": "Ne peut être consommée par le porteur",
"item.cobblemon.qualot_berry": "Baie Qualot",
"item.cobblemon.qualot_berry.tooltip": "Ne peut être consommée par le porteur",
"item.cobblemon.rabuta_berry": "Baie Rabuta",
"item.cobblemon.rabuta_berry.tooltip": "Ne peut être consommée par le porteur",
"item.cobblemon.rabuta_berry.tooltip": "Ne peut être consommée durant les combats",
"item.cobblemon.rawst_berry": "Baie Fraive",
"item.cobblemon.rawst_berry.tooltip": "Soigne le porteur de la brûlure",
"item.cobblemon.razz_berry": "Baie Framby",
"item.cobblemon.razz_berry.tooltip": "Ne peut être consommée par le porteur",
"item.cobblemon.razz_berry.tooltip": "Ne peut être consommée durant les combats",
"item.cobblemon.rindo_berry": "Baie Ratam",
"item.cobblemon.rindo_berry.tooltip": "Réduit de moitié les dégâts subis par une capacité super efficace de type Plante",
"item.cobblemon.roseli_berry": "Baie Selro",
@@ -758,7 +758,7 @@
"item.cobblemon.sitrus_berry": "Baie Sitrus",
"item.cobblemon.sitrus_berry.tooltip": "Restaure 1/4 des PV lorsque le porteur a moins d'1/2 de ses PV max",
"item.cobblemon.spelon_berry": "Baie Kiwan",
"item.cobblemon.spelon_berry.tooltip": "Ne peut être consommée par le porteur",
"item.cobblemon.spelon_berry.tooltip": "Ne peut être consommée durant les combats",
"item.cobblemon.starf_berry": "Baie Frista",
"item.cobblemon.starf_berry.tooltip": "Augmente beaucoup une statistique aléatoire lorsque le porteur a moins d'1/4 de ses PV max",
"item.cobblemon.tamato_berry": "Baie Tamato",
@@ -768,9 +768,9 @@
"item.cobblemon.wacan_berry": "Baie Parma",
"item.cobblemon.wacan_berry.tooltip": "Réduit de moitié les dégâts subis par une capacité super efficace de type Électrik",
"item.cobblemon.watmel_berry": "Baie Stekpa",
"item.cobblemon.watmel_berry.tooltip": "Ne peut être consommée par le porteur",
"item.cobblemon.watmel_berry.tooltip": "Ne peut être consommée durant les combats",
"item.cobblemon.wepear_berry": "Baie Repoi",
"item.cobblemon.wepear_berry.tooltip": "Ne peut être consommée par le porteur",
"item.cobblemon.wepear_berry.tooltip": "Ne peut être consommée durant les combats",
"item.cobblemon.wiki_berry": "Baie Wiki",
"item.cobblemon.wiki_berry.tooltip": "Restaure 1/3 des PV lorsque le porteur a moins d'1/4 de ses PV max ; rend confus si le Pokémon n'aime pas les Baies sèches",
"item.cobblemon.yache_berry": "Baie Nanone",
@@ -7808,7 +7808,7 @@
"block.cobblemon.smooth_sky_tumblestone_stairs": "Escaliers de Galet Azur lisse",
"block.cobblemon.chiseled_polished_sky_tumblestone": "Bloc de Galet Azur poli ciselé",
"block.cobblemon.sky_tumblestone_brick_slab": "Dalle de briques de Galet Azur",
"cobblemon.config.ui.party_portrait_animations.never_animate.tooltip": "Aucun portrait animé",
"cobblemon.config.ui.party_portrait_animations.never_animate.tooltip": "Ne pas animer les portraits",
"item.cobblemon.heavy_duty_boots.tooltip": "Le porteur ne subit plus les effets des pièges ou autres entraves posés sur le terrain",
"item.cobblemon.weakness_policy.tooltip_1": "Augmente beaucoup l'Attaque et l'Attaque Spéciale du Pokémon lorsqu'il est touché par une capacité d'un type auquel il est vulnérable",
"item.cobblemon.exp_share.tooltip": "Permet de faire gagner des Points Exp. à tous les Pokémon de l'équipe, même à ceux qui n'ont pas participé au combat",
@@ -7878,7 +7878,7 @@
"cobblemon.config.ui.shiny_rate.tooltip": "La probabilité qu'un Pokémon soit chromatique. Si la valeur est 0, aucun Pokémon ne sera chromatique. Calculé sur la base de 1/x.",
"cobblemon.config.ui.pasture_block_update_ticks.tooltip": "Le nombre de ticks de serveur entre les mises à jour des blocs de pâturage.",
"cobblemon.config.ui.pasture_max_wander_distance.tooltip": "Le nombre maximal de blocs qu'un Pokémon peut se déplacer à partir du bloc de pâturage.",
"cobblemon.config.ui.party_portrait_animations.always_animate.tooltip": "Toute l'équipe est animée à moins d'être K.O.",
"cobblemon.config.ui.party_portrait_animations.always_animate.tooltip": "Animer toute l'équipe sauf les Pokémon K.O.",
"cobblemon.config.ui.third_person_view_bobbing.tooltip": "Si la valeur est vrai, le comportement par défaut de Minecraft est utilisé pour suivre directement derrière la tête du joueur. Si la valeur est faux, il suit un angle fixe par rapport au Pokémon.",
"item.cobblemon.automaton_armor_trim_smithing_template": "Modèle de forge",
"block.cobblemon.polished_black_tumblestone_slab": "Dalle de Galet Noir poli",
@@ -8040,12 +8040,12 @@
"cobblemon.fishing_bait_effects.inert.tooltip": "Aucun effet connu",
"cobblemon.egg_group.monster": "Monstrueux",
"cobblemon.egg_group.water_1": "Aquatique 1",
"item.cobblemon.grepa_berry.tooltip_2": "Ne peut être consommée par le porteur",
"item.cobblemon.hondew_berry.tooltip_2": "Ne peut être consommée par le porteur",
"item.cobblemon.kelpsy_berry.tooltip_2": "Ne peut être consommée par le porteur",
"item.cobblemon.pomeg_berry.tooltip_2": "Ne peut être consommée par le porteur",
"item.cobblemon.qualot_berry.tooltip_2": "Ne peut être consommée par le porteur",
"item.cobblemon.tamato_berry.tooltip_2": "Ne peut être consommée par le porteur",
"item.cobblemon.grepa_berry.tooltip_2": "Ne peut être consommée durant les combats",
"item.cobblemon.hondew_berry.tooltip_2": "Ne peut être consommée durant les combats",
"item.cobblemon.kelpsy_berry.tooltip_2": "Ne peut être consommée durant les combats",
"item.cobblemon.pomeg_berry.tooltip_2": "Ne peut être consommée durant les combats",
"item.cobblemon.qualot_berry.tooltip_2": "Ne peut être consommée durant les combats",
"item.cobblemon.tamato_berry.tooltip_2": "Ne peut être consommée durant les combats",
"cobblemon.config.ui.max_pokemon_level.tooltip": "Le niveau maximal que les Pokémon peuvent atteindre.",
"cobblemon.config.ui.category.starter": "Pokémon de départ",
"cobblemon.config.ui.announce_drop_items.tooltip": "Indique s'il faut informer le joueur des récompenses après avoir vaincu des Pokémon sauvages.",
@@ -8091,7 +8091,7 @@
"cobblemon.config.ui.battle_spectate_max_distance.tooltip": "La distance maximale à laquelle les joueurs peuvent être spectateurs des combats.",
"cobblemon.config.ui.hide_unimplemented_pokemon_in_the_pokedex.tooltip": "Masquer ou non les Pokémon non implémentés dans le Pokédex.",
"cobblemon.config.ui.summary_pokemon_follow_cursor.tooltip": "Permet aux Pokémon de suivre ou non le curseur de la souris avec leur tête dans l'écran de résumé.",
"cobblemon.config.ui.party_portrait_animations.animate_selected.tooltip": "Le Pokémon sélectionné est animé à moins d'être K.O.",
"cobblemon.config.ui.party_portrait_animations.animate_selected.tooltip": "Animer le Pokémon sélectionné à moins d'être K.O.",
"cobblemon.config.ui.invert_pitch.tooltip": "Inverse la direction de tangage (haut et bas).",
"cobblemon.config.ui.invert_yaw.tooltip": "Inverse le sens de la rotation (gauche et droite).",
"cobblemon.config.ui.invert_roll.tooltip": "Inverse le sens de la caméra (rotation à gauche et à droite).",
@@ -8956,7 +8956,7 @@
"cobblemon.behaviour.looks_around.name": "Regarder autour",
"cobblemon.behaviour.looks_around.desc": "Regarde les entités à proximité.",
"cobblemon.behaviour.pokemon_battles.name": "Combats Pokémon",
"cobblemon.behaviour.pokemon_battles.desc": "Cesse de bouger et regarde ses adversaires pendant les combats Pokémon.",
"cobblemon.behaviour.pokemon_battles.desc": "Cesse de bouger et regarde ses adversaires durant les combats Pokémon.",
"cobblemon.behaviour.pokemon_follows_owner.desc": "Suit son dresseur partout, plus rarement s'il est dans un pâturage.",
"cobblemon.behaviour.pokemon_follows_owner.name": "Pokémon suit son dresseur",
"cobblemon.behaviour.pokemon_sleeps.name": "Pokémon dort",
@@ -9033,5 +9033,62 @@
"tag.item.cobblemon.candies": "Bonbons",
"tag.item.cobblemon.additive_iv_candies": "Bonbons additifs pour Entraînement Ultime",
"cobblemon.behaviour.pokemon_bee.name": "Polliniser les fleurs",
"cobblemon.behaviour.pokemon_bee.desc": "Pollinise les fleurs et ajoute du miel aux ruches et aux feuilles d'arbre de saccarine."
"cobblemon.behaviour.pokemon_bee.desc": "Pollinise les fleurs et ajoute du miel aux ruches et aux feuilles d'arbre de saccarine.",
"cobblemon.seasoning_ride_boosts_info_header": "Bonus de monte :",
"cobblemon.config.ui.poke_snack_pokemon_per_chunk.tooltip": "Le nombre de Pokémon autorisés dans un tronçon lors de leur apparition via des Poké Snacks.",
"cobblemon.config.ui.poke_snack_pokemon_per_chunk": "Poké Snack Pokémon par tronçon",
"tag.item.cobblemon.recipe_filters.nutrition_seasoning": "Objets d'assaisonnement nutritif",
"cobblemon.entity.variable.look_at_entity_types.name": "Regarder les types de l'entité",
"cobblemon.behaviour.configurable_resource_identifier.desc": "Permet de modifier l'identifiant de ressource qui contrôle l'apparence du PNJ.",
"item.cobblemon.moomoo_milk.tooltip": "Efface tous les changements de stats du Pokémon cible lorsque utilisé au combat.",
"key.cobblemon.toggleridingstatsgui": "Afficher les stats de monte",
"cobblemon.config.ui.summary_profile_animations.never_animate": "Ne jamais animer",
"tag.item.cobblemon.berries.mutation_result": "Baies de mutation",
"tag.item.cobblemon.berries.status_recovery": "Baies de récupération de statut",
"tag.item.cobblemon.berries.pp_recovery": "Baies de récupération de PP",
"tag.item.cobblemon.berries.stat_buff": "Baies de combat",
"cobblemon.entity.variable.resource_identifier.name": "Identifiant de ressource",
"cobblemon.entity.variable.display_name_tag.name": "Afficher l'étiquette",
"cobblemon.behaviour.name_tag_display.desc": "Permet d'afficher ou masquer l'étiquette de l'entité.",
"cobblemon.entity.variable.display_name_tag.desc": "Permet d'afficher ou masquer l'étiquette de l'entité.",
"cobblemon.behaviour.dialogue_selection.desc": "Permet de configurer l'interaction avec le PNJ afin d'ouvrir un dialogue spécifique.",
"cobblemon.behaviour.dialogue_selection.name": "Sélection du dialogue",
"cobblemon.entity.variable.dialogue_selection.name": "Dialogue",
"cobblemon.entity.variable.dialogue_selection.desc": "L'identifiant de ressource du dialogue à ouvrir lors de l'interaction, par exemple cobblemon:your_dialogue",
"cobblemon.seasoning_ride_boost_entry": "%1$s : %2$s",
"item.cobblemon.eggant_berry": "Baie Eggant",
"cobblemon.command.npcdelete.not_player": "Seuls les joueurs peuvent exécuter cette commande.",
"cobblemon.command.npcdelete.deleted": "%1$s a été supprimé.",
"cobblemon.config.ui.animate_battle_tiles.tooltip": "Permet d'animer ou non les portraits de combat des Pokémon.",
"cobblemon.config.ui.animate_battle_tiles": "Animer les tuiles de combat",
"cobblemon.config.ui.pc_profile_animations": "Animations de profil du PC",
"cobblemon.config.ui.pc_profile_animations.never_animate.tooltip": "Ne pas animer les profils",
"cobblemon.config.ui.pc_profile_animations.animate_selected": "Animer la sélection",
"cobblemon.config.ui.pc_profile_animations.never_animate": "Ne jamais animer",
"cobblemon.config.ui.pc_profile_animations.animate_selected.tooltip": "Animer le Pokémon sélectionné à moins d'être K.O.",
"cobblemon.config.ui.pc_profile_animations.always_animate": "Toujours animer",
"cobblemon.config.ui.pc_profile_animations.always_animate.tooltip": "Animer tout le PC sauf les K.O.",
"cobblemon.config.ui.summary_profile_animations": "Résumé des animation du profil",
"cobblemon.config.ui.summary_profile_animations.never_animate.tooltip": "Ne pas animer les portraits",
"cobblemon.config.ui.summary_profile_animations.animate_selected": "Animer la sélection",
"cobblemon.config.ui.summary_profile_animations.animate_selected.tooltip": "Animer le Pokémon sélectionné à moins d'être K.O.",
"cobblemon.config.ui.summary_profile_animations.always_animate": "Toujours animer",
"cobblemon.config.ui.summary_profile_animations.always_animate.tooltip": "Animer toute l'équipe sauf les Pokémon K.O.",
"tag.item.cobblemon.mint_leaves": "Feuilles d'Aromate",
"tag.item.cobblemon.berries.damage_reduction": "Baies de réduction de dégâts",
"tag.item.cobblemon.berries.damaging": "Baies de représailles",
"tag.item.cobblemon.berries.friendship": "Baies d'amitié",
"tag.item.cobblemon.berries.hp_recovery": "Baies de guérison",
"tag.item.cobblemon.berries.nature_recovery": "Baies de guérison puissantes",
"tag.item.cobblemon.berries.non_battle": "Baies non tenues",
"tag.item.cobblemon.recipe_filters.poke_puff_seasoner": "Baies pour Profiteroles",
"tag.item.cobblemon.recipe_filters.bait_seasoning": "Appâts",
"tag.item.cobblemon.recipe_filters.effect_seasoning": "Objets d'assaisonnement d'effet",
"tag.item.cobblemon.recipe_filters.flavour_seasoning": "Objets d'assaisonnement du goût",
"tag.item.cobblemon.recipe_filters.colour_seasoning": "Objets d'assaisonnement de couleur",
"tag.item.cobblemon.held.container_held_items": "Conteneurs",
"cobblemon.entity.variable.look_at_entity_types.desc": "Les types d'entités que l'entité examinera.",
"cobblemon.behaviour.configurable_resource_identifier.name": "Identifiant de ressource configurable",
"cobblemon.entity.variable.resource_identifier.desc": "L'identifiant de ressource à utiliser pour contrôler l'apparence du PNJ, tel que cobblemon:standard ou cobblemon:mudkip.",
"cobblemon.behaviour.name_tag_display.name": "Afficher l'étiquette"
}

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