Compare commits

...
Author SHA1 Message Date
amo 4a1116c2af client sendout event 2024-04-24 03:51:17 +01:00
amo b41100f3d9 irk 2024-04-23 00:49:34 +01:00
Village 8768c4c541 differentiate badly poisoned in ui 2024-04-17 21:50:03 -04:00
Nick cf3587557d Merge branch 'ui-icon' into 'main'
Update shiny icon

See merge request cable-mc/cobblemon!963
2024-04-15 19:14:48 +00:00
Test bbd44c0010 Update shiny icon 2024-04-15 19:14:48 +00:00
Nick bb05177985 Merge branch 'imposter_fix' into 'main'
Imposter fixes

See merge request cable-mc/cobblemon!965
2024-04-15 19:14:18 +00:00
Segfault Guy 31143359ee Imposter fixes 2024-04-15 19:14:18 +00:00
Nick c8f0140870 Merge branch '1.5-Structures' into 'main'
found a spelling error smh

See merge request cable-mc/cobblemon!964
2024-04-15 19:13:00 +00:00
Myslippy 0b9ca3a97c found a spelling error smh 2024-04-15 19:12:59 +00:00
Hiroku 450ebfc44e Merge branch 'scripts/public-spawn-writer-script' into 'main'
public spawn writer script open beta

See merge request cable-mc/cobblemon!961
2024-04-13 01:26:36 +00:00
Hiroku 253bde945f Merge branch 'gilded-chest-crash-fix' into 'main'
Fixes gilded chest encounter from crashing when party is empty.

See merge request cable-mc/cobblemon!962
2024-04-13 01:06:14 +00:00
Islana 3622946974 Fixes gilded chest encounter from crashing when party is empty. 2024-04-12 19:52:33 -04:00
Hiroku 4077feca35 Merge branch '1.5-Structures' into 'main'
It wasnt the last D:

See merge request cable-mc/cobblemon!960
2024-04-11 02:37:44 +00:00
Waldleufer bf330c112b Allowing any combination of Folder and File Name [skip-ci] 2024-04-10 21:47:26 +02:00
Slippy c07d7d304e It wasnt the last D: 2024-04-09 19:19:02 -05:00
Hiroku 5797a2e568 Merge branch '1.5-Structures' into 'main'
1.5 structures

See merge request cable-mc/cobblemon!959
2024-04-10 00:16:49 +00:00
Slippy 5f94999b4f Is this the last push? 2024-04-09 19:15:02 -05:00
Hiroku 8b8fa06472 Update 0999_gimmighoul.json 2024-04-09 01:24:18 +00:00
Hiroku 0459780171 Update 0442_spiritomb.json 2024-04-09 00:22:21 +00:00
Hiroku e27bf7fc4b Merge branch 'ys/forfeit' into 'main'
PVP Forfeit Option

Closes #142

See merge request cable-mc/cobblemon!957
2024-04-08 14:28:57 +00:00
Paul 36007caf16 Merge remote-tracking branch 'origin/main' into ys/forfeit
# Conflicts:
#	common/src/main/resources/assets/cobblemon/lang/en_us.json
2024-04-08 22:55:49 +10:00
Hiroku f00b16ab1a Merge branch 'better_victory_msg' into 'main'
Fix capture messages and improve win/defeat messages.

See merge request cable-mc/cobblemon!958
2024-04-08 12:25:37 +00:00
Hiroku ac93c89d2c Merge branch '1.5-more-spawn-and-drops' into 'main'
1.5 more spawn and drops

See merge request cable-mc/cobblemon!954
2024-04-08 12:22:00 +00:00
Hiroku 1c5f6a8f54 Merge branch 'implement_pokemon' into 'main'
Hisui Starters, some model, animation, & texture fixes, and more!

See merge request cable-mc/cobblemon!956
2024-04-08 04:09:18 +00:00
Segfault Guy f66358e358 Fix capture messages and improve win/defeat messages. 2024-04-07 22:53:50 -04:00
Tyzillion 446706e6cd Moved my conditions from PokemonEntity to EntityExtensions. 2024-04-07 22:50:42 -04:00
Segfault Guy 967fd2e0ec Force Showdown loss on forfeit. 2024-04-07 22:48:38 -04:00
Tyzillion 57d2b51264 Sorry, found another error in the changelog. 2024-04-07 22:29:21 -04:00
Tyzillion 4baa43ccb4 Quick changelog amend. 2024-04-07 22:26:28 -04:00
Tyzillion c9be0104dd Updated Changelog. 2024-04-07 22:14:04 -04:00
Tyzillion 55a179f548 Merge branch 'main' of https://gitlab.com/cable-mc/cobblemon into implement_pokemon 2024-04-07 22:11:23 -04:00
Tyzillion beaea0e88c Merge remote-tracking branch 'origin/implement_pokemon' into implement_pokemon 2024-04-07 22:11:05 -04:00
Tyzillion fb54ff8054 Revamped Torkoal's particles. Made the particles only appear in battle. Hoping in the future when it gets more animations to add quirks that have it spew smoke. 2024-04-07 22:10:52 -04:00
Hiroku c273192ba2 Merge branch 'tumbleshatter' into 'main'
Reduces Tumblestone blocks to a 2x2 recipe, makes Tumblestone blocks drop the tumblestones on break

See merge request cable-mc/cobblemon!955
2024-04-08 02:06:33 +00:00
dhi_holo acfc3b1acc Tumbleshatter
Tumblestone Blocks now shatter back into tumblestones on breaking, unless using silk touch
2024-04-08 09:44:38 +10:00
dhi_holo e45e7a589b Reduces Tumblestone blocks to a 2x2 recipe
(this is for future content)
2024-04-08 09:09:31 +10:00
FrankTheFarmerReal 0fc3bf9de7 Merge remote-tracking branch 'origin/implement_pokemon' into implement_pokemon 2024-04-08 07:15:42 +10:00
FrankTheFarmerReal b6af9381f0 Ferroseed line is not from gen 2 🤔 2024-04-08 07:14:59 +10:00
Sterrezo ee64810970 Cry checker script fix 2024-04-07 23:05:51 +02:00
Tyzillion a7152f3e35 Added ambient Bubble particles to Krabby that play during sunset with no rain. 2024-04-07 14:09:11 -04:00
Tyzillion 46290554c5 Merge branch 'main' of https://gitlab.com/cable-mc/cobblemon into implement_pokemon 2024-04-07 14:08:38 -04:00
Tyzillion 771a2c0727 Merge remote-tracking branch 'origin/implement_pokemon' into implement_pokemon 2024-04-07 14:08:03 -04:00
Segfault Guy 4e456e030d Merge branch 'main' into ys/forfeit
Conflicts:
	common/src/main/kotlin/com/cobblemon/mod/common/api/battles/model/PokemonBattle.kt
	common/src/main/kotlin/com/cobblemon/mod/common/battles/ShowdownActionRequest.kt
	common/src/main/resources/assets/cobblemon/lang/en_us.json
2024-04-07 13:33:34 -04:00
FrankTheFarmerReal 9d69c593b8 Hitbox and Look animation fixes. Stopped Ferroseed and Whirlipede turbo spins. 2024-04-08 00:05:29 +10:00
Hiroku 6e58f4be59 Merge branch 'illusion' into 'main'
Illusion and Transform Entity Effects

Closes #769, #744, #741, #297, and #123

See merge request cable-mc/cobblemon!929
2024-04-07 01:33:47 +00:00
FrankTheFarmerReal f1807dc27c Many many fix 2024-04-06 22:13:33 +10:00
Tyzillion cb8e96230e Merge branch 'main' of https://gitlab.com/cable-mc/cobblemon into implement_pokemon 2024-04-06 04:48:37 -04:00
Paul dc6b3ada9b Fixed F3-T crash on Fabric. Closes #780 2024-04-06 13:28:39 +10:00
Paul ccdb8803b2 Merge remote-tracking branch 'origin/main' into implement_pokemon 2024-04-06 12:00:24 +10:00
Paul fd917438a1 Fixed Pokémon pathing over snow layers and carpets. Closes #783 2024-04-06 11:44:39 +10:00
Tyzillion 4a0e567554 Fixed starterconfig to use right features 2024-04-05 16:18:46 -04:00
Tyzillion bb6b67e4aa Merge remote-tracking branch 'origin/implement_pokemon' into implement_pokemon 2024-04-05 16:16:23 -04:00
Slippy 6515bfa108 Decaying Crypt no longer has a random floating granite block 2024-04-05 12:14:57 -05:00
FrankTheFarmerReal 8bf5492409 10 Fixes + Retextures implemented 2024-04-05 23:46:02 +10:00
FrankTheFarmerReal e6573f3c3b Sneasel hitbox fixes 2024-04-05 15:28:53 +10:00
Tyzillion 86d8fa1806 Merge branch 'main' of https://gitlab.com/cable-mc/cobblemon into implement_pokemon 2024-04-05 00:10:56 -04:00
Hiroku de65320610 Merge branch 'SortFaintedToBottom_Fix' into 'main'
Sort fainted to bottom fix

See merge request cable-mc/cobblemon!932
2024-04-05 02:57:21 +00:00
Hiroku 3828991a71 Update BattleActor.kt 2024-04-05 01:32:00 +00:00
Paul 129ea86829 Licenses 2024-04-05 11:10:51 +10:00
Hiroku 216270b798 Merge branch 'bugs_and_tweaks' into 'main'
Bugs and tweaks

Closes #782

See merge request cable-mc/cobblemon!931
2024-04-05 01:03:00 +00:00
Hiroku ad1674a1bc Merge branch 'main' into 'illusion'
# Conflicts:
#   common/src/main/kotlin/com/cobblemon/mod/common/pokemon/Pokemon.kt
2024-04-05 00:46:37 +00:00
FrankTheFarmerReal 2b80d99614 Commented out some faint poses for pokemon that don't have faint animations currently. 2024-04-04 22:56:26 +10:00
FrankTheFarmerReal 723302ed39 Fixed Shieldon animation crash 2024-04-04 22:42:15 +10:00
FrankTheFarmerReal 79bec94f55 Restored missing Hippowdon sound 2024-04-04 22:41:39 +10:00
FrankTheFarmerReal d7a7d421a0 Merge remote-tracking branch 'origin/implement_pokemon' into implement_pokemon 2024-04-04 21:52:50 +10:00
FrankTheFarmerReal 49632b6f85 Revised SingleBoneLookAnimation. Can properly invert X and Y axis and define range limits. 2024-04-04 21:50:13 +10:00
Tyzillion 308a41a5fc Gave Lapras funny placeholder Quadruped walk. hehe 2024-04-04 07:20:16 -04:00
Paul a5486be16f Removed a test log message 2024-04-04 20:40:33 +10:00
Paul 94c9f865e7 Fixed poser issues for gen8 fossils, Omanyte line, Wingull line, Hippowdown, Chespin line 2024-04-04 20:06:28 +10:00
Paul 3385b9c8bf Merge remote-tracking branch 'origin/implement_pokemon' into implement_pokemon 2024-04-04 19:38:39 +10:00
Veraxiel cdfc894d49 Removed spawns not supposed to be there. 2024-04-03 16:55:13 -04:00
Veraxiel 784e2c0fb8 Updates to spawns and some tags. 2024-04-03 16:52:18 -04:00
Waldleufer e6a487dc52 Handling custom file name groupings and custom output folders in the public spawn writer [skip-ci] 2024-04-03 22:28:37 +02:00
Waldleufer bdb79a32cc Generated a bunch of drops. 2024-04-03 20:51:57 +02:00
Waldleufer 5d6a227c49 Merge branch 'main' into 1.5-more-spawn-and-drops 2024-04-03 19:37:40 +02:00
FrankTheFarmerReal 2bca651f75 PLEASE REVIEW: SingleBoneLookAnimation changes to support min and max ranges for yaw. Dugtrio and Dodrio examples. 2024-04-03 23:22:59 +10:00
FrankTheFarmerReal cbde864cc1 diglett and dugtrio hitbox fixes 2024-04-03 23:17:55 +10:00
FrankTheFarmerReal 4b3a5d7ca9 Flaaffy head bone correction 2024-04-03 20:04:30 +10:00
FrankTheFarmerReal e55c08648f Expanded constructor for SingleBoneLook and added Grimmsnarl sight cone restrictions. 2024-04-03 13:15:38 +10:00
FrankTheFarmerReal 052f8fd94a Some placeholder animations 2024-04-03 08:50:57 +10:00
Tyzillion cd4f7fc7aa Forgot to merge main into branch. 2024-04-02 17:19:33 -04:00
Tyzillion c90400bba6 Merge branch 'main' of https://gitlab.com/cable-mc/cobblemon into implement_pokemon
# Conflicts:
#	common/src/main/kotlin/com/cobblemon/mod/common/entity/pokemon/PokemonEntity.kt
2024-04-02 17:17:32 -04:00
Tyzillion d390764717 changed pattern aspect to region_bias. Updated all that needed to be updated with the new aspect name. Made the region bias pokemon share animations with their normal variants. 2024-04-02 17:15:51 -04:00
Lily 0880d127a7 Merge branch 'main' into bugs_and_tweaks
# Conflicts:
#	common/src/main/resources/assets/cobblemon/lang/en_us.json
2024-04-02 16:13:39 -04:00
Nick 30466a6063 Merge branch 'shifting-shadows' into 'main'
Scale shadows on sendout/recall

See merge request cable-mc/cobblemon!949
2024-04-02 18:50:13 +00:00
Mia fd59b81bff Scale shadows on sendout/recall 2024-04-02 18:50:13 +00:00
FrankTheFarmerReal ba82a6bc56 Some placeholder animations 2024-04-02 16:16:28 +10:00
Lily abf64e6047 Merge branch 'main' into bugs_and_tweaks 2024-04-01 22:06:23 -04:00
Lily c463278498 Fix outdated advancement name 2024-04-01 22:04:42 -04:00
Paul a37fdf709a Fixed Inkay evo method. Fixes #787 2024-04-01 18:51:55 +10:00
Paul 5023f28d04 Fixed underwalking the target position leading to walking in place. Fixes #790 2024-04-01 18:40:57 +10:00
Slippy c502fec709 more bug fixes and balancing 2024-04-01 02:48:33 -05:00
FrankTheFarmerReal 49444eea50 Updated walk animations for Armaldo and Hoothoot 2024-04-01 15:36:56 +10:00
FrankTheFarmerReal 470fb80e08 Cutiefly, Flabebe, Flittle, and Scatterbug are now shoulder mountable 2024-04-01 15:22:29 +10:00
FrankTheFarmerReal a2aa6deddb Fixed Roselia battle idle not playing 2024-04-01 14:26:12 +10:00
Paul 0d4ef20b4a Merge remote-tracking branch 'origin/main' into implement_pokemon
# Conflicts:
#	common/src/main/kotlin/com/cobblemon/mod/common/entity/pokemon/PokemonEntity.kt
2024-04-01 11:55:37 +10:00
Hiroku 67de28386a Merge branch 'ball-animation-changes' into 'main'
Breakout Animation, Overhauled Sendout Logic

