mirror of
https://gitlab.com/cable-mc/cobblemon.git
synced 2026-10-27 04:26:27 -04:00
Compare commits
351
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0dd0a78741 | ||
|
|
03ddc35d36 | ||
|
|
1b8e9b9b36 | ||
|
|
e52ac956f0 | ||
|
|
493664bef2 | ||
|
|
981e3e5efc | ||
|
|
c15350e647 | ||
|
|
f9e5784b10 | ||
|
|
2f4b861f98 | ||
|
|
a7022268c1 | ||
|
|
3082600e11 | ||
|
|
a348cfd338 | ||
|
|
35bfc7bf6c | ||
|
|
ae87c3dd84 | ||
|
|
d944803571 | ||
|
|
2c3b474c01 | ||
|
|
c2538560e1 | ||
|
|
d10c058c74 | ||
|
|
d1b6d95d57 | ||
|
|
977387a184 | ||
|
|
69bbc09d6a | ||
|
|
46b04ad462 | ||
|
|
a1b6fd3d1a | ||
|
|
fb9ed28b74 | ||
|
|
4bfc2a97dd | ||
|
|
a2cf66fbc1 | ||
|
|
5bda81a5c4 | ||
|
|
32ccd15121 | ||
|
|
a51cda998b | ||
|
|
9dc14eff7c | ||
|
|
4b1690c62e | ||
|
|
d02251b67d | ||
|
|
54c8cbfbe8 | ||
|
|
2d8ce63dcd | ||
|
|
1a92af2cd6 | ||
|
|
7e088bdeec | ||
|
|
6142049d51 | ||
|
|
d031f339c6 | ||
|
|
3ddbc9b313 | ||
|
|
dd2c1ddbc6 | ||
|
|
badd7e8c2e | ||
|
|
d7c4380cc2 | ||
|
|
7fc26ab939 | ||
|
|
37f430ddf7 | ||
|
|
f0a2182149 | ||
|
|
9605775f1e | ||
|
|
f251bc20c1 | ||
|
|
a02b3d74b8 | ||
|
|
7f3a4c20b3 | ||
|
|
e76999c611 | ||
|
|
c2771bcb95 | ||
|
|
5b858b5982 | ||
|
|
7082220e29 | ||
|
|
1a87830a52 | ||
|
|
9eff6dcced | ||
|
|
52690c3aa6 | ||
|
|
8f0780c5f6 | ||
|
|
465a7fbe73 | ||
|
|
6b5abfa319 | ||
|
|
39197adebb | ||
|
|
4b1e192705 | ||
|
|
a3fa3d4b82 | ||
|
|
c5ad7a0fb7 | ||
|
|
d17f94c0d6 | ||
|
|
398bff4c15 | ||
|
|
e0655df5f0 | ||
|
|
9174aac64c | ||
|
|
3cdc4c7d97 | ||
|
|
9ce6acc44d | ||
|
|
f170ed726b | ||
|
|
979d6f02a6 | ||
|
|
3fbe80cb1a | ||
|
|
8fdb32273d | ||
|
|
d5c9d8d5b1 | ||
|
|
752c9c234e | ||
|
|
b7b6185ada | ||
|
|
211b886bf3 | ||
|
|
36d1008f29 | ||
|
|
1441625a6b | ||
|
|
3859eb574e | ||
|
|
b4a29214a7 | ||
|
|
0fb5d4f69b | ||
|
|
6ca16a0161 | ||
|
|
e4346687fc | ||
|
|
2f31db2232 | ||
|
|
e0f26923b7 | ||
|
|
52cff9472a | ||
|
|
ed0e0fc65a | ||
|
|
c4935c3128 | ||
|
|
7831421399 | ||
|
|
a059979220 | ||
|
|
09bab5b2aa | ||
|
|
358d2604fb | ||
|
|
bbd0415c92 | ||
|
|
9f553fc6c1 | ||
|
|
51f8bb6ad5 | ||
|
|
cf93c0d544 | ||
|
|
2e6bef608b | ||
|
|
dcba7a5ab7 | ||
|
|
4e3b1eb641 | ||
|
|
6f949ce858 | ||
|
|
a04cd3162a | ||
|
|
8b551159a6 | ||
|
|
05b8621a81 | ||
|
|
1068d3e078 | ||
|
|
c1d6a9563c | ||
|
|
f426b16f1d | ||
|
|
c944fc1ac6 | ||
|
|
c5dcfc57ea | ||
|
|
c68df830a7 | ||
|
|
0432441868 | ||
|
|
dcd0959600 | ||
|
|
7f631174d7 | ||
|
|
379344036f | ||
|
|
9997a5c4b4 | ||
|
|
2b70e5614c | ||
|
|
759f0800cd | ||
|
|
0ed0270d18 | ||
|
|
324658b765 | ||
|
|
478e714a2d | ||
|
|
6005c04e64 | ||
|
|
75f76ae228 | ||
|
|
31a955fed1 | ||
|
|
4f1517e336 | ||
|
|
6772d95d25 | ||
|
|
a29f9d7bce | ||
|
|
2ff6559b5e | ||
|
|
fc6739f640 | ||
|
|
6ff4eef7dc | ||
|
|
82151c3944 | ||
|
|
0af4588a14 | ||
|
|
589c5381e2 | ||
|
|
3c07ca973b | ||
|
|
4539703497 | ||
|
|
b4ef516626 | ||
|
|
2cf2afd321 | ||
|
|
60f3393f3f | ||
|
|
c6a1518e0d | ||
|
|
df9dc8c029 | ||
|
|
51dc606246 | ||
|
|
e816e41df1 | ||
|
|
96a9844fa4 | ||
|
|
8febe77edb | ||
|
|
ef89d8fcd8 | ||
|
|
0253a4dd7a | ||
|
|
5259ea0455 | ||
|
|
bfaf7c8034 | ||
|
|
f637768e3d | ||
|
|
ef867a02d5 | ||
|
|
833e814adf | ||
|
|
2ee84067cc | ||
|
|
790f8347f8 | ||
|
|
09de901b35 | ||
|
|
3bec9c6695 | ||
|
|
e0456939a9 | ||
|
|
620f2153fd | ||
|
|
2f05be31ca | ||
|
|
7210063026 | ||
|
|
94e52f6f82 | ||
|
|
cba0c138b0 | ||
|
|
b748e39877 | ||
|
|
dcf321da8f | ||
|
|
c32bd4d014 | ||
|
|
ab4e2f2540 | ||
|
|
741bfb3316 | ||
|
|
0d311593cc | ||
|
|
a1031f3dc9 | ||
|
|
e753e05c67 | ||
|
|
ed292bcaea | ||
|
|
0013b1cba8 | ||
|
|
ce5df762f6 | ||
|
|
c5543cbd64 | ||
|
|
4929a4a567 | ||
|
|
e4591825c3 | ||
|
|
0152bc2e32 | ||
|
|
e175c44118 | ||
|
|
6d847e4b7d | ||
|
|
ac9d4f49d9 | ||
|
|
26e1145562 | ||
|
|
8417be3b89 | ||
|
|
53a7282c31 | ||
|
|
6d08f227c1 | ||
|
|
6349f12d8e | ||
|
|
052b01ff00 | ||
|
|
c2f1176aca | ||
|
|
36f4e4fe1b | ||
|
|
06fe7568a5 | ||
|
|
637ad2e510 | ||
|
|
64a543ca38 | ||
|
|
dc03f26b20 | ||
|
|
b30ad68975 | ||
|
|
e08ddc4fc4 | ||
|
|
e211095317 | ||
|
|
b9675ef25c | ||
|
|
e25802ab74 | ||
|
|
cc1f40a165 | ||
|
|
c1ce5491f1 | ||
|
|
588a5d4ce1 | ||
|
|
58bd15b3b2 | ||
|
|
88769ec1f2 | ||
|
|
aa790d0511 | ||
|
|
bd0b1bca3d | ||
|
|
2fa0204a20 | ||
|
|
d2d50a4c71 | ||
|
|
e07a5ca019 | ||
|
|
7bcd398438 | ||
|
|
830d30e0de | ||
|
|
fdc9d48bd6 | ||
|
|
21e279224d | ||
|
|
9b2d032c6a | ||
|
|
be76f8a180 | ||
|
|
6b6d9d9ecf | ||
|
|
2af0324ee5 | ||
|
|
8aa4f57a33 | ||
|
|
5f01e1a5d8 | ||
|
|
74dcbc3e17 | ||
|
|
832999850e | ||
|
|
93b0f40c80 | ||
|
|
d1928f5b43 | ||
|
|
c43e6aba4a | ||
|
|
3599dc97cc | ||
|
|
8a5d895f03 | ||
|
|
5374fe251d | ||
|
|
36169db388 | ||
|
|
1900999a74 | ||
|
|
ab16814cd2 | ||
|
|
9f622fcd74 | ||
|
|
956e2c43b8 | ||
|
|
130f87c9f7 | ||
|
|
22b4e8c75f | ||
|
|
c19a3ca444 | ||
|
|
a006eb5dcc | ||
|
|
ed419e7e53 | ||
|
|
26ef75fba7 | ||
|
|
bff2387b4d | ||
|
|
dabc0ae859 | ||
|
|
6184bd850e | ||
|
|
41544efeba | ||
|
|
e6e6c9f7f6 | ||
|
|
22d8e39db3 | ||
|
|
bfdf1e9e6c | ||
|
|
c3fccfde09 | ||
|
|
4bb8d43a6e | ||
|
|
fda4b67776 | ||
|
|
f1ee9d45de | ||
|
|
01f7d13e3f | ||
|
|
d85e30f3a6 | ||
|
|
49d7129950 | ||
|
|
da46d71280 | ||
|
|
e44eb3f77f | ||
|
|
6027934c22 | ||
|
|
4074aa50ce | ||
|
|
608d004a9c | ||
|
|
2e532af5d2 | ||
|
|
b1352db5c5 | ||
|
|
4df6233994 | ||
|
|
515d04c17c | ||
|
|
81c5f9ce24 | ||
|
|
d8cd1a6288 | ||
|
|
0da8243f05 | ||
|
|
2774360d4c | ||
|
|
cb4e331c29 | ||
|
|
18138c8374 | ||
|
|
6280fd5420 | ||
|
|
b25271bf22 | ||
|
|
1b530a511b | ||
|
|
90791097f1 | ||
|
|
0b1c15bca8 | ||
|
|
b490831944 | ||
|
|
d16e22c27d | ||
|
|
892d9e78e9 | ||
|
|
01d2bcdfcf | ||
|
|
8d5e2f5773 | ||
|
|
73029800e4 | ||
|
|
dfeae8031b | ||
|
|
53168aa4cb | ||
|
|
a280fc5930 | ||
|
|
4d6744549c | ||
|
|
1c14f3261d | ||
|
|
6fb38fc70c | ||
|
|
3f04102990 | ||
|
|
28cbc0a6fa | ||
|
|
5c74fabdc6 | ||
|
|
ab53a2cad4 | ||
|
|
14b3e84b77 | ||
|
|
a629a59654 | ||
|
|
d51c91cb5a | ||
|
|
706bf65664 | ||
|
|
6394c6d686 | ||
|
|
145a8904c2 | ||
|
|
eba400a6ec | ||
|
|
12626e2d26 | ||
|
|
c044ff6d8b | ||
|
|
33465b1d9e | ||
|
|
dbea41cbf4 | ||
|
|
8cab5b17f7 | ||
|
|
3c86d13b44 | ||
|
|
a9a4cc8788 | ||
|
|
a512a99fb2 | ||
|
|
03a63e8310 | ||
|
|
0261df0f06 | ||
|
|
a035ee7856 | ||
|
|
6cf94307d3 | ||
|
|
98bd827862 | ||
|
|
86b49d5b1b | ||
|
|
a51f1e5ff9 | ||
|
|
3307bedf08 | ||
|
|
4bf3bf07e4 | ||
|
|
9c0647d656 | ||
|
|
3b53035935 | ||
|
|
22730cd452 | ||
|
|
da8d495a30 | ||
|
|
6ea5a1f7ce | ||
|
|
5757b9c69e | ||
|
|
3533181c91 | ||
|
|
cb9cd76a15 | ||
|
|
6effa13dfb | ||
|
|
5e78f89935 | ||
|
|
5a5442f666 | ||
|
|
6d119dd9d4 | ||
|
|
32bd21eb04 | ||
|
|
8d495a4be0 | ||
|
|
d7069904c7 | ||
|
|
3d48324a43 | ||
|
|
143dedaa06 | ||
|
|
b8fe170f19 | ||
|
|
a02261fcac | ||
|
|
996bf3f929 | ||
|
|
8449aff799 | ||
|
|
80df79f93a | ||
|
|
897419a0b6 | ||
|
|
255dd5d974 | ||
|
|
c45085a520 | ||
|
|
16bc881110 | ||
|
|
0086d30755 | ||
|
|
1170a61b81 | ||
|
|
066013a9bd | ||
|
|
931e0b2613 | ||
|
|
f49409e021 | ||
|
|
29eeebd178 | ||
|
|
50447b6d77 | ||
|
|
0b977cce84 | ||
|
|
02f62896b0 | ||
|
|
1535ba5cb5 | ||
|
|
baccb9a9a1 | ||
|
|
50454ac2db | ||
|
|
574c9eb36b | ||
|
|
bc75d3331f | ||
|
|
950e683b45 | ||
|
|
a010d97e51 | ||
|
|
bdb9a7e396 |
@@ -0,0 +1,21 @@
|
|||||||
|
### Additions
|
||||||
|
- Added ability to rename PC Boxes by clicking on the name of a box.
|
||||||
|
- Added box options buttons for boxes, toggleable by clicking the right icon button in the bottom bar.
|
||||||
|
- The button on the right allows for changing the box wallpaper.
|
||||||
|
- The option buttons on the left side allow for sorting the box by name, level, Pokédex number, gender, and type. Shift clicking allows for sorting in reverse order.
|
||||||
|
- Added filter functionality in PC UI, which supports `PokemonProperties` (e.g. `shiny=yes` shows all shiny Pokémon).
|
||||||
|
- Added `/changewallpaper <player> <boxNumber> <wallpaper>` command to change a box wallpaper through commands.
|
||||||
|
- Added `/renamebox <player> <boxNumber> <name>` command to rename a PC box through commands.
|
||||||
|
|
||||||
|
### Developer
|
||||||
|
- Added `RenamePCBoxEvent.Pre` and `RenamePCBoxEvent.Post` events to prevent players from renaming a box or changing their input.
|
||||||
|
- Added `ChangePCBoxWallpaperEvent.Pre` and `ChangePCBoxWallpaperEvent.Post` to prevent players from changing wallpapers or changing their selection.
|
||||||
|
- Added `WallpaperCollectionEvent` which gets called when clients connect to a server, allowing the server to handle which of the client-found wallpapers it's allowed to move (collected wallpapers can be removed for example to make it "vanish" client-side).
|
||||||
|
- Added `WallpaperUnlockedEvent`.
|
||||||
|
- Renamed `SetPCBoxPokemonPacket` and the respective handler to `SetPCBoxPacket`.
|
||||||
|
|
||||||
|
### Addons
|
||||||
|
- Added Flows for `player_tick_pre`, `player_tick_post`, `advancement_earned`, `right_clicked_entity`, `right_clicked_block`, `player_died`, `wallpaper_unlocked`.
|
||||||
|
- Flows now have `q.` for any context properties in addition to the `c.` properties, making it a bit more convenient when calling other scripts from Flows.
|
||||||
|
- Added `unlockable_pc_box_wallpapers` datapack folder for wallpapers that need to be unlocked before they're usable.
|
||||||
|
- Wallpapers are loaded from `assets/<namespace>/textures/gui/pc/wallpaper/` and all wallpapers in this folder are available to the client to choose by default.
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
### Additions
|
||||||
|
|
||||||
|
- Added the ability to ride Pokémon by shift-right clicking and selecting the ride option.
|
||||||
|
- Added /calculateseatpositions command for approximating hitbox locations for riding configurations.
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
|
||||||
|
### Additions
|
||||||
|
- Added support for NPCs to use Pokémon models and vice versa. This will require changes in addons that add fossil types due to naming conflicts between fossils and the Pokémon species.
|
||||||
|
- Added `/changejointscale` command to change the scale of a joint in a model. Unbelievably funny.
|
||||||
|
|
||||||
|
### Developer
|
||||||
|
- Removed all VaryingModelRepository subclasses into the parent class.
|
||||||
|
|
||||||
|
### Addons
|
||||||
|
- Added `transformedParts` to the root of poser JSONs so it now exists in both poses and the model overall.
|
||||||
+91
-2
@@ -1,4 +1,77 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
## [1.7.0 (Month xth, 2025)](#1-7-0)
|
||||||
|
|
||||||
|
### Additions
|
||||||
|
- Added an in-game configuration screen, allowing all settings from `main.json` to be edited directly in-game.
|
||||||
|
- Added `/cobblemonconfig reload` command to reload `main.json` configuration. **Note:** Some settings require a server restart to take effect; use this command cautiously.
|
||||||
|
- Added `blacklisted_items_to_hold` and `whitelisted_items_to_hold` tags to allow for controlling which items players can give to their Pokémon. If the whitelist is empty, it will consider all item as allowed (unless they are in the blacklist).
|
||||||
|
- Pokémon now follow the mouse cursor on the Summary screen, with an option to disable this in the settings.
|
||||||
|
- Pokémon's held items can now be rendered, with a visibility toggle in the Summary screen.
|
||||||
|
- Added cosmetic item functionality for Pokémon. Certain cosmetic items can be given to applicable Pokémon via the interact menu.
|
||||||
|
- Added the various log blocks as cosmetic items for Timburr and Komala.
|
||||||
|
- Added `visibility/hidden`, `visibility/hat` and `visibility/face` tags to control where and how certain items are rendered.
|
||||||
|
|
||||||
|
### Changes
|
||||||
|
- Renamed `chargeGainedPerTick` config to `secondsToChargeHealingMachine`.
|
||||||
|
- Made Blocks of Gold count as Big Nuggets when held by a Pokémon (for Fling functionality)
|
||||||
|
- Substantially optimised spawning checks mainly by front-loading biome filtering.
|
||||||
|
- When using the `cobblemon` or `generation_9` capture calculators a critical capture with a single shake will always play for successful captures when you've already registered the Pokémon as caught in your Pokédex.
|
||||||
|
- Improved the performance of saving Pokédex and player data.
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
- Fixed Particles sometimes facing the wrong direction (looking at you, Swords Dance)
|
||||||
|
- Fixed PCs always opening at box 2 instead of box 1.
|
||||||
|
- Fixed not being able to do complex item requirements aside from just NBT with evolution conditions, requirements and fossil items.
|
||||||
|
- Fixed the usage `hiddenability` in `pokegive` or other spawn commands resulting in a forced hidden ability
|
||||||
|
- Fixed the consumption of friendship berries (or EV berries) not making any noise
|
||||||
|
- Fixed Instantly breaking and replacing a fossil analyzer with any block entity crashing the game in a complete multi-structure
|
||||||
|
- Fixed players getting disconnected when sidemods update a Pokémon's teratype
|
||||||
|
- Fixed fling not using Item Names for minecraft held items that substitute Pokémon items
|
||||||
|
- Fixed evolutions sometimes preventing players from logging in to servers
|
||||||
|
- Fixed rendering of shoulder-mounted Pokémon desyncing between clients
|
||||||
|
- Fixed apricorn chest boats forgetting their inventories when being unloaded
|
||||||
|
- Fixed moves not updating correctly between form changes resulting in illegal movesets
|
||||||
|
- Fixed crash sometimes occurring with the "Oritech" mod
|
||||||
|
- Fixed crashes due to an incorrect Java version handing out an obscure crash.
|
||||||
|
- Fixed some berries being able to rarely get too many berries and cause a crash.
|
||||||
|
- Fixed status curing berries not playing the berry eating sound, same for healing berries used mid-battle.
|
||||||
|
- Fixed owned Pokémon sometimes being un-interactable after the player relogs fast
|
||||||
|
- Fixed field name in evolution requirements for Spewpa Pokeball.
|
||||||
|
- Fixed LevelUpCriterion logic to correctly check that the Pokémon is a preEvo.
|
||||||
|
- Fixed `hide_additional_tooltip` vanilla flag not properly hiding tooltips on pokerod and bait items
|
||||||
|
- Fixed NPCs using Pokémon outside of their pool when a Pokémon name had a typo.
|
||||||
|
- Fixed an issue with datapacked species features not being applied properly when relogging.
|
||||||
|
- Fixed Pokémon marked as silent still playing shiny sounds and effects.
|
||||||
|
- Fixed an issue with newer versions of Fabric API where underground Pokémon were spawning in The End.
|
||||||
|
- Fixed spawning not working well when you're at high points surrounded by lower altitude spawning areas, such as flying.
|
||||||
|
|
||||||
|
### Developer
|
||||||
|
- A finished battle now has winners and losers set inside of `PokemonBattle` instead of them always being empty.
|
||||||
|
- Dialogues are correctly removed from memory when they are stopped.
|
||||||
|
- Dialogues with variably-set initial pages now properly start timeout tracking.
|
||||||
|
- Added `EvGainedEvent.Pre` and `EvGainedEvent.Post`.
|
||||||
|
- Deprecated `EVs#add(Stat, Int)`, you will not be able to compile against this code please migrate to the `EVs#add(Stat, Int, EvSource)` you most likely want to use `SidemodEvSource` but please check other implementations or make your own.
|
||||||
|
- Removed the NbtItemPredicate class, all the mod usages now use the vanilla item predicate solution, this causes breaking changes on Fossil, HeldItemRequirement & ItemInteractionEvolution
|
||||||
|
- Renamed Cobblemon's creative tabs to start with "Cobblemon: " to distinguish Cobblemon's tabs from tabs for other mods.
|
||||||
|
- Various items now have a rarity value.
|
||||||
|
- Reworked observable handling in `Pokemon.kt` to cut down on RAM usage and clarify the file.
|
||||||
|
- Note: This will break mods that used our observable functionality there or in MoveSet, IVs, EVs, or BenchedMoves.
|
||||||
|
- Using `Pokemon#onChange()` is now the way to mark a Pokémon as needing a save.
|
||||||
|
- Using `[Pokemon].changeObservable` is now the way to get an `Observable` for any save-worthy changes.
|
||||||
|
- Updated NPCEntity beam positioning to properly account for the baseScale property.
|
||||||
|
- Updated NPCEntity pokeball throw positioning to properly account for the baseScale property.
|
||||||
|
- Fixed `[Pokemon].copyFrom` error causing forms, IVs, and EVs to not be applied properly when using `[Pokemon].loadFromJSON` or `[Pokemon].loadFromNBT`
|
||||||
|
|
||||||
|
### MoLang & Datapacks
|
||||||
|
- The following usages for item predicates can now use item conditions like advancements do, you can learn about them in the [Minecraft wiki](https://minecraft.wiki/w/Advancement_definition#minecraft:filled_bucket)
|
||||||
|
- The `requiredContext` for an item interaction evolution
|
||||||
|
- The `itemCondition` for a held item evolution requirement
|
||||||
|
- The `fossils` for a fossil entry
|
||||||
|
- Added MoLang flows for `poke_ball_capture_calculated`, `evolution_tested`, `evolution_accepted`, `evolution_completed`
|
||||||
|
- Added `interpolate` boolean property to animated textures to allow gradual colour changes between frames.
|
||||||
|
- Fixed species additions not being capable of changing implemented status.
|
||||||
|
- Added support for action effects that are triggered by `|-activate|` Showdown instructions. `activate_{effect_id}` is the syntax.
|
||||||
|
|
||||||
## [1.6.1 (January 26th, 2025)](#1-6-1)
|
## [1.6.1 (January 26th, 2025)](#1-6-1)
|
||||||
|
|
||||||
### Additions
|
### Additions
|
||||||
@@ -12,6 +85,22 @@
|
|||||||
- Added config setting `maxPokedexScanningDetectionRange` to control from what distance the player can scan Pokémon using the Pokédex.
|
- Added config setting `maxPokedexScanningDetectionRange` to control from what distance the player can scan Pokémon using the Pokédex.
|
||||||
- Added config setting `hideUnimplementedPokemonInThePokedex` which hides unimplemented Pokémon from the Pokédex when set to true.
|
- Added config setting `hideUnimplementedPokemonInThePokedex` which hides unimplemented Pokémon from the Pokédex when set to true.
|
||||||
- Added debug renderer for posable entity locators.
|
- Added debug renderer for posable entity locators.
|
||||||
|
- Added crossover paintings from Close Combat, Premonition, Altar, Slumber, and Nomad.
|
||||||
|
- Added optional box argument to the /pc command
|
||||||
|
|
||||||
|
### Changes
|
||||||
|
- Pokémon will now be dynamically revealed to the Pokédex as they're seen instead of revealing entire parties at the end of battle regardless.
|
||||||
|
- Unseen wild Pokémon will update their name from '???' to their real name as soon as a battle starts to reflect the battle UI showing the actual species name.
|
||||||
|
- Pokémon under the illusion effect will reveal their disguise to the Pokédex first and then the base Pokémon once the disguise is broken.
|
||||||
|
- Added more support for a variety of Fabric/NeoForge Convention tags.
|
||||||
|
- Reformatted some tags to be more consistent.
|
||||||
|
- Edited some recipes to utilize tags instead of direct item ids, for greater mod compatibility.
|
||||||
|
- Berries will drop if broken at age 0
|
||||||
|
- Improved Fortune drops on Mint Seeds
|
||||||
|
- New Slowpoke shiny texture.
|
||||||
|
- Updated drops for many Pokémon.
|
||||||
|
- Completely resynced Pokémon move and stat data based on later games. Learnsets have changed considerably to maximise available moves.
|
||||||
|
- Cobblemon save data now saves .old files where applicable as a means to recover from file corruption due to crashes or similar abrupt stops
|
||||||
|
|
||||||
### Pokémon Added
|
### Pokémon Added
|
||||||
|
|
||||||
@@ -175,7 +264,7 @@
|
|||||||
- Added `hideNameTag` field and `HideNPCNameTag` nbt tag to `NPCEntity` to allow hiding the name tag of the NPC.
|
- Added `hideNameTag` field and `HideNPCNameTag` nbt tag to `NPCEntity` to allow hiding the name tag of the NPC.
|
||||||
- Added the player to `PokerodReelEvent` so you know who is doing the reeling.
|
- Added the player to `PokerodReelEvent` so you know who is doing the reeling.
|
||||||
|
|
||||||
### MoLang & Datapacks
|
### MoLang & Datapacks
|
||||||
- Added flows for:
|
- Added flows for:
|
||||||
- `forme_change`: Triggered when a Pokémon changes form in battle.
|
- `forme_change`: Triggered when a Pokémon changes form in battle.
|
||||||
- `mega_evolution`: Triggered when a Pokémon mega evolves in battle. (Note: Third-party mods are required for this feature currently)
|
- `mega_evolution`: Triggered when a Pokémon mega evolves in battle. (Note: Third-party mods are required for this feature currently)
|
||||||
@@ -2102,4 +2191,4 @@ Thank you so much to all of our community translators that bring the mod to the
|
|||||||
- Added species, ability, and move translations for `ko_ko`, `jp_jp`, `fr_fr`, `es_es`, `it_it`, and `zh_cn`.
|
- Added species, ability, and move translations for `ko_ko`, `jp_jp`, `fr_fr`, `es_es`, `it_it`, and `zh_cn`.
|
||||||
|
|
||||||
## [1.0.0 (November 12th, 2022)](#1-0-0)
|
## [1.0.0 (November 12th, 2022)](#1-0-0)
|
||||||
- Initial release.
|
- Initial release.
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Cobblemon
|
# Cobblemon
|
||||||
|
|
||||||
An open-source Pokémon mod for Minecraft Java Edition, written in Kotlin for Fabric and Forge.
|
An open-source Pokémon mod for Minecraft Java Edition, written in Kotlin for Fabric and NeoForge.
|
||||||
|
|
||||||
## Getting started
|
## Getting started
|
||||||
|
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ dependencies {
|
|||||||
|
|
||||||
// Integrations
|
// Integrations
|
||||||
compileOnlyApi(libs.jei.api)
|
compileOnlyApi(libs.jei.api)
|
||||||
modCompileOnly(libs.bundles.fabric.integrations.compileOnly) {
|
modCompileOnly(libs.bundles.common.integrations.compileOnly) {
|
||||||
isTransitive = false
|
isTransitive = false
|
||||||
}
|
}
|
||||||
// Flywheel has no common dep so just pick one and don't use any platform specific code in common
|
// Flywheel has no common dep so just pick one and don't use any platform specific code in common
|
||||||
|
|||||||
@@ -0,0 +1,143 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Cobblemon Contributors
|
||||||
|
*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.cobblemon.mod.common;
|
||||||
|
|
||||||
|
import net.minecraft.util.Mth;
|
||||||
|
import net.minecraft.util.SmoothDouble;
|
||||||
|
import net.minecraft.world.entity.player.Player;
|
||||||
|
import net.minecraft.world.phys.Vec3;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
import org.joml.Matrix3f;
|
||||||
|
import org.joml.Vector3f;
|
||||||
|
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
public interface Rollable {
|
||||||
|
|
||||||
|
// From Minecraft's Camera
|
||||||
|
Vector3f FORWARDS = new Vector3f(0.0F, 0.0F, -1.0F);
|
||||||
|
Vector3f UP = new Vector3f(0.0F, 1.0F, 0.0F);
|
||||||
|
Vector3f LEFT = new Vector3f(-1.0F, 0.0F, 0.0F);
|
||||||
|
|
||||||
|
@Nullable Matrix3f getOrientation();
|
||||||
|
|
||||||
|
Rollable updateOrientation(Function<Matrix3f, Matrix3f> update);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The forward vector (0, 0, -1) after the rotation matrix is applied.
|
||||||
|
*/
|
||||||
|
default Vector3f getForwardVector() {
|
||||||
|
if (getOrientation() == null) return new Vector3f(FORWARDS);
|
||||||
|
return getOrientation().transform(FORWARDS, new Vector3f());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The left vector (-1, 0, 0) after the rotation matrix is applied.
|
||||||
|
*/
|
||||||
|
default Vector3f getLeftVector() {
|
||||||
|
if (getOrientation() == null) return new Vector3f(LEFT);
|
||||||
|
return getOrientation().transform(LEFT, new Vector3f());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The up vector (0, 1, 0) after the rotation matrix is applied.
|
||||||
|
*/
|
||||||
|
default Vector3f getUpVector() {
|
||||||
|
if (getOrientation() == null) return new Vector3f(UP);
|
||||||
|
return getOrientation().transform(UP, new Vector3f());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param yaw change in degrees
|
||||||
|
* @return The Rollable object this method was called on
|
||||||
|
*/
|
||||||
|
|
||||||
|
default Rollable rotateYaw(float yaw) {
|
||||||
|
return updateOrientation(prev -> prev.rotateY((float) Math.toRadians(-yaw)));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param pitch change in degrees
|
||||||
|
* @return The Rollable object this method was called on
|
||||||
|
*/
|
||||||
|
|
||||||
|
default Rollable rotatePitch(float pitch) {
|
||||||
|
return updateOrientation(prev -> prev.rotateX((float) Math.toRadians(-pitch)));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param roll change in degrees
|
||||||
|
* @return The Rollable object this method was called on
|
||||||
|
*/
|
||||||
|
default Rollable rotateRoll(float roll) {
|
||||||
|
return updateOrientation(prev -> prev.rotateZ((float) Math.toRadians(-roll)));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Order matters when rotating an object. If you need a different order, individually call rotateYaw, rotatePitch, and rotateRoll
|
||||||
|
*
|
||||||
|
* @param yaw change in degrees
|
||||||
|
* @param pitch change in degrees
|
||||||
|
* @param roll change in degrees
|
||||||
|
* @return The Rollable object this method was called on
|
||||||
|
*/
|
||||||
|
default Rollable rotate(float yaw, float pitch, float roll) {
|
||||||
|
return rotateYaw(yaw).rotatePitch(pitch).rotateRoll(roll);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The pitch angle in degrees as a float.
|
||||||
|
* Value is between [-180, 180] with 0 being South, 90 being West, 180/-180 being North, and -90 being East
|
||||||
|
*/
|
||||||
|
default float getYaw() {
|
||||||
|
return (float) Mth.wrapDegrees(-Math.toDegrees(FORWARDS.angleSigned(getForwardVector(), UP)) + 180);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The yaw angle in degrees as a float.
|
||||||
|
* Value is between [-90, 90] with 0 being straight forward, 90 being straight down, and -90 being straight up
|
||||||
|
*/
|
||||||
|
default float getPitch() {
|
||||||
|
return (float) Mth.wrapDegrees(-Math.toDegrees(Math.asin(getForwardVector().y)));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The roll angle in degrees as a float.
|
||||||
|
* Value is between [-180, 180] with 0 being no roll (normal), 90 being 90 degrees CW, 180/-180 being 180 degrees CW/CCW, and -90 being 90 degrees CCW
|
||||||
|
*/
|
||||||
|
default float getRoll() {
|
||||||
|
//Cobblemon.LOGGER.info("{}", (float) Math.toDegrees(getUpVector().angleSigned(UP, getForwardVector())));
|
||||||
|
return (float) Mth.wrapDegrees(-Math.toDegrees(getUpVector().angleSigned(UP, getForwardVector())));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the angular velocity in degrees per second as a Vec3
|
||||||
|
*/
|
||||||
|
Vec3 angRollVel( double deltaTime );
|
||||||
|
|
||||||
|
public Vec3 rotationOnMouseXY(
|
||||||
|
double yMouse,
|
||||||
|
double xMouse,
|
||||||
|
SmoothDouble yMouseSmoother,
|
||||||
|
SmoothDouble xMouseSmoother,
|
||||||
|
double sensitivity,
|
||||||
|
double deltaTime
|
||||||
|
);
|
||||||
|
|
||||||
|
boolean shouldRoll();
|
||||||
|
|
||||||
|
boolean useAngVelSmoothing();
|
||||||
|
|
||||||
|
void clearRotation();
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Cobblemon Contributors
|
||||||
|
*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.cobblemon.mod.common.mixin;
|
||||||
|
|
||||||
|
import net.minecraft.client.player.LocalPlayer;
|
||||||
|
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||||
|
|
||||||
|
@Mixin(LocalPlayer.class)
|
||||||
|
public abstract class LocalPlayerMixin {
|
||||||
|
@Shadow
|
||||||
|
private float jumpRidingScale;
|
||||||
|
|
||||||
|
@Inject(method = "getJumpRidingScale", at = @At("HEAD"), cancellable = true)
|
||||||
|
public void modifyJumpRidingScale(CallbackInfoReturnable<Float> cir) {
|
||||||
|
|
||||||
|
LocalPlayer player = (LocalPlayer) (Object) this;
|
||||||
|
if (player.isPassenger() && player.getVehicle() instanceof PokemonEntity) {
|
||||||
|
PokemonEntity ride = (PokemonEntity) player.getVehicle();
|
||||||
|
|
||||||
|
//Use custom jump bar logic if the current ride does not jump using it.
|
||||||
|
if( !ride.getRiding().canJump(ride, player))
|
||||||
|
{
|
||||||
|
cir.setReturnValue(ride.setRideBar());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Cobblemon Contributors
|
||||||
|
*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.cobblemon.mod.common.mixin;
|
||||||
|
|
||||||
|
import com.cobblemon.mod.common.platform.events.PlatformEvents;
|
||||||
|
import com.cobblemon.mod.common.platform.events.ServerPlayerEvent;
|
||||||
|
import net.minecraft.advancements.AdvancementHolder;
|
||||||
|
import net.minecraft.server.PlayerAdvancements;
|
||||||
|
import net.minecraft.server.level.ServerPlayer;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||||
|
|
||||||
|
@Mixin(PlayerAdvancements.class)
|
||||||
|
public class PlayerAdvancementsMixin {
|
||||||
|
@Shadow private ServerPlayer player;
|
||||||
|
|
||||||
|
@Inject(method = "award", at = @At(value = "INVOKE", target = "Lnet/minecraft/advancements/AdvancementRewards;grant(Lnet/minecraft/server/level/ServerPlayer;)V"))
|
||||||
|
private void cobblemon$award(AdvancementHolder advancement, String criterionKey, CallbackInfoReturnable<Boolean> cir) {
|
||||||
|
PlatformEvents.SERVER_PLAYER_ADVANCEMENT_EARNED.emit(new ServerPlayerEvent.AdvancementEarned(player, advancement));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -10,12 +10,15 @@ package com.cobblemon.mod.common.mixin;
|
|||||||
|
|
||||||
import com.cobblemon.mod.common.Cobblemon;
|
import com.cobblemon.mod.common.Cobblemon;
|
||||||
import com.cobblemon.mod.common.CobblemonItems;
|
import com.cobblemon.mod.common.CobblemonItems;
|
||||||
|
import com.cobblemon.mod.common.Rollable;
|
||||||
import com.cobblemon.mod.common.api.events.CobblemonEvents;
|
import com.cobblemon.mod.common.api.events.CobblemonEvents;
|
||||||
import com.cobblemon.mod.common.api.events.item.LeftoversCreatedEvent;
|
import com.cobblemon.mod.common.api.events.item.LeftoversCreatedEvent;
|
||||||
import com.cobblemon.mod.common.api.pokemon.PokemonSpecies;
|
import com.cobblemon.mod.common.api.pokemon.PokemonSpecies;
|
||||||
|
import com.cobblemon.mod.common.api.riding.Rideable;
|
||||||
import com.cobblemon.mod.common.api.storage.party.PartyStore;
|
import com.cobblemon.mod.common.api.storage.party.PartyStore;
|
||||||
import com.cobblemon.mod.common.api.storage.party.PlayerPartyStore;
|
import com.cobblemon.mod.common.api.storage.party.PlayerPartyStore;
|
||||||
import com.cobblemon.mod.common.api.tags.CobblemonItemTags;
|
import com.cobblemon.mod.common.api.tags.CobblemonItemTags;
|
||||||
|
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity;
|
||||||
import com.cobblemon.mod.common.pokedex.scanner.PokedexEntityData;
|
import com.cobblemon.mod.common.pokedex.scanner.PokedexEntityData;
|
||||||
import com.cobblemon.mod.common.pokedex.scanner.ScannableEntity;
|
import com.cobblemon.mod.common.pokedex.scanner.ScannableEntity;
|
||||||
import com.cobblemon.mod.common.pokemon.FormData;
|
import com.cobblemon.mod.common.pokemon.FormData;
|
||||||
@@ -26,11 +29,16 @@ import com.cobblemon.mod.common.util.CompoundTagExtensionsKt;
|
|||||||
import com.cobblemon.mod.common.util.CompoundTagUtilities;
|
import com.cobblemon.mod.common.util.CompoundTagUtilities;
|
||||||
import com.cobblemon.mod.common.util.DataKeys;
|
import com.cobblemon.mod.common.util.DataKeys;
|
||||||
import com.cobblemon.mod.common.world.gamerules.CobblemonGameRules;
|
import com.cobblemon.mod.common.world.gamerules.CobblemonGameRules;
|
||||||
|
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
|
||||||
|
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
|
||||||
|
import net.minecraft.client.Minecraft;
|
||||||
|
import net.minecraft.client.player.LocalPlayer;
|
||||||
import net.minecraft.nbt.CompoundTag;
|
import net.minecraft.nbt.CompoundTag;
|
||||||
import net.minecraft.nbt.Tag;
|
import net.minecraft.nbt.Tag;
|
||||||
import net.minecraft.network.chat.Component;
|
import net.minecraft.network.chat.Component;
|
||||||
import net.minecraft.resources.ResourceLocation;
|
import net.minecraft.resources.ResourceLocation;
|
||||||
import net.minecraft.server.level.ServerPlayer;
|
import net.minecraft.server.level.ServerPlayer;
|
||||||
|
import net.minecraft.util.SmoothDouble;
|
||||||
import net.minecraft.world.damagesource.DamageSource;
|
import net.minecraft.world.damagesource.DamageSource;
|
||||||
import net.minecraft.world.entity.EntityType;
|
import net.minecraft.world.entity.EntityType;
|
||||||
import net.minecraft.world.entity.LivingEntity;
|
import net.minecraft.world.entity.LivingEntity;
|
||||||
@@ -38,14 +46,18 @@ import net.minecraft.world.entity.item.ItemEntity;
|
|||||||
import net.minecraft.world.entity.player.Player;
|
import net.minecraft.world.entity.player.Player;
|
||||||
import net.minecraft.world.food.FoodProperties;
|
import net.minecraft.world.food.FoodProperties;
|
||||||
import net.minecraft.world.item.ItemStack;
|
import net.minecraft.world.item.ItemStack;
|
||||||
|
import net.minecraft.world.item.Items;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
|
import net.minecraft.world.phys.Vec3;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
import org.joml.Matrix3f;
|
||||||
import org.objectweb.asm.Opcodes;
|
import org.objectweb.asm.Opcodes;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
import org.spongepowered.asm.mixin.Unique;
|
import org.spongepowered.asm.mixin.Unique;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
|
import org.spongepowered.asm.mixin.injection.ModifyArg;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||||
|
|
||||||
@@ -53,10 +65,11 @@ import java.util.List;
|
|||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
import java.util.function.Function;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Mixin(Player.class)
|
@Mixin(Player.class)
|
||||||
public abstract class PlayerMixin extends LivingEntity implements ScannableEntity {
|
public abstract class PlayerMixin extends LivingEntity implements Rollable, ScannableEntity {
|
||||||
|
|
||||||
@Shadow public abstract CompoundTag getShoulderEntityLeft();
|
@Shadow public abstract CompoundTag getShoulderEntityLeft();
|
||||||
|
|
||||||
@@ -74,6 +87,7 @@ public abstract class PlayerMixin extends LivingEntity implements ScannableEntit
|
|||||||
|
|
||||||
@Shadow public abstract void displayClientMessage(Component message, boolean overlay);
|
@Shadow public abstract void displayClientMessage(Component message, boolean overlay);
|
||||||
|
|
||||||
|
@Unique private Matrix3f orientation = null;
|
||||||
|
|
||||||
protected PlayerMixin(EntityType<? extends LivingEntity> p_20966_, Level p_20967_) {
|
protected PlayerMixin(EntityType<? extends LivingEntity> p_20966_, Level p_20967_) {
|
||||||
super(p_20966_, p_20967_);
|
super(p_20966_, p_20967_);
|
||||||
@@ -167,8 +181,7 @@ public abstract class PlayerMixin extends LivingEntity implements ScannableEntit
|
|||||||
|
|
||||||
@Inject(method = "isInvulnerableTo", at = @At("HEAD"), cancellable = true)
|
@Inject(method = "isInvulnerableTo", at = @At("HEAD"), cancellable = true)
|
||||||
public void isInvulnerableTo(DamageSource source, CallbackInfoReturnable<Boolean> ci) {
|
public void isInvulnerableTo(DamageSource source, CallbackInfoReturnable<Boolean> ci) {
|
||||||
if (!level().isClientSide) {
|
if (!level().isClientSide && (Object) this instanceof ServerPlayer player) {
|
||||||
ServerPlayer player = (ServerPlayer)(Object)this;
|
|
||||||
boolean invulnerableInBattle = this.level().getGameRules().getBoolean(CobblemonGameRules.BATTLE_INVULNERABILITY);
|
boolean invulnerableInBattle = this.level().getGameRules().getBoolean(CobblemonGameRules.BATTLE_INVULNERABILITY);
|
||||||
boolean inBattle = Cobblemon.INSTANCE.getBattleRegistry().getBattleByParticipatingPlayer(player) != null;
|
boolean inBattle = Cobblemon.INSTANCE.getBattleRegistry().getBattleByParticipatingPlayer(player) != null;
|
||||||
if (invulnerableInBattle && inBattle) {
|
if (invulnerableInBattle && inBattle) {
|
||||||
@@ -225,4 +238,136 @@ public abstract class PlayerMixin extends LivingEntity implements ScannableEntit
|
|||||||
public LivingEntity resolveEntityScan() {
|
public LivingEntity resolveEntityScan() {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
@Override
|
||||||
|
public void absMoveTo(double x, double y, double z, float yaw, float pitch) {
|
||||||
|
if (shouldRoll()) {
|
||||||
|
this.absMoveTo(x, y, z);
|
||||||
|
this.setYRot(yaw % 360.0f);
|
||||||
|
this.setXRot(pitch % 360.0f);
|
||||||
|
this.yRotO = this.getYRot();
|
||||||
|
this.xRotO = this.getXRot();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.absMoveTo(x, y, z);
|
||||||
|
this.absRotateTo(yaw, pitch);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Inject(method = "tick", at = @At("HEAD"))
|
||||||
|
public void tick(CallbackInfo ci) {
|
||||||
|
if (this.shouldRoll()) {
|
||||||
|
// Proof of concept for yaw movement
|
||||||
|
if (this.getMainHandItem().is(Items.STICK)) {
|
||||||
|
this.rotateYaw(2);
|
||||||
|
}
|
||||||
|
else if (this.getMainHandItem().is(Items.BLAZE_ROD)) {
|
||||||
|
this.rotateYaw(-2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Matrix3f getOrientation() {
|
||||||
|
return orientation;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Rollable updateOrientation(Function<Matrix3f, Matrix3f> update) {
|
||||||
|
//Disabled to allow non mouse inputs to modify roll
|
||||||
|
if (!shouldRoll()) return this;
|
||||||
|
|
||||||
|
if (this.orientation == null) {
|
||||||
|
this.orientation = new Matrix3f();
|
||||||
|
this.rotate(getYRot() - 180, getXRot(), 0);
|
||||||
|
}
|
||||||
|
this.orientation = update.apply(this.orientation);
|
||||||
|
setYRot(this.getYaw());
|
||||||
|
setXRot(this.getPitch());
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean shouldRoll() {
|
||||||
|
LocalPlayer player = Minecraft.getInstance().player;
|
||||||
|
if (!this.equals(player)) return false;
|
||||||
|
if (player.isHolding(Items.DIAMOND)) return true;
|
||||||
|
|
||||||
|
var playerVehicle = player.getVehicle();
|
||||||
|
if (playerVehicle == null) return false;
|
||||||
|
if (!(playerVehicle instanceof PokemonEntity pokemonEntity)) return false;
|
||||||
|
|
||||||
|
return pokemonEntity.getRiding().shouldRoll(pokemonEntity);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Vec3 rotationOnMouseXY(
|
||||||
|
double yMouse,
|
||||||
|
double xMouse,
|
||||||
|
SmoothDouble yMouseSmoother,
|
||||||
|
SmoothDouble xMouseSmoother,
|
||||||
|
double sensitivity,
|
||||||
|
double deltaTime
|
||||||
|
) {
|
||||||
|
LocalPlayer player = Minecraft.getInstance().player;
|
||||||
|
if (!this.equals(player)) return Vec3.ZERO;
|
||||||
|
|
||||||
|
var playerVehicle = player.getVehicle();
|
||||||
|
if (playerVehicle == null) return Vec3.ZERO;
|
||||||
|
if (!(playerVehicle instanceof PokemonEntity pokemonEntity)) return Vec3.ZERO;
|
||||||
|
|
||||||
|
return pokemonEntity.getRiding().rotationOnMouseXY(
|
||||||
|
pokemonEntity,
|
||||||
|
player,
|
||||||
|
yMouse,
|
||||||
|
xMouse,
|
||||||
|
yMouseSmoother,
|
||||||
|
xMouseSmoother,
|
||||||
|
sensitivity,
|
||||||
|
deltaTime
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean useAngVelSmoothing() {
|
||||||
|
LocalPlayer player = Minecraft.getInstance().player;
|
||||||
|
if (!this.equals(player)) return true;
|
||||||
|
|
||||||
|
var playerVehicle = player.getVehicle();
|
||||||
|
if (playerVehicle == null) return true;
|
||||||
|
if (!(playerVehicle instanceof PokemonEntity pokemonEntity)) return true;
|
||||||
|
|
||||||
|
return pokemonEntity.getRiding().useAngVelSmoothing(pokemonEntity);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Vec3 angRollVel( double deltaTime ) {
|
||||||
|
var ret = new Vec3(0.0, 0.0, 0.0);
|
||||||
|
LocalPlayer player = Minecraft.getInstance().player;
|
||||||
|
if (!this.equals(player)) return ret;
|
||||||
|
|
||||||
|
var playerVehicle = player.getVehicle();
|
||||||
|
if (playerVehicle == null) return ret;
|
||||||
|
if (!(playerVehicle instanceof PokemonEntity pokemonEntity)) return ret;
|
||||||
|
|
||||||
|
return pokemonEntity.getRiding().angRollVel( pokemonEntity, player, deltaTime );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void clearRotation() {
|
||||||
|
this.orientation = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@WrapOperation(
|
||||||
|
method = "rideTick()V",
|
||||||
|
at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Player;wantsToStopRiding()Z")
|
||||||
|
)
|
||||||
|
public boolean delegateDismountToController(Player instance, Operation<Boolean> original) {
|
||||||
|
if (this.getVehicle() instanceof Rideable vehicle) {
|
||||||
|
return vehicle.getRiding().dismountOnShift() && original.call(instance);
|
||||||
|
}
|
||||||
|
return original.call(instance);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,28 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.mixin;
|
|
||||||
|
|
||||||
import com.cobblemon.mod.common.client.render.ClientPlayerIcon;
|
|
||||||
import com.mojang.blaze3d.vertex.PoseStack;
|
|
||||||
import net.minecraft.client.player.AbstractClientPlayer;
|
|
||||||
import net.minecraft.client.renderer.MultiBufferSource;
|
|
||||||
import net.minecraft.client.renderer.entity.player.PlayerRenderer;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|
||||||
|
|
||||||
@Mixin(PlayerRenderer.class)
|
|
||||||
public class PlayerRendererMixin {
|
|
||||||
|
|
||||||
@Inject(method = "render", at = @At(value = "TAIL"))
|
|
||||||
public void renderPlayer(AbstractClientPlayer player, float f, float g, PoseStack poseStack, MultiBufferSource multiBufferSource, int i, CallbackInfo ci) {
|
|
||||||
ClientPlayerIcon.Companion.onRenderPlayer(player);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+10
@@ -9,8 +9,10 @@
|
|||||||
package com.cobblemon.mod.common.mixin.client;
|
package com.cobblemon.mod.common.mixin.client;
|
||||||
|
|
||||||
import com.cobblemon.mod.common.client.CobblemonClient;
|
import com.cobblemon.mod.common.client.CobblemonClient;
|
||||||
|
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity;
|
||||||
import com.cobblemon.mod.common.pokedex.scanner.PokedexUsageContext;
|
import com.cobblemon.mod.common.pokedex.scanner.PokedexUsageContext;
|
||||||
import net.minecraft.client.player.AbstractClientPlayer;
|
import net.minecraft.client.player.AbstractClientPlayer;
|
||||||
|
import net.minecraft.client.player.LocalPlayer;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
@@ -30,5 +32,13 @@ public class AbstractClientPlayerMixin {
|
|||||||
if (usageContext.getScanningGuiOpen()) {
|
if (usageContext.getScanningGuiOpen()) {
|
||||||
cir.setReturnValue(usageContext.getFovMultiplier());
|
cir.setReturnValue(usageContext.getFovMultiplier());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LocalPlayer player = (LocalPlayer) (Object) this;
|
||||||
|
if (player != null && player.isPassenger() && player.getVehicle() instanceof PokemonEntity) {
|
||||||
|
PokemonEntity ride = (PokemonEntity) player.getVehicle();
|
||||||
|
|
||||||
|
//Return custom fov mult
|
||||||
|
cir.setReturnValue(ride.rideFovMult());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,97 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Cobblemon Contributors
|
||||||
|
*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.cobblemon.mod.common.mixin.client;
|
||||||
|
|
||||||
|
import com.cobblemon.mod.common.Rollable;
|
||||||
|
import net.minecraft.client.Camera;
|
||||||
|
import net.minecraft.client.Minecraft;
|
||||||
|
import net.minecraft.world.entity.Entity;
|
||||||
|
import org.joml.Matrix3f;
|
||||||
|
import org.joml.Quaternionf;
|
||||||
|
import org.joml.Vector3f;
|
||||||
|
import org.spongepowered.asm.mixin.Final;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
import org.spongepowered.asm.mixin.Unique;
|
||||||
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
|
@Mixin(Camera.class)
|
||||||
|
public abstract class CameraMixin {
|
||||||
|
@Shadow @Final private static float DEFAULT_CAMERA_DISTANCE;
|
||||||
|
|
||||||
|
@Shadow private Entity entity;
|
||||||
|
@Shadow @Final private Quaternionf rotation;
|
||||||
|
@Shadow @Final private Vector3f forwards;
|
||||||
|
@Shadow @Final private Vector3f up;
|
||||||
|
@Shadow @Final private Vector3f left;
|
||||||
|
@Shadow private float xRot;
|
||||||
|
@Shadow private float yRot;
|
||||||
|
|
||||||
|
@Shadow public abstract float getXRot();
|
||||||
|
|
||||||
|
@Shadow public abstract float getYRot();
|
||||||
|
|
||||||
|
@Unique private float returnTimer = 0;
|
||||||
|
@Unique private float rollAngleStart = 0;
|
||||||
|
@Unique Minecraft minecraft = Minecraft.getInstance();
|
||||||
|
|
||||||
|
@Unique boolean disableRollableCameraDebug = false;
|
||||||
|
|
||||||
|
@Inject(method = "setRotation", at = @At("HEAD"), cancellable = true)
|
||||||
|
public void open_camera$setRotation(float f, float g, CallbackInfo ci) {
|
||||||
|
if (!(this.entity instanceof Rollable rollable) || disableRollableCameraDebug) return;
|
||||||
|
if (!rollable.shouldRoll() && rollable.getOrientation() != null) {
|
||||||
|
if(this.returnTimer < 1) {
|
||||||
|
//Rotation is taken from entity since we no longer handle mouse ourselves
|
||||||
|
//Stops a period of time when you can't input anything.
|
||||||
|
rollable.getOrientation().set(
|
||||||
|
new Matrix3f()
|
||||||
|
.rotateY((float) Math.toRadians(180 - this.entity.getYRot()))
|
||||||
|
.rotateX((float) Math.toRadians(-this.entity.getXRot()))
|
||||||
|
);
|
||||||
|
if(rollAngleStart == 0){
|
||||||
|
this.returnTimer = 1;
|
||||||
|
rollable.clearRotation();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
rollable.getOrientation().rotateZ((float) Math.toRadians(-rollAngleStart*(1-returnTimer)));
|
||||||
|
applyRotation();
|
||||||
|
this.returnTimer += .05F;
|
||||||
|
ci.cancel();
|
||||||
|
} else {
|
||||||
|
this.returnTimer = 1;
|
||||||
|
rollable.clearRotation();
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (rollable.getOrientation() == null) return;
|
||||||
|
applyRotation();
|
||||||
|
|
||||||
|
this.returnTimer = 0;
|
||||||
|
this.rollAngleStart = rollable.getRoll();
|
||||||
|
ci.cancel();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Unique
|
||||||
|
private void applyRotation(){
|
||||||
|
if (!(this.entity instanceof Rollable rollable) || rollable.getOrientation() == null) return;
|
||||||
|
var newRotation = rollable.getOrientation().normal(new Matrix3f()).getNormalizedRotation(new Quaternionf());
|
||||||
|
if (this.minecraft.options.getCameraType().isMirrored()) {
|
||||||
|
newRotation.rotateY((float)Math.toRadians(180));
|
||||||
|
}
|
||||||
|
this.rotation.set(newRotation);
|
||||||
|
this.xRot = rollable.getPitch();
|
||||||
|
this.yRot = rollable.getYaw();
|
||||||
|
this.forwards.set(rollable.getForwardVector());
|
||||||
|
this.up.set(rollable.getUpVector());
|
||||||
|
this.left.set(rollable.getLeftVector());
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.cobblemon.mod.common.mixin;
|
package com.cobblemon.mod.common.mixin.client;
|
||||||
|
|
||||||
import com.cobblemon.mod.common.api.scheduling.ClientTaskTracker;
|
import com.cobblemon.mod.common.api.scheduling.ClientTaskTracker;
|
||||||
import net.minecraft.client.DeltaTracker;
|
import net.minecraft.client.DeltaTracker;
|
||||||
@@ -0,0 +1,66 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Cobblemon Contributors
|
||||||
|
*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.cobblemon.mod.common.mixin.client;
|
||||||
|
|
||||||
|
import com.cobblemon.mod.common.client.render.player.MountedPlayerRenderer;
|
||||||
|
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity;
|
||||||
|
import net.minecraft.client.model.HumanoidModel;
|
||||||
|
import net.minecraft.client.model.geom.ModelPart;
|
||||||
|
import net.minecraft.client.player.AbstractClientPlayer;
|
||||||
|
import net.minecraft.world.entity.Entity;
|
||||||
|
import net.minecraft.world.entity.LivingEntity;
|
||||||
|
import org.spongepowered.asm.mixin.Final;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
import org.spongepowered.asm.mixin.Unique;
|
||||||
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
@Mixin(HumanoidModel.class)
|
||||||
|
public class HumanoidModelMixin {
|
||||||
|
@Unique HashMap<String, ModelPart> relevantPartsByName = new HashMap<>();
|
||||||
|
|
||||||
|
@Shadow @Final
|
||||||
|
public ModelPart head;
|
||||||
|
@Shadow @Final
|
||||||
|
public ModelPart rightArm;
|
||||||
|
@Shadow @Final
|
||||||
|
public ModelPart leftArm;
|
||||||
|
@Shadow @Final
|
||||||
|
public ModelPart rightLeg;
|
||||||
|
@Shadow @Final
|
||||||
|
public ModelPart leftLeg;
|
||||||
|
|
||||||
|
@Inject(method = "setupAnim*", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/model/geom/ModelPart;copyFrom(Lnet/minecraft/client/model/geom/ModelPart;)V", shift = At.Shift.BEFORE))
|
||||||
|
public void cobblemon$animateRiders(
|
||||||
|
LivingEntity entity,
|
||||||
|
float limbSwing,
|
||||||
|
float limbSwingAmount,
|
||||||
|
float ageInTicks,
|
||||||
|
float netHeadYaw,
|
||||||
|
float headPitch,
|
||||||
|
CallbackInfo ci
|
||||||
|
) {
|
||||||
|
if (relevantPartsByName.isEmpty()) {
|
||||||
|
relevantPartsByName.put("arm_left", leftArm);
|
||||||
|
relevantPartsByName.put("arm_right", rightArm);
|
||||||
|
relevantPartsByName.put("leg_left", leftLeg);
|
||||||
|
relevantPartsByName.put("leg_right", rightLeg);
|
||||||
|
relevantPartsByName.put("head", head);
|
||||||
|
}
|
||||||
|
|
||||||
|
Entity vehicle = entity.getVehicle();
|
||||||
|
if (vehicle instanceof PokemonEntity && entity instanceof AbstractClientPlayer) {
|
||||||
|
MountedPlayerRenderer.INSTANCE.animate((PokemonEntity) vehicle, (AbstractClientPlayer) entity, relevantPartsByName, netHeadYaw, headPitch, ageInTicks, limbSwing, limbSwingAmount);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+15
-1
@@ -6,18 +6,22 @@
|
|||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.cobblemon.mod.common.mixin;
|
package com.cobblemon.mod.common.mixin.client;
|
||||||
|
|
||||||
|
import com.cobblemon.mod.common.Rollable;
|
||||||
import com.cobblemon.mod.common.item.PokedexItem;
|
import com.cobblemon.mod.common.item.PokedexItem;
|
||||||
import com.mojang.blaze3d.vertex.PoseStack;
|
import com.mojang.blaze3d.vertex.PoseStack;
|
||||||
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.player.AbstractClientPlayer;
|
import net.minecraft.client.player.AbstractClientPlayer;
|
||||||
import net.minecraft.client.renderer.ItemInHandRenderer;
|
import net.minecraft.client.renderer.ItemInHandRenderer;
|
||||||
import net.minecraft.client.renderer.MultiBufferSource;
|
import net.minecraft.client.renderer.MultiBufferSource;
|
||||||
import net.minecraft.world.InteractionHand;
|
import net.minecraft.world.InteractionHand;
|
||||||
import net.minecraft.world.item.ItemStack;
|
import net.minecraft.world.item.ItemStack;
|
||||||
|
import org.joml.Quaternionf;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
|
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
@Mixin(ItemInHandRenderer.class)
|
@Mixin(ItemInHandRenderer.class)
|
||||||
@@ -27,5 +31,15 @@ public class ItemInHandRendererMixin {
|
|||||||
if (abstractClientPlayer.isUsingItem() && abstractClientPlayer.getUseItem().getItem() instanceof PokedexItem) {
|
if (abstractClientPlayer.isUsingItem() && abstractClientPlayer.getUseItem().getItem() instanceof PokedexItem) {
|
||||||
ci.cancel();
|
ci.cancel();
|
||||||
}
|
}
|
||||||
|
else if (abstractClientPlayer instanceof Rollable rollable && rollable.shouldRoll()) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Redirect(method = "renderHandsWithItems", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/PoseStack;mulPose(Lorg/joml/Quaternionf;)V", ordinal = 1))
|
||||||
|
private void cobblemon$renderHandswithItems(PoseStack instance, Quaternionf quaternion) {
|
||||||
|
if (!(Minecraft.getInstance().player instanceof Rollable rollable && rollable.shouldRoll())) {
|
||||||
|
instance.mulPose(quaternion);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+3
-2
@@ -6,7 +6,7 @@
|
|||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.cobblemon.mod.common.mixin;
|
package com.cobblemon.mod.common.mixin.client;
|
||||||
|
|
||||||
import com.cobblemon.mod.common.Cobblemon;
|
import com.cobblemon.mod.common.Cobblemon;
|
||||||
import com.cobblemon.mod.common.ModAPI;
|
import com.cobblemon.mod.common.ModAPI;
|
||||||
@@ -40,7 +40,8 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
|||||||
*/
|
*/
|
||||||
@Mixin(ItemRenderer.class)
|
@Mixin(ItemRenderer.class)
|
||||||
public abstract class ItemRendererMixin {
|
public abstract class ItemRendererMixin {
|
||||||
@Unique private final String MODEL_PATH = Cobblemon.implementation.getModAPI() == ModAPI.FABRIC ? "fabric_resource" : "standalone";
|
// ignore the hint saying implmentation is never null, if something crashes then it is null and causes red herrings
|
||||||
|
@Unique private final String MODEL_PATH = (Cobblemon.implementation != null && Cobblemon.implementation.getModAPI() == ModAPI.FABRIC) ? "fabric_resource" : "standalone";
|
||||||
|
|
||||||
@Shadow @Final private ItemModelShaper itemModelShaper;
|
@Shadow @Final private ItemModelShaper itemModelShaper;
|
||||||
|
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Cobblemon Contributors
|
||||||
|
*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.cobblemon.mod.common.mixin.client;
|
||||||
|
|
||||||
|
import com.cobblemon.mod.common.CobblemonNetwork;
|
||||||
|
import com.cobblemon.mod.common.Rollable;
|
||||||
|
import com.cobblemon.mod.common.net.messages.server.orientation.C2SUpdateOrientationPacket;
|
||||||
|
import net.minecraft.client.player.LocalPlayer;
|
||||||
|
import org.joml.Matrix3f;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Unique;
|
||||||
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
|
@Mixin(LocalPlayer.class)
|
||||||
|
public class LocalPlayerMixin {
|
||||||
|
|
||||||
|
@Unique Matrix3f cobblemon$lastOrientation;
|
||||||
|
|
||||||
|
@Inject(method = "sendPosition", at = @At("TAIL"))
|
||||||
|
private void cobblemon_updateRotationMatrix(CallbackInfo ci) {
|
||||||
|
if (!(this instanceof Rollable rollable)) return;
|
||||||
|
if (rollable.getOrientation() == cobblemon$lastOrientation) return;
|
||||||
|
cobblemon$lastOrientation = rollable.getOrientation() != null ? new Matrix3f(rollable.getOrientation()) : null;
|
||||||
|
CobblemonNetwork.INSTANCE.sendToServer(new C2SUpdateOrientationPacket(rollable.getOrientation()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Inject(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/multiplayer/ClientPacketListener;send(Lnet/minecraft/network/protocol/Packet;)V"))
|
||||||
|
private void cobblemon_updateRotationMatrixPassenger(CallbackInfo ci) {
|
||||||
|
if (!(this instanceof Rollable rollable)) return;
|
||||||
|
if (rollable.getOrientation() == cobblemon$lastOrientation) return;
|
||||||
|
cobblemon$lastOrientation = rollable.getOrientation() != null ? new Matrix3f(rollable.getOrientation()) : null;
|
||||||
|
CobblemonNetwork.INSTANCE.sendToServer(new C2SUpdateOrientationPacket(rollable.getOrientation()));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.cobblemon.mod.common.mixin;
|
package com.cobblemon.mod.common.mixin.client;
|
||||||
|
|
||||||
import com.cobblemon.mod.common.client.CobblemonBakingOverrides;
|
import com.cobblemon.mod.common.client.CobblemonBakingOverrides;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.cobblemon.mod.common.mixin;
|
package com.cobblemon.mod.common.mixin.client;
|
||||||
|
|
||||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Bone;
|
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Bone;
|
||||||
import com.cobblemon.mod.common.client.render.models.blockbench.repository.RenderContext;
|
import com.cobblemon.mod.common.client.render.models.blockbench.repository.RenderContext;
|
||||||
+95
-7
@@ -6,33 +6,41 @@
|
|||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.cobblemon.mod.common.mixin;
|
package com.cobblemon.mod.common.mixin.client;
|
||||||
|
|
||||||
|
import com.cobblemon.mod.common.Rollable;
|
||||||
import com.cobblemon.mod.common.client.CobblemonClient;
|
import com.cobblemon.mod.common.client.CobblemonClient;
|
||||||
import com.cobblemon.mod.common.client.keybind.keybinds.PartySendBinding;
|
import com.cobblemon.mod.common.client.keybind.keybinds.PartySendBinding;
|
||||||
import com.cobblemon.mod.common.pokedex.scanner.PokedexUsageContext;
|
import com.cobblemon.mod.common.pokedex.scanner.PokedexUsageContext;
|
||||||
import com.llamalad7.mixinextras.injector.v2.WrapWithCondition;
|
import com.llamalad7.mixinextras.injector.v2.WrapWithCondition;
|
||||||
import com.llamalad7.mixinextras.sugar.Local;
|
import com.llamalad7.mixinextras.sugar.Local;
|
||||||
|
import com.mojang.blaze3d.Blaze3D;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.MouseHandler;
|
import net.minecraft.client.MouseHandler;
|
||||||
import net.minecraft.client.player.LocalPlayer;
|
import net.minecraft.client.player.LocalPlayer;
|
||||||
import net.minecraft.util.Mth;
|
import net.minecraft.util.Mth;
|
||||||
import net.minecraft.util.SmoothDouble;
|
import net.minecraft.util.SmoothDouble;
|
||||||
|
import net.minecraft.world.phys.Vec3;
|
||||||
import org.objectweb.asm.Opcodes;
|
import org.objectweb.asm.Opcodes;
|
||||||
import org.spongepowered.asm.mixin.Final;
|
import org.spongepowered.asm.mixin.Final;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
import org.spongepowered.asm.mixin.Unique;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
@Mixin(MouseHandler.class)
|
@Mixin(MouseHandler.class)
|
||||||
public class MouseHandlerMixin {
|
public class MouseHandlerMixin {
|
||||||
@Shadow
|
@Shadow private double accumulatedScrollY;
|
||||||
private double accumulatedScrollY;
|
|
||||||
|
|
||||||
@Shadow @Final private Minecraft minecraft;
|
@Shadow @Final private Minecraft minecraft;
|
||||||
|
|
||||||
|
@Unique SmoothDouble xMouseSmoother = new SmoothDouble();
|
||||||
|
@Unique SmoothDouble yMouseSmoother = new SmoothDouble();
|
||||||
|
@Unique SmoothDouble pitchSmoother = new SmoothDouble();
|
||||||
|
@Unique SmoothDouble rollSmoother = new SmoothDouble();
|
||||||
|
@Unique SmoothDouble yawSmoother = new SmoothDouble();
|
||||||
|
|
||||||
@Shadow @Final private SmoothDouble smoothTurnY;
|
@Shadow @Final private SmoothDouble smoothTurnY;
|
||||||
|
|
||||||
@Shadow @Final private SmoothDouble smoothTurnX;
|
@Shadow @Final private SmoothDouble smoothTurnX;
|
||||||
@@ -41,6 +49,8 @@ public class MouseHandlerMixin {
|
|||||||
|
|
||||||
@Shadow private double accumulatedDY;
|
@Shadow private double accumulatedDY;
|
||||||
|
|
||||||
|
@Shadow private double accumulatedScrollX;
|
||||||
|
|
||||||
@Inject(
|
@Inject(
|
||||||
method = "onScroll",
|
method = "onScroll",
|
||||||
at = @At(
|
at = @At(
|
||||||
@@ -92,8 +102,13 @@ public class MouseHandlerMixin {
|
|||||||
target = "Lnet/minecraft/client/player/LocalPlayer;turn(DD)V"
|
target = "Lnet/minecraft/client/player/LocalPlayer;turn(DD)V"
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
public boolean cobblemon$modifyRotation(LocalPlayer player, double cursorDeltaX, double cursorDeltaY, @Local(argsOnly = true) double d) {
|
public boolean cobblemon$modifyRotation(
|
||||||
// I know this technically doesn't need to be a WrapWithCondition, but it'll make things easier later for riding.
|
LocalPlayer player,
|
||||||
|
double cursorDeltaX,
|
||||||
|
double cursorDeltaY,
|
||||||
|
@Local(argsOnly = true) double d,
|
||||||
|
@Local(argsOnly = true) double movementTime
|
||||||
|
) {
|
||||||
PokedexUsageContext usageContext = CobblemonClient.INSTANCE.getPokedexUsageContext();
|
PokedexUsageContext usageContext = CobblemonClient.INSTANCE.getPokedexUsageContext();
|
||||||
if (usageContext.getScanningGuiOpen()) {
|
if (usageContext.getScanningGuiOpen()) {
|
||||||
this.smoothTurnY.reset();
|
this.smoothTurnY.reset();
|
||||||
@@ -105,7 +120,80 @@ public class MouseHandlerMixin {
|
|||||||
player.turn(this.accumulatedDX * sensitivity, (this.accumulatedDY * sensitivity));
|
player.turn(this.accumulatedDX * sensitivity, (this.accumulatedDY * sensitivity));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
|
if (!(player instanceof Rollable rollable)) return true;
|
||||||
|
|
||||||
|
if (!rollable.shouldRoll()) {
|
||||||
|
xMouseSmoother.reset();
|
||||||
|
yMouseSmoother.reset();
|
||||||
|
pitchSmoother.reset();
|
||||||
|
rollSmoother.reset();
|
||||||
|
yawSmoother.reset();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
var defaultSensitivity = this.minecraft.options.sensitivity().get() * 0.6000000238418579 + 0.20000000298023224;
|
||||||
|
var ridingSensitivity = Math.pow(defaultSensitivity, 3);
|
||||||
|
|
||||||
|
//Send mouse input to be interpreted into rotation
|
||||||
|
//deltas by the ride controller
|
||||||
|
Vec3 angVecMouse = rollable.rotationOnMouseXY(
|
||||||
|
cursorDeltaY,
|
||||||
|
cursorDeltaX ,
|
||||||
|
yMouseSmoother,
|
||||||
|
xMouseSmoother,
|
||||||
|
ridingSensitivity,
|
||||||
|
movementTime
|
||||||
|
);
|
||||||
|
|
||||||
|
//Perform Rotation using mouse influenced rotation deltas.
|
||||||
|
rollable.rotate(
|
||||||
|
(float) angVecMouse.x,
|
||||||
|
(float) angVecMouse.y,
|
||||||
|
(float) angVecMouse.z
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
//Gather and apply the current rotation deltas
|
||||||
|
var angRot = rollable.angRollVel(movementTime);
|
||||||
|
|
||||||
|
//Apply smoothing if requested by the controller.
|
||||||
|
//This Might be best if done by the controller itself?
|
||||||
|
if( rollable.useAngVelSmoothing() )
|
||||||
|
{
|
||||||
|
if( angRot != null ) {
|
||||||
|
var yaw = yawSmoother.getNewDeltaValue(angRot.x * 0.5f, d);
|
||||||
|
var pitch = pitchSmoother.getNewDeltaValue(angRot.y * 0.5f, d);
|
||||||
|
var roll = rollSmoother.getNewDeltaValue(angRot.z * 0.5f, d);
|
||||||
|
rollable.rotate((float) yaw, (float) pitch, (float) roll);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//Otherwise simply apply the smoothing
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if( angRot != null ) {
|
||||||
|
rollable.rotate((float) (
|
||||||
|
angRot.x * 10 * d),
|
||||||
|
(float) (angRot.y * 10 * d),
|
||||||
|
(float) (angRot.z * 10 * d)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Inject(method = "handleAccumulatedMovement", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/MouseHandler;isMouseGrabbed()Z", ordinal = 0))
|
||||||
|
private void cobblemon$maintainMovementWhenInScreens(CallbackInfo ci, @Local(ordinal = 1) double e) {
|
||||||
|
if (minecraft.player == null) return;
|
||||||
|
if (!(minecraft.player instanceof Rollable rollable)) return;
|
||||||
|
if (!rollable.shouldRoll()) return;
|
||||||
|
if (minecraft.isPaused()) return;
|
||||||
|
|
||||||
|
var pitch = pitchSmoother.getNewDeltaValue(0, e);
|
||||||
|
var roll = rollSmoother.getNewDeltaValue(0, e);
|
||||||
|
rollable.rotate(0.0F, (float)pitch, (float)roll);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Cobblemon Contributors
|
||||||
|
*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.cobblemon.mod.common.mixin.client;
|
||||||
|
import com.cobblemon.mod.common.api.riding.Rideable;
|
||||||
|
import com.cobblemon.mod.common.api.riding.RidingManager;
|
||||||
|
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity;
|
||||||
|
import net.minecraft.client.model.PlayerModel;
|
||||||
|
import net.minecraft.world.entity.Entity;
|
||||||
|
import net.minecraft.world.entity.LivingEntity;
|
||||||
|
import net.minecraft.world.entity.player.Player;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
|
@Mixin(PlayerModel.class)
|
||||||
|
public class PlayerModelMixin {
|
||||||
|
@Inject(method = "setupAnim(Lnet/minecraft/world/entity/LivingEntity;FFFFF)V", at = @At(value = "HEAD"))
|
||||||
|
private void cobblemon$setHeadRotation(LivingEntity entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch, CallbackInfo ci){
|
||||||
|
if (!(entity instanceof Player)) return;
|
||||||
|
Entity vehicle = entity.getVehicle();
|
||||||
|
|
||||||
|
if (!(vehicle instanceof PokemonEntity)) return;
|
||||||
|
RidingManager ridingManager = ((Rideable) vehicle).getRiding();
|
||||||
|
if (ridingManager.shouldRotatePlayerHead((PokemonEntity) vehicle)) return;
|
||||||
|
|
||||||
|
netHeadYaw = 0f;
|
||||||
|
headPitch = 0f;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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.mixin.client;
|
||||||
|
|
||||||
|
import com.cobblemon.mod.common.client.render.ClientPlayerIcon;
|
||||||
|
import com.cobblemon.mod.common.client.render.player.MountedPlayerRenderer;
|
||||||
|
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity;
|
||||||
|
import com.mojang.blaze3d.vertex.PoseStack;
|
||||||
|
import net.minecraft.client.player.AbstractClientPlayer;
|
||||||
|
import net.minecraft.client.renderer.MultiBufferSource;
|
||||||
|
import net.minecraft.client.renderer.entity.player.PlayerRenderer;
|
||||||
|
import net.minecraft.world.entity.LivingEntity;
|
||||||
|
import net.minecraft.world.entity.player.Player;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
|
@Mixin(PlayerRenderer.class)
|
||||||
|
public class PlayerRendererMixin {
|
||||||
|
@Inject(method = "render(Lnet/minecraft/world/entity/LivingEntity;FFLcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V", at = @At(value = "TAIL"))
|
||||||
|
public void cobblemon$clientPlayerIcon(LivingEntity entity, float entityYaw, float partialTicks, PoseStack poseStack, MultiBufferSource buffer, int packedLight, CallbackInfo ci) {
|
||||||
|
ClientPlayerIcon.Companion.onRenderPlayer((Player) entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Inject(
|
||||||
|
method = "setupRotations(Lnet/minecraft/client/player/AbstractClientPlayer;Lcom/mojang/blaze3d/vertex/PoseStack;FFFF)V",
|
||||||
|
at = @At("HEAD")
|
||||||
|
)
|
||||||
|
private void cobblemon$modifyRoll(AbstractClientPlayer player, PoseStack poseStack, float a, float b, float partialTicks, float i, CallbackInfo ci) {
|
||||||
|
if (player.isPassenger()) {
|
||||||
|
var vehicle = player.getVehicle();
|
||||||
|
if (vehicle instanceof PokemonEntity entity) {
|
||||||
|
MountedPlayerRenderer.INSTANCE.render(player, entity, poseStack, a, b, partialTicks, i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Cobblemon Contributors
|
||||||
|
*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.cobblemon.mod.common.mixin.entity;
|
||||||
|
|
||||||
|
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity;
|
||||||
|
import net.minecraft.world.entity.Entity;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
|
@Mixin(Entity.class)
|
||||||
|
public abstract class EntityMixin {
|
||||||
|
|
||||||
|
@Shadow @Nullable public abstract Entity getVehicle();
|
||||||
|
|
||||||
|
@Inject(method = "updateInWaterStateAndDoWaterCurrentPushing", at = @At(value = "FIELD", target = "Lnet/minecraft/world/entity/Entity;wasTouchingWater:Z", ordinal = 1), cancellable = true)
|
||||||
|
public void cobblemon$verifyActuallyTouchingWater(CallbackInfo ci) {
|
||||||
|
if(this.getVehicle() instanceof PokemonEntity) {
|
||||||
|
ci.cancel();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Cobblemon Contributors
|
||||||
|
*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.cobblemon.mod.common.mixin.riding;
|
||||||
|
|
||||||
|
import net.minecraft.client.player.LocalPlayer;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
|
||||||
|
|
||||||
|
@Mixin(LocalPlayer.class)
|
||||||
|
public class JetMixin {
|
||||||
|
|
||||||
|
@Shadow private int jumpRidingTicks;
|
||||||
|
@Shadow private float jumpRidingScale;
|
||||||
|
|
||||||
|
private float jetStrength;
|
||||||
|
|
||||||
|
// @Redirect(method = "tickMovement", at = @At(target = "Lnet/minecraft/entity/JumpingMount;getJumpCooldown()I", value = "INVOKE"))
|
||||||
|
// public int cobblemon$tryHandlingJet(JumpingMount mount) {
|
||||||
|
// if(mount instanceof PokemonEntity pokemon) {
|
||||||
|
//// if(pokemon.getDataTracker().get(PokemonEntity.MOVING)) {
|
||||||
|
//// ++this.field_3938;
|
||||||
|
//// if (this.field_3938 < 11) {
|
||||||
|
//// this.jetStrength = (float) this.field_3938 * 0.1F;
|
||||||
|
//// } else {
|
||||||
|
// this.mountJumpStrength = 0.8F + 2.0F / (float) (this.field_3938 - 9) * 0.1F;
|
||||||
|
//// }
|
||||||
|
//// } else {
|
||||||
|
//// this.field_3938 = 0;
|
||||||
|
//// this.jetStrength = 0;
|
||||||
|
//// }
|
||||||
|
//
|
||||||
|
//// return -1;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// return 0;
|
||||||
|
// }
|
||||||
|
|
||||||
|
@Inject(
|
||||||
|
method = "aiStep",
|
||||||
|
at = @At(
|
||||||
|
target = "Lnet/minecraft/client/player/LocalPlayer;jumpRidingScale:F",
|
||||||
|
value = "FIELD",
|
||||||
|
ordinal = 4,
|
||||||
|
shift = At.Shift.AFTER
|
||||||
|
),
|
||||||
|
locals = LocalCapture.CAPTURE_FAILSOFT
|
||||||
|
)
|
||||||
|
public void cobblemon$applyCachedJumpStrength(CallbackInfo ci) {
|
||||||
|
this.jumpRidingScale = this.jetStrength;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -19,6 +19,7 @@ import com.cobblemon.mod.common.api.drop.ItemDropEntry
|
|||||||
import com.cobblemon.mod.common.api.events.CobblemonEvents
|
import com.cobblemon.mod.common.api.events.CobblemonEvents
|
||||||
import com.cobblemon.mod.common.api.events.CobblemonEvents.DATA_SYNCHRONIZED
|
import com.cobblemon.mod.common.api.events.CobblemonEvents.DATA_SYNCHRONIZED
|
||||||
import com.cobblemon.mod.common.api.interaction.RequestManager
|
import com.cobblemon.mod.common.api.interaction.RequestManager
|
||||||
|
import com.cobblemon.mod.common.api.molang.ObjectValue
|
||||||
import com.cobblemon.mod.common.api.permission.PermissionValidator
|
import com.cobblemon.mod.common.api.permission.PermissionValidator
|
||||||
import com.cobblemon.mod.common.api.pokeball.catching.calculators.CaptureCalculator
|
import com.cobblemon.mod.common.api.pokeball.catching.calculators.CaptureCalculator
|
||||||
import com.cobblemon.mod.common.api.pokeball.catching.calculators.CaptureCalculators
|
import com.cobblemon.mod.common.api.pokeball.catching.calculators.CaptureCalculators
|
||||||
@@ -84,6 +85,7 @@ import com.cobblemon.mod.common.net.messages.client.settings.ServerSettingsPacke
|
|||||||
import com.cobblemon.mod.common.permission.LaxPermissionValidator
|
import com.cobblemon.mod.common.permission.LaxPermissionValidator
|
||||||
import com.cobblemon.mod.common.platform.events.PlatformEvents
|
import com.cobblemon.mod.common.platform.events.PlatformEvents
|
||||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||||
|
import com.cobblemon.mod.common.pokemon.aspects.COSMETIC_SLOT_ASPECT
|
||||||
import com.cobblemon.mod.common.pokemon.aspects.GENDER_ASPECT
|
import com.cobblemon.mod.common.pokemon.aspects.GENDER_ASPECT
|
||||||
import com.cobblemon.mod.common.pokemon.aspects.SHINY_ASPECT
|
import com.cobblemon.mod.common.pokemon.aspects.SHINY_ASPECT
|
||||||
import com.cobblemon.mod.common.pokemon.evolution.variants.BlockClickEvolution
|
import com.cobblemon.mod.common.pokemon.evolution.variants.BlockClickEvolution
|
||||||
@@ -104,6 +106,7 @@ import com.cobblemon.mod.common.util.cobblemonResource
|
|||||||
import com.cobblemon.mod.common.util.ifDedicatedServer
|
import com.cobblemon.mod.common.util.ifDedicatedServer
|
||||||
import com.cobblemon.mod.common.util.isLaterVersion
|
import com.cobblemon.mod.common.util.isLaterVersion
|
||||||
import com.cobblemon.mod.common.util.party
|
import com.cobblemon.mod.common.util.party
|
||||||
|
import com.cobblemon.mod.common.util.requestWallpapers
|
||||||
import com.cobblemon.mod.common.util.server
|
import com.cobblemon.mod.common.util.server
|
||||||
import com.cobblemon.mod.common.world.feature.CobblemonPlacedFeatures
|
import com.cobblemon.mod.common.world.feature.CobblemonPlacedFeatures
|
||||||
import com.cobblemon.mod.common.world.feature.ore.CobblemonOrePlacedFeatures
|
import com.cobblemon.mod.common.world.feature.ore.CobblemonOrePlacedFeatures
|
||||||
@@ -117,6 +120,7 @@ import java.io.FileReader
|
|||||||
import java.io.FileWriter
|
import java.io.FileWriter
|
||||||
import java.io.PrintWriter
|
import java.io.PrintWriter
|
||||||
import java.util.UUID
|
import java.util.UUID
|
||||||
|
import java.util.concurrent.TimeUnit
|
||||||
import kotlin.math.roundToInt
|
import kotlin.math.roundToInt
|
||||||
import kotlin.properties.Delegates
|
import kotlin.properties.Delegates
|
||||||
import kotlin.reflect.full.memberProperties
|
import kotlin.reflect.full.memberProperties
|
||||||
@@ -125,7 +129,10 @@ import kotlin.reflect.jvm.javaField
|
|||||||
import net.minecraft.client.Minecraft
|
import net.minecraft.client.Minecraft
|
||||||
import net.minecraft.commands.synchronization.SingletonArgumentInfo
|
import net.minecraft.commands.synchronization.SingletonArgumentInfo
|
||||||
import net.minecraft.resources.ResourceKey
|
import net.minecraft.resources.ResourceKey
|
||||||
|
import net.minecraft.resources.ResourceLocation
|
||||||
|
import net.minecraft.server.level.ServerPlayer
|
||||||
import net.minecraft.server.packs.PackType
|
import net.minecraft.server.packs.PackType
|
||||||
|
import net.minecraft.world.entity.player.Player
|
||||||
import net.minecraft.world.item.NameTagItem
|
import net.minecraft.world.item.NameTagItem
|
||||||
import net.minecraft.world.level.Level
|
import net.minecraft.world.level.Level
|
||||||
import net.minecraft.world.level.storage.LevelResource
|
import net.minecraft.world.level.storage.LevelResource
|
||||||
@@ -164,6 +171,9 @@ object Cobblemon {
|
|||||||
var permissionValidator: PermissionValidator by Delegates.observable(LaxPermissionValidator().also { it.initialize() }) { _, _, newValue -> newValue.initialize() }
|
var permissionValidator: PermissionValidator by Delegates.observable(LaxPermissionValidator().also { it.initialize() }) { _, _, newValue -> newValue.initialize() }
|
||||||
var statProvider: StatProvider = CobblemonStatProvider
|
var statProvider: StatProvider = CobblemonStatProvider
|
||||||
var seasonResolver: SeasonResolver = TagSeasonResolver
|
var seasonResolver: SeasonResolver = TagSeasonResolver
|
||||||
|
var wallpapers = mutableMapOf<UUID, Set<ResourceLocation>>()
|
||||||
|
|
||||||
|
val serverPlayerStructs = mutableMapOf<UUID, ObjectValue<Player>>()
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
val builtinPacks = listOf<CobblemonPack>(
|
val builtinPacks = listOf<CobblemonPack>(
|
||||||
@@ -220,7 +230,8 @@ object Cobblemon {
|
|||||||
storage.onPlayerDataSync(it)
|
storage.onPlayerDataSync(it)
|
||||||
playerDataManager.syncAllToPlayer(it)
|
playerDataManager.syncAllToPlayer(it)
|
||||||
starterHandler.handleJoin(it)
|
starterHandler.handleJoin(it)
|
||||||
ServerSettingsPacket(this.config.preventCompletePartyDeposit, this.config.displayEntityLevelLabel, this.config.displayEntityNameLabel, this.config.maxPokemonLevel, this.config.maxPokemonFriendship, this.config.maxDynamaxLevel).sendToPlayer(it)
|
it.requestWallpapers()
|
||||||
|
sendServerSettingsPacketToPlayer(it)
|
||||||
}
|
}
|
||||||
PlatformEvents.SERVER_PLAYER_LOGOUT.subscribe {
|
PlatformEvents.SERVER_PLAYER_LOGOUT.subscribe {
|
||||||
PCLinkManager.removeLink(it.player.uuid)
|
PCLinkManager.removeLink(it.player.uuid)
|
||||||
@@ -228,6 +239,7 @@ object Cobblemon {
|
|||||||
storage.onPlayerDisconnect(it.player)
|
storage.onPlayerDisconnect(it.player)
|
||||||
playerDataManager.onPlayerDisconnect(it.player)
|
playerDataManager.onPlayerDisconnect(it.player)
|
||||||
RequestManager.onLogoff(it.player)
|
RequestManager.onLogoff(it.player)
|
||||||
|
serverPlayerStructs.remove(it.player.uuid)
|
||||||
}
|
}
|
||||||
PlatformEvents.PLAYER_DEATH.subscribe {
|
PlatformEvents.PLAYER_DEATH.subscribe {
|
||||||
PCLinkManager.removeLink(it.player.uuid)
|
PCLinkManager.removeLink(it.player.uuid)
|
||||||
@@ -268,8 +280,17 @@ object Cobblemon {
|
|||||||
}
|
}
|
||||||
|
|
||||||
HeldItemProvider.register(CobblemonHeldItemManager, Priority.LOWEST)
|
HeldItemProvider.register(CobblemonHeldItemManager, Priority.LOWEST)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun sendServerSettingsPacketToPlayer(player: ServerPlayer) {
|
||||||
|
ServerSettingsPacket(
|
||||||
|
this.config.preventCompletePartyDeposit,
|
||||||
|
this.config.displayEntityLevelLabel,
|
||||||
|
this.config.displayEntityNameLabel,
|
||||||
|
this.config.maxPokemonLevel,
|
||||||
|
this.config.maxPokemonFriendship,
|
||||||
|
this.config.maxDynamaxLevel,
|
||||||
|
).sendToPlayer(player)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun initialize() {
|
fun initialize() {
|
||||||
@@ -280,6 +301,7 @@ object Cobblemon {
|
|||||||
|
|
||||||
SHINY_ASPECT.register()
|
SHINY_ASPECT.register()
|
||||||
GENDER_ASPECT.register()
|
GENDER_ASPECT.register()
|
||||||
|
COSMETIC_SLOT_ASPECT.register()
|
||||||
|
|
||||||
SpeciesFeatures.types["choice"] = ChoiceSpeciesFeatureProvider::class.java
|
SpeciesFeatures.types["choice"] = ChoiceSpeciesFeatureProvider::class.java
|
||||||
SpeciesFeatures.types["flag"] = FlagSpeciesFeatureProvider::class.java
|
SpeciesFeatures.types["flag"] = FlagSpeciesFeatureProvider::class.java
|
||||||
@@ -387,9 +409,11 @@ object Cobblemon {
|
|||||||
PlatformEvents.SERVER_STOPPED.subscribe {
|
PlatformEvents.SERVER_STOPPED.subscribe {
|
||||||
storage.unregisterAll(it.server.registryAccess())
|
storage.unregisterAll(it.server.registryAccess())
|
||||||
playerDataManager.saveAllStores()
|
playerDataManager.saveAllStores()
|
||||||
|
playerDataManager.saveExecutor.shutdown()
|
||||||
|
playerDataManager.saveExecutor.awaitTermination(30L, TimeUnit.SECONDS)
|
||||||
}
|
}
|
||||||
PlatformEvents.SERVER_STARTED.subscribe {
|
PlatformEvents.SERVER_STARTED.subscribe { event ->
|
||||||
bestSpawner.onServerStarted()
|
bestSpawner.onServerStarted(event.server)
|
||||||
battleRegistry.onServerStarted()
|
battleRegistry.onServerStarted()
|
||||||
}
|
}
|
||||||
PlatformEvents.SERVER_TICK_POST.subscribe { ServerTickHandler.onTick(it.server) }
|
PlatformEvents.SERVER_TICK_POST.subscribe { ServerTickHandler.onTick(it.server) }
|
||||||
@@ -429,7 +453,23 @@ object Cobblemon {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun initializeConfig() {
|
||||||
|
loadCobblemonConfig()
|
||||||
|
saveConfig(this.config)
|
||||||
|
PokemonSpecies.observable.subscribe { starterConfig = this.loadStarterConfig() }
|
||||||
|
}
|
||||||
|
|
||||||
fun loadConfig() {
|
fun loadConfig() {
|
||||||
|
initializeConfig()
|
||||||
|
bestSpawner.init()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun reloadConfig() {
|
||||||
|
initializeConfig()
|
||||||
|
bestSpawner.reloadConfig()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun loadCobblemonConfig() {
|
||||||
val configFile = File(CONFIG_PATH)
|
val configFile = File(CONFIG_PATH)
|
||||||
configFile.parentFile.mkdirs()
|
configFile.parentFile.mkdirs()
|
||||||
|
|
||||||
@@ -472,12 +512,6 @@ object Cobblemon {
|
|||||||
} else {
|
} else {
|
||||||
this.config = CobblemonConfig()
|
this.config = CobblemonConfig()
|
||||||
}
|
}
|
||||||
|
|
||||||
config.lastSavedVersion = VERSION
|
|
||||||
this.saveConfig()
|
|
||||||
|
|
||||||
bestSpawner.loadConfig()
|
|
||||||
PokemonSpecies.observable.subscribe { starterConfig = this.loadStarterConfig() }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun loadStarterConfig(): StarterConfig {
|
fun loadStarterConfig(): StarterConfig {
|
||||||
@@ -500,12 +534,14 @@ object Cobblemon {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun saveConfig() {
|
fun saveConfig(config: CobblemonConfig) {
|
||||||
|
config.lastSavedVersion = VERSION
|
||||||
|
|
||||||
try {
|
try {
|
||||||
val configFile = File(CONFIG_PATH)
|
val configFile = File(CONFIG_PATH)
|
||||||
val fileWriter = FileWriter(configFile)
|
val fileWriter = FileWriter(configFile)
|
||||||
// Put the config to json then flush the writer to commence writing.
|
// Put the config to json then flush the writer to commence writing.
|
||||||
CobblemonConfig.GSON.toJson(this.config, fileWriter)
|
CobblemonConfig.GSON.toJson(config, fileWriter)
|
||||||
fileWriter.flush()
|
fileWriter.flush()
|
||||||
fileWriter.close()
|
fileWriter.close()
|
||||||
} catch (exception: Exception) {
|
} catch (exception: Exception) {
|
||||||
@@ -525,6 +561,7 @@ object Cobblemon {
|
|||||||
this.implementation.registerCommandArgument(cobblemonResource("form"), FormArgumentType::class, SingletonArgumentInfo.contextFree(FormArgumentType::form))
|
this.implementation.registerCommandArgument(cobblemonResource("form"), FormArgumentType::class, SingletonArgumentInfo.contextFree(FormArgumentType::form))
|
||||||
this.implementation.registerCommandArgument(cobblemonResource("dex"), DexArgumentType::class, SingletonArgumentInfo.contextFree (DexArgumentType::dex))
|
this.implementation.registerCommandArgument(cobblemonResource("dex"), DexArgumentType::class, SingletonArgumentInfo.contextFree (DexArgumentType::dex))
|
||||||
this.implementation.registerCommandArgument(cobblemonResource("npc_class"), NPCClassArgumentType::class, SingletonArgumentInfo.contextFree(NPCClassArgumentType::npcClass))
|
this.implementation.registerCommandArgument(cobblemonResource("npc_class"), NPCClassArgumentType::class, SingletonArgumentInfo.contextFree(NPCClassArgumentType::npcClass))
|
||||||
|
this.implementation.registerCommandArgument(cobblemonResource("wallpaper"), UnlockablePCBoxWallpaperArgumentType::class, SingletonArgumentInfo.contextFree(UnlockablePCBoxWallpaperArgumentType::wallpaper))
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ object CobblemonCommands {
|
|||||||
ChangeEyeHeight.register(dispatcher)
|
ChangeEyeHeight.register(dispatcher)
|
||||||
ChangeScaleAndSize.register(dispatcher)
|
ChangeScaleAndSize.register(dispatcher)
|
||||||
ChangeWalkSpeed.register(dispatcher)
|
ChangeWalkSpeed.register(dispatcher)
|
||||||
|
ChangeJointScaleCommand.register(dispatcher)
|
||||||
TestCommand.register(dispatcher)
|
TestCommand.register(dispatcher)
|
||||||
ReloadShowdownCommand.register(dispatcher)
|
ReloadShowdownCommand.register(dispatcher)
|
||||||
ClickTextCommand.register(dispatcher)
|
ClickTextCommand.register(dispatcher)
|
||||||
@@ -56,10 +57,15 @@ object CobblemonCommands {
|
|||||||
AbandonMultiTeam.register(dispatcher)
|
AbandonMultiTeam.register(dispatcher)
|
||||||
FreezePokemonCommand.register(dispatcher)
|
FreezePokemonCommand.register(dispatcher)
|
||||||
ApplyPlayerTextureCommand.register(dispatcher)
|
ApplyPlayerTextureCommand.register(dispatcher)
|
||||||
|
RenameBoxCommand.register(dispatcher)
|
||||||
|
ChangeBoxWallpaperCommand.register(dispatcher)
|
||||||
RunMolangScriptCommand.register(dispatcher)
|
RunMolangScriptCommand.register(dispatcher)
|
||||||
|
CobblemonConfigCommand.register(dispatcher)
|
||||||
|
UnlockPCBoxWallpaperCommand.register(dispatcher)
|
||||||
|
|
||||||
// Possibly lock down registration if and only if under dev environment or running in an environment
|
// Possibly lock down registration if and only if under dev environment or running in an environment
|
||||||
// with a certain system environment variable set
|
// with a certain system environment variable set
|
||||||
CobblemonInfoCommand.register(dispatcher)
|
CobblemonInfoCommand.register(dispatcher)
|
||||||
|
CalculateSeatPositionCommand.register(dispatcher)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Cobblemon Contributors
|
||||||
|
*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.cobblemon.mod.common
|
||||||
|
|
||||||
|
import com.cobblemon.mod.common.api.conditional.RegistryLikeCondition
|
||||||
|
import com.cobblemon.mod.common.api.data.JsonDataRegistry
|
||||||
|
import com.cobblemon.mod.common.api.pokemon.PokemonProperties
|
||||||
|
import com.cobblemon.mod.common.api.reactive.SimpleObservable
|
||||||
|
import com.cobblemon.mod.common.net.messages.client.data.CosmeticItemAssignmentSyncPacket
|
||||||
|
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||||
|
import com.cobblemon.mod.common.pokemon.cosmetic.CosmeticItemAssignment
|
||||||
|
import com.cobblemon.mod.common.util.adapters.IdentifierAdapter
|
||||||
|
import com.cobblemon.mod.common.util.adapters.ItemLikeConditionAdapter
|
||||||
|
import com.cobblemon.mod.common.util.adapters.PokemonPropertiesAdapter
|
||||||
|
import com.cobblemon.mod.common.util.cobblemonResource
|
||||||
|
import com.google.gson.GsonBuilder
|
||||||
|
import com.google.gson.reflect.TypeToken
|
||||||
|
import net.minecraft.core.RegistryAccess
|
||||||
|
import net.minecraft.core.registries.Registries
|
||||||
|
import net.minecraft.resources.ResourceLocation
|
||||||
|
import net.minecraft.server.level.ServerPlayer
|
||||||
|
import net.minecraft.server.packs.PackType
|
||||||
|
import net.minecraft.world.item.Item
|
||||||
|
import net.minecraft.world.item.ItemStack
|
||||||
|
|
||||||
|
object CobblemonCosmeticItems : JsonDataRegistry<CosmeticItemAssignment> {
|
||||||
|
override val id = cobblemonResource("cosmetic_items")
|
||||||
|
override val type = PackType.SERVER_DATA
|
||||||
|
override val observable = SimpleObservable<CobblemonCosmeticItems>()
|
||||||
|
override val typeToken = TypeToken.get(CosmeticItemAssignment::class.java)
|
||||||
|
override val resourcePath = "cosmetic_items"
|
||||||
|
|
||||||
|
override val gson = GsonBuilder()
|
||||||
|
.setPrettyPrinting()
|
||||||
|
.registerTypeAdapter(PokemonProperties::class.java, PokemonPropertiesAdapter(saveLong = false))
|
||||||
|
.registerTypeAdapter(TypeToken.getParameterized(RegistryLikeCondition::class.java, Item::class.java).type, ItemLikeConditionAdapter)
|
||||||
|
.registerTypeAdapter(ResourceLocation::class.java, IdentifierAdapter)
|
||||||
|
.create()
|
||||||
|
|
||||||
|
val cosmeticItems = mutableListOf<CosmeticItemAssignment>()
|
||||||
|
|
||||||
|
override fun reload(data: Map<ResourceLocation, CosmeticItemAssignment>) {
|
||||||
|
cosmeticItems.clear()
|
||||||
|
data.entries.forEach { (id, value) -> value.id = id }
|
||||||
|
cosmeticItems.addAll(data.values)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun sync(player: ServerPlayer) {
|
||||||
|
CosmeticItemAssignmentSyncPacket(cosmeticItems).sendToPlayer(player)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun findValidForPokemon(pokemon: Pokemon) = cosmeticItems.filter { it.pokemon.any { it.matches(pokemon) } }
|
||||||
|
fun findValidCosmeticForPokemonAndItem(registryAccess: RegistryAccess, pokemon: Pokemon, itemStack: ItemStack) = cosmeticItems
|
||||||
|
.filter { it.pokemon.any { it.matches(pokemon) } }
|
||||||
|
.flatMap { it.cosmeticItems }
|
||||||
|
.firstOrNull { it.consumedItem.fits(itemStack.item, registryAccess.registryOrThrow(Registries.ITEM)) }
|
||||||
|
}
|
||||||
@@ -9,6 +9,7 @@
|
|||||||
package com.cobblemon.mod.common
|
package com.cobblemon.mod.common
|
||||||
|
|
||||||
import com.bedrockk.molang.runtime.MoLangRuntime
|
import com.bedrockk.molang.runtime.MoLangRuntime
|
||||||
|
import com.bedrockk.molang.runtime.MoParams
|
||||||
import com.bedrockk.molang.runtime.value.MoValue
|
import com.bedrockk.molang.runtime.value.MoValue
|
||||||
import com.cobblemon.mod.common.CobblemonNetwork.sendPacket
|
import com.cobblemon.mod.common.CobblemonNetwork.sendPacket
|
||||||
import com.cobblemon.mod.common.api.data.DataRegistry
|
import com.cobblemon.mod.common.api.data.DataRegistry
|
||||||
@@ -86,13 +87,23 @@ object CobblemonFlows : DataRegistry {
|
|||||||
observable.emit(this)
|
observable.emit(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun run(eventResourceLocation: ResourceLocation, context: Map<String, MoValue>, cancelable: Cancelable? = null) {
|
fun run(
|
||||||
|
eventResourceLocation: ResourceLocation,
|
||||||
|
context: Map<String, MoValue>,
|
||||||
|
functions: Map<String, (MoParams) -> Any> = emptyMap(),
|
||||||
|
cancelable: Cancelable? = null
|
||||||
|
) {
|
||||||
if (cancelable == null) {
|
if (cancelable == null) {
|
||||||
runtime.environment.query.functions.remove("cancel")
|
runtime.environment.query.functions.remove("cancel")
|
||||||
} else {
|
} else {
|
||||||
runtime.environment.query.addFunction("cancel") { cancelable }
|
runtime.environment.query.addFunction("cancel") { cancelable }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Most places in the mod use query structs so it's probably nicer to present the things as query values.
|
||||||
|
context.forEach { (key, value) -> runtime.environment.query.addFunction(key) { return@addFunction value } }
|
||||||
|
|
||||||
|
functions.forEach { (name, function) -> runtime.environment.query.addFunction(name, function) }
|
||||||
|
|
||||||
flows[eventResourceLocation]?.forEach {
|
flows[eventResourceLocation]?.forEach {
|
||||||
if (cancelable != null && cancelable.isCanceled) {
|
if (cancelable != null && cancelable.isCanceled) {
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -35,7 +35,6 @@ import com.cobblemon.mod.common.pokeball.PokeBall
|
|||||||
import com.cobblemon.mod.common.pokemon.helditem.CobblemonHeldItemManager
|
import com.cobblemon.mod.common.pokemon.helditem.CobblemonHeldItemManager
|
||||||
import com.cobblemon.mod.common.util.cobblemonResource
|
import com.cobblemon.mod.common.util.cobblemonResource
|
||||||
import net.minecraft.core.Registry
|
import net.minecraft.core.Registry
|
||||||
import net.minecraft.core.component.DataComponents
|
|
||||||
import net.minecraft.core.registries.BuiltInRegistries
|
import net.minecraft.core.registries.BuiltInRegistries
|
||||||
import net.minecraft.core.registries.Registries
|
import net.minecraft.core.registries.Registries
|
||||||
import net.minecraft.network.chat.Component
|
import net.minecraft.network.chat.Component
|
||||||
@@ -269,7 +268,7 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
|
|||||||
@JvmField
|
@JvmField
|
||||||
val MONITOR = blockItem("monitor", CobblemonBlocks.MONITOR)
|
val MONITOR = blockItem("monitor", CobblemonBlocks.MONITOR)
|
||||||
@JvmField
|
@JvmField
|
||||||
val HEALING_MACHINE = blockItem("healing_machine", CobblemonBlocks.HEALING_MACHINE)
|
val HEALING_MACHINE = blockItem("healing_machine", CobblemonBlocks.HEALING_MACHINE, Rarity.UNCOMMON)
|
||||||
@JvmField
|
@JvmField
|
||||||
val PC = blockItem("pc", CobblemonBlocks.PC)
|
val PC = blockItem("pc", CobblemonBlocks.PC)
|
||||||
@JvmField
|
@JvmField
|
||||||
@@ -398,7 +397,7 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
|
|||||||
|
|
||||||
// Medicine
|
// Medicine
|
||||||
@JvmField
|
@JvmField
|
||||||
val RARE_CANDY = candyItem("rare_candy") { _, pokemon -> pokemon.getExperienceToNextLevel() }
|
val RARE_CANDY = candyItem("rare_candy", Rarity.RARE) { _, pokemon -> pokemon.getExperienceToNextLevel() }
|
||||||
@JvmField
|
@JvmField
|
||||||
val EXPERIENCE_CANDY_XS = candyItem("exp_candy_xs") { _, _ -> CandyItem.DEFAULT_XS_CANDY_YIELD }
|
val EXPERIENCE_CANDY_XS = candyItem("exp_candy_xs") { _, _ -> CandyItem.DEFAULT_XS_CANDY_YIELD }
|
||||||
@JvmField
|
@JvmField
|
||||||
@@ -883,48 +882,48 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
|
|||||||
|
|
||||||
// Archaeology
|
// Archaeology
|
||||||
@JvmField
|
@JvmField
|
||||||
val ARMOR_FOSSIL = noSettingsItem("armor_fossil")
|
val ARMOR_FOSSIL = itemWithRarity("armor_fossil", Rarity.UNCOMMON)
|
||||||
@JvmField
|
@JvmField
|
||||||
val FOSSILIZED_BIRD = noSettingsItem("fossilized_bird")
|
val FOSSILIZED_BIRD = itemWithRarity("fossilized_bird", Rarity.UNCOMMON)
|
||||||
@JvmField
|
@JvmField
|
||||||
val CLAW_FOSSIL = noSettingsItem("claw_fossil")
|
val CLAW_FOSSIL = itemWithRarity("claw_fossil", Rarity.UNCOMMON)
|
||||||
@JvmField
|
@JvmField
|
||||||
val COVER_FOSSIL = noSettingsItem("cover_fossil")
|
val COVER_FOSSIL = itemWithRarity("cover_fossil", Rarity.UNCOMMON)
|
||||||
@JvmField
|
@JvmField
|
||||||
val FOSSILIZED_DINO = noSettingsItem("fossilized_dino")
|
val FOSSILIZED_DINO = itemWithRarity("fossilized_dino", Rarity.UNCOMMON)
|
||||||
@JvmField
|
@JvmField
|
||||||
val DOME_FOSSIL = noSettingsItem("dome_fossil")
|
val DOME_FOSSIL = itemWithRarity("dome_fossil", Rarity.UNCOMMON)
|
||||||
@JvmField
|
@JvmField
|
||||||
val FOSSILIZED_DRAKE = noSettingsItem("fossilized_drake")
|
val FOSSILIZED_DRAKE = itemWithRarity("fossilized_drake", Rarity.UNCOMMON)
|
||||||
@JvmField
|
@JvmField
|
||||||
val FOSSILIZED_FISH = noSettingsItem("fossilized_fish")
|
val FOSSILIZED_FISH = itemWithRarity("fossilized_fish", Rarity.UNCOMMON)
|
||||||
@JvmField
|
@JvmField
|
||||||
val HELIX_FOSSIL = noSettingsItem("helix_fossil")
|
val HELIX_FOSSIL = itemWithRarity("helix_fossil", Rarity.UNCOMMON)
|
||||||
@JvmField
|
@JvmField
|
||||||
val JAW_FOSSIL = noSettingsItem("jaw_fossil")
|
val JAW_FOSSIL = itemWithRarity("jaw_fossil", Rarity.UNCOMMON)
|
||||||
@JvmField
|
@JvmField
|
||||||
val OLD_AMBER_FOSSIL = noSettingsItem("old_amber_fossil")
|
val OLD_AMBER_FOSSIL = itemWithRarity("old_amber_fossil", Rarity.UNCOMMON)
|
||||||
@JvmField
|
@JvmField
|
||||||
val PLUME_FOSSIL = noSettingsItem("plume_fossil")
|
val PLUME_FOSSIL = itemWithRarity("plume_fossil", Rarity.UNCOMMON)
|
||||||
@JvmField
|
@JvmField
|
||||||
val ROOT_FOSSIL = noSettingsItem("root_fossil")
|
val ROOT_FOSSIL = itemWithRarity("root_fossil", Rarity.UNCOMMON)
|
||||||
@JvmField
|
@JvmField
|
||||||
val SAIL_FOSSIL = noSettingsItem("sail_fossil")
|
val SAIL_FOSSIL = itemWithRarity("sail_fossil", Rarity.UNCOMMON)
|
||||||
@JvmField
|
@JvmField
|
||||||
val SKULL_FOSSIL = noSettingsItem("skull_fossil")
|
val SKULL_FOSSIL = itemWithRarity("skull_fossil", Rarity.UNCOMMON)
|
||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val BYGONE_SHERD = noSettingsItem("bygone_sherd")
|
val BYGONE_SHERD = itemWithRarity("bygone_sherd", Rarity.UNCOMMON)
|
||||||
@JvmField
|
@JvmField
|
||||||
val CAPTURE_SHERD = noSettingsItem("capture_sherd")
|
val CAPTURE_SHERD = itemWithRarity("capture_sherd",Rarity.UNCOMMON)
|
||||||
@JvmField
|
@JvmField
|
||||||
val DOME_SHERD = noSettingsItem("dome_sherd")
|
val DOME_SHERD = itemWithRarity("dome_sherd", Rarity.UNCOMMON)
|
||||||
@JvmField
|
@JvmField
|
||||||
val HELIX_SHERD = noSettingsItem("helix_sherd")
|
val HELIX_SHERD = itemWithRarity("helix_sherd", Rarity.UNCOMMON)
|
||||||
@JvmField
|
@JvmField
|
||||||
val NOSTALGIC_SHERD = noSettingsItem("nostalgic_sherd")
|
val NOSTALGIC_SHERD = itemWithRarity("nostalgic_sherd",Rarity.UNCOMMON)
|
||||||
@JvmField
|
@JvmField
|
||||||
val SUSPICIOUS_SHERD = noSettingsItem("suspicious_sherd")
|
val SUSPICIOUS_SHERD = itemWithRarity("suspicious_sherd", Rarity.UNCOMMON)
|
||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val TUMBLESTONE = this.create("tumblestone", TumblestoneItem(Item.Properties(), CobblemonBlocks.SMALL_BUDDING_TUMBLESTONE))
|
val TUMBLESTONE = this.create("tumblestone", TumblestoneItem(Item.Properties(), CobblemonBlocks.SMALL_BUDDING_TUMBLESTONE))
|
||||||
@@ -1144,11 +1143,11 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
|
|||||||
@JvmField
|
@JvmField
|
||||||
val DREAM_ROD = pokerodItem(cobblemonResource("dream_rod"))
|
val DREAM_ROD = pokerodItem(cobblemonResource("dream_rod"))
|
||||||
@JvmField
|
@JvmField
|
||||||
val BEAST_ROD = pokerodItem(cobblemonResource("beast_rod"))
|
val BEAST_ROD = pokerodItem(cobblemonResource("beast_rod"), Rarity.RARE)
|
||||||
@JvmField
|
@JvmField
|
||||||
val MASTER_ROD = pokerodItem(cobblemonResource("master_rod"))
|
val MASTER_ROD = pokerodItem(cobblemonResource("master_rod"), Rarity.EPIC)
|
||||||
@JvmField
|
@JvmField
|
||||||
val CHERISH_ROD = pokerodItem(cobblemonResource("cherish_rod"))
|
val CHERISH_ROD = pokerodItem(cobblemonResource("cherish_rod"), Rarity.EPIC)
|
||||||
@JvmField
|
@JvmField
|
||||||
val ANCIENT_POKE_ROD = pokerodItem(cobblemonResource("ancient_poke_rod"))
|
val ANCIENT_POKE_ROD = pokerodItem(cobblemonResource("ancient_poke_rod"))
|
||||||
@JvmField
|
@JvmField
|
||||||
@@ -1180,7 +1179,7 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
|
|||||||
@JvmField
|
@JvmField
|
||||||
val ANCIENT_GIGATON_ROD = pokerodItem(cobblemonResource("ancient_gigaton_rod"))
|
val ANCIENT_GIGATON_ROD = pokerodItem(cobblemonResource("ancient_gigaton_rod"))
|
||||||
@JvmField
|
@JvmField
|
||||||
val ANCIENT_ORIGIN_ROD = pokerodItem(cobblemonResource("ancient_origin_rod"))
|
val ANCIENT_ORIGIN_ROD = pokerodItem(cobblemonResource("ancient_origin_rod"), Rarity.EPIC)
|
||||||
|
|
||||||
// Misc
|
// Misc
|
||||||
@JvmField
|
@JvmField
|
||||||
@@ -1232,10 +1231,12 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
|
|||||||
//@JvmField
|
//@JvmField
|
||||||
//val BINDING_SOIL = blockItem("binding_soil", CobblemonBlocks.BINDING_SOIL)
|
//val BINDING_SOIL = blockItem("binding_soil", CobblemonBlocks.BINDING_SOIL)
|
||||||
|
|
||||||
private fun blockItem(name: String, block: Block): BlockItem = this.create(name, BlockItem(block, Item.Properties()))
|
private fun blockItem(name: String, block: Block, rarity: Rarity = Rarity.COMMON): BlockItem = this.create(name, BlockItem(block, Item.Properties().rarity(rarity)))
|
||||||
|
|
||||||
private fun noSettingsItem(name: String): CobblemonItem = this.create(name, CobblemonItem(Item.Properties()))
|
private fun noSettingsItem(name: String): CobblemonItem = this.create(name, CobblemonItem(Item.Properties()))
|
||||||
|
|
||||||
|
private fun itemWithRarity(name: String, rarity: Rarity): CobblemonItem = this.create(name, CobblemonItem(Item.Properties().rarity(rarity)))
|
||||||
|
|
||||||
fun berries() = this.berries.toMap()
|
fun berries() = this.berries.toMap()
|
||||||
|
|
||||||
private fun mulchItem(name: String, mulchVariant: MulchVariant): MulchItem = this.create(name, MulchItem(mulchVariant))
|
private fun mulchItem(name: String, mulchVariant: MulchVariant): MulchItem = this.create(name, MulchItem(mulchVariant))
|
||||||
@@ -1247,10 +1248,10 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
|
|||||||
return item
|
return item
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun candyItem(name: String, calculator: CandyItem.Calculator): CandyItem = this.create(name, CandyItem(calculator))
|
private fun candyItem(name: String, rarity: Rarity = Rarity.COMMON, calculator: CandyItem.Calculator): CandyItem = this.create(name, CandyItem(rarity, calculator))
|
||||||
|
|
||||||
private fun pokerodItem(pokeRodId: ResourceLocation): PokerodItem {
|
private fun pokerodItem(pokeRodId: ResourceLocation, rarity: Rarity = Rarity.COMMON): PokerodItem {
|
||||||
val settings = Item.Properties().stacksTo(1).durability(256)
|
val settings = Item.Properties().stacksTo(1).durability(256).rarity(rarity)
|
||||||
val item = create(pokeRodId.path, PokerodItem(pokeRodId, settings))
|
val item = create(pokeRodId.path, PokerodItem(pokeRodId, settings))
|
||||||
pokeRods.add(item)
|
pokeRods.add(item)
|
||||||
return item
|
return item
|
||||||
@@ -1277,6 +1278,7 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
|
|||||||
CobblemonHeldItemManager.registerRemap(it, remappedName)
|
CobblemonHeldItemManager.registerRemap(it, remappedName)
|
||||||
CobblemonHeldItemManager.registerRemap(Items.BONE, "thickclub")
|
CobblemonHeldItemManager.registerRemap(Items.BONE, "thickclub")
|
||||||
CobblemonHeldItemManager.registerRemap(Items.SNOWBALL, "snowball")
|
CobblemonHeldItemManager.registerRemap(Items.SNOWBALL, "snowball")
|
||||||
|
CobblemonHeldItemManager.registerRemap(Items.GOLD_BLOCK, "bignugget")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
package com.cobblemon.mod.common
|
package com.cobblemon.mod.common
|
||||||
|
|
||||||
import com.cobblemon.mod.common.api.net.NetworkPacket
|
import com.cobblemon.mod.common.api.net.NetworkPacket
|
||||||
|
import com.cobblemon.mod.common.client.net.CalculateSeatPositionsHandler
|
||||||
import com.cobblemon.mod.common.client.net.PlayerInteractOptionsHandler
|
import com.cobblemon.mod.common.client.net.PlayerInteractOptionsHandler
|
||||||
import com.cobblemon.mod.common.client.net.SetClientPlayerDataHandler
|
import com.cobblemon.mod.common.client.net.SetClientPlayerDataHandler
|
||||||
import com.cobblemon.mod.common.client.net.animation.PlayPosableAnimationHandler
|
import com.cobblemon.mod.common.client.net.animation.PlayPosableAnimationHandler
|
||||||
@@ -34,6 +35,7 @@ import com.cobblemon.mod.common.client.net.pasture.PokemonPasturedHandler
|
|||||||
import com.cobblemon.mod.common.client.net.pasture.PokemonUnpasturedHandler
|
import com.cobblemon.mod.common.client.net.pasture.PokemonUnpasturedHandler
|
||||||
import com.cobblemon.mod.common.client.net.pokedex.ServerConfirmedRegisterHandler
|
import com.cobblemon.mod.common.client.net.pokedex.ServerConfirmedRegisterHandler
|
||||||
import com.cobblemon.mod.common.client.net.pokemon.update.PokemonUpdatePacketHandler
|
import com.cobblemon.mod.common.client.net.pokemon.update.PokemonUpdatePacketHandler
|
||||||
|
import com.cobblemon.mod.common.client.net.settings.OpenCobblemonConfigEditorHandler
|
||||||
import com.cobblemon.mod.common.client.net.settings.ServerSettingsPacketHandler
|
import com.cobblemon.mod.common.client.net.settings.ServerSettingsPacketHandler
|
||||||
import com.cobblemon.mod.common.client.net.sound.UnvalidatedPlaySoundS2CPacketHandler
|
import com.cobblemon.mod.common.client.net.sound.UnvalidatedPlaySoundS2CPacketHandler
|
||||||
import com.cobblemon.mod.common.client.net.spawn.SpawnExtraDataEntityHandler
|
import com.cobblemon.mod.common.client.net.spawn.SpawnExtraDataEntityHandler
|
||||||
@@ -44,15 +46,18 @@ import com.cobblemon.mod.common.client.net.storage.party.InitializePartyHandler
|
|||||||
import com.cobblemon.mod.common.client.net.storage.party.MoveClientPartyPokemonHandler
|
import com.cobblemon.mod.common.client.net.storage.party.MoveClientPartyPokemonHandler
|
||||||
import com.cobblemon.mod.common.client.net.storage.party.SetPartyPokemonHandler
|
import com.cobblemon.mod.common.client.net.storage.party.SetPartyPokemonHandler
|
||||||
import com.cobblemon.mod.common.client.net.storage.party.SetPartyReferenceHandler
|
import com.cobblemon.mod.common.client.net.storage.party.SetPartyReferenceHandler
|
||||||
import com.cobblemon.mod.common.client.net.storage.pc.ClosePCHandler
|
import com.cobblemon.mod.common.client.net.storage.pc.*
|
||||||
import com.cobblemon.mod.common.client.net.storage.pc.InitializePCHandler
|
|
||||||
import com.cobblemon.mod.common.client.net.storage.pc.MoveClientPCPokemonHandler
|
|
||||||
import com.cobblemon.mod.common.client.net.storage.pc.OpenPCHandler
|
|
||||||
import com.cobblemon.mod.common.client.net.storage.pc.SetPCBoxPokemonHandler
|
|
||||||
import com.cobblemon.mod.common.client.net.storage.pc.SetPCPokemonHandler
|
|
||||||
import com.cobblemon.mod.common.client.net.toast.ToastPacketHandler
|
import com.cobblemon.mod.common.client.net.toast.ToastPacketHandler
|
||||||
import com.cobblemon.mod.common.client.net.trade.*
|
import com.cobblemon.mod.common.client.net.trade.TradeAcceptanceChangedHandler
|
||||||
|
import com.cobblemon.mod.common.client.net.trade.TradeCancelledHandler
|
||||||
|
import com.cobblemon.mod.common.client.net.trade.TradeCompletedHandler
|
||||||
|
import com.cobblemon.mod.common.client.net.trade.TradeOfferExpiredHandler
|
||||||
|
import com.cobblemon.mod.common.client.net.trade.TradeOfferNotificationHandler
|
||||||
|
import com.cobblemon.mod.common.client.net.trade.TradeProcessStartedHandler
|
||||||
|
import com.cobblemon.mod.common.client.net.trade.TradeStartedHandler
|
||||||
|
import com.cobblemon.mod.common.client.net.trade.TradeUpdatedHandler
|
||||||
import com.cobblemon.mod.common.net.PacketRegisterInfo
|
import com.cobblemon.mod.common.net.PacketRegisterInfo
|
||||||
|
import com.cobblemon.mod.common.net.messages.client.CalculateSeatPositionsPacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.PlayerInteractOptionsPacket
|
import com.cobblemon.mod.common.net.messages.client.PlayerInteractOptionsPacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.SetClientPlayerDataPacket
|
import com.cobblemon.mod.common.net.messages.client.SetClientPlayerDataPacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.animation.PlayPosableAnimationPacket
|
import com.cobblemon.mod.common.net.messages.client.animation.PlayPosableAnimationPacket
|
||||||
@@ -66,9 +71,6 @@ import com.cobblemon.mod.common.net.messages.client.dialogue.DialogueOpenedPacke
|
|||||||
import com.cobblemon.mod.common.net.messages.client.effect.RunPosableMoLangPacket
|
import com.cobblemon.mod.common.net.messages.client.effect.RunPosableMoLangPacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.effect.SpawnSnowstormEntityParticlePacket
|
import com.cobblemon.mod.common.net.messages.client.effect.SpawnSnowstormEntityParticlePacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.effect.SpawnSnowstormParticlePacket
|
import com.cobblemon.mod.common.net.messages.client.effect.SpawnSnowstormParticlePacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.fishing.FishingBaitRegistrySyncPacket
|
|
||||||
import com.cobblemon.mod.common.net.messages.client.fossil.FossilRegistrySyncPacket
|
|
||||||
import com.cobblemon.mod.common.net.messages.client.fossil.NaturalMaterialRegistrySyncPacket
|
|
||||||
import com.cobblemon.mod.common.net.messages.client.npc.CloseNPCEditorPacket
|
import com.cobblemon.mod.common.net.messages.client.npc.CloseNPCEditorPacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.npc.OpenNPCEditorPacket
|
import com.cobblemon.mod.common.net.messages.client.npc.OpenNPCEditorPacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.pasture.ClosePasturePacket
|
import com.cobblemon.mod.common.net.messages.client.pasture.ClosePasturePacket
|
||||||
@@ -80,6 +82,7 @@ import com.cobblemon.mod.common.net.messages.client.pokemon.update.*
|
|||||||
import com.cobblemon.mod.common.net.messages.client.pokemon.update.evolution.AddEvolutionPacket
|
import com.cobblemon.mod.common.net.messages.client.pokemon.update.evolution.AddEvolutionPacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.pokemon.update.evolution.ClearEvolutionsPacket
|
import com.cobblemon.mod.common.net.messages.client.pokemon.update.evolution.ClearEvolutionsPacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.pokemon.update.evolution.RemoveEvolutionPacket
|
import com.cobblemon.mod.common.net.messages.client.pokemon.update.evolution.RemoveEvolutionPacket
|
||||||
|
import com.cobblemon.mod.common.net.messages.client.settings.OpenCobblemonConfigScreenPacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.settings.ServerSettingsPacket
|
import com.cobblemon.mod.common.net.messages.client.settings.ServerSettingsPacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.sound.UnvalidatedPlaySoundS2CPacket
|
import com.cobblemon.mod.common.net.messages.client.sound.UnvalidatedPlaySoundS2CPacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.spawn.SpawnGenericBedrockPacket
|
import com.cobblemon.mod.common.net.messages.client.spawn.SpawnGenericBedrockPacket
|
||||||
@@ -93,14 +96,42 @@ import com.cobblemon.mod.common.net.messages.client.storage.party.InitializePart
|
|||||||
import com.cobblemon.mod.common.net.messages.client.storage.party.MoveClientPartyPokemonPacket
|
import com.cobblemon.mod.common.net.messages.client.storage.party.MoveClientPartyPokemonPacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.storage.party.SetPartyPokemonPacket
|
import com.cobblemon.mod.common.net.messages.client.storage.party.SetPartyPokemonPacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.storage.party.SetPartyReferencePacket
|
import com.cobblemon.mod.common.net.messages.client.storage.party.SetPartyReferencePacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.storage.pc.*
|
import com.cobblemon.mod.common.net.messages.client.storage.pc.ClosePCPacket
|
||||||
|
import com.cobblemon.mod.common.net.messages.client.storage.pc.InitializePCPacket
|
||||||
|
import com.cobblemon.mod.common.net.messages.client.storage.pc.MoveClientPCPokemonPacket
|
||||||
|
import com.cobblemon.mod.common.net.messages.client.storage.pc.OpenPCPacket
|
||||||
|
import com.cobblemon.mod.common.net.messages.client.storage.pc.RenamePCBoxPacket
|
||||||
|
import com.cobblemon.mod.common.net.messages.client.storage.pc.SetPCBoxPacket
|
||||||
|
import com.cobblemon.mod.common.net.messages.client.storage.pc.SetPCPokemonPacket
|
||||||
|
import com.cobblemon.mod.common.net.messages.client.storage.pc.wallpaper.ChangePCBoxWallpaperPacket
|
||||||
|
import com.cobblemon.mod.common.net.messages.client.storage.pc.wallpaper.RequestPCBoxWallpapersPacket
|
||||||
|
import com.cobblemon.mod.common.net.messages.client.storage.pc.wallpaper.SetPCBoxWallpapersPacket
|
||||||
|
import com.cobblemon.mod.common.net.messages.client.storage.pc.wallpaper.UnlockPCBoxWallpaperPacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.toast.ToastPacket
|
import com.cobblemon.mod.common.net.messages.client.toast.ToastPacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.trade.*
|
import com.cobblemon.mod.common.net.messages.client.trade.TradeAcceptanceChangedPacket
|
||||||
|
import com.cobblemon.mod.common.net.messages.client.trade.TradeCancelledPacket
|
||||||
|
import com.cobblemon.mod.common.net.messages.client.trade.TradeCompletedPacket
|
||||||
|
import com.cobblemon.mod.common.net.messages.client.trade.TradeOfferExpiredPacket
|
||||||
|
import com.cobblemon.mod.common.net.messages.client.trade.TradeOfferNotificationPacket
|
||||||
|
import com.cobblemon.mod.common.net.messages.client.trade.TradeProcessStartedPacket
|
||||||
|
import com.cobblemon.mod.common.net.messages.client.trade.TradeStartedPacket
|
||||||
|
import com.cobblemon.mod.common.net.messages.client.trade.TradeUpdatedPacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.ui.InteractPokemonUIPacket
|
import com.cobblemon.mod.common.net.messages.client.ui.InteractPokemonUIPacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.ui.PokedexUIPacket
|
import com.cobblemon.mod.common.net.messages.client.ui.PokedexUIPacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.ui.SummaryUIPacket
|
import com.cobblemon.mod.common.net.messages.client.ui.SummaryUIPacket
|
||||||
import com.cobblemon.mod.common.net.messages.server.*
|
import com.cobblemon.mod.common.net.messages.server.BattleChallengePacket
|
||||||
import com.cobblemon.mod.common.net.messages.server.battle.*
|
import com.cobblemon.mod.common.net.messages.server.BattleChallengeResponsePacket
|
||||||
|
import com.cobblemon.mod.common.net.messages.server.BenchMovePacket
|
||||||
|
import com.cobblemon.mod.common.net.messages.server.RequestMoveSwapPacket
|
||||||
|
import com.cobblemon.mod.common.net.messages.server.RequestPlayerInteractionsPacket
|
||||||
|
import com.cobblemon.mod.common.net.messages.server.SelectStarterPacket
|
||||||
|
import com.cobblemon.mod.common.net.messages.server.SendOutPokemonPacket
|
||||||
|
import com.cobblemon.mod.common.net.messages.server.battle.BattleSelectActionsPacket
|
||||||
|
import com.cobblemon.mod.common.net.messages.server.battle.BattleTeamLeavePacket
|
||||||
|
import com.cobblemon.mod.common.net.messages.server.battle.BattleTeamRequestPacket
|
||||||
|
import com.cobblemon.mod.common.net.messages.server.battle.BattleTeamResponsePacket
|
||||||
|
import com.cobblemon.mod.common.net.messages.server.battle.RemoveSpectatorPacket
|
||||||
|
import com.cobblemon.mod.common.net.messages.server.battle.SpectateBattlePacket
|
||||||
import com.cobblemon.mod.common.net.messages.server.block.AdjustBlockEntityViewerCountPacket
|
import com.cobblemon.mod.common.net.messages.server.block.AdjustBlockEntityViewerCountPacket
|
||||||
import com.cobblemon.mod.common.net.messages.server.callback.move.MoveSelectCancelledPacket
|
import com.cobblemon.mod.common.net.messages.server.callback.move.MoveSelectCancelledPacket
|
||||||
import com.cobblemon.mod.common.net.messages.server.callback.move.MoveSelectedPacket
|
import com.cobblemon.mod.common.net.messages.server.callback.move.MoveSelectedPacket
|
||||||
@@ -111,12 +142,14 @@ import com.cobblemon.mod.common.net.messages.server.callback.partymove.PartyPoke
|
|||||||
import com.cobblemon.mod.common.net.messages.server.dialogue.EscapeDialoguePacket
|
import com.cobblemon.mod.common.net.messages.server.dialogue.EscapeDialoguePacket
|
||||||
import com.cobblemon.mod.common.net.messages.server.dialogue.InputToDialoguePacket
|
import com.cobblemon.mod.common.net.messages.server.dialogue.InputToDialoguePacket
|
||||||
import com.cobblemon.mod.common.net.messages.server.npc.SaveNPCPacket
|
import com.cobblemon.mod.common.net.messages.server.npc.SaveNPCPacket
|
||||||
|
import com.cobblemon.mod.common.net.messages.server.orientation.C2SUpdateOrientationPacket
|
||||||
import com.cobblemon.mod.common.net.messages.server.pasture.PasturePokemonPacket
|
import com.cobblemon.mod.common.net.messages.server.pasture.PasturePokemonPacket
|
||||||
import com.cobblemon.mod.common.net.messages.server.pasture.UnpastureAllPokemonPacket
|
import com.cobblemon.mod.common.net.messages.server.pasture.UnpastureAllPokemonPacket
|
||||||
import com.cobblemon.mod.common.net.messages.server.pasture.UnpasturePokemonPacket
|
import com.cobblemon.mod.common.net.messages.server.pasture.UnpasturePokemonPacket
|
||||||
import com.cobblemon.mod.common.net.messages.server.pokedex.scanner.FinishScanningPacket
|
import com.cobblemon.mod.common.net.messages.server.pokedex.scanner.FinishScanningPacket
|
||||||
import com.cobblemon.mod.common.net.messages.server.pokedex.scanner.StartScanningPacket
|
import com.cobblemon.mod.common.net.messages.server.pokedex.scanner.StartScanningPacket
|
||||||
import com.cobblemon.mod.common.net.messages.server.pokemon.interact.InteractPokemonPacket
|
import com.cobblemon.mod.common.net.messages.server.pokemon.interact.InteractPokemonPacket
|
||||||
|
import com.cobblemon.mod.common.net.messages.server.pokemon.update.SetItemHiddenPacket
|
||||||
import com.cobblemon.mod.common.net.messages.server.pokemon.update.SetNicknamePacket
|
import com.cobblemon.mod.common.net.messages.server.pokemon.update.SetNicknamePacket
|
||||||
import com.cobblemon.mod.common.net.messages.server.pokemon.update.evolution.AcceptEvolutionPacket
|
import com.cobblemon.mod.common.net.messages.server.pokemon.update.evolution.AcceptEvolutionPacket
|
||||||
import com.cobblemon.mod.common.net.messages.server.starter.RequestStarterScreenPacket
|
import com.cobblemon.mod.common.net.messages.server.starter.RequestStarterScreenPacket
|
||||||
@@ -124,15 +157,22 @@ import com.cobblemon.mod.common.net.messages.server.storage.SwapPCPartyPokemonPa
|
|||||||
import com.cobblemon.mod.common.net.messages.server.storage.party.MovePartyPokemonPacket
|
import com.cobblemon.mod.common.net.messages.server.storage.party.MovePartyPokemonPacket
|
||||||
import com.cobblemon.mod.common.net.messages.server.storage.party.ReleasePartyPokemonPacket
|
import com.cobblemon.mod.common.net.messages.server.storage.party.ReleasePartyPokemonPacket
|
||||||
import com.cobblemon.mod.common.net.messages.server.storage.party.SwapPartyPokemonPacket
|
import com.cobblemon.mod.common.net.messages.server.storage.party.SwapPartyPokemonPacket
|
||||||
import com.cobblemon.mod.common.net.messages.server.storage.pc.MovePCPokemonPacket
|
import com.cobblemon.mod.common.net.messages.server.storage.pc.*
|
||||||
import com.cobblemon.mod.common.net.messages.server.storage.pc.MovePCPokemonToPartyPacket
|
import com.cobblemon.mod.common.net.messages.server.trade.AcceptTradeRequestPacket
|
||||||
import com.cobblemon.mod.common.net.messages.server.storage.pc.MovePartyPokemonToPCPacket
|
import com.cobblemon.mod.common.net.messages.server.trade.CancelTradePacket
|
||||||
import com.cobblemon.mod.common.net.messages.server.storage.pc.ReleasePCPokemonPacket
|
import com.cobblemon.mod.common.net.messages.server.trade.ChangeTradeAcceptancePacket
|
||||||
import com.cobblemon.mod.common.net.messages.server.storage.pc.SwapPCPokemonPacket
|
import com.cobblemon.mod.common.net.messages.server.trade.OfferTradePacket
|
||||||
import com.cobblemon.mod.common.net.messages.server.storage.pc.UnlinkPlayerFromPCPacket
|
import com.cobblemon.mod.common.net.messages.server.trade.PerformTradePacket
|
||||||
import com.cobblemon.mod.common.net.messages.server.trade.*
|
import com.cobblemon.mod.common.net.messages.server.trade.UpdateTradeOfferPacket
|
||||||
import com.cobblemon.mod.common.net.serverhandling.*
|
import com.cobblemon.mod.common.net.serverhandling.ChallengeHandler
|
||||||
import com.cobblemon.mod.common.net.serverhandling.battle.*
|
import com.cobblemon.mod.common.net.serverhandling.ChallengeResponseHandler
|
||||||
|
import com.cobblemon.mod.common.net.serverhandling.RequestInteractionsHandler
|
||||||
|
import com.cobblemon.mod.common.net.serverhandling.battle.BattleSelectActionsHandler
|
||||||
|
import com.cobblemon.mod.common.net.serverhandling.battle.RemoveSpectatorHandler
|
||||||
|
import com.cobblemon.mod.common.net.serverhandling.battle.SpectateBattleHandler
|
||||||
|
import com.cobblemon.mod.common.net.serverhandling.battle.TeamLeaveHandler
|
||||||
|
import com.cobblemon.mod.common.net.serverhandling.battle.TeamRequestHandler
|
||||||
|
import com.cobblemon.mod.common.net.serverhandling.battle.TeamRequestResponseHandler
|
||||||
import com.cobblemon.mod.common.net.serverhandling.block.AdjustBlockEntityViewerCountHandler
|
import com.cobblemon.mod.common.net.serverhandling.block.AdjustBlockEntityViewerCountHandler
|
||||||
import com.cobblemon.mod.common.net.serverhandling.callback.move.MoveSelectCancelledHandler
|
import com.cobblemon.mod.common.net.serverhandling.callback.move.MoveSelectCancelledHandler
|
||||||
import com.cobblemon.mod.common.net.serverhandling.callback.move.MoveSelectedHandler
|
import com.cobblemon.mod.common.net.serverhandling.callback.move.MoveSelectedHandler
|
||||||
@@ -144,12 +184,14 @@ import com.cobblemon.mod.common.net.serverhandling.dialogue.EscapeDialogueHandle
|
|||||||
import com.cobblemon.mod.common.net.serverhandling.dialogue.InputToDialogueHandler
|
import com.cobblemon.mod.common.net.serverhandling.dialogue.InputToDialogueHandler
|
||||||
import com.cobblemon.mod.common.net.serverhandling.evolution.AcceptEvolutionHandler
|
import com.cobblemon.mod.common.net.serverhandling.evolution.AcceptEvolutionHandler
|
||||||
import com.cobblemon.mod.common.net.serverhandling.npc.SaveNPCHandler
|
import com.cobblemon.mod.common.net.serverhandling.npc.SaveNPCHandler
|
||||||
|
import com.cobblemon.mod.common.net.serverhandling.orientation.OrientationPacketHandler
|
||||||
import com.cobblemon.mod.common.net.serverhandling.pasture.PasturePokemonHandler
|
import com.cobblemon.mod.common.net.serverhandling.pasture.PasturePokemonHandler
|
||||||
import com.cobblemon.mod.common.net.serverhandling.pasture.UnpastureAllPokemonHandler
|
import com.cobblemon.mod.common.net.serverhandling.pasture.UnpastureAllPokemonHandler
|
||||||
import com.cobblemon.mod.common.net.serverhandling.pasture.UnpasturePokemonHandler
|
import com.cobblemon.mod.common.net.serverhandling.pasture.UnpasturePokemonHandler
|
||||||
import com.cobblemon.mod.common.net.serverhandling.pokedex.scanner.FinishScanningHandler
|
import com.cobblemon.mod.common.net.serverhandling.pokedex.scanner.FinishScanningHandler
|
||||||
import com.cobblemon.mod.common.net.serverhandling.pokedex.scanner.StartScanningHandler
|
import com.cobblemon.mod.common.net.serverhandling.pokedex.scanner.StartScanningHandler
|
||||||
import com.cobblemon.mod.common.net.serverhandling.pokemon.interact.InteractPokemonHandler
|
import com.cobblemon.mod.common.net.serverhandling.pokemon.interact.InteractPokemonHandler
|
||||||
|
import com.cobblemon.mod.common.net.serverhandling.pokemon.update.SetItemHiddenHandler
|
||||||
import com.cobblemon.mod.common.net.serverhandling.pokemon.update.SetNicknameHandler
|
import com.cobblemon.mod.common.net.serverhandling.pokemon.update.SetNicknameHandler
|
||||||
import com.cobblemon.mod.common.net.serverhandling.starter.RequestStarterScreenHandler
|
import com.cobblemon.mod.common.net.serverhandling.starter.RequestStarterScreenHandler
|
||||||
import com.cobblemon.mod.common.net.serverhandling.starter.SelectStarterPacketHandler
|
import com.cobblemon.mod.common.net.serverhandling.starter.SelectStarterPacketHandler
|
||||||
@@ -160,13 +202,13 @@ import com.cobblemon.mod.common.net.serverhandling.storage.SwapPCPartyPokemonHan
|
|||||||
import com.cobblemon.mod.common.net.serverhandling.storage.party.MovePartyPokemonHandler
|
import com.cobblemon.mod.common.net.serverhandling.storage.party.MovePartyPokemonHandler
|
||||||
import com.cobblemon.mod.common.net.serverhandling.storage.party.ReleasePCPokemonHandler
|
import com.cobblemon.mod.common.net.serverhandling.storage.party.ReleasePCPokemonHandler
|
||||||
import com.cobblemon.mod.common.net.serverhandling.storage.party.SwapPartyPokemonHandler
|
import com.cobblemon.mod.common.net.serverhandling.storage.party.SwapPartyPokemonHandler
|
||||||
import com.cobblemon.mod.common.net.serverhandling.storage.pc.MovePCPokemonHandler
|
import com.cobblemon.mod.common.net.serverhandling.storage.pc.*
|
||||||
import com.cobblemon.mod.common.net.serverhandling.storage.pc.MovePCPokemonToPartyHandler
|
import com.cobblemon.mod.common.net.serverhandling.trade.AcceptTradeRequestHandler
|
||||||
import com.cobblemon.mod.common.net.serverhandling.storage.pc.MovePartyPokemonToPCHandler
|
import com.cobblemon.mod.common.net.serverhandling.trade.CancelTradeHandler
|
||||||
import com.cobblemon.mod.common.net.serverhandling.storage.pc.ReleasePartyPokemonHandler
|
import com.cobblemon.mod.common.net.serverhandling.trade.ChangeTradeAcceptanceHandler
|
||||||
import com.cobblemon.mod.common.net.serverhandling.storage.pc.SwapPCPokemonHandler
|
import com.cobblemon.mod.common.net.serverhandling.trade.OfferTradeHandler
|
||||||
import com.cobblemon.mod.common.net.serverhandling.storage.pc.UnlinkPlayerFromPCHandler
|
import com.cobblemon.mod.common.net.serverhandling.trade.PerformTradeHandler
|
||||||
import com.cobblemon.mod.common.net.serverhandling.trade.*
|
import com.cobblemon.mod.common.net.serverhandling.trade.UpdateTradeOfferHandler
|
||||||
import com.cobblemon.mod.common.util.server
|
import com.cobblemon.mod.common.util.server
|
||||||
import net.minecraft.server.level.ServerPlayer
|
import net.minecraft.server.level.ServerPlayer
|
||||||
|
|
||||||
@@ -179,13 +221,11 @@ import net.minecraft.server.level.ServerPlayer
|
|||||||
* @since November 27th, 2021
|
* @since November 27th, 2021
|
||||||
*/
|
*/
|
||||||
object CobblemonNetwork {
|
object CobblemonNetwork {
|
||||||
//private val logger = LogUtils.getLogger()
|
|
||||||
|
|
||||||
fun ServerPlayer.sendPacket(packet: NetworkPacket<*>) {
|
fun ServerPlayer.sendPacket(packet: NetworkPacket<*>) {
|
||||||
sendPacketToPlayer(this, packet)
|
sendPacketToPlayer(this, packet)
|
||||||
}
|
}
|
||||||
fun sendToServer(packet: NetworkPacket<*>) {
|
fun sendToServer(packet: NetworkPacket<*>) {
|
||||||
//logger.info("[C->S] ${packet.type()}")
|
|
||||||
Cobblemon.implementation.networkManager.sendToServer(packet)
|
Cobblemon.implementation.networkManager.sendToServer(packet)
|
||||||
}
|
}
|
||||||
fun sendToAllPlayers(packet: NetworkPacket<*>) = sendPacketToPlayers(server()!!.playerList.players, packet)
|
fun sendToAllPlayers(packet: NetworkPacket<*>) = sendPacketToPlayers(server()!!.playerList.players, packet)
|
||||||
@@ -221,6 +261,10 @@ object CobblemonNetwork {
|
|||||||
list.add(PacketRegisterInfo(SpeciesFeatureUpdatePacket.ID, SpeciesFeatureUpdatePacket::decode, PokemonUpdatePacketHandler()))
|
list.add(PacketRegisterInfo(SpeciesFeatureUpdatePacket.ID, SpeciesFeatureUpdatePacket::decode, PokemonUpdatePacketHandler()))
|
||||||
list.add(PacketRegisterInfo(OriginalTrainerUpdatePacket.ID, OriginalTrainerUpdatePacket::decode, PokemonUpdatePacketHandler()))
|
list.add(PacketRegisterInfo(OriginalTrainerUpdatePacket.ID, OriginalTrainerUpdatePacket::decode, PokemonUpdatePacketHandler()))
|
||||||
list.add(PacketRegisterInfo(FormUpdatePacket.ID, FormUpdatePacket::decode, PokemonUpdatePacketHandler()))
|
list.add(PacketRegisterInfo(FormUpdatePacket.ID, FormUpdatePacket::decode, PokemonUpdatePacketHandler()))
|
||||||
|
list.add(PacketRegisterInfo(TeraTypeUpdatePacket.ID, TeraTypeUpdatePacket::decode, PokemonUpdatePacketHandler()))
|
||||||
|
list.add(PacketRegisterInfo(DmaxLevelUpdatePacket.ID, DmaxLevelUpdatePacket::decode, PokemonUpdatePacketHandler()))
|
||||||
|
list.add(PacketRegisterInfo(GmaxFactorUpdatePacket.ID, GmaxFactorUpdatePacket::decode, PokemonUpdatePacketHandler()))
|
||||||
|
list.add(PacketRegisterInfo(CosmeticItemUpdatePacket.ID, CosmeticItemUpdatePacket::decode, PokemonUpdatePacketHandler()))
|
||||||
|
|
||||||
// Evolution start
|
// Evolution start
|
||||||
list.add(PacketRegisterInfo(AddEvolutionPacket.ID, AddEvolutionPacket::decode, PokemonUpdatePacketHandler()))
|
list.add(PacketRegisterInfo(AddEvolutionPacket.ID, AddEvolutionPacket::decode, PokemonUpdatePacketHandler()))
|
||||||
@@ -235,13 +279,19 @@ object CobblemonNetwork {
|
|||||||
list.add(PacketRegisterInfo(SetPartyReferencePacket.ID, SetPartyReferencePacket::decode, SetPartyReferenceHandler))
|
list.add(PacketRegisterInfo(SetPartyReferencePacket.ID, SetPartyReferencePacket::decode, SetPartyReferenceHandler))
|
||||||
list.add(PacketRegisterInfo(InitializePCPacket.ID, InitializePCPacket::decode, InitializePCHandler))
|
list.add(PacketRegisterInfo(InitializePCPacket.ID, InitializePCPacket::decode, InitializePCHandler))
|
||||||
list.add(PacketRegisterInfo(MoveClientPCPokemonPacket.ID, MoveClientPCPokemonPacket::decode, MoveClientPCPokemonHandler))
|
list.add(PacketRegisterInfo(MoveClientPCPokemonPacket.ID, MoveClientPCPokemonPacket::decode, MoveClientPCPokemonHandler))
|
||||||
list.add(PacketRegisterInfo(SetPCBoxPokemonPacket.ID, SetPCBoxPokemonPacket::decode, SetPCBoxPokemonHandler))
|
list.add(PacketRegisterInfo(SetPCBoxPacket.ID, SetPCBoxPacket::decode, SetPCBoxHandler))
|
||||||
list.add(PacketRegisterInfo(SetPCPokemonPacket.ID, SetPCPokemonPacket::decode, SetPCPokemonHandler))
|
list.add(PacketRegisterInfo(SetPCPokemonPacket.ID, SetPCPokemonPacket::decode, SetPCPokemonHandler))
|
||||||
list.add(PacketRegisterInfo(OpenPCPacket.ID, OpenPCPacket::decode, OpenPCHandler))
|
list.add(PacketRegisterInfo(OpenPCPacket.ID, OpenPCPacket::decode, OpenPCHandler))
|
||||||
list.add(PacketRegisterInfo(ClosePCPacket.ID, ClosePCPacket::decode, ClosePCHandler))
|
list.add(PacketRegisterInfo(ClosePCPacket.ID, ClosePCPacket::decode, ClosePCHandler))
|
||||||
list.add(PacketRegisterInfo(SwapClientPokemonPacket.ID, SwapClientPokemonPacket::decode, SwapClientPokemonHandler))
|
list.add(PacketRegisterInfo(SwapClientPokemonPacket.ID, SwapClientPokemonPacket::decode, SwapClientPokemonHandler))
|
||||||
list.add(PacketRegisterInfo(RemoveClientPokemonPacket.ID, RemoveClientPokemonPacket::decode, RemoveClientPokemonHandler))
|
list.add(PacketRegisterInfo(RemoveClientPokemonPacket.ID, RemoveClientPokemonPacket::decode, RemoveClientPokemonHandler))
|
||||||
|
|
||||||
|
list.add(PacketRegisterInfo(RenamePCBoxPacket.ID, RenamePCBoxPacket::decode, RenamePCBoxHandler))
|
||||||
|
list.add(PacketRegisterInfo(RequestPCBoxWallpapersPacket.ID, RequestPCBoxWallpapersPacket::decode, RequestPCBoxWallpapersHandler))
|
||||||
|
list.add(PacketRegisterInfo(SetPCBoxWallpapersPacket.ID, SetPCBoxWallpapersPacket::decode, SetPCBoxWallpapersHandler))
|
||||||
|
list.add(PacketRegisterInfo(ChangePCBoxWallpaperPacket.ID, ChangePCBoxWallpaperPacket::decode, ChangePCBoxWallpaperHandler))
|
||||||
|
list.add(PacketRegisterInfo(UnlockPCBoxWallpaperPacket.ID, UnlockPCBoxWallpaperPacket::decode, UnlockPCBoxWallpaperHandler))
|
||||||
|
|
||||||
// UI Packets
|
// UI Packets
|
||||||
list.add(PacketRegisterInfo(SummaryUIPacket.ID, SummaryUIPacket::decode, SummaryUIPacketHandler))
|
list.add(PacketRegisterInfo(SummaryUIPacket.ID, SummaryUIPacket::decode, SummaryUIPacketHandler))
|
||||||
list.add(PacketRegisterInfo(InteractPokemonUIPacket.ID, InteractPokemonUIPacket::decode, InteractPokemonUIPacketHandler))
|
list.add(PacketRegisterInfo(InteractPokemonUIPacket.ID, InteractPokemonUIPacket::decode, InteractPokemonUIPacketHandler))
|
||||||
@@ -279,11 +329,13 @@ object CobblemonNetwork {
|
|||||||
// MultiBattleTeam Packets
|
// MultiBattleTeam Packets
|
||||||
list.add(PacketRegisterInfo(TeamRequestNotificationPacket.ID, TeamRequestNotificationPacket::decode, TeamRequestNotificationHandler))
|
list.add(PacketRegisterInfo(TeamRequestNotificationPacket.ID, TeamRequestNotificationPacket::decode, TeamRequestNotificationHandler))
|
||||||
list.add(PacketRegisterInfo(TeamRequestExpiredPacket.ID, TeamRequestExpiredPacket::decode, TeamRequestExpiredHandler))
|
list.add(PacketRegisterInfo(TeamRequestExpiredPacket.ID, TeamRequestExpiredPacket::decode, TeamRequestExpiredHandler))
|
||||||
|
list.add(PacketRegisterInfo(TeamMemberAddNotificationPacket.ID, TeamMemberAddNotificationPacket::decode, TeamMemberAddNotificationHandler))
|
||||||
list.add(PacketRegisterInfo(TeamMemberRemoveNotificationPacket.ID, TeamMemberRemoveNotificationPacket::decode, TeamMemberRemoveNotificationHandler))
|
list.add(PacketRegisterInfo(TeamMemberRemoveNotificationPacket.ID, TeamMemberRemoveNotificationPacket::decode, TeamMemberRemoveNotificationHandler))
|
||||||
list.add(PacketRegisterInfo(TeamJoinNotificationPacket.ID, TeamJoinNotificationPacket::decode, TeamJoinNotificationHandler))
|
list.add(PacketRegisterInfo(TeamJoinNotificationPacket.ID, TeamJoinNotificationPacket::decode, TeamJoinNotificationHandler))
|
||||||
|
|
||||||
// Settings packets
|
// Settings packets
|
||||||
list.add(PacketRegisterInfo(ServerSettingsPacket.ID, ServerSettingsPacket::decode, ServerSettingsPacketHandler))
|
list.add(PacketRegisterInfo(ServerSettingsPacket.ID, ServerSettingsPacket::decode, ServerSettingsPacketHandler))
|
||||||
|
list.add(PacketRegisterInfo(OpenCobblemonConfigScreenPacket.ID, OpenCobblemonConfigScreenPacket::decode, OpenCobblemonConfigEditorHandler))
|
||||||
|
|
||||||
// Data registries
|
// Data registries
|
||||||
list.add(PacketRegisterInfo(AbilityRegistrySyncPacket.ID, AbilityRegistrySyncPacket::decode, DataRegistrySyncPacketHandler()))
|
list.add(PacketRegisterInfo(AbilityRegistrySyncPacket.ID, AbilityRegistrySyncPacket::decode, DataRegistrySyncPacketHandler()))
|
||||||
@@ -304,6 +356,7 @@ object CobblemonNetwork {
|
|||||||
list.add(PacketRegisterInfo(DexEntrySyncPacket.ID, DexEntrySyncPacket::decode, DataRegistrySyncPacketHandler()))
|
list.add(PacketRegisterInfo(DexEntrySyncPacket.ID, DexEntrySyncPacket::decode, DataRegistrySyncPacketHandler()))
|
||||||
list.add(PacketRegisterInfo(FishingBaitRegistrySyncPacket.ID, FishingBaitRegistrySyncPacket::decode, DataRegistrySyncPacketHandler()))
|
list.add(PacketRegisterInfo(FishingBaitRegistrySyncPacket.ID, FishingBaitRegistrySyncPacket::decode, DataRegistrySyncPacketHandler()))
|
||||||
list.add(PacketRegisterInfo(FlowRegistrySyncPacket.ID, FlowRegistrySyncPacket::decode, DataRegistrySyncPacketHandler()))
|
list.add(PacketRegisterInfo(FlowRegistrySyncPacket.ID, FlowRegistrySyncPacket::decode, DataRegistrySyncPacketHandler()))
|
||||||
|
list.add(PacketRegisterInfo(CosmeticItemAssignmentSyncPacket.ID, CosmeticItemAssignmentSyncPacket::decode, DataRegistrySyncPacketHandler()))
|
||||||
|
|
||||||
// Effects
|
// Effects
|
||||||
list.add(PacketRegisterInfo(SpawnSnowstormParticlePacket.ID, SpawnSnowstormParticlePacket::decode, SpawnSnowstormParticleHandler))
|
list.add(PacketRegisterInfo(SpawnSnowstormParticlePacket.ID, SpawnSnowstormParticlePacket::decode, SpawnSnowstormParticleHandler))
|
||||||
@@ -356,6 +409,10 @@ object CobblemonNetwork {
|
|||||||
|
|
||||||
// Pokédex scanning
|
// Pokédex scanning
|
||||||
list.add(PacketRegisterInfo(ServerConfirmedRegisterPacket.ID, ServerConfirmedRegisterPacket::decode, ServerConfirmedRegisterHandler))
|
list.add(PacketRegisterInfo(ServerConfirmedRegisterPacket.ID, ServerConfirmedRegisterPacket::decode, ServerConfirmedRegisterHandler))
|
||||||
|
|
||||||
|
// Debug / cheats
|
||||||
|
list.add(PacketRegisterInfo(CalculateSeatPositionsPacket.ID, CalculateSeatPositionsPacket::decode, CalculateSeatPositionsHandler))
|
||||||
|
|
||||||
return list
|
return list
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -363,6 +420,7 @@ object CobblemonNetwork {
|
|||||||
val list = mutableListOf<PacketRegisterInfo<*>>()
|
val list = mutableListOf<PacketRegisterInfo<*>>()
|
||||||
// Pokemon Update Packets
|
// Pokemon Update Packets
|
||||||
list.add(PacketRegisterInfo(SetNicknamePacket.ID, SetNicknamePacket::decode, SetNicknameHandler))
|
list.add(PacketRegisterInfo(SetNicknamePacket.ID, SetNicknamePacket::decode, SetNicknameHandler))
|
||||||
|
list.add(PacketRegisterInfo(SetItemHiddenPacket.ID, SetItemHiddenPacket::decode, SetItemHiddenHandler))
|
||||||
|
|
||||||
// Evolution Packets
|
// Evolution Packets
|
||||||
list.add(PacketRegisterInfo(AcceptEvolutionPacket.ID, AcceptEvolutionPacket::decode, AcceptEvolutionHandler))
|
list.add(PacketRegisterInfo(AcceptEvolutionPacket.ID, AcceptEvolutionPacket::decode, AcceptEvolutionHandler))
|
||||||
@@ -387,6 +445,11 @@ object CobblemonNetwork {
|
|||||||
list.add(PacketRegisterInfo(ReleasePCPokemonPacket.ID, ReleasePCPokemonPacket::decode, ReleasePCPokemonHandler))
|
list.add(PacketRegisterInfo(ReleasePCPokemonPacket.ID, ReleasePCPokemonPacket::decode, ReleasePCPokemonHandler))
|
||||||
list.add(PacketRegisterInfo(UnlinkPlayerFromPCPacket.ID, UnlinkPlayerFromPCPacket::decode, UnlinkPlayerFromPCHandler))
|
list.add(PacketRegisterInfo(UnlinkPlayerFromPCPacket.ID, UnlinkPlayerFromPCPacket::decode, UnlinkPlayerFromPCHandler))
|
||||||
|
|
||||||
|
list.add(PacketRegisterInfo(RequestRenamePCBoxPacket.Companion.ID, RequestRenamePCBoxPacket.Companion::decode, RequestRenamePCBoxHandler))
|
||||||
|
list.add(PacketRegisterInfo(PCBoxWallpapersPacket.ID, PCBoxWallpapersPacket::decode, PCBoxWallpapersHandler))
|
||||||
|
list.add(PacketRegisterInfo(RequestChangePCBoxWallpaperPacket.ID, RequestChangePCBoxWallpaperPacket::decode, RequestChangePCBoxWallpaperHandler))
|
||||||
|
list.add(PacketRegisterInfo(MarkPCBoxWallpapersSeenPacket.ID, MarkPCBoxWallpapersSeenPacket::decode, MarkPCBoxWallpapersSeenHandler))
|
||||||
|
|
||||||
// Starter packets
|
// Starter packets
|
||||||
list.add(PacketRegisterInfo(SelectStarterPacket.ID, SelectStarterPacket::decode, SelectStarterPacketHandler))
|
list.add(PacketRegisterInfo(SelectStarterPacket.ID, SelectStarterPacket::decode, SelectStarterPacketHandler))
|
||||||
list.add(PacketRegisterInfo(RequestStarterScreenPacket.ID, RequestStarterScreenPacket::decode, RequestStarterScreenHandler))
|
list.add(PacketRegisterInfo(RequestStarterScreenPacket.ID, RequestStarterScreenPacket::decode, RequestStarterScreenHandler))
|
||||||
@@ -399,6 +462,8 @@ object CobblemonNetwork {
|
|||||||
|
|
||||||
list.add(PacketRegisterInfo(SwapPCPartyPokemonPacket.ID, SwapPCPartyPokemonPacket::decode, SwapPCPartyPokemonHandler))
|
list.add(PacketRegisterInfo(SwapPCPartyPokemonPacket.ID, SwapPCPartyPokemonPacket::decode, SwapPCPartyPokemonHandler))
|
||||||
|
|
||||||
|
list.add(PacketRegisterInfo(SortPCBoxPacket.ID, SortPCBoxPacket::decode, SortPCBoxHandler))
|
||||||
|
|
||||||
// Battle packets
|
// Battle packets
|
||||||
list.add(PacketRegisterInfo(BattleSelectActionsPacket.ID, BattleSelectActionsPacket::decode, BattleSelectActionsHandler))
|
list.add(PacketRegisterInfo(BattleSelectActionsPacket.ID, BattleSelectActionsPacket::decode, BattleSelectActionsHandler))
|
||||||
list.add(PacketRegisterInfo(SpectateBattlePacket.ID, SpectateBattlePacket::decode, SpectateBattleHandler))
|
list.add(PacketRegisterInfo(SpectateBattlePacket.ID, SpectateBattlePacket::decode, SpectateBattleHandler))
|
||||||
@@ -443,11 +508,13 @@ object CobblemonNetwork {
|
|||||||
// NPC packets
|
// NPC packets
|
||||||
list.add(PacketRegisterInfo(SaveNPCPacket.ID, SaveNPCPacket::decode, SaveNPCHandler))
|
list.add(PacketRegisterInfo(SaveNPCPacket.ID, SaveNPCPacket::decode, SaveNPCHandler))
|
||||||
|
|
||||||
|
// Orientation packet(s)
|
||||||
|
list.add(PacketRegisterInfo(C2SUpdateOrientationPacket.ID, C2SUpdateOrientationPacket::decode, OrientationPacketHandler))
|
||||||
|
|
||||||
return list
|
return list
|
||||||
}
|
}
|
||||||
|
|
||||||
fun sendPacketToPlayer(player: ServerPlayer, packet: NetworkPacket<*>) {
|
fun sendPacketToPlayer(player: ServerPlayer, packet: NetworkPacket<*>) {
|
||||||
//logger.info("[S->C] ${packet.type()}")
|
|
||||||
Cobblemon.implementation.networkManager.sendPacketToPlayer(player, packet)
|
Cobblemon.implementation.networkManager.sendPacketToPlayer(player, packet)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,6 +40,8 @@ object CobblemonSounds : PlatformRegistry<Registry<SoundEvent>, ResourceKey<Regi
|
|||||||
val PC_RELEASE = this.create("pc.release")
|
val PC_RELEASE = this.create("pc.release")
|
||||||
@JvmField
|
@JvmField
|
||||||
val PC_CLICK = this.create("pc.click")
|
val PC_CLICK = this.create("pc.click")
|
||||||
|
@JvmField
|
||||||
|
val PC_WALLPAPER_UNLOCK = this.create("pc.wallpaper.unlock")
|
||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val VILLAGER_WORK_NURSE = this.create("entity.villager.work_nurse")
|
val VILLAGER_WORK_NURSE = this.create("entity.villager.work_nurse")
|
||||||
|
|||||||
@@ -0,0 +1,63 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Cobblemon Contributors
|
||||||
|
*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.cobblemon.mod.common
|
||||||
|
|
||||||
|
import com.bedrockk.molang.Expression
|
||||||
|
import com.cobblemon.mod.common.api.data.JsonDataRegistry
|
||||||
|
import com.cobblemon.mod.common.api.molang.ExpressionLike
|
||||||
|
import com.cobblemon.mod.common.api.reactive.SimpleObservable
|
||||||
|
import com.cobblemon.mod.common.api.storage.pc.UnlockablePCWallpaper
|
||||||
|
import com.cobblemon.mod.common.util.adapters.ExpressionAdapter
|
||||||
|
import com.cobblemon.mod.common.util.adapters.ExpressionLikeAdapter
|
||||||
|
import com.cobblemon.mod.common.util.adapters.IdentifierAdapter
|
||||||
|
import com.cobblemon.mod.common.util.adapters.TextAdapter
|
||||||
|
import com.cobblemon.mod.common.util.cobblemonResource
|
||||||
|
import com.google.gson.Gson
|
||||||
|
import com.google.gson.GsonBuilder
|
||||||
|
import com.google.gson.reflect.TypeToken
|
||||||
|
import net.minecraft.network.chat.Component
|
||||||
|
import net.minecraft.resources.ResourceLocation
|
||||||
|
import net.minecraft.server.level.ServerPlayer
|
||||||
|
import net.minecraft.server.packs.PackType
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A data registry for unlockable wallpapers that can be applied to a PC box. This is different to a resource packed
|
||||||
|
* wallpaper, as those are purely client-side and don't require any unlocking.
|
||||||
|
*
|
||||||
|
* See docs/pc_wallpapers.md
|
||||||
|
*
|
||||||
|
* @author Hiroku
|
||||||
|
* @since February 9th, 2025
|
||||||
|
*/
|
||||||
|
object CobblemonUnlockableWallpapers : JsonDataRegistry<UnlockablePCWallpaper> {
|
||||||
|
override val gson: Gson = GsonBuilder()
|
||||||
|
.setPrettyPrinting()
|
||||||
|
.registerTypeAdapter(Expression::class.java, ExpressionAdapter)
|
||||||
|
.registerTypeAdapter(ExpressionLike::class.java, ExpressionLikeAdapter)
|
||||||
|
.registerTypeAdapter(ResourceLocation::class.java, IdentifierAdapter)
|
||||||
|
.registerTypeAdapter(Component::class.java, TextAdapter)
|
||||||
|
.create()
|
||||||
|
|
||||||
|
override val typeToken = TypeToken.get(UnlockablePCWallpaper::class.java)
|
||||||
|
override val resourcePath = "unlockable_pc_box_wallpapers"
|
||||||
|
override val id: ResourceLocation = cobblemonResource("unlockable_pc_box_wallpapers")
|
||||||
|
override val type = PackType.SERVER_DATA
|
||||||
|
override val observable = SimpleObservable<CobblemonUnlockableWallpapers>()
|
||||||
|
|
||||||
|
val unlockableWallpapers = mutableMapOf<ResourceLocation, UnlockablePCWallpaper>()
|
||||||
|
|
||||||
|
override fun sync(player: ServerPlayer) { /* These don't sync, they're applied to a PC instance from which they're hooked into RequestChangePCBoxWallpaperHandler. */ }
|
||||||
|
|
||||||
|
override fun reload(data: Map<ResourceLocation, UnlockablePCWallpaper>) {
|
||||||
|
unlockableWallpapers.clear()
|
||||||
|
data.forEach { (id, value) -> value.id = id }
|
||||||
|
unlockableWallpapers.putAll(data)
|
||||||
|
observable.emit(this)
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
-1
@@ -28,7 +28,7 @@ class BattleCountableCriterion(
|
|||||||
val CODEC: Codec<BattleCountableCriterion> = RecordCodecBuilder.create { it.group(
|
val CODEC: Codec<BattleCountableCriterion> = RecordCodecBuilder.create { it.group(
|
||||||
ContextAwarePredicate.CODEC.optionalFieldOf("player").forGetter(BattleCountableCriterion::playerCtx),
|
ContextAwarePredicate.CODEC.optionalFieldOf("player").forGetter(BattleCountableCriterion::playerCtx),
|
||||||
Codec.STRING.listOf().optionalFieldOf("battle_types", listOf("any")).forGetter(BattleCountableCriterion::battleTypes),
|
Codec.STRING.listOf().optionalFieldOf("battle_types", listOf("any")).forGetter(BattleCountableCriterion::battleTypes),
|
||||||
Codec.INT.optionalFieldOf( "count", 0).forGetter(BattleCountableCriterion::count)
|
Codec.INT.optionalFieldOf("count", 0).forGetter(BattleCountableCriterion::count)
|
||||||
).apply(it, ::BattleCountableCriterion) }
|
).apply(it, ::BattleCountableCriterion) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-25
@@ -33,7 +33,7 @@ class LevelUpCriterion(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun matches(player: ServerPlayer, context: LevelUpContext): Boolean {
|
override fun matches(player: ServerPlayer, context: LevelUpContext): Boolean {
|
||||||
val preEvo = context.pokemon.preEvolution == null
|
val preEvo = context.pokemon.preEvolution != null
|
||||||
val hasEvolution = !context.pokemon.evolutions.none()
|
val hasEvolution = !context.pokemon.evolutions.none()
|
||||||
var evolutionCheck = true
|
var evolutionCheck = true
|
||||||
if (preEvo || hasEvolution) {
|
if (preEvo || hasEvolution) {
|
||||||
@@ -43,27 +43,3 @@ class LevelUpCriterion(
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*class LevelUpCriterionCondition(id: Identifier, entity: LootContextPredicate) : SimpleCriterionCondition<LevelUpContext>(id, entity) {
|
|
||||||
var level = 0
|
|
||||||
var evolved = true
|
|
||||||
override fun toJson(json: JsonObject) {
|
|
||||||
json.addProperty("level", level)
|
|
||||||
json.addProperty("has_evolved", evolved)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun fromJson(json: JsonObject) {
|
|
||||||
level = json.get("level")?.asInt ?: 0
|
|
||||||
evolved = json.get("has_evolved")?.asBoolean ?: true
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun matches(player: ServerPlayer, context: LevelUpContext): Boolean {
|
|
||||||
val preEvo = context.pokemon.preEvolution == null
|
|
||||||
val hasEvolution = !context.pokemon.evolutions.none()
|
|
||||||
var evolutionCheck = true
|
|
||||||
if (preEvo || hasEvolution) {
|
|
||||||
evolutionCheck = !(preEvo == hasEvolution)
|
|
||||||
}
|
|
||||||
return level == context.level && evolutionCheck == evolved
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
@@ -43,7 +43,8 @@ interface SleepDepth {
|
|||||||
"comatose" to comatose,
|
"comatose" to comatose,
|
||||||
"normal" to normal
|
"normal" to normal
|
||||||
)
|
)
|
||||||
val adapter = StringIdentifiedObjectAdapter { depths[it] ?: throw IllegalArgumentException("Unknown sleep depth: $it") }
|
|
||||||
|
val adapter = StringIdentifiedObjectAdapter({ depths[it] ?: throw IllegalArgumentException("Unknown sleep depth: $it") })
|
||||||
}
|
}
|
||||||
|
|
||||||
fun canSleep(pokemonEntity: PokemonEntity): Boolean
|
fun canSleep(pokemonEntity: PokemonEntity): Boolean
|
||||||
|
|||||||
+10
@@ -8,6 +8,9 @@
|
|||||||
|
|
||||||
package com.cobblemon.mod.common.api.battles.interpreter
|
package com.cobblemon.mod.common.api.battles.interpreter
|
||||||
|
|
||||||
|
import com.bedrockk.molang.runtime.value.DoubleValue
|
||||||
|
import com.bedrockk.molang.runtime.value.StringValue
|
||||||
|
import com.cobblemon.mod.common.api.molang.MoLangFunctions.queryStructOf
|
||||||
import com.cobblemon.mod.common.battles.pokemon.BattlePokemon
|
import com.cobblemon.mod.common.battles.pokemon.BattlePokemon
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -30,6 +33,13 @@ interface BattleContext {
|
|||||||
/** The [BattlePokemon] that directly or indirectly caused this [BattleContext]. */
|
/** The [BattlePokemon] that directly or indirectly caused this [BattleContext]. */
|
||||||
val origin: BattlePokemon?
|
val origin: BattlePokemon?
|
||||||
|
|
||||||
|
fun getStruct() = queryStructOf(
|
||||||
|
"type" to { StringValue(type.name) },
|
||||||
|
"origin" to { origin?.struct ?: DoubleValue(0.0) },
|
||||||
|
"id" to { StringValue(id) },
|
||||||
|
"turn_created" to { DoubleValue(turn.toDouble()) }
|
||||||
|
)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The type of [BattleContext].
|
* The type of [BattleContext].
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import com.cobblemon.mod.common.api.events.CobblemonEvents
|
|||||||
import com.cobblemon.mod.common.api.events.battles.BattleFledEvent
|
import com.cobblemon.mod.common.api.events.battles.BattleFledEvent
|
||||||
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asMoLangValue
|
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asMoLangValue
|
||||||
import com.cobblemon.mod.common.api.net.NetworkPacket
|
import com.cobblemon.mod.common.api.net.NetworkPacket
|
||||||
|
import com.cobblemon.mod.common.api.pokemon.stats.BattleEvSource
|
||||||
import com.cobblemon.mod.common.api.storage.party.PlayerPartyStore
|
import com.cobblemon.mod.common.api.storage.party.PlayerPartyStore
|
||||||
import com.cobblemon.mod.common.api.tags.CobblemonItemTags
|
import com.cobblemon.mod.common.api.tags.CobblemonItemTags
|
||||||
import com.cobblemon.mod.common.api.text.red
|
import com.cobblemon.mod.common.api.text.red
|
||||||
@@ -272,7 +273,7 @@ open class PokemonBattle(
|
|||||||
opponent.awardExperience(opponentPokemon, experience)
|
opponent.awardExperience(opponentPokemon, experience)
|
||||||
}
|
}
|
||||||
Cobblemon.evYieldCalculator.calculate(opponentPokemon, faintedPokemon).forEach { (stat, amount) ->
|
Cobblemon.evYieldCalculator.calculate(opponentPokemon, faintedPokemon).forEach { (stat, amount) ->
|
||||||
pokemon.evs.add(stat, amount)
|
pokemon.evs.add(stat, amount, BattleEvSource(this, opponentPokemon.facedOpponents.toList(), pokemon))
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -99,7 +99,6 @@ class Berry(
|
|||||||
val weight: Float,
|
val weight: Float,
|
||||||
val boneMealChance: Float
|
val boneMealChance: Float
|
||||||
) {
|
) {
|
||||||
|
|
||||||
@Transient
|
@Transient
|
||||||
var identifier: ResourceLocation = identifier
|
var identifier: ResourceLocation = identifier
|
||||||
internal set
|
internal set
|
||||||
@@ -159,7 +158,7 @@ class Berry(
|
|||||||
* Calculates the yield for a berry tree being planted or replanted after a life cycle.
|
* Calculates the yield for a berry tree being planted or replanted after a life cycle.
|
||||||
* Triggers [BerryYieldCalculationEvent].
|
* Triggers [BerryYieldCalculationEvent].
|
||||||
*
|
*
|
||||||
* @param world The [World] the tree is present in.
|
* @param world The [Level] the tree is present in.
|
||||||
* @param state The [BlockState] of the tree.
|
* @param state The [BlockState] of the tree.
|
||||||
* @param pos The [BlockPos] of the tree.
|
* @param pos The [BlockPos] of the tree.
|
||||||
* @param placer The [LivingEntity] tending to the tree, if any.
|
* @param placer The [LivingEntity] tending to the tree, if any.
|
||||||
@@ -173,9 +172,10 @@ class Berry(
|
|||||||
if (BerryBlock.getMulch(treeEntity) == MulchVariant.RICH) {
|
if (BerryBlock.getMulch(treeEntity) == MulchVariant.RICH) {
|
||||||
//I hope the upper bound isnt exclusive, especially when there's a method called nextBetweenExclusive
|
//I hope the upper bound isnt exclusive, especially when there's a method called nextBetweenExclusive
|
||||||
// update: it was meant to be exclusive, which caused #1124. I've lowered the upper bound from 3 to 2.
|
// update: it was meant to be exclusive, which caused #1124. I've lowered the upper bound from 3 to 2.
|
||||||
yield += world.random.nextIntBetweenInclusive(1, 2)
|
yield += world.random.nextIntBetweenInclusive(RICH_MULCH_MIN, RICH_MULCH_MAX)
|
||||||
treeEntity.decrementMulchDuration(world, pos, state)
|
treeEntity.decrementMulchDuration(world, pos, state)
|
||||||
}
|
}
|
||||||
|
yield = yield.coerceAtMost(growthPoints.size)
|
||||||
val event = BerryYieldCalculationEvent(this, world, state, pos, placer, yield, bonus.second)
|
val event = BerryYieldCalculationEvent(this, world, state, pos, placer, yield, bonus.second)
|
||||||
CobblemonEvents.BERRY_YIELD.post(event) { yield = it.yield }
|
CobblemonEvents.BERRY_YIELD.post(event) { yield = it.yield }
|
||||||
return yield
|
return yield
|
||||||
@@ -193,7 +193,7 @@ class Berry(
|
|||||||
*
|
*
|
||||||
* @return The maximum possible yield.
|
* @return The maximum possible yield.
|
||||||
*/
|
*/
|
||||||
fun maxYield() = this.baseYield.last + this.growthFactors.sumOf { it.maxYield() }
|
fun maxYield() = this.baseYield.last + this.growthFactors.sumOf { it.maxYield() } + RICH_MULCH_MAX
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if this berry can mutate with the given [partner].
|
* Checks if this berry can mutate with the given [partner].
|
||||||
@@ -231,6 +231,7 @@ class Berry(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// A cheat since gson doesn't invoke init block
|
// A cheat since gson doesn't invoke init block
|
||||||
|
// well I actually suspect it does but
|
||||||
internal fun validate() {
|
internal fun validate() {
|
||||||
if (this.baseYield.first < 0 || this.baseYield.last < 0) {
|
if (this.baseYield.first < 0 || this.baseYield.last < 0) {
|
||||||
throw IllegalArgumentException("A berry base yield must be a positive range")
|
throw IllegalArgumentException("A berry base yield must be a positive range")
|
||||||
@@ -247,10 +248,6 @@ class Berry(
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
this.growthFactors.forEach { it.validateArguments() }
|
this.growthFactors.forEach { it.validateArguments() }
|
||||||
val maxYield = this.maxYield()
|
|
||||||
if (this.growthPoints.size < maxYield) {
|
|
||||||
throw IllegalArgumentException("Anchor points must have enough elements for the max possible yield of $maxYield you've provided ${this.growthPoints.size} points")
|
|
||||||
}
|
|
||||||
this.shapedFlower = hashMapOf()
|
this.shapedFlower = hashMapOf()
|
||||||
this.shapedFruit = hashMapOf()
|
this.shapedFruit = hashMapOf()
|
||||||
this.sproutShape = this.createAndUniteShapes(this.sproutShapeBoxes)
|
this.sproutShape = this.createAndUniteShapes(this.sproutShapeBoxes)
|
||||||
@@ -339,6 +336,8 @@ class Berry(
|
|||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
const val RICH_MULCH_MIN = 1
|
||||||
|
const val RICH_MULCH_MAX = 2
|
||||||
|
|
||||||
internal fun decode(buffer: RegistryFriendlyByteBuf): Berry {
|
internal fun decode(buffer: RegistryFriendlyByteBuf): Berry {
|
||||||
val identifier = buffer.readIdentifier()
|
val identifier = buffer.readIdentifier()
|
||||||
|
|||||||
@@ -15,12 +15,10 @@ package com.cobblemon.mod.common.api.berry
|
|||||||
* @author Licious
|
* @author Licious
|
||||||
* @since November 28th, 2022
|
* @since November 28th, 2022
|
||||||
*/
|
*/
|
||||||
enum class Flavor {
|
enum class Flavor(val colour: Int) {
|
||||||
|
SPICY(0x00FF00),
|
||||||
SPICY,
|
DRY(0xFF0000),
|
||||||
DRY,
|
SWEET(0x0000FF),
|
||||||
SWEET,
|
BITTER(0xFFFF00),
|
||||||
BITTER,
|
SOUR(0xFF00FF);
|
||||||
SOUR
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Cobblemon Contributors
|
||||||
|
*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.cobblemon.mod.common.api.conditional
|
||||||
|
|
||||||
|
import com.cobblemon.mod.common.util.asIdentifierDefaultingNamespace
|
||||||
|
import com.cobblemon.mod.common.util.codec.CodecUtils
|
||||||
|
import com.mojang.serialization.Codec
|
||||||
|
import net.minecraft.core.Registry
|
||||||
|
import net.minecraft.core.registries.Registries
|
||||||
|
import net.minecraft.resources.ResourceKey
|
||||||
|
import net.minecraft.tags.TagKey
|
||||||
|
|
||||||
|
val ITEM_REGISTRY_LIKE_CODEC = makeCodecForRegistryLikeCondition("item", Registries.ITEM)
|
||||||
|
|
||||||
|
fun <T : Any> makeCodecForRegistryLikeCondition(name: String, registryKey: ResourceKey<Registry<T>>): Codec<RegistryLikeCondition<T>> {
|
||||||
|
return CodecUtils.createByStringCodec(
|
||||||
|
from = { str ->
|
||||||
|
if (str.startsWith("#")) {
|
||||||
|
return@createByStringCodec RegistryLikeTagCondition<T>(TagKey.create(registryKey, str.substring(1).asIdentifierDefaultingNamespace()))
|
||||||
|
} else {
|
||||||
|
return@createByStringCodec RegistryLikeIdentifierCondition<T>(str.asIdentifierDefaultingNamespace())
|
||||||
|
}
|
||||||
|
},
|
||||||
|
to = { condition ->
|
||||||
|
if (condition is RegistryLikeTagCondition) {
|
||||||
|
"#${condition.tag.location}"
|
||||||
|
} else {
|
||||||
|
(condition as RegistryLikeIdentifierCondition).identifier.toString()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
errorSupplier = { "Unknown $name condition: $it. Should be # followed by a tag, or $name resource location e.g. #minecraft:ladders or minecraft:grass_block." }
|
||||||
|
)
|
||||||
|
}
|
||||||
+7
-1
@@ -8,6 +8,7 @@
|
|||||||
|
|
||||||
package com.cobblemon.mod.common.api.conditional
|
package com.cobblemon.mod.common.api.conditional
|
||||||
|
|
||||||
|
import net.minecraft.core.Holder
|
||||||
import net.minecraft.core.Registry
|
import net.minecraft.core.Registry
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -17,5 +18,10 @@ import net.minecraft.core.Registry
|
|||||||
* @since July 16th, 2022
|
* @since July 16th, 2022
|
||||||
*/
|
*/
|
||||||
interface RegistryLikeCondition<T> {
|
interface RegistryLikeCondition<T> {
|
||||||
fun fits(t: T, registry: Registry<T>): Boolean
|
fun fits(t: T, registry: Registry<T>): Boolean {
|
||||||
|
val holder = registry.wrapAsHolder(t)
|
||||||
|
return holder != null && fits(holder)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun fits(holder: Holder<T>): Boolean
|
||||||
}
|
}
|
||||||
+3
-2
@@ -9,7 +9,7 @@
|
|||||||
package com.cobblemon.mod.common.api.conditional
|
package com.cobblemon.mod.common.api.conditional
|
||||||
|
|
||||||
import com.google.gson.JsonElement
|
import com.google.gson.JsonElement
|
||||||
import net.minecraft.core.Registry
|
import net.minecraft.core.Holder
|
||||||
import net.minecraft.resources.ResourceLocation
|
import net.minecraft.resources.ResourceLocation
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -24,5 +24,6 @@ open class RegistryLikeIdentifierCondition<T : Any>(val identifier: ResourceLoca
|
|||||||
constructor: (ResourceLocation) -> RegistryLikeIdentifierCondition<T>
|
constructor: (ResourceLocation) -> RegistryLikeIdentifierCondition<T>
|
||||||
): (JsonElement) -> RegistryLikeIdentifierCondition<T>? = { constructor(ResourceLocation.parse(it.asString)) }
|
): (JsonElement) -> RegistryLikeIdentifierCondition<T>? = { constructor(ResourceLocation.parse(it.asString)) }
|
||||||
}
|
}
|
||||||
override fun fits(t: T, registry: Registry<T>) = registry.getKey(t) == identifier
|
|
||||||
|
override fun fits(t: Holder<T>) = t.`is`(identifier)
|
||||||
}
|
}
|
||||||
+4
-14
@@ -9,6 +9,7 @@
|
|||||||
package com.cobblemon.mod.common.api.conditional
|
package com.cobblemon.mod.common.api.conditional
|
||||||
|
|
||||||
import com.google.gson.JsonElement
|
import com.google.gson.JsonElement
|
||||||
|
import net.minecraft.core.Holder
|
||||||
import net.minecraft.core.Registry
|
import net.minecraft.core.Registry
|
||||||
import net.minecraft.resources.ResourceKey
|
import net.minecraft.resources.ResourceKey
|
||||||
import net.minecraft.resources.ResourceLocation
|
import net.minecraft.resources.ResourceLocation
|
||||||
@@ -26,29 +27,18 @@ open class RegistryLikeTagCondition<T : Any>(val tag: TagKey<T>) : RegistryLikeC
|
|||||||
companion object {
|
companion object {
|
||||||
const val PREFIX = "#"
|
const val PREFIX = "#"
|
||||||
fun <T : Any> resolver(
|
fun <T : Any> resolver(
|
||||||
ResourceKey: ResourceKey<Registry<T>>,
|
resourceKey: ResourceKey<Registry<T>>,
|
||||||
constructor: (TagKey<T>) -> RegistryLikeTagCondition<T>
|
constructor: (TagKey<T>) -> RegistryLikeTagCondition<T>
|
||||||
): (JsonElement) -> RegistryLikeTagCondition<T>? = {
|
): (JsonElement) -> RegistryLikeTagCondition<T>? = {
|
||||||
val firstSymbol = it.asString.substring(0, 1)
|
val firstSymbol = it.asString.substring(0, 1)
|
||||||
if (firstSymbol == PREFIX) {
|
if (firstSymbol == PREFIX) {
|
||||||
val identifier = ResourceLocation.parse(it.asString.substring(1))
|
val identifier = ResourceLocation.parse(it.asString.substring(1))
|
||||||
constructor(TagKey.create(ResourceKey, identifier))
|
constructor(TagKey.create(resourceKey, identifier))
|
||||||
} else {
|
} else {
|
||||||
null
|
null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun fits(t: T, registry: Registry<T>): Boolean {
|
override fun fits(t: Holder<T>) = t.`is`(tag)
|
||||||
// val registryHasTag = registry.containsTag(tag)
|
|
||||||
// if (!registryHasTag) {
|
|
||||||
//// LOGGER.warn("No tag in registry: ${tag.id}")
|
|
||||||
// return false
|
|
||||||
// }
|
|
||||||
|
|
||||||
return registry.getResourceKey(t)
|
|
||||||
.flatMap(registry::getHolder)
|
|
||||||
.map { entry -> entry.`is`(tag) }
|
|
||||||
.orElse(false)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -55,6 +55,7 @@ class ActiveDialogue(var playerEntity: ServerPlayer, var dialogueReference: Dial
|
|||||||
)
|
)
|
||||||
|
|
||||||
dialogueReference.initializationAction.invoke(this)
|
dialogueReference.initializationAction.invoke(this)
|
||||||
|
setPage(currentPage)
|
||||||
|
|
||||||
if (!completion.isDone) {
|
if (!completion.isDone) {
|
||||||
val packet = DialogueOpenedPacket(this, true)
|
val packet = DialogueOpenedPacket(this, true)
|
||||||
|
|||||||
@@ -52,6 +52,6 @@ object DialogueManager {
|
|||||||
fun stopDialogue(playerEntity: ServerPlayer) {
|
fun stopDialogue(playerEntity: ServerPlayer) {
|
||||||
val activeDialogue = playerEntity.activeDialogue ?: return
|
val activeDialogue = playerEntity.activeDialogue ?: return
|
||||||
DialogueClosedPacket(activeDialogue.dialogueId).sendToPlayer(playerEntity)
|
DialogueClosedPacket(activeDialogue.dialogueId).sendToPlayer(playerEntity)
|
||||||
activeDialogues.remove(activeDialogue.dialogueId)
|
activeDialogues.remove(playerEntity.uuid)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -9,6 +9,7 @@
|
|||||||
package com.cobblemon.mod.common.api.drop
|
package com.cobblemon.mod.common.api.drop
|
||||||
|
|
||||||
import com.cobblemon.mod.common.api.serialization.StringIdentifiedObjectAdapter
|
import com.cobblemon.mod.common.api.serialization.StringIdentifiedObjectAdapter
|
||||||
|
import com.google.gson.annotations.SerializedName
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The way an item will be dropped.
|
* The way an item will be dropped.
|
||||||
@@ -28,6 +29,9 @@ enum class ItemDropMethod(val methodName: String) {
|
|||||||
TO_INVENTORY("to-inventory");
|
TO_INVENTORY("to-inventory");
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
val adapter = StringIdentifiedObjectAdapter { str -> values().firstOrNull { it.methodName == str } }
|
val adapter = StringIdentifiedObjectAdapter(
|
||||||
|
{ str -> ItemDropMethod.entries.firstOrNull { it.methodName == str } },
|
||||||
|
{ value -> (value ?: ON_ENTITY).methodName },
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -11,6 +11,8 @@ package com.cobblemon.mod.common.api.entity
|
|||||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||||
import net.minecraft.world.damagesource.DamageSource
|
import net.minecraft.world.damagesource.DamageSource
|
||||||
|
import net.minecraft.world.entity.Entity
|
||||||
|
import net.minecraft.world.entity.Entity.MoveFunction
|
||||||
import net.minecraft.world.entity.player.Player
|
import net.minecraft.world.entity.player.Player
|
||||||
|
|
||||||
interface PokemonSideDelegate : EntitySideDelegate<PokemonEntity> {
|
interface PokemonSideDelegate : EntitySideDelegate<PokemonEntity> {
|
||||||
|
|||||||
@@ -8,6 +8,10 @@
|
|||||||
|
|
||||||
package com.cobblemon.mod.common.api.events
|
package com.cobblemon.mod.common.api.events
|
||||||
|
|
||||||
|
import com.bedrockk.molang.runtime.MoParams
|
||||||
|
import com.bedrockk.molang.runtime.value.DoubleValue
|
||||||
|
import com.bedrockk.molang.runtime.value.MoValue
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Something that can be canceled. This is a highly complex class and should only be read by professional engineers.
|
* Something that can be canceled. This is a highly complex class and should only be read by professional engineers.
|
||||||
*
|
*
|
||||||
@@ -21,4 +25,9 @@ abstract class Cancelable {
|
|||||||
fun cancel() {
|
fun cancel() {
|
||||||
isCanceled = true
|
isCanceled = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val cancelFunc: Pair<String, (MoParams) -> MoValue> = "cancel" to {
|
||||||
|
cancel()
|
||||||
|
DoubleValue.ONE
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -42,13 +42,18 @@ import com.cobblemon.mod.common.api.events.pokemon.healing.PokemonHealedEvent
|
|||||||
import com.cobblemon.mod.common.api.events.pokemon.interaction.ExperienceCandyUseEvent
|
import com.cobblemon.mod.common.api.events.pokemon.interaction.ExperienceCandyUseEvent
|
||||||
import com.cobblemon.mod.common.api.events.pokemon.interaction.PokemonInteractionGUICreationEvent
|
import com.cobblemon.mod.common.api.events.pokemon.interaction.PokemonInteractionGUICreationEvent
|
||||||
import com.cobblemon.mod.common.api.events.starter.StarterChosenEvent
|
import com.cobblemon.mod.common.api.events.starter.StarterChosenEvent
|
||||||
|
import com.cobblemon.mod.common.api.events.storage.ChangePCBoxWallpaperEvent
|
||||||
import com.cobblemon.mod.common.api.events.storage.ReleasePokemonEvent
|
import com.cobblemon.mod.common.api.events.storage.ReleasePokemonEvent
|
||||||
|
import com.cobblemon.mod.common.api.events.storage.RenamePCBoxEvent
|
||||||
|
import com.cobblemon.mod.common.api.events.storage.WallpaperCollectionEvent
|
||||||
|
import com.cobblemon.mod.common.api.events.storage.WallpaperUnlockedEvent
|
||||||
import com.cobblemon.mod.common.api.events.world.BigRootPropagatedEvent
|
import com.cobblemon.mod.common.api.events.world.BigRootPropagatedEvent
|
||||||
import com.cobblemon.mod.common.api.reactive.CancelableObservable
|
import com.cobblemon.mod.common.api.reactive.CancelableObservable
|
||||||
import com.cobblemon.mod.common.api.reactive.EventObservable
|
import com.cobblemon.mod.common.api.reactive.EventObservable
|
||||||
import com.cobblemon.mod.common.api.reactive.Observable.Companion.filter
|
import com.cobblemon.mod.common.api.reactive.Observable.Companion.filter
|
||||||
import com.cobblemon.mod.common.api.reactive.Observable.Companion.map
|
import com.cobblemon.mod.common.api.reactive.Observable.Companion.map
|
||||||
import com.cobblemon.mod.common.api.reactive.SimpleObservable
|
import com.cobblemon.mod.common.api.reactive.SimpleObservable
|
||||||
|
import com.cobblemon.mod.common.api.riding.events.SelectDriverEvent
|
||||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||||
import net.minecraft.server.level.ServerPlayer
|
import net.minecraft.server.level.ServerPlayer
|
||||||
|
|
||||||
@@ -158,11 +163,31 @@ object CobblemonEvents {
|
|||||||
@JvmField
|
@JvmField
|
||||||
val EXPERIENCE_CANDY_USE_POST = EventObservable<ExperienceCandyUseEvent.Post>()
|
val EXPERIENCE_CANDY_USE_POST = EventObservable<ExperienceCandyUseEvent.Post>()
|
||||||
|
|
||||||
|
@JvmField
|
||||||
|
val EV_GAINED_EVENT_PRE = CancelableObservable<EvGainedEvent.Pre>()
|
||||||
|
@JvmField
|
||||||
|
val EV_GAINED_EVENT_POST = EventObservable<EvGainedEvent.Post>()
|
||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val POKEMON_RELEASED_EVENT_PRE = CancelableObservable<ReleasePokemonEvent.Pre>()
|
val POKEMON_RELEASED_EVENT_PRE = CancelableObservable<ReleasePokemonEvent.Pre>()
|
||||||
@JvmField
|
@JvmField
|
||||||
val POKEMON_RELEASED_EVENT_POST = EventObservable<ReleasePokemonEvent.Post>()
|
val POKEMON_RELEASED_EVENT_POST = EventObservable<ReleasePokemonEvent.Post>()
|
||||||
|
|
||||||
|
@JvmField
|
||||||
|
val RENAME_PC_BOX_EVENT_PRE = CancelableObservable<RenamePCBoxEvent.Pre>()
|
||||||
|
@JvmField
|
||||||
|
val RENAME_PC_BOX_EVENT_POST = EventObservable<RenamePCBoxEvent.Post>()
|
||||||
|
|
||||||
|
@JvmField
|
||||||
|
val WALLPAPER_COLLECTION_EVENT = EventObservable<WallpaperCollectionEvent>()
|
||||||
|
@JvmField
|
||||||
|
val WALLPAPER_UNLOCKED_EVENT = CancelableObservable<WallpaperUnlockedEvent>()
|
||||||
|
|
||||||
|
@JvmField
|
||||||
|
val CHANGE_PC_BOX_WALLPAPER_EVENT_PRE = CancelableObservable<ChangePCBoxWallpaperEvent.Pre>()
|
||||||
|
@JvmField
|
||||||
|
val CHANGE_PC_BOX_WALLPAPER_EVENT_POST = EventObservable<ChangePCBoxWallpaperEvent.Post>()
|
||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val LOOT_DROPPED = CancelableObservable<LootDroppedEvent>()
|
val LOOT_DROPPED = CancelableObservable<LootDroppedEvent>()
|
||||||
@JvmField
|
@JvmField
|
||||||
@@ -190,6 +215,10 @@ object CobblemonEvents {
|
|||||||
val HELD_ITEM_PRE = CancelableObservable<HeldItemEvent.Pre>()
|
val HELD_ITEM_PRE = CancelableObservable<HeldItemEvent.Pre>()
|
||||||
@JvmField
|
@JvmField
|
||||||
val HELD_ITEM_POST = EventObservable<HeldItemEvent.Post>()
|
val HELD_ITEM_POST = EventObservable<HeldItemEvent.Post>()
|
||||||
|
@JvmField
|
||||||
|
val COSMETIC_ITEM_PRE = CancelableObservable<HeldItemEvent.Pre>()
|
||||||
|
@JvmField
|
||||||
|
val COSMETIC_ITEM_POST = EventObservable<HeldItemEvent.Post>()
|
||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val POKEMON_GAINED = EventObservable<PokemonGainedEvent>()
|
val POKEMON_GAINED = EventObservable<PokemonGainedEvent>()
|
||||||
@@ -232,4 +261,12 @@ object CobblemonEvents {
|
|||||||
val HATCH_EGG_PRE = CancelableObservable<HatchEggEvent.Pre>()
|
val HATCH_EGG_PRE = CancelableObservable<HatchEggEvent.Pre>()
|
||||||
@JvmField
|
@JvmField
|
||||||
val HATCH_EGG_POST = EventObservable<HatchEggEvent.Post>()
|
val HATCH_EGG_POST = EventObservable<HatchEggEvent.Post>()
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// Riding
|
||||||
|
//
|
||||||
|
// -------------------------------------------------------------------------------------
|
||||||
|
@JvmField
|
||||||
|
val SELECT_DRIVER = EventObservable<SelectDriverEvent>()
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-12
@@ -8,16 +8,12 @@
|
|||||||
|
|
||||||
package com.cobblemon.mod.common.api.events.battles
|
package com.cobblemon.mod.common.api.events.battles
|
||||||
|
|
||||||
import com.bedrockk.molang.runtime.struct.QueryStruct
|
|
||||||
import com.bedrockk.molang.runtime.value.DoubleValue
|
|
||||||
import com.bedrockk.molang.runtime.value.MoValue
|
import com.bedrockk.molang.runtime.value.MoValue
|
||||||
import com.bedrockk.molang.runtime.value.StringValue
|
|
||||||
import com.cobblemon.mod.common.api.battles.interpreter.BattleContext
|
import com.cobblemon.mod.common.api.battles.interpreter.BattleContext
|
||||||
import com.cobblemon.mod.common.api.battles.model.PokemonBattle
|
import com.cobblemon.mod.common.api.battles.model.PokemonBattle
|
||||||
import com.cobblemon.mod.common.api.battles.model.actor.ActorType
|
import com.cobblemon.mod.common.api.battles.model.actor.ActorType
|
||||||
import com.cobblemon.mod.common.battles.pokemon.BattlePokemon
|
import com.cobblemon.mod.common.battles.pokemon.BattlePokemon
|
||||||
import com.cobblemon.mod.common.util.asArrayValue
|
import com.cobblemon.mod.common.util.asArrayValue
|
||||||
import java.util.function.Function
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Event fired when a [BattlePokemon] faints. Exposes the [BattlePokemon] that fainted and the [BattleContext]
|
* Event fired when a [BattlePokemon] faints. Exposes the [BattlePokemon] that fainted and the [BattleContext]
|
||||||
@@ -37,13 +33,6 @@ data class BattleFaintedEvent(
|
|||||||
"npcs" to battle.actors.filter { it.type == ActorType.NPC }.asArrayValue { it.struct },
|
"npcs" to battle.actors.filter { it.type == ActorType.NPC }.asArrayValue { it.struct },
|
||||||
"wild_pokemon" to battle.actors.filter { it.type == ActorType.WILD }.asArrayValue { it.struct },
|
"wild_pokemon" to battle.actors.filter { it.type == ActorType.WILD }.asArrayValue { it.struct },
|
||||||
"pokemon" to killed.struct,
|
"pokemon" to killed.struct,
|
||||||
"context" to QueryStruct(
|
"context" to context.getStruct()
|
||||||
hashMapOf(
|
|
||||||
"type" to Function { StringValue(context.type.name) },
|
|
||||||
"origin" to Function { context.origin?.struct ?: DoubleValue(0.0) },
|
|
||||||
"id" to Function { StringValue(context.id) },
|
|
||||||
"turn_created" to Function { DoubleValue(context.turn.toDouble()) },
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
+3
@@ -11,6 +11,7 @@ package com.cobblemon.mod.common.api.events.battles
|
|||||||
import com.cobblemon.mod.common.api.battles.model.PokemonBattle
|
import com.cobblemon.mod.common.api.battles.model.PokemonBattle
|
||||||
import com.cobblemon.mod.common.api.battles.model.actor.ActorType
|
import com.cobblemon.mod.common.api.battles.model.actor.ActorType
|
||||||
import com.cobblemon.mod.common.api.events.Cancelable
|
import com.cobblemon.mod.common.api.events.Cancelable
|
||||||
|
import com.cobblemon.mod.common.api.molang.MoLangFunctions.moLangFunctionMap
|
||||||
import com.cobblemon.mod.common.util.asArrayValue
|
import com.cobblemon.mod.common.util.asArrayValue
|
||||||
import net.minecraft.network.chat.MutableComponent
|
import net.minecraft.network.chat.MutableComponent
|
||||||
|
|
||||||
@@ -30,6 +31,8 @@ data class BattleStartedPreEvent (override val battle: PokemonBattle, var reason
|
|||||||
"npcs" to battle.actors.filter { it.type == ActorType.NPC }.asArrayValue { it.struct },
|
"npcs" to battle.actors.filter { it.type == ActorType.NPC }.asArrayValue { it.struct },
|
||||||
"wild_pokemon" to battle.actors.filter { it.type == ActorType.WILD }.asArrayValue { it.struct }
|
"wild_pokemon" to battle.actors.filter { it.type == ActorType.WILD }.asArrayValue { it.struct }
|
||||||
)
|
)
|
||||||
|
|
||||||
|
val functions = moLangFunctionMap(cancelFunc)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+1
-1
@@ -26,7 +26,7 @@ data class TerastallizationEvent(
|
|||||||
val battle: PokemonBattle,
|
val battle: PokemonBattle,
|
||||||
val pokemon: BattlePokemon,
|
val pokemon: BattlePokemon,
|
||||||
val teraType: TeraType
|
val teraType: TeraType
|
||||||
) {
|
) {
|
||||||
val context = mutableMapOf<String, MoValue>(
|
val context = mutableMapOf<String, MoValue>(
|
||||||
"battle" to battle.struct,
|
"battle" to battle.struct,
|
||||||
"players" to battle.actors.filter { it.type == ActorType.PLAYER }.asArrayValue { it.struct },
|
"players" to battle.actors.filter { it.type == ActorType.PLAYER }.asArrayValue { it.struct },
|
||||||
|
|||||||
+36
@@ -8,9 +8,15 @@
|
|||||||
|
|
||||||
package com.cobblemon.mod.common.api.events.pokeball
|
package com.cobblemon.mod.common.api.events.pokeball
|
||||||
|
|
||||||
|
import com.bedrockk.molang.runtime.value.DoubleValue
|
||||||
|
import com.bedrockk.molang.runtime.value.MoValue
|
||||||
|
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asMostSpecificMoLangValue
|
||||||
|
import com.cobblemon.mod.common.api.molang.MoLangFunctions.moLangFunctionMap
|
||||||
import com.cobblemon.mod.common.api.pokeball.catching.CaptureContext
|
import com.cobblemon.mod.common.api.pokeball.catching.CaptureContext
|
||||||
import com.cobblemon.mod.common.entity.pokeball.EmptyPokeBallEntity
|
import com.cobblemon.mod.common.entity.pokeball.EmptyPokeBallEntity
|
||||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||||
|
import com.cobblemon.mod.common.util.getBooleanOrNull
|
||||||
|
import com.cobblemon.mod.common.util.getIntOrNull
|
||||||
import net.minecraft.server.level.ServerPlayer
|
import net.minecraft.server.level.ServerPlayer
|
||||||
import net.minecraft.world.entity.LivingEntity
|
import net.minecraft.world.entity.LivingEntity
|
||||||
|
|
||||||
@@ -32,4 +38,34 @@ class PokeBallCaptureCalculatedEvent(
|
|||||||
action(this, thrower)
|
action(this, thrower)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val context = mutableMapOf<String, MoValue>(
|
||||||
|
"thrower" to thrower.asMostSpecificMoLangValue(),
|
||||||
|
"pokemon" to pokemonEntity.struct,
|
||||||
|
"poke_ball" to pokeBallEntity.struct,
|
||||||
|
"is_successful_capture" to DoubleValue(captureResult.isSuccessfulCapture),
|
||||||
|
"is_critical_capture" to DoubleValue(captureResult.isCriticalCapture),
|
||||||
|
)
|
||||||
|
|
||||||
|
val functions = moLangFunctionMap(
|
||||||
|
"set_shakes" to { params ->
|
||||||
|
val numShakes = params.getInt(0)
|
||||||
|
val successful = params.getBooleanOrNull(1) ?: (numShakes == 4)
|
||||||
|
captureResult = CaptureContext(
|
||||||
|
numberOfShakes = numShakes,
|
||||||
|
isSuccessfulCapture = successful,
|
||||||
|
isCriticalCapture = false
|
||||||
|
)
|
||||||
|
DoubleValue.ONE
|
||||||
|
},
|
||||||
|
"set_critical_capture" to { params ->
|
||||||
|
val numShakes = params.getIntOrNull(0) ?: 1
|
||||||
|
captureResult = CaptureContext(
|
||||||
|
numberOfShakes = numShakes,
|
||||||
|
isSuccessfulCapture = true,
|
||||||
|
isCriticalCapture = true
|
||||||
|
)
|
||||||
|
DoubleValue.ONE
|
||||||
|
}
|
||||||
|
)
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Cobblemon Contributors
|
||||||
|
*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.cobblemon.mod.common.api.events.pokemon
|
||||||
|
|
||||||
|
import com.cobblemon.mod.common.api.events.Cancelable
|
||||||
|
import com.cobblemon.mod.common.api.pokemon.stats.EvSource
|
||||||
|
import com.cobblemon.mod.common.api.pokemon.stats.Stat
|
||||||
|
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fired during EV mutation.
|
||||||
|
*
|
||||||
|
* @see [Pre]
|
||||||
|
* @see [Post]
|
||||||
|
*/
|
||||||
|
interface EvGainedEvent {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The [Stat] having EVs added to itself.
|
||||||
|
*/
|
||||||
|
val stat: Stat
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see EvSource.pokemon
|
||||||
|
*/
|
||||||
|
val pokemon: Pokemon get() = this.source.pokemon
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The [EvSource] that fired this event.
|
||||||
|
*/
|
||||||
|
val source: EvSource
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fired before EV mutation occurs, cancelling will cause the mutation to be flagged as not successful (returns 0).
|
||||||
|
*
|
||||||
|
* @property stat See [EvGainedEvent.stat].
|
||||||
|
* @property amount The amount of EVs that will be gained.
|
||||||
|
* @property source See [EvGainedEvent.source].
|
||||||
|
*/
|
||||||
|
class Pre(override val stat: Stat, var amount: Int, override val source: EvSource) : EvGainedEvent, Cancelable()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fired after EV mutation occurs, this is purely for notification purposes.
|
||||||
|
*
|
||||||
|
* @property stat See [EvGainedEvent.stat].
|
||||||
|
* @property amount The final amount of EVs gained.
|
||||||
|
* @property source See [EvGainedEvent.source].
|
||||||
|
*/
|
||||||
|
class Post(override val stat: Stat, val amount: Int, override val source: EvSource) : EvGainedEvent
|
||||||
|
|
||||||
|
}
|
||||||
+1
-2
@@ -20,8 +20,7 @@ import com.cobblemon.mod.common.pokemon.Pokemon
|
|||||||
data class FriendshipUpdatedEvent(
|
data class FriendshipUpdatedEvent(
|
||||||
val pokemon: Pokemon,
|
val pokemon: Pokemon,
|
||||||
val newFriendshipInitial: Int
|
val newFriendshipInitial: Int
|
||||||
)
|
) {
|
||||||
{
|
|
||||||
var newFriendship: Int = newFriendshipInitial
|
var newFriendship: Int = newFriendshipInitial
|
||||||
set(value) {
|
set(value) {
|
||||||
field = value.coerceIn(0, Cobblemon.config.maxPokemonFriendship)
|
field = value.coerceIn(0, Cobblemon.config.maxPokemonFriendship)
|
||||||
|
|||||||
@@ -9,13 +9,11 @@
|
|||||||
package com.cobblemon.mod.common.api.events.pokemon
|
package com.cobblemon.mod.common.api.events.pokemon
|
||||||
|
|
||||||
import com.cobblemon.mod.common.api.events.Cancelable
|
import com.cobblemon.mod.common.api.events.Cancelable
|
||||||
import com.cobblemon.mod.common.api.events.pokemon.HeldItemEvent.Post
|
|
||||||
import com.cobblemon.mod.common.api.events.pokemon.HeldItemEvent.Pre
|
|
||||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||||
import net.minecraft.world.item.ItemStack
|
import net.minecraft.world.item.ItemStack
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The base for all the events related to held items.
|
* The base for all the events related to held items and cosmetic items.
|
||||||
*
|
*
|
||||||
* @see [Pre]
|
* @see [Pre]
|
||||||
* @see [Post]
|
* @see [Post]
|
||||||
@@ -28,7 +26,7 @@ interface HeldItemEvent {
|
|||||||
val pokemon: Pokemon
|
val pokemon: Pokemon
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fired at the start of [Pokemon.swapHeldItem].
|
* Fired at the start of [Pokemon.swapHeldItem] and [Pokemon.swapCosmeticItem].
|
||||||
*
|
*
|
||||||
* This event should be used to mutate the results of this transaction.
|
* This event should be used to mutate the results of this transaction.
|
||||||
*
|
*
|
||||||
@@ -44,7 +42,7 @@ interface HeldItemEvent {
|
|||||||
data class Pre(override val pokemon: Pokemon, var receiving: ItemStack, var returning: ItemStack, var decrement: Boolean) : HeldItemEvent, Cancelable()
|
data class Pre(override val pokemon: Pokemon, var receiving: ItemStack, var returning: ItemStack, var decrement: Boolean) : HeldItemEvent, Cancelable()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fired at the end of [Pokemon.swapHeldItem].
|
* Fired at the end of [Pokemon.swapHeldItem] and [Pokemon.swapCosmeticItem].
|
||||||
*
|
*
|
||||||
* @property pokemon The [Pokemon] triggering this event.
|
* @property pokemon The [Pokemon] triggering this event.
|
||||||
* @property received The [ItemStack] considered as received and set to the [pokemon]. This is a copy and mutation will not be taken into account.
|
* @property received The [ItemStack] considered as received and set to the [pokemon]. This is a copy and mutation will not be taken into account.
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
package com.cobblemon.mod.common.api.events.pokemon
|
package com.cobblemon.mod.common.api.events.pokemon
|
||||||
|
|
||||||
import com.bedrockk.molang.runtime.value.DoubleValue
|
import com.bedrockk.molang.runtime.value.DoubleValue
|
||||||
|
import com.cobblemon.mod.common.api.molang.MoLangFunctions.moLangFunctionMap
|
||||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -23,4 +24,11 @@ class LevelUpEvent(val pokemon: Pokemon, val oldLevel: Int, var newLevel: Int) {
|
|||||||
"old_level" to DoubleValue(oldLevel.toDouble()),
|
"old_level" to DoubleValue(oldLevel.toDouble()),
|
||||||
"new_level" to DoubleValue(newLevel.toDouble())
|
"new_level" to DoubleValue(newLevel.toDouble())
|
||||||
)
|
)
|
||||||
|
|
||||||
|
val functions = moLangFunctionMap(
|
||||||
|
"set_new_level" to {
|
||||||
|
newLevel = it.getInt(0)
|
||||||
|
DoubleValue.ONE
|
||||||
|
}
|
||||||
|
)
|
||||||
}
|
}
|
||||||
+4
-1
@@ -13,6 +13,7 @@ import com.bedrockk.molang.runtime.value.MoValue
|
|||||||
import com.bedrockk.molang.runtime.value.StringValue
|
import com.bedrockk.molang.runtime.value.StringValue
|
||||||
import com.cobblemon.mod.common.api.events.Cancelable
|
import com.cobblemon.mod.common.api.events.Cancelable
|
||||||
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asMoLangValue
|
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asMoLangValue
|
||||||
|
import com.cobblemon.mod.common.api.molang.MoLangFunctions.moLangFunctionMap
|
||||||
import com.cobblemon.mod.common.api.pokedex.AbstractPokedexManager
|
import com.cobblemon.mod.common.api.pokedex.AbstractPokedexManager
|
||||||
import com.cobblemon.mod.common.api.pokedex.FormDexRecord
|
import com.cobblemon.mod.common.api.pokedex.FormDexRecord
|
||||||
import com.cobblemon.mod.common.api.pokedex.PokedexEntryProgress
|
import com.cobblemon.mod.common.api.pokedex.PokedexEntryProgress
|
||||||
@@ -47,7 +48,9 @@ sealed interface PokedexDataChangedEvent {
|
|||||||
override val knowledge: PokedexEntryProgress,
|
override val knowledge: PokedexEntryProgress,
|
||||||
override val playerUUID: UUID,
|
override val playerUUID: UUID,
|
||||||
override val record: FormDexRecord
|
override val record: FormDexRecord
|
||||||
) : PokedexDataChangedEvent, Cancelable()
|
) : PokedexDataChangedEvent, Cancelable() {
|
||||||
|
val functions = moLangFunctionMap(cancelFunc)
|
||||||
|
}
|
||||||
|
|
||||||
class Post(
|
class Post(
|
||||||
override val dataSource: PokedexEntityData,
|
override val dataSource: PokedexEntityData,
|
||||||
|
|||||||
+8
@@ -8,8 +8,12 @@
|
|||||||
|
|
||||||
package com.cobblemon.mod.common.api.events.pokemon
|
package com.cobblemon.mod.common.api.events.pokemon
|
||||||
|
|
||||||
|
import com.bedrockk.molang.runtime.value.DoubleValue
|
||||||
import com.bedrockk.molang.runtime.value.StringValue
|
import com.bedrockk.molang.runtime.value.StringValue
|
||||||
|
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asMoLangValue
|
||||||
|
import com.cobblemon.mod.common.api.molang.MoLangFunctions.moLangFunctionMap
|
||||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||||
|
import com.cobblemon.mod.common.util.server
|
||||||
import java.util.UUID
|
import java.util.UUID
|
||||||
|
|
||||||
data class PokemonGainedEvent(
|
data class PokemonGainedEvent(
|
||||||
@@ -20,4 +24,8 @@ data class PokemonGainedEvent(
|
|||||||
"player_id" to StringValue(playerId.toString()),
|
"player_id" to StringValue(playerId.toString()),
|
||||||
"pokemon" to pokemon.struct
|
"pokemon" to pokemon.struct
|
||||||
)
|
)
|
||||||
|
|
||||||
|
val functions = moLangFunctionMap(
|
||||||
|
"player" to { server()?.playerList?.getPlayer(playerId)?.asMoLangValue() ?: DoubleValue.ZERO },
|
||||||
|
)
|
||||||
}
|
}
|
||||||
+11
-1
@@ -8,7 +8,10 @@
|
|||||||
|
|
||||||
package com.cobblemon.mod.common.api.events.pokemon.evolution
|
package com.cobblemon.mod.common.api.events.pokemon.evolution
|
||||||
|
|
||||||
|
import com.bedrockk.molang.runtime.value.MoValue
|
||||||
import com.cobblemon.mod.common.api.events.Cancelable
|
import com.cobblemon.mod.common.api.events.Cancelable
|
||||||
|
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asMoLangValue
|
||||||
|
import com.cobblemon.mod.common.api.molang.MoLangFunctions.moLangFunctionMap
|
||||||
import com.cobblemon.mod.common.api.pokemon.evolution.Evolution
|
import com.cobblemon.mod.common.api.pokemon.evolution.Evolution
|
||||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||||
|
|
||||||
@@ -25,4 +28,11 @@ import com.cobblemon.mod.common.pokemon.Pokemon
|
|||||||
data class EvolutionAcceptedEvent(
|
data class EvolutionAcceptedEvent(
|
||||||
override val pokemon: Pokemon,
|
override val pokemon: Pokemon,
|
||||||
override val evolution: Evolution
|
override val evolution: Evolution
|
||||||
) : Cancelable(), EvolutionEvent
|
) : Cancelable(), EvolutionEvent {
|
||||||
|
val context = mutableMapOf<String, MoValue>(
|
||||||
|
"pokemon" to pokemon.struct,
|
||||||
|
"evolution" to evolution.asMoLangValue()
|
||||||
|
)
|
||||||
|
|
||||||
|
val functions = moLangFunctionMap(cancelFunc)
|
||||||
|
}
|
||||||
+8
-1
@@ -8,6 +8,8 @@
|
|||||||
|
|
||||||
package com.cobblemon.mod.common.api.events.pokemon.evolution
|
package com.cobblemon.mod.common.api.events.pokemon.evolution
|
||||||
|
|
||||||
|
import com.bedrockk.molang.runtime.value.MoValue
|
||||||
|
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asMoLangValue
|
||||||
import com.cobblemon.mod.common.api.pokemon.evolution.Evolution
|
import com.cobblemon.mod.common.api.pokemon.evolution.Evolution
|
||||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||||
|
|
||||||
@@ -23,4 +25,9 @@ import com.cobblemon.mod.common.pokemon.Pokemon
|
|||||||
data class EvolutionCompleteEvent(
|
data class EvolutionCompleteEvent(
|
||||||
override val pokemon: Pokemon,
|
override val pokemon: Pokemon,
|
||||||
override val evolution: Evolution
|
override val evolution: Evolution
|
||||||
) : EvolutionEvent
|
) : EvolutionEvent {
|
||||||
|
val context = mutableMapOf<String, MoValue>(
|
||||||
|
"pokemon" to pokemon.struct,
|
||||||
|
"evolution" to evolution.asMoLangValue()
|
||||||
|
)
|
||||||
|
}
|
||||||
+20
-1
@@ -8,8 +8,13 @@
|
|||||||
|
|
||||||
package com.cobblemon.mod.common.api.events.pokemon.evolution
|
package com.cobblemon.mod.common.api.events.pokemon.evolution
|
||||||
|
|
||||||
|
import com.bedrockk.molang.runtime.value.DoubleValue
|
||||||
|
import com.bedrockk.molang.runtime.value.MoValue
|
||||||
|
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asMoLangValue
|
||||||
|
import com.cobblemon.mod.common.api.molang.MoLangFunctions.moLangFunctionMap
|
||||||
import com.cobblemon.mod.common.api.pokemon.evolution.Evolution
|
import com.cobblemon.mod.common.api.pokemon.evolution.Evolution
|
||||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||||
|
import com.cobblemon.mod.common.util.getBoolean
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An event fired when [Evolution.test] has been performed.
|
* An event fired when [Evolution.test] has been performed.
|
||||||
@@ -25,4 +30,18 @@ data class EvolutionTestedEvent(
|
|||||||
override val evolution: Evolution,
|
override val evolution: Evolution,
|
||||||
val originalResult: Boolean,
|
val originalResult: Boolean,
|
||||||
var result: Boolean
|
var result: Boolean
|
||||||
) : EvolutionEvent
|
) : EvolutionEvent {
|
||||||
|
val context = mutableMapOf<String, MoValue>(
|
||||||
|
"pokemon" to pokemon.struct,
|
||||||
|
"evolution" to evolution.asMoLangValue(),
|
||||||
|
"original_result" to DoubleValue(originalResult),
|
||||||
|
)
|
||||||
|
|
||||||
|
val functions = moLangFunctionMap(
|
||||||
|
"result" to { DoubleValue(result) },
|
||||||
|
"set_result" to {
|
||||||
|
result = it.getBoolean(0)
|
||||||
|
DoubleValue.ONE
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|||||||
+4
-1
@@ -16,6 +16,9 @@ import java.util.UUID
|
|||||||
data class PokemonInteractionGUICreationEvent(
|
data class PokemonInteractionGUICreationEvent(
|
||||||
val pokemonID: UUID,
|
val pokemonID: UUID,
|
||||||
val mountShoulder: Boolean,
|
val mountShoulder: Boolean,
|
||||||
|
val giveHeld: Boolean,
|
||||||
|
val giveCosmetic: Boolean,
|
||||||
|
val canRide: Boolean,
|
||||||
val options: Multimap<Orientation, InteractWheelOption>
|
val options: Multimap<Orientation, InteractWheelOption>
|
||||||
) {
|
) {
|
||||||
fun addFillingOption(option: InteractWheelOption) {
|
fun addFillingOption(option: InteractWheelOption) {
|
||||||
@@ -28,7 +31,7 @@ data class PokemonInteractionGUICreationEvent(
|
|||||||
|
|
||||||
private fun getNextFreeOrientation(): Orientation {
|
private fun getNextFreeOrientation(): Orientation {
|
||||||
var largest = Orientation.TOP_LEFT
|
var largest = Orientation.TOP_LEFT
|
||||||
for(orientation in Orientation.values()) {
|
for (orientation in Orientation.entries) {
|
||||||
if(!options.containsKey(orientation)) {
|
if(!options.containsKey(orientation)) {
|
||||||
return orientation
|
return orientation
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
+52
@@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
* 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.events.storage
|
||||||
|
|
||||||
|
import com.cobblemon.mod.common.api.events.Cancelable
|
||||||
|
import com.cobblemon.mod.common.api.storage.pc.PCBox
|
||||||
|
import net.minecraft.resources.ResourceLocation
|
||||||
|
import net.minecraft.server.level.ServerPlayer
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Events fired whenever a player changes their PC Wallpaper.
|
||||||
|
* Has a cancelable [Pre] event and a [Post] which gets fired after the change.
|
||||||
|
*
|
||||||
|
* @author JustAHuman-xD
|
||||||
|
* @since February 14th, 2025
|
||||||
|
*/
|
||||||
|
interface ChangePCBoxWallpaperEvent {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The [ServerPlayer] who is changing their wallpaper
|
||||||
|
*/
|
||||||
|
val player: ServerPlayer
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The [PCBox] whose wallpaper is being changed
|
||||||
|
*/
|
||||||
|
val box: PCBox
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The location of the wallpaper that is being changed to. Can be modified in the [Pre] event.
|
||||||
|
* NOTE: Changing this to a wallpaper that does not exist on the client, will result in a purple/black fallback texture being displayed.
|
||||||
|
*/
|
||||||
|
val wallpaper: ResourceLocation
|
||||||
|
|
||||||
|
class Pre(
|
||||||
|
override val player: ServerPlayer,
|
||||||
|
override val box: PCBox,
|
||||||
|
override var wallpaper: ResourceLocation
|
||||||
|
) : ChangePCBoxWallpaperEvent, Cancelable()
|
||||||
|
|
||||||
|
class Post(
|
||||||
|
override val player: ServerPlayer,
|
||||||
|
override val box: PCBox,
|
||||||
|
override val wallpaper: ResourceLocation
|
||||||
|
) : ChangePCBoxWallpaperEvent
|
||||||
|
}
|
||||||
+50
@@ -0,0 +1,50 @@
|
|||||||
|
/*
|
||||||
|
* 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.events.storage
|
||||||
|
|
||||||
|
import com.cobblemon.mod.common.api.events.Cancelable
|
||||||
|
import com.cobblemon.mod.common.api.storage.pc.PCBox
|
||||||
|
import net.minecraft.server.level.ServerPlayer
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Events fired whenever a player renames one of their PC boxes.
|
||||||
|
* Has a cancelable [Pre] event and a [Post] which gets fired after the change.
|
||||||
|
*
|
||||||
|
* @author JustAHuman-xD
|
||||||
|
* @since February 14th, 2025
|
||||||
|
*/
|
||||||
|
interface RenamePCBoxEvent {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The [ServerPlayer] who is changing their wallpaper
|
||||||
|
*/
|
||||||
|
val player: ServerPlayer
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The [PCBox] whose wallpaper is being changed
|
||||||
|
*/
|
||||||
|
val box: PCBox
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The new box name being used. This can be modified in the [Pre] event.
|
||||||
|
*/
|
||||||
|
val name: String
|
||||||
|
|
||||||
|
class Pre(
|
||||||
|
override val player: ServerPlayer,
|
||||||
|
override val box: PCBox,
|
||||||
|
override var name: String
|
||||||
|
) : RenamePCBoxEvent, Cancelable()
|
||||||
|
|
||||||
|
class Post(
|
||||||
|
override val player: ServerPlayer,
|
||||||
|
override val box: PCBox,
|
||||||
|
override val name: String
|
||||||
|
) : RenamePCBoxEvent
|
||||||
|
}
|
||||||
+26
@@ -0,0 +1,26 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Cobblemon Contributors
|
||||||
|
*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.cobblemon.mod.common.api.events.storage
|
||||||
|
|
||||||
|
import net.minecraft.resources.ResourceLocation
|
||||||
|
import net.minecraft.server.level.ServerPlayer
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Event being fired whenever the client connects to a server and "requests" what wallpapers are available for it to choose from.
|
||||||
|
* Mods can listen to this event and remove available options from the client when they connect, essentially causing them to not exist client-side
|
||||||
|
*
|
||||||
|
* NOTE: Adding wallpapers here that do not exist on the client, will result in the purple/black fallback texture being displayed client-side.
|
||||||
|
*
|
||||||
|
* @author JustAHuman-xD
|
||||||
|
* @since February 14th, 2025
|
||||||
|
*/
|
||||||
|
data class WallpaperCollectionEvent(
|
||||||
|
val player: ServerPlayer,
|
||||||
|
val wallpapers: MutableSet<ResourceLocation>
|
||||||
|
)
|
||||||
+57
@@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Cobblemon Contributors
|
||||||
|
*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.cobblemon.mod.common.api.events.storage
|
||||||
|
|
||||||
|
import com.bedrockk.molang.runtime.value.DoubleValue
|
||||||
|
import com.bedrockk.molang.runtime.value.MoValue
|
||||||
|
import com.cobblemon.mod.common.api.events.Cancelable
|
||||||
|
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asMoLangValue
|
||||||
|
import com.cobblemon.mod.common.api.molang.MoLangFunctions.moLangFunctionMap
|
||||||
|
import com.cobblemon.mod.common.api.storage.pc.PCStore
|
||||||
|
import com.cobblemon.mod.common.api.storage.pc.UnlockablePCWallpaper
|
||||||
|
import com.cobblemon.mod.common.util.asArrayValue
|
||||||
|
import com.cobblemon.mod.common.util.getBoolean
|
||||||
|
import net.minecraft.server.level.ServerPlayer
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Event fired when a wallpaper is unlocked for a PC. Typically, this will have a single player, but it is not
|
||||||
|
* technically guaranteed to due to shared PCs and offline support.
|
||||||
|
*
|
||||||
|
* @author Hiroku
|
||||||
|
* @since February 10th, 2025
|
||||||
|
*/
|
||||||
|
data class WallpaperUnlockedEvent(
|
||||||
|
val pc: PCStore,
|
||||||
|
val wallpaper: UnlockablePCWallpaper,
|
||||||
|
var shouldNotify: Boolean
|
||||||
|
): Cancelable() {
|
||||||
|
/** For shared PCs with multiple players online, and for offline PC access, the player will be null. */
|
||||||
|
val player: ServerPlayer?
|
||||||
|
get() = pc.getObservingPlayers().takeIf { it.size == 1 }?.first()
|
||||||
|
|
||||||
|
/** All online, observing players for the PC. This would typically have a single player in it. */
|
||||||
|
val players = pc.getObservingPlayers()
|
||||||
|
|
||||||
|
val context: MutableMap<String, MoValue>
|
||||||
|
get() = mutableMapOf(
|
||||||
|
"pc" to pc.struct,
|
||||||
|
"wallpaper" to wallpaper.struct,
|
||||||
|
"player" to (player?.asMoLangValue() ?: DoubleValue.ZERO),
|
||||||
|
"players" to players.asArrayValue { it.asMoLangValue() },
|
||||||
|
"should_notify" to DoubleValue(shouldNotify)
|
||||||
|
)
|
||||||
|
|
||||||
|
val functions = moLangFunctionMap(
|
||||||
|
cancelFunc,
|
||||||
|
"set_should_notify" to { params ->
|
||||||
|
shouldNotify = params.getBoolean(0)
|
||||||
|
DoubleValue.ONE
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -11,7 +11,7 @@ package com.cobblemon.mod.common.api.fishing
|
|||||||
import com.cobblemon.mod.common.CobblemonItemComponents
|
import com.cobblemon.mod.common.CobblemonItemComponents
|
||||||
import com.cobblemon.mod.common.api.data.JsonDataRegistry
|
import com.cobblemon.mod.common.api.data.JsonDataRegistry
|
||||||
import com.cobblemon.mod.common.api.reactive.SimpleObservable
|
import com.cobblemon.mod.common.api.reactive.SimpleObservable
|
||||||
import com.cobblemon.mod.common.net.messages.client.fishing.FishingBaitRegistrySyncPacket
|
import com.cobblemon.mod.common.net.messages.client.data.FishingBaitRegistrySyncPacket
|
||||||
import com.cobblemon.mod.common.util.adapters.IdentifierAdapter
|
import com.cobblemon.mod.common.util.adapters.IdentifierAdapter
|
||||||
import com.cobblemon.mod.common.util.cobblemonResource
|
import com.cobblemon.mod.common.util.cobblemonResource
|
||||||
import com.google.gson.Gson
|
import com.google.gson.Gson
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
package com.cobblemon.mod.common.api.fossil
|
package com.cobblemon.mod.common.api.fossil
|
||||||
|
|
||||||
import com.cobblemon.mod.common.api.pokemon.PokemonProperties
|
import com.cobblemon.mod.common.api.pokemon.PokemonProperties
|
||||||
import com.cobblemon.mod.common.pokemon.evolution.predicate.NbtItemPredicate
|
import net.minecraft.advancements.critereon.ItemPredicate
|
||||||
import net.minecraft.network.chat.Component
|
import net.minecraft.network.chat.Component
|
||||||
import net.minecraft.network.chat.MutableComponent
|
import net.minecraft.network.chat.MutableComponent
|
||||||
import net.minecraft.resources.ResourceLocation
|
import net.minecraft.resources.ResourceLocation
|
||||||
@@ -19,7 +19,7 @@ import net.minecraft.world.item.ItemStack
|
|||||||
class Fossil(
|
class Fossil(
|
||||||
identifier: ResourceLocation,
|
identifier: ResourceLocation,
|
||||||
val result: PokemonProperties,
|
val result: PokemonProperties,
|
||||||
val fossils: List<NbtItemPredicate>
|
val fossils: List<ItemPredicate>
|
||||||
): StringRepresentable {
|
): StringRepresentable {
|
||||||
|
|
||||||
@Transient
|
@Transient
|
||||||
|
|||||||
@@ -13,15 +13,15 @@ import com.cobblemon.mod.common.api.conditional.RegistryLikeCondition
|
|||||||
import com.cobblemon.mod.common.api.data.JsonDataRegistry
|
import com.cobblemon.mod.common.api.data.JsonDataRegistry
|
||||||
import com.cobblemon.mod.common.api.pokemon.PokemonProperties
|
import com.cobblemon.mod.common.api.pokemon.PokemonProperties
|
||||||
import com.cobblemon.mod.common.api.reactive.SimpleObservable
|
import com.cobblemon.mod.common.api.reactive.SimpleObservable
|
||||||
import com.cobblemon.mod.common.net.messages.client.fossil.FossilRegistrySyncPacket
|
import com.cobblemon.mod.common.net.messages.client.data.FossilRegistrySyncPacket
|
||||||
import com.cobblemon.mod.common.pokemon.evolution.adapters.NbtItemPredicateAdapter
|
import com.cobblemon.mod.common.pokemon.evolution.adapters.LegacyItemConditionWrapperAdapter
|
||||||
import com.cobblemon.mod.common.pokemon.evolution.predicate.NbtItemPredicate
|
|
||||||
import com.cobblemon.mod.common.util.adapters.IdentifierAdapter
|
import com.cobblemon.mod.common.util.adapters.IdentifierAdapter
|
||||||
import com.cobblemon.mod.common.util.adapters.ItemLikeConditionAdapter
|
import com.cobblemon.mod.common.util.adapters.ItemLikeConditionAdapter
|
||||||
import com.cobblemon.mod.common.util.adapters.pokemonPropertiesShortAdapter
|
import com.cobblemon.mod.common.util.adapters.pokemonPropertiesShortAdapter
|
||||||
import com.cobblemon.mod.common.util.cobblemonResource
|
import com.cobblemon.mod.common.util.cobblemonResource
|
||||||
import com.google.gson.GsonBuilder
|
import com.google.gson.GsonBuilder
|
||||||
import com.google.gson.reflect.TypeToken
|
import com.google.gson.reflect.TypeToken
|
||||||
|
import net.minecraft.advancements.critereon.ItemPredicate
|
||||||
import net.minecraft.resources.ResourceLocation
|
import net.minecraft.resources.ResourceLocation
|
||||||
import net.minecraft.server.level.ServerPlayer
|
import net.minecraft.server.level.ServerPlayer
|
||||||
import net.minecraft.server.packs.PackType
|
import net.minecraft.server.packs.PackType
|
||||||
@@ -40,7 +40,7 @@ object Fossils: JsonDataRegistry<Fossil> {
|
|||||||
.registerTypeAdapter(ResourceLocation::class.java, IdentifierAdapter)
|
.registerTypeAdapter(ResourceLocation::class.java, IdentifierAdapter)
|
||||||
.registerTypeAdapter(PokemonProperties::class.java, pokemonPropertiesShortAdapter)
|
.registerTypeAdapter(PokemonProperties::class.java, pokemonPropertiesShortAdapter)
|
||||||
.registerTypeAdapter(TypeToken.getParameterized(RegistryLikeCondition::class.java, Item::class.java).type, ItemLikeConditionAdapter)
|
.registerTypeAdapter(TypeToken.getParameterized(RegistryLikeCondition::class.java, Item::class.java).type, ItemLikeConditionAdapter)
|
||||||
.registerTypeAdapter(NbtItemPredicate::class.java, NbtItemPredicateAdapter)
|
.registerTypeAdapter(ItemPredicate::class.java, LegacyItemConditionWrapperAdapter)
|
||||||
.create()
|
.create()
|
||||||
|
|
||||||
override val typeToken: TypeToken<Fossil> = TypeToken.get(Fossil::class.java)
|
override val typeToken: TypeToken<Fossil> = TypeToken.get(Fossil::class.java)
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ package com.cobblemon.mod.common.api.fossil
|
|||||||
|
|
||||||
import com.cobblemon.mod.common.api.data.JsonDataRegistry
|
import com.cobblemon.mod.common.api.data.JsonDataRegistry
|
||||||
import com.cobblemon.mod.common.api.reactive.SimpleObservable
|
import com.cobblemon.mod.common.api.reactive.SimpleObservable
|
||||||
import com.cobblemon.mod.common.net.messages.client.fossil.NaturalMaterialRegistrySyncPacket
|
import com.cobblemon.mod.common.net.messages.client.data.NaturalMaterialRegistrySyncPacket
|
||||||
import com.cobblemon.mod.common.registry.ItemTagCondition
|
import com.cobblemon.mod.common.registry.ItemTagCondition
|
||||||
import com.cobblemon.mod.common.util.adapters.IdentifierAdapter
|
import com.cobblemon.mod.common.util.adapters.IdentifierAdapter
|
||||||
import com.cobblemon.mod.common.util.adapters.ItemLikeConditionAdapter
|
import com.cobblemon.mod.common.util.adapters.ItemLikeConditionAdapter
|
||||||
|
|||||||
@@ -12,12 +12,10 @@ import com.cobblemon.mod.common.api.text.font
|
|||||||
import com.cobblemon.mod.common.client.gui.battle.BattleOverlay.Companion.PORTRAIT_DIAMETER
|
import com.cobblemon.mod.common.client.gui.battle.BattleOverlay.Companion.PORTRAIT_DIAMETER
|
||||||
import com.cobblemon.mod.common.client.render.SpriteType
|
import com.cobblemon.mod.common.client.render.SpriteType
|
||||||
import com.cobblemon.mod.common.client.render.models.blockbench.PosableState
|
import com.cobblemon.mod.common.client.render.models.blockbench.PosableState
|
||||||
import com.cobblemon.mod.common.client.render.models.blockbench.repository.PokemonModelRepository
|
|
||||||
import com.cobblemon.mod.common.client.render.models.blockbench.repository.RenderContext
|
import com.cobblemon.mod.common.client.render.models.blockbench.repository.RenderContext
|
||||||
import com.cobblemon.mod.common.client.render.models.blockbench.repository.VaryingModelRepository
|
import com.cobblemon.mod.common.client.render.models.blockbench.repository.VaryingModelRepository
|
||||||
import com.cobblemon.mod.common.entity.PoseType
|
import com.cobblemon.mod.common.entity.PoseType
|
||||||
import com.cobblemon.mod.common.util.toHex
|
import com.cobblemon.mod.common.util.toHex
|
||||||
import com.mojang.authlib.minecraft.client.MinecraftClient
|
|
||||||
import com.mojang.blaze3d.platform.GlStateManager
|
import com.mojang.blaze3d.platform.GlStateManager
|
||||||
import com.mojang.blaze3d.platform.Lighting
|
import com.mojang.blaze3d.platform.Lighting
|
||||||
import com.mojang.blaze3d.systems.RenderSystem
|
import com.mojang.blaze3d.systems.RenderSystem
|
||||||
@@ -39,6 +37,8 @@ import net.minecraft.resources.ResourceLocation
|
|||||||
import net.minecraft.util.FormattedCharSequence
|
import net.minecraft.util.FormattedCharSequence
|
||||||
import org.joml.Matrix4f
|
import org.joml.Matrix4f
|
||||||
import org.joml.Vector3f
|
import org.joml.Vector3f
|
||||||
|
import org.lwjgl.opengl.GL30
|
||||||
|
import java.nio.ByteBuffer
|
||||||
|
|
||||||
@JvmOverloads
|
@JvmOverloads
|
||||||
fun blitk(
|
fun blitk(
|
||||||
@@ -209,7 +209,6 @@ fun drawPosablePortrait(
|
|||||||
contextScale: Float = 1F,
|
contextScale: Float = 1F,
|
||||||
reversed: Boolean = false,
|
reversed: Boolean = false,
|
||||||
state: PosableState,
|
state: PosableState,
|
||||||
repository: VaryingModelRepository<*>,
|
|
||||||
partialTicks: Float,
|
partialTicks: Float,
|
||||||
limbSwing: Float = 0F,
|
limbSwing: Float = 0F,
|
||||||
limbSwingAmount: Float = 0F,
|
limbSwingAmount: Float = 0F,
|
||||||
@@ -227,16 +226,16 @@ fun drawPosablePortrait(
|
|||||||
matrixStack.scale(scale, scale, -scale)
|
matrixStack.scale(scale, scale, -scale)
|
||||||
matrixStack.translate(0.0, -PORTRAIT_DIAMETER / 18.0, 0.0)
|
matrixStack.translate(0.0, -PORTRAIT_DIAMETER / 18.0, 0.0)
|
||||||
|
|
||||||
val sprite = repository.getSprite(identifier, state, SpriteType.PORTRAIT);
|
val sprite = VaryingModelRepository.getSprite(identifier, state, SpriteType.PORTRAIT);
|
||||||
|
|
||||||
if (sprite == null) {
|
if (sprite == null) {
|
||||||
val model = repository.getPoser(identifier, state)
|
val model = VaryingModelRepository.getPoser(identifier, state)
|
||||||
state.currentModel = model
|
state.currentModel = model
|
||||||
val texture = repository.getTexture(identifier, state)
|
val texture = VaryingModelRepository.getTexture(identifier, state)
|
||||||
|
|
||||||
val context = RenderContext()
|
val context = RenderContext()
|
||||||
model.context = context
|
model.context = context
|
||||||
repository.getTextureNoSubstitute(identifier, state).let { context.put(RenderContext.TEXTURE, it) }
|
VaryingModelRepository.getTextureNoSubstitute(identifier, state).let { context.put(RenderContext.TEXTURE, it) }
|
||||||
context.put(RenderContext.SCALE, contextScale)
|
context.put(RenderContext.SCALE, contextScale)
|
||||||
context.put(RenderContext.SPECIES, identifier)
|
context.put(RenderContext.SPECIES, identifier)
|
||||||
context.put(RenderContext.ASPECTS, state.currentAspects)
|
context.put(RenderContext.ASPECTS, state.currentAspects)
|
||||||
@@ -255,7 +254,7 @@ fun drawPosablePortrait(
|
|||||||
|
|
||||||
matrixStack.translate(
|
matrixStack.translate(
|
||||||
model.portraitTranslation.x * if (reversed) -1F else 1F,
|
model.portraitTranslation.x * if (reversed) -1F else 1F,
|
||||||
model.portraitTranslation.y,
|
model.portraitTranslation.y + 1.5 * model.portraitScale,
|
||||||
model.portraitTranslation.z - 4
|
model.portraitTranslation.z - 4
|
||||||
)
|
)
|
||||||
matrixStack.scale(model.portraitScale, model.portraitScale, 1 / model.portraitScale)
|
matrixStack.scale(model.portraitScale, model.portraitScale, 1 / model.portraitScale)
|
||||||
@@ -272,7 +271,7 @@ fun drawPosablePortrait(
|
|||||||
val packedLight = LightTexture.pack(11, 7)
|
val packedLight = LightTexture.pack(11, 7)
|
||||||
|
|
||||||
val colour = toHex(r, g, b, a)
|
val colour = toHex(r, g, b, a)
|
||||||
model.withLayerContext(immediate, state, repository.getLayers(identifier, state)) {
|
model.withLayerContext(immediate, state, VaryingModelRepository.getLayers(identifier, state)) {
|
||||||
model.render(context, matrixStack, buffer, packedLight, OverlayTexture.NO_OVERLAY, colour)
|
model.render(context, matrixStack, buffer, packedLight, OverlayTexture.NO_OVERLAY, colour)
|
||||||
immediate.endBatch()
|
immediate.endBatch()
|
||||||
}
|
}
|
||||||
@@ -288,7 +287,6 @@ fun drawPosablePortrait(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun drawProfile(
|
fun drawProfile(
|
||||||
repository: VaryingModelRepository<*>,
|
|
||||||
resourceIdentifier: ResourceLocation,
|
resourceIdentifier: ResourceLocation,
|
||||||
matrixStack: PoseStack,
|
matrixStack: PoseStack,
|
||||||
state: PosableState,
|
state: PosableState,
|
||||||
@@ -298,16 +296,16 @@ fun drawProfile(
|
|||||||
RenderSystem.applyModelViewMatrix()
|
RenderSystem.applyModelViewMatrix()
|
||||||
matrixStack.scale(scale, scale, -scale)
|
matrixStack.scale(scale, scale, -scale)
|
||||||
|
|
||||||
val sprite = repository.getSprite(resourceIdentifier, state, SpriteType.PROFILE)
|
val sprite = VaryingModelRepository.getSprite(resourceIdentifier, state, SpriteType.PROFILE)
|
||||||
|
|
||||||
if (sprite == null) {
|
if (sprite == null) {
|
||||||
|
|
||||||
val model = repository.getPoser(resourceIdentifier, state)
|
val model = VaryingModelRepository.getPoser(resourceIdentifier, state)
|
||||||
val texture = repository.getTexture(resourceIdentifier, state)
|
val texture = VaryingModelRepository.getTexture(resourceIdentifier, state)
|
||||||
|
|
||||||
val context = RenderContext()
|
val context = RenderContext()
|
||||||
model.context = context
|
model.context = context
|
||||||
repository.getTextureNoSubstitute(resourceIdentifier, state).let { context.put(RenderContext.TEXTURE, it) }
|
VaryingModelRepository.getTextureNoSubstitute(resourceIdentifier, state).let { context.put(RenderContext.TEXTURE, it) }
|
||||||
context.put(RenderContext.SCALE, 1F)
|
context.put(RenderContext.SCALE, 1F)
|
||||||
context.put(RenderContext.SPECIES, resourceIdentifier)
|
context.put(RenderContext.SPECIES, resourceIdentifier)
|
||||||
context.put(RenderContext.ASPECTS, state.currentAspects)
|
context.put(RenderContext.ASPECTS, state.currentAspects)
|
||||||
@@ -319,7 +317,11 @@ fun drawProfile(
|
|||||||
state.setPoseToFirstSuitable(PoseType.PORTRAIT)
|
state.setPoseToFirstSuitable(PoseType.PORTRAIT)
|
||||||
state.updatePartialTicks(partialTicks)
|
state.updatePartialTicks(partialTicks)
|
||||||
model.applyAnimations(null, state, 0F, 0F, 0F, 0F, 0F)
|
model.applyAnimations(null, state, 0F, 0F, 0F, 0F, 0F)
|
||||||
matrixStack.translate(model.profileTranslation.x, model.profileTranslation.y, model.profileTranslation.z - 4.0)
|
matrixStack.translate(
|
||||||
|
model.profileTranslation.x,
|
||||||
|
model.profileTranslation.y + 1.5 * model.profileScale,
|
||||||
|
model.profileTranslation.z - 4.0
|
||||||
|
)
|
||||||
matrixStack.scale(model.profileScale, model.profileScale, 1 / model.profileScale)
|
matrixStack.scale(model.profileScale, model.profileScale, 1 / model.profileScale)
|
||||||
// matrixStack.multiply(rotation)
|
// matrixStack.multiply(rotation)
|
||||||
val quaternion1 = Axis.YP.rotationDegrees(-32F * if (false) -1F else 1F)
|
val quaternion1 = Axis.YP.rotationDegrees(-32F * if (false) -1F else 1F)
|
||||||
@@ -337,7 +339,7 @@ fun drawProfile(
|
|||||||
RenderSystem.setShaderLights(light1, light2)
|
RenderSystem.setShaderLights(light1, light2)
|
||||||
val packedLight = LightTexture.pack(11, 7)
|
val packedLight = LightTexture.pack(11, 7)
|
||||||
|
|
||||||
model.withLayerContext(bufferSource, state, repository.getLayers(resourceIdentifier, state)) {
|
model.withLayerContext(bufferSource, state, VaryingModelRepository.getLayers(resourceIdentifier, state)) {
|
||||||
model.render(context, matrixStack, buffer, packedLight, OverlayTexture.NO_OVERLAY, -0x1)
|
model.render(context, matrixStack, buffer, packedLight, OverlayTexture.NO_OVERLAY, -0x1)
|
||||||
bufferSource.endBatch()
|
bufferSource.endBatch()
|
||||||
}
|
}
|
||||||
@@ -364,4 +366,26 @@ fun renderSprite(matrixStack: PoseStack, sprite: ResourceLocation) {
|
|||||||
buffer.addVertex(matrix, 2f, 2f, 0.0f).setUv(1f, 1f)
|
buffer.addVertex(matrix, 2f, 2f, 0.0f).setUv(1f, 1f)
|
||||||
|
|
||||||
BufferUploader.drawWithShader(buffer.buildOrThrow())
|
BufferUploader.drawWithShader(buffer.buildOrThrow())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun getPixelRGB(x: Int, y: Int): Triple<Int, Int, Int> {
|
||||||
|
val window = Minecraft.getInstance().window
|
||||||
|
val scale = window.guiScale
|
||||||
|
val buffer = ByteBuffer.allocateDirect(4)
|
||||||
|
|
||||||
|
RenderSystem.readPixels(
|
||||||
|
(x * scale).toInt(),
|
||||||
|
(window.height - y * scale - scale).toInt(),
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
GL30.GL_RGBA,
|
||||||
|
GL30.GL_UNSIGNED_BYTE,
|
||||||
|
buffer
|
||||||
|
)
|
||||||
|
|
||||||
|
return Triple(
|
||||||
|
buffer[0].toInt() and 0xFF,
|
||||||
|
buffer[1].toInt() and 0xFF,
|
||||||
|
buffer[2].toInt() and 0xFF
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import com.cobblemon.mod.common.Cobblemon
|
|||||||
import com.cobblemon.mod.common.CobblemonActivities
|
import com.cobblemon.mod.common.CobblemonActivities
|
||||||
import com.cobblemon.mod.common.CobblemonBlockEntities
|
import com.cobblemon.mod.common.CobblemonBlockEntities
|
||||||
import com.cobblemon.mod.common.CobblemonMemories
|
import com.cobblemon.mod.common.CobblemonMemories
|
||||||
|
import com.cobblemon.mod.common.CobblemonUnlockableWallpapers
|
||||||
import com.cobblemon.mod.common.api.battles.model.PokemonBattle
|
import com.cobblemon.mod.common.api.battles.model.PokemonBattle
|
||||||
import com.cobblemon.mod.common.api.battles.model.actor.ActorType
|
import com.cobblemon.mod.common.api.battles.model.actor.ActorType
|
||||||
import com.cobblemon.mod.common.api.battles.model.actor.BattleActor
|
import com.cobblemon.mod.common.api.battles.model.actor.BattleActor
|
||||||
@@ -36,7 +37,11 @@ import com.cobblemon.mod.common.api.pokedex.PokedexEntryProgress
|
|||||||
import com.cobblemon.mod.common.api.pokedex.PokedexManager
|
import com.cobblemon.mod.common.api.pokedex.PokedexManager
|
||||||
import com.cobblemon.mod.common.api.pokedex.SeenCount
|
import com.cobblemon.mod.common.api.pokedex.SeenCount
|
||||||
import com.cobblemon.mod.common.api.pokedex.SeenPercent
|
import com.cobblemon.mod.common.api.pokedex.SeenPercent
|
||||||
|
import com.cobblemon.mod.common.api.pokemon.PokemonProperties
|
||||||
|
import com.cobblemon.mod.common.api.pokemon.evolution.Evolution
|
||||||
import com.cobblemon.mod.common.api.pokemon.stats.Stats
|
import com.cobblemon.mod.common.api.pokemon.stats.Stats
|
||||||
|
import com.cobblemon.mod.common.api.riding.RidingStyle
|
||||||
|
import com.cobblemon.mod.common.api.riding.stats.RidingStat
|
||||||
import com.cobblemon.mod.common.api.scripting.CobblemonScripts
|
import com.cobblemon.mod.common.api.scripting.CobblemonScripts
|
||||||
import com.cobblemon.mod.common.api.spawning.context.SpawningContext
|
import com.cobblemon.mod.common.api.spawning.context.SpawningContext
|
||||||
import com.cobblemon.mod.common.api.storage.PokemonStore
|
import com.cobblemon.mod.common.api.storage.PokemonStore
|
||||||
@@ -60,8 +65,12 @@ import com.cobblemon.mod.common.net.messages.client.animation.PlayPosableAnimati
|
|||||||
import com.cobblemon.mod.common.net.messages.client.effect.RunPosableMoLangPacket
|
import com.cobblemon.mod.common.net.messages.client.effect.RunPosableMoLangPacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.effect.SpawnSnowstormEntityParticlePacket
|
import com.cobblemon.mod.common.net.messages.client.effect.SpawnSnowstormEntityParticlePacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.effect.SpawnSnowstormParticlePacket
|
import com.cobblemon.mod.common.net.messages.client.effect.SpawnSnowstormParticlePacket
|
||||||
|
import com.cobblemon.mod.common.pokemon.Gender
|
||||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||||
import com.cobblemon.mod.common.pokemon.Species
|
import com.cobblemon.mod.common.pokemon.Species
|
||||||
|
import com.cobblemon.mod.common.pokemon.evolution.variants.ItemInteractionEvolution
|
||||||
|
import com.cobblemon.mod.common.pokemon.evolution.variants.LevelUpEvolution
|
||||||
|
import com.cobblemon.mod.common.pokemon.evolution.variants.TradeEvolution
|
||||||
import com.cobblemon.mod.common.util.*
|
import com.cobblemon.mod.common.util.*
|
||||||
import com.mojang.datafixers.util.Either
|
import com.mojang.datafixers.util.Either
|
||||||
import java.util.UUID
|
import java.util.UUID
|
||||||
@@ -71,6 +80,7 @@ import net.minecraft.commands.arguments.EntityAnchorArgument
|
|||||||
import net.minecraft.core.BlockPos
|
import net.minecraft.core.BlockPos
|
||||||
import net.minecraft.core.Holder
|
import net.minecraft.core.Holder
|
||||||
import net.minecraft.core.Registry
|
import net.minecraft.core.Registry
|
||||||
|
import net.minecraft.core.RegistryAccess
|
||||||
import net.minecraft.core.registries.BuiltInRegistries
|
import net.minecraft.core.registries.BuiltInRegistries
|
||||||
import net.minecraft.core.registries.Registries
|
import net.minecraft.core.registries.Registries
|
||||||
import net.minecraft.nbt.CompoundTag
|
import net.minecraft.nbt.CompoundTag
|
||||||
@@ -86,6 +96,7 @@ import net.minecraft.server.level.ServerPlayer
|
|||||||
import net.minecraft.tags.TagKey
|
import net.minecraft.tags.TagKey
|
||||||
import net.minecraft.world.damagesource.DamageSource
|
import net.minecraft.world.damagesource.DamageSource
|
||||||
import net.minecraft.world.damagesource.DamageTypes
|
import net.minecraft.world.damagesource.DamageTypes
|
||||||
|
import net.minecraft.world.entity.Entity
|
||||||
import net.minecraft.world.entity.EntityType
|
import net.minecraft.world.entity.EntityType
|
||||||
import net.minecraft.world.entity.LightningBolt
|
import net.minecraft.world.entity.LightningBolt
|
||||||
import net.minecraft.world.entity.LivingEntity
|
import net.minecraft.world.entity.LivingEntity
|
||||||
@@ -95,6 +106,7 @@ import net.minecraft.world.entity.ai.memory.MemoryModuleType
|
|||||||
import net.minecraft.world.entity.ai.memory.MemoryStatus
|
import net.minecraft.world.entity.ai.memory.MemoryStatus
|
||||||
import net.minecraft.world.entity.ai.memory.WalkTarget
|
import net.minecraft.world.entity.ai.memory.WalkTarget
|
||||||
import net.minecraft.world.entity.player.Player
|
import net.minecraft.world.entity.player.Player
|
||||||
|
import net.minecraft.world.item.ItemStack
|
||||||
import net.minecraft.world.level.Level
|
import net.minecraft.world.level.Level
|
||||||
import net.minecraft.world.level.Level.ExplosionInteraction
|
import net.minecraft.world.level.Level.ExplosionInteraction
|
||||||
import net.minecraft.world.level.biome.Biome
|
import net.minecraft.world.level.biome.Biome
|
||||||
@@ -300,6 +312,11 @@ object MoLangFunctions {
|
|||||||
.map { it.asMostSpecificMoLangValue() }
|
.map { it.asMostSpecificMoLangValue() }
|
||||||
.asArrayValue()
|
.asArrayValue()
|
||||||
}
|
}
|
||||||
|
map.put("is_healer_in_use") { params ->
|
||||||
|
val pos = params.get<ArrayStruct>(0).asBlockPos()
|
||||||
|
val healer = world.getBlockEntity(pos, CobblemonBlockEntities.HEALING_MACHINE).orElse(null) ?: return@put DoubleValue.ONE
|
||||||
|
return@put DoubleValue(healer.isInUse)
|
||||||
|
}
|
||||||
|
|
||||||
return@mutableListOf map
|
return@mutableListOf map
|
||||||
}
|
}
|
||||||
@@ -311,8 +328,8 @@ object MoLangFunctions {
|
|||||||
val map = hashMapOf<String, java.util.function.Function<MoParams, Any>>()
|
val map = hashMapOf<String, java.util.function.Function<MoParams, Any>>()
|
||||||
map.put("username") { _ -> StringValue(player.gameProfile.name) }
|
map.put("username") { _ -> StringValue(player.gameProfile.name) }
|
||||||
map.put("uuid") { _ -> StringValue(player.gameProfile.id.toString()) }
|
map.put("uuid") { _ -> StringValue(player.gameProfile.id.toString()) }
|
||||||
map.put("main_held_item") { _ -> player.level().itemRegistry.wrapAsHolder(player.mainHandItem.item).asMoLangValue(Registries.ITEM) }
|
map.put("main_held_item") { _ -> player.mainHandItem.asMoLangValue(player.registryAccess()) }
|
||||||
map.put("off_held_item") { _ -> player.level().itemRegistry.wrapAsHolder(player.offhandItem.item).asMoLangValue(Registries.ITEM) }
|
map.put("off_held_item") { _ -> player.offhandItem.asMoLangValue(player.registryAccess()) }
|
||||||
map.put("face") { params -> ObjectValue(PlayerDialogueFaceProvider(player.uuid, params.getBooleanOrNull(0) != false)) }
|
map.put("face") { params -> ObjectValue(PlayerDialogueFaceProvider(player.uuid, params.getBooleanOrNull(0) != false)) }
|
||||||
map.put("swing_hand") { _ -> player.swing(player.usedItemHand) }
|
map.put("swing_hand") { _ -> player.swing(player.usedItemHand) }
|
||||||
map.put("food_level") { _ -> DoubleValue(player.foodData.foodLevel) }
|
map.put("food_level") { _ -> DoubleValue(player.foodData.foodLevel) }
|
||||||
@@ -406,11 +423,39 @@ object MoLangFunctions {
|
|||||||
return@put DoubleValue.ONE
|
return@put DoubleValue.ONE
|
||||||
}
|
}
|
||||||
map.put("pokedex") { player.pokedex().struct }
|
map.put("pokedex") { player.pokedex().struct }
|
||||||
|
map.put("has_advancement") { params ->
|
||||||
|
val requiredAdvancement = ResourceLocation.parse(params.getString(0))
|
||||||
|
for (entry in player.advancements.progress) {
|
||||||
|
if (entry.key.id == requiredAdvancement && entry.value.isDone) {
|
||||||
|
return@put DoubleValue.ONE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return@put DoubleValue.ZERO
|
||||||
|
}
|
||||||
}
|
}
|
||||||
map
|
map
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
val entityFunctions: MutableList<(LivingEntity) -> HashMap<String, java.util.function.Function<MoParams, Any>>> = mutableListOf<(LivingEntity) -> HashMap<String, java.util.function.Function<MoParams, Any>>>(
|
val itemStackFunctions = mutableListOf<(ItemStack, RegistryAccess) -> HashMap<String, java.util.function.Function<MoParams, Any>>>(
|
||||||
|
{ stack, registryAccess ->
|
||||||
|
val itemRegistry = registryAccess.registryOrThrow(Registries.ITEM)
|
||||||
|
val holder = itemRegistry.wrapAsHolder(stack.item)
|
||||||
|
|
||||||
|
val map = hashMapOf<String, java.util.function.Function<MoParams, Any>>()
|
||||||
|
map.put("item") { _ -> holder.asMoLangValue(Registries.ITEM) }
|
||||||
|
map.put("count") { _ -> DoubleValue(stack.count.toDouble()) }
|
||||||
|
map.put("damage_value") { _ -> DoubleValue(stack.damageValue) }
|
||||||
|
map.put("max_damage") { _ -> DoubleValue(stack.maxDamage) }
|
||||||
|
map.put("is_empty") { _ -> DoubleValue(stack.isEmpty) }
|
||||||
|
map.put("shrink") { params -> stack.shrink(params.getInt(0)) }
|
||||||
|
map.put("grow") { params -> stack.grow(params.getInt(0)) }
|
||||||
|
map.put("is_of") { params -> DoubleValue(holder.`is`(params.getString(0).asIdentifierDefaultingNamespace())) }
|
||||||
|
map.put("is_in") { params -> DoubleValue(holder.`is`(TagKey.create(Registries.ITEM, params.getString(0).replace("#", "").asIdentifierDefaultingNamespace()))) }
|
||||||
|
return@mutableListOf map
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
val entityFunctions: MutableList<(Entity) -> HashMap<String, java.util.function.Function<MoParams, Any>>> = mutableListOf(
|
||||||
{ entity ->
|
{ entity ->
|
||||||
val map = hashMapOf<String, java.util.function.Function<MoParams, Any>>()
|
val map = hashMapOf<String, java.util.function.Function<MoParams, Any>>()
|
||||||
map.put("uuid") { _ -> StringValue(entity.uuid.toString()) }
|
map.put("uuid") { _ -> StringValue(entity.uuid.toString()) }
|
||||||
@@ -419,31 +464,8 @@ object MoLangFunctions {
|
|||||||
val source = DamageSource(entity.level().registryAccess().registryOrThrow(Registries.DAMAGE_TYPE).getHolder(DamageTypes.GENERIC).get())
|
val source = DamageSource(entity.level().registryAccess().registryOrThrow(Registries.DAMAGE_TYPE).getHolder(DamageTypes.GENERIC).get())
|
||||||
entity.hurt(source, amount.toFloat())
|
entity.hurt(source, amount.toFloat())
|
||||||
}
|
}
|
||||||
map.put("walk_to") { params ->
|
|
||||||
val x = params.getDouble(0)
|
|
||||||
val y = params.getDouble(1)
|
|
||||||
val z = params.getDouble(2)
|
|
||||||
val speedMultiplier = params.getDoubleOrNull(3) ?: 0.35
|
|
||||||
if (entity is PathfinderMob) {
|
|
||||||
if (entity.brain.checkMemory(MemoryModuleType.WALK_TARGET, MemoryStatus.REGISTERED)) {
|
|
||||||
entity.brain.setMemory(MemoryModuleType.WALK_TARGET, WalkTarget(Vec3(x, y, z), speedMultiplier.toFloat(), 1))
|
|
||||||
entity.brain.setMemory(MemoryModuleType.LOOK_TARGET, BlockPosTracker(Vec3(x, y + entity.eyeHeight, z)))
|
|
||||||
} else {
|
|
||||||
entity.navigation.moveTo(x, y, z, speedMultiplier)
|
|
||||||
entity.lookControl.setLookAt(Vec3(x, y + entity.eyeHeight, z))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
map.put("has_walk_target") { _ ->
|
|
||||||
if (entity is PathfinderMob) {
|
|
||||||
DoubleValue(entity.brain.getMemory(MemoryModuleType.WALK_TARGET).isPresent || entity.isPathFinding)
|
|
||||||
} else {
|
|
||||||
DoubleValue.ZERO
|
|
||||||
}
|
|
||||||
}
|
|
||||||
map.put("is_sneaking") { _ -> DoubleValue(entity.isShiftKeyDown) }
|
map.put("is_sneaking") { _ -> DoubleValue(entity.isShiftKeyDown) }
|
||||||
map.put("is_sprinting") { _ -> DoubleValue(entity.isSprinting) }
|
map.put("is_sprinting") { _ -> DoubleValue(entity.isSprinting) }
|
||||||
map.put("is_flying") { _ -> DoubleValue(entity.isFallFlying) }
|
|
||||||
map.put("is_in_water") { _ -> DoubleValue(entity.isUnderWater) }
|
map.put("is_in_water") { _ -> DoubleValue(entity.isUnderWater) }
|
||||||
map.put("is_touching_water_or_rain") { _ -> DoubleValue(entity.isInWaterRainOrBubble) }
|
map.put("is_touching_water_or_rain") { _ -> DoubleValue(entity.isInWaterRainOrBubble) }
|
||||||
map.put("is_touching_water") { _ -> DoubleValue(entity.isInWater) }
|
map.put("is_touching_water") { _ -> DoubleValue(entity.isInWater) }
|
||||||
@@ -451,16 +473,13 @@ object MoLangFunctions {
|
|||||||
map.put("is_in_lava") { _ -> DoubleValue(entity.isInLava) }
|
map.put("is_in_lava") { _ -> DoubleValue(entity.isInLava) }
|
||||||
map.put("is_on_fire") { _ -> DoubleValue(entity.isOnFire) }
|
map.put("is_on_fire") { _ -> DoubleValue(entity.isOnFire) }
|
||||||
map.put("is_invisible") { _ -> DoubleValue(entity.isInvisible) }
|
map.put("is_invisible") { _ -> DoubleValue(entity.isInvisible) }
|
||||||
map.put("is_sleeping") { _ -> DoubleValue(entity.isSleeping) }
|
|
||||||
map.put("is_riding") { _ -> DoubleValue(entity.isPassenger) }
|
map.put("is_riding") { _ -> DoubleValue(entity.isPassenger) }
|
||||||
map.put("health") { _ -> DoubleValue(entity.health) }
|
|
||||||
map.put("distance_to_pos") { params ->
|
map.put("distance_to_pos") { params ->
|
||||||
val x = params.getDouble(0)
|
val x = params.getDouble(0)
|
||||||
val y = params.getDouble(1)
|
val y = params.getDouble(1)
|
||||||
val z = params.getDouble(2)
|
val z = params.getDouble(2)
|
||||||
return@put DoubleValue(sqrt(entity.distanceToSqr(Vec3(x, y, z))))
|
return@put DoubleValue(sqrt(entity.distanceToSqr(Vec3(x, y, z))))
|
||||||
}
|
}
|
||||||
map.put("max_health") { _ -> DoubleValue(entity.maxHealth) }
|
|
||||||
map.put("name") { _ -> StringValue(entity.effectiveName().string) }
|
map.put("name") { _ -> StringValue(entity.effectiveName().string) }
|
||||||
map.put("type") { _ ->
|
map.put("type") { _ ->
|
||||||
entity.registryAccess().registry(Registries.ENTITY_TYPE).get().getKey(entity.type)?.toString()?.let {
|
entity.registryAccess().registry(Registries.ENTITY_TYPE).get().getKey(entity.type)?.toString()?.let {
|
||||||
@@ -487,11 +506,6 @@ object MoLangFunctions {
|
|||||||
map.put("world") { _ -> entity.level().worldRegistry.wrapAsHolder(entity.level()).asWorldMoLangValue() }
|
map.put("world") { _ -> entity.level().worldRegistry.wrapAsHolder(entity.level()).asWorldMoLangValue() }
|
||||||
map.put("biome") { _ -> entity.level().getBiome(entity.blockPosition()).asBiomeMoLangValue() }
|
map.put("biome") { _ -> entity.level().getBiome(entity.blockPosition()).asBiomeMoLangValue() }
|
||||||
map.put("is_passenger") { DoubleValue(entity.isPassenger) }
|
map.put("is_passenger") { DoubleValue(entity.isPassenger) }
|
||||||
map.put("is_healer_in_use") { params ->
|
|
||||||
val pos = params.get<ArrayStruct>(0).asBlockPos()
|
|
||||||
val healer = entity.level().getBlockEntity(pos, CobblemonBlockEntities.HEALING_MACHINE).orElse(null) ?: return@put DoubleValue.ONE
|
|
||||||
return@put DoubleValue(healer.isInUse)
|
|
||||||
}
|
|
||||||
map.put("find_nearby_block") { params ->
|
map.put("find_nearby_block") { params ->
|
||||||
val type = params.getString(0).asIdentifierDefaultingNamespace(namespace = "minecraft")
|
val type = params.getString(0).asIdentifierDefaultingNamespace(namespace = "minecraft")
|
||||||
val isTag = type.path.startsWith("#")
|
val isTag = type.path.startsWith("#")
|
||||||
@@ -510,7 +524,7 @@ object MoLangFunctions {
|
|||||||
val distance = params.getDouble(0)
|
val distance = params.getDouble(0)
|
||||||
val entities = entity.level().getEntities(entity, AABB.ofSize(entity.position(), distance, distance, distance))
|
val entities = entity.level().getEntities(entity, AABB.ofSize(entity.position(), distance, distance, distance))
|
||||||
return@put entities
|
return@put entities
|
||||||
.filterIsInstance<LivingEntity>()
|
.filterIsInstance<Entity>()
|
||||||
.map { it.asMostSpecificMoLangValue() }
|
.map { it.asMostSpecificMoLangValue() }
|
||||||
.asArrayValue()
|
.asArrayValue()
|
||||||
}
|
}
|
||||||
@@ -567,6 +581,45 @@ object MoLangFunctions {
|
|||||||
packet.sendToPlayer(player)
|
packet.sendToPlayer(player)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return@mutableListOf map
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
val livingEntityFunctions: MutableList<(LivingEntity) -> HashMap<String, java.util.function.Function<MoParams, Any>>> = mutableListOf<(LivingEntity) -> HashMap<String, java.util.function.Function<MoParams, Any>>>(
|
||||||
|
{ entity ->
|
||||||
|
val map = hashMapOf<String, java.util.function.Function<MoParams, Any>>()
|
||||||
|
map.put("is_living_entity") { DoubleValue.ONE }
|
||||||
|
map.put("is_flying") { _ -> DoubleValue(entity.isFallFlying) }
|
||||||
|
map.put("is_sleeping") { _ -> DoubleValue(entity.isSleeping) }
|
||||||
|
map.put("health") { _ -> DoubleValue(entity.health) }
|
||||||
|
map.put("max_health") { _ -> DoubleValue(entity.maxHealth) }
|
||||||
|
|
||||||
|
if (entity is PathfinderMob) {
|
||||||
|
map.put("walk_to") { params ->
|
||||||
|
val x = params.getDouble(0)
|
||||||
|
val y = params.getDouble(1)
|
||||||
|
val z = params.getDouble(2)
|
||||||
|
val speedMultiplier = params.getDoubleOrNull(3) ?: 0.35
|
||||||
|
|
||||||
|
if (entity.brain.checkMemory(MemoryModuleType.WALK_TARGET, MemoryStatus.REGISTERED)) {
|
||||||
|
entity.brain.setMemory(
|
||||||
|
MemoryModuleType.WALK_TARGET,
|
||||||
|
WalkTarget(Vec3(x, y, z), speedMultiplier.toFloat(), 1)
|
||||||
|
)
|
||||||
|
entity.brain.setMemory(
|
||||||
|
MemoryModuleType.LOOK_TARGET,
|
||||||
|
BlockPosTracker(Vec3(x, y + entity.eyeHeight, z))
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
entity.navigation.moveTo(x, y, z, speedMultiplier)
|
||||||
|
entity.lookControl.setLookAt(Vec3(x, y + entity.eyeHeight, z))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
map.put("has_walk_target") { _ ->
|
||||||
|
DoubleValue(entity.brain.getMemory(MemoryModuleType.WALK_TARGET).isPresent || entity.isPathFinding)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
map
|
map
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -735,6 +788,7 @@ object MoLangFunctions {
|
|||||||
map.put("is_flying") { DoubleValue(pokemonEntity.getBehaviourFlag(PokemonBehaviourFlag.FLYING)) }
|
map.put("is_flying") { DoubleValue(pokemonEntity.getBehaviourFlag(PokemonBehaviourFlag.FLYING)) }
|
||||||
map.put("has_aspect") { DoubleValue(it.getString(0) in pokemonEntity.aspects) }
|
map.put("has_aspect") { DoubleValue(it.getString(0) in pokemonEntity.aspects) }
|
||||||
map.put("is_pokemon") { DoubleValue.ONE }
|
map.put("is_pokemon") { DoubleValue.ONE }
|
||||||
|
map.put("is_holding_item") { DoubleValue(!pokemonEntity.entityData.get(PokemonEntity.SHOWN_HELD_ITEM).isEmpty) }
|
||||||
map
|
map
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -742,6 +796,7 @@ object MoLangFunctions {
|
|||||||
val pokemonStoreFunctions = mutableListOf<(PokemonStore<*>) -> HashMap<String, java.util.function.Function<MoParams, Any>>>(
|
val pokemonStoreFunctions = mutableListOf<(PokemonStore<*>) -> HashMap<String, java.util.function.Function<MoParams, Any>>>(
|
||||||
{ store ->
|
{ store ->
|
||||||
val map = hashMapOf<String, java.util.function.Function<MoParams, Any>>()
|
val map = hashMapOf<String, java.util.function.Function<MoParams, Any>>()
|
||||||
|
map.put("uuid") { StringValue(store.uuid.toString()) }
|
||||||
map.put("add") { params ->
|
map.put("add") { params ->
|
||||||
val pokemon = params.get<ObjectValue<Pokemon>>(0)
|
val pokemon = params.get<ObjectValue<Pokemon>>(0)
|
||||||
return@put DoubleValue(store.add(pokemon.obj))
|
return@put DoubleValue(store.add(pokemon.obj))
|
||||||
@@ -842,6 +897,17 @@ object MoLangFunctions {
|
|||||||
return@put DoubleValue.ONE
|
return@put DoubleValue.ONE
|
||||||
}
|
}
|
||||||
map.put("get_box_count") { _ -> DoubleValue(pc.boxes.size.toDouble()) }
|
map.put("get_box_count") { _ -> DoubleValue(pc.boxes.size.toDouble()) }
|
||||||
|
map.put("has_unlocked_wallpaper") { params ->
|
||||||
|
val wallpaper = params.getString(0).asIdentifierDefaultingNamespace()
|
||||||
|
return@put DoubleValue(pc.unlockedWallpapers.contains(wallpaper))
|
||||||
|
}
|
||||||
|
map.put("get_unlocked_wallpapers") { pc.unlockedWallpapers.asArrayValue { StringValue(it.toString()) } }
|
||||||
|
map.put("unlock_wallpaper") {
|
||||||
|
val wallpaper = it.getString(0).asIdentifierDefaultingNamespace()
|
||||||
|
val playSound = it.getBooleanOrNull(1) != false
|
||||||
|
CobblemonUnlockableWallpapers.unlockableWallpapers[wallpaper] ?: return@put DoubleValue.ZERO
|
||||||
|
return@put DoubleValue(pc.unlockWallpaper(wallpaper, playSound))
|
||||||
|
}
|
||||||
return@mutableListOf map
|
return@mutableListOf map
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -850,7 +916,7 @@ object MoLangFunctions {
|
|||||||
{ spawningContext ->
|
{ spawningContext ->
|
||||||
val map = hashMapOf<String, java.util.function.Function<MoParams, Any>>()
|
val map = hashMapOf<String, java.util.function.Function<MoParams, Any>>()
|
||||||
val worldValue = spawningContext.world.registryAccess().registryOrThrow(Registries.DIMENSION).wrapAsHolder(spawningContext.world).asWorldMoLangValue()
|
val worldValue = spawningContext.world.registryAccess().registryOrThrow(Registries.DIMENSION).wrapAsHolder(spawningContext.world).asWorldMoLangValue()
|
||||||
val biomeValue = spawningContext.biomeRegistry.wrapAsHolder(spawningContext.biome).asBiomeMoLangValue()
|
val biomeValue = spawningContext.biomeHolder.asBiomeMoLangValue()
|
||||||
map.put("biome") { _ -> biomeValue }
|
map.put("biome") { _ -> biomeValue }
|
||||||
map.put("world") { _ -> worldValue }
|
map.put("world") { _ -> worldValue }
|
||||||
map.put("light") { _ -> DoubleValue(spawningContext.light.toDouble()) }
|
map.put("light") { _ -> DoubleValue(spawningContext.light.toDouble()) }
|
||||||
@@ -1002,18 +1068,111 @@ object MoLangFunctions {
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
val pokemonPropertiesFunctions: MutableList<(PokemonProperties) -> HashMap<String, java.util.function.Function<MoParams, Any>>> = mutableListOf(
|
||||||
|
{ props ->
|
||||||
|
val map = hashMapOf<String, java.util.function.Function<MoParams, Any>>()
|
||||||
|
|
||||||
|
map.put("level") { DoubleValue(props.level?.toDouble() ?: 0) }
|
||||||
|
map.put("set_level") { params ->
|
||||||
|
props.level = params.getIntOrNull(0)
|
||||||
|
return@put DoubleValue.ONE
|
||||||
|
}
|
||||||
|
map.put("shiny") { DoubleValue(props.shiny) }
|
||||||
|
map.put("set_shiny") { params ->
|
||||||
|
props.shiny = params.getBooleanOrNull(0)
|
||||||
|
return@put DoubleValue.ONE
|
||||||
|
}
|
||||||
|
map.put("species") { props.species?.let { StringValue(it) } ?: DoubleValue.ZERO }
|
||||||
|
map.put("set_species") { params ->
|
||||||
|
props.species = params.getStringOrNull(0)
|
||||||
|
return@put DoubleValue.ONE
|
||||||
|
}
|
||||||
|
map.put("gender") { props.gender?.let { StringValue(it.name) } ?: DoubleValue.ZERO }
|
||||||
|
map.put("set_gender") { params ->
|
||||||
|
props.gender = params.getStringOrNull(0)?.let { Gender.valueOf(it) }
|
||||||
|
return@put DoubleValue.ONE
|
||||||
|
}
|
||||||
|
map.put("form") { props.form?.let { StringValue(it) } ?: DoubleValue.ZERO }
|
||||||
|
map.put("ivs") {
|
||||||
|
val ivs = props.ivs
|
||||||
|
if (ivs == null) {
|
||||||
|
return@put DoubleValue.ZERO
|
||||||
|
} else {
|
||||||
|
return@put ivs.struct
|
||||||
|
}
|
||||||
|
}
|
||||||
|
map.put("evs") {
|
||||||
|
val evs = props.evs
|
||||||
|
if (evs == null) {
|
||||||
|
return@put DoubleValue.ZERO
|
||||||
|
} else {
|
||||||
|
return@put evs.struct
|
||||||
|
}
|
||||||
|
}
|
||||||
|
map.put("friendship") { DoubleValue(props.friendship?.toDouble() ?: DoubleValue.ZERO) }
|
||||||
|
map.put("set_friendship") { params ->
|
||||||
|
props.friendship = params.getIntOrNull(0)
|
||||||
|
return@put DoubleValue.ONE
|
||||||
|
}
|
||||||
|
map.put("create") { params ->
|
||||||
|
val pokemon = props.create()
|
||||||
|
return@put pokemon.struct
|
||||||
|
}
|
||||||
|
|
||||||
|
map
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
val evolutionFunctions: MutableList<(Evolution) -> HashMap<String, java.util.function.Function<MoParams, Any>>> = mutableListOf(
|
||||||
|
{ evolution ->
|
||||||
|
val map = hashMapOf<String, java.util.function.Function<MoParams, Any>>()
|
||||||
|
|
||||||
|
map.put("result") { evolution.result.asMoLangValue() }
|
||||||
|
|
||||||
|
if (evolution is LevelUpEvolution) {
|
||||||
|
map.put("is_level_up") { DoubleValue.ONE }
|
||||||
|
} else if (evolution is TradeEvolution) {
|
||||||
|
map.put("is_trade") { DoubleValue.ONE }
|
||||||
|
} else if (evolution is ItemInteractionEvolution) {
|
||||||
|
map.put("is_item") { DoubleValue.ONE }
|
||||||
|
}
|
||||||
|
|
||||||
|
map.put("is_optional") { DoubleValue(evolution.optional) }
|
||||||
|
map.put("consumes_held_item") { DoubleValue(evolution.consumeHeldItem) }
|
||||||
|
|
||||||
|
map
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
fun ItemStack.asMoLangValue(registryAccess: RegistryAccess) = ObjectValue(this).addStandardFunctions().addFunctions(itemStackFunctions.flatMap { it(this, registryAccess).entries.map { it.key to it.value } }.toMap())
|
||||||
fun Holder<Biome>.asBiomeMoLangValue() = asMoLangValue(Registries.BIOME).addFunctions(biomeFunctions.flatMap { it(this).entries.map { it.key to it.value } }.toMap())
|
fun Holder<Biome>.asBiomeMoLangValue() = asMoLangValue(Registries.BIOME).addFunctions(biomeFunctions.flatMap { it(this).entries.map { it.key to it.value } }.toMap())
|
||||||
fun Holder<Level>.asWorldMoLangValue() = asMoLangValue(Registries.DIMENSION).addFunctions(worldFunctions.flatMap { it(this).entries.map { it.key to it.value } }.toMap())
|
fun Holder<Level>.asWorldMoLangValue() = asMoLangValue(Registries.DIMENSION).addFunctions(worldFunctions.flatMap { it(this).entries.map { it.key to it.value } }.toMap())
|
||||||
fun Holder<Block>.asBlockMoLangValue() = asMoLangValue(Registries.BLOCK).addFunctions(blockFunctions.flatMap { it(this).entries.map { it.key to it.value } }.toMap())
|
fun Holder<Block>.asBlockMoLangValue() = asMoLangValue(Registries.BLOCK).addFunctions(blockFunctions.flatMap { it(this).entries.map { it.key to it.value } }.toMap())
|
||||||
fun MinecraftServer.asMoLangValue() = ObjectValue(this).addStandardFunctions().addFunctions(serverFunctions.flatMap { it(this).entries.map { it.key to it.value } }.toMap())
|
fun MinecraftServer.asMoLangValue() = ObjectValue(this).addStandardFunctions().addFunctions(serverFunctions.flatMap { it(this).entries.map { it.key to it.value } }.toMap())
|
||||||
fun Holder<DimensionType>.asDimensionTypeMoLangValue() = asMoLangValue(Registries.DIMENSION_TYPE).addFunctions(dimensionTypeFunctions.flatMap { it(this).entries.map { it.key to it.value } }.toMap())
|
fun Holder<DimensionType>.asDimensionTypeMoLangValue() = asMoLangValue(Registries.DIMENSION_TYPE).addFunctions(dimensionTypeFunctions.flatMap { it(this).entries.map { it.key to it.value } }.toMap())
|
||||||
fun Player.asMoLangValue(): ObjectValue<Player> {
|
fun Player.asMoLangValue(): ObjectValue<Player> {
|
||||||
|
if (this is ServerPlayer && uuid in Cobblemon.serverPlayerStructs) {
|
||||||
|
val existing = Cobblemon.serverPlayerStructs[uuid]!!
|
||||||
|
if (existing.obj == this) {
|
||||||
|
return existing
|
||||||
|
} else {
|
||||||
|
Cobblemon.serverPlayerStructs.remove(uuid)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
val value = ObjectValue(
|
val value = ObjectValue(
|
||||||
obj = this,
|
obj = this,
|
||||||
stringify = { it.effectiveName().string }
|
stringify = { it.effectiveName().string }
|
||||||
)
|
)
|
||||||
|
|
||||||
value.addFunctions(entityFunctions.flatMap { it(this).entries.map { it.key to it.value } }.toMap())
|
value.addFunctions(entityFunctions.flatMap { it(this).entries.map { it.key to it.value } }.toMap())
|
||||||
|
value.addFunctions(livingEntityFunctions.flatMap { it(this).entries.map { it.key to it.value } }.toMap())
|
||||||
value.addFunctions(playerFunctions.flatMap { it(this).entries.map { it.key to it.value } }.toMap())
|
value.addFunctions(playerFunctions.flatMap { it(this).entries.map { it.key to it.value } }.toMap())
|
||||||
|
|
||||||
|
if (this is ServerPlayer) {
|
||||||
|
Cobblemon.serverPlayerStructs[uuid] = value
|
||||||
|
}
|
||||||
|
|
||||||
return value
|
return value
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1034,6 +1193,24 @@ object MoLangFunctions {
|
|||||||
return value
|
return value
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun PokemonProperties.asMoLangValue(): ObjectValue<PokemonProperties> {
|
||||||
|
val value = ObjectValue(
|
||||||
|
obj = this,
|
||||||
|
stringify = { it.asString() }
|
||||||
|
)
|
||||||
|
value.addFunctions(pokemonPropertiesFunctions.flatMap { it(this).entries.map { it.key to it.value } }.toMap())
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
|
||||||
|
fun Evolution.asMoLangValue(): ObjectValue<Evolution> {
|
||||||
|
val value = ObjectValue(
|
||||||
|
obj = this,
|
||||||
|
stringify = { it.toString() }
|
||||||
|
)
|
||||||
|
value.addFunctions(evolutionFunctions.flatMap { it(this).entries.map { it.key to it.value } }.toMap())
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
|
||||||
fun PCStore.asMoLangValue(): ObjectValue<PCStore> {
|
fun PCStore.asMoLangValue(): ObjectValue<PCStore> {
|
||||||
val value = ObjectValue(
|
val value = ObjectValue(
|
||||||
obj = this,
|
obj = this,
|
||||||
@@ -1050,6 +1227,7 @@ object MoLangFunctions {
|
|||||||
stringify = { it.name.string }
|
stringify = { it.name.string }
|
||||||
)
|
)
|
||||||
value.addFunctions(entityFunctions.flatMap { it(this).entries.map { it.key to it.value } }.toMap())
|
value.addFunctions(entityFunctions.flatMap { it(this).entries.map { it.key to it.value } }.toMap())
|
||||||
|
value.addFunctions(livingEntityFunctions.flatMap { it(this).entries.map { it.key to it.value } }.toMap())
|
||||||
value.addFunctions(npcFunctions.flatMap { it(this).entries.map { it.key to it.value } }.toMap())
|
value.addFunctions(npcFunctions.flatMap { it(this).entries.map { it.key to it.value } }.toMap())
|
||||||
return value
|
return value
|
||||||
}
|
}
|
||||||
@@ -1060,6 +1238,7 @@ object MoLangFunctions {
|
|||||||
stringify = { it.pokemon.uuid.toString() }
|
stringify = { it.pokemon.uuid.toString() }
|
||||||
)
|
)
|
||||||
value.addFunctions(entityFunctions.flatMap { it(this).entries.map { it.key to it.value } }.toMap())
|
value.addFunctions(entityFunctions.flatMap { it(this).entries.map { it.key to it.value } }.toMap())
|
||||||
|
value.addFunctions(livingEntityFunctions.flatMap { it(this).entries.map { it.key to it.value } }.toMap())
|
||||||
value.addFunctions(pokemonFunctions.flatMap { it(this.pokemon).entries.map { it.key to it.value } }.toMap()) // Convenience
|
value.addFunctions(pokemonFunctions.flatMap { it(this.pokemon).entries.map { it.key to it.value } }.toMap()) // Convenience
|
||||||
value.addFunctions(pokemonEntityFunctions.flatMap { it(this).entries.map { it.key to it.value } }.toMap())
|
value.addFunctions(pokemonEntityFunctions.flatMap { it(this).entries.map { it.key to it.value } }.toMap())
|
||||||
return value
|
return value
|
||||||
@@ -1095,12 +1274,18 @@ object MoLangFunctions {
|
|||||||
/**
|
/**
|
||||||
* Different functions exist depending on
|
* Different functions exist depending on
|
||||||
*/
|
*/
|
||||||
fun LivingEntity.asMostSpecificMoLangValue(): ObjectValue<out LivingEntity> {
|
fun Entity.asMostSpecificMoLangValue(): ObjectValue<out Entity> {
|
||||||
return when (this) {
|
return when (this) {
|
||||||
is Player -> asMoLangValue()
|
is Player -> asMoLangValue()
|
||||||
is PokemonEntity -> struct
|
is PokemonEntity -> struct
|
||||||
is NPCEntity -> struct
|
is NPCEntity -> struct
|
||||||
else -> ObjectValue(this).also { it.addStandardFunctions().addFunctions(entityFunctions.flatMap { it(this).entries.map { it.key to it.value } }.toMap()) }
|
else -> ObjectValue(this).also {
|
||||||
|
it.addStandardFunctions()
|
||||||
|
it.addFunctions(entityFunctions.flatMap { it(this).entries.map { it.key to it.value } }.toMap())
|
||||||
|
if (this is LivingEntity) {
|
||||||
|
it.addFunctions(livingEntityFunctions.flatMap { it(this).entries.map { it.key to it.value } }.toMap())
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1125,7 +1310,7 @@ object MoLangFunctions {
|
|||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
fun QueryStruct.addEntityFunctions(entity: LivingEntity): QueryStruct {
|
fun QueryStruct.addEntityFunctions(entity: Entity): QueryStruct {
|
||||||
val addedFunctions = entityFunctions
|
val addedFunctions = entityFunctions
|
||||||
.flatMap { it.invoke(entity).entries }
|
.flatMap { it.invoke(entity).entries }
|
||||||
.associate { it.key to it.value }
|
.associate { it.key to it.value }
|
||||||
@@ -1133,6 +1318,14 @@ object MoLangFunctions {
|
|||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun QueryStruct.addLivingEntityFunctions(entity: LivingEntity): QueryStruct {
|
||||||
|
val addedFunctions = livingEntityFunctions
|
||||||
|
.flatMap { it.invoke(entity).entries }
|
||||||
|
.associate { it.key to it.value }
|
||||||
|
functions.putAll(addedFunctions)
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
fun QueryStruct.addPokedexFunctions(pokedexManager: AbstractPokedexManager): QueryStruct {
|
fun QueryStruct.addPokedexFunctions(pokedexManager: AbstractPokedexManager): QueryStruct {
|
||||||
val addedFunctions = pokedexFunctions
|
val addedFunctions = pokedexFunctions
|
||||||
.flatMap { it.invoke(pokedexManager).entries }
|
.flatMap { it.invoke(pokedexManager).entries }
|
||||||
@@ -1170,6 +1363,24 @@ object MoLangFunctions {
|
|||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun moLangFunctionMap(
|
||||||
|
vararg functions: Pair<String, (MoParams) -> MoValue>
|
||||||
|
): Map<String, (MoParams) -> MoValue> {
|
||||||
|
return functions.toMap()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun queryStructOf(
|
||||||
|
vararg functions: Pair<String, (MoParams) -> MoValue>
|
||||||
|
): QueryStruct {
|
||||||
|
return QueryStruct(
|
||||||
|
hashMapOf<String, java.util.function.Function<MoParams, Any>>(
|
||||||
|
*functions.map { (name, func) ->
|
||||||
|
name to java.util.function.Function<MoParams, Any> { params -> func(params) }
|
||||||
|
}.toTypedArray()
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
fun MoLangRuntime.setup(): MoLangRuntime {
|
fun MoLangRuntime.setup(): MoLangRuntime {
|
||||||
environment.query.addStandardFunctions()
|
environment.query.addStandardFunctions()
|
||||||
return this
|
return this
|
||||||
|
|||||||
@@ -8,7 +8,6 @@
|
|||||||
|
|
||||||
package com.cobblemon.mod.common.api.moves
|
package com.cobblemon.mod.common.api.moves
|
||||||
|
|
||||||
import com.cobblemon.mod.common.api.reactive.SimpleObservable
|
|
||||||
import com.cobblemon.mod.common.net.IntSize
|
import com.cobblemon.mod.common.net.IntSize
|
||||||
import com.cobblemon.mod.common.util.DataKeys
|
import com.cobblemon.mod.common.util.DataKeys
|
||||||
import com.cobblemon.mod.common.util.readSizedInt
|
import com.cobblemon.mod.common.util.readSizedInt
|
||||||
@@ -24,7 +23,7 @@ import net.minecraft.nbt.ListTag
|
|||||||
import net.minecraft.network.RegistryFriendlyByteBuf
|
import net.minecraft.network.RegistryFriendlyByteBuf
|
||||||
|
|
||||||
class BenchedMoves : Iterable<BenchedMove> {
|
class BenchedMoves : Iterable<BenchedMove> {
|
||||||
val observable = SimpleObservable<BenchedMoves>()
|
var changeFunction: ((BenchedMoves) -> Unit) = {}
|
||||||
private var emit = true
|
private var emit = true
|
||||||
private val benchedMoves = mutableListOf<BenchedMove>()
|
private val benchedMoves = mutableListOf<BenchedMove>()
|
||||||
|
|
||||||
@@ -50,7 +49,7 @@ class BenchedMoves : Iterable<BenchedMove> {
|
|||||||
|
|
||||||
fun update() {
|
fun update() {
|
||||||
if (emit) {
|
if (emit) {
|
||||||
observable.emit(this)
|
changeFunction(this)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ package com.cobblemon.mod.common.api.moves
|
|||||||
|
|
||||||
import com.bedrockk.molang.runtime.struct.QueryStruct
|
import com.bedrockk.molang.runtime.struct.QueryStruct
|
||||||
import com.bedrockk.molang.runtime.value.DoubleValue
|
import com.bedrockk.molang.runtime.value.DoubleValue
|
||||||
import com.cobblemon.mod.common.api.reactive.SimpleObservable
|
|
||||||
import com.cobblemon.mod.common.net.IntSize
|
import com.cobblemon.mod.common.net.IntSize
|
||||||
import com.cobblemon.mod.common.util.DataKeys
|
import com.cobblemon.mod.common.util.DataKeys
|
||||||
import com.cobblemon.mod.common.util.readSizedInt
|
import com.cobblemon.mod.common.util.readSizedInt
|
||||||
@@ -24,7 +23,7 @@ import com.mojang.serialization.Codec
|
|||||||
import kotlin.math.min
|
import kotlin.math.min
|
||||||
|
|
||||||
class MoveSet : Iterable<Move> {
|
class MoveSet : Iterable<Move> {
|
||||||
val observable = SimpleObservable<MoveSet>()
|
var changeFunction: (MoveSet) -> Unit = {}
|
||||||
private var emit = true
|
private var emit = true
|
||||||
|
|
||||||
private val moves = arrayOfNulls<Move>(MOVE_COUNT)
|
private val moves = arrayOfNulls<Move>(MOVE_COUNT)
|
||||||
@@ -153,7 +152,7 @@ class MoveSet : Iterable<Move> {
|
|||||||
|
|
||||||
fun update() {
|
fun update() {
|
||||||
if (emit) {
|
if (emit) {
|
||||||
observable.emit(this)
|
changeFunction(this)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -166,7 +166,7 @@ open class MoveTemplate(
|
|||||||
// TODO: Handle Liquid Voice: need to know what moves have the sound flag
|
// TODO: Handle Liquid Voice: need to know what moves have the sound flag
|
||||||
// TODO: Handle weatherball, naturalgift, judgement, technoblast, terrainpulse, and terrablast
|
// TODO: Handle weatherball, naturalgift, judgement, technoblast, terrainpulse, and terrablast
|
||||||
if (this.elementalType == ElementalTypes.NORMAL) {
|
if (this.elementalType == ElementalTypes.NORMAL) {
|
||||||
if( this.damageCategory != DamageCategories.STATUS) {
|
if (this.damageCategory != DamageCategories.STATUS) {
|
||||||
return when (pokemon.ability.name) {
|
return when (pokemon.ability.name) {
|
||||||
"pixilate" -> ElementalTypes.FAIRY
|
"pixilate" -> ElementalTypes.FAIRY
|
||||||
"aerilate" -> ElementalTypes.FLYING
|
"aerilate" -> ElementalTypes.FLYING
|
||||||
|
|||||||
@@ -320,7 +320,7 @@ a single battle challenge and this is a dynamic party, there will also be a `q.p
|
|||||||
"pokemon": "weedle",
|
"pokemon": "weedle",
|
||||||
"weight": "10",
|
"weight": "10",
|
||||||
"selectableTimes": "2",
|
"selectableTimes": "2",
|
||||||
"levelVariation": "2"
|
"levelVariation": "2",
|
||||||
"npcLevels": "1-8"
|
"npcLevels": "1-8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
+35
-18
@@ -7,27 +7,31 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
package com.cobblemon.mod.common.api.npc.partyproviders
|
package com.cobblemon.mod.common.api.npc.partyproviders
|
||||||
|
|
||||||
import com.bedrockk.molang.Expression
|
import com.bedrockk.molang.Expression
|
||||||
import com.bedrockk.molang.runtime.MoLangRuntime
|
import com.bedrockk.molang.runtime.MoLangRuntime
|
||||||
import com.bedrockk.molang.runtime.value.DoubleValue
|
import com.bedrockk.molang.runtime.value.DoubleValue
|
||||||
|
import com.cobblemon.mod.common.Cobblemon.LOGGER
|
||||||
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asMoLangValue
|
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asMoLangValue
|
||||||
import com.cobblemon.mod.common.api.molang.MoLangFunctions.setup
|
import com.cobblemon.mod.common.api.molang.MoLangFunctions.setup
|
||||||
import com.cobblemon.mod.common.api.npc.NPCPartyProvider
|
import com.cobblemon.mod.common.api.npc.NPCPartyProvider
|
||||||
import com.cobblemon.mod.common.api.pokemon.PokemonProperties
|
import com.cobblemon.mod.common.api.pokemon.PokemonProperties
|
||||||
import com.cobblemon.mod.common.api.storage.party.NPCPartyStore
|
import com.cobblemon.mod.common.api.storage.party.NPCPartyStore
|
||||||
import com.cobblemon.mod.common.entity.npc.NPCEntity
|
import com.cobblemon.mod.common.entity.npc.NPCEntity
|
||||||
import com.cobblemon.mod.common.util.asArrayValue
|
import com.cobblemon.mod.common.util.*
|
||||||
import com.cobblemon.mod.common.util.asExpression
|
|
||||||
import com.cobblemon.mod.common.util.resolveFloat
|
|
||||||
import com.cobblemon.mod.common.util.resolveInt
|
|
||||||
import com.cobblemon.mod.common.util.weightedSelection
|
|
||||||
import com.cobblemon.mod.common.util.withQueryValue
|
|
||||||
import com.google.gson.JsonElement
|
import com.google.gson.JsonElement
|
||||||
import com.google.gson.JsonObject
|
import com.google.gson.JsonObject
|
||||||
import com.google.gson.JsonPrimitive
|
import com.google.gson.JsonPrimitive
|
||||||
import kotlin.random.Random
|
|
||||||
import net.minecraft.server.level.ServerPlayer
|
import net.minecraft.server.level.ServerPlayer
|
||||||
|
import kotlin.collections.List
|
||||||
|
import kotlin.collections.any
|
||||||
|
import kotlin.collections.filter
|
||||||
|
import kotlin.collections.first
|
||||||
|
import kotlin.collections.mutableListOf
|
||||||
|
import kotlin.collections.mutableMapOf
|
||||||
|
import kotlin.collections.randomOrNull
|
||||||
|
import kotlin.collections.set
|
||||||
|
import kotlin.collections.toMutableList
|
||||||
|
import kotlin.random.Random
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A provider of a party for battling the NPC. It generates a party using a more complex process
|
* A provider of a party for battling the NPC. It generates a party using a more complex process
|
||||||
@@ -60,9 +64,9 @@ class PoolPartyProvider : NPCPartyProvider {
|
|||||||
json as JsonObject
|
json as JsonObject
|
||||||
this.minPokemon = json.getAsJsonPrimitive("minPokemon").asString?.asExpression() ?: "1".asExpression()
|
this.minPokemon = json.getAsJsonPrimitive("minPokemon").asString?.asExpression() ?: "1".asExpression()
|
||||||
this.maxPokemon = json.getAsJsonPrimitive("maxPokemon").asString?.asExpression() ?: "6".asExpression()
|
this.maxPokemon = json.getAsJsonPrimitive("maxPokemon").asString?.asExpression() ?: "6".asExpression()
|
||||||
this.pool = json.getAsJsonArray("pool").map {
|
this.pool = json.getAsJsonArray("pool").mapNotNull {
|
||||||
if (it is JsonPrimitive) {
|
if (it is JsonPrimitive) {
|
||||||
return@map DynamicPokemon(
|
return@mapNotNull DynamicPokemon(
|
||||||
PokemonProperties.parse(it.asString),
|
PokemonProperties.parse(it.asString),
|
||||||
"0".asExpression(),
|
"0".asExpression(),
|
||||||
null,
|
null,
|
||||||
@@ -73,17 +77,26 @@ class PoolPartyProvider : NPCPartyProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
it as JsonObject
|
it as JsonObject
|
||||||
DynamicPokemon(
|
val properties = PokemonProperties.parse(it.get("pokemon").asString)
|
||||||
PokemonProperties.parse(it.get("pokemon").asString),
|
// Checks for errors on Pokémon name, if not a valid species ignores it to avoid random Pokémon in the Pool.
|
||||||
it.get("levelVariation")?.asString?.asExpression() ?: "0".asExpression(),
|
if (properties.species == null) {
|
||||||
it.get("level")?.asString?.asExpression(),
|
LOGGER.warn("Error making NPC pokemon pool. ${it.get("pokemon").asString.substringBefore(" ")} is not a valid species, ignoring")
|
||||||
it.get("npcLevels")?.asString?.split("-")?.let { it[0].toInt()..it[1].toInt() } ?: 1..100,
|
null
|
||||||
it.get("selectableTimes")?.asString?.asExpression() ?: "1".asExpression(),
|
}
|
||||||
it.get("weight")?.asString?.asExpression() ?: "1".asExpression()
|
else {
|
||||||
)
|
DynamicPokemon(
|
||||||
|
properties,
|
||||||
|
it.get("levelVariation")?.asString?.asExpression() ?: "0".asExpression(),
|
||||||
|
it.get("level")?.asString?.asExpression(),
|
||||||
|
it.get("npcLevels")?.asString?.split("-")?.let { it[0].toInt()..it[1].toInt() } ?: 1..100,
|
||||||
|
it.get("selectableTimes")?.asString?.asExpression() ?: "1".asExpression(),
|
||||||
|
it.get("weight")?.asString?.asExpression() ?: "1".asExpression()
|
||||||
|
)
|
||||||
|
}
|
||||||
}.toMutableList()
|
}.toMutableList()
|
||||||
isStatic = json.get("isStatic").asBoolean
|
isStatic = json.get("isStatic").asBoolean
|
||||||
json.get("useFixedRandom")?.asBoolean?.let { useFixedRandom = it }
|
json.get("useFixedRandom")?.asBoolean?.let { useFixedRandom = it }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class DynamicPokemon(
|
class DynamicPokemon(
|
||||||
@@ -137,6 +150,10 @@ class PoolPartyProvider : NPCPartyProvider {
|
|||||||
val instance = selected.pokemon.copy().also { it.level = it.level ?: dictatedLevel ?: randomLevel }.create()
|
val instance = selected.pokemon.copy().also { it.level = it.level ?: dictatedLevel ?: randomLevel }.create()
|
||||||
party.add(instance)
|
party.add(instance)
|
||||||
}
|
}
|
||||||
|
if (party.none()) {
|
||||||
|
LOGGER.error("${npc} has no Pokemon on Party")
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun provide(npc: NPCEntity, level: Int, players: List<ServerPlayer>): NPCPartyStore {
|
override fun provide(npc: NPCEntity, level: Int, players: List<ServerPlayer>): NPCPartyStore {
|
||||||
|
|||||||
+58
-11
@@ -8,81 +8,128 @@
|
|||||||
|
|
||||||
package com.cobblemon.mod.common.api.permission
|
package com.cobblemon.mod.common.api.permission
|
||||||
|
|
||||||
import com.cobblemon.mod.common.command.AbandonMultiTeam
|
|
||||||
|
|
||||||
object CobblemonPermissions {
|
object CobblemonPermissions {
|
||||||
|
|
||||||
private const val COMMAND_PREFIX = "command."
|
private const val COMMAND_PREFIX = "command."
|
||||||
private val permissions = arrayListOf<Permission>()
|
private val permissions = arrayListOf<Permission>()
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
val CHANGE_EYE_HEIGHT = this.create("${COMMAND_PREFIX}changeeyeheight", PermissionLevel.ALL_COMMANDS)
|
val CHANGE_EYE_HEIGHT = this.create("${COMMAND_PREFIX}changeeyeheight", PermissionLevel.ALL_COMMANDS)
|
||||||
|
@JvmStatic
|
||||||
val CHANGE_SCALE_AND_SIZE = this.create("${COMMAND_PREFIX}changescaleandsize", PermissionLevel.ALL_COMMANDS)
|
val CHANGE_SCALE_AND_SIZE = this.create("${COMMAND_PREFIX}changescaleandsize", PermissionLevel.ALL_COMMANDS)
|
||||||
|
@JvmStatic
|
||||||
val CHANGE_WALK_SPEED = this.create("${COMMAND_PREFIX}changewalkspeed", PermissionLevel.ALL_COMMANDS)
|
val CHANGE_WALK_SPEED = this.create("${COMMAND_PREFIX}changewalkspeed", PermissionLevel.ALL_COMMANDS)
|
||||||
|
@JvmStatic
|
||||||
|
val CHANGE_JOINT_SCALE = this.create("${COMMAND_PREFIX}changejointscale", PermissionLevel.ALL_COMMANDS)
|
||||||
|
@JvmStatic
|
||||||
val CHECKSPAWNS = this.create("${COMMAND_PREFIX}checkspawns", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
val CHECKSPAWNS = this.create("${COMMAND_PREFIX}checkspawns", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
||||||
|
@JvmStatic
|
||||||
val GET_NBT = this.create("${COMMAND_PREFIX}getnbt", PermissionLevel.ALL_COMMANDS)
|
val GET_NBT = this.create("${COMMAND_PREFIX}getnbt", PermissionLevel.ALL_COMMANDS)
|
||||||
|
|
||||||
private const val GIVE_POKEMON_BASE = "${COMMAND_PREFIX}givepokemon"
|
private const val GIVE_POKEMON_BASE = "${COMMAND_PREFIX}givepokemon"
|
||||||
|
@JvmStatic
|
||||||
val GIVE_POKEMON_SELF = this.create("${GIVE_POKEMON_BASE}.self", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
val GIVE_POKEMON_SELF = this.create("${GIVE_POKEMON_BASE}.self", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
||||||
|
@JvmStatic
|
||||||
val GIVE_POKEMON_OTHER = this.create("${GIVE_POKEMON_BASE}.other", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
val GIVE_POKEMON_OTHER = this.create("${GIVE_POKEMON_BASE}.other", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
||||||
|
|
||||||
private const val HEAL_POKEMON_BASE = "${COMMAND_PREFIX}healpokemon"
|
private const val HEAL_POKEMON_BASE = "${COMMAND_PREFIX}healpokemon"
|
||||||
|
@JvmStatic
|
||||||
val HEAL_POKEMON_SELF = this.create("$HEAL_POKEMON_BASE.self", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
val HEAL_POKEMON_SELF = this.create("$HEAL_POKEMON_BASE.self", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
||||||
|
@JvmStatic
|
||||||
val HEAL_POKEMON_OTHER = this.create("$HEAL_POKEMON_BASE.other", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
val HEAL_POKEMON_OTHER = this.create("$HEAL_POKEMON_BASE.other", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
||||||
|
|
||||||
|
|
||||||
private const val LEVEL_UP_BASE = "${COMMAND_PREFIX}levelup"
|
private const val LEVEL_UP_BASE = "${COMMAND_PREFIX}levelup"
|
||||||
|
@JvmStatic
|
||||||
val LEVEL_UP_SELF = this.create("$LEVEL_UP_BASE.self", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
val LEVEL_UP_SELF = this.create("$LEVEL_UP_BASE.self", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
||||||
|
@JvmStatic
|
||||||
val LEVEL_UP_OTHER = this.create("$LEVEL_UP_BASE.other", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
val LEVEL_UP_OTHER = this.create("$LEVEL_UP_BASE.other", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
val OPEN_STARTER_SCREEN = this.create("${COMMAND_PREFIX}openstarterscreen", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
val OPEN_STARTER_SCREEN = this.create("${COMMAND_PREFIX}openstarterscreen", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
||||||
|
@JvmStatic
|
||||||
val BEDROCK_PARTICLE = this.create("${COMMAND_PREFIX}bedrockparticle", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
val BEDROCK_PARTICLE = this.create("${COMMAND_PREFIX}bedrockparticle", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
||||||
|
@JvmStatic
|
||||||
val OPEN_DIALOGUE = this.create("${COMMAND_PREFIX}opendialogue", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
val OPEN_DIALOGUE = this.create("${COMMAND_PREFIX}opendialogue", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
||||||
|
@JvmStatic
|
||||||
|
val UNLOCK_PC_BOX_WALLPAPER = this.create("${COMMAND_PREFIX}unlockpcboxwallpaper", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
||||||
|
|
||||||
private const val POKEMON_EDIT_BASE = "${COMMAND_PREFIX}pokemonedit"
|
private const val POKEMON_EDIT_BASE = "${COMMAND_PREFIX}pokemonedit"
|
||||||
|
@JvmStatic
|
||||||
val POKEMON_EDIT_SELF = this.create("$POKEMON_EDIT_BASE.self", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
val POKEMON_EDIT_SELF = this.create("$POKEMON_EDIT_BASE.self", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
||||||
|
@JvmStatic
|
||||||
val POKEMON_EDIT_OTHER = this.create("$POKEMON_EDIT_BASE.other", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
val POKEMON_EDIT_OTHER = this.create("$POKEMON_EDIT_BASE.other", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
||||||
|
@JvmStatic
|
||||||
val SPAWN_ALL_POKEMON = this.create("${COMMAND_PREFIX}spawnallpokemon", PermissionLevel.ALL_COMMANDS)
|
val SPAWN_ALL_POKEMON = this.create("${COMMAND_PREFIX}spawnallpokemon", PermissionLevel.ALL_COMMANDS)
|
||||||
|
@JvmStatic
|
||||||
val GIVE_ALL_POKEMON = this.create("${COMMAND_PREFIX}giveallpokemon", PermissionLevel.ALL_COMMANDS)
|
val GIVE_ALL_POKEMON = this.create("${COMMAND_PREFIX}giveallpokemon", PermissionLevel.ALL_COMMANDS)
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
val SPAWN_POKEMON = this.create("${COMMAND_PREFIX}spawnpokemon", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
val SPAWN_POKEMON = this.create("${COMMAND_PREFIX}spawnpokemon", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
||||||
|
@JvmStatic
|
||||||
val SPAWN_NPC = this.create("${COMMAND_PREFIX}spawnnpc", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
val SPAWN_NPC = this.create("${COMMAND_PREFIX}spawnnpc", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
||||||
|
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
val STOP_BATTLE = this.create("${COMMAND_PREFIX}stopbattle", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
val STOP_BATTLE = this.create("${COMMAND_PREFIX}stopbattle", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
||||||
|
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
val TAKE_POKEMON = this.create("${COMMAND_PREFIX}takepokemon", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
val TAKE_POKEMON = this.create("${COMMAND_PREFIX}takepokemon", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
||||||
|
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
val TEACH = this.create("${COMMAND_PREFIX}teach.base", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
val TEACH = this.create("${COMMAND_PREFIX}teach.base", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
||||||
|
@JvmStatic
|
||||||
val TEACH_BYPASS_LEARNSET = this.create("${COMMAND_PREFIX}teach.bypass", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
val TEACH_BYPASS_LEARNSET = this.create("${COMMAND_PREFIX}teach.bypass", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
||||||
|
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
val FRIENDSHIP = this.create("${COMMAND_PREFIX}friendship", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
val FRIENDSHIP = this.create("${COMMAND_PREFIX}friendship", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
||||||
|
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
val HELD_ITEM = this.create("${COMMAND_PREFIX}helditem", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
val HELD_ITEM = this.create("${COMMAND_PREFIX}helditem", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
val PC = this.create("${COMMAND_PREFIX}pc", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
val PC = this.create("${COMMAND_PREFIX}pc", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
||||||
|
@JvmStatic
|
||||||
val POKEBOX = this.create("${COMMAND_PREFIX}pokebox", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
val POKEBOX = this.create("${COMMAND_PREFIX}pokebox", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
val RENAMEBOX = this.create("${COMMAND_PREFIX}renamebox", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
||||||
|
@JvmStatic
|
||||||
|
val CHANGE_WALLPAPER = this.create("${COMMAND_PREFIX}changewallpaper", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
||||||
|
@JvmStatic
|
||||||
val TEST_STORE = this.create("${COMMAND_PREFIX}teststore", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
val TEST_STORE = this.create("${COMMAND_PREFIX}teststore", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
||||||
|
@JvmStatic
|
||||||
val QUERY_LEARNSET = this.create("${COMMAND_PREFIX}querylearnset", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
val QUERY_LEARNSET = this.create("${COMMAND_PREFIX}querylearnset", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
||||||
|
@JvmStatic
|
||||||
val TEST_PC_SLOT = this.create("${COMMAND_PREFIX}testpcslot", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
val TEST_PC_SLOT = this.create("${COMMAND_PREFIX}testpcslot", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
||||||
|
@JvmStatic
|
||||||
val TEST_PARTY_SLOT = this.create("${COMMAND_PREFIX}testpartyslot", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
val TEST_PARTY_SLOT = this.create("${COMMAND_PREFIX}testpartyslot", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
||||||
|
@JvmStatic
|
||||||
val CLEAR_PARTY = this.create("${COMMAND_PREFIX}clearparty", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
val CLEAR_PARTY = this.create("${COMMAND_PREFIX}clearparty", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
||||||
|
@JvmStatic
|
||||||
val CLEAR_PC = this.create("${COMMAND_PREFIX}clearpc", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
val CLEAR_PC = this.create("${COMMAND_PREFIX}clearpc", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
||||||
|
@JvmStatic
|
||||||
val POKEDEX = this.create("${COMMAND_PREFIX}pokedex", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
val POKEDEX = this.create("${COMMAND_PREFIX}pokedex", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
val NPC_EDIT = this.create("${COMMAND_PREFIX}npcedit", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
val NPC_EDIT = this.create("${COMMAND_PREFIX}npcedit", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
||||||
|
@JvmStatic
|
||||||
val NPC_DELETE = this.create("${COMMAND_PREFIX}npcdelete", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
val NPC_DELETE = this.create("${COMMAND_PREFIX}npcdelete", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
||||||
|
@JvmStatic
|
||||||
val FREEZE_POKEMON = this.create("${COMMAND_PREFIX}freezepokemon", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
val FREEZE_POKEMON = this.create("${COMMAND_PREFIX}freezepokemon", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
||||||
|
@JvmStatic
|
||||||
val APPLY_PLAYER_TEXTURE = this.create("${COMMAND_PREFIX}applyplayertexture", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
val APPLY_PLAYER_TEXTURE = this.create("${COMMAND_PREFIX}applyplayertexture", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
||||||
|
@JvmStatic
|
||||||
val ABANDON_MULTITEAM = this.create("${COMMAND_PREFIX}abandonmultiteam", PermissionLevel.NONE)
|
val ABANDON_MULTITEAM = this.create("${COMMAND_PREFIX}abandonmultiteam", PermissionLevel.NONE)
|
||||||
|
@JvmStatic
|
||||||
val RUN_MOLANG_SCRIPT = this.create("${COMMAND_PREFIX}runmolangscript", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
val RUN_MOLANG_SCRIPT = this.create("${COMMAND_PREFIX}runmolangscript", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
||||||
|
@JvmStatic
|
||||||
|
val COBBLEMON_CONFIG_RELOAD = this.create("${COMMAND_PREFIX}cobblemonconfig.reload", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
||||||
|
|
||||||
|
val CALCULATE_SEAT_POSITIONS = this.create("${COMMAND_PREFIX}calculateseatpositions", PermissionLevel.CHEAT_COMMANDS_AND_COMMAND_BLOCKS)
|
||||||
|
|
||||||
fun all(): Iterable<Permission> = this.permissions
|
fun all(): Iterable<Permission> = this.permissions
|
||||||
|
|
||||||
|
|||||||
+53
@@ -0,0 +1,53 @@
|
|||||||
|
/*
|
||||||
|
* 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.pokeball.catching.calculators
|
||||||
|
|
||||||
|
import com.cobblemon.mod.common.api.pokeball.catching.CaptureContext
|
||||||
|
import com.cobblemon.mod.common.api.pokedex.PokedexEntryProgress
|
||||||
|
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||||
|
import com.cobblemon.mod.common.util.pokedex
|
||||||
|
import net.minecraft.server.level.ServerPlayer
|
||||||
|
import net.minecraft.world.entity.LivingEntity
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An influencer on capture results based on Pokedex data.
|
||||||
|
*/
|
||||||
|
interface PokedexStatusCaptureInfluencer {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attempts to influence the [context] of a capture.
|
||||||
|
*
|
||||||
|
* @param thrower The [LivingEntity] that threw the Pokeball
|
||||||
|
* @param target The [PokemonEntity] attempting to capture.
|
||||||
|
* @param context The calculated [CaptureContext].
|
||||||
|
* @return The final [CaptureContext].
|
||||||
|
*/
|
||||||
|
fun influence(thrower: LivingEntity, target: PokemonEntity, context: CaptureContext): CaptureContext {
|
||||||
|
if (!context.isSuccessfulCapture) {
|
||||||
|
return context
|
||||||
|
}
|
||||||
|
val player = thrower as? ServerPlayer ?: return context
|
||||||
|
val pokedex = player.pokedex()
|
||||||
|
val speciesId = target.pokemon.species.resourceIdentifier
|
||||||
|
val formName = target.pokemon.form.name
|
||||||
|
val hasCaughtStatus = pokedex.getOrCreateSpeciesRecord(speciesId)
|
||||||
|
.getOrCreateFormRecord(formName)
|
||||||
|
.knowledge == PokedexEntryProgress.CAUGHT
|
||||||
|
// In modern games when the catch is a success and the Pokémon has already been registered to the Pokédex
|
||||||
|
// the catch becomes a critical capture and only requires one shake
|
||||||
|
return if (hasCaughtStatus) {
|
||||||
|
CaptureContext(
|
||||||
|
numberOfShakes = 1,
|
||||||
|
isSuccessfulCapture = true,
|
||||||
|
isCriticalCapture = true
|
||||||
|
)
|
||||||
|
} else context
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -8,9 +8,6 @@
|
|||||||
|
|
||||||
package com.cobblemon.mod.common.api.pokemon
|
package com.cobblemon.mod.common.api.pokemon
|
||||||
|
|
||||||
import com.bedrockk.molang.runtime.struct.VariableStruct
|
|
||||||
import com.bedrockk.molang.runtime.value.DoubleValue
|
|
||||||
import com.bedrockk.molang.runtime.value.StringValue
|
|
||||||
import com.cobblemon.mod.common.Cobblemon
|
import com.cobblemon.mod.common.Cobblemon
|
||||||
import com.cobblemon.mod.common.api.abilities.Abilities
|
import com.cobblemon.mod.common.api.abilities.Abilities
|
||||||
import com.cobblemon.mod.common.api.abilities.Ability
|
import com.cobblemon.mod.common.api.abilities.Ability
|
||||||
@@ -725,8 +722,8 @@ open class PokemonProperties {
|
|||||||
nature = json.get(DataKeys.POKEMON_NATURE)?.asString
|
nature = json.get(DataKeys.POKEMON_NATURE)?.asString
|
||||||
ability = json.get(DataKeys.POKEMON_ABILITY)?.asString
|
ability = json.get(DataKeys.POKEMON_ABILITY)?.asString
|
||||||
status = json.get(DataKeys.POKEMON_STATUS_NAME)?.asString
|
status = json.get(DataKeys.POKEMON_STATUS_NAME)?.asString
|
||||||
ivs = json.getAsJsonObject(DataKeys.POKEMON_IVS)?.let { IVs().loadFromJSON(it) } as IVs
|
ivs = json.getAsJsonObject(DataKeys.POKEMON_IVS)?.let { IVs().loadFromJSON(it) } as? IVs
|
||||||
evs = json.getAsJsonObject(DataKeys.POKEMON_EVS)?.let { EVs().loadFromJSON(it) } as EVs
|
evs = json.getAsJsonObject(DataKeys.POKEMON_EVS)?.let { EVs().loadFromJSON(it) } as? EVs
|
||||||
type = json.get(DataKeys.ELEMENTAL_TYPE)?.asString
|
type = json.get(DataKeys.ELEMENTAL_TYPE)?.asString
|
||||||
teraType = json.get(DataKeys.POKEMON_TERA_TYPE)?.asString
|
teraType = json.get(DataKeys.POKEMON_TERA_TYPE)?.asString
|
||||||
dmaxLevel = json.get(DataKeys.POKEMON_DMAX_LEVEL)?.asInt
|
dmaxLevel = json.get(DataKeys.POKEMON_DMAX_LEVEL)?.asInt
|
||||||
@@ -775,17 +772,6 @@ open class PokemonProperties {
|
|||||||
return pieces.joinToString(separator)
|
return pieces.joinToString(separator)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun asStruct(): VariableStruct {
|
|
||||||
val struct = VariableStruct()
|
|
||||||
species?.let { struct.setDirectly("species", StringValue(it)) }
|
|
||||||
level?.let { struct.setDirectly("level", DoubleValue(it)) }
|
|
||||||
shiny?.let { struct.setDirectly("shiny", DoubleValue(it)) }
|
|
||||||
// add more of the optional properties to the struct as doubles or strings
|
|
||||||
gender?.let { struct.setDirectly("gender", StringValue(it.name)) }
|
|
||||||
friendship?.let { struct.setDirectly("friendship", DoubleValue(it)) }
|
|
||||||
return struct
|
|
||||||
}
|
|
||||||
|
|
||||||
fun updateAspects() {
|
fun updateAspects() {
|
||||||
val aspects = mutableSetOf<String>()
|
val aspects = mutableSetOf<String>()
|
||||||
AspectProvider.providers.forEach { aspects.addAll(it.provide(this)) }
|
AspectProvider.providers.forEach { aspects.addAll(it.provide(this)) }
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Cobblemon Contributors
|
||||||
|
*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.cobblemon.mod.common.api.pokemon
|
||||||
|
|
||||||
|
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||||
|
|
||||||
|
enum class PokemonSortMode(val comparator: Comparator<Pokemon?>, val reverseComparator: Comparator<Pokemon?>) {
|
||||||
|
NAME({ it?.getDisplayName()?.string }),
|
||||||
|
LEVEL({ it?.level }),
|
||||||
|
TYPE({ it?.primaryType?.name }),
|
||||||
|
POKEDEX_NUMBER({ it?.species?.nationalPokedexNumber }),
|
||||||
|
GENDER({ it?.gender });
|
||||||
|
|
||||||
|
constructor(mapper: (Pokemon?) -> Comparable<*>?) : this(compareBy({ it == null }, mapper),
|
||||||
|
compareBy<Pokemon?> { it == null }.thenComparing(compareBy(mapper).reversed()))
|
||||||
|
|
||||||
|
fun comparator(descending: Boolean) = if (descending) reverseComparator else comparator
|
||||||
|
}
|
||||||
@@ -8,6 +8,7 @@
|
|||||||
|
|
||||||
package com.cobblemon.mod.common.api.pokemon
|
package com.cobblemon.mod.common.api.pokemon
|
||||||
|
|
||||||
|
import com.bedrockk.molang.Expression
|
||||||
import com.cobblemon.mod.common.Cobblemon
|
import com.cobblemon.mod.common.Cobblemon
|
||||||
import com.cobblemon.mod.common.api.abilities.AbilityPool
|
import com.cobblemon.mod.common.api.abilities.AbilityPool
|
||||||
import com.cobblemon.mod.common.api.abilities.AbilityTemplate
|
import com.cobblemon.mod.common.api.abilities.AbilityTemplate
|
||||||
@@ -32,6 +33,8 @@ import com.cobblemon.mod.common.api.pokemon.moves.Learnset
|
|||||||
import com.cobblemon.mod.common.api.pokemon.stats.Stat
|
import com.cobblemon.mod.common.api.pokemon.stats.Stat
|
||||||
import com.cobblemon.mod.common.api.pokemon.stats.Stats
|
import com.cobblemon.mod.common.api.pokemon.stats.Stats
|
||||||
import com.cobblemon.mod.common.api.reactive.SimpleObservable
|
import com.cobblemon.mod.common.api.reactive.SimpleObservable
|
||||||
|
import com.cobblemon.mod.common.api.riding.controller.RideController
|
||||||
|
import com.cobblemon.mod.common.api.riding.stats.RidingStatDefinition
|
||||||
import com.cobblemon.mod.common.api.spawning.TimeRange
|
import com.cobblemon.mod.common.api.spawning.TimeRange
|
||||||
import com.cobblemon.mod.common.api.types.ElementalType
|
import com.cobblemon.mod.common.api.types.ElementalType
|
||||||
import com.cobblemon.mod.common.api.types.adapters.ElementalTypeAdapter
|
import com.cobblemon.mod.common.api.types.adapters.ElementalTypeAdapter
|
||||||
@@ -42,17 +45,19 @@ import com.cobblemon.mod.common.pokemon.SpeciesAdditions
|
|||||||
import com.cobblemon.mod.common.pokemon.evolution.adapters.CobblemonEvolutionAdapter
|
import com.cobblemon.mod.common.pokemon.evolution.adapters.CobblemonEvolutionAdapter
|
||||||
import com.cobblemon.mod.common.pokemon.evolution.adapters.CobblemonPreEvolutionAdapter
|
import com.cobblemon.mod.common.pokemon.evolution.adapters.CobblemonPreEvolutionAdapter
|
||||||
import com.cobblemon.mod.common.pokemon.evolution.adapters.CobblemonRequirementAdapter
|
import com.cobblemon.mod.common.pokemon.evolution.adapters.CobblemonRequirementAdapter
|
||||||
import com.cobblemon.mod.common.pokemon.evolution.adapters.NbtItemPredicateAdapter
|
import com.cobblemon.mod.common.pokemon.evolution.adapters.LegacyItemConditionWrapperAdapter
|
||||||
import com.cobblemon.mod.common.pokemon.evolution.predicate.NbtItemPredicate
|
|
||||||
import com.cobblemon.mod.common.pokemon.helditem.CobblemonHeldItemManager
|
import com.cobblemon.mod.common.pokemon.helditem.CobblemonHeldItemManager
|
||||||
import com.cobblemon.mod.common.util.adapters.*
|
import com.cobblemon.mod.common.util.adapters.*
|
||||||
|
import com.cobblemon.mod.common.util.adapters.RideControllerAdapter
|
||||||
import com.cobblemon.mod.common.util.cobblemonResource
|
import com.cobblemon.mod.common.util.cobblemonResource
|
||||||
import com.google.common.collect.HashBasedTable
|
import com.google.common.collect.HashBasedTable
|
||||||
import com.google.gson.Gson
|
import com.google.gson.Gson
|
||||||
import com.google.gson.GsonBuilder
|
import com.google.gson.GsonBuilder
|
||||||
import com.google.gson.reflect.TypeToken
|
import com.google.gson.reflect.TypeToken
|
||||||
|
import net.minecraft.advancements.critereon.ItemPredicate
|
||||||
import net.minecraft.core.registries.BuiltInRegistries
|
import net.minecraft.core.registries.BuiltInRegistries
|
||||||
import net.minecraft.nbt.CompoundTag
|
import net.minecraft.nbt.CompoundTag
|
||||||
|
import net.minecraft.network.chat.Component
|
||||||
import net.minecraft.resources.ResourceLocation
|
import net.minecraft.resources.ResourceLocation
|
||||||
import net.minecraft.server.level.ServerPlayer
|
import net.minecraft.server.level.ServerPlayer
|
||||||
import net.minecraft.server.packs.PackType
|
import net.minecraft.server.packs.PackType
|
||||||
@@ -93,13 +98,17 @@ object PokemonSpecies : JsonDataRegistry<Species> {
|
|||||||
.registerTypeAdapter(DropEntry::class.java, DropEntryAdapter)
|
.registerTypeAdapter(DropEntry::class.java, DropEntryAdapter)
|
||||||
.registerTypeAdapter(CompoundTag::class.java, NbtCompoundAdapter)
|
.registerTypeAdapter(CompoundTag::class.java, NbtCompoundAdapter)
|
||||||
.registerTypeAdapter(ExpressionLike::class.java, ExpressionLikeAdapter)
|
.registerTypeAdapter(ExpressionLike::class.java, ExpressionLikeAdapter)
|
||||||
|
.registerTypeAdapter(Component::class.java, TextAdapter)
|
||||||
.registerTypeAdapter(TypeToken.getParameterized(RegistryLikeCondition::class.java, Biome::class.java).type, BiomeLikeConditionAdapter)
|
.registerTypeAdapter(TypeToken.getParameterized(RegistryLikeCondition::class.java, Biome::class.java).type, BiomeLikeConditionAdapter)
|
||||||
.registerTypeAdapter(TypeToken.getParameterized(RegistryLikeCondition::class.java, Block::class.java).type, BlockLikeConditionAdapter)
|
.registerTypeAdapter(TypeToken.getParameterized(RegistryLikeCondition::class.java, Block::class.java).type, BlockLikeConditionAdapter)
|
||||||
.registerTypeAdapter(TypeToken.getParameterized(RegistryLikeCondition::class.java, Item::class.java).type, ItemLikeConditionAdapter)
|
.registerTypeAdapter(TypeToken.getParameterized(RegistryLikeCondition::class.java, Item::class.java).type, ItemLikeConditionAdapter)
|
||||||
.registerTypeAdapter(TypeToken.getParameterized(RegistryLikeCondition::class.java, Structure::class.java).type, StructureLikeConditionAdapter)
|
.registerTypeAdapter(TypeToken.getParameterized(RegistryLikeCondition::class.java, Structure::class.java).type, StructureLikeConditionAdapter)
|
||||||
.registerTypeAdapter(EggGroup::class.java, EggGroupAdapter)
|
.registerTypeAdapter(EggGroup::class.java, EggGroupAdapter)
|
||||||
.registerTypeAdapter(MobEffect::class.java, RegistryElementAdapter<MobEffect>(BuiltInRegistries::MOB_EFFECT))
|
.registerTypeAdapter(MobEffect::class.java, RegistryElementAdapter<MobEffect>(BuiltInRegistries::MOB_EFFECT))
|
||||||
.registerTypeAdapter(NbtItemPredicate::class.java, NbtItemPredicateAdapter)
|
.registerTypeAdapter(ItemPredicate::class.java, LegacyItemConditionWrapperAdapter)
|
||||||
|
.registerTypeAdapter(RideController::class.java, RideControllerAdapter)
|
||||||
|
.registerTypeAdapter(RidingStatDefinition::class.java, RidingStatDefinitionAdapter)
|
||||||
|
.registerTypeAdapter(Expression::class.java, ExpressionAdapter)
|
||||||
.disableHtmlEscaping()
|
.disableHtmlEscaping()
|
||||||
.enableComplexMapKeySerialization()
|
.enableComplexMapKeySerialization()
|
||||||
.create()
|
.create()
|
||||||
@@ -119,6 +128,11 @@ object PokemonSpecies : JsonDataRegistry<Species> {
|
|||||||
init {
|
init {
|
||||||
SpeciesAdditions.observable.subscribe {
|
SpeciesAdditions.observable.subscribe {
|
||||||
this.species.forEach(Species::initialize)
|
this.species.forEach(Species::initialize)
|
||||||
|
this.species.forEach {
|
||||||
|
if (it.implemented) {
|
||||||
|
this.implemented.add(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
this.species.forEach(Species::resolveEvolutionMoves)
|
this.species.forEach(Species::resolveEvolutionMoves)
|
||||||
Cobblemon.showdownThread.queue {
|
Cobblemon.showdownThread.queue {
|
||||||
it.registerSpecies()
|
it.registerSpecies()
|
||||||
@@ -197,9 +211,6 @@ object PokemonSpecies : JsonDataRegistry<Species> {
|
|||||||
this.speciesByDex.remove(old.resourceIdentifier.namespace, old.nationalPokedexNumber)
|
this.speciesByDex.remove(old.resourceIdentifier.namespace, old.nationalPokedexNumber)
|
||||||
}
|
}
|
||||||
this.speciesByDex.put(species.resourceIdentifier.namespace, species.nationalPokedexNumber, species)
|
this.speciesByDex.put(species.resourceIdentifier.namespace, species.nationalPokedexNumber, species)
|
||||||
if (species.implemented) {
|
|
||||||
this.implemented.add(species)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -105,6 +105,9 @@ interface Evolution : EvolutionLike {
|
|||||||
* @param pokemon The [Pokemon] being evolved.
|
* @param pokemon The [Pokemon] being evolved.
|
||||||
*/
|
*/
|
||||||
fun evolve(pokemon: Pokemon): Boolean {
|
fun evolve(pokemon: Pokemon): Boolean {
|
||||||
|
if (this.consumeHeldItem) {
|
||||||
|
pokemon.swapHeldItem(ItemStack.EMPTY)
|
||||||
|
}
|
||||||
if (this.optional) {
|
if (this.optional) {
|
||||||
// All the networking is handled under the hood, see EvolutionController.
|
// All the networking is handled under the hood, see EvolutionController.
|
||||||
return pokemon.evolutionProxy.server().add(this)
|
return pokemon.evolutionProxy.server().add(this)
|
||||||
@@ -173,7 +176,7 @@ interface Evolution : EvolutionLike {
|
|||||||
pokemonEntity.after(11.2F) {
|
pokemonEntity.after(11.2F) {
|
||||||
evolutionMethod(pokemon)
|
evolutionMethod(pokemon)
|
||||||
}
|
}
|
||||||
pokemonEntity.after( seconds = 12F ) {
|
pokemonEntity.after(seconds = 12F) {
|
||||||
cryAnimation(pokemonEntity)
|
cryAnimation(pokemonEntity)
|
||||||
pokemonEntity.entityData.set(PokemonEntity.EVOLUTION_STARTED, false)
|
pokemonEntity.entityData.set(PokemonEntity.EVOLUTION_STARTED, false)
|
||||||
pokemon.getOwnerPlayer()?.sendSystemMessage(lang("ui.evolve.into", preEvoName, pokemon.species.translatedName))
|
pokemon.getOwnerPlayer()?.sendSystemMessage(lang("ui.evolve.into", preEvoName, pokemon.species.translatedName))
|
||||||
@@ -220,10 +223,6 @@ interface Evolution : EvolutionLike {
|
|||||||
|
|
||||||
this.shed(pokemon)
|
this.shed(pokemon)
|
||||||
|
|
||||||
if (this.consumeHeldItem) {
|
|
||||||
pokemon.swapHeldItem(ItemStack.EMPTY)
|
|
||||||
}
|
|
||||||
|
|
||||||
val ownerPlayer = pokemon.getOwnerPlayer()
|
val ownerPlayer = pokemon.getOwnerPlayer()
|
||||||
if (ownerPlayer != null && ownerPlayer.level().gameRules.getBoolean(CobblemonGameRules.DO_POKEMON_LOOT)) {
|
if (ownerPlayer != null && ownerPlayer.level().gameRules.getBoolean(CobblemonGameRules.DO_POKEMON_LOOT)) {
|
||||||
drops.drop(
|
drops.drop(
|
||||||
|
|||||||
+2
-2
@@ -68,8 +68,8 @@ object SpeciesFeatures : JsonDataRegistry<SpeciesFeatureProvider<*>> {
|
|||||||
data.forEach(this::registerFromAssets)
|
data.forEach(this::registerFromAssets)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getCodeFeature(name: String) = resourceFeatures[name]
|
fun getCodeFeature(name: String) = codeFeatures[name]
|
||||||
fun getResourceFeature(name: String) = codeFeatures[name]
|
fun getResourceFeature(name: String) = resourceFeatures[name]
|
||||||
fun getFeature(name: String) = getCodeFeature(name) ?: getResourceFeature(name)
|
fun getFeature(name: String) = getCodeFeature(name) ?: getResourceFeature(name)
|
||||||
fun loadOnClient(entries: Collection<Map.Entry<String, SpeciesFeatureProvider<*>>>) {
|
fun loadOnClient(entries: Collection<Map.Entry<String, SpeciesFeatureProvider<*>>>) {
|
||||||
codeFeatures.putAll(entries.map { it.toPair() })
|
codeFeatures.putAll(entries.map { it.toPair() })
|
||||||
|
|||||||
@@ -0,0 +1,76 @@
|
|||||||
|
/*
|
||||||
|
* 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.pokemon.stats
|
||||||
|
|
||||||
|
import com.cobblemon.mod.common.api.battles.model.PokemonBattle
|
||||||
|
import com.cobblemon.mod.common.battles.pokemon.BattlePokemon
|
||||||
|
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||||
|
import net.minecraft.server.level.ServerPlayer
|
||||||
|
import net.minecraft.world.item.ItemStack
|
||||||
|
|
||||||
|
interface EvSource {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The [Pokemon] being affected.
|
||||||
|
*/
|
||||||
|
val pokemon: Pokemon
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Utility function that checks if the source is an implementation of [BattleEvSource].
|
||||||
|
*/
|
||||||
|
fun isBattle() = this is BattleEvSource
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Utility function that checks if the source is an implementation of [ItemEvSource].
|
||||||
|
*/
|
||||||
|
fun isInteraction() = this is ItemEvSource
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Utility function that checks if the source is an implementation of [SidemodEvSource].
|
||||||
|
*/
|
||||||
|
fun isSidemod() = this is SidemodEvSource
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Triggered by sidemods.
|
||||||
|
*
|
||||||
|
* @property sidemodId The mod ID of the sidemod triggering this source.
|
||||||
|
* @property pokemon See [EvSource.pokemon].
|
||||||
|
*/
|
||||||
|
open class SidemodEvSource(
|
||||||
|
val sidemodId: String,
|
||||||
|
override val pokemon: Pokemon
|
||||||
|
) : EvSource
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An Ev source fired when using Ev mutating items.
|
||||||
|
*
|
||||||
|
* @property player The [ServerPlayer] using the item.
|
||||||
|
* @property stack The [ItemStack] being consumed.
|
||||||
|
* @property pokemon See [EvSource.pokemon].
|
||||||
|
*/
|
||||||
|
open class ItemEvSource(
|
||||||
|
val player: ServerPlayer,
|
||||||
|
val stack: ItemStack,
|
||||||
|
override val pokemon: Pokemon
|
||||||
|
) : EvSource
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An Ev source fired in battles.
|
||||||
|
*
|
||||||
|
* @property battle The associated [PokemonBattle].
|
||||||
|
* @property facedPokemon The [BattlePokemon]s that the [pokemon] faced.
|
||||||
|
* @property pokemon See [EvSource.pokemon], comes from the original [BattlePokemon.effectedPokemon].
|
||||||
|
*/
|
||||||
|
open class BattleEvSource(
|
||||||
|
val battle: PokemonBattle,
|
||||||
|
val facedPokemon: List<BattlePokemon>,
|
||||||
|
override val pokemon: Pokemon
|
||||||
|
) : EvSource
|
||||||
@@ -45,4 +45,15 @@ open class CancelableObservable<T : Cancelable> : EventObservable<T>() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline fun postThenFinally(event: T, ifCanceled: (T) -> Unit = {}, finally: (T) -> Unit = {},ifSucceeded: (T) -> Unit) {
|
||||||
|
post(event) {
|
||||||
|
if (it.isCanceled) {
|
||||||
|
ifCanceled(it)
|
||||||
|
} else {
|
||||||
|
ifSucceeded(it)
|
||||||
|
}
|
||||||
|
finally(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
/*
|
||||||
|
* 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.riding
|
||||||
|
|
||||||
|
import net.minecraft.world.entity.PlayerRideableJumping
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents an entity that supports riding.
|
||||||
|
*
|
||||||
|
* @since 1.7.0
|
||||||
|
*/
|
||||||
|
interface Rideable : PlayerRideableJumping {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Denotes the manager responsible for handling any instance of riding taking place on an entity
|
||||||
|
*/
|
||||||
|
val riding: RidingManager
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,215 @@
|
|||||||
|
/*
|
||||||
|
* 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.riding
|
||||||
|
|
||||||
|
import com.bedrockk.molang.runtime.MoLangRuntime
|
||||||
|
import com.bedrockk.molang.runtime.value.DoubleValue
|
||||||
|
import com.cobblemon.mod.common.Rollable
|
||||||
|
import com.cobblemon.mod.common.api.molang.MoLangFunctions.setup
|
||||||
|
import com.cobblemon.mod.common.api.riding.controller.RideController
|
||||||
|
import com.cobblemon.mod.common.api.riding.stats.RidingStat
|
||||||
|
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||||
|
import com.cobblemon.mod.common.util.toProperties
|
||||||
|
import com.cobblemon.mod.common.util.withQueryValue
|
||||||
|
import net.minecraft.ChatFormatting
|
||||||
|
import net.minecraft.network.chat.Component
|
||||||
|
import net.minecraft.resources.ResourceLocation
|
||||||
|
import net.minecraft.util.SmoothDouble
|
||||||
|
import net.minecraft.world.entity.LivingEntity
|
||||||
|
import net.minecraft.world.entity.player.Player
|
||||||
|
import net.minecraft.world.phys.Vec2
|
||||||
|
import net.minecraft.world.phys.Vec3
|
||||||
|
import kotlin.math.sin
|
||||||
|
import kotlin.math.sin
|
||||||
|
|
||||||
|
data class RidingManager(val entity: PokemonEntity) {
|
||||||
|
var lastSpeed = 0F
|
||||||
|
var states: MutableMap<ResourceLocation, RidingState> = mutableMapOf()
|
||||||
|
var deltaRotation = Vec2.ZERO
|
||||||
|
|
||||||
|
val runtime: MoLangRuntime by lazy {
|
||||||
|
MoLangRuntime()
|
||||||
|
.setup()
|
||||||
|
.withQueryValue("entity", entity.struct)
|
||||||
|
.also {
|
||||||
|
it.environment.query.addFunction("passenger_count") { DoubleValue(entity.passengers.size.toDouble()) }
|
||||||
|
it.environment.query.addFunction("get_ride_stats") { params ->
|
||||||
|
val rideStat = RidingStat.valueOf(params.getString(0).uppercase())
|
||||||
|
val rideStyle = RidingStyle.valueOf(params.getString(1).uppercase())
|
||||||
|
val maxVal = params.getDouble(2)
|
||||||
|
val minVal = params.getDouble(3)
|
||||||
|
//TODO: Use the mons actual boost once implemented
|
||||||
|
val normalizedStat = entity.rideProp.calculate(rideStat, rideStyle, 0) / 100.0f
|
||||||
|
val trueStatVal = (normalizedStat * (maxVal - minVal)) + minVal
|
||||||
|
|
||||||
|
DoubleValue(trueStatVal)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun <T : RidingState> getState(id: ResourceLocation, constructor: (PokemonEntity) -> T): T {
|
||||||
|
val storedState = states[id]
|
||||||
|
if (storedState == null) {
|
||||||
|
val newState = constructor(entity)
|
||||||
|
states[id] = newState
|
||||||
|
return newState
|
||||||
|
}
|
||||||
|
|
||||||
|
return storedState as T
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getController(entity: PokemonEntity): RideController? {
|
||||||
|
return entity.pokemon.riding.controller?.takeIf { it.condition.invoke(entity) }
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Responsible for handling riding conditions and transitions amongst controllers. This will tick
|
||||||
|
* whenever the entity receives a tickControlled interaction.
|
||||||
|
*/
|
||||||
|
fun tick(entity: PokemonEntity, driver: Player, input: Vec3) {
|
||||||
|
val controller = getController(entity) ?: return
|
||||||
|
|
||||||
|
val pose = controller.pose(entity)
|
||||||
|
entity.entityData.set(PokemonEntity.POSE_TYPE, pose)
|
||||||
|
//val speedPlayer = driver.deltaMovement.horizontalDistance()
|
||||||
|
//driver.displayClientMessage(Component.literal("Speed player: ").withStyle { it.withColor(ChatFormatting.GREEN) }.append(Component.literal("$speedPlayer b/t")), true)
|
||||||
|
//val speedEntity = entity.deltaMovement.length() //* 20 * 60 * 60) / ( 1000 )
|
||||||
|
//println(speedEntity)
|
||||||
|
//driver.displayClientMessage(Component.literal("Speed: ").withStyle { it.withColor(ChatFormatting.GREEN) }.append(Component.literal("${String.format("%.2f", speedEntity)} km/h")), true)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
fun speed(entity: PokemonEntity, driver: Player): Float {
|
||||||
|
val controller = getController(entity) ?: return 0.05F
|
||||||
|
this.lastSpeed = controller.speed(entity, driver)
|
||||||
|
return this.lastSpeed
|
||||||
|
}
|
||||||
|
|
||||||
|
fun controlledRotation(entity: PokemonEntity, driver: Player): Vec2 {
|
||||||
|
val controller = getController(entity) ?: return entity.rotationVector
|
||||||
|
val previousRotation = entity.rotationVector
|
||||||
|
val rotation = controller.rotation(entity, driver)
|
||||||
|
this.deltaRotation = Vec2(rotation.x - previousRotation.x, rotation.y - previousRotation.y)
|
||||||
|
return rotation
|
||||||
|
}
|
||||||
|
|
||||||
|
fun clampPassengerRotation(entity: PokemonEntity, driver: LivingEntity) {
|
||||||
|
val controller = getController(entity) ?: return
|
||||||
|
return controller.clampPassengerRotation(entity, driver)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun updatePassengerRotation(entity: PokemonEntity, driver: LivingEntity) {
|
||||||
|
val controller = getController(entity) ?: return
|
||||||
|
return controller.updatePassengerRotation(entity, driver)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun velocity(entity: PokemonEntity, driver: Player, input: Vec3): Vec3 {
|
||||||
|
val controller = getController(entity) ?: return Vec3.ZERO
|
||||||
|
return controller.velocity(entity, driver, input)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setRideBar(entity: PokemonEntity, driver: Player): Float {
|
||||||
|
val controller = getController(entity) ?: return 0.0f
|
||||||
|
return controller.setRideBar(entity, driver)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun rideFovMult(entity: PokemonEntity, driver: Player): Float {
|
||||||
|
val controller = getController(entity) ?: return 1.0f
|
||||||
|
return controller.rideFovMult(entity, driver)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun canJump(entity: PokemonEntity, driver: Player): Boolean {
|
||||||
|
val controller = getController(entity) ?: return false
|
||||||
|
return controller.canJump(entity, driver)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun jumpVelocity(entity: PokemonEntity, driver: Player, jumpStrength: Int): Vec3 {
|
||||||
|
val controller = getController(entity) ?: return Vec3.ZERO
|
||||||
|
return controller.jumpForce(entity, driver, jumpStrength)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to supply the delta for the lerp() between velocity
|
||||||
|
* vectors. Called inertia for now as the way it feels when
|
||||||
|
* affecting the ride is somewhat akin to inertia.
|
||||||
|
*/
|
||||||
|
fun inertia(entity: PokemonEntity): Double {
|
||||||
|
val controller = getController(entity) ?: return 0.5
|
||||||
|
return controller.inertia(entity)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun gravity(entity: PokemonEntity, regularGravity: Double): Double? {
|
||||||
|
val controller = getController(entity) ?: return null
|
||||||
|
return controller.gravity(entity, regularGravity)
|
||||||
|
}
|
||||||
|
|
||||||
|
//Maybe should be changed to be a function that conveys:
|
||||||
|
// "turn on use our camera system function"
|
||||||
|
fun shouldRoll(entity: PokemonEntity): Boolean {
|
||||||
|
val controller = getController(entity) ?: return false
|
||||||
|
return controller.shouldRoll(entity)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun shouldRotatePlayerHead(entity: PokemonEntity): Boolean {
|
||||||
|
val controller = getController(entity) ?: return false
|
||||||
|
return controller.shouldRotatePlayerHead()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun shouldRotatePokemonHead(entity: PokemonEntity): Boolean {
|
||||||
|
val controller = getController(entity) ?: return false
|
||||||
|
return controller.shouldRotatePokemonHead()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun rotationOnMouseXY(
|
||||||
|
entity: PokemonEntity,
|
||||||
|
driver: Player,
|
||||||
|
yMouse: Double,
|
||||||
|
xMouse: Double,
|
||||||
|
yMouseSmoother: SmoothDouble,
|
||||||
|
xMouseSmoother: SmoothDouble,
|
||||||
|
sensitivity: Double,
|
||||||
|
deltaTime: Double
|
||||||
|
): Vec3 {
|
||||||
|
val controller = getController(entity) ?: return Vec3.ZERO
|
||||||
|
return controller.rotationOnMouseXY(
|
||||||
|
entity,
|
||||||
|
driver,
|
||||||
|
yMouse,
|
||||||
|
xMouse,
|
||||||
|
yMouseSmoother,
|
||||||
|
xMouseSmoother,
|
||||||
|
sensitivity,
|
||||||
|
deltaTime
|
||||||
|
) }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines whether mouse input will affect the rotation of
|
||||||
|
* the rollable object. Need to remove this as it's not used anymore
|
||||||
|
*/
|
||||||
|
//I think this might better serve as a "use smoothing on angular velocity"
|
||||||
|
fun useAngVelSmoothing(entity: PokemonEntity): Boolean {
|
||||||
|
val controller = getController(entity) ?: return true
|
||||||
|
return controller.useAngVelSmoothing(entity)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun turnOffOnGround(entity: PokemonEntity): Boolean {
|
||||||
|
val controller = getController(entity) ?: return false
|
||||||
|
return controller.turnOffOnGround(entity)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun angRollVel(entity: PokemonEntity, driver: Player, deltaTime: Double): Vec3 {
|
||||||
|
val controller = getController(entity) ?: return Vec3(0.0, 0.0, 0.0)
|
||||||
|
return controller.angRollVel(entity, driver, deltaTime)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun dismountOnShift(): Boolean {
|
||||||
|
val controller = getController(entity) ?: return false
|
||||||
|
return controller.dismountOnShift(entity)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
/*
|
||||||
|
* 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.riding
|
||||||
|
|
||||||
|
import com.bedrockk.molang.Expression
|
||||||
|
import com.cobblemon.mod.common.api.riding.controller.RideController
|
||||||
|
import com.cobblemon.mod.common.api.riding.stats.RidingStat
|
||||||
|
import com.cobblemon.mod.common.api.riding.stats.RidingStatDefinition
|
||||||
|
import com.cobblemon.mod.common.util.adapters.RideControllerAdapter
|
||||||
|
import com.cobblemon.mod.common.util.asExpression
|
||||||
|
import com.cobblemon.mod.common.util.getString
|
||||||
|
import com.cobblemon.mod.common.util.readIdentifier
|
||||||
|
import com.cobblemon.mod.common.util.readString
|
||||||
|
import com.cobblemon.mod.common.util.writeString
|
||||||
|
import net.minecraft.network.RegistryFriendlyByteBuf
|
||||||
|
|
||||||
|
class RidingProperties(
|
||||||
|
val stats: Map<RidingStat, RidingStatDefinition> = mapOf(),
|
||||||
|
val seats: List<Seat> = listOf(),
|
||||||
|
val conditions: List<Expression> = listOf(),
|
||||||
|
val controller: RideController? = null
|
||||||
|
) {
|
||||||
|
companion object {
|
||||||
|
fun decode(buffer: RegistryFriendlyByteBuf): RidingProperties {
|
||||||
|
val stats: Map<RidingStat, RidingStatDefinition> = buffer.readMap(
|
||||||
|
{ buffer.readEnum<RidingStat>(RidingStat::class.java) },
|
||||||
|
{ RidingStatDefinition.decode(buffer) }
|
||||||
|
)
|
||||||
|
val seats: List<Seat> = buffer.readList { _ -> Seat.decode(buffer) }
|
||||||
|
val conditions = buffer.readList { buffer.readString().asExpression() }
|
||||||
|
val controller = buffer.readNullable { _ ->
|
||||||
|
val key = buffer.readIdentifier()
|
||||||
|
val controller = RideControllerAdapter.types[key]?.getConstructor()?.newInstance() ?: error("Unknown controller key: $key")
|
||||||
|
controller.decode(buffer)
|
||||||
|
return@readNullable controller
|
||||||
|
}
|
||||||
|
|
||||||
|
return RidingProperties(stats = stats, seats = seats, conditions = conditions, controller = controller)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val canRide: Boolean
|
||||||
|
get() = seats.isNotEmpty() && controller != null
|
||||||
|
|
||||||
|
fun encode(buffer: RegistryFriendlyByteBuf) {
|
||||||
|
buffer.writeMap(
|
||||||
|
stats,
|
||||||
|
{ _, stat -> buffer.writeEnum(stat) },
|
||||||
|
{ _, stat -> stat.encode(buffer) }
|
||||||
|
)
|
||||||
|
buffer.writeCollection(seats) { _, seat -> seat.encode(buffer) }
|
||||||
|
buffer.writeCollection(conditions) { _, condition -> buffer.writeString(condition.getString()) }
|
||||||
|
buffer.writeNullable(controller) { _, controller -> controller.encode(buffer) }
|
||||||
|
}
|
||||||
|
|
||||||
|
fun calculate(stat: RidingStat, style: RidingStyle, boosts: Int): Float {
|
||||||
|
val definitions = stats[stat] ?: return 0F
|
||||||
|
return definitions.calculate(style, boosts)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun hasStat(stat: RidingStat, style: RidingStyle): Boolean {
|
||||||
|
return stats[stat]?.ranges?.containsKey(style) == true
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
/*
|
||||||
|
* 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.riding
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Honestly having a base interface is probably unnecessary I'm just considering whether there's going to be some
|
||||||
|
* kind of shared state later.
|
||||||
|
*
|
||||||
|
* @author Hiroku
|
||||||
|
* @since October 6th, 2024
|
||||||
|
*/
|
||||||
|
interface RidingState
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
/*
|
||||||
|
* 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.riding
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A general medium for riding. Mainly used for categorizing which stats to pull from and for
|
||||||
|
* presenting a simplified view of riding to users.
|
||||||
|
*
|
||||||
|
* @author Hiroku
|
||||||
|
* @since February 17th, 2025
|
||||||
|
*/
|
||||||
|
enum class RidingStyle {
|
||||||
|
LAND,
|
||||||
|
LIQUID,
|
||||||
|
AIR
|
||||||
|
}
|
||||||
@@ -0,0 +1,91 @@
|
|||||||
|
/*
|
||||||
|
* 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.riding
|
||||||
|
|
||||||
|
import com.cobblemon.mod.common.api.net.Encodable
|
||||||
|
import com.cobblemon.mod.common.api.riding.controller.RidingAnimation
|
||||||
|
import com.cobblemon.mod.common.entity.PoseType
|
||||||
|
import com.cobblemon.mod.common.util.readString
|
||||||
|
import com.cobblemon.mod.common.util.writeString
|
||||||
|
import net.minecraft.network.RegistryFriendlyByteBuf
|
||||||
|
import net.minecraft.world.phys.Vec3
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Seat Properties are responsible for the base information that would then be used to construct a Seat on an entity.
|
||||||
|
*/
|
||||||
|
data class Seat(
|
||||||
|
val locator: String = "seat_1",
|
||||||
|
val offset: Vec3 = Vec3.ZERO,
|
||||||
|
val poseOffsets: MutableList<SeatPoseOffset> = mutableListOf(),
|
||||||
|
val poseAnimations: MutableList<SeatPoseAnimations> = mutableListOf()
|
||||||
|
) : Encodable {
|
||||||
|
fun getOffset(poseType: PoseType) : Vec3 {
|
||||||
|
return poseOffsets.firstOrNull { poseType in it.poseTypes }?.offset ?: offset
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun encode(buffer: RegistryFriendlyByteBuf) {
|
||||||
|
buffer.writeString(locator)
|
||||||
|
buffer.writeDouble(offset.x)
|
||||||
|
buffer.writeDouble(offset.y)
|
||||||
|
buffer.writeDouble(offset.z)
|
||||||
|
buffer.writeCollection(poseOffsets) { _, offset -> offset.encode(buffer) }
|
||||||
|
buffer.writeCollection(poseAnimations) { _, animations -> animations.encode(buffer) }
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
fun decode(buffer: RegistryFriendlyByteBuf) : Seat {
|
||||||
|
return Seat(
|
||||||
|
buffer.readString(),
|
||||||
|
Vec3(buffer.readDouble(), buffer.readDouble(), buffer.readDouble()),
|
||||||
|
buffer.readList { SeatPoseOffset.decode(buffer) },
|
||||||
|
buffer.readList { SeatPoseAnimations.decode(buffer) }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class SeatPoseOffset {
|
||||||
|
val poseTypes = mutableSetOf<PoseType>()
|
||||||
|
var offset = Vec3.ZERO
|
||||||
|
|
||||||
|
fun encode(buffer: RegistryFriendlyByteBuf) {
|
||||||
|
buffer.writeCollection(poseTypes) { _, poseType -> buffer.writeString(poseType.name) }
|
||||||
|
buffer.writeDouble(offset.x)
|
||||||
|
buffer.writeDouble(offset.y)
|
||||||
|
buffer.writeDouble(offset.z)
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
fun decode(buffer: RegistryFriendlyByteBuf) : SeatPoseOffset {
|
||||||
|
val offset = SeatPoseOffset()
|
||||||
|
offset.poseTypes.addAll(buffer.readList { buffer.readString().let { PoseType.valueOf(it) } })
|
||||||
|
offset.offset = Vec3(buffer.readDouble(), buffer.readDouble(), buffer.readDouble())
|
||||||
|
return offset
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class SeatPoseAnimations {
|
||||||
|
val poseTypes = mutableSetOf<PoseType>()
|
||||||
|
var animations = mutableListOf<RidingAnimation>()
|
||||||
|
|
||||||
|
fun encode(buffer: RegistryFriendlyByteBuf) {
|
||||||
|
buffer.writeCollection(poseTypes) { _, poseType -> buffer.writeString(poseType.name) }
|
||||||
|
buffer.writeCollection(animations) { _, animation -> animation.encode(buffer) }
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
fun decode(buffer: RegistryFriendlyByteBuf) : SeatPoseAnimations {
|
||||||
|
val animations = SeatPoseAnimations()
|
||||||
|
animations.poseTypes.addAll(buffer.readList { buffer.readString().let { PoseType.valueOf(it) } })
|
||||||
|
animations.animations = buffer.readList { RidingAnimation.decode(buffer) }
|
||||||
|
return animations
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+151
@@ -0,0 +1,151 @@
|
|||||||
|
/*
|
||||||
|
* 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.riding.controller
|
||||||
|
|
||||||
|
import com.cobblemon.mod.common.Cobblemon
|
||||||
|
import com.cobblemon.mod.common.Rollable
|
||||||
|
import com.cobblemon.mod.common.api.net.Decodable
|
||||||
|
import com.cobblemon.mod.common.api.net.Encodable
|
||||||
|
import com.cobblemon.mod.common.api.riding.RidingState
|
||||||
|
import com.cobblemon.mod.common.api.riding.controller.posing.PoseProvider
|
||||||
|
import com.cobblemon.mod.common.entity.PoseType
|
||||||
|
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||||
|
import com.cobblemon.mod.common.util.writeIdentifier
|
||||||
|
import net.minecraft.network.RegistryFriendlyByteBuf
|
||||||
|
import net.minecraft.resources.ResourceLocation
|
||||||
|
import net.minecraft.util.SmoothDouble
|
||||||
|
import net.minecraft.world.entity.LivingEntity
|
||||||
|
import net.minecraft.world.entity.player.Player
|
||||||
|
import net.minecraft.world.phys.Vec2
|
||||||
|
import net.minecraft.world.phys.Vec3
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A riding controller is the internal control mechanism for determining how a pokemon
|
||||||
|
* handles during riding. Controllers come into play once the pokemon being ridden has
|
||||||
|
* established the path it's capable of. For instance, a land based controller could have
|
||||||
|
* the pokemon experience drifting after movement, or generic movement. It's up to the
|
||||||
|
* controller to decide how the pokemon behaves.
|
||||||
|
*
|
||||||
|
* @since 1.7.0
|
||||||
|
*/
|
||||||
|
interface RideController : Encodable, Decodable {
|
||||||
|
|
||||||
|
/** A reference key used to denote the individual controller */
|
||||||
|
val key: ResourceLocation
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specifies the provider of poses which helps control updating the current pose on the pokemon
|
||||||
|
* being ridden. Controllers are expected to define the pose types responsible for posing the entity
|
||||||
|
* through all expected conditions. It should define a default pose, that will be used in all cases
|
||||||
|
* where a pose does not meet the current conditions for the current mount. Typically, this will be
|
||||||
|
* an idle pose.
|
||||||
|
*/
|
||||||
|
val poseProvider: PoseProvider
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents a condition that must be met for this controller to be active. For instance, this can be used
|
||||||
|
* to evaluate things such as current velocity or block state of the entity.
|
||||||
|
*/
|
||||||
|
val condition: (PokemonEntity) -> Boolean
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specifies the pose the ridden mount should be positioned in. This queries the pose provider using
|
||||||
|
* the entity as a means of determining the conditions the entity is currently under. This allows for
|
||||||
|
* dynamic pose updates.
|
||||||
|
*/
|
||||||
|
fun pose(entity: PokemonEntity): PoseType {
|
||||||
|
return this.poseProvider.select(entity)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculates the current speed of the mount.
|
||||||
|
*/
|
||||||
|
fun speed(entity: PokemonEntity, driver: Player): Float
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the rotation of the mount. This is typically based on the controlling driver and is manipulated as
|
||||||
|
* necessary.
|
||||||
|
*/
|
||||||
|
fun rotation(entity: PokemonEntity, driver: LivingEntity): Vec2
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the change current change in rotation for that tick in three
|
||||||
|
* dimensions
|
||||||
|
*/
|
||||||
|
fun angRollVel(entity: PokemonEntity, driver: Player, deltaTime: Double): Vec3 {
|
||||||
|
return Vec3(0.0, 0.0, 0.0)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun clampPassengerRotation(entity: PokemonEntity, driver: LivingEntity) {}
|
||||||
|
|
||||||
|
fun updatePassengerRotation(entity: PokemonEntity, driver: LivingEntity) {
|
||||||
|
driver.yRot = entity.yRot
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Manipulates the movement input as necessary by the controller. This is primarily used to apply limits
|
||||||
|
* to the types of movements. For instance, we can apply limits to any sort of sideways movement input, so that
|
||||||
|
* it would otherwise be slower than normal forward movement.
|
||||||
|
*/
|
||||||
|
fun velocity(entity: PokemonEntity, driver: Player, input: Vec3): Vec3
|
||||||
|
|
||||||
|
fun setRideBar(entity: PokemonEntity, driver: Player): Float = 0.0f
|
||||||
|
|
||||||
|
fun rideFovMult(entity: PokemonEntity, driver: Player): Float = 1.0f
|
||||||
|
|
||||||
|
fun canJump(entity: PokemonEntity, driver: Player): Boolean
|
||||||
|
|
||||||
|
fun jumpForce(entity: PokemonEntity, driver: Player, jumpStrength: Int): Vec3
|
||||||
|
|
||||||
|
fun gravity(entity: PokemonEntity, regularGravity: Double): Double? = null
|
||||||
|
|
||||||
|
fun inertia(entity: PokemonEntity): Double = 0.5
|
||||||
|
|
||||||
|
fun shouldRoll(entity: PokemonEntity): Boolean = false
|
||||||
|
|
||||||
|
fun useAngVelSmoothing(entity: PokemonEntity): Boolean = false
|
||||||
|
|
||||||
|
//If function is not overwritten by controllers then just perform the defualt
|
||||||
|
//rolling function which is roll on mousex and pitch on mousey
|
||||||
|
fun rotationOnMouseXY(
|
||||||
|
entity: PokemonEntity,
|
||||||
|
driver: Player,
|
||||||
|
yMouse: Double,
|
||||||
|
xMouse: Double,
|
||||||
|
yMouseSmoother: SmoothDouble,
|
||||||
|
xMouseSmoother: SmoothDouble,
|
||||||
|
sensitivity: Double,
|
||||||
|
deltaTime: Double
|
||||||
|
): Vec3 {
|
||||||
|
if (driver !is Rollable) return Vec3.ZERO
|
||||||
|
|
||||||
|
//Might need to add the smoothing here for default.
|
||||||
|
val rollable = driver as Rollable
|
||||||
|
val invertRoll = if (Cobblemon.config.invertRoll) -1 else 1
|
||||||
|
val invertPitch = if (Cobblemon.config.invertPitch) -1 else 1
|
||||||
|
return Vec3(0.0, yMouse * invertPitch, xMouse * invertRoll)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun turnOffOnGround(entity: PokemonEntity): Boolean = false
|
||||||
|
|
||||||
|
fun dismountOnShift(entity: PokemonEntity): Boolean = false
|
||||||
|
|
||||||
|
fun getRuntime(entity: PokemonEntity) = entity.riding.runtime
|
||||||
|
|
||||||
|
fun shouldRotatePokemonHead(): Boolean = false
|
||||||
|
fun shouldRotatePlayerHead(): Boolean = false
|
||||||
|
|
||||||
|
fun <T : RidingState> getState(entity: PokemonEntity, constructor: (PokemonEntity) -> T): T {
|
||||||
|
return entity.riding.getState(key, constructor)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun encode(buffer: RegistryFriendlyByteBuf) {
|
||||||
|
buffer.writeIdentifier(this.key)
|
||||||
|
}
|
||||||
|
}
|
||||||
+32
@@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* 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.riding.controller
|
||||||
|
|
||||||
|
import com.cobblemon.mod.common.util.readString
|
||||||
|
import com.cobblemon.mod.common.util.writeString
|
||||||
|
import net.minecraft.network.RegistryFriendlyByteBuf
|
||||||
|
|
||||||
|
class RidingAnimation(
|
||||||
|
val fileName: String,
|
||||||
|
val animationName: String
|
||||||
|
) {
|
||||||
|
fun encode(buffer: RegistryFriendlyByteBuf) {
|
||||||
|
buffer.writeString(fileName)
|
||||||
|
buffer.writeString(animationName)
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
fun decode(buffer: RegistryFriendlyByteBuf) : RidingAnimation {
|
||||||
|
return RidingAnimation(
|
||||||
|
buffer.readString(),
|
||||||
|
buffer.readString()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+15
@@ -0,0 +1,15 @@
|
|||||||
|
/*
|
||||||
|
* 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.riding.controller.posing
|
||||||
|
|
||||||
|
import com.cobblemon.mod.common.entity.PoseType
|
||||||
|
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||||
|
import java.util.function.Predicate
|
||||||
|
|
||||||
|
data class PoseOption(val pose: PoseType, val condition: Predicate<PokemonEntity>)
|
||||||
+31
@@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* 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.riding.controller.posing
|
||||||
|
|
||||||
|
import com.cobblemon.mod.common.entity.PoseType
|
||||||
|
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||||
|
|
||||||
|
class PoseProvider(private val fallback: PoseType) {
|
||||||
|
|
||||||
|
private val options = mutableListOf<PoseOption>()
|
||||||
|
|
||||||
|
fun select(entity: PokemonEntity) : PoseType {
|
||||||
|
return this.options.stream()
|
||||||
|
.filter { it.condition.test(entity) }
|
||||||
|
.map { it.pose }
|
||||||
|
.findFirst()
|
||||||
|
.orElse(this.fallback)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun with(option: PoseOption) : PoseProvider {
|
||||||
|
this.options.add(option)
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+33
@@ -0,0 +1,33 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Cobblemon Contributors
|
||||||
|
*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.cobblemon.mod.common.api.riding.events
|
||||||
|
|
||||||
|
import net.minecraft.world.entity.LivingEntity
|
||||||
|
|
||||||
|
data class SelectDriverEvent(val options: Set<LivingEntity>) {
|
||||||
|
|
||||||
|
private var result: DriverSuggestion? = null
|
||||||
|
|
||||||
|
fun result(): LivingEntity? {
|
||||||
|
return this.result?.entity
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Suggests a particular living entity as a potential driver. Only non-negative
|
||||||
|
* values are permitted by this function. All priority values with lesser priorities
|
||||||
|
* will be outright ignored.
|
||||||
|
*/
|
||||||
|
fun suggest(target: LivingEntity, priority: Int) {
|
||||||
|
if (priority >= 0 && priority > (this.result?.priority ?: -1)) {
|
||||||
|
this.result = DriverSuggestion(target, priority)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
data class DriverSuggestion(val entity: LivingEntity, val priority: Int)
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* 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.riding.stats
|
||||||
|
|
||||||
|
import com.cobblemon.mod.common.api.berry.Flavor
|
||||||
|
import com.cobblemon.mod.common.util.lang
|
||||||
|
import net.minecraft.network.chat.Component
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A stat that is used for riding Pokémon. The exact implementation of each of these depends on the [com.cobblemon.mod.common.api.riding.controller.RideController].
|
||||||
|
*
|
||||||
|
* @author Hiroku
|
||||||
|
* @since February 17th, 2025
|
||||||
|
*/
|
||||||
|
enum class RidingStat(
|
||||||
|
val flavour: Flavor
|
||||||
|
) {
|
||||||
|
SPEED(Flavor.SWEET),
|
||||||
|
ACCELERATION(Flavor.SPICY),
|
||||||
|
SKILL(Flavor.DRY),
|
||||||
|
JUMP(Flavor.BITTER),
|
||||||
|
STAMINA(Flavor.SOUR);
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
fun getByName(name: String) = RidingStat.entries.firstOrNull { it.name.equals(name, ignoreCase = true) }
|
||||||
|
}
|
||||||
|
|
||||||
|
val displayName: Component
|
||||||
|
get() = lang("riding.stat.${name.lowercase()}.name")
|
||||||
|
val description: Component
|
||||||
|
get() = lang("riding.stat.${name.lowercase()}.desc")
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user