See merge request cable-mc/cobblemon!943
2024-04-01 01:03:16 +00:00
Hiroku cd37d3538e Formatting 2024-04-01 00:39:38 +00:00
Tyzillion 137fed9152 Removed cry sound effect from Gimmighoul surprise animation so that it doesn't play the cry twice when encountering a closed Gimmighoul. Fixed Archen quirk sound being on wrong quirk. 2024-03-31 15:29:01 -04:00
Tyzillion 42ea462937 Hopefully fixed Xatu's t-posing while flying. 2024-03-31 11:14:19 -04:00
Tyzillion f32852db9d Merge branch 'main' of https://gitlab.com/cable-mc/cobblemon into implement_pokemon 2024-03-31 11:08:30 -04:00
Tyzillion 4294360cb9 Merge remote-tracking branch 'origin/implement_pokemon' into implement_pokemon 2024-03-31 11:08:15 -04:00
FrankTheFarmerReal d54565dbb5 Fixed Rookidee and Corvisquire T posing underwater 2024-03-31 23:12:08 +10:00
FrankTheFarmerReal 0e005ea1ba Galarian Rapidash will now stop T posing when asleep, but will have to sleep with its eyes open :( 2024-03-31 22:58:16 +10:00
FrankTheFarmerReal d2e32bc26a Gave temporary walk animation to Salazzle 2024-03-31 22:47:16 +10:00
FrankTheFarmerReal 92d5005a62 Restored Lechonk's cry 2024-03-31 22:34:43 +10:00
Hiroku 3d03ee5eb3 Merge branch 'gilded_chest_names' into 'main'
Preserve and display custom names for gilded chests

Closes #792

See merge request cable-mc/cobblemon!945
2024-03-31 12:11:57 +00:00
Paul 0b685ed453 Actually that one field is nullable 2024-03-31 21:47:10 +10:00
Hiroku 115e990df6 Update GildedChestBlock.kt 2024-03-31 10:19:16 +00:00
Hiroku 2ee38f0a29 Merge branch '1.5-Structures' into 'main'
fixed spelling error in gilded chest loot table

See merge request cable-mc/cobblemon!948
2024-03-31 10:18:03 +00:00
Slippy 756ef48ba2 coins are more common in sus blocks 2024-03-31 04:52:02 -05:00
Slippy 2c4df6622a fixed spelling error in gilded chest loot table 2024-03-31 04:30:48 -05:00
FrankTheFarmerReal 99dc9930b8 Fixed Timburr and Gurdurr quirks 2024-03-31 18:52:28 +10:00
Hiroku 425c41bc4b Merge branch 'waterloggable-tumblestones' into 'main'
Make tumblestones waterloggable

Closes #793

See merge request cable-mc/cobblemon!946
2024-03-31 07:22:48 +00:00
Hiroku 9f7a99b583 Merge branch '1.5-Structures' into 'main'
1.5 structures

See merge request cable-mc/cobblemon!947
2024-03-31 07:22:22 +00:00
Slippy f1213abdf4 candy adjustment 2024-03-31 01:04:02 -05:00
Slippy 9b1d847f59 added absorb bulb to some fossil loot tables 2024-03-31 00:09:28 -05:00
Slippy bf900a0167 Just an enormous amount of changes to loot tables and structures 2024-03-30 23:57:54 -05:00
FrankTheFarmerReal 7b008fe0ec Fixed broken animations for Chinchou, Lanturn, Gallade, and Magikarp 2024-03-31 14:09:12 +10:00
FrankTheFarmerReal ffa9ae4e86 Updated animations for Unovan and Hisuian Petilil 2024-03-31 13:37:07 +10:00
miasmus d60d828e93 make tumblestones waterloggable 2024-03-30 23:00:08 -04:00
FrankTheFarmerReal fcbc7ee72b Updated more walk speeds 2024-03-31 12:13:50 +10:00
Tyzillion 7319fdf29b Merge branch 'main' of https://gitlab.com/cable-mc/cobblemon into implement_pokemon 2024-03-30 21:53:27 -04:00
Slippy 703282eca1 Merge branch 'main' of https://gitlab.com/cable-mc/cobblemon into 1.5-Structures 2024-03-30 19:39:12 -05:00
miasmus 5d7e6f6487 Preserve and display custom names for gilded chests 2024-03-30 19:38:38 -04:00
Hiroku 4e3e6405d0 Merge branch 'FossilMachineBalancing01' into 'main'
Fossil machine balancing01

See merge request cable-mc/cobblemon!944
2024-03-30 23:01:44 +00:00
Segfault Guy d8ad55506d Update Showdown w/ illusion and party bug fixes. 2024-03-30 16:00:18 -04:00
Segfault Guy adef71c23f Merge branch 'main' into illusion 2024-03-30 15:52:10 -04:00
Segfault Guy 9b49f5e01f Add licenses. 2024-03-30 15:37:37 -04:00
Segfault Guy 23c52fd106 Fix transform with shiny aspect. 2024-03-30 15:22:33 -04:00
Segfault Guy d118fe4ee8 Fix interpreter instructions pulling real BattlePokemon name before illusion is dispatched. 2024-03-30 15:09:17 -04:00
Segfault Guy 7b2b860e52 Fix ClientBattlePokemon syncing for transform and illusion. 2024-03-30 14:35:30 -04:00
FrankTheFarmerReal d733eaae2f Updated behaviours for Dreepy line and Flabebe line. 2024-03-31 00:25:40 +10:00
FrankTheFarmerReal 0c8fe42087 Fixed portraits for Lunatone, Solrock, and Salazzle 2024-03-30 23:38:26 +10:00
FrankTheFarmerReal 5e88116e08 Adjusted movement speed of Anorith and Armaldo. Fixed Hisuian Goodra crash 2024-03-30 23:30:45 +10:00
JazzMcNade 1e161a52ee Fixed an index out of bounds issue related to having a extreme excess of material in the tank 2024-03-30 02:27:04 -05:00
JazzMcNade 65b2204783 Decreased required material to 128 (from 256). Decreased restoration time to 12min (from 15min). 2024-03-30 02:14:06 -05:00
Flarkinater 76d9137ae4 Merge branch 'main' into ball-animation-changes 2024-03-29 22:09:21 -04:00
Flarkinater 9f6c44fd75 Sendout location is only shifted vertically when necessary 2024-03-29 22:08:40 -04:00
Flarkinater 6c086f5555 Fixed merge conflict goofs 2024-03-29 21:58:26 -04:00
FrankTheFarmerReal ef96814900 Restored cries for Gardevoir and Rowlet 2024-03-30 11:37:52 +10:00
Tyzillion f6161d8687 Misc fixes and implemented region pattern evolution methods. 2024-03-29 17:31:08 -04:00
Tyzillion 8aa5d3a72c Merge remote-tracking branch 'origin/implement_pokemon' into implement_pokemon 2024-03-29 11:27:37 -04:00
Waldleufer 353de8b8a3 ✨ Polishing ✨ [skip-ci] 2024-03-29 16:23:21 +01:00
Waldleufer 0423dd4939 hint at potential partial implementations that are not checked of in the spreadsheet. [skip-ci] 2024-03-29 16:19:38 +01:00
Waldleufer fe02ea6fa9 Polished Cry Checker Skript to help verify implemented cries [skip-ci] 2024-03-29 16:08:18 +01:00
Tyzillion 90f7454ffb Merge remote-tracking branch 'origin/implement_pokemon' into implement_pokemon 2024-03-29 08:52:39 -04:00
FrankTheFarmerReal 04f53040a3 Many long pokemon are no longer partly rendered in the PC 2024-03-29 22:50:16 +10:00
Tyzillion 69e21672eb Merge branch 'main' of https://gitlab.com/cable-mc/cobblemon into implement_pokemon
# Conflicts:
#	CHANGELOG.md
2024-03-29 08:36:41 -04:00
FrankTheFarmerReal 4f2e3ecb0f Fixed Conkeldurr using Gurdurr's animations. Also updated the whole line's animations. 2024-03-29 22:27:30 +10:00
FrankTheFarmerReal 1acc41da8c Gimmighoul, Pupitar, and Tyranitar will now appear using the spawnallpokemon command 2024-03-29 20:50:56 +10:00
FrankTheFarmerReal a6917162a7 Updated animations on Quaxwell and Quaquaval 2024-03-29 17:47:53 +10:00
Slippy a9115bfb15 XL RCs are less common 2024-03-29 01:27:30 -05:00
FrankTheFarmerReal 111cb3a2f3 Fixed cries and T poses for Unovan and Hisuian Oshawott 2024-03-29 16:21:03 +10:00
Hiroku f2c5113f0b Merge branch 'json-addict' into 'main'
Advancement and Tag Updates

See merge request cable-mc/cobblemon!942
2024-03-29 05:31:33 +00:00
Hiroku e29a2402e9 Merge branch 'spawning-gamerule-change' into 'main'
Move doPokemonSpawning gamerule logic

See merge request cable-mc/cobblemon!941
2024-03-29 05:30:53 +00:00
Hiroku aa4857abbb Merge branch 'Quick-Move-Stacked-PokePotion-Bases' into 'main'
Add the ability to quick move stacked PokePotion bases into Brewing Stands.

See merge request cable-mc/cobblemon!935
2024-03-29 05:29:13 +00:00
Hiroku d29653233d Merge branch 'main' into 'Quick-Move-Stacked-PokePotion-Bases'
# Conflicts:
#   CHANGELOG.md
2024-03-29 05:28:22 +00:00
Hiroku 1b51a128d7 Merge branch 'OldAmberSpriteUpdate' into 'main'
Corrected Old Amber Sprite

See merge request cable-mc/cobblemon!939
2024-03-29 05:27:10 +00:00
Hiroku 245011cf5e Merge branch '1.5-Structures' into 'main'
Oh boy that's a lot of changes and fixes to structures

See merge request cable-mc/cobblemon!940
2024-03-29 05:26:30 +00:00
FrankTheFarmerReal 8ac9f38b06 Petilil pivot changes and Stonjourner walk speed adjusted 2024-03-29 15:12:47 +10:00
FrankTheFarmerReal 48193160b9 Texture updates for Forretress, Sizzlipede, and Centiskorch 2024-03-29 14:31:14 +10:00
FrankTheFarmerReal 83100dec11 Tweaked Anorith and Armaldo again 2024-03-29 14:14:52 +10:00
Flarkinater 100bf7fee4 Merge remote-tracking branch 'origin/main' into ball-animation-changes
# Conflicts:
#	common/src/main/kotlin/com/cobblemon/mod/common/client/render/pokemon/PokemonRenderer.kt
2024-03-29 00:05:58 -04:00
Flarkinater be043a0ea1 Fixed minor issue with shifting Pokemon vertically during suffocation sendout check 2024-03-28 23:41:24 -04:00
Flarkinater a902f4a8a3 Fixed suffocation avoidance when sending out Pokemon adjacent to a wall, other related fixes 2024-03-28 23:05:30 -04:00
Flarkinater 442f54839f Improved spacing when targeting walls and above blocks 2024-03-28 22:09:41 -04:00
FrankTheFarmerReal a87b5090b0 Added Anorith and Armaldo animations 2024-03-29 11:48:05 +10:00
dhi_holo 20a97984a2 Misc Structures
Just a couple tags containing all structures not represented in a sub-tag, if someone wants to go in and make more tags to reduce the ones in here feel free, just make sure it adds up.
2024-03-29 10:54:10 +10:00
dhi_holo d1517548bd Update en_us.json
Gamerule Translation so it's not just a shitty string anymore
2024-03-29 10:09:22 +10:00
dhi_holo 3e1f9dc9b0 2 Shiny
Updated shiny icon for summary and advancement
2024-03-29 09:54:52 +10:00
FrankTheFarmerReal f0c8d08a04 Pivot fixes for Kirlia and Obstagoon 2024-03-29 09:22:20 +10:00
FrankTheFarmerReal 4fdc738b9e Updated many Pokemon walk speeds 2024-03-29 08:55:53 +10:00
miasmus fd19e65f79 move doPokemonSpawing gamerule logic 2024-03-28 16:42:42 -04:00
dhi_holo 6b10d81bc8 Update en_us.json
Capital fixes because it wasn't right
2024-03-28 23:53:56 +10:00
FrankTheFarmerReal 920c5fd01a Rowlet, Dartrix, and Parasect retextures 2024-03-28 21:46:16 +10:00
dhi_holo f3b9c03fc2 Advancement Updates
Reorgainised the advancements Healing Power, Consult the Fossil, and Free Roam: Enabled, renamed Tumbling Down to be correct, and changed the Shiny advancement to use Shiny icon.
2024-03-28 21:39:56 +10:00
FrankTheFarmerReal 7d8c8a724f Fixed some aquatic pokemon drowning 2024-03-28 19:45:28 +10:00
Veraxiel 0f5f5d4eed Changed fossil machine recipes. Updated some tags. 2024-03-28 05:37:35 -04:00
FrankTheFarmerReal 30744c42a4 Changelog: Changelog changed 2024-03-28 18:14:39 +10:00
FrankTheFarmerReal 821bb79c14 Merge remote-tracking branch 'origin/implement_pokemon' into implement_pokemon 2024-03-28 16:19:51 +10:00
FrankTheFarmerReal f5171a4a8a PNG fixes for Flygon and Archen 2024-03-28 16:19:16 +10:00
Tyzillion 061c9a1c52 Fixed Darmanitan zen crash 2024-03-28 01:15:45 -04:00
FrankTheFarmerReal da45f7d040 Fixes that just keep happening 2024-03-28 14:41:37 +10:00
Flarkinater 92653c1307 When targeting a wall, Pokemon are sent out far enough away to avoid suffocation, based on their size. Wailord rejoice! 2024-03-27 23:42:24 -04:00
Flarkinater c372114da5 Improved avoidance of unsafe locations when sending out Pokemon 2024-03-27 23:26:07 -04:00
FrankTheFarmerReal 230ab53369 Merge remote-tracking branch 'origin/implement_pokemon' into implement_pokemon
# Conflicts:
#	CHANGELOG.md
2024-03-28 11:38:38 +10:00
FrankTheFarmerReal ac43853baa Changelog updates 2024-03-28 11:36:09 +10:00
Tyzillion 0de5f82971 More fixes 2024-03-27 21:24:46 -04:00
Slippy 2b95138c46 Oh boy that's a lot of changes and fixes to structures 2024-03-27 20:02:02 -05:00
JazzMcNade 864e6be461 Corrected Old Amber Sprite 2024-03-27 19:53:10 -05:00
Tyzillion ec084cffbc AHHHHHHHHHHHHHHHH 2024-03-27 17:41:44 -04:00
Tyzillion f8ae312c0a Merge branch 'main' of https://gitlab.com/cable-mc/cobblemon into implement_pokemon 2024-03-27 17:28:34 -04:00
Tyzillion abce88fab6 Merge remote-tracking branch 'origin/implement_pokemon' into implement_pokemon 2024-03-27 17:28:21 -04:00
Apion c02fa1f85e Merge branch '1.5-Drops-and-Fixes' into 'main'
New drops and some tag/script fixes.

See merge request cable-mc/cobblemon!938
2024-03-27 20:29:11 +00:00
Apion 503b1069fd Merge branch 'MultiBlockEntityClientCrashFix' into 'main'
MultiBlockEntity Safer Casting

See merge request cable-mc/cobblemon!937
2024-03-27 20:27:01 +00:00
JazzMcNade f1d593d53c MultiBlockEntity Safer Casting 2024-03-27 20:27:01 +00:00
FrankTheFarmerReal 69fb39f148 Hisuian Typhlosion's flames are now hidden outside of battle 2024-03-27 20:44:23 +10:00
FrankTheFarmerReal 70838464d5 Litwick also wants to be shouldermountable 2024-03-27 20:14:28 +10:00
FrankTheFarmerReal 3cdb6e05c3 Kommo-o pose and model updates 2024-03-27 17:23:00 +10:00
FrankTheFarmerReal 87822bc2f7 Ralts, Roggenrola, Charcadet, and Sizzlepede are now shoulderable 2024-03-27 16:37:36 +10:00
Veraxiel 55dd486044 Updated Changelog. 2024-03-27 01:10:26 -04:00
FrankTheFarmerReal dffb944f3e Squirtle can now ride on your shoulder 2024-03-27 13:02:47 +10:00
FrankTheFarmerReal 613f3044bc Zorua and Zoroark hitbox fixes 2024-03-27 11:38:44 +10:00
FrankTheFarmerReal 342b9cb31e Fixed Dragapult height and Sliggoo's evolution not requiring rain 2024-03-27 11:23:39 +10:00
FrankTheFarmerReal 4679cfb07f -Updated UI positions and model scale of the Goomy line 2024-03-27 10:32:04 +10:00
FrankTheFarmerReal 9bb701abc8 -Updated scale values and regional data for many pokemon 2024-03-27 08:15:19 +10:00
FrankTheFarmerReal d070a7b75a -Fixed floating dragonair and T-posing sleeping Mawile 2024-03-26 20:40:24 +10:00
FrankTheFarmerReal 00a4b88437 -Model & Texture fixes for Gimmighoul, Lurantis, and Jangmo-o line
-Hisuian Samurott animation fix to prevent floating
2024-03-26 20:16:57 +10:00
FrankTheFarmerReal 005a98742e -Updated UI poses and data for several pokemon 2024-03-26 18:56:55 +10:00
FrankTheFarmerReal 94168a65f0 -Updated Walk Speed for some Pokemon 2024-03-26 16:26:20 +10:00
FrankTheFarmerReal 39d626b349 -Texture fixes for Aggron, Copperajah, Dracozolt, Gimmighoul and Lilligant 2024-03-26 14:06:45 +10:00
Hiroku 3263837137 Merge branch '1.5-Structures' into 'main'
Structure fixes and generation rate adjustments

See merge request cable-mc/cobblemon!936
2024-03-25 21:14:19 +00:00
Tyzillion db6852134c Merge remote-tracking branch 'origin/implement_pokemon' into implement_pokemon 2024-03-25 17:03:22 -04:00
Slippy a471fcd948 Increased rates for underground ruin structures, forest ruin structures and gimmi towers 2024-03-25 12:29:03 -05:00
Slippy a14bfd55d1 Jungle Fossil rates were increased 2024-03-25 12:22:25 -05:00
Slippy 725e819e89 Snow Forest structures rates were increased 2024-03-25 12:21:23 -05:00
Slippy b52b843206 Ocean fossils structures rates were increased 2024-03-25 12:20:13 -05:00
Slippy 74c65e22cb Decaying Crypt generation rates increased 2024-03-25 12:19:20 -05:00
Slippy c348520a9b Increased the generation rate for Mossy Oubliette 2024-03-25 12:15:42 -05:00
Slippy 78dd5f334a Decrease how common desert ruins are and adjusted the weights at which each will generate 2024-03-25 12:12:54 -05:00
Slippy 67318c9307 Sandy Den's were way too common. Adjusted their rates of generation 2024-03-25 12:05:17 -05:00
Slippy 31c48407df Slightly lowered the amount of sus sand in the sandy den structure 2024-03-25 11:43:45 -05:00
FrankTheFarmerReal 7170825848 -Darmanitan revamp and Krokorok texture fixes 2024-03-25 16:32:52 +10:00
Flarkinater 43da7ecece First attempt at canceling sendouts into unsafe locations (cactus, fire if the Pokemon isn't immune) 2024-03-24 23:41:22 -04:00
FrankTheFarmerReal 5b1531b894 -License Changes 2024-03-25 11:14:59 +10:00
Charzard4261 0957de86c7 Add the ability to quick move stacked PokePotion bases into Brewing Stands. 2024-03-25 00:05:19 +00:00
Slippy daae444fa9 Prehistoric Rooted Pits are more common 2024-03-23 22:51:39 -05:00
Slippy 79423ef5ee Prehistoric_Birch_Tree Fix 2024-03-23 22:13:07 -05:00
Veraxiel 6255f7dc31 Removed spawn that shouldn't be in. 2024-03-23 22:29:43 -04:00
Segfault Guy af9f1accf8 Fix Cant and Damage instructions. 2024-03-23 20:41:36 -04:00
Hiroku ff10306372 Merge branch 'GiveGimmighoulRightClick' into 'main'
Easier Gimmighoul Giving

See merge request cable-mc/cobblemon!930
2024-03-23 22:07:16 +00:00
Hiroku aaf7daa45b Merge branch 'sound' into 'main'
A lot of audio asset updates

See merge request cable-mc/cobblemon!933
2024-03-23 22:06:29 +00:00
Tyzillion 3b87846562 Merge branch 'main' of https://gitlab.com/cable-mc/cobblemon into implement_pokemon 2024-03-23 16:09:42 -04:00
Tyzillion dfd4450e11 Merge remote-tracking branch 'origin/implement_pokemon' into implement_pokemon 2024-03-23 15:18:08 -04:00
Waldleufer 7c42f8e37f Added check for minimum audio length to cry checker script [skip-ci] 2024-03-23 18:45:18 +01:00
Waldleufer ae550f78c4 Now the order of selection of input and output does not matter anymore. [skip-ci] 2024-03-23 16:19:40 +01:00
Waldleufer 66e4194a3e Made public spawn writer read Dex No. as int for consistency [skip-ci] 2024-03-23 16:04:53 +01:00
Waldleufer 12e6b76504 chore: added spawn specific drops to a bunch of cobblemon - mainly nether spawns. 2024-03-23 15:54:52 +01:00
Waldleufer 93861af71f dropping drops helps. [skip-ci] 2024-03-23 15:51:34 +01:00
Waldleufer 0c80748012 perf: script speed is over 9000! [skip-ci] 2024-03-23 15:18:30 +01:00
FrankTheFarmerReal 4060dbd596 - Fixed Wartortle, Blissey, and Hisuian Sliggo crashes
- Implemented a bunch of pokemon
- Specifically added darumaka changes
2024-03-23 23:26:53 +10:00
Waldleufer fcf832c22c more sensible script default values [skip-ci] 2024-03-23 13:17:48 +01:00
Sterrezo a065aff744 Added audio assets for fossil Pokemon cries 2024-03-23 13:04:19 +01:00
Sterrezo d77f424a83 Updated battle SFX 2024-03-23 12:49:47 +01:00
Waldleufer d5d2a2cec3 fix: improved hint for rare spreadsheet parsing bug. [skip-ci] 2024-03-23 11:55:02 +01:00
Sterrezo 036e150191 Merge branch 'main' into sound 2024-03-23 11:52:52 +01:00
Waldleufer 0bf1d84675 fix: added hint for rare spreadsheet parsing bug. [skip-ci] 2024-03-23 11:52:52 +01:00
Waldleufer b1b8e658b2 chore: updated drops data and fixed some missing form specific drops. 2024-03-23 11:42:20 +01:00
Waldleufer f984b21929 fix: Drops script now robustly handles form drops and hints at missing data in both spreadsheet and .json files [skip-ci] 2024-03-23 11:34:42 +01:00
Waldleufer 0a5193b209 perf: Increase preformance of drops script to be linear function, added dex_range option [skip-ci] 2024-03-23 10:46:59 +01:00
Veraxiel 43f1f1c30d Update to spawns to use SkyLight. 2024-03-23 04:05:56 -04:00
Waldleufer c16597ae41 chore: CHANGELOG [skip-ci] 2024-03-22 23:31:39 +01:00
Waldleufer f76e7582d2 Reworked our spawn writer script to be compatible with new UI [skip-ci] 2024-03-22 23:28:41 +01:00
Waldleufer 40761d87db Adding DexRange as input [skip-ci] 2024-03-22 20:45:19 +01:00
Waldleufer 89a9ad0bfb Refactoring the hell out of it [skip-ci] 2024-03-22 19:41:36 +01:00
Waldleufer 20291c54a5 First Version of public spawn writer script [skip-ci] 2024-03-22 19:12:13 +01:00
Islana 04b7500887 Fixes battlebuilder from sending out fainted pokemon, causing a softlock. 2024-03-22 00:45:39 -04:00
Hiroku d6fdfe6ebc Merge branch 'FetusResizing' into 'main'
Fossil Fetus Rescaling

See merge request cable-mc/cobblemon!927
2024-03-22 01:06:17 +00:00
Islana fe3d2a29b9 Fixes battlebuilder from sending out fainted pokemon, causing a softlock. 2024-03-21 20:07:41 -04:00
Lily ad81202d49 Updated the display case to allow cleaner rotations 2024-03-21 15:54:06 -04:00
Lily acbacfa8cf Fixed certain evolutions not working 2024-03-21 15:30:15 -04:00
Lily 9740267f91 Fixed a bug causing items to disappear from display cases 2024-03-21 14:28:34 -04:00
Lily fcca3b1d68 Fix armor trim name inconsistency. Closes #782 2024-03-21 14:11:32 -04:00
Nick 9f63b62651 Merge branch '1.5-Structures' into 'main'
Hi Hiro

See merge request cable-mc/cobblemon!928
2024-03-21 16:42:25 +00:00
JazzMcNade 392632b7d4 Added the ability for a player to add to Gimighoul's treasure horde by right clicking directly on a gimmighoul that they own. 2024-03-21 00:48:59 -05:00
Slippy 0d377dcbe0 Changes, fixes, and balancing of 1.5 structures 2024-03-20 22:17:13 -05:00
JazzMcNade 88c31bcb7b Scaled Archen to0.55 (from 0.8). Scaled Kabuto to 0.85 (from 0.75) 2024-03-20 19:36:27 -05:00
Waldleufer 8efea17ae6 added structure: prefix for anticonditions and conditions and refactored script [skip-ci] 2024-03-20 21:03:37 +01:00
Waldleufer cdbf569bbc feat: made spawnwriter handle new preset: tag for spawn specific drops [skip-ci] 2024-03-20 16:26:28 +01:00
Tyzillion 7dc00c3e88 Merge branch 'main' of https://gitlab.com/cable-mc/cobblemon into implement_pokemon 2024-03-19 13:19:11 -04:00
Sterrezo d000790996 Uhh some cries
Implemented cries for Scyther, Electabuzz, Lapras, Omastar, Aerodactyl.
I have to wait for the next animation push.
2024-03-19 14:12:32 +01:00
Veraxiel 0415cf8a69 Added Carnivine spawn files. 2024-03-19 04:09:58 -04:00
Sterrezo 663624c434 Implemented most Gen 1 cries for 1.5
Omitted Tangela because it's missing animation.json. Don't know how to work around that.
Script update is from a different branch, used it for implementation.
2024-03-18 16:18:02 +01:00
Sterrezo 79af092888 Merge branch 'main' into sound 2024-03-18 11:52:30 +01:00
Sterrezo 812d42a42f Merge branch 'main' into sound 2024-03-16 22:22:26 +01:00
Sterrezo 3f114706fa Implemented sounds for Revival Herb and Vivichoke. Volume adjustments.
Implemented sounds for Revival Herb and Vivichoke. Tweaked assets for Fossil Machine insert dna sounds. Adjusted volumes to Fossil Machine, Tumblestone and Coin Pouch sounds.
2024-03-16 22:21:05 +01:00
Sterrezo 9514a1d470 Fossil Machine sound updates
Updated audio assets. Moved and renamed the files for consistency. Adjusted volumes.
2024-03-12 13:31:02 +01:00
Flarkinater f99168f1c3 Pokeball items no longer drift backwards when thrown directly overhead 2024-02-24 06:33:34 -05:00
Flarkinater adce1d8838 Fixed Pokemon not appearing when sent out from shoulder 2024-02-24 05:58:35 -05:00
Flarkinater e95c82b5af Greatly improved send-out location targeting 2024-02-24 05:16:44 -05:00
Flarkinater dd273ffef2 Added beam mode for sending out Pokemon with no delay 2024-02-23 19:18:11 -05:00
Flarkinater 82548b5383 Pokémon recoil when hit by a ball 2024-02-13 22:48:27 -05:00
Flarkinater ad73202e17 Adjusted timing on breaking free animation + sound 2024-02-13 18:50:08 -05:00
Flarkinater 2965a04742 Implemented existing "break free" animation when capture fails 2024-02-12 23:02:55 -05:00
Yaseen 65aec87382 mute battle 2023-05-20 16:54:49 +01:00
Yaseen 21198eab29 more forfeit stuff 2023-05-20 16:54:14 +01:00
Yaseen c4c060cbbf Dont wait for action if one of the players has forfeited 2023-04-28 15:36:45 +01:00
Yaseen 6cf7c681d4 Merge branch 'main' into ys/forfeit 2023-04-28 00:28:30 +01:00
Yaseen c420fd4705 Attempt to add forfeit button and showdown action 2023-04-28 00:26:52 +01:00
Yaseen 1278654e9f merge main 2023-04-28 00:26:09 +01:00
2072 changed files with 159204 additions and 18029 deletions

No files matched your search

+67 -5
View File
@@ -35,6 +35,10 @@
- Added cries to Meowth, Alolan Meowth, Galaraian Meowth,
- Completed the advancement for placing a Tumblestone near Lava or Magma to make it grow.
- 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.
- Added bubble quirk to Krabby that only play during clear sunset's.
- Added forfeit option to PVP battles.
- Added visual changes for entities affected by Illusion, Imposter, or Transform in battle.
### Pokémon Added
#### Gen 2
@@ -43,8 +47,9 @@
- Qwilfish
- Heracross
- Skarmory
- Ferroseed
- Ferrothorn
- Larvitar
- Pupitar
- Tyranitar
#### Gen 3
- Lileep
@@ -53,6 +58,16 @@
- Armaldo
- Tropius
- Roselia
- Aron
- Lairon
- Aggron
- Solrock
- Lunatone
- Makuhita
- Hariyama
- Trapinch
- Vibrava
- Flygon
#### Gen 4
- Shieldon
@@ -61,6 +76,8 @@
- Rampardos
- Budew
- Roserade
- Hippopotas
- Hippowdon
#### Gen 5
- Tirtouga
@@ -87,6 +104,9 @@
- Hydreigon
- Larvesta
- Volcarona
- Alomomola
- Ferroseed
- Ferrothorn
#### Gen 6
- Tyrunt
@@ -96,6 +116,11 @@
- Goomy
- Sliggoo
- Goodra
- Carbink
- Flabébé
- Floette
- Florges
- Klefki
#### Gen 7
- Turtonator
@@ -106,6 +131,8 @@
- Jangmo-o
- Hakamo-o
- Kommo-o
- Alolan Diglett
- Alolan Dugtrio
#### Gen 8
- Gossifleur
@@ -115,6 +142,12 @@
- Dracozolt
- Dracovish
- Basculegion
- Hisuian Decidueye
- Hisuian Typhlosion
- Hisuian Samurott
- Hisuian Lilligant
- Hisuian Sliggoo
- Hisuian Goodra
- Hisuian Zorua
- Hisuian Zoroark
- Hisuian Voltorb
@@ -131,17 +164,32 @@
- Dragapult
- Hisuian Sliggoo
- Hisuian Goodra
- Impidimp
- Morgrem
- Grimmsnarl
#### Gen 9
- Gimmighoul.
- 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. Who knows what might happen if it fills up?
- Gholdengo
#### Cobblemon Exclusive's
- Hisui Bias Rowlet
- Hisui Bias Dartrix
- Hisui Bias Cyndaquil
- Hisui Bias Quilava
- Hisui Bias Oshawott
- Hisui Bias Dewott
- Hisui Bias Goomy
- Hisui Bias Petilil
### 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, Omanyte, Omastar, Growlithe, Swinub, Piloswine, Basculine, Rowlet, Dartrix, Decidueye, Kabuto, Kabutops, Piplup, Prinplup, Elekid, Electabuzz, Cubone, Marowak, Paras, Drifloon, Drifblim, Venonat, Venomoth, Yanma, Yanmega, and Raboot.
- Updated animations for Diglett, Dugtrio, Dragonite, Omanyte, Omastar, Pinsir, Falinks, Lechonk, Litwick, Lampent, Chandelure, Carnivine, Galarian Meowth, Galarian Rapidash, Venonat, Venomoth, Phanphy, Donphan, Dratini, Dragonair, Happiny, Chansey, Blissey, Volbeat, Illumise, Numel, Drifloon, and Drifblim.
- 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, 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.
- 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.
@@ -154,6 +202,14 @@
- Poké Ball recipes now use tags for their center ingredient, rather than specificied Copper Ingot, Iron Ingot, Gold Ingot, and Diamond, allowing for further datapack customisation.
- Starter Toast now closes once corresponding button is pressed once.
- Moved some items in the vanilla Food & Drinks category.
- Stacked Cobblemon Potion Bases can now be quick moved into Brewing Stands.
- Changed Healer recipe to swap the Max Revive for a Revive.
- Upped the rate that Gastly drop Ghast Tears from 2.5% to 5%.
- 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.
- Updated shiny icon within summary and PC interfaces.
### Fixes
- Resized Snorlax
@@ -171,12 +227,16 @@
- Fixed very many issues with Bedrock particle effects.
- Fixed Arbok patterns not being as specific in spawning as they were intended.
- Fixed Pokémon not avoiding danger at all when pathfinding.
- Fixed Pokémon pathing over snow layers and carpets.
- Fixed Sobble line not being able to swim or breathe underwater.
- Fixed incompatibility with [Just Enough Resources](https://modrinth.com/mod/just-enough-resources-jer).
- Fixed incompatibility with [Visual Overhaul](https://modrinth.com/mod/visual-overhaul).
- Fixed an issue that allowed Pokemon to spawn on rails.
- Fixed the data set on Pokémon when abilities are given via properties such as in ``/spawnpokemon``.
- Fixed sometimes Pokémon losing hidden abilities when evolving, this fix will only take effect to newly created Pokémon.
- Fixed capture messages not displaying.
- Fixed illusion ability causing the wrong Pokémon to be targeted in battle.
- Battles starting with fainted party members no longer cause a softlock on defeat.
### Developer
- Significantly changed the way properties in PokemonEntity work. This could break some plugins (not in a big way, but changes will be needed).
@@ -195,6 +255,8 @@
- ``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 to 2 regular abilities and 1 hidden.
- ``Pokemon#rollAbility`` has been added, this rerolls 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.
### Datapack & Resourcepack Creators
- The maximum amount of fossils that can fit in the Fossil Analyzer can be adjusted in the config.
@@ -160,7 +160,7 @@ object CobblemonBlocks : PlatformRegistry<Registry<Block>, RegistryKey<Registry<
@JvmField
val BIG_ROOT = this.create("big_root", BigRootBlock(AbstractBlock.Settings.create().pistonBehavior(PistonBehavior.DESTROY).burnable().mapColor(MapColor.DARK_GREEN).noCollision().ticksRandomly().breakInstantly().sounds(CobblemonSounds.BIG_ROOT_SOUNDS)))
@JvmField
val REVIVAL_HERB = this.create("revival_herb", RevivalHerbBlock(AbstractBlock.Settings.create().pistonBehavior(PistonBehavior.DESTROY).mapColor(MapColor.DARK_GREEN).burnable().noCollision().breakInstantly().sounds(BlockSoundGroup.CROP)))
val REVIVAL_HERB = this.create("revival_herb", RevivalHerbBlock(AbstractBlock.Settings.create().pistonBehavior(PistonBehavior.DESTROY).mapColor(MapColor.DARK_GREEN).burnable().noCollision().breakInstantly().sounds(CobblemonSounds.REVIVAL_HERB_SOUNDS)))
@JvmField
val TUMBLESTONE_CLUSTER = tumblestoneBlock("tumblestone_cluster", GrowableStoneBlock.STAGE_3, 7, 3, null)
@@ -428,7 +428,7 @@ object CobblemonBlocks : PlatformRegistry<Registry<Block>, RegistryKey<Registry<
)
@JvmField
val VIVICHOKE_SEEDS = this.create("vivichoke_seeds", VivichokeBlock(AbstractBlock.Settings.create().pistonBehavior(PistonBehavior.DESTROY).burnable().mapColor(MapColor.DARK_GREEN).noCollision().ticksRandomly().breakInstantly().sounds(BlockSoundGroup.CROP)))
val VIVICHOKE_SEEDS = this.create("vivichoke_seeds", VivichokeBlock(AbstractBlock.Settings.create().pistonBehavior(PistonBehavior.DESTROY).burnable().mapColor(MapColor.DARK_GREEN).noCollision().ticksRandomly().breakInstantly().sounds(CobblemonSounds.VIVICHOKE_SOUNDS)))
@JvmField
val PEP_UP_FLOWER = this.create("pep_up_flower", FlowerBlock(StatusEffects.LEVITATION, 10, AbstractBlock.Settings.create().mapColor(MapColor.DARK_GREEN).noCollision().breakInstantly().sounds(BlockSoundGroup.GRASS).offset(AbstractBlock.OffsetType.XZ).pistonBehavior(PistonBehavior.DESTROY)))
@JvmField
@@ -14,25 +14,7 @@ import com.cobblemon.mod.common.api.net.ServerNetworkPacketHandler
import com.cobblemon.mod.common.client.net.PlayerInteractOptionsHandler
import com.cobblemon.mod.common.client.net.SetClientPlayerDataHandler
import com.cobblemon.mod.common.client.net.animation.PlayPoseableAnimationHandler
import com.cobblemon.mod.common.client.net.battle.BattleApplyPassResponseHandler
import com.cobblemon.mod.common.client.net.battle.BattleCaptureEndHandler
import com.cobblemon.mod.common.client.net.battle.BattleCaptureShakeHandler
import com.cobblemon.mod.common.client.net.battle.BattleCaptureStartHandler
import com.cobblemon.mod.common.client.net.battle.BattleChallengeExpiredHandler
import com.cobblemon.mod.common.client.net.battle.BattleChallengeNotificationHandler
import com.cobblemon.mod.common.client.net.battle.BattleEndHandler
import com.cobblemon.mod.common.client.net.battle.BattleFaintHandler
import com.cobblemon.mod.common.client.net.battle.BattleHealthChangeHandler
import com.cobblemon.mod.common.client.net.battle.BattleInitializeHandler
import com.cobblemon.mod.common.client.net.battle.BattleMadeInvalidChoiceHandler
import com.cobblemon.mod.common.client.net.battle.BattleMakeChoiceHandler
import com.cobblemon.mod.common.client.net.battle.BattleMessageHandler
import com.cobblemon.mod.common.client.net.battle.BattleMusicHandler
import com.cobblemon.mod.common.client.net.battle.BattlePersistentStatusHandler
import com.cobblemon.mod.common.client.net.battle.BattleQueueRequestHandler
import com.cobblemon.mod.common.client.net.battle.BattleSetTeamPokemonHandler
import com.cobblemon.mod.common.client.net.battle.BattleSwitchPokemonHandler
import com.cobblemon.mod.common.client.net.battle.BattleUpdateTeamPokemonHandler
import com.cobblemon.mod.common.client.net.battle.*
import com.cobblemon.mod.common.client.net.callback.move.OpenMoveCallbackHandler
import com.cobblemon.mod.common.client.net.callback.party.OpenPartyCallbackHandler
import com.cobblemon.mod.common.client.net.callback.partymove.OpenPartyMoveCallbackHandler
@@ -305,6 +287,8 @@ object CobblemonNetwork : NetworkManager {
this.createClientBound(BattleMadeInvalidChoicePacket.ID, BattleMadeInvalidChoicePacket::decode, BattleMadeInvalidChoiceHandler)
this.createClientBound(BattleMusicPacket.ID, BattleMusicPacket::decode, BattleMusicHandler)
this.createClientBound(BattleChallengeExpiredPacket.ID, BattleChallengeExpiredPacket::decode, BattleChallengeExpiredHandler)
this.createClientBound(BattleReplacePokemonPacket.ID, BattleReplacePokemonPacket::decode, BattleReplacePokemonHandler)
this.createClientBound(BattleTransformPokemonPacket.ID, BattleTransformPokemonPacket::decode, BattleTransformPokemonHandler)
@@ -99,27 +99,27 @@ object CobblemonSounds : PlatformRegistry<Registry<SoundEvent>, RegistryKey<Regi
val MULCH_REMOVE = this.create("mulch.remove")
@JvmField
val FOSSIL_MACHINE_ACTIVATE = this.create("fossilmachine.activate")
val FOSSIL_MACHINE_ACTIVATE = this.create("fossil_machine.activate")
@JvmField
val FOSSIL_MACHINE_ACTIVE_LOOP = this.create("fossilmachine.active_loop")
val FOSSIL_MACHINE_ACTIVE_LOOP = this.create("fossil_machine.active_loop")
@JvmField
val FOSSIL_MACHINE_ASSEMBLE = this.create("fossilmachine.assemble")
val FOSSIL_MACHINE_ASSEMBLE = this.create("fossil_machine.assemble")
@JvmField
val FOSSIL_MACHINE_DNA_FULL = this.create("fossilmachine.dna_full")
val FOSSIL_MACHINE_DNA_FULL = this.create("fossil_machine.dna_full")
@JvmField
val FOSSIL_MACHINE_FINISHED = this.create("fossilmachine.finished")
val FOSSIL_MACHINE_FINISHED = this.create("fossil_machine.finished")
@JvmField
val FOSSIL_MACHINE_INSERT_DNA = this.create("fossilmachine.insert_dna")
val FOSSIL_MACHINE_INSERT_DNA = this.create("fossil_machine.insert_dna")
@JvmField
val FOSSIL_MACHINE_INSERT_DNA_SMALL = this.create("fossilmachine.insert_dna_small")
val FOSSIL_MACHINE_INSERT_DNA_SMALL = this.create("fossil_machine.insert_dna_small")
@JvmField
val FOSSIL_MACHINE_INSERT_FOSSIL = this.create("fossilmachine.insert_fossil")
val FOSSIL_MACHINE_INSERT_FOSSIL = this.create("fossil_machine.insert_fossil")
@JvmField
val FOSSIL_MACHINE_RETRIEVE_FOSSIL = this.create("fossilmachine.retrieve_fossil")
val FOSSIL_MACHINE_RETRIEVE_FOSSIL = this.create("fossil_machine.retrieve_fossil")
@JvmField
val FOSSIL_MACHINE_RETRIEVE_POKEMON = this.create("fossilmachine.retrieve_pokemon")
val FOSSIL_MACHINE_RETRIEVE_POKEMON = this.create("fossil_machine.retrieve_pokemon")
@JvmField
val FOSSIL_MACHINE_UNPROTECTED = this.create("fossilmachine.unprotected")
val FOSSIL_MACHINE_UNPROTECTED = this.create("fossil_machine.unprotected")
@JvmField
val COIN_POUCH_BREAK = this.create("coin_pouch.break")
@@ -155,11 +155,21 @@ object CobblemonSounds : PlatformRegistry<Registry<SoundEvent>, RegistryKey<Regi
@JvmField
val ENERGY_ROOT_PLACE = this.create("energy_root.place")
@JvmField
val VIVICHOKE_BREAK = this.create("vivichoke.break")
@JvmField
val VIVICHOKE_PLACE = this.create("vivichoke.place")
@JvmField
val MINT_BREAK = this.create("mint.break")
@JvmField
val MINT_PLACE = this.create("mint.place")
@JvmField
val REVIVAL_HERB_BREAK = this.create("revival_herb.break")
@JvmField
val REVIVAL_HERB_PLACE = this.create("revival_herb.place")
@JvmField
val MEDICINAL_LEEK_BREAK = this.create("medicinal_leek.break")
@JvmField
@@ -277,6 +287,15 @@ object CobblemonSounds : PlatformRegistry<Registry<SoundEvent>, RegistryKey<Regi
SoundEvents.BLOCK_GRASS_FALL
)
@JvmField
val VIVICHOKE_SOUNDS = BlockSoundGroup(1f, 1f,
VIVICHOKE_BREAK,
SoundEvents.BLOCK_GRASS_STEP,
VIVICHOKE_PLACE,
SoundEvents.BLOCK_GRASS_HIT,
SoundEvents.BLOCK_GRASS_FALL
)
@JvmField
val MINT_SOUNDS = BlockSoundGroup(1f, 1f,
MINT_BREAK,
@@ -286,6 +305,15 @@ object CobblemonSounds : PlatformRegistry<Registry<SoundEvent>, RegistryKey<Regi
SoundEvents.BLOCK_GRASS_FALL
)
@JvmField
val REVIVAL_HERB_SOUNDS = BlockSoundGroup(1f, 1f,
REVIVAL_HERB_BREAK,
SoundEvents.BLOCK_GRASS_STEP,
REVIVAL_HERB_PLACE,
SoundEvents.BLOCK_GRASS_HIT,
SoundEvents.BLOCK_GRASS_FALL
)
@JvmField
val GILDED_CHEST_SOUNDS = BlockSoundGroup(1f, 1f,
GILDED_CHEST_BREAK,
@@ -37,6 +37,7 @@ import com.cobblemon.mod.common.battles.dispatch.WaitDispatch
import com.cobblemon.mod.common.battles.interpreter.ContextManager
import com.cobblemon.mod.common.battles.pokemon.BattlePokemon
import com.cobblemon.mod.common.battles.runner.ShowdownService
import com.cobblemon.mod.common.battles.ForfeitActionResponse
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
import com.cobblemon.mod.common.net.messages.client.battle.BattleEndPacket
import com.cobblemon.mod.common.net.messages.client.battle.BattleMessagePacket
@@ -439,13 +440,24 @@ open class PokemonBattle(
}
fun checkForInputDispatch() {
val readyToInput = actors.any { !it.mustChoose && it.responses.isNotEmpty() } && actors.none { it.mustChoose }
if (checkForfeit()) return // ignore actors that are still choosing, their choices don't matter anymore
val readyToInput = (actors.any { !it.mustChoose && it.responses.isNotEmpty() } && actors.none { it.mustChoose })
if (readyToInput && captureActions.isEmpty()) {
actors.filter { it.responses.isNotEmpty() }.forEach { it.writeShowdownResponse() }
actors.forEach { it.responses.clear() ; it.request = null }
}
}
/** Forces Showdown to end the battle when a [BattleActor] chooses to forfeit. */
private fun checkForfeit(): Boolean {
val forfeit = actors.find { it.responses.any { it is ForfeitActionResponse } }
return forfeit?.let {
this.dispatchWaiting { this.broadcastChatMessage(battleLang("forfeit", it.getName()).red()) }
writeShowdownAction(">forcelose ${it.showdownId}")
true
} ?: false
}
/**
* Creates a [Text] representation of an error to interpret a battle message.
* This also logs the error, the goal of this function is to make sure users see missing interpretations and report them to us.
@@ -1,3 +1,11 @@
/*
* 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.entity.pokemon
import com.cobblemon.mod.common.api.pokemon.PokemonProperties
@@ -0,0 +1,11 @@
package com.cobblemon.mod.common.api.events
import com.cobblemon.mod.common.api.events.client.ClientSendoutEvent
import com.cobblemon.mod.common.api.reactive.CancelableObservable
import com.cobblemon.mod.common.api.reactive.SimpleObservable
@Suppress("unused")
object CobblemonClientEvents {
@JvmField
val CLIENT_SENDOUT = SimpleObservable<ClientSendoutEvent>()
}
@@ -0,0 +1,9 @@
package com.cobblemon.mod.common.api.events.client
import com.cobblemon.mod.common.api.events.Cancelable
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
import net.minecraft.client.util.math.MatrixStack
import net.minecraft.util.math.Vec3d
import org.joml.Vector3f
data class ClientSendoutEvent(var sendoutOffset: Vec3d, var startPos: Vec3d, val pokemon: PokemonEntity)
@@ -35,8 +35,8 @@ abstract class MultiblockBlock(properties: Settings) : BlockWithEntity(propertie
itemStack: ItemStack?
) {
if (world is ServerWorld) {
val multiblockEntity = world.getBlockEntity(pos) as MultiblockEntity
multiblockEntity.multiblockBuilder?.validate(world)
val multiblockEntity = world.getBlockEntity(pos) as? MultiblockEntity
multiblockEntity?.multiblockBuilder?.validate(world)
}
super.onPlaced(world, pos, state, placer, itemStack)
}
@@ -52,8 +52,8 @@ abstract class MultiblockBlock(properties: Settings) : BlockWithEntity(propertie
if(hand == Hand.OFF_HAND) {
return ActionResult.SUCCESS
}
val entity = world.getBlockEntity(pos) as MultiblockEntity
if (entity.multiblockStructure != null) {
val entity = world.getBlockEntity(pos) as MultiblockEntity?
if (entity?.multiblockStructure != null) {
return entity.multiblockStructure!!.onUse(state, world, pos, player, hand, hit)
}
return super.onUse(state, world, pos, player, hand, hit)
@@ -397,7 +397,7 @@ open class PokemonProperties {
return false
}
}
nickname?.takeIf { it != pokemon.nickname }?.let { return false }
nickname?.takeIf { it.string != pokemon.nickname?.string }?.let { return false }
form?.takeIf { !it.equals(pokemon.form.name, true) }?.let { return false }
friendship?.takeIf { it != pokemon.friendship }?.let { return false }
pokeball?.takeIf { it != pokemon.caughtBall.name.toString() }?.let { return false }
@@ -437,7 +437,7 @@ open class PokemonProperties {
}
} catch (_: InvalidIdentifierException) {}
}
nickname?.takeIf { it != properties.nickname }?.let { return false }
nickname?.takeIf { it.string != properties.nickname?.string }?.let { return false }
form?.takeIf { !it.equals(properties.form, true) }?.let { return false }
friendship?.takeIf { it != properties.friendship }?.let { return false }
pokeball?.takeIf { it != properties.pokeball }?.let { return false }
@@ -12,6 +12,8 @@ import com.cobblemon.mod.common.Cobblemon
import com.cobblemon.mod.common.api.spawning.spawner.PlayerSpawner
import com.cobblemon.mod.common.api.spawning.spawner.PlayerSpawnerFactory
import com.cobblemon.mod.common.platform.events.PlatformEvents
import com.cobblemon.mod.common.util.server
import com.cobblemon.mod.common.world.gamerules.CobblemonGameRules
import java.util.UUID
import net.minecraft.server.network.ServerPlayerEntity
@@ -34,7 +36,7 @@ object CobblemonWorldSpawnerManager : SpawnerManager() {
fun onPlayerLogin(player: ServerPlayerEntity) {
// Disables spawning
if (!Cobblemon.config.enableSpawning) {
if (!Cobblemon.config.enableSpawning || server()?.gameRules?.getBoolean(CobblemonGameRules.DO_POKEMON_SPAWNING) == false) {
return;
}
@@ -12,6 +12,8 @@ import com.cobblemon.mod.common.Cobblemon
import com.cobblemon.mod.common.api.spawning.influence.SpawningInfluence
import com.cobblemon.mod.common.api.spawning.spawner.Spawner
import com.cobblemon.mod.common.api.spawning.spawner.TickingSpawner
import com.cobblemon.mod.common.util.server
import com.cobblemon.mod.common.world.gamerules.CobblemonGameRules.DO_POKEMON_SPAWNING
/**
* A manager of various spawners. This is a class in which you should register
@@ -49,7 +51,7 @@ open class SpawnerManager {
open fun onServerTick() {
// Disables spawning
if (!Cobblemon.config.enableSpawning) {
if (!Cobblemon.config.enableSpawning || server()?.gameRules?.getBoolean(DO_POKEMON_SPAWNING) == false) {
return
}
influences.removeIf { it.isExpired() }
@@ -63,9 +63,6 @@ abstract class AreaSpawner(
override fun run(cause: SpawnCause): Pair<SpawningContext, SpawnDetail>? {
val area = getArea(cause)
if (area?.world?.gameRules?.getBoolean(DO_POKEMON_SPAWNING) == false) {
return null
}
val constrainedArea = if (area != null) constrainArea(area) else null
if (constrainedArea != null) {
@@ -100,11 +100,19 @@ object BattleBuilder {
fleeDistance: Float = Cobblemon.config.defaultFleeDistance,
party: PartyStore = player.party()
): BattleStartResult {
val playerTeam = party.toBattleTeam(clone = cloneParties, checkHealth = !healFirst, leadingPokemon = leadingPokemon)
val playerTeam = party.toBattleTeam(clone = cloneParties, checkHealth = !healFirst, leadingPokemon = leadingPokemon).sortedBy { it.health <= 0 }
val playerActor = PlayerBattleActor(player.uuid, playerTeam)
val wildActor = PokemonBattleActor(pokemonEntity.pokemon.uuid, BattlePokemon(pokemonEntity.pokemon), fleeDistance)
val errors = ErroredBattleStart()
if(playerTeam.isNotEmpty() && playerTeam[0].health <= 0){
errors.participantErrors[playerActor] += BattleStartError.insufficientPokemon(
player = player,
requiredCount = battleFormat.battleType.slotsPerActor,
hadCount = playerActor.pokemonList.size
)
}
if (playerActor.pokemonList.size < battleFormat.battleType.slotsPerActor) {
errors.participantErrors[playerActor] += BattleStartError.insufficientPokemon(
player = player,
@@ -44,10 +44,10 @@ class BattleCaptureAction(
pokeBallEntity.captureFuture.thenAccept { successful ->
if (successful) {
targetPokemon.battlePokemon?.gone = true
battle.dispatchWaiting(2F) { battle.broadcastChatMessage(lang("capture.succeeded", pokemonName).green()) }
battle.writeShowdownAction(">capture ${targetPokemon.getPNX()}")
battle.broadcastChatMessage(lang("capture.succeeded", pokemonName).green())
} else {
battle.broadcastChatMessage(lang("capture.broke_free", pokemonName).red())
battle.dispatchWaiting(2F) { battle.broadcastChatMessage(lang("capture.broke_free", pokemonName).red()) }
}
battle.sendUpdate(BattleCaptureEndPacket(targetPokemon.getPNX(), successful))
battle.finishCaptureAction(this)
@@ -95,7 +95,8 @@ enum class ShowdownActionResponseType(val loader: (PacketByteBuf) -> ShowdownAct
DEFAULT({ DefaultActionResponse() }),
FORCE_PASS({ ForcePassActionResponse() }),
PASS({ PassActionResponse }),
HEAL_ITEM({ HealItemActionResponse("potion") });
HEAL_ITEM({ HealItemActionResponse("potion") }),
FORFEIT({ ForfeitActionResponse() });
}
abstract class ShowdownActionResponse(val type: ShowdownActionResponseType) {
@@ -265,6 +266,11 @@ class BagItemActionResponse(val bagItem: BagItem, val target: BattlePokemon, val
}
}
class ForfeitActionResponse : ShowdownActionResponse(ShowdownActionResponseType.FORFEIT) {
override fun isValid(activeBattlePokemon: ActiveBattlePokemon, showdownMoveSet: ShowdownMoveset?, forceSwitch: Boolean) = true
override fun toShowdownString(activeBattlePokemon: ActiveBattlePokemon, showdownMoveSet: ShowdownMoveset?) = "forfeit"
}
class ShowdownMoveset {
lateinit var moves: List<InBattleMove>
var trapped = false
@@ -56,7 +56,7 @@ object ShowdownInterpreter {
}
listOf(
"player", "teamsize", "gametype", "gen", "tier", "rated", "clearpoke", "poke", "teampreview", "start", "rule", "t:", ""
"player", "teamsize", "gametype", "gen", "tier", "rated", "clearpoke", "poke", "teampreview", "start", "rule", "t:", "", "capture"
).forEach { updateInstructionParser[it] = { _, _, _, _ -> IgnoredInstruction() } }
updateInstructionParser["-ability"] = { _, instructionSet, message, _ -> AbilityInstruction(instructionSet, message) }
@@ -64,7 +64,7 @@ object ShowdownInterpreter {
updateInstructionParser["bagitem"] = { _, _, message, _ -> BagItemInstruction(message) }
updateInstructionParser["-boost"] = { _, instructionSet, message, remainingLines -> BoostInstruction(instructionSet, message, remainingLines, true) }
updateInstructionParser["-block"] = { _, _, message, _ -> BlockInstruction(message) }
updateInstructionParser["-cant"] = { _, _, message, _ -> CantInstruction(message) }
updateInstructionParser["cant"] = { _, _, message, _ -> CantInstruction(message) }
updateInstructionParser["-clearallboost"] = { _, _, message, _ -> ClearAllBoostInstruction(message) }
updateInstructionParser["-clearnegativeboost"] = { _, _, message, _ -> ClearNegativeBoostInstruction(message) }
updateInstructionParser["-copyboost"] = { _, _, message, _ -> CopyBoostInstruction(message) }
@@ -88,7 +88,7 @@ object ShowdownInterpreter {
updateInstructionParser["move"] = { _, instructionSet, message, _ -> MoveInstruction(instructionSet, message) }
updateInstructionParser["-nothing"] = { _, _, _, _ -> NothingInstruction() }
updateInstructionParser["pp_update"] = { _, _, message, _ -> PpUpdateInstruction(message) }
updateInstructionParser["-prepare"] = { _, _, message, _ -> RechargeInstruction(message) }
updateInstructionParser["-prepare"] = { _, _, message, _ -> PrepareInstruction(message) }
updateInstructionParser["-mustrecharge"] = { _, _, message, _ -> RechargeInstruction(message) }
updateInstructionParser["replace"] = { _, _, message, _ -> ReplaceInstruction(message) }
updateInstructionParser["-resisted"] = { _, _, message, _ -> ResistedInstruction(message) }
@@ -104,7 +104,7 @@ object ShowdownInterpreter {
updateInstructionParser["-swapboost"] = { _, _, message, _ -> SwapBoostInstruction(message) }
updateInstructionParser["-swapsideconditions"] = { _, _, message, _ -> SwapSideConditionsInstruction(message) }
updateInstructionParser["-terastallize"] = { _, _, message, _ -> TerastallizeInstruction(message) }
updateInstructionParser["-transform"] = { _, _, message, _ -> TransformInstruction(message) }
updateInstructionParser["-transform"] = { battle, _, message, _ -> TransformInstruction(battle, message) }
updateInstructionParser["turn"] = { _, _, message, _ -> TurnInstruction(message) }
updateInstructionParser["-unboost"] = { _, instructionSet, message, remainingLines -> BoostInstruction(instructionSet, message, remainingLines, false) }
updateInstructionParser["upkeep"] = { _, _, _, _ -> UpkeepInstruction() }
@@ -128,9 +128,9 @@ object ShowdownInterpreter {
splitInstructionParser["-sethp"] = { _, targetActor, _, publicMessage, privateMessage, _ ->
SetHpInstruction(targetActor, publicMessage, privateMessage)
}
splitInstructionParser["switch"] = { _, targetActor, instructionSet, publicMessage, privateMessage, _ ->
splitInstructionParser["switch"] = { _, targetActor, instructionSet, publicMessage, privateMessage, _ ->
SwitchInstruction(instructionSet, targetActor, publicMessage, privateMessage)
}
}
// Note '-cureteam' is a legacy thing that is only used in generation 2 and 4 mods for heal bell and aromatherapy respectively as such we can just ignore that
}
@@ -199,15 +199,15 @@ object ShowdownInterpreter {
}
}
fun broadcastOptionalAbility(battle: PokemonBattle, effect: Effect?, pokemonName: MutableText) {
fun broadcastOptionalAbility(battle: PokemonBattle, effect: Effect?, pokemon: BattlePokemon) {
if (effect != null && effect.type == Effect.Type.ABILITY)
broadcastAbility(battle, effect, pokemonName)
broadcastAbility(battle, effect, pokemon)
}
// Broadcasts a generic lang to notify players of ability activations (effects are broadcasted separately)
fun broadcastAbility(battle: PokemonBattle, effect: Effect, pokemonName: MutableText) {
fun broadcastAbility(battle: PokemonBattle, effect: Effect, pokemon: BattlePokemon) {
battle.dispatchGo {
val lang = battleLang("ability.generic", pokemonName, effect.typelessData).yellow()
val lang = battleLang("ability.generic", pokemon.getName(), effect.typelessData).yellow()
battle.broadcastChatMessage(lang)
}
}
@@ -27,25 +27,21 @@ import com.cobblemon.mod.common.util.battleLang
*
* POKEMON has just switched-in, and its ABILITY is being announced to have a long-term effect.
* @author Xylopia
* @since January 31, 2023
* @since January 31st, 2023
*/
class AbilityInstruction(val instructionSet: InstructionSet, val message: BattleMessage) : InterpreterInstruction, CauserInstruction {
override fun invoke(battle: PokemonBattle) {
val pokemon = message.battlePokemon(0, battle) ?: return
val pokemonName = pokemon.getName()
val effect = message.effectAt(1) ?: return
val optionalEffect = message.effect()
val optionalPokemon = message.battlePokemonFromOptional(battle)
val optionalPokemonName = optionalPokemon?.getName()
// If there is an optional effect causing the activation, broadcast that instead of the standard effect
if (optionalEffect != null) {
ShowdownInterpreter.broadcastAbility(battle, optionalEffect, pokemonName)
} else {
ShowdownInterpreter.broadcastAbility(battle, effect, pokemonName)
}
ShowdownInterpreter.broadcastAbility(battle, optionalEffect ?: effect, pokemon)
battle.dispatch {
val pokemonName = pokemon.getName()
val optionalPokemonName = optionalPokemon?.getName()
ShowdownInterpreter.lastCauser[battle.battleId] = message
val lang = when (optionalEffect?.id) {
@@ -26,18 +26,18 @@ import net.minecraft.text.Text
* by one of the other minor messages.
*
* @author Hunter
* @since September 25, 2022
* @since September 25th, 2022
*/
class ActivateInstruction(val instructionSet: InstructionSet, val message: BattleMessage) : InterpreterInstruction, CauserInstruction {
override fun invoke(battle: PokemonBattle) {
val pokemon = message.battlePokemon(0, battle) ?: return
val pokemonName = pokemon.getName()
val sourceName = message.battlePokemonFromOptional(battle)?.getName() ?: Text.literal("UNKNOWN")
val effect = message.effectAt(1) ?: return
val extraEffect = message.effectAt(2)?.typelessData ?: Text.literal("UNKNOWN")
ShowdownInterpreter.broadcastOptionalAbility(battle, effect, pokemonName)
ShowdownInterpreter.broadcastOptionalAbility(battle, effect, pokemon)
battle.dispatch{
val pokemonName = pokemon.getName()
val sourceName = message.battlePokemonFromOptional(battle)?.getName() ?: Text.literal("UNKNOWN")
ShowdownInterpreter.lastCauser[battle.battleId] = message
battle.minorBattleActions[pokemon.uuid] = message
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleMessage
@@ -11,7 +19,7 @@ import com.cobblemon.mod.common.util.battleLang
*
* POKEMON had ITEM used on it from the 'bag'.
* @author landonjw
* @since July 31, 2023
* @since July 31st, 2023
*/
class BagItemInstruction(val message: BattleMessage): InterpreterInstruction {
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleMessage
@@ -12,7 +20,7 @@ import com.cobblemon.mod.common.util.battleLang
*
* An optional SOURCE will note the owner of the EFFECT, in the case that it's not EFFECT (for instance, an ally with Aroma Veil.)
* @author jeffw773
* @since November 6, 2023
* @since November 6th, 2023
*/
class BlockInstruction(val message: BattleMessage): InterpreterInstruction {
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleContext
@@ -15,7 +23,7 @@ import com.cobblemon.mod.common.util.battleLang
* POKEMON has gained or lost AMOUNT in STAT, using the standard rules for stat changes in-battle.
* STAT is a standard three-letter abbreviation fot the stat in question.
* @author Hiroku
* @since August 20, 2022
* @since August 20th, 2022
*/
class BoostInstruction(val instructionSet: InstructionSet, val message: BattleMessage, val remainingLines: Iterator<BattleMessage>, val isBoost: Boolean = true): InterpreterInstruction {
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleMessage
@@ -14,7 +22,7 @@ import com.cobblemon.mod.common.util.lang
*
* The POKEMON could not perform a move because of the indicated REASON.
* @author Deltric
* @since January 22, 2022
* @since January 22nd, 2022
*/
class CantInstruction(val message: BattleMessage): InterpreterInstruction {
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleContext
@@ -11,7 +19,7 @@ import com.cobblemon.mod.common.util.battleLang
*
* Clears all boosts from all Pokémon on both sides.
* @author Segfault Guy
* @since April 26, 2023
* @since April 26th, 2023
*/
class ClearAllBoostInstruction(val message: BattleMessage): InterpreterInstruction {
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleContext
@@ -11,14 +19,15 @@ import com.cobblemon.mod.common.util.battleLang
*
* Clear the negative boosts from the target POKEMON (usually as the result of a zeffect).
* @author Segfault Guy
* @since September 10, 2023
* @since September 10th, 2023
*/
class ClearNegativeBoostInstruction(val message: BattleMessage): InterpreterInstruction {
override fun invoke(battle: PokemonBattle) {
val battlePokemon = message.battlePokemon(0, battle) ?: return
val pokemonName = battlePokemon.getName()
battle.dispatchWaiting(1.5F) {
val pokemonName = battlePokemon.getName()
val lang = when {
message.hasOptionalArgument("zeffect") -> battleLang("clearallnegativeboost.zeffect", pokemonName)
else -> battleLang("clearallnegativeboost", pokemonName)
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleContext
@@ -11,7 +19,7 @@ import com.cobblemon.mod.common.util.battleLang
*
* Copies any stat changes from the TARGET Pokémon to the SOURCE Pokémon due to EFFECT.
* @author JMMCP
* @since November 27, 2023
* @since November 27th, 2023
*/
class CopyBoostInstruction(val message: BattleMessage): InterpreterInstruction {
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleMessage
@@ -13,7 +21,7 @@ import com.cobblemon.mod.common.util.battleLang
*
* POKEMON received a critical hit.
* @author Hunter
* @since August 18, 2022
* @since August 18th, 2022
*/
class CritInstruction(val message: BattleMessage): InterpreterInstruction {
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleContext
@@ -16,7 +24,7 @@ import com.cobblemon.mod.common.util.battleLang
*
* The POKEMON has recovered from its STATUS.
* @author Hiroku
* @since November 5, 2022
* @since November 5th, 2022
*/
class CureStatusInstruction(val message: BattleMessage): InterpreterInstruction {
@@ -24,12 +32,12 @@ class CureStatusInstruction(val message: BattleMessage): InterpreterInstruction
val maybeActivePokemon = message.actorAndActivePokemon(0, battle)?.second?.battlePokemon
val maybePartyPokemon = message.battlePokemon(0, battle)
val pokemon = maybeActivePokemon ?: maybePartyPokemon ?: return
val pokemonName = pokemon.getName()
val status = message.argumentAt(1)?.let(Statuses::getStatus) ?: return
val effect = message.effect()
ShowdownInterpreter.broadcastOptionalAbility(battle, effect, pokemonName)
ShowdownInterpreter.broadcastOptionalAbility(battle, effect, pokemon)
battle.dispatchWaiting {
val pokemonName = pokemon.getName()
pokemon.effectedPokemon.status = null
pokemon.sendUpdate()
@@ -36,7 +36,7 @@ import net.minecraft.text.Text
*
* POKEMON has taken damage and is now at HP STATUS
* @author Hiroku
* @since March 11, 2022
* @since March 11th, 2022
*/
class DamageInstruction(
val instructionSet: InstructionSet,
@@ -66,8 +66,7 @@ class DamageInstruction(
}
val newHealth = privateMessage.argumentAt(1)?.split(" ")?.get(0) ?: return
val effect = privateMessage.effect()
val pokemonName = battlePokemon.getName()
val sourceName = privateMessage.battlePokemonFromOptional(battle)?.getName() ?: Text.literal("UNKNOWN")
val source = privateMessage.battlePokemonFromOptional(battle)
var causedFaint = newHealth == "0"
battle.dispatch {
@@ -78,7 +77,10 @@ class DamageInstruction(
}
}
source?.let { ShowdownInterpreter.broadcastOptionalAbility(battle, effect, it) }
battle.dispatch {
val pokemonName = battlePokemon.getName()
val pokemonEntity = battlePokemon.entity
if (!causedFaint && pokemonEntity != null) {
val pkt = PlayPoseableAnimationPacket(pokemonEntity.id, setOf("recoil"), emptySet())
@@ -101,8 +103,6 @@ class DamageInstruction(
)
}
ShowdownInterpreter.broadcastOptionalAbility(battle, effect, sourceName)
val newHealthRatio: Float
val remainingHealth = newHealth.split("/")[0].toInt()
@@ -116,7 +116,7 @@ class DamageInstruction(
"aftermath" -> battleLang("damage.generic", pokemonName)
"chloroblast", "steelbeam" -> battleLang("damage.mindblown", pokemonName)
"jumpkick" -> battleLang("damage.highjumpkick", pokemonName)
else -> battleLang("damage.${effect.id}", pokemonName, sourceName)
else -> battleLang("damage.${effect.id}", pokemonName, source?.getName() ?: Text.literal("UNKOWN"))
}
battle.broadcastChatMessage(lang.red())
}
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleMessage
@@ -10,15 +18,15 @@ import com.cobblemon.mod.common.util.battleLang
*
* POKEMON has changed formes permanently (i.e. Mega Evolution) to DETAILS.
* @author Segfault Guy
* @since September 10, 2023
* @since September 10th, 2023
*/
class DetailsChangeInstruction(val message: BattleMessage): InterpreterInstruction {
override fun invoke(battle: PokemonBattle) {
val battlePokemon = message.battlePokemon(0, battle) ?: return
val pokemonName = battlePokemon.getName()
val formName = message.argumentAt(1)?.split(',')?.get(0)?.substringAfter('-')?.lowercase() ?: return
battle.dispatchWaiting {
val pokemonName = battlePokemon.getName()
battle.broadcastChatMessage(battleLang("detailschange.$formName", pokemonName))
battle.majorBattleActions[battlePokemon.uuid] = message
}
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleContext
@@ -16,7 +24,8 @@ import com.cobblemon.mod.common.util.battleLang
* POKEMON has switched in (if there was an old Pokémon in that position, it is switched out).
* POKEMON|DETAILS represents all the information that can be used to tell Pokémon apart.
* The switched Pokémon has HP health points and STATUS status.
* @author
* @author Hiroku
* @since April 24th, 2022
*/
class DragInstruction(val instructionSet: InstructionSet, val battleActor: BattleActor, val publicMessage: BattleMessage, val privateMessage: BattleMessage): InterpreterInstruction {
override fun invoke(battle: PokemonBattle) {
@@ -24,6 +33,7 @@ class DragInstruction(val instructionSet: InstructionSet, val battleActor: Battl
val (pnx, _) = publicMessage.pnxAndUuid(0)!!
val (_, activePokemon) = battle.getActorAndActiveSlotFromPNX(pnx)
val imposter = instructionSet.getNextInstruction<TransformInstruction>(this)?.expectedTarget != null
val illusion = publicMessage.battlePokemonFromOptional(battle , "is")
val pokemon = publicMessage.battlePokemon(0, battle) ?: return@dispatchInsert emptySet()
@@ -36,13 +46,13 @@ class DragInstruction(val instructionSet: InstructionSet, val battleActor: Battl
val entity = if (battleActor is EntityBackedBattleActor<*>) battleActor.entity else null
setOf(
BattleDispatch {
if (entity != null) {
SwitchInstruction.createEntitySwitch(battle, battleActor, entity, pnx, activePokemon, pokemon, illusion)
} else {
SwitchInstruction.createNonEntitySwitch(battle, battleActor, pnx, activePokemon, pokemon, illusion)
}
BattleDispatch {
if (entity != null) {
SwitchInstruction.createEntitySwitch(battle, battleActor, entity, pnx, activePokemon, pokemon, illusion, imposter)
} else {
SwitchInstruction.createNonEntitySwitch(battle, battleActor, pnx, activePokemon, pokemon, illusion)
}
}
)
}
}
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleMessage
@@ -10,7 +18,7 @@ import com.cobblemon.mod.common.util.battleLang
*
* The POKEMON's Ability was suppressed.
* @author jeffw773
* @since November 28, 2023
* @since November 28th, 2023
*/
class EndAbilityInstruction(val message: BattleMessage): InterpreterInstruction {
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleContext
@@ -13,7 +21,7 @@ import com.cobblemon.mod.common.util.lang
*
* The volatile status from EFFECT inflicted on POKEMON has ended.
* @author Hiroku
* @since October 3, 2022
* @since October 3rd, 2022
*/
class EndInstruction(val message: BattleMessage): InterpreterInstruction {
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.CobblemonSounds
@@ -17,7 +25,7 @@ import com.cobblemon.mod.common.util.battleLang
*
* POKEMON's ITEM has destroyed itself (consumed or used).
* @author Licious
* @since December 30, 2022
* @since December 30th, 2022
*/
class EndItemInstruction(val message: BattleMessage): InterpreterInstruction {
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleMessage
@@ -13,7 +21,7 @@ import com.cobblemon.mod.common.util.battleLang
*
* The actor needs to send a different decision due to ERROR.
* @author Yaseen
* @since April 22, 2023
* @since April 22nd, 2023
*/
class ErrorInstruction(val battleActor: BattleActor, val message: BattleMessage): InterpreterInstruction {
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleMessage
@@ -12,7 +20,7 @@ import com.cobblemon.mod.common.util.battleLang
*
* ACTION has failed against POKEMON.
* @author Hunter
* @since September 25, 2022
* @since September 25th, 2022
*/
class FailInstruction(val message: BattleMessage): InterpreterInstruction {
@@ -24,14 +24,13 @@ import com.cobblemon.mod.common.util.battleLang
*
* POKEMON has fainted.
* @author Deltric
* @since January 22, 2022
* @since January 22nd, 2022
*/
class FaintInstruction(battle: PokemonBattle, val message: BattleMessage) : InterpreterInstruction {
var waitTime = 2.5F
val faintingPokemon = message.battlePokemon(0, battle)!!
override fun invoke(battle: PokemonBattle) {
val faintMessage = battleLang("fainted", faintingPokemon.getName()).red()
battle.dispatchWaiting(waitTime) {
val (pnx, _) = message.pnxAndUuid(0) ?: return@dispatchWaiting
@@ -46,7 +45,8 @@ class FaintInstruction(battle: PokemonBattle, val message: BattleMessage) : Inte
faintingPokemon.contextManager.clear(BattleContext.Type.STATUS, BattleContext.Type.VOLATILE, BattleContext.Type.BOOST, BattleContext.Type.UNBOOST)
battle.majorBattleActions[faintingPokemon.uuid] = message
}
battle.dispatchGo {
battle.dispatchWaiting(0.5F) {
val faintMessage = battleLang("fainted", faintingPokemon.getName()).red()
battle.broadcastChatMessage(faintMessage)
}
}
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleContext
@@ -14,7 +22,7 @@ import com.cobblemon.mod.common.util.battleLang
*
* A miscellaneous EFFECT has activated for the entire field.
* @author Segfault Guy
* @since April 5, 2023
* @since April 5th, 2023
*/
class FieldActivateInstruction(val message: BattleMessage): InterpreterInstruction {
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleContext
@@ -14,7 +22,7 @@ import com.cobblemon.mod.common.util.battleLang
*
* The field CONDITION has ended.
* @author Licious
* @since February 8, 2023
* @since February 8th, 2023
*/
class FieldEndInstruction(val message: BattleMessage): InterpreterInstruction {
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleContext
@@ -13,18 +21,18 @@ import net.minecraft.text.Text
*
* The field CONDITION has started.
* @author Xylopia
* @since January 31, 2023
* @since January 31st, 2023
*/
class FieldStartInstruction(val message: BattleMessage): InterpreterInstruction {
override fun invoke(battle: PokemonBattle) {
val effect = message.effectAt(0) ?: return
val user = message.battlePokemonFromOptional(battle)?.getName() ?: Text.literal("UNKNOWN")
ShowdownInterpreter.broadcastOptionalAbility(battle, effect, user)
val user = message.battlePokemonFromOptional(battle)
user?.let { ShowdownInterpreter.broadcastOptionalAbility(battle, effect, user) }
battle.dispatchWaiting(1.5F) {
// Note persistent is a CAP ability only we can ignore the flag
val lang = battleLang("fieldstart.${effect.id}", user)
val lang = battleLang("fieldstart.${effect.id}", user?.getName() ?: Text.literal("UNKNOWN"))
battle.broadcastChatMessage(lang)
val type = BattleContext.Type.valueOf(effect.rawData.substringAfterLast(" ").uppercase())
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleMessage
@@ -19,7 +27,7 @@ import com.cobblemon.mod.common.util.battleLang
*
* POKEMON has healed damage and is now at HP STATUS.
* @author Licious
* @since February 6, 2023
* @since February 6th, 2023
*/
class HealInstruction(val actor: BattleActor, val publicMessage: BattleMessage, val privateMessage: BattleMessage): InterpreterInstruction {
@@ -31,8 +39,7 @@ class HealInstruction(val actor: BattleActor, val publicMessage: BattleMessage,
val newHealth = rawHpRatio.split("/").map { it.toFloatOrNull() ?: return }
val newHealthRatio = rawHpRatio.split("/").map { it.toFloatOrNull()?.div(newHealth[1]) ?: return }
val effect = privateMessage.effect()
val pokemonName = battlePokemon.getName()
ShowdownInterpreter.broadcastOptionalAbility(battle, effect, pokemonName)
ShowdownInterpreter.broadcastOptionalAbility(battle, effect, battlePokemon)
battle.dispatchWaiting {
if (pnx != null) {
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleMessage
@@ -10,7 +18,7 @@ import com.cobblemon.mod.common.util.battleLang
*
* A multi-hit move hit the POKEMON NUM times.
* @author Licious
* @since December 30, 2022
* @since December 30th, 2022
*/
class HitCountInstruction(val message: BattleMessage): InterpreterInstruction {
@@ -15,7 +15,7 @@ import com.cobblemon.mod.common.battles.dispatch.InterpreterInstruction
* Catch-all for instruction from Showdown that are not parsed.
*
* @author Hiroku
* @since December 25, 2023
* @since December 25th, 2023
*/
class IgnoredInstruction : InterpreterInstruction {
override fun invoke(pokemonBattle: PokemonBattle) = Unit
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleMessage
@@ -11,7 +19,7 @@ import com.cobblemon.mod.common.util.battleLang
*
* POKEMON was immune to a move.
* @author Hiroku
* @since October 3, 2022
* @since October 3rd, 2022
*/
class ImmuneInstruction(val message: BattleMessage): InterpreterInstruction {
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BasicContext
@@ -13,7 +21,7 @@ import com.cobblemon.mod.common.util.battleLang
*
* POKEMON had its stat changes inverted.
* @author JMMCP
* @since November 26, 2023
* @since November 26th, 2023
*/
class InvertBoostInstruction(val message: BattleMessage): InterpreterInstruction {
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleContext
@@ -16,13 +24,13 @@ import net.minecraft.text.Text
*
* POKEMON has just switched in, and its ITEM is being announced to have a long-term effect.
* @author Licious
* @since December 30, 2022
* @since December 30th, 2022
*/
class ItemInstruction(val message: BattleMessage): InterpreterInstruction {
override fun invoke(battle: PokemonBattle) {
val sourceName = message.battlePokemonFromOptional(battle)?.getName() ?: Text.literal("UNKOWN")
ShowdownInterpreter.broadcastOptionalAbility(battle, message.effect(), sourceName)
val source = message.battlePokemonFromOptional(battle)
source?.let { ShowdownInterpreter.broadcastOptionalAbility(battle, message.effect(), source) }
battle.dispatchGo {
val battlePokemon = message.battlePokemon(0, battle) ?: return@dispatchGo
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleMessage
@@ -11,14 +19,14 @@ import com.cobblemon.mod.common.util.battleLang
*
* POKEMON used item MEGASTONE to Mega Evolve.
* @author Segfault Guy
* @since September 10, 2023
* @since September 10th, 2023
*/
class MegaInstruction(val message: BattleMessage): InterpreterInstruction {
override fun invoke(battle: PokemonBattle) {
val battlePokemon = message.battlePokemon(0, battle) ?: return
val pokemonName = battlePokemon.getName()
battle.dispatchWaiting {
val pokemonName = battlePokemon.getName()
battle.broadcastChatMessage(battleLang("mega", pokemonName).yellow())
battle.minorBattleActions[battlePokemon.uuid] = message
}
@@ -19,7 +19,7 @@ import com.cobblemon.mod.common.util.battleLang
*
* The move used by the SOURCE Pokémon missed (maybe absent) the TARGET Pokémon.
* @author Hiroku
* @since October 3, 2022
* @since October 3rd, 2022
*/
class MissInstruction(val battle: PokemonBattle, val message: BattleMessage): InterpreterInstruction {
val target = message.battlePokemon(1, battle)
@@ -36,7 +36,7 @@ import java.util.concurrent.CompletableFuture
*
* POKEMON has used MOVE at TARGET.
* @author Deltric
* @since January 22, 2022
* @since January 22nd, 2022
*/
class MoveInstruction(
val instructionSet: InstructionSet,
@@ -58,12 +58,12 @@ class MoveInstruction(
val targetPokemon = targetPokemon // So smart non-null casts can happen
val optionalEffect = message.effect()
val pokemonName = userPokemon.getName()
ShowdownInterpreter.broadcastOptionalAbility(battle, optionalEffect, pokemonName)
ShowdownInterpreter.broadcastOptionalAbility(battle, optionalEffect, userPokemon)
battle.dispatch { UntilDispatch { instructionSet.getMostRecentInstruction<MoveInstruction>(this)?.future?.isDone != false } }
battle.dispatch {
val pokemonName = userPokemon.getName()
ShowdownInterpreter.lastCauser[battle.battleId] = message
userPokemon.effectedPokemon.let { pokemon ->
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.model.PokemonBattle
@@ -9,7 +17,7 @@ import com.cobblemon.mod.common.util.battleLang
*
* Pathetic. Your move did absolutely nothing. You should feel bad for being bad.
* @author Hiroku
* @since August 20, 2022
* @since August 20th, 2022
*/
class NothingInstruction() : InterpreterInstruction {
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleMessage
@@ -9,7 +17,7 @@ import com.cobblemon.mod.common.battles.dispatch.InterpreterInstruction
* Format: |pp_update|<side_id>: <pokemon_uuid>|...<move_id>: <move_pp>
*
* @author Licious
* @since September 22, 2022
* @since September 22nd, 2022
*/
class PpUpdateInstruction( val message: BattleMessage): InterpreterInstruction {
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleMessage
@@ -10,7 +18,7 @@ import com.cobblemon.mod.common.util.battleLang
*
* ATTACKER Pokémon is preparing to use a charge MOVE on DEFENDER or an unknown target.
* @author Renaissance
* @since March 24, 2023
* @since March 24th, 2023
*/
class PrepareInstruction(val message: BattleMessage): InterpreterInstruction {
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleMessage
@@ -10,7 +18,7 @@ import com.cobblemon.mod.common.util.battleLang
*
* POKEMON must spend the turn recharging from a previous move.
* @author Hunter
* @since September 25, 2022
* @since September 25th, 2022
*/
class RechargeInstruction(val message: BattleMessage): InterpreterInstruction {
@@ -1,9 +1,19 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleMessage
import com.cobblemon.mod.common.api.battles.model.PokemonBattle
import com.cobblemon.mod.common.api.text.yellow
import com.cobblemon.mod.common.battles.dispatch.InterpreterInstruction
import com.cobblemon.mod.common.net.messages.client.battle.BattleReplacePokemonPacket
import com.cobblemon.mod.common.net.messages.client.battle.BattleTransformPokemonPacket
import com.cobblemon.mod.common.util.battleLang
/**
@@ -16,10 +26,23 @@ import com.cobblemon.mod.common.util.battleLang
class ReplaceInstruction(val message: BattleMessage): InterpreterInstruction {
override fun invoke(battle: PokemonBattle) {
battle.dispatchWaiting(1F) {
val pokemon = message.battlePokemon(0, battle) ?: return@dispatchWaiting
val (pnx, _) = message.pnxAndUuid(0) ?: return
val (actor, activePokemon) = battle.getActorAndActiveSlotFromPNX(pnx)
val pokemon = message.battlePokemon(0, battle) ?: return
battle.dispatchGo {
val entity = pokemon.entity
entity?.let { it.effects.mockEffect?.end(it) }
battle.sendSidedUpdate(
source = actor,
allyPacket = BattleReplacePokemonPacket(pnx, pokemon, true),
opponentPacket = BattleReplacePokemonPacket(pnx, pokemon, false)
)
activePokemon.illusion = null
//lang done by EndInstruction
}
}
}
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleMessage
@@ -14,7 +22,7 @@ import com.cobblemon.mod.common.net.messages.client.battle.BattleQueueRequestPac
*
* It's time for the actor to make a decision.
* @author Deltric
* @since January 22, 2022
* @since January 22nd, 2022
*/
class RequestInstruction(val battleActor: BattleActor, val message: BattleMessage): InterpreterInstruction {
override fun invoke(battle: PokemonBattle) {
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleMessage
@@ -9,8 +17,8 @@ import com.cobblemon.mod.common.util.battleLang
* Format: |-resisted|POKEMON
*
* POKEMON resisted the attack.
* @author
* @since
* @author Hunter
* @since August 18th, 2022
*/
class ResistedInstruction(val message: BattleMessage): InterpreterInstruction {
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleContext
@@ -12,7 +20,7 @@ import com.cobblemon.mod.common.util.battleLang
*
* Same as -boost and -unboost, but STAT is set to AMOUNT instead of boosted by AMOUNT.\
* @author Renaissance
* @since February 16, 2023
* @since February 16th, 2023
*/
class SetBoostInstruction(val message: BattleMessage): InterpreterInstruction {
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleMessage
@@ -13,7 +21,7 @@ import kotlin.math.roundToInt
*
* POKEMON now has HP hit points.
* @author Licious
* @since February 8, 2023
* @since February 8th, 2023
*/
class SetHpInstruction(val actor: BattleActor, val publicMessage: BattleMessage, val privateMessage: BattleMessage): InterpreterInstruction {
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleContext
@@ -11,7 +19,7 @@ import com.cobblemon.mod.common.util.battleLang
*
* Indicates that the side CONDITION ended for the given SIDE.
* @author Segfault Guy
* @since April 5, 2023
* @since April 5th, 2023
*/
class SideEndInstruction(val message: BattleMessage): InterpreterInstruction {
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleContext
@@ -12,7 +20,7 @@ import com.cobblemon.mod.common.util.battleLang
*
* A side CONDITION has started on SIDE.
* @author Segfault Guy
* @since April 5, 2023
* @since April 5th, 2023
*/
class SideStartInstruction(val message: BattleMessage): InterpreterInstruction {
@@ -1,17 +0,0 @@
package com.cobblemon.mod.common.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleMessage
import com.cobblemon.mod.common.api.battles.model.PokemonBattle
import com.cobblemon.mod.common.api.text.yellow
import com.cobblemon.mod.common.api.types.ElementalTypes
import com.cobblemon.mod.common.battles.dispatch.InstructionSet
import com.cobblemon.mod.common.battles.dispatch.InterpreterInstruction
import com.cobblemon.mod.common.util.battleLang
/** Placeholder for instructions that only */
class SilentInstruction(val instructionSet: InstructionSet, val message: BattleMessage): InterpreterInstruction {
override fun invoke(battle: PokemonBattle) {
battle.dispatchGo { }
}
}
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleMessage
@@ -10,7 +18,7 @@ import com.cobblemon.mod.common.util.battleLang
*
* POKEMON used MOVE which causes a temporary effect lasting the duration of the move.
* @author Renaissance
* @since March 24, 2023
* @since March 24th, 2023
*/
class SingleMoveInstruction(val message: BattleMessage): InterpreterInstruction {
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleMessage
@@ -11,7 +19,7 @@ import net.minecraft.text.Text
*
* POKEMON used MOVE which causes a temporary effect lasting the duration of the turn.
* @author Renaissance
* @since March 24, 2023
* @since March 24th, 2023
*/
class SingleTurnInstruction(val message: BattleMessage): InterpreterInstruction {
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleContext
@@ -16,7 +24,7 @@ import net.minecraft.text.Text
*
* A volatile status has been inflicted on POKEMON by EFFECT.
* @author Deltric
* @since January 21, 2022
* @since January 21st, 2022
*/
class StartInstruction(val message: BattleMessage): InterpreterInstruction {
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.Cobblemon
@@ -16,7 +24,7 @@ import com.cobblemon.mod.common.util.asTranslated
*
* POKEMON has been inflicted with STATUS.
* @author Hiroku
* @since October 3, 2022
* @since October 3rd, 2022
*/
class StatusInstruction( val message: BattleMessage): InterpreterInstruction {
@@ -26,10 +34,8 @@ class StatusInstruction( val message: BattleMessage): InterpreterInstruction {
val otherPokemon = message.actorAndActivePokemonFromOptional(battle, "of")?.second?.battlePokemon
val statusLabel = message.argumentAt(1) ?: return
val status = Statuses.getStatus(statusLabel) ?: return Cobblemon.LOGGER.error("Unrecognized status: $statusLabel")
if (otherPokemon == null)
ShowdownInterpreter.broadcastOptionalAbility(battle, message.effect(), pokemon.getName())
else
ShowdownInterpreter.broadcastOptionalAbility(battle, message.effect(), otherPokemon.getName())
ShowdownInterpreter.broadcastOptionalAbility(battle, message.effect(), otherPokemon ?: pokemon)
battle.dispatchWaiting {
if (status is PersistentStatus) {
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleMessage
@@ -10,7 +18,7 @@ import com.cobblemon.mod.common.util.battleLang
*
* A move was super effective against POKEMON.
* @author Hunter
* @since August 18, 2022
* @since August 18th, 2022
*/
class SuperEffectiveInstruction(val message: BattleMessage): InterpreterInstruction {
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleContext
@@ -11,7 +19,7 @@ import com.cobblemon.mod.common.util.battleLang
*
* Swaps the boosts from STATS between the SOURCE Pokémon and TARGET Pokémon.
* @author Renaissance
* @since March 24, 2023
* @since March 24th, 2023
*/
class SwapBoostInstruction(val message: BattleMessage): InterpreterInstruction {
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleContext
@@ -11,7 +19,7 @@ import com.cobblemon.mod.common.battles.dispatch.InterpreterInstruction
*
* Swaps side conditions between sides. Used for Court Change.
* @author Segfault Guy
* @since February 19, 2024
* @since February 19th, 2024
*/
class SwapSideConditionsInstruction(val message: BattleMessage): InterpreterInstruction {
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleContext
@@ -16,13 +24,13 @@ import net.minecraft.server.world.ServerWorld
import java.util.concurrent.CompletableFuture
/**
* Format: |switch|POKEMON|DETAILS|HP STATUS or |drag|POKEMON|DETAILS|HP STATUS
* Format: |switch|POKEMON|DETAILS|HP STATUS
*
* POKEMON has switched in (if there was an old Pokémon at that position, it is switched out).
* POKEMON|DETAILS represents all the information that can be used to tell Pokémon apart.
* The switched Pokémon has HP health points and STATUS status.
* @author Deltric
* @since January 22, 2022
* @since January 22nd, 2022
*/
class SwitchInstruction(val instructionSet: InstructionSet, val battleActor: BattleActor, val publicMessage: BattleMessage, val privateMessage: BattleMessage): InterpreterInstruction {
@@ -32,6 +40,7 @@ class SwitchInstruction(val instructionSet: InstructionSet, val battleActor: Bat
val (actor, activePokemon) = battle.getActorAndActiveSlotFromPNX(pnx)
val entity = if (actor is EntityBackedBattleActor<*>) actor.entity else null
val imposter = instructionSet.getNextInstruction<TransformInstruction>(this)?.expectedTarget != null
val illusion = publicMessage.battlePokemonFromOptional(battle, "is")
val pokemon = publicMessage.battlePokemon(0, battle) ?: return
@@ -79,7 +88,7 @@ class SwitchInstruction(val instructionSet: InstructionSet, val battleActor: Bat
setOf(
BattleDispatch {
if (entity != null) {
createEntitySwitch(battle, actor, entity, pnx, activePokemon, pokemon, illusion)
createEntitySwitch(battle, actor, entity, pnx, activePokemon, pokemon, illusion, imposter)
} else {
createNonEntitySwitch(battle, actor, pnx, activePokemon, pokemon, illusion)
}
@@ -90,10 +99,21 @@ class SwitchInstruction(val instructionSet: InstructionSet, val battleActor: Bat
}
companion object{
fun createEntitySwitch(battle: PokemonBattle, actor: BattleActor, entity: LivingEntity, pnx: String, activePokemon: ActiveBattlePokemon, newPokemon: BattlePokemon, illusion: BattlePokemon? = null): DispatchResult {
fun createEntitySwitch(
battle: PokemonBattle,
actor: BattleActor,
entity: LivingEntity,
pnx: String,
activePokemon: ActiveBattlePokemon,
newPokemon: BattlePokemon,
illusion: BattlePokemon? = null,
imposter: Boolean = false
): DispatchResult {
val pokemonEntity = activePokemon.battlePokemon?.entity
// If we can't find the entity for some reason then we're going to skip the recall animation
val sendOutFuture = CompletableFuture<Unit>()
// skip if handled by respective EntityEffect
val doCry = illusion == null && !imposter
(pokemonEntity?.recallWithAnimation() ?: CompletableFuture.completedFuture(Unit)).thenApply {
// Queue actual swap and send-in after the animation has ended
actor.pokemonList.swap(actor.activePokemon.indexOf(activePokemon), actor.pokemonList.indexOf(newPokemon))
@@ -102,7 +122,7 @@ class SwitchInstruction(val instructionSet: InstructionSet, val battleActor: Bat
battle.sendSidedUpdate(actor, BattleSwitchPokemonPacket(pnx, newPokemon, true, illusion), BattleSwitchPokemonPacket(pnx, newPokemon, false, illusion))
if (newPokemon.entity != null) {
illusion?.let { IllusionEffect(it.effectedPokemon).start(newPokemon.entity!!) }
newPokemon.entity?.cry()
if (doCry) newPokemon.entity?.cry()
sendOutFuture.complete(Unit)
} else {
val lastPosition = activePokemon.position
@@ -114,6 +134,7 @@ class SwitchInstruction(val instructionSet: InstructionSet, val battleActor: Bat
battleId = battle.battleId,
level = world,
position = pos,
doCry = doCry,
illusion = illusion?.let { IllusionEffect(it.effectedPokemon) }
).thenAccept { sendOutFuture.complete(Unit) }
}
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleMessage
@@ -12,15 +20,15 @@ import com.cobblemon.mod.common.util.battleLang
*
* POKEMON terastallized into TYPE.
* @author Segfault Guy
* @since September 10, 2023
* @since September 10th, 2023
*/
class TerastallizeInstruction(val message: BattleMessage): InterpreterInstruction {
override fun invoke(battle: PokemonBattle) {
val battlePokemon = message.battlePokemon(0, battle) ?: return
val pokemonName = battlePokemon.getName()
val type = message.effectAt(1)?.let { ElementalTypes.get(it.id) } ?: return
battle.dispatchWaiting {
val pokemonName = battlePokemon.getName()
battle.broadcastChatMessage(battleLang("terastallize", pokemonName, type.displayName).yellow())
battle.minorBattleActions[battlePokemon.uuid] = message
}
@@ -1,9 +1,21 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleMessage
import com.cobblemon.mod.common.api.battles.model.PokemonBattle
import com.cobblemon.mod.common.battles.ShowdownInterpreter
import com.cobblemon.mod.common.battles.dispatch.GO
import com.cobblemon.mod.common.battles.dispatch.InterpreterInstruction
import com.cobblemon.mod.common.battles.dispatch.UntilDispatch
import com.cobblemon.mod.common.entity.pokemon.effects.TransformEffect
import com.cobblemon.mod.common.net.messages.client.battle.BattleTransformPokemonPacket
import com.cobblemon.mod.common.util.battleLang
/**
@@ -11,18 +23,40 @@ import com.cobblemon.mod.common.util.battleLang
*
* POKEMON used Transform to turn into target POKEMON.
* @author jeffw773
* @since November 28, 2023
* @since November 28th, 2023
*/
class TransformInstruction(val message: BattleMessage): InterpreterInstruction {
class TransformInstruction(val battle: PokemonBattle, val message: BattleMessage): InterpreterInstruction {
val expectedTarget = message.battlePokemon(0, battle)
override fun invoke(battle: PokemonBattle) {
battle.dispatchWaiting(1.5F) {
val pokemon = message.battlePokemon(0, battle) ?: return@dispatchWaiting
val (pnx, _) = message.pnxAndUuid(0) ?: return
val (actor, _) = battle.getActorAndActiveSlotFromPNX(pnx)
val pokemon = message.battlePokemon(0, battle) ?: return
val targetPokemon = message.battlePokemon(1, battle) ?: return
val effect = message.effect()
ShowdownInterpreter.broadcastOptionalAbility(battle, effect, pokemon)
battle.dispatch {
val entity = pokemon.entity ?: return@dispatch GO
val future = TransformEffect(targetPokemon.effectedPokemon, battle.started).start(entity)
UntilDispatch { future?.isDone != false }
}
battle.dispatchWaiting {
val mock = pokemon.entity?.effects?.mockEffect?.mock
val pokemonName = pokemon.getName()
val targetPokemon = message.battlePokemon(1, battle) ?: return@dispatchWaiting
val targetPokemonName = targetPokemon.getName()
pokemon.entity?.let { TransformEffect(targetPokemon.effectedPokemon).start(it) }
mock?.let {
battle.sendSidedUpdate(
source = actor,
allyPacket = BattleTransformPokemonPacket(pnx, pokemon, it, true),
opponentPacket = BattleTransformPokemonPacket(pnx, pokemon, it, false)
)
}
val lang = battleLang("transform", pokemonName, targetPokemonName)
battle.broadcastChatMessage(lang)
@@ -28,7 +28,7 @@ import com.cobblemon.mod.common.util.battleLang
*
* It is now turn NUMBER.
* @author Deltric
* @since January 22, 2022
* @since January 22nd, 2022
*/
class TurnInstruction(val message: BattleMessage) : InterpreterInstruction {
override fun invoke(battle: PokemonBattle) {
@@ -18,7 +18,7 @@ import com.cobblemon.mod.common.battles.ShowdownInterpreter
* Catch-all for unimplemented instructions that need to be added to the [ShowdownInterpreter].
*
* @author Hiroku
* @since December 25, 2023
* @since December 25th, 2023
*/
class UnknownInstruction(val battleMessage: BattleMessage) : InterpreterInstruction {
override fun invoke(battle: PokemonBattle) {
@@ -17,7 +17,7 @@ import com.cobblemon.mod.common.battles.dispatch.InterpreterInstruction
*
* Signals the upkeep phase of the turn where the number of turns left for field conditions are updated.
* @author Hiroku
* @since March 12, 2022
* @since March 12th, 2022
*/
class UpkeepInstruction : InterpreterInstruction {
override fun invoke(battle: PokemonBattle) {
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleContext
@@ -16,13 +24,13 @@ import net.minecraft.text.Text
* If upkeep is present, it means that WEATHER was active previously and is still in effect that turn.
* Otherwise, it means that the weather has changed due to a move or ability, or has expired, in which case WEATHER will be none.
* @author Hunter
* @since September 25, 2022
* @since September 25th, 2022
*/
class WeatherInstruction(val message: BattleMessage): InterpreterInstruction {
override fun invoke(battle: PokemonBattle) {
val weather = message.effectAt(0)?.id ?: return
val user = message.battlePokemonFromOptional(battle)?.getName() ?: Text.literal("UNKNOWN")
val user = message.battlePokemonFromOptional(battle) ?: return
ShowdownInterpreter.broadcastOptionalAbility(battle, message.effect(), user)
battle.dispatchWaiting(1.5F) {
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleMessage
@@ -7,9 +15,12 @@ import com.cobblemon.mod.common.api.events.CobblemonEvents
import com.cobblemon.mod.common.api.events.battles.BattleVictoryEvent
import com.cobblemon.mod.common.api.text.gold
import com.cobblemon.mod.common.api.text.plus
import com.cobblemon.mod.common.api.text.red
import com.cobblemon.mod.common.battles.ShowdownInterpreter
import com.cobblemon.mod.common.battles.actor.PlayerBattleActor
import com.cobblemon.mod.common.battles.dispatch.GO
import com.cobblemon.mod.common.battles.dispatch.InterpreterInstruction
import com.cobblemon.mod.common.battles.dispatch.WaitDispatch
import com.cobblemon.mod.common.battles.pokemon.BattlePokemon
import com.cobblemon.mod.common.util.battleLang
import java.util.UUID
@@ -19,24 +30,20 @@ import java.util.UUID
*
* USER has won the battle.
* @author Deltric
* @since January 22, 2022
* @since January 22nd, 2022
*/
class WinInstruction(val message: BattleMessage): InterpreterInstruction {
override fun invoke(battle: PokemonBattle) {
battle.dispatchGo {
val user = message.argumentAt(0) ?: return@dispatchGo
val ids = user.split("&").map { it.trim() }
val winners = ids.map { battle.getActor(UUID.fromString(it))!! }
val losers = battle.actors.filter { !winners.contains(it) }
val winnersText = winners.map { it.getName() }.reduce { acc, next -> acc + " & " + next }
battle.broadcastChatMessage(battleLang("win", winnersText).gold())
battle.end()
val wasCaught = battle.showdownMessages.any { "capture" in it }
val user = message.argumentAt(0) ?: return
val ids = user.split("&").map { it.trim() }
val winners = ids.map { battle.getActor(UUID.fromString(it))!! }
val losers = battle.actors.filter { !winners.contains(it) }
val winnersText = winners.map { it.getName() }.reduce { acc, next -> acc + " & " + next }
val losersText = losers.map { it.getName() }.reduce { acc, next -> acc + " & " + next }
val wasCaught = battle. showdownMessages.any { "capture" in it }
battle.dispatch {
// If the battle was a PvW battle, we need to set the killer of the wild Pokémon to the player
if (battle.isPvW) {
val nonPlayerActor = battle.actors.first { it.type == ActorType.WILD }
@@ -47,8 +54,20 @@ class WinInstruction(val message: BattleMessage): InterpreterInstruction {
}
}
// broadcast victory / defeat
if (!wasCaught) {
val blackedOut = battle.isPvW && losers.any { it is PlayerBattleActor }
val lang = if (blackedOut) battleLang("lose", losersText).red() else battleLang("win", winnersText).gold()
battle.broadcastChatMessage(lang)
return@dispatch WaitDispatch(2F)
}
else {
return@dispatch GO // see BattleCaptureAction
}
}
battle.dispatchGo {
battle.end()
CobblemonEvents.BATTLE_VICTORY.post(BattleVictoryEvent(battle, winners, losers, wasCaught))
ShowdownInterpreter.lastCauser.remove(battle.battleId)
}
}
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleMessage
@@ -11,14 +19,14 @@ import com.cobblemon.mod.common.util.battleLang
*
* A z-move has broken through protect and hit POKEMON.
* @author Segfault Guy
* @since September 10, 2023
* @since September 10th, 2023
*/
class ZBrokenInstruction(val message: BattleMessage): InterpreterInstruction {
override fun invoke(battle: PokemonBattle) {
val battlePokemon = message.battlePokemon(0, battle) ?: return
val pokemonName = battlePokemon.getName()
battle.dispatchWaiting {
val pokemonName = battlePokemon.getName()
battle.broadcastChatMessage(battleLang("zbroken", pokemonName).red())
battle.minorBattleActions[battlePokemon.uuid] = message
}
@@ -1,3 +1,11 @@
/*
* 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.battles.interpreter.instructions
import com.cobblemon.mod.common.api.battles.interpreter.BattleMessage
@@ -11,14 +19,14 @@ import com.cobblemon.mod.common.util.battleLang
*
* POKEMON has used the z-move variant of its move.
* @author Segfault Guy
* @since September 10, 2023
* @since September 10th, 2023
*/
class ZPowerInstruction(val message: BattleMessage): InterpreterInstruction {
override fun invoke(battle: PokemonBattle) {
val battlePokemon = message.battlePokemon(0, battle) ?: return
val pokemonName = battlePokemon.getName()
battle.dispatchWaiting {
val pokemonName = battlePokemon.getName()
battle.broadcastChatMessage(battleLang("zpower", pokemonName).yellow())
battle.minorBattleActions[battlePokemon.uuid] = message
}
@@ -17,6 +17,7 @@ import net.minecraft.entity.player.PlayerEntity
import net.minecraft.item.BlockItem
import net.minecraft.item.ItemPlacementContext
import net.minecraft.state.StateManager
import net.minecraft.state.property.DirectionProperty
import net.minecraft.util.ActionResult
import net.minecraft.util.Hand
import net.minecraft.util.ItemScatterer
@@ -32,6 +33,11 @@ class DisplayCaseBlock(settings: Settings) : BlockWithEntity(settings) {
init {
this.defaultState = this.stateManager.defaultState
.with(FACING, Direction.NORTH)
.with(ITEM_DIRECTION, Direction.NORTH)
}
companion object {
val ITEM_DIRECTION = DirectionProperty.of("item_facing")
}
override fun getPlacementState(ctx: ItemPlacementContext): BlockState? {
@@ -40,7 +46,10 @@ class DisplayCaseBlock(settings: Settings) : BlockWithEntity(settings) {
val blockPos = ctx.blockPos
ctx.placementDirections.forEach { direction ->
if (direction.axis.isHorizontal) {
blockState = blockState.with(FACING, direction) as BlockState
blockState = blockState
.with(FACING, direction)
.with(ITEM_DIRECTION, direction)
as BlockState
if (blockState.canPlaceAt(worldView, blockPos)) {
return blockState
}
@@ -51,6 +60,7 @@ class DisplayCaseBlock(settings: Settings) : BlockWithEntity(settings) {
override fun appendProperties(builder: StateManager.Builder<Block, BlockState>) {
builder.add(FACING)
builder.add(ITEM_DIRECTION)
}
override fun createBlockEntity(pos: BlockPos, state: BlockState): DisplayCaseBlockEntity {
@@ -80,7 +90,7 @@ class DisplayCaseBlock(settings: Settings) : BlockWithEntity(settings) {
val entity = world.getBlockEntity(pos) as DisplayCaseBlockEntity
val result = entity.updateItem(player, hand)
if ((hit.side != Direction.UP && hit.side != Direction.DOWN) && result == ActionResult.SUCCESS) {
world.setBlockState(pos, state.with(FACING, hit.side.opposite))
world.setBlockState(pos, state.with(ITEM_DIRECTION, hit.side.opposite))
}
return result
}
@@ -62,8 +62,8 @@ class MonitorBlock(properties: Settings) : MultiblockBlock(properties) {
if(world == null || pos == null) {
return 0
}
val monitorEntity = world.getBlockEntity(pos) as MultiblockEntity
val multiBlockEntity = monitorEntity.multiblockStructure
val monitorEntity = world.getBlockEntity(pos) as? MultiblockEntity
val multiBlockEntity = monitorEntity?.multiblockStructure
if(multiBlockEntity != null) {
return multiBlockEntity.getComparatorOutput(state, world, pos)
}
@@ -149,8 +149,8 @@ class RestorationTankBlock(properties: Settings) : MultiblockBlock(properties),
if(world == null || pos == null) {
return 0
}
val tankEntity = world.getBlockEntity(pos) as MultiblockEntity
val multiBlockEntity = tankEntity.multiblockStructure
val tankEntity = world.getBlockEntity(pos) as? MultiblockEntity
val multiBlockEntity = tankEntity?.multiblockStructure
if(multiBlockEntity != null) {
return multiBlockEntity.getComparatorOutput(state, world, pos)
}
@@ -180,7 +180,7 @@ class RestorationTankBlock(properties: Settings) : MultiblockBlock(properties),
return
}
val tankEntity = world.getBlockEntity(pos) as? MultiblockEntity
tankEntity?.multiblockStructure!!.onTriggerEvent(state, world, pos, random)
tankEntity?.multiblockStructure?.onTriggerEvent(state, world, pos, random)
}
override fun getOutlineShape(
@@ -9,15 +9,23 @@
package com.cobblemon.mod.common.block
import com.cobblemon.mod.common.api.tags.CobblemonBlockTags
import com.cobblemon.mod.common.block.chest.GildedChestBlock
import net.minecraft.block.*
import net.minecraft.entity.player.PlayerEntity
import net.minecraft.fluid.FluidState
import net.minecraft.fluid.Fluids
import net.minecraft.item.ItemPlacementContext
import net.minecraft.server.network.ServerPlayerEntity
import net.minecraft.server.world.ServerWorld
import net.minecraft.state.StateManager
import net.minecraft.state.property.BooleanProperty
import net.minecraft.state.property.Properties
import net.minecraft.util.math.BlockPos
import net.minecraft.util.math.Direction
import net.minecraft.util.math.random.Random
import net.minecraft.util.shape.VoxelShape
import net.minecraft.world.BlockView
import net.minecraft.world.World
import net.minecraft.world.WorldAccess
import net.minecraft.world.WorldView
@@ -28,7 +36,18 @@ class TumblestoneBlock(
height: Int,
xzOffset: Int,
nextStage: Block?
) : GrowableStoneBlock(settings, stage, height, xzOffset, nextStage) {
) : GrowableStoneBlock(settings, stage, height, xzOffset, nextStage), Waterloggable {
init {
this.defaultState = this.stateManager.defaultState
.with(FACING, Direction.DOWN)
.with(WATERLOGGED, false)
}
companion object {
val WATERLOGGED = BooleanProperty.of("waterlogged")
}
override fun canGrow(pos: BlockPos, world: BlockView): Boolean {
if (stage == MAX_STAGE) return false
val iterator: Iterator<BlockPos> =
@@ -43,4 +62,31 @@ class TumblestoneBlock(
return true
}
override fun getFluidState(state: BlockState): FluidState {
return if (state.get(GildedChestBlock.WATERLOGGED)) {
Fluids.WATER.getStill(false)
} else super.getFluidState(state)
}
override fun appendProperties(builder: StateManager.Builder<Block, BlockState>) {
super.appendProperties(builder)
builder.add(GildedChestBlock.WATERLOGGED)
}
override fun getPlacementState(blockPlaceContext: ItemPlacementContext): BlockState? {
return super.getPlacementState(blockPlaceContext)?.with(GildedChestBlock.WATERLOGGED, blockPlaceContext.world.getFluidState(blockPlaceContext.blockPos).fluid == Fluids.WATER)
}
override fun getStateForNeighborUpdate(
state: BlockState,
direction: Direction,
neighborState: BlockState,
world: WorldAccess,
pos: BlockPos,
neighborPos: BlockPos
): BlockState? {
if (state.get(GildedChestBlock.WATERLOGGED)) world.scheduleFluidTick(pos, Fluids.WATER, Fluids.WATER.getTickRate(world))
return super.getStateForNeighborUpdate(state, direction, neighborState, world, pos, neighborPos)
}
}
@@ -16,20 +16,15 @@ import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
import com.cobblemon.mod.common.util.cobblemonResource
import com.cobblemon.mod.common.util.party
import com.cobblemon.mod.common.util.toVec3d
import net.minecraft.block.Block
import net.minecraft.block.BlockRenderType
import net.minecraft.block.BlockState
import net.minecraft.block.BlockWithEntity
import net.minecraft.block.Blocks
import net.minecraft.block.HorizontalFacingBlock
import net.minecraft.block.ShapeContext
import net.minecraft.block.Waterloggable
import net.minecraft.block.*
import net.minecraft.entity.LivingEntity
import net.minecraft.entity.ai.pathing.NavigationType
import net.minecraft.entity.mob.PiglinBrain
import net.minecraft.entity.player.PlayerEntity
import net.minecraft.fluid.FluidState
import net.minecraft.fluid.Fluids
import net.minecraft.item.ItemPlacementContext
import net.minecraft.item.ItemStack
import net.minecraft.screen.ScreenHandler
import net.minecraft.server.network.ServerPlayerEntity
import net.minecraft.sound.SoundCategory
@@ -38,12 +33,7 @@ import net.minecraft.state.property.BooleanProperty
import net.minecraft.state.property.Properties
import net.minecraft.text.MutableText
import net.minecraft.text.Text
import net.minecraft.util.ActionResult
import net.minecraft.util.BlockMirror
import net.minecraft.util.BlockRotation
import net.minecraft.util.Hand
import net.minecraft.util.Identifier
import net.minecraft.util.ItemScatterer
import net.minecraft.util.*
import net.minecraft.util.hit.BlockHitResult
import net.minecraft.util.math.BlockPos
import net.minecraft.util.math.Direction
@@ -106,7 +96,7 @@ class GildedChestBlock(settings: Settings, val type: Type = Type.RED) : BlockWit
neighborPos: BlockPos
): BlockState {
if (state.get(WATERLOGGED)) world.scheduleFluidTick(pos, Fluids.WATER, Fluids.WATER.getTickRate(world))
return super.getStateForNeighborUpdate(state, direction, neighborState, world, pos, neighborPos)
return super.getStateForNeighborUpdate(state, direction, neighborState, world, pos, neighborPos)
}
override fun getFluidState(state: BlockState): FluidState {
@@ -258,4 +248,17 @@ class GildedChestBlock(settings: Settings, val type: Type = Type.RED) : BlockWit
return false
}
override fun onPlaced(
world: World,
pos: BlockPos,
state: BlockState,
placer: LivingEntity?,
itemStack: ItemStack
) {
val blockEntity = world.getBlockEntity(pos)
if (itemStack.hasCustomName() && blockEntity is GildedChestBlockEntity) {
blockEntity.customName = itemStack.name
}
}
}
@@ -92,8 +92,7 @@ class DisplayCaseBlockEntity(pos: BlockPos, state: BlockState) : BlockEntity(Cob
} else {
world!!.playSound(null, pos, CobblemonSounds.DISPLAY_CASE_ADD_ITEM, SoundCategory.BLOCKS)
}
world!!.updateListeners(pos, oldState, world!!.getBlockState(pos), Block.NOTIFY_LISTENERS)
world!!.updateComparators(pos, world!!.getBlockState(pos).block)
onItemUpdated(world!!, oldState, world!!.getBlockState(pos))
}
override fun writeNbt(nbt: NbtCompound) {
@@ -116,9 +115,9 @@ class DisplayCaseBlockEntity(pos: BlockPos, state: BlockState) : BlockEntity(Cob
}
private fun onItemUpdated(world: World, oldState: BlockState, newState: BlockState) {
markDirty()
world.updateListeners(pos, oldState, newState, Block.NOTIFY_LISTENERS)
world.updateComparators(pos, world.getBlockState(pos).block)
markDirty()
}
override fun clear() {
@@ -42,7 +42,7 @@ open class FossilMultiblockEntity(
field
} else if (masterBlockPos != null && masterBlockPos != pos) {
val chunkPos = ChunkPos(masterBlockPos)
if (world?.chunkManager?.isChunkLoaded(chunkPos.x, chunkPos.z) == true) {
if (world?.chunkManager?.isChunkLoaded(chunkPos.x, chunkPos.z) == true) {
val entity: FossilMultiblockEntity? = world?.getBlockEntity(masterBlockPos) as FossilMultiblockEntity?
field = entity?.multiblockStructure
}
@@ -140,7 +140,7 @@ class PokemonPastureBlockEntity(pos: BlockPos, val state: BlockState) : BlockEnt
if (fixedPosition != null) {
entity.setPosition(fixedPosition.toCenterPos().subtract(0.0, 0.5, 0.0))
val pc = Cobblemon.storage.getPC(player.uuid)
entity.beamMode = 1
entity.beamMode = 2
afterOnServer(seconds = SendOutPokemonHandler.SEND_OUT_DURATION) {
entity.beamMode = 0
}
@@ -117,10 +117,10 @@ class FossilMultiblockBuilder(val centerPos: BlockPos) : MultiblockStructureBuil
val monitorPos = monitorPositions[fossilTankIndex]
val fossilAnalyzerPos = fossilAnalyzerPositions[fossilTankIndex]!!
val restorationTankPos = restorationTankPositions[fossilTankIndex]!!
val monitorEntity = world.getBlockEntity(monitorPos) as MultiblockEntity
val analyzerEntity = world.getBlockEntity(fossilAnalyzerPos) as MultiblockEntity
val tankBaseEntity = world.getBlockEntity(restorationTankPos) as MultiblockEntity
val tankTopEntity = world.getBlockEntity(restorationTankPos.up()) as MultiblockEntity
val monitorEntity = world.getBlockEntity(monitorPos) as? MultiblockEntity
val analyzerEntity = world.getBlockEntity(fossilAnalyzerPos) as? MultiblockEntity
val tankBaseEntity = world.getBlockEntity(restorationTankPos) as? MultiblockEntity
val tankTopEntity = world.getBlockEntity(restorationTankPos.up()) as? MultiblockEntity
val structure = FossilMultiblockStructure(monitorPos, fossilAnalyzerPos, restorationTankPos)
structure.tankConnectorDirection = dirsToCheck.filter {
@@ -128,20 +128,20 @@ class FossilMultiblockBuilder(val centerPos: BlockPos) : MultiblockStructureBuil
return@filter adjPos == fossilAnalyzerPos
}.first()
analyzerEntity.multiblockStructure = structure
tankBaseEntity.multiblockStructure = structure
tankTopEntity.multiblockStructure = structure
monitorEntity.multiblockStructure = structure
analyzerEntity?.multiblockStructure = structure
tankBaseEntity?.multiblockStructure = structure
tankTopEntity?.multiblockStructure = structure
monitorEntity?.multiblockStructure = structure
structure.syncToClient(world)
structure.markDirty(world)
world.playSound(null, centerPos, CobblemonSounds.FOSSIL_MACHINE_ASSEMBLE, SoundCategory.BLOCKS)
//Set these to null so the builders can be freed
analyzerEntity.multiblockBuilder = null
tankBaseEntity.multiblockBuilder = null
tankTopEntity.multiblockBuilder = null
monitorEntity.multiblockBuilder = null
analyzerEntity?.multiblockBuilder = null
tankBaseEntity?.multiblockBuilder = null
tankTopEntity?.multiblockBuilder = null
monitorEntity?.multiblockBuilder = null
}
companion object {
@@ -306,22 +306,22 @@ class FossilMultiblockStructure (
}
override fun onBreak(world: World, pos: BlockPos, state: BlockState, player: PlayerEntity?) {
val monitorEntity = world.getBlockEntity(monitorPos) as MultiblockEntity
val analyzerEntity = world.getBlockEntity(analyzerPos) as MultiblockEntity
val tankBaseEntity = world.getBlockEntity(tankBasePos) as MultiblockEntity
val tankTopEntity = world.getBlockEntity(tankBasePos.up()) as MultiblockEntity
val state = world.getBlockState(tankBaseEntity.pos)
val monitorEntity = world.getBlockEntity(monitorPos) as? MultiblockEntity
val analyzerEntity = world.getBlockEntity(analyzerPos) as? MultiblockEntity
val tankBaseEntity = world.getBlockEntity(tankBasePos) as? MultiblockEntity
val tankTopEntity = world.getBlockEntity(tankBasePos.up()) as? MultiblockEntity
val state = world.getBlockState(tankBaseEntity?.pos)
val direction = state.get(HorizontalFacingBlock.FACING).getOpposite()
val wildPokemon: Pokemon? = this.createdPokemon
monitorEntity.multiblockStructure = null
analyzerEntity.multiblockStructure = null
tankBaseEntity.multiblockStructure = null
tankTopEntity.multiblockStructure = null
monitorEntity.masterBlockPos = null
analyzerEntity.masterBlockPos = null
tankBaseEntity.masterBlockPos = null
tankTopEntity.masterBlockPos = null
monitorEntity?.multiblockStructure = null
analyzerEntity?.multiblockStructure = null
tankBaseEntity?.multiblockStructure = null
tankTopEntity?.multiblockStructure = null
monitorEntity?.masterBlockPos = null
analyzerEntity?.masterBlockPos = null
tankBaseEntity?.masterBlockPos = null
tankTopEntity?.masterBlockPos = null
// Drop fossils from machine as long as the machine is not started or near completion
if (this.timeRemaining == -1 || this.timeRemaining >= 20) {
@@ -619,8 +619,8 @@ class FossilMultiblockStructure (
}
const val TICKS_PER_MINUTE = 1200
const val MATERIAL_TO_START = 256
const val TIME_TO_TAKE = TICKS_PER_MINUTE * 15
const val MATERIAL_TO_START = 128
const val TIME_TO_TAKE = TICKS_PER_MINUTE * 12
const val TIME_PER_STAGE = TIME_TO_TAKE / 8
const val PROTECTION_TIME = TICKS_PER_MINUTE * 5
@@ -12,6 +12,8 @@ import com.bedrockk.molang.runtime.value.DoubleValue
import com.bedrockk.molang.runtime.value.StringValue
import com.cobblemon.mod.common.CobblemonSounds
import com.cobblemon.mod.common.api.entity.PokemonSideDelegate
import com.cobblemon.mod.common.api.events.CobblemonClientEvents
import com.cobblemon.mod.common.api.events.client.ClientSendoutEvent
import com.cobblemon.mod.common.api.molang.MoLangFunctions.addFunctions
import com.cobblemon.mod.common.api.molang.MoLangFunctions.getQueryStruct
import com.cobblemon.mod.common.api.pokemon.PokemonSpecies
@@ -25,6 +27,7 @@ import com.cobblemon.mod.common.client.render.models.blockbench.PoseableEntitySt
import com.cobblemon.mod.common.client.render.models.blockbench.animation.PrimaryAnimation
import com.cobblemon.mod.common.client.render.models.blockbench.animation.StatefulAnimation
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPoseableModel
import com.cobblemon.mod.common.client.render.models.blockbench.repository.PokemonModelRepository
import com.cobblemon.mod.common.client.render.pokemon.PokemonRenderer.Companion.ease
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
import com.cobblemon.mod.common.pokemon.Pokemon
@@ -85,6 +88,8 @@ class PokemonClientDelegate : PoseableEntityState<PokemonEntity>(), PokemonSideD
val identifier = Identifier(currentEntity.dataTracker.get(PokemonEntity.SPECIES))
currentPose = null
currentEntity.pokemon.species = PokemonSpecies.getByIdentifier(identifier)!! // TODO exception handling
// force a model update - handles edge case where the PoseableEntityState's tracked PoseableEntityModel isn't updated until the LivingEntityRenderer render is run
currentModel = PokemonModelRepository.getPoser(identifier, currentEntity.aspects)
} else if (data == PokemonEntity.DYING_EFFECTS_STARTED) {
val isDying = currentEntity.dataTracker.get(PokemonEntity.DYING_EFFECTS_STARTED)
if (isDying) {
@@ -100,6 +105,8 @@ class PokemonClientDelegate : PoseableEntityState<PokemonEntity>(), PokemonSideD
this.addPrimaryAnimation(primaryAnimation)
}
} else if (data == PokemonEntity.BEAM_MODE) {
// If you make adjustments to this code, make sure to Find Usages for both PokemonEntity.beamMode and PokemonEntity.BEAM_MODE
// TODO: change beamMode to an enum, or a set of booleans (send-out vs recall, delay vs delay)
val beamMode = currentEntity.beamMode
when (beamMode) {
0 -> { /* Do nothing */ }
@@ -129,6 +136,19 @@ class PokemonClientDelegate : PoseableEntityState<PokemonEntity>(), PokemonSideD
if(!playedThrowingSound){
client.soundManager.play(sound)
playedThrowingSound = true
sendOutPosition?.let {
sendOutOffset?.let { it1 ->
ClientSendoutEvent(
it1,
it,
currentEntity
)
}
}?.let {
CobblemonClientEvents.CLIENT_SENDOUT.emit(
it
)
}
}
lerpOnClient(POKEBALL_AIR_TIME) { ballOffset = it }
ballRotOffset = ((Math.random()) * currentEntity.world.random.nextBetween(-15, 15)).toFloat()
@@ -136,39 +156,37 @@ class PokemonClientDelegate : PoseableEntityState<PokemonEntity>(), PokemonSideD
currentEntity.after(seconds = POKEBALL_AIR_TIME){
beamStartTime = System.currentTimeMillis()
ballDone = true
if (client.soundManager.get(CobblemonSounds.POKE_BALL_OPEN.id) != null && !playedSendOutSound) {
currentEntity.owner?.let {
client.world?.playSound(client.player, soundPos.x, soundPos.y, soundPos.z, SoundEvent.of(CobblemonSounds.POKE_BALL_SEND_OUT.id), SoundCategory.PLAYERS, 0.6f, 1f)
playedSendOutSound = true
/// create end rod particles in a 0.1 radius around the soundPos with a count of 50 and a random velocity of 0.1
sendOutPosition?.let{
val newPos = it.add(sendOutOffset)
val ballType = currentEntity.pokemon.caughtBall.name.path.toLowerCase().replace("_","")
val mode = if(currentEntity.isBattling) "battle" else "casual"
val sendflash = BedrockParticleEffectRepository.getEffect(cobblemonResource("${ballType}/${mode}/sendflash"))
sendflash?.let { effect ->
val wrapper = MatrixWrapper()
val matrix = MatrixStack()
matrix.translate(newPos.x, newPos.y, newPos.z)
wrapper.updateMatrix(matrix.peek().positionMatrix)
val world = MinecraftClient.getInstance().world ?: return@let
if (client.soundManager.get(CobblemonSounds.POKE_BALL_SEND_OUT.id) != null && !playedSendOutSound) {
client.world?.playSound(client.player, soundPos.x, soundPos.y, soundPos.z, SoundEvent.of(CobblemonSounds.POKE_BALL_SEND_OUT.id), SoundCategory.PLAYERS, 0.6f, 1f)
playedSendOutSound = true
}
// Display ball-specific particles
sendOutPosition?.let{
val newPos = it.add(sendOutOffset)
val ballType = currentEntity.pokemon.caughtBall.name.path.lowercase().replace("_","")
val mode = if(currentEntity.isBattling) "battle" else "casual"
val sendflash = BedrockParticleEffectRepository.getEffect(cobblemonResource("${ballType}/${mode}/sendflash"))
sendflash?.let { effect ->
val wrapper = MatrixWrapper()
val matrix = MatrixStack()
matrix.translate(newPos.x, newPos.y, newPos.z)
wrapper.updateMatrix(matrix.peek().positionMatrix)
val world = MinecraftClient.getInstance().world ?: return@let
ParticleStorm(effect, wrapper, world).spawn()
val ballsparks = BedrockParticleEffectRepository.getEffect(cobblemonResource("${ballType}/${mode}/ballsparks"))
val ballsendsparkle = BedrockParticleEffectRepository.getEffect(cobblemonResource("${ballType}/${mode}/ballsendsparkle"))
// using afterOnClient because it's such a small timeframe that it's unlikely the entity has been removed & we'd like the precision
afterOnClient(seconds = 0.01667f) {
ballsparks?.let { effect ->
ParticleStorm(effect, wrapper, world).spawn()
val ballsparks = BedrockParticleEffectRepository.getEffect(cobblemonResource("${ballType}/${mode}/ballsparks"))
val ballsendsparkle = BedrockParticleEffectRepository.getEffect(cobblemonResource("${ballType}/${mode}/ballsendsparkle"))
// using afterOnClient because it's such a small timeframe that it's unlikely the entity has been removed & we'd like the precision
afterOnClient(seconds = 0.01667f) {
ballsparks?.let { effect ->
ParticleStorm(effect, wrapper, world).spawn()
}
ballsendsparkle?.let { effect ->
ParticleStorm(effect, wrapper, world).spawn()
}
currentEntity.after(seconds = 0.4f) {
val ballsparkle = BedrockParticleEffectRepository.getEffect(cobblemonResource("${ballType}/ballsparkle"))
ballsparkle?.let { effect ->
ParticleStorm(effect, wrapper, world).spawn()
}
}
}
ballsendsparkle?.let { effect ->
ParticleStorm(effect, wrapper, world).spawn()
}
currentEntity.after(seconds = 0.4f) {
val ballsparkle = BedrockParticleEffectRepository.getEffect(cobblemonResource("${ballType}/ballsparkle"))
ballsparkle?.let { effect ->
ParticleStorm(effect, wrapper, world).spawn()
}
}
}
@@ -185,7 +203,35 @@ class PokemonClientDelegate : PoseableEntityState<PokemonEntity>(), PokemonSideD
}
}
}
else -> {
2 -> {
// Scaling up with no delay and no particles
playedSendOutSound = false
entityScaleModifier = 0F
currentEntity.isInvisible = false
val soundPos = currentEntity.pos
val client = MinecraftClient.getInstance()
if (client.soundManager.get(CobblemonSounds.POKE_BALL_SEND_OUT.id) != null && !playedSendOutSound) {
client.world?.playSound(
client.player,
soundPos.x,
soundPos.y,
soundPos.z,
CobblemonSounds.POKE_BALL_SEND_OUT,
SoundCategory.PLAYERS,
0.6f,
1f
)
playedSendOutSound = true
}
lerpOnClient(BEAM_SHRINK_TIME) { entityScaleModifier = it }
currentEntity.after(seconds = BEAM_SHRINK_TIME * 2) {
ballOffset = 0f
ballRotOffset = 0f
sendOutPosition = null
}
}
3 -> {
// Scaling down into pokeball
entityScaleModifier = 1F
beamStartTime = System.currentTimeMillis()
@@ -198,6 +244,7 @@ class PokemonClientDelegate : PoseableEntityState<PokemonEntity>(), PokemonSideD
}
}
}
else -> { /* Do nothing */ }
}
} else if (data == PokemonEntity.LABEL_LEVEL) {
currentEntity.dataTracker.get(PokemonEntity.LABEL_LEVEL)
@@ -16,6 +16,7 @@ import com.cobblemon.mod.common.client.gui.battle.subscreen.BattleActionSelectio
import com.cobblemon.mod.common.client.gui.battle.subscreen.BattleBackButton
import com.cobblemon.mod.common.client.gui.battle.subscreen.BattleGeneralActionSelection
import com.cobblemon.mod.common.client.gui.battle.subscreen.BattleSwitchPokemonSelection
import com.cobblemon.mod.common.client.gui.battle.subscreen.ForfeitConfirmationSelection
import com.cobblemon.mod.common.client.gui.battle.widgets.BattleMessagePane
import com.cobblemon.mod.common.client.keybind.boundKey
import com.cobblemon.mod.common.client.keybind.keybinds.PartySendBinding
@@ -123,6 +124,15 @@ class BattleGUI : Screen(battleLang("gui.title")) {
opacity = 0.75F * opacity,
centered = true
)
} else if (currentSelection is ForfeitConfirmationSelection) {
drawScaledText(
context = context,
text = battleLang("ui.forfeit_confirmation", PartySendBinding.boundKey().localizedText),
x = MinecraftClient.getInstance().window.scaledWidth / 2,
y = (MinecraftClient.getInstance().window.scaledHeight / 5),
opacity = 0.75F * opacity,
centered = true
)
}
@@ -66,6 +66,11 @@ class BattleGeneralActionSelection(
MinecraftClient.getInstance().player?.sendMessage(battleLang("run_prompt"), false)
playDownSound(MinecraftClient.getInstance().soundManager)
}
} else {
addOption(rank++, battleLang("ui.forfeit"), BattleGUI.runResource) {
battleGUI.changeActionSelection(ForfeitConfirmationSelection(battleGUI, request))
playDownSound(MinecraftClient.getInstance().soundManager)
}
}
}
}
@@ -0,0 +1,65 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.client.gui.battle.subscreen
import com.cobblemon.mod.common.battles.ForfeitActionResponse
import com.cobblemon.mod.common.client.battle.SingleActionRequest
import com.cobblemon.mod.common.client.gui.battle.BattleGUI
import com.cobblemon.mod.common.client.gui.battle.BattleOverlay
import com.cobblemon.mod.common.client.gui.battle.widgets.BattleOptionTile
import com.cobblemon.mod.common.util.battleLang
import net.minecraft.client.MinecraftClient
import net.minecraft.client.gui.DrawContext
import net.minecraft.client.util.math.MatrixStack
class ForfeitConfirmationSelection(
battleGUI: BattleGUI,
request: SingleActionRequest
) : BattleActionSelection(
battleGUI,
request,
x = 12,
y = 12,
width = 250,
height = 100,
battleLang("ui.forfeit_confirmation")
) {
val forfeitButton: BattleOptionTile
val backButton = BattleBackButton(x - 3F, MinecraftClient.getInstance().window.scaledHeight - 22F )
init {
val x = (MinecraftClient.getInstance().window.scaledWidth / 2) - (BattleOptionTile.OPTION_WIDTH / 2)
val y = (MinecraftClient.getInstance().window.scaledHeight / 2) - (BattleOptionTile.OPTION_HEIGHT / 2)
forfeitButton = BattleOptionTile(battleGUI, x, y, BattleGUI.runResource, battleLang("ui.forfeit")) {
battleGUI.selectAction(request, ForfeitActionResponse())
playDownSound(MinecraftClient.getInstance().soundManager)
}
}
override fun renderButton(context: DrawContext, mouseX: Int, mouseY: Int, delta: Float) {
if (opacity <= 0.05F) {
return
}
forfeitButton.render(context, mouseX, mouseY, delta)
backButton.render(context.matrices, mouseX, mouseY, delta)
}
override fun mouseClicked(mouseX: Double, mouseY: Double, button: Int): Boolean {
if (backButton.isHovered(mouseX, mouseY)) {
battleGUI.changeActionSelection(null)
playDownSound(MinecraftClient.getInstance().soundManager)
return true
}
return forfeitButton.mouseClicked(mouseX, mouseY, button)
}
}
@@ -279,10 +279,10 @@ class PCGUI(
blitk(
matrixStack = matrices,
texture = Summary.iconShinyResource,
x = (x + 63.5) / SCALE,
x = (x + 62.5) / SCALE,
y = (y + 28.5) / SCALE,
width = 14,
height = 14,
width = 16,
height = 16,
scale = SCALE
)
}
@@ -524,10 +524,10 @@ class Summary private constructor(party: Collection<Pokemon?>, private val edita
blitk(
matrixStack = matrices,
texture = iconShinyResource,
x = (x + 63.5) / SCALE,
x = (x + 62.5) / SCALE,
y = (y + 33.5) / SCALE,
width = 14,
height = 14,
width = 16,
height = 16,
scale = SCALE
)
}
@@ -0,0 +1,44 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.client.net.battle
import com.cobblemon.mod.common.api.net.ClientNetworkPacketHandler
import com.cobblemon.mod.common.client.CobblemonClient
import com.cobblemon.mod.common.client.battle.ClientBattlePokemon
import com.cobblemon.mod.common.net.messages.client.battle.BattleReplacePokemonPacket
import net.minecraft.client.MinecraftClient
/**
* The handler for [BattleReplacePokemonPacket]s. Removes the illusion [ClientBattlePokemon] and replaces it with the actual data.
*
* @author Segfault Guy
* @since March 30th, 2024
*/
object BattleReplacePokemonHandler : ClientNetworkPacketHandler<BattleReplacePokemonPacket> {
override fun handle(packet: BattleReplacePokemonPacket, client: MinecraftClient) {
val battle = CobblemonClient.battle ?: return
val (actor, activeBattlePokemon) = battle.getPokemonFromPNX(packet.pnx)
with(packet.realPokemon) {
activeBattlePokemon.battlePokemon = ClientBattlePokemon(
uuid = uuid,
displayName = displayName,
properties = properties,
aspects = aspects,
hpValue = hpValue,
maxHp = maxHp,
isHpFlat = packet.isAlly,
status = status,
statChanges = statChanges
).also {
it.actor = actor
}
}
}
}
@@ -0,0 +1,40 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.client.net.battle
import com.cobblemon.mod.common.api.net.ClientNetworkPacketHandler
import com.cobblemon.mod.common.client.CobblemonClient
import com.cobblemon.mod.common.client.battle.ClientBattlePokemon
import com.cobblemon.mod.common.net.messages.client.battle.BattleTransformPokemonPacket
import net.minecraft.client.MinecraftClient
/**
* The handler for [BattleTransformPokemonPacket]s. Updates the [ClientBattlePokemon] after a transformation.
*
* @author Segfault Guy
* @since April 22nd, 2023
*/
object BattleTransformPokemonHandler : ClientNetworkPacketHandler<BattleTransformPokemonPacket> {
override fun handle(packet: BattleTransformPokemonPacket, client: MinecraftClient) {
val battle = CobblemonClient.battle ?: return
val (_, activeBattlePokemon) = battle.getPokemonFromPNX(packet.pnx)
val update = packet.updatedPokemon
activeBattlePokemon.battlePokemon?.apply {
displayName = update.displayName
properties = update.properties
aspects = update.aspects
hpValue = update.hpValue
maxHp = update.maxHp
isHpFlat = update.isFlatHp
status = update.status
statChanges = update.statChanges
}
}
}
@@ -10,12 +10,12 @@ package com.cobblemon.mod.common.client.render.block
import com.cobblemon.mod.common.CobblemonBlocks
import com.cobblemon.mod.common.CobblemonItems
import com.cobblemon.mod.common.block.DisplayCaseBlock
import com.cobblemon.mod.common.block.entity.DisplayCaseBlockEntity
import com.cobblemon.mod.common.client.render.models.blockbench.repository.PokemonModelRepository
import com.cobblemon.mod.common.entity.PoseType
import com.cobblemon.mod.common.item.PokeBallItem
import com.cobblemon.mod.common.item.PokemonItem
import net.minecraft.block.HorizontalFacingBlock
import net.minecraft.client.MinecraftClient
import net.minecraft.client.render.OverlayTexture
import net.minecraft.client.render.VertexConsumer
@@ -52,9 +52,9 @@ class DisplayCaseRenderer(ctx: BlockEntityRendererFactory.Context) : BlockEntity
val world = entity.world ?: return
val posType = getPositioningType(stack, world)
val blockState = if (entity.world != null) entity.cachedState
else (CobblemonBlocks.DISPLAY_CASE.defaultState.with(HorizontalFacingBlock.FACING, Direction.NORTH))
val yRot = if (posType == PositioningType.ITEM_MODEL) blockState.get(HorizontalFacingBlock.FACING).opposite.asRotation()
else blockState.get(HorizontalFacingBlock.FACING).asRotation()
else (CobblemonBlocks.DISPLAY_CASE.defaultState.with(DisplayCaseBlock.ITEM_DIRECTION, Direction.NORTH))
val yRot = if (posType == PositioningType.ITEM_MODEL) blockState.get(DisplayCaseBlock.ITEM_DIRECTION).opposite.asRotation()
else blockState.get(DisplayCaseBlock.ITEM_DIRECTION).asRotation()
if (stack.item is PokemonItem) {
renderPokemon(
@@ -72,7 +72,7 @@ class RestorationTankRenderer(ctx: BlockEntityRendererFactory.Context) : BlockEn
val fluidModel = if (struct.isRunning()) FLUID_MODELS[8]
else if (struct.createdPokemon != null) FLUID_MODELS[7]
else FLUID_MODELS[fillLevel-1]
else FLUID_MODELS[fillLevel.coerceAtMost(FLUID_MODELS.size - 1) - 1]
fluidModel.getQuads(entity.cachedState, null, entity.world?.random).forEach { quad ->
transparentBuffer?.quad(matrices.peek(), quad, 0.75f, 0.75f, 0.75f, light, OverlayTexture.DEFAULT_UV)
}
@@ -383,7 +383,7 @@ abstract class PoseableEntityModel<T : Entity>(
transformedParts,
quirks
).also {
poses[poseType.name] = it
setPose(poseType.name, it)
}
}
@@ -409,7 +409,7 @@ abstract class PoseableEntityModel<T : Entity>(
transformedParts,
quirks
).also {
poses[poseName] = it
setPose(poseName, it)
}
}
@@ -435,10 +435,18 @@ abstract class PoseableEntityModel<T : Entity>(
transformedParts,
quirks
).also {
poses[poseName] = it
setPose(poseName, it)
}
}
fun <F : ModelFrame> setPose(poseName: String, pose: Pose<T, F>) {
// if pose already exists for poseName, log the name of the class and pose name
if (poses.containsKey(poseName)) {
LOGGER.error("Pose with name $poseName already exists for class ${this::class.simpleName}")
}
poses[poseName] = pose
}
fun ModelPart.registerChildWithAllChildren(name: String): ModelPart {
val child = this.getChild(name)!!
registerRelevantPart(name to child)
@@ -35,21 +35,29 @@ class SingleBoneLookAnimation<T : Entity>(
val maxPitch: Float = 70F,
val minPitch: Float = 45F,
val maxYaw: Float = 45F,
val minYaw: Float = -45F,
) : StatelessAnimation<T, ModelFrame>(frame) {
constructor(
frame: HeadedFrame,
invertX: Boolean,
invertY: Boolean,
disableX: Boolean,
disableY: Boolean
disableY: Boolean,
pitchMultiplier: Float? = null,
yawMultiplier: Float? = null,
maxPitch: Float? = null,
minPitch: Float? = null,
maxYaw: Float? = null,
minYaw: Float? = null,
): this(
frame = frame,
bone = frame.head,
pitchMultiplier = if (disableX) 0F else if (invertX) -1F else 1F,
yawMultiplier = if (disableY) 0F else if (invertY) -1F else 1F,
maxPitch = if (invertX) -45F else 45F,
minPitch = if (invertX) -70F else -45F,
maxYaw = if (invertY) -45F else 45F,
pitchMultiplier = pitchMultiplier ?: if (disableX) 0F else if (invertX) -1F else 1F,
yawMultiplier = yawMultiplier ?: if (disableY) 0F else if (invertY) -1F else 1F,
maxPitch = maxPitch ?: 45F,
minPitch = minPitch ?: -70F,
maxYaw = maxYaw ?: 45F,
minYaw = minYaw ?: -45F,
)
@@ -58,7 +66,7 @@ class SingleBoneLookAnimation<T : Entity>(
override fun setAngles(entity: T?, model: PoseableEntityModel<T>, state: PoseableEntityState<T>?, limbSwing: Float, limbSwingAmount: Float, ageInTicks: Float, headYaw: Float, headPitch: Float, intensity: Float) {
val head = bone ?: return
val pitch = pitchMultiplier * headPitch.coerceIn(minPitch, maxPitch)
val yaw = yawMultiplier * headYaw.coerceIn(-maxYaw, maxYaw)
val yaw = yawMultiplier * headYaw.coerceIn(minYaw, maxYaw)
head.addRotation(X_AXIS, pitch.toRadians() * intensity)
head.addRotation(Y_AXIS, yaw.toRadians() * intensity)
}
Loaded 100 of 2072 files, more files were not shown because too many files have changed in this diff. Show more