mirror of
https://gitlab.com/cable-mc/cobblemon.git
synced 2026-10-31 06:18:54 -04:00
Compare commits
160
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b2f002d630 | ||
|
|
5b9d5cbb55 | ||
|
|
ff890307c2 | ||
|
|
dda9d3e790 | ||
|
|
1acc02a2ec | ||
|
|
9a036a4c01 | ||
|
|
3cea6dd175 | ||
|
|
2fa053f833 | ||
|
|
ea4f858919 | ||
|
|
d86021e2a1 | ||
|
|
79faadef59 | ||
|
|
9b6629db7f | ||
|
|
d151a1ce65 | ||
|
|
d9ca7b483d | ||
|
|
708f7fc1b8 | ||
|
|
621db85845 | ||
|
|
b09066c580 | ||
|
|
7c45f28827 | ||
|
|
9c1b2cae22 | ||
|
|
16b2f81bd4 | ||
|
|
108f0e3d88 | ||
|
|
4344c127eb | ||
|
|
5955547c6f | ||
|
|
7a3a1cb8de | ||
|
|
1674cb0913 | ||
|
|
152ce4e923 | ||
|
|
3a6d024217 | ||
|
|
f2fcc5ba79 | ||
|
|
db0fb8e287 | ||
|
|
dae36a67d1 | ||
|
|
6f99862288 | ||
|
|
0377747e1e | ||
|
|
6bc974f90f | ||
|
|
aca53de259 | ||
|
|
41bde38727 | ||
|
|
a4b7ee3b38 | ||
|
|
154b653c57 | ||
|
|
04489bc969 | ||
|
|
25499b3e7a | ||
|
|
bb6bda54dc | ||
|
|
9f3dbdc2d8 | ||
|
|
932148338c | ||
|
|
a0e732dc6e | ||
|
|
309f674853 | ||
|
|
ea20c2aa4c | ||
|
|
da5272c473 | ||
|
|
dc705c7720 | ||
|
|
a785e574e0 | ||
|
|
4b236b0268 | ||
|
|
1cd86ae5d6 | ||
|
|
b7489a0b14 | ||
|
|
f7554425dc | ||
|
|
9bfc577444 | ||
|
|
858d2e908a | ||
|
|
b61e0b0c82 | ||
|
|
4d9a6e71c9 | ||
|
|
a0010de504 | ||
|
|
cb73a30e23 | ||
|
|
3ca6d350fe | ||
|
|
2997ce8457 | ||
|
|
ff279d8310 | ||
|
|
9a7536b068 | ||
|
|
bd973e702e | ||
|
|
ede1851d34 | ||
|
|
cdb8ee0d8e | ||
|
|
e7d86a382c | ||
|
|
eb911df830 | ||
|
|
1c30acc53c | ||
|
|
32b0699235 | ||
|
|
e9c6580230 | ||
|
|
f893eb48fd | ||
|
|
232e2f18bf | ||
|
|
c266c99710 | ||
|
|
2a0e8f6d47 | ||
|
|
e6bd8ec529 | ||
|
|
911a95e873 | ||
|
|
447cfc2ae5 | ||
|
|
8dfeb0d260 | ||
|
|
caa7b19833 | ||
|
|
91d6fb62ba | ||
|
|
8f4a5b2015 | ||
|
|
07604c9a3b | ||
|
|
64dd8ae193 | ||
|
|
156ee6f290 | ||
|
|
fe433d1417 | ||
|
|
0dc662d295 | ||
|
|
081e370bfd | ||
|
|
3ef0567287 | ||
|
|
3cad9e5481 | ||
|
|
dc8b7908be | ||
|
|
85085a1eca | ||
|
|
bff59dee6e | ||
|
|
bb5828531a | ||
|
|
cd08e98c28 | ||
|
|
331f7ca425 | ||
|
|
71c9ac0ff0 | ||
|
|
1404cc0ab5 | ||
|
|
6ca908a91d | ||
|
|
0948b8da9a | ||
|
|
22e04a53b3 | ||
|
|
df3217b41b | ||
|
|
9ff15a1913 | ||
|
|
ca58801794 | ||
|
|
38fa5e2628 | ||
|
|
fae1ae7124 | ||
|
|
3ec5f76c73 | ||
|
|
5bb8aaba55 | ||
|
|
23ba41e981 | ||
|
|
29b049452b | ||
|
|
0b0f665804 | ||
|
|
5d53fba2ce | ||
|
|
14cc851562 | ||
|
|
7223d1fd68 | ||
|
|
75f52e4cf4 | ||
|
|
55446dd4b1 | ||
|
|
8b825d558f | ||
|
|
9a7f97f11f | ||
|
|
95b8d62e4a | ||
|
|
4354c3fb03 | ||
|
|
f25a676bd5 | ||
|
|
a9906762a0 | ||
|
|
7b5b88eca2 | ||
|
|
291682ba52 | ||
|
|
546d403b45 | ||
|
|
c9f40e32a1 | ||
|
|
d642b8dd07 | ||
|
|
549a11116e | ||
|
|
b5468a4a4f | ||
|
|
c5d278ccb7 | ||
|
|
bf5e15de45 | ||
|
|
f4af417267 | ||
|
|
69c04acaeb | ||
|
|
83a6bb188f | ||
|
|
494a8b5e91 | ||
|
|
c8021f2f08 | ||
|
|
8cdf3af047 | ||
|
|
c90a24e1ab | ||
|
|
83e3cfc34e | ||
|
|
133dd4e5b7 | ||
|
|
a8cca14b86 | ||
|
|
9b0f356fa4 | ||
|
|
f2b0a102b6 | ||
|
|
a7d01b230a | ||
|
|
2a7db4b9b8 | ||
|
|
77e5f2501d | ||
|
|
e6513717bd | ||
|
|
0e0c98f693 | ||
|
|
528bfa4e22 | ||
|
|
83c87779d7 | ||
|
|
dc33235144 | ||
|
|
935c658c5f | ||
|
|
0426f4fbf9 | ||
|
|
46e771a062 | ||
|
|
4c0095844b | ||
|
|
10a2ef27d6 | ||
|
|
3c7637515c | ||
|
|
0a5abdb331 | ||
|
|
4ed7413dd2 | ||
|
|
40b66c24fc | ||
|
|
20a35de3d8 |
No files matched your search
@@ -157,6 +157,9 @@ build:
|
|||||||
paths:
|
paths:
|
||||||
- neoforge/build/libs
|
- neoforge/build/libs
|
||||||
- fabric/build/libs
|
- fabric/build/libs
|
||||||
|
exclude:
|
||||||
|
- neoforge/build/libs/*-dev-shadow.jar
|
||||||
|
- fabric/build/libs/*-dev-shadow.jar
|
||||||
|
|
||||||
publish:
|
publish:
|
||||||
stage: deploy
|
stage: deploy
|
||||||
|
|||||||
+103
-6
@@ -7,38 +7,135 @@
|
|||||||
- Iron Ball, Metal Coat, Throat Spray, HP Up, Protein, Iron, Carbos, Calcium, Zinc, PP Up, PP Max, Upgrade, Dubious Disc, and Loaded Dice.
|
- Iron Ball, Metal Coat, Throat Spray, HP Up, Protein, Iron, Carbos, Calcium, Zinc, PP Up, PP Max, Upgrade, Dubious Disc, and Loaded Dice.
|
||||||
- The following items can now be placed on various surfaces:
|
- The following items can now be placed on various surfaces:
|
||||||
- Galarica Wreath, Magnet, Flame Orb, Life Orb, Toxic Orb, Light Ball, and Smoke Ball.
|
- Galarica Wreath, Magnet, Flame Orb, Life Orb, Toxic Orb, Light Ball, and Smoke Ball.
|
||||||
- The following items can now be placed as blocks, and have additional functionality:
|
- The following items can now be placed as blocks and have additional functionality:
|
||||||
- Ring Target, Metronome, and Eject Button.
|
- Ring Target, Metronome, and Eject Button.
|
||||||
- The following items can now be worn by Players and Pokémon:
|
- The following items can now be worn by Players and Pokémon:
|
||||||
- Galarica Wreath, Cleanse Tag, Spell Tag, Sharp Beak, Covert Cloak, Shell Helmet, and Never-Melt Ice.
|
- Galarica Wreath, Cleanse Tag, Spell Tag, Sharp Beak, Covert Cloak, Shell Helmet, and Never-Melt Ice.
|
||||||
- Wearable items can now be equipped by a player by holding it and right-clicking (or rebound use/interact)
|
- Wearable items can now be equipped by a player by holding it and right-clicking (or rebound use/interact)
|
||||||
- Wearable items that can be placed down are exempt from this behaviour.
|
- Wearable items that can be placed down are exempt from this behaviour.
|
||||||
|
- The evolution tree can now be viewed on the Pokédex, showing a Pokémon's full family line and what's needed to evolve into each stage.
|
||||||
### New rideable Pokémon
|
- Added custom sounds to a bunch of items that can be placed as blocks: liquid bottles, pill bottles, powders and dice.
|
||||||
|
|
||||||
### Pokémon Added
|
### Pokémon Added
|
||||||
|
#### Generation 4
|
||||||
|
- Snover
|
||||||
|
- Abomasnow
|
||||||
|
- Burmy
|
||||||
|
- Wormadam
|
||||||
|
- Mothim
|
||||||
|
|
||||||
#### Regional Forms
|
#### Generation 5
|
||||||
|
- Tympole
|
||||||
|
- Palpitoad
|
||||||
|
- Seismitoad
|
||||||
|
|
||||||
|
#### Generation 6
|
||||||
|
- Helioptile
|
||||||
|
- Heliolisk
|
||||||
|
|
||||||
|
#### Generation 7
|
||||||
|
- Grubbin
|
||||||
|
- Charjabug
|
||||||
|
- Vikavolt
|
||||||
|
- Minior
|
||||||
|
|
||||||
|
#### Generation 8
|
||||||
|
- Eternatus
|
||||||
|
|
||||||
|
#### Generation 9
|
||||||
|
- Greavard
|
||||||
|
- Houndstone
|
||||||
|
|
||||||
### Model updates for the following Pokémon
|
### Model updates for the following Pokémon
|
||||||
|
- Sudowoodo
|
||||||
|
- Spheal
|
||||||
|
- Cacnea
|
||||||
|
- Cacturne
|
||||||
|
- Binacle
|
||||||
|
- Barbaracle
|
||||||
|
- Glimmet
|
||||||
|
- Glimmora
|
||||||
|
- Deerling
|
||||||
|
- Sawsbuck (All forms)
|
||||||
|
- Absol
|
||||||
|
- Poliwag
|
||||||
|
- Politoed
|
||||||
|
- Ekans
|
||||||
|
- Oddish
|
||||||
|
- Gloom
|
||||||
|
- Vileplume
|
||||||
|
- Bellossom
|
||||||
|
- Shroomish
|
||||||
|
|
||||||
### Animation updates for the following Pokémon
|
### Animation updates for the following Pokémon
|
||||||
|
- Treecko (New Shoulder Mount!)
|
||||||
#### Added sounds to the following moves
|
- Bonsly (New Shoulder Mount!)
|
||||||
|
- Sudowoodo
|
||||||
|
- Cacnea
|
||||||
|
- Cacturne
|
||||||
|
- Ekans
|
||||||
|
- Arbok
|
||||||
|
- Oddish
|
||||||
|
- Gloom
|
||||||
|
- Vileplume
|
||||||
|
- Bellossom
|
||||||
|
|
||||||
### Changes
|
### Changes
|
||||||
- Updated various recipes to display in Recipe Groups within the Recipe Book
|
- Updated various recipes to display in Recipe Groups within the Recipe Book
|
||||||
- Updated most recipes to display more logically/consistently within the Recipe Book's categories
|
- Updated most recipes to display more logically/consistently within the Recipe Book's categories
|
||||||
|
- Make ride rotations less jittery in multiplayer.
|
||||||
|
- Changes tm shelf discs to use textures instead of tinting and overlays to line up with item display
|
||||||
|
- Blank TM can now be inserted into the Disc Shelf
|
||||||
|
- Recall animation now renders ball in hand with the player arm raised.
|
||||||
|
- Made regional and Vivillon split-evo locations now mutually exclusive
|
||||||
|
- Item evolutions now unlock **all** locked evolutions whose requirements are met instead of stopping after the first.
|
||||||
|
- Exceptions being "forced" evolutions which will continue to stop after the first one
|
||||||
|
|
||||||
### Fixes
|
### Fixes
|
||||||
- Correctly grants "They're Minerals!" advancement when planting a type gem
|
- Correctly grants "They're Minerals!" advancement when planting a type gem
|
||||||
|
- Shoulder mounted Pokémon now follow player body animations, improving their positioning with custom player animations and default actions.
|
||||||
|
- Shoulder mounted Pokémon now sit slightly higher with chest armor equipped for better alignment, with a configurable blacklist.
|
||||||
- Type Gem Blocks now have advancements to give you the recipe in the recipe book (the data for the advancements were inside the recipes somehow??)
|
- Type Gem Blocks now have advancements to give you the recipe in the recipe book (the data for the advancements were inside the recipes somehow??)
|
||||||
- Some other recipes without advancements have also been corrected
|
- Some other recipes without advancements have also been corrected
|
||||||
- Corrected the TM Recipes for Charge Beam and Payday
|
- Corrected the TM Recipes for Charge Beam and Payday
|
||||||
|
- Type Gem blocks now properly generate clusters off of the block.
|
||||||
|
- Starter Screen Categories will no longer stop rendering if they are bigger than the viewport, and you are not viewing top or bottom edges
|
||||||
|
- Random Starter option now properly handled in height calculation, so now it won't run off into other categories or be un-accessible due to scroll limits if it causes a new row
|
||||||
|
- Mochi and Feathers no longer drop glass bottles on use
|
||||||
|
- Fixed a rare set of concurrency bugs related to reloading packs on NeoForge; fixes a ModernFix issue
|
||||||
|
- Removed unnecessary conditions for Mimikyu's standing pose. Hopefully fixes the rare instance of it using its shoulder animations during battle in multiplayer scenarios.
|
||||||
|
- Fixed Rockruff line not blinking
|
||||||
|
- Fixed Flygon sometimes using its running animation instead of walking
|
||||||
|
- Fixed Bramblin always sleeping outside of battle
|
||||||
|
- Fixed Dragonair using its battle idle as a normal idle
|
||||||
|
- Fixed Lycanroc's head movement
|
||||||
|
- Added head movement to Archaludon
|
||||||
|
- Fixed Duraludon line not having any sleep animations
|
||||||
|
- Fixed Diglett line not having their faint animations
|
||||||
|
- Fixed Kingambit moving its legs while walking
|
||||||
|
- Fixed Alolan Diglett's cry not playing
|
||||||
|
- Fixed shiny alpha Snorlax using the non-shiny texture
|
||||||
|
- Various Structure fixes
|
||||||
|
- Fixed shiny Pokémon under certain circumstances forgetting taught TMs
|
||||||
|
- Fixed certain Pokémon sounds sometimes being doubled when played at specific times in their animations
|
||||||
|
- Fixed ball capture beam origin coming from behind the ball.
|
||||||
|
- Fixed Safari Ball catch rate outside of battle
|
||||||
|
|
||||||
### Developer
|
### Developer
|
||||||
|
- Evolution requirements can now set `pokedexIcon` and `pokedexTooltip` directly in their JSON to control how they're shown on the Pokédex's evolution tree, for example:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"variant": "attack_defence_ratio",
|
||||||
|
"pokedexIcon": "minecraft:diamond_sword",
|
||||||
|
"pokedexTooltip": "cobblemon.ui.pokedex.requirement.attack_defence_ratio.tooltip"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
- Fixed wrong order of operations in the code flow prior to the `FOSSIL_REVIVED` event causing pokemon to appear without entity link
|
||||||
|
- Fixed TestPartySlot command not correctly comparing the provided spec with the target Pokémon
|
||||||
|
|
||||||
### Molang & Datapacks
|
### Molang & Datapacks
|
||||||
|
- A new `negate` variant for evolution requirements has been added, which will negate (invert) the provided inner condition.
|
||||||
|
- Added Molang functions for individual Pokédex ids, wherein a subdex is passed in as a string to `dex_caught_count` etc.
|
||||||
|
|
||||||
### Particles
|
### Particles
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
- Some kind of particle effect for them? they're meant to have glowing eyes, so maybe some red particles on the eye locator
|
|
||||||
--- global posers? stacked posers?
|
|
||||||
--- red texture seems to be what some people wanted.
|
|
||||||
|
|
||||||
/- shoulder mounts part of it
|
|
||||||
- omni boost
|
|
||||||
- roar when player comes within reach, adjust levels
|
|
||||||
|
|
||||||
- Riding settings to control what the min scale is for a pokemon to be ridable.
|
|
||||||
+5
-2
@@ -1,3 +1,6 @@
|
|||||||
|
import utilities.gitBranch
|
||||||
|
import utilities.gitShortCommit
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
id("cobblemon.root-conventions")
|
id("cobblemon.root-conventions")
|
||||||
}
|
}
|
||||||
@@ -6,6 +9,6 @@ version = "${project.property("mod_version")}+${project.property("mc_version")}"
|
|||||||
|
|
||||||
val isSnapshot = project.property("snapshot")?.equals("true") == true
|
val isSnapshot = project.property("snapshot")?.equals("true") == true
|
||||||
if (isSnapshot) {
|
if (isSnapshot) {
|
||||||
val fixedBranchName = versioning.info.branch.substringAfter("/")
|
val fixedBranchName = gitBranch().substringAfter("/")
|
||||||
version = "$version-${fixedBranchName}-${versioning.info.build}"
|
version = "$version-${fixedBranchName}-${gitShortCommit()}"
|
||||||
}
|
}
|
||||||
+15
-6
@@ -1,9 +1,8 @@
|
|||||||
|
|
||||||
import java.time.OffsetDateTime
|
|
||||||
import java.time.ZoneOffset
|
|
||||||
import java.time.format.DateTimeFormatter
|
|
||||||
import utilities.isSnapshot
|
import utilities.isSnapshot
|
||||||
import utilities.version
|
import utilities.version
|
||||||
|
import utilities.gitBranch
|
||||||
|
import utilities.gitCommit
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
@@ -72,6 +71,14 @@ tasks.withType<Test> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Git info lives in its own output dir (not processResources) so a new commit only rewrites this one file.
|
||||||
|
val writeGitInfo by tasks.registering(WriteProperties::class) {
|
||||||
|
destinationFile = layout.buildDirectory.file("generated/gitInfo/cobblemon-git.properties")
|
||||||
|
property("commit", gitCommit())
|
||||||
|
property("branch", gitBranch())
|
||||||
|
}
|
||||||
|
sourceSets.main { output.dir(mapOf("builtBy" to writeGitInfo), layout.buildDirectory.dir("generated/gitInfo")) }
|
||||||
|
|
||||||
tasks.processResources {
|
tasks.processResources {
|
||||||
exclude("data/**/README.md")
|
exclude("data/**/README.md")
|
||||||
}
|
}
|
||||||
@@ -98,11 +105,13 @@ sourceSets {
|
|||||||
property("modid", "cobblemon")
|
property("modid", "cobblemon")
|
||||||
property("version", project.version())
|
property("version", project.version())
|
||||||
property("isSnapshot", if(rootProject.isSnapshot()) "true" else "false")
|
property("isSnapshot", if(rootProject.isSnapshot()) "true" else "false")
|
||||||
property("gitCommit", versioning.info.commit)
|
|
||||||
property("branch", versioning.info.branch)
|
|
||||||
System.getProperty("buildNumber")?.let { property("buildNumber", it) }
|
System.getProperty("buildNumber")?.let { property("buildNumber", it) }
|
||||||
property("timestamp", OffsetDateTime.now(ZoneOffset.UTC).format(DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm:ss")) + " UTC")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The platform jars are built from :common:jar, so the remapped common jars are only needed by `publish`
|
||||||
|
tasks.assemble {
|
||||||
|
setDependsOn(dependsOn.filterNot { (it as? TaskProvider<*>)?.name in setOf("remapJar", "remapSourcesJar") })
|
||||||
|
}
|
||||||
+2
@@ -10,7 +10,9 @@ package com.cobblemon.mod.common.mixin.accessor;
|
|||||||
|
|
||||||
import net.minecraft.client.gui.components.StateSwitchingButton;
|
import net.minecraft.client.gui.components.StateSwitchingButton;
|
||||||
import net.minecraft.client.gui.screens.recipebook.RecipeBookComponent;
|
import net.minecraft.client.gui.screens.recipebook.RecipeBookComponent;
|
||||||
|
import net.minecraft.network.chat.Component;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Mutable;
|
||||||
import org.spongepowered.asm.mixin.gen.Accessor;
|
import org.spongepowered.asm.mixin.gen.Accessor;
|
||||||
|
|
||||||
@Mixin(RecipeBookComponent.class)
|
@Mixin(RecipeBookComponent.class)
|
||||||
|
|||||||
+2
-1
@@ -15,9 +15,11 @@ import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
|
|||||||
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
|
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
|
||||||
import com.llamalad7.mixinextras.sugar.Local;
|
import com.llamalad7.mixinextras.sugar.Local;
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
|
import net.minecraft.core.Direction;
|
||||||
import net.minecraft.core.NonNullList;
|
import net.minecraft.core.NonNullList;
|
||||||
import net.minecraft.world.Containers;
|
import net.minecraft.world.Containers;
|
||||||
import net.minecraft.world.item.ItemStack;
|
import net.minecraft.world.item.ItemStack;
|
||||||
|
import net.minecraft.world.item.Items;
|
||||||
import net.minecraft.world.item.alchemy.PotionBrewing;
|
import net.minecraft.world.item.alchemy.PotionBrewing;
|
||||||
import net.minecraft.world.item.crafting.RecipeHolder;
|
import net.minecraft.world.item.crafting.RecipeHolder;
|
||||||
import net.minecraft.world.item.crafting.RecipeManager;
|
import net.minecraft.world.item.crafting.RecipeManager;
|
||||||
@@ -32,7 +34,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
@Mixin(BrewingStandBlockEntity.class)
|
@Mixin(BrewingStandBlockEntity.class)
|
||||||
public class BrewingStandBlockEntityMixin {
|
public class BrewingStandBlockEntityMixin {
|
||||||
|
|
||||||
|
|||||||
@@ -9,11 +9,17 @@
|
|||||||
package com.cobblemon.mod.common.mixin.brewing;
|
package com.cobblemon.mod.common.mixin.brewing;
|
||||||
|
|
||||||
import com.cobblemon.mod.common.duck.RecipeAwareSlot;
|
import com.cobblemon.mod.common.duck.RecipeAwareSlot;
|
||||||
|
import com.cobblemon.mod.common.item.crafting.brewingstand.BrewingStandRecipe;
|
||||||
|
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
|
||||||
|
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
|
||||||
|
import com.llamalad7.mixinextras.sugar.Local;
|
||||||
import net.minecraft.world.Container;
|
import net.minecraft.world.Container;
|
||||||
import net.minecraft.world.entity.player.Inventory;
|
import net.minecraft.world.entity.player.Inventory;
|
||||||
|
import net.minecraft.world.entity.player.Player;
|
||||||
import net.minecraft.world.inventory.BrewingStandMenu;
|
import net.minecraft.world.inventory.BrewingStandMenu;
|
||||||
import net.minecraft.world.inventory.ContainerData;
|
import net.minecraft.world.inventory.ContainerData;
|
||||||
import net.minecraft.world.inventory.Slot;
|
import net.minecraft.world.inventory.Slot;
|
||||||
|
import net.minecraft.world.item.ItemStack;
|
||||||
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;
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import com.cobblemon.mod.common.item.crafting.brewingstand.BrewingStandRecipe;
|
|||||||
import net.minecraft.world.inventory.BrewingStandMenu;
|
import net.minecraft.world.inventory.BrewingStandMenu;
|
||||||
import net.minecraft.world.item.ItemStack;
|
import net.minecraft.world.item.ItemStack;
|
||||||
import net.minecraft.world.item.crafting.RecipeManager;
|
import net.minecraft.world.item.crafting.RecipeManager;
|
||||||
|
import net.minecraft.world.level.Level;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
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;
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ import net.minecraft.client.Camera;
|
|||||||
import net.minecraft.world.entity.Entity;
|
import net.minecraft.world.entity.Entity;
|
||||||
import net.minecraft.world.level.BlockGetter;
|
import net.minecraft.world.level.BlockGetter;
|
||||||
import net.minecraft.world.phys.Vec3;
|
import net.minecraft.world.phys.Vec3;
|
||||||
|
import org.joml.Quaternionf;
|
||||||
import org.joml.Vector3f;
|
import org.joml.Vector3f;
|
||||||
import org.spongepowered.asm.mixin.Final;
|
import org.spongepowered.asm.mixin.Final;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
|||||||
@@ -10,7 +10,9 @@ package com.cobblemon.mod.common.mixin.client;
|
|||||||
|
|
||||||
import com.cobblemon.mod.common.CobblemonRecipeCategories;
|
import com.cobblemon.mod.common.CobblemonRecipeCategories;
|
||||||
import com.cobblemon.mod.common.item.crafting.CookingPotBookCategory;
|
import com.cobblemon.mod.common.item.crafting.CookingPotBookCategory;
|
||||||
|
import com.cobblemon.mod.common.item.crafting.CookingPotRecipe;
|
||||||
import com.cobblemon.mod.common.item.crafting.CookingPotRecipeBase;
|
import com.cobblemon.mod.common.item.crafting.CookingPotRecipeBase;
|
||||||
|
import com.cobblemon.mod.common.item.crafting.CookingPotShapelessRecipe;
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
|
|||||||
@@ -10,11 +10,13 @@ package com.cobblemon.mod.common.mixin.client;
|
|||||||
|
|
||||||
import com.cobblemon.mod.common.OrientationControllable;
|
import com.cobblemon.mod.common.OrientationControllable;
|
||||||
import com.cobblemon.mod.common.client.render.player.MountedPlayerRenderer;
|
import com.cobblemon.mod.common.client.render.player.MountedPlayerRenderer;
|
||||||
|
import com.cobblemon.mod.common.client.render.player.RecallArmAnimationTracker;
|
||||||
import com.cobblemon.mod.common.duck.RidePassenger;
|
import com.cobblemon.mod.common.duck.RidePassenger;
|
||||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity;
|
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity;
|
||||||
import net.minecraft.client.model.HumanoidModel;
|
import net.minecraft.client.model.HumanoidModel;
|
||||||
import net.minecraft.client.model.geom.ModelPart;
|
import net.minecraft.client.model.geom.ModelPart;
|
||||||
import net.minecraft.client.player.AbstractClientPlayer;
|
import net.minecraft.client.player.AbstractClientPlayer;
|
||||||
|
import net.minecraft.util.Mth;
|
||||||
import net.minecraft.world.entity.Entity;
|
import net.minecraft.world.entity.Entity;
|
||||||
import net.minecraft.world.entity.LivingEntity;
|
import net.minecraft.world.entity.LivingEntity;
|
||||||
import org.spongepowered.asm.mixin.Final;
|
import org.spongepowered.asm.mixin.Final;
|
||||||
@@ -96,4 +98,14 @@ public class HumanoidModelMixin {
|
|||||||
MountedPlayerRenderer.INSTANCE.animate((HumanoidModel<AbstractClientPlayer>)(Object)this, pokemonEntity, player, netHeadYaw, headPitch, ageInTicks, limbSwing, limbSwingAmount);
|
MountedPlayerRenderer.INSTANCE.animate((HumanoidModel<AbstractClientPlayer>)(Object)this, pokemonEntity, player, netHeadYaw, headPitch, ageInTicks, limbSwing, limbSwingAmount);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Inject(method = "setupAnim*", at = @At("TAIL"))
|
||||||
|
public void cobblemon$poseRecallArm(LivingEntity entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch, CallbackInfo ci) {
|
||||||
|
if (!(entity instanceof AbstractClientPlayer) || entity.getVehicle() instanceof PokemonEntity) return;
|
||||||
|
float raise = RecallArmAnimationTracker.INSTANCE.raiseFactor(entity.getUUID());
|
||||||
|
if (raise <= 0f) return;
|
||||||
|
this.rightArm.xRot = Mth.lerp(raise, this.rightArm.xRot, (float) (-Math.PI / 2.0));
|
||||||
|
this.rightArm.yRot = Mth.lerp(raise, this.rightArm.yRot, 0f);
|
||||||
|
this.rightArm.zRot = Mth.lerp(raise, this.rightArm.zRot, 0f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -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.client;
|
||||||
|
|
||||||
|
import com.cobblemon.mod.common.client.render.player.RecallArmAnimationTracker;
|
||||||
|
import com.mojang.blaze3d.vertex.PoseStack;
|
||||||
|
import net.minecraft.client.renderer.MultiBufferSource;
|
||||||
|
import net.minecraft.client.renderer.entity.layers.ItemInHandLayer;
|
||||||
|
import net.minecraft.world.entity.HumanoidArm;
|
||||||
|
import net.minecraft.world.entity.LivingEntity;
|
||||||
|
import net.minecraft.world.item.ItemDisplayContext;
|
||||||
|
import net.minecraft.world.item.ItemStack;
|
||||||
|
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(ItemInHandLayer.class)
|
||||||
|
public class ItemInHandLayerMixin {
|
||||||
|
@Inject(method = "renderArmWithItem", at = @At("HEAD"), cancellable = true)
|
||||||
|
private void cobblemon$hideRecallHandItem(LivingEntity entity, ItemStack itemStack, ItemDisplayContext itemDisplayContext, HumanoidArm humanoidArm, PoseStack poseStack, MultiBufferSource multiBufferSource, int light, CallbackInfo ci) {
|
||||||
|
if (humanoidArm == HumanoidArm.RIGHT && RecallArmAnimationTracker.INSTANCE.isRecalling(entity.getUUID())) {
|
||||||
|
ci.cancel();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+4
@@ -9,6 +9,7 @@
|
|||||||
package com.cobblemon.mod.common.mixin.client;
|
package com.cobblemon.mod.common.mixin.client;
|
||||||
|
|
||||||
import com.cobblemon.mod.common.OrientationControllable;
|
import com.cobblemon.mod.common.OrientationControllable;
|
||||||
|
import com.cobblemon.mod.common.client.render.player.FirstPersonRecallBallRenderer;
|
||||||
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.Minecraft;
|
||||||
@@ -31,6 +32,9 @@ 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 (interactionHand == InteractionHand.MAIN_HAND && FirstPersonRecallBallRenderer.INSTANCE.render(poseStack, multiBufferSource, j, f)) {
|
||||||
|
ci.cancel();
|
||||||
|
}
|
||||||
else if (abstractClientPlayer instanceof OrientationControllable controllable && controllable.getOrientationController().isActive()) {
|
else if (abstractClientPlayer instanceof OrientationControllable controllable && controllable.getOrientationController().isActive()) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,8 +8,12 @@ object CobblemonBuildDetails {
|
|||||||
const val VERSION = "{{ version }}"
|
const val VERSION = "{{ version }}"
|
||||||
const val SNAPSHOT = {{ isSnapshot }}
|
const val SNAPSHOT = {{ isSnapshot }}
|
||||||
|
|
||||||
const val GIT_COMMIT = "{{ gitCommit | default("Not Specified") }}"
|
// Read at runtime rather than templated in, so a new commit doesn't invalidate compiled code.
|
||||||
const val BRANCH = "{{ branch | default("Not Specified") }}"
|
private val git = java.util.Properties().apply {
|
||||||
|
CobblemonBuildDetails::class.java.getResourceAsStream("/cobblemon-git.properties")?.use(::load)
|
||||||
|
}
|
||||||
|
@JvmField val GIT_COMMIT: String = git.getProperty("commit", "Not Specified")
|
||||||
|
@JvmField val BRANCH: String = git.getProperty("branch", "Not Specified")
|
||||||
|
|
||||||
fun smallCommitHash(): String {
|
fun smallCommitHash(): String {
|
||||||
return this.GIT_COMMIT.substring(0, 7)
|
return this.GIT_COMMIT.substring(0, 7)
|
||||||
|
|||||||
@@ -97,10 +97,10 @@ import com.cobblemon.mod.common.pokemon.Pokemon
|
|||||||
import com.cobblemon.mod.common.pokemon.aspects.ALPHA_ASPECT
|
import com.cobblemon.mod.common.pokemon.aspects.ALPHA_ASPECT
|
||||||
import com.cobblemon.mod.common.pokemon.aspects.CHARACTERISTIC_RAINBOW_ASPECT
|
import com.cobblemon.mod.common.pokemon.aspects.CHARACTERISTIC_RAINBOW_ASPECT
|
||||||
import com.cobblemon.mod.common.pokemon.aspects.COSMETIC_SLOT_ASPECT
|
import com.cobblemon.mod.common.pokemon.aspects.COSMETIC_SLOT_ASPECT
|
||||||
import com.cobblemon.mod.common.pokemon.aspects.FORM_ASPECTS
|
|
||||||
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.MARK_ASPECT
|
import com.cobblemon.mod.common.pokemon.aspects.MARK_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.feature.SlowpokeTailRegrowthSpeciesFeature
|
import com.cobblemon.mod.common.pokemon.feature.SlowpokeTailRegrowthSpeciesFeature
|
||||||
import com.cobblemon.mod.common.pokemon.feature.SlowpokeTailRegrowthSpeciesFeatureProvider
|
import com.cobblemon.mod.common.pokemon.feature.SlowpokeTailRegrowthSpeciesFeatureProvider
|
||||||
import com.cobblemon.mod.common.pokemon.feature.TagSeasonResolver
|
import com.cobblemon.mod.common.pokemon.feature.TagSeasonResolver
|
||||||
@@ -115,7 +115,6 @@ import com.cobblemon.mod.common.pokemon.properties.NoAIProperty
|
|||||||
import com.cobblemon.mod.common.pokemon.properties.UnaspectPropertyType
|
import com.cobblemon.mod.common.pokemon.properties.UnaspectPropertyType
|
||||||
import com.cobblemon.mod.common.pokemon.properties.UncatchableProperty
|
import com.cobblemon.mod.common.pokemon.properties.UncatchableProperty
|
||||||
import com.cobblemon.mod.common.pokemon.stat.CobblemonStatProvider
|
import com.cobblemon.mod.common.pokemon.stat.CobblemonStatProvider
|
||||||
import com.cobblemon.mod.common.pokemon.transformation.triggers.BlockClickTrigger
|
|
||||||
import com.cobblemon.mod.common.starter.CobblemonStarterHandler
|
import com.cobblemon.mod.common.starter.CobblemonStarterHandler
|
||||||
import com.cobblemon.mod.common.util.*
|
import com.cobblemon.mod.common.util.*
|
||||||
import com.cobblemon.mod.common.world.feature.CobblemonPlacedFeatures
|
import com.cobblemon.mod.common.world.feature.CobblemonPlacedFeatures
|
||||||
@@ -274,8 +273,13 @@ object Cobblemon {
|
|||||||
PlatformEvents.RIGHT_CLICK_BLOCK.subscribe { event ->
|
PlatformEvents.RIGHT_CLICK_BLOCK.subscribe { event ->
|
||||||
val player = event.player
|
val player = event.player
|
||||||
val block = player.level().getBlockState(event.pos).block
|
val block = player.level().getBlockState(event.pos).block
|
||||||
val context = BlockClickTrigger.Context(block, player.level())
|
player.party().forEach { pokemon ->
|
||||||
player.party().forEach { pokemon -> pokemon.triggerTransformations<BlockClickTrigger>(context) }
|
pokemon.lockedEvolutions
|
||||||
|
.filterIsInstance<BlockClickEvolution>()
|
||||||
|
.forEach { evolution ->
|
||||||
|
evolution.attemptEvolution(pokemon, BlockClickEvolution.BlockInteractionContext(block, player.level()))
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PlatformEvents.CHANGE_DIMENSION.subscribe {
|
PlatformEvents.CHANGE_DIMENSION.subscribe {
|
||||||
@@ -319,7 +323,6 @@ object Cobblemon {
|
|||||||
|
|
||||||
SHINY_ASPECT.register()
|
SHINY_ASPECT.register()
|
||||||
GENDER_ASPECT.register()
|
GENDER_ASPECT.register()
|
||||||
FORM_ASPECTS.register()
|
|
||||||
COSMETIC_SLOT_ASPECT.register()
|
COSMETIC_SLOT_ASPECT.register()
|
||||||
CHARACTERISTIC_RAINBOW_ASPECT.register()
|
CHARACTERISTIC_RAINBOW_ASPECT.register()
|
||||||
ALPHA_ASPECT.register()
|
ALPHA_ASPECT.register()
|
||||||
|
|||||||
@@ -9,7 +9,6 @@
|
|||||||
package com.cobblemon.mod.common
|
package com.cobblemon.mod.common
|
||||||
|
|
||||||
import com.bedrockk.molang.Expression
|
import com.bedrockk.molang.Expression
|
||||||
import com.cobblemon.mod.common.CobblemonBehaviours.autoPokemonBehaviours
|
|
||||||
import com.cobblemon.mod.common.CobblemonNetwork.sendPacket
|
import com.cobblemon.mod.common.CobblemonNetwork.sendPacket
|
||||||
import com.cobblemon.mod.common.api.ai.CobblemonBehaviour
|
import com.cobblemon.mod.common.api.ai.CobblemonBehaviour
|
||||||
import com.cobblemon.mod.common.api.ai.config.BehaviourConfig
|
import com.cobblemon.mod.common.api.ai.config.BehaviourConfig
|
||||||
@@ -20,7 +19,16 @@ import com.cobblemon.mod.common.api.molang.ExpressionLike
|
|||||||
import com.cobblemon.mod.common.api.npc.configuration.MoLangConfigVariable
|
import com.cobblemon.mod.common.api.npc.configuration.MoLangConfigVariable
|
||||||
import com.cobblemon.mod.common.api.reactive.SimpleObservable
|
import com.cobblemon.mod.common.api.reactive.SimpleObservable
|
||||||
import com.cobblemon.mod.common.net.messages.client.data.BehaviourSyncPacket
|
import com.cobblemon.mod.common.net.messages.client.data.BehaviourSyncPacket
|
||||||
import com.cobblemon.mod.common.util.adapters.*
|
import com.cobblemon.mod.common.util.adapters.ActivityAdapter
|
||||||
|
import com.cobblemon.mod.common.util.adapters.BehaviourConfigAdapter
|
||||||
|
import com.cobblemon.mod.common.util.adapters.ExpressionAdapter
|
||||||
|
import com.cobblemon.mod.common.util.adapters.ExpressionLikeAdapter
|
||||||
|
import com.cobblemon.mod.common.util.adapters.ExpressionOrEntityVariableAdapter
|
||||||
|
import com.cobblemon.mod.common.util.adapters.IdentifierAdapter
|
||||||
|
import com.cobblemon.mod.common.util.adapters.MemoryModuleTypeAdapter
|
||||||
|
import com.cobblemon.mod.common.util.adapters.SensorTypeAdapter
|
||||||
|
import com.cobblemon.mod.common.util.adapters.TaskConfigAdapter
|
||||||
|
import com.cobblemon.mod.common.util.adapters.TranslatedTextAdapter
|
||||||
import com.cobblemon.mod.common.util.cobblemonResource
|
import com.cobblemon.mod.common.util.cobblemonResource
|
||||||
import com.cobblemon.mod.common.util.endsWith
|
import com.cobblemon.mod.common.util.endsWith
|
||||||
import com.google.gson.Gson
|
import com.google.gson.Gson
|
||||||
|
|||||||
@@ -657,11 +657,11 @@ object CobblemonBlocks : PlatformRegistry<Registry<Block>, ResourceKey<Registry<
|
|||||||
@JvmField
|
@JvmField
|
||||||
val SACHET = create("sachet", DecorativeItemBlock(BlockBehaviour.Properties.of().sound(SoundType.WOOL).mapColor(MapColor.NONE).noOcclusion(), DecorativeItemBlock.DecorativeItemBlockType.POUCH))
|
val SACHET = create("sachet", DecorativeItemBlock(BlockBehaviour.Properties.of().sound(SoundType.WOOL).mapColor(MapColor.NONE).noOcclusion(), DecorativeItemBlock.DecorativeItemBlockType.POUCH))
|
||||||
@JvmField
|
@JvmField
|
||||||
val METAL_POWDER = create("metal_powder", DecorativeItemBlock(BlockBehaviour.Properties.of().sound(SoundType.WOOL).mapColor(MapColor.NONE).noOcclusion(), DecorativeItemBlock.DecorativeItemBlockType.POUCH))
|
val METAL_POWDER = create("metal_powder", DecorativeItemBlock(BlockBehaviour.Properties.of().sound(CobblemonSounds.ITEM_BLOCK_POWDER_SOUNDS).mapColor(MapColor.NONE).noOcclusion(), DecorativeItemBlock.DecorativeItemBlockType.POUCH))
|
||||||
@JvmField
|
@JvmField
|
||||||
val QUICK_POWDER = create("quick_powder", DecorativeItemBlock(BlockBehaviour.Properties.of().sound(SoundType.WOOL).mapColor(MapColor.NONE).noOcclusion(), DecorativeItemBlock.DecorativeItemBlockType.POUCH))
|
val QUICK_POWDER = create("quick_powder", DecorativeItemBlock(BlockBehaviour.Properties.of().sound(CobblemonSounds.ITEM_BLOCK_POWDER_SOUNDS).mapColor(MapColor.NONE).noOcclusion(), DecorativeItemBlock.DecorativeItemBlockType.POUCH))
|
||||||
@JvmField
|
@JvmField
|
||||||
val BRIGHT_POWDER = create("bright_powder", DecorativeItemBlock(BlockBehaviour.Properties.of().sound(SoundType.WOOL).mapColor(MapColor.NONE).noOcclusion().lightLevel{3}, DecorativeItemBlock.DecorativeItemBlockType.POUCH))
|
val BRIGHT_POWDER = create("bright_powder", DecorativeItemBlock(BlockBehaviour.Properties.of().sound(CobblemonSounds.ITEM_BLOCK_POWDER_SOUNDS).mapColor(MapColor.NONE).noOcclusion().lightLevel{3}, DecorativeItemBlock.DecorativeItemBlockType.POUCH))
|
||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val NEVER_MELT_ICE = create("never_melt_ice", DecorativeItemBlock(BlockBehaviour.Properties.of().sound(SoundType.GLASS).mapColor(MapColor.NONE).noOcclusion().friction(0.989F), DecorativeItemBlock.DecorativeItemBlockType.NEVERMELT))
|
val NEVER_MELT_ICE = create("never_melt_ice", DecorativeItemBlock(BlockBehaviour.Properties.of().sound(SoundType.GLASS).mapColor(MapColor.NONE).noOcclusion().friction(0.989F), DecorativeItemBlock.DecorativeItemBlockType.NEVERMELT))
|
||||||
@@ -691,7 +691,7 @@ object CobblemonBlocks : PlatformRegistry<Registry<Block>, ResourceKey<Registry<
|
|||||||
val EJECT_BUTTON = create("eject_button", EjectButtonBlock(BlockBehaviour.Properties.of().sound(SoundType.METAL).mapColor(MapColor.NONE).pushReaction(PushReaction.DESTROY).noOcclusion().strength(0.125f), 40))
|
val EJECT_BUTTON = create("eject_button", EjectButtonBlock(BlockBehaviour.Properties.of().sound(SoundType.METAL).mapColor(MapColor.NONE).pushReaction(PushReaction.DESTROY).noOcclusion().strength(0.125f), 40))
|
||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val LOADED_DICE = create("loaded_dice", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.CANDLE).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.DICE))
|
val LOADED_DICE = create("loaded_dice", StackableItemBlock(BlockBehaviour.Properties.of().sound(CobblemonSounds.ITEM_BLOCK_DICE_SOUNDS).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.DICE))
|
||||||
@JvmField
|
@JvmField
|
||||||
val IRON_BALL = create("iron_ball", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.METAL).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.IRON_BALL))
|
val IRON_BALL = create("iron_ball", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.METAL).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.IRON_BALL))
|
||||||
@JvmField
|
@JvmField
|
||||||
@@ -702,40 +702,40 @@ object CobblemonBlocks : PlatformRegistry<Registry<Block>, ResourceKey<Registry<
|
|||||||
val DUBIOUS_DISC = create("dubious_disc", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.CANDLE).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.UPGRADE))
|
val DUBIOUS_DISC = create("dubious_disc", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.CANDLE).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.UPGRADE))
|
||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val THROAT_SPRAY = create("throat_spray", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.CANDLE).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.THROAT_SPRAY))
|
val THROAT_SPRAY = create("throat_spray", StackableItemBlock(BlockBehaviour.Properties.of().sound(CobblemonSounds.ITEM_BLOCK_BOTTLE_LIQUID_SOUNDS).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.THROAT_SPRAY))
|
||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val FULL_HEAL = create("full_heal", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.CANDLE).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.STATUS_RESTORE))
|
val FULL_HEAL = create("full_heal", StackableItemBlock(BlockBehaviour.Properties.of().sound(CobblemonSounds.ITEM_BLOCK_BOTTLE_LIQUID_SOUNDS).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.STATUS_RESTORE))
|
||||||
@JvmField
|
@JvmField
|
||||||
val ANTIDOTE = create("antidote", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.CANDLE).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.STATUS_RESTORE))
|
val ANTIDOTE = create("antidote", StackableItemBlock(BlockBehaviour.Properties.of().sound(CobblemonSounds.ITEM_BLOCK_BOTTLE_LIQUID_SOUNDS).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.STATUS_RESTORE))
|
||||||
@JvmField
|
@JvmField
|
||||||
val AWAKENING = create("awakening", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.CANDLE).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.STATUS_RESTORE))
|
val AWAKENING = create("awakening", StackableItemBlock(BlockBehaviour.Properties.of().sound(CobblemonSounds.ITEM_BLOCK_BOTTLE_LIQUID_SOUNDS).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.STATUS_RESTORE))
|
||||||
@JvmField
|
@JvmField
|
||||||
val BURN_HEAL = create("burn_heal", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.CANDLE).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.STATUS_RESTORE))
|
val BURN_HEAL = create("burn_heal", StackableItemBlock(BlockBehaviour.Properties.of().sound(CobblemonSounds.ITEM_BLOCK_BOTTLE_LIQUID_SOUNDS).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.STATUS_RESTORE))
|
||||||
@JvmField
|
@JvmField
|
||||||
val ICE_HEAL = create("ice_heal", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.CANDLE).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.STATUS_RESTORE))
|
val ICE_HEAL = create("ice_heal", StackableItemBlock(BlockBehaviour.Properties.of().sound(CobblemonSounds.ITEM_BLOCK_BOTTLE_LIQUID_SOUNDS).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.STATUS_RESTORE))
|
||||||
@JvmField
|
@JvmField
|
||||||
val PARALYZE_HEAL = create("paralyze_heal", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.CANDLE).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.STATUS_RESTORE))
|
val PARALYZE_HEAL = create("paralyze_heal", StackableItemBlock(BlockBehaviour.Properties.of().sound(CobblemonSounds.ITEM_BLOCK_BOTTLE_LIQUID_SOUNDS).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.STATUS_RESTORE))
|
||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val ETHER = create("ether", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.CANDLE).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.ETHER))
|
val ETHER = create("ether", StackableItemBlock(BlockBehaviour.Properties.of().sound(CobblemonSounds.ITEM_BLOCK_BOTTLE_LIQUID_SOUNDS).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.ETHER))
|
||||||
@JvmField
|
@JvmField
|
||||||
val MAX_ETHER = create("max_ether", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.CANDLE).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.ETHER))
|
val MAX_ETHER = create("max_ether", StackableItemBlock(BlockBehaviour.Properties.of().sound(CobblemonSounds.ITEM_BLOCK_BOTTLE_LIQUID_SOUNDS).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.ETHER))
|
||||||
@JvmField
|
@JvmField
|
||||||
val ELIXIR = create("elixir", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.CANDLE).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.ETHER))
|
val ELIXIR = create("elixir", StackableItemBlock(BlockBehaviour.Properties.of().sound(CobblemonSounds.ITEM_BLOCK_BOTTLE_LIQUID_SOUNDS).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.ETHER))
|
||||||
@JvmField
|
@JvmField
|
||||||
val MAX_ELIXIR = create("max_elixir", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.CANDLE).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.ETHER))
|
val MAX_ELIXIR = create("max_elixir", StackableItemBlock(BlockBehaviour.Properties.of().sound(CobblemonSounds.ITEM_BLOCK_BOTTLE_LIQUID_SOUNDS).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.ETHER))
|
||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val POTION = create("potion", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.CANDLE).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.POTION))
|
val POTION = create("potion", StackableItemBlock(BlockBehaviour.Properties.of().sound(CobblemonSounds.ITEM_BLOCK_BOTTLE_LIQUID_SOUNDS).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.POTION))
|
||||||
@JvmField
|
@JvmField
|
||||||
val SUPER_POTION = create("super_potion", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.CANDLE).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.POTION))
|
val SUPER_POTION = create("super_potion", StackableItemBlock(BlockBehaviour.Properties.of().sound(CobblemonSounds.ITEM_BLOCK_BOTTLE_LIQUID_SOUNDS).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.POTION))
|
||||||
@JvmField
|
@JvmField
|
||||||
val HYPER_POTION = create("hyper_potion", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.CANDLE).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.POTION))
|
val HYPER_POTION = create("hyper_potion", StackableItemBlock(BlockBehaviour.Properties.of().sound(CobblemonSounds.ITEM_BLOCK_BOTTLE_LIQUID_SOUNDS).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.POTION))
|
||||||
@JvmField
|
@JvmField
|
||||||
val MAX_POTION = create("max_potion", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.CANDLE).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.MAX_POTION))
|
val MAX_POTION = create("max_potion", StackableItemBlock(BlockBehaviour.Properties.of().sound(CobblemonSounds.ITEM_BLOCK_BOTTLE_LIQUID_SOUNDS).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.MAX_POTION))
|
||||||
@JvmField
|
@JvmField
|
||||||
val FULL_RESTORE = create("full_restore", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.CANDLE).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.MAX_POTION))
|
val FULL_RESTORE = create("full_restore", StackableItemBlock(BlockBehaviour.Properties.of().sound(CobblemonSounds.ITEM_BLOCK_BOTTLE_LIQUID_SOUNDS).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.MAX_POTION))
|
||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val DIRE_HIT = create("dire_hit", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.CANDLE).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.BATTLE_ITEM))
|
val DIRE_HIT = create("dire_hit", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.CANDLE).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.BATTLE_ITEM))
|
||||||
@@ -755,21 +755,21 @@ object CobblemonBlocks : PlatformRegistry<Registry<Block>, ResourceKey<Registry<
|
|||||||
val X_SPEED = create("x_${Stats.SPEED.identifier.path}", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.CANDLE).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.BATTLE_ITEM))
|
val X_SPEED = create("x_${Stats.SPEED.identifier.path}", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.CANDLE).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.BATTLE_ITEM))
|
||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val HP_UP = create("hp_up", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.CANDLE).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.VITAMIN))
|
val HP_UP = create("hp_up", StackableItemBlock(BlockBehaviour.Properties.of().sound(CobblemonSounds.ITEM_BLOCK_BOTTLE_PILLS_SOUNDS).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.VITAMIN))
|
||||||
@JvmField
|
@JvmField
|
||||||
val PROTEIN = create("protein", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.CANDLE).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.VITAMIN))
|
val PROTEIN = create("protein", StackableItemBlock(BlockBehaviour.Properties.of().sound(CobblemonSounds.ITEM_BLOCK_BOTTLE_PILLS_SOUNDS).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.VITAMIN))
|
||||||
@JvmField
|
@JvmField
|
||||||
val IRON = create("iron", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.CANDLE).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.VITAMIN))
|
val IRON = create("iron", StackableItemBlock(BlockBehaviour.Properties.of().sound(CobblemonSounds.ITEM_BLOCK_BOTTLE_PILLS_SOUNDS).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.VITAMIN))
|
||||||
@JvmField
|
@JvmField
|
||||||
val CARBOS = create("carbos", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.CANDLE).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.VITAMIN))
|
val CARBOS = create("carbos", StackableItemBlock(BlockBehaviour.Properties.of().sound(CobblemonSounds.ITEM_BLOCK_BOTTLE_PILLS_SOUNDS).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.VITAMIN))
|
||||||
@JvmField
|
@JvmField
|
||||||
val CALCIUM = create("calcium", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.CANDLE).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.VITAMIN))
|
val CALCIUM = create("calcium", StackableItemBlock(BlockBehaviour.Properties.of().sound(CobblemonSounds.ITEM_BLOCK_BOTTLE_PILLS_SOUNDS).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.VITAMIN))
|
||||||
@JvmField
|
@JvmField
|
||||||
val ZINC = create("zinc", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.CANDLE).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.VITAMIN))
|
val ZINC = create("zinc", StackableItemBlock(BlockBehaviour.Properties.of().sound(CobblemonSounds.ITEM_BLOCK_BOTTLE_PILLS_SOUNDS).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.VITAMIN))
|
||||||
@JvmField
|
@JvmField
|
||||||
val PP_UP = create("pp_up", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.CANDLE).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.VITAMIN))
|
val PP_UP = create("pp_up", StackableItemBlock(BlockBehaviour.Properties.of().sound(CobblemonSounds.ITEM_BLOCK_BOTTLE_PILLS_SOUNDS).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.VITAMIN))
|
||||||
@JvmField
|
@JvmField
|
||||||
val PP_MAX = create("pp_max", StackableItemBlock(BlockBehaviour.Properties.of().sound(SoundType.CANDLE).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.VITAMIN))
|
val PP_MAX = create("pp_max", StackableItemBlock(BlockBehaviour.Properties.of().sound(CobblemonSounds.ITEM_BLOCK_BOTTLE_PILLS_SOUNDS).mapColor(MapColor.NONE).noOcclusion(), StackableItemBlock.StackableItemBlockType.VITAMIN))
|
||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val MONITOR = create("monitor", MonitorBlock(BlockBehaviour.Properties.of().mapColor(MapColor.METAL).sound(SoundType.METAL).pushReaction(PushReaction.BLOCK).requiresCorrectToolForDrops().strength(5.0F, 6.0F).lightLevel { if (it.getValue(MonitorBlock.SCREEN) != MonitorBlock.MonitorScreen.OFF) 13 else 0 }))
|
val MONITOR = create("monitor", MonitorBlock(BlockBehaviour.Properties.of().mapColor(MapColor.METAL).sound(SoundType.METAL).pushReaction(PushReaction.BLOCK).requiresCorrectToolForDrops().strength(5.0F, 6.0F).lightLevel { if (it.getValue(MonitorBlock.SCREEN) != MonitorBlock.MonitorScreen.OFF) 13 else 0 }))
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import com.cobblemon.mod.common.api.net.NetworkPacket
|
|||||||
import com.mojang.brigadier.arguments.ArgumentType
|
import com.mojang.brigadier.arguments.ArgumentType
|
||||||
import kotlin.reflect.KClass
|
import kotlin.reflect.KClass
|
||||||
import net.minecraft.commands.synchronization.ArgumentTypeInfo
|
import net.minecraft.commands.synchronization.ArgumentTypeInfo
|
||||||
|
import net.minecraft.core.HolderLookup
|
||||||
import net.minecraft.resources.ResourceKey
|
import net.minecraft.resources.ResourceKey
|
||||||
import net.minecraft.resources.ResourceLocation
|
import net.minecraft.resources.ResourceLocation
|
||||||
import net.minecraft.server.MinecraftServer
|
import net.minecraft.server.MinecraftServer
|
||||||
@@ -19,6 +20,7 @@ import net.minecraft.server.level.ServerPlayer
|
|||||||
import net.minecraft.server.packs.PackType
|
import net.minecraft.server.packs.PackType
|
||||||
import net.minecraft.server.packs.resources.PreparableReloadListener
|
import net.minecraft.server.packs.resources.PreparableReloadListener
|
||||||
import net.minecraft.tags.TagKey
|
import net.minecraft.tags.TagKey
|
||||||
|
import net.minecraft.world.inventory.MenuType
|
||||||
import net.minecraft.world.level.GameRules
|
import net.minecraft.world.level.GameRules
|
||||||
import net.minecraft.world.level.ItemLike
|
import net.minecraft.world.level.ItemLike
|
||||||
import net.minecraft.world.level.biome.Biome
|
import net.minecraft.world.level.biome.Biome
|
||||||
@@ -167,12 +169,16 @@ interface CobblemonImplementation {
|
|||||||
* TODO
|
* TODO
|
||||||
*
|
*
|
||||||
* @param identifier
|
* @param identifier
|
||||||
* @param reloader
|
* @param reloaderFactory
|
||||||
* @param type
|
* @param type
|
||||||
* @param dependencies
|
* @param dependencies
|
||||||
*/
|
*/
|
||||||
fun registerResourceReloader(identifier: ResourceLocation, reloader: PreparableReloadListener, type: PackType, dependencies: Collection<ResourceLocation>)
|
fun registerResourceReloader(
|
||||||
|
identifier: ResourceLocation,
|
||||||
|
type: PackType,
|
||||||
|
dependencies: Collection<ResourceLocation>,
|
||||||
|
reloaderFactory: (HolderLookup.Provider) -> PreparableReloadListener
|
||||||
|
)
|
||||||
/**
|
/**
|
||||||
* TODO
|
* TODO
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -15,12 +15,12 @@ import com.cobblemon.mod.common.api.moves.animations.ActionEffectContext
|
|||||||
import com.mojang.serialization.Codec
|
import com.mojang.serialization.Codec
|
||||||
import com.mojang.serialization.codecs.ListCodec
|
import com.mojang.serialization.codecs.ListCodec
|
||||||
import com.mojang.serialization.codecs.PrimitiveCodec
|
import com.mojang.serialization.codecs.PrimitiveCodec
|
||||||
import java.util.Optional
|
|
||||||
import java.util.UUID
|
|
||||||
import net.minecraft.core.BlockPos
|
import net.minecraft.core.BlockPos
|
||||||
|
import net.minecraft.core.GlobalPos
|
||||||
import net.minecraft.core.UUIDUtil
|
import net.minecraft.core.UUIDUtil
|
||||||
import net.minecraft.world.entity.LivingEntity
|
import net.minecraft.world.entity.LivingEntity
|
||||||
import net.minecraft.world.entity.ai.memory.MemoryModuleType
|
import net.minecraft.world.entity.ai.memory.MemoryModuleType
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
object CobblemonMemories {
|
object CobblemonMemories {
|
||||||
val memories = mutableMapOf<String, MemoryModuleType<*>>()
|
val memories = mutableMapOf<String, MemoryModuleType<*>>()
|
||||||
|
|||||||
@@ -107,9 +107,6 @@ import com.cobblemon.mod.common.net.messages.client.pokemon.update.evolution.Add
|
|||||||
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.ClientboundSeatAssignmentPacket
|
import com.cobblemon.mod.common.net.messages.client.pokemon.update.evolution.ClientboundSeatAssignmentPacket
|
||||||
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.pokemon.update.form.AddFormPacket
|
|
||||||
import com.cobblemon.mod.common.net.messages.client.pokemon.update.form.ClearFormsPacket
|
|
||||||
import com.cobblemon.mod.common.net.messages.client.pokemon.update.form.RemoveFormPacket
|
|
||||||
import com.cobblemon.mod.common.net.messages.client.settings.OpenCobblemonConfigScreenPacket
|
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
|
||||||
@@ -197,8 +194,6 @@ import com.cobblemon.mod.common.net.messages.server.pokemon.update.SetItemHidden
|
|||||||
import com.cobblemon.mod.common.net.messages.server.pokemon.update.SetMarkingsPacket
|
import com.cobblemon.mod.common.net.messages.server.pokemon.update.SetMarkingsPacket
|
||||||
import com.cobblemon.mod.common.net.messages.server.pokemon.update.SetNicknamePacket
|
import com.cobblemon.mod.common.net.messages.server.pokemon.update.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.pokemon.update.form.AcceptFormPacket
|
|
||||||
import com.cobblemon.mod.common.net.messages.server.pokemon.update.form.RevertFormPacket
|
|
||||||
import com.cobblemon.mod.common.net.messages.server.riding.DismountPokemonPacket
|
import com.cobblemon.mod.common.net.messages.server.riding.DismountPokemonPacket
|
||||||
import com.cobblemon.mod.common.net.messages.server.riding.ServerboundUpdateDriverInputPacket
|
import com.cobblemon.mod.common.net.messages.server.riding.ServerboundUpdateDriverInputPacket
|
||||||
import com.cobblemon.mod.common.net.messages.server.riding.ServerboundUpdatePassengerPositionPacket
|
import com.cobblemon.mod.common.net.messages.server.riding.ServerboundUpdatePassengerPositionPacket
|
||||||
@@ -216,11 +211,9 @@ import com.cobblemon.mod.common.net.messages.server.trade.ChangeTradeAcceptanceP
|
|||||||
import com.cobblemon.mod.common.net.messages.server.trade.OfferTradePacket
|
import com.cobblemon.mod.common.net.messages.server.trade.OfferTradePacket
|
||||||
import com.cobblemon.mod.common.net.messages.server.trade.PerformTradePacket
|
import com.cobblemon.mod.common.net.messages.server.trade.PerformTradePacket
|
||||||
import com.cobblemon.mod.common.net.messages.server.trade.UpdateTradeOfferPacket
|
import com.cobblemon.mod.common.net.messages.server.trade.UpdateTradeOfferPacket
|
||||||
import com.cobblemon.mod.common.net.serverhandling.AcceptFormHandler
|
|
||||||
import com.cobblemon.mod.common.net.serverhandling.ChallengeHandler
|
import com.cobblemon.mod.common.net.serverhandling.ChallengeHandler
|
||||||
import com.cobblemon.mod.common.net.serverhandling.ChallengeResponseHandler
|
import com.cobblemon.mod.common.net.serverhandling.ChallengeResponseHandler
|
||||||
import com.cobblemon.mod.common.net.serverhandling.RequestInteractionsHandler
|
import com.cobblemon.mod.common.net.serverhandling.RequestInteractionsHandler
|
||||||
import com.cobblemon.mod.common.net.serverhandling.RevertFormHandler
|
|
||||||
import com.cobblemon.mod.common.net.serverhandling.battle.BattleSelectActionsHandler
|
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.RemoveSpectatorHandler
|
||||||
import com.cobblemon.mod.common.net.serverhandling.battle.SpectateBattleHandler
|
import com.cobblemon.mod.common.net.serverhandling.battle.SpectateBattleHandler
|
||||||
@@ -432,6 +425,7 @@ object CobblemonNetwork {
|
|||||||
list.add(PacketRegisterInfo(MovesRegistrySyncPacket.ID, MovesRegistrySyncPacket::decode, DataRegistrySyncPacketHandler()))
|
list.add(PacketRegisterInfo(MovesRegistrySyncPacket.ID, MovesRegistrySyncPacket::decode, DataRegistrySyncPacketHandler()))
|
||||||
list.add(PacketRegisterInfo(BerryRegistrySyncPacket.ID, BerryRegistrySyncPacket::decode, DataRegistrySyncPacketHandler()))
|
list.add(PacketRegisterInfo(BerryRegistrySyncPacket.ID, BerryRegistrySyncPacket::decode, DataRegistrySyncPacketHandler()))
|
||||||
list.add(PacketRegisterInfo(SpeciesRegistrySyncPacket.ID, SpeciesRegistrySyncPacket::decode, DataRegistrySyncPacketHandler()))
|
list.add(PacketRegisterInfo(SpeciesRegistrySyncPacket.ID, SpeciesRegistrySyncPacket::decode, DataRegistrySyncPacketHandler()))
|
||||||
|
list.add(PacketRegisterInfo(SpeciesEvolutionSyncPacket.ID, SpeciesEvolutionSyncPacket::decode, DataRegistrySyncPacketHandler()))
|
||||||
list.add(PacketRegisterInfo(PropertiesCompletionRegistrySyncPacket.ID, PropertiesCompletionRegistrySyncPacket::decode, DataRegistrySyncPacketHandler()))
|
list.add(PacketRegisterInfo(PropertiesCompletionRegistrySyncPacket.ID, PropertiesCompletionRegistrySyncPacket::decode, DataRegistrySyncPacketHandler()))
|
||||||
list.add(PacketRegisterInfo(StandardSpeciesFeatureSyncPacket.ID, StandardSpeciesFeatureSyncPacket::decode, DataRegistrySyncPacketHandler()))
|
list.add(PacketRegisterInfo(StandardSpeciesFeatureSyncPacket.ID, StandardSpeciesFeatureSyncPacket::decode, DataRegistrySyncPacketHandler()))
|
||||||
list.add(PacketRegisterInfo(GlobalSpeciesFeatureSyncPacket.ID, GlobalSpeciesFeatureSyncPacket::decode, DataRegistrySyncPacketHandler()))
|
list.add(PacketRegisterInfo(GlobalSpeciesFeatureSyncPacket.ID, GlobalSpeciesFeatureSyncPacket::decode, DataRegistrySyncPacketHandler()))
|
||||||
@@ -513,11 +507,6 @@ object CobblemonNetwork {
|
|||||||
// Pokédex scanning
|
// Pokédex scanning
|
||||||
list.add(PacketRegisterInfo(ServerConfirmedRegisterPacket.ID, ServerConfirmedRegisterPacket::decode, ServerConfirmedRegisterHandler))
|
list.add(PacketRegisterInfo(ServerConfirmedRegisterPacket.ID, ServerConfirmedRegisterPacket::decode, ServerConfirmedRegisterHandler))
|
||||||
|
|
||||||
// Form packets
|
|
||||||
list.add(PacketRegisterInfo(AddFormPacket.ID, AddFormPacket::decode, PokemonUpdatePacketHandler()))
|
|
||||||
list.add(PacketRegisterInfo(ClearFormsPacket.ID, ClearFormsPacket::decode, PokemonUpdatePacketHandler()))
|
|
||||||
list.add(PacketRegisterInfo(RemoveFormPacket.ID, RemoveFormPacket::decode, PokemonUpdatePacketHandler()))
|
|
||||||
|
|
||||||
// Riding
|
// Riding
|
||||||
list.add(PacketRegisterInfo(ClientboundUpdateRidingStatePacket.ID, ClientboundUpdateRidingStatePacket::decode, ClientboundUpdateRidingStateHandler))
|
list.add(PacketRegisterInfo(ClientboundUpdateRidingStatePacket.ID, ClientboundUpdateRidingStatePacket::decode, ClientboundUpdateRidingStateHandler))
|
||||||
list.add(PacketRegisterInfo(ClientboundUpdateDriverInputPacket.ID, ClientboundUpdateDriverInputPacket::decode, ClientboundUpdateDriverInputHandler))
|
list.add(PacketRegisterInfo(ClientboundUpdateDriverInputPacket.ID, ClientboundUpdateDriverInputPacket::decode, ClientboundUpdateDriverInputHandler))
|
||||||
@@ -633,10 +622,6 @@ object CobblemonNetwork {
|
|||||||
// NPC packets
|
// NPC packets
|
||||||
list.add(PacketRegisterInfo(SaveNPCPacket.ID, SaveNPCPacket::decode, SaveNPCHandler))
|
list.add(PacketRegisterInfo(SaveNPCPacket.ID, SaveNPCPacket::decode, SaveNPCHandler))
|
||||||
|
|
||||||
// Form Packets
|
|
||||||
list.add(PacketRegisterInfo(AcceptFormPacket.ID, AcceptFormPacket::decode, AcceptFormHandler))
|
|
||||||
list.add(PacketRegisterInfo(RevertFormPacket.ID, RevertFormPacket::decode, RevertFormHandler))
|
|
||||||
|
|
||||||
// Riding packet(s)
|
// Riding packet(s)
|
||||||
list.add(PacketRegisterInfo(ServerboundUpdateOrientationPacket.ID, ServerboundUpdateOrientationPacket::decode, ServerboundUpdateOrientationHandler))
|
list.add(PacketRegisterInfo(ServerboundUpdateOrientationPacket.ID, ServerboundUpdateOrientationPacket::decode, ServerboundUpdateOrientationHandler))
|
||||||
list.add(PacketRegisterInfo(ServerboundUpdateRidingStatePacket.ID, ServerboundUpdateRidingStatePacket::decode, ServerboundUpdateRidingStateHandler))
|
list.add(PacketRegisterInfo(ServerboundUpdateRidingStatePacket.ID, ServerboundUpdateRidingStatePacket::decode, ServerboundUpdateRidingStateHandler))
|
||||||
|
|||||||
@@ -9,9 +9,9 @@
|
|||||||
package com.cobblemon.mod.common
|
package com.cobblemon.mod.common
|
||||||
|
|
||||||
import com.cobblemon.mod.common.entity.pokemon.ai.sensors.*
|
import com.cobblemon.mod.common.entity.pokemon.ai.sensors.*
|
||||||
|
import com.cobblemon.mod.common.pokemon.ai.PokemonDisturbancesSensor
|
||||||
import com.cobblemon.mod.common.entity.sensor.BattlingPokemonSensor
|
import com.cobblemon.mod.common.entity.sensor.BattlingPokemonSensor
|
||||||
import com.cobblemon.mod.common.entity.sensor.NPCBattlingSensor
|
import com.cobblemon.mod.common.entity.sensor.NPCBattlingSensor
|
||||||
import com.cobblemon.mod.common.pokemon.ai.PokemonDisturbancesSensor
|
|
||||||
import java.util.function.Supplier
|
import java.util.function.Supplier
|
||||||
import net.minecraft.world.entity.Entity
|
import net.minecraft.world.entity.Entity
|
||||||
import net.minecraft.world.entity.ai.sensing.Sensor
|
import net.minecraft.world.entity.ai.sensing.Sensor
|
||||||
|
|||||||
@@ -657,5 +657,65 @@ object CobblemonSounds : PlatformRegistry<Registry<SoundEvent>, ResourceKey<Regi
|
|||||||
SoundEvents.WOOL_FALL
|
SoundEvents.WOOL_FALL
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@JvmField
|
||||||
|
val ITEM_BLOCK_POWDER_PLACE = this.create("block.item_block.powder.place")
|
||||||
|
@JvmField
|
||||||
|
val ITEM_BLOCK_POWDER_BREAK = this.create("block.item_block.powder.break")
|
||||||
|
@JvmField
|
||||||
|
val ITEM_BLOCK_POWDER_STEP = this.create("block.item_block.powder.step")
|
||||||
|
@JvmField
|
||||||
|
val ITEM_BLOCK_POWDER_SOUNDS = SoundType(1f, 1.1f,
|
||||||
|
ITEM_BLOCK_POWDER_BREAK,
|
||||||
|
ITEM_BLOCK_POWDER_STEP,
|
||||||
|
ITEM_BLOCK_POWDER_PLACE,
|
||||||
|
ITEM_BLOCK_POWDER_STEP,
|
||||||
|
ITEM_BLOCK_POWDER_STEP
|
||||||
|
)
|
||||||
|
|
||||||
|
@JvmField
|
||||||
|
val ITEM_BLOCK_BOTTLE_LIQUID_PLACE = this.create("block.item_block.bottle_liquid.place")
|
||||||
|
@JvmField
|
||||||
|
val ITEM_BLOCK_BOTTLE_LIQUID_BREAK = this.create("block.item_block.bottle_liquid.break")
|
||||||
|
@JvmField
|
||||||
|
val ITEM_BLOCK_BOTTLE_LIQUID_STEP = this.create("block.item_block.bottle_liquid.step")
|
||||||
|
@JvmField
|
||||||
|
val ITEM_BLOCK_BOTTLE_LIQUID_SOUNDS = SoundType(1f, 1.1f,
|
||||||
|
ITEM_BLOCK_BOTTLE_LIQUID_BREAK,
|
||||||
|
ITEM_BLOCK_BOTTLE_LIQUID_STEP,
|
||||||
|
ITEM_BLOCK_BOTTLE_LIQUID_PLACE,
|
||||||
|
ITEM_BLOCK_BOTTLE_LIQUID_PLACE,
|
||||||
|
ITEM_BLOCK_BOTTLE_LIQUID_PLACE
|
||||||
|
)
|
||||||
|
|
||||||
|
@JvmField
|
||||||
|
val ITEM_BLOCK_BOTTLE_PILLS_PLACE = this.create("block.item_block.bottle_pills.place")
|
||||||
|
@JvmField
|
||||||
|
val ITEM_BLOCK_BOTTLE_PILLS_BREAK = this.create("block.item_block.bottle_pills.break")
|
||||||
|
@JvmField
|
||||||
|
val ITEM_BLOCK_BOTTLE_PILLS_STEP = this.create("block.item_block.bottle_pills.step")
|
||||||
|
@JvmField
|
||||||
|
val ITEM_BLOCK_BOTTLE_PILLS_SOUNDS = SoundType(1f, 1.1f,
|
||||||
|
ITEM_BLOCK_BOTTLE_PILLS_BREAK,
|
||||||
|
ITEM_BLOCK_BOTTLE_PILLS_STEP,
|
||||||
|
ITEM_BLOCK_BOTTLE_PILLS_PLACE,
|
||||||
|
ITEM_BLOCK_BOTTLE_PILLS_PLACE,
|
||||||
|
ITEM_BLOCK_BOTTLE_PILLS_PLACE
|
||||||
|
)
|
||||||
|
|
||||||
|
@JvmField
|
||||||
|
val ITEM_BLOCK_DICE_PLACE = this.create("block.item_block.dice.place")
|
||||||
|
@JvmField
|
||||||
|
val ITEM_BLOCK_DICE_BREAK = this.create("block.item_block.dice.break")
|
||||||
|
@JvmField
|
||||||
|
val ITEM_BLOCK_DICE_STEP = this.create("block.item_block.dice.step")
|
||||||
|
@JvmField
|
||||||
|
val ITEM_BLOCK_DICE_SOUNDS = SoundType(1f, 1.1f,
|
||||||
|
ITEM_BLOCK_DICE_BREAK,
|
||||||
|
ITEM_BLOCK_DICE_STEP,
|
||||||
|
ITEM_BLOCK_DICE_PLACE,
|
||||||
|
ITEM_BLOCK_DICE_STEP,
|
||||||
|
ITEM_BLOCK_DICE_STEP
|
||||||
|
)
|
||||||
|
|
||||||
private fun create(name: String): SoundEvent = this.create(name, SoundEvent.createVariableRangeEvent(cobblemonResource(name)))
|
private fun create(name: String): SoundEvent = this.create(name, SoundEvent.createVariableRangeEvent(cobblemonResource(name)))
|
||||||
}
|
}
|
||||||
@@ -8,7 +8,6 @@
|
|||||||
|
|
||||||
package com.cobblemon.mod.common
|
package com.cobblemon.mod.common
|
||||||
|
|
||||||
import java.util.Optional
|
|
||||||
import net.minecraft.core.registries.BuiltInRegistries
|
import net.minecraft.core.registries.BuiltInRegistries
|
||||||
import net.minecraft.util.RandomSource
|
import net.minecraft.util.RandomSource
|
||||||
import net.minecraft.world.entity.Entity
|
import net.minecraft.world.entity.Entity
|
||||||
@@ -19,6 +18,7 @@ import net.minecraft.world.item.ItemStack
|
|||||||
import net.minecraft.world.item.Items
|
import net.minecraft.world.item.Items
|
||||||
import net.minecraft.world.item.trading.ItemCost
|
import net.minecraft.world.item.trading.ItemCost
|
||||||
import net.minecraft.world.item.trading.MerchantOffer
|
import net.minecraft.world.item.trading.MerchantOffer
|
||||||
|
import java.util.Optional
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A generator for various trade offers in the mod.
|
* A generator for various trade offers in the mod.
|
||||||
|
|||||||
+1
-1
@@ -11,10 +11,10 @@ package com.cobblemon.mod.common.advancement.criterion
|
|||||||
import com.cobblemon.mod.common.util.cobblemonResource
|
import com.cobblemon.mod.common.util.cobblemonResource
|
||||||
import com.mojang.serialization.Codec
|
import com.mojang.serialization.Codec
|
||||||
import com.mojang.serialization.codecs.RecordCodecBuilder
|
import com.mojang.serialization.codecs.RecordCodecBuilder
|
||||||
import java.util.Optional
|
|
||||||
import net.minecraft.advancements.critereon.ContextAwarePredicate
|
import net.minecraft.advancements.critereon.ContextAwarePredicate
|
||||||
import net.minecraft.resources.ResourceLocation
|
import net.minecraft.resources.ResourceLocation
|
||||||
import net.minecraft.server.level.ServerPlayer
|
import net.minecraft.server.level.ServerPlayer
|
||||||
|
import java.util.Optional
|
||||||
|
|
||||||
class AspectCriterion(
|
class AspectCriterion(
|
||||||
playerCtx: Optional<ContextAwarePredicate>,
|
playerCtx: Optional<ContextAwarePredicate>,
|
||||||
|
|||||||
+1
-1
@@ -14,8 +14,8 @@ import com.mojang.serialization.codecs.RecordCodecBuilder
|
|||||||
import java.util.Optional
|
import java.util.Optional
|
||||||
import net.minecraft.advancements.critereon.ContextAwarePredicate
|
import net.minecraft.advancements.critereon.ContextAwarePredicate
|
||||||
import net.minecraft.advancements.critereon.EntityPredicate
|
import net.minecraft.advancements.critereon.EntityPredicate
|
||||||
import net.minecraft.resources.ResourceLocation
|
|
||||||
import net.minecraft.server.level.ServerPlayer
|
import net.minecraft.server.level.ServerPlayer
|
||||||
|
import net.minecraft.resources.ResourceLocation
|
||||||
|
|
||||||
class CastPokeRodContext(val baitId: ResourceLocation)
|
class CastPokeRodContext(val baitId: ResourceLocation)
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -10,10 +10,10 @@ package com.cobblemon.mod.common.advancement.criterion
|
|||||||
|
|
||||||
import com.mojang.serialization.Codec
|
import com.mojang.serialization.Codec
|
||||||
import com.mojang.serialization.codecs.RecordCodecBuilder
|
import com.mojang.serialization.codecs.RecordCodecBuilder
|
||||||
import java.util.Optional
|
|
||||||
import net.minecraft.advancements.critereon.ContextAwarePredicate
|
import net.minecraft.advancements.critereon.ContextAwarePredicate
|
||||||
import net.minecraft.advancements.critereon.EntityPredicate
|
import net.minecraft.advancements.critereon.EntityPredicate
|
||||||
import net.minecraft.server.level.ServerPlayer
|
import net.minecraft.server.level.ServerPlayer
|
||||||
|
import java.util.Optional
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A context that is used when you require a [CountableContext] along with some type string.
|
* A context that is used when you require a [CountableContext] along with some type string.
|
||||||
|
|||||||
+1
-1
@@ -14,8 +14,8 @@ import com.mojang.serialization.codecs.RecordCodecBuilder
|
|||||||
import java.util.Optional
|
import java.util.Optional
|
||||||
import net.minecraft.advancements.critereon.ContextAwarePredicate
|
import net.minecraft.advancements.critereon.ContextAwarePredicate
|
||||||
import net.minecraft.advancements.critereon.EntityPredicate
|
import net.minecraft.advancements.critereon.EntityPredicate
|
||||||
import net.minecraft.resources.ResourceLocation
|
|
||||||
import net.minecraft.server.level.ServerPlayer
|
import net.minecraft.server.level.ServerPlayer
|
||||||
|
import net.minecraft.resources.ResourceLocation
|
||||||
|
|
||||||
class ReelInPokemonContext(val species : ResourceLocation, val baitId: ResourceLocation)
|
class ReelInPokemonContext(val species : ResourceLocation, val baitId: ResourceLocation)
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,6 @@
|
|||||||
package com.cobblemon.mod.common.api.abilities
|
package com.cobblemon.mod.common.api.abilities
|
||||||
|
|
||||||
import com.cobblemon.mod.common.api.Priority
|
import com.cobblemon.mod.common.api.Priority
|
||||||
import com.cobblemon.mod.common.api.data.ShowdownIdentifiable
|
|
||||||
import com.cobblemon.mod.common.util.codec.CodecUtils
|
import com.cobblemon.mod.common.util.codec.CodecUtils
|
||||||
import com.google.gson.JsonObject
|
import com.google.gson.JsonObject
|
||||||
import com.mojang.serialization.Codec
|
import com.mojang.serialization.Codec
|
||||||
@@ -26,7 +25,7 @@ class AbilityTemplate(
|
|||||||
var builder: (AbilityTemplate, forced: Boolean, priority: Priority) -> Ability = { template, forced, priority -> Ability(template, forced, priority) },
|
var builder: (AbilityTemplate, forced: Boolean, priority: Priority) -> Ability = { template, forced, priority -> Ability(template, forced, priority) },
|
||||||
val displayName: String = "cobblemon.ability.$name",
|
val displayName: String = "cobblemon.ability.$name",
|
||||||
val description: String = "cobblemon.ability.$name.desc"
|
val description: String = "cobblemon.ability.$name.desc"
|
||||||
) : ShowdownIdentifiable {
|
) {
|
||||||
/**
|
/**
|
||||||
* Returns the Ability or if applicable the extension connected to this template
|
* Returns the Ability or if applicable the extension connected to this template
|
||||||
*/
|
*/
|
||||||
@@ -46,8 +45,6 @@ class AbilityTemplate(
|
|||||||
*/
|
*/
|
||||||
fun create(json: JsonObject) = create().loadFromJSON(json)
|
fun create(json: JsonObject) = create().loadFromJSON(json)
|
||||||
|
|
||||||
override fun showdownId(): String = ShowdownIdentifiable.REGEX.replace(this.name.lowercase(), "")
|
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
|
|||||||
+1
@@ -18,6 +18,7 @@ import com.cobblemon.mod.common.api.molang.MoLangFunctions.addStandardFunctions
|
|||||||
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asMostSpecificMoLangValue
|
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asMostSpecificMoLangValue
|
||||||
import com.cobblemon.mod.common.api.molang.MoLangFunctions.setup
|
import com.cobblemon.mod.common.api.molang.MoLangFunctions.setup
|
||||||
import com.cobblemon.mod.common.api.molang.ObjectValue
|
import com.cobblemon.mod.common.api.molang.ObjectValue
|
||||||
|
import com.cobblemon.mod.common.api.scripting.CobblemonScripts
|
||||||
import com.cobblemon.mod.common.entity.MoLangScriptingEntity
|
import com.cobblemon.mod.common.entity.MoLangScriptingEntity
|
||||||
import com.cobblemon.mod.common.util.activityRegistry
|
import com.cobblemon.mod.common.util.activityRegistry
|
||||||
import com.cobblemon.mod.common.util.asIdentifierDefaultingNamespace
|
import com.cobblemon.mod.common.util.asIdentifierDefaultingNamespace
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import com.cobblemon.mod.common.api.ai.config.BehaviourConfig
|
|||||||
import com.cobblemon.mod.common.api.molang.ExpressionLike
|
import com.cobblemon.mod.common.api.molang.ExpressionLike
|
||||||
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asMostSpecificMoLangValue
|
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asMostSpecificMoLangValue
|
||||||
import com.cobblemon.mod.common.api.molang.MoLangFunctions.setup
|
import com.cobblemon.mod.common.api.molang.MoLangFunctions.setup
|
||||||
|
import com.cobblemon.mod.common.api.scripting.CobblemonScripts
|
||||||
import com.cobblemon.mod.common.util.asTranslated
|
import com.cobblemon.mod.common.util.asTranslated
|
||||||
import com.cobblemon.mod.common.util.resolve
|
import com.cobblemon.mod.common.util.resolve
|
||||||
import com.cobblemon.mod.common.util.withQueryValue
|
import com.cobblemon.mod.common.util.withQueryValue
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import com.cobblemon.mod.common.util.getBooleanOrNull
|
|||||||
import com.cobblemon.mod.common.util.getDoubleOrNull
|
import com.cobblemon.mod.common.util.getDoubleOrNull
|
||||||
import kotlin.math.sqrt
|
import kotlin.math.sqrt
|
||||||
import net.minecraft.core.BlockPos
|
import net.minecraft.core.BlockPos
|
||||||
|
import net.minecraft.world.entity.PathfinderMob
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Used to maintain some settings around how the entity should wander this tick. The idea is you
|
* Used to maintain some settings around how the entity should wander this tick. The idea is you
|
||||||
|
|||||||
@@ -8,12 +8,16 @@
|
|||||||
|
|
||||||
package com.cobblemon.mod.common.api.ai.config
|
package com.cobblemon.mod.common.api.ai.config
|
||||||
|
|
||||||
|
import com.bedrockk.molang.runtime.MoLangRuntime
|
||||||
import com.cobblemon.mod.common.api.ai.BehaviourConfigurationContext
|
import com.cobblemon.mod.common.api.ai.BehaviourConfigurationContext
|
||||||
import com.cobblemon.mod.common.api.ai.ExpressionOrEntityVariable
|
import com.cobblemon.mod.common.api.ai.ExpressionOrEntityVariable
|
||||||
|
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asMostSpecificMoLangValue
|
||||||
|
import com.cobblemon.mod.common.api.molang.MoLangFunctions.setup
|
||||||
import com.cobblemon.mod.common.api.npc.configuration.MoLangConfigVariable
|
import com.cobblemon.mod.common.api.npc.configuration.MoLangConfigVariable
|
||||||
import com.cobblemon.mod.common.util.asExpression
|
import com.cobblemon.mod.common.util.asExpression
|
||||||
import com.cobblemon.mod.common.util.cobblemonResource
|
import com.cobblemon.mod.common.util.cobblemonResource
|
||||||
import com.cobblemon.mod.common.util.resolveBoolean
|
import com.cobblemon.mod.common.util.resolveBoolean
|
||||||
|
import com.cobblemon.mod.common.util.withQueryValue
|
||||||
import net.minecraft.resources.ResourceLocation
|
import net.minecraft.resources.ResourceLocation
|
||||||
import net.minecraft.world.entity.LivingEntity
|
import net.minecraft.world.entity.LivingEntity
|
||||||
|
|
||||||
|
|||||||
@@ -11,8 +11,13 @@ package com.cobblemon.mod.common.api.ai.config.task
|
|||||||
import com.cobblemon.mod.common.api.ai.BehaviourConfigurationContext
|
import com.cobblemon.mod.common.api.ai.BehaviourConfigurationContext
|
||||||
import com.cobblemon.mod.common.api.ai.ExpressionOrEntityVariable
|
import com.cobblemon.mod.common.api.ai.ExpressionOrEntityVariable
|
||||||
import com.cobblemon.mod.common.api.ai.asVariables
|
import com.cobblemon.mod.common.api.ai.asVariables
|
||||||
|
import com.cobblemon.mod.common.api.molang.ExpressionLike
|
||||||
|
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asMostSpecificMoLangValue
|
||||||
import com.cobblemon.mod.common.util.asExpression
|
import com.cobblemon.mod.common.util.asExpression
|
||||||
|
import com.cobblemon.mod.common.util.asExpressionLike
|
||||||
|
import com.cobblemon.mod.common.util.resolveBoolean
|
||||||
import com.cobblemon.mod.common.util.weightedSelection
|
import com.cobblemon.mod.common.util.weightedSelection
|
||||||
|
import com.cobblemon.mod.common.util.withQueryValue
|
||||||
import com.mojang.datafixers.util.Either
|
import com.mojang.datafixers.util.Either
|
||||||
import net.minecraft.world.entity.LivingEntity
|
import net.minecraft.world.entity.LivingEntity
|
||||||
import net.minecraft.world.entity.ai.behavior.BehaviorControl
|
import net.minecraft.world.entity.ai.behavior.BehaviorControl
|
||||||
|
|||||||
+2
@@ -8,10 +8,12 @@
|
|||||||
|
|
||||||
package com.cobblemon.mod.common.api.ai.config.task
|
package com.cobblemon.mod.common.api.ai.config.task
|
||||||
|
|
||||||
|
import com.bedrockk.molang.runtime.MoLangRuntime
|
||||||
import com.cobblemon.mod.common.CobblemonMemories
|
import com.cobblemon.mod.common.CobblemonMemories
|
||||||
import com.cobblemon.mod.common.api.ai.BehaviourConfigurationContext
|
import com.cobblemon.mod.common.api.ai.BehaviourConfigurationContext
|
||||||
import com.cobblemon.mod.common.api.ai.WrapperLivingEntityTask.Companion.wrapped
|
import com.cobblemon.mod.common.api.ai.WrapperLivingEntityTask.Companion.wrapped
|
||||||
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asMostSpecificMoLangValue
|
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asMostSpecificMoLangValue
|
||||||
|
import com.cobblemon.mod.common.api.molang.MoLangFunctions.setup
|
||||||
import com.cobblemon.mod.common.api.npc.configuration.MoLangConfigVariable
|
import com.cobblemon.mod.common.api.npc.configuration.MoLangConfigVariable
|
||||||
import com.cobblemon.mod.common.util.mainThreadRuntime
|
import com.cobblemon.mod.common.util.mainThreadRuntime
|
||||||
import com.cobblemon.mod.common.util.resolveBoolean
|
import com.cobblemon.mod.common.util.resolveBoolean
|
||||||
|
|||||||
+2
@@ -10,6 +10,8 @@ package com.cobblemon.mod.common.api.ai.config.task
|
|||||||
|
|
||||||
import com.cobblemon.mod.common.api.ai.BehaviourConfigurationContext
|
import com.cobblemon.mod.common.api.ai.BehaviourConfigurationContext
|
||||||
import com.cobblemon.mod.common.api.ai.asVariables
|
import com.cobblemon.mod.common.api.ai.asVariables
|
||||||
|
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asMostSpecificMoLangValue
|
||||||
|
import com.cobblemon.mod.common.util.withQueryValue
|
||||||
import net.minecraft.world.entity.LivingEntity
|
import net.minecraft.world.entity.LivingEntity
|
||||||
import net.minecraft.world.entity.ai.behavior.BehaviorControl
|
import net.minecraft.world.entity.ai.behavior.BehaviorControl
|
||||||
import net.minecraft.world.entity.ai.behavior.StopBeingAngryIfTargetDead
|
import net.minecraft.world.entity.ai.behavior.StopBeingAngryIfTargetDead
|
||||||
|
|||||||
+2
@@ -9,7 +9,9 @@
|
|||||||
package com.cobblemon.mod.common.api.ai.config.task
|
package com.cobblemon.mod.common.api.ai.config.task
|
||||||
|
|
||||||
import com.cobblemon.mod.common.api.ai.BehaviourConfigurationContext
|
import com.cobblemon.mod.common.api.ai.BehaviourConfigurationContext
|
||||||
|
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asMostSpecificMoLangValue
|
||||||
import com.cobblemon.mod.common.api.npc.configuration.MoLangConfigVariable
|
import com.cobblemon.mod.common.api.npc.configuration.MoLangConfigVariable
|
||||||
|
import com.cobblemon.mod.common.util.withQueryValue
|
||||||
import net.minecraft.world.Difficulty
|
import net.minecraft.world.Difficulty
|
||||||
import net.minecraft.world.entity.LivingEntity
|
import net.minecraft.world.entity.LivingEntity
|
||||||
import net.minecraft.world.entity.ai.behavior.declarative.BehaviorBuilder
|
import net.minecraft.world.entity.ai.behavior.declarative.BehaviorBuilder
|
||||||
|
|||||||
+1
@@ -15,6 +15,7 @@ import com.cobblemon.mod.common.api.npc.configuration.MoLangConfigVariable
|
|||||||
import com.cobblemon.mod.common.entity.npc.ai.SwitchToBattleTask
|
import com.cobblemon.mod.common.entity.npc.ai.SwitchToBattleTask
|
||||||
import net.minecraft.world.entity.LivingEntity
|
import net.minecraft.world.entity.LivingEntity
|
||||||
import net.minecraft.world.entity.ai.behavior.BehaviorControl
|
import net.minecraft.world.entity.ai.behavior.BehaviorControl
|
||||||
|
import net.minecraft.world.entity.ai.memory.MemoryModuleType
|
||||||
|
|
||||||
class SwitchToNPCBattleTaskConfig : SingleTaskConfig {
|
class SwitchToNPCBattleTaskConfig : SingleTaskConfig {
|
||||||
override fun getVariables(entity: LivingEntity, behaviourConfigurationContext: BehaviourConfigurationContext) = emptyList<MoLangConfigVariable>()
|
override fun getVariables(entity: LivingEntity, behaviourConfigurationContext: BehaviourConfigurationContext) = emptyList<MoLangConfigVariable>()
|
||||||
|
|||||||
+2
@@ -10,6 +10,8 @@ package com.cobblemon.mod.common.api.ai.config.task
|
|||||||
|
|
||||||
import com.cobblemon.mod.common.api.ai.BehaviourConfigurationContext
|
import com.cobblemon.mod.common.api.ai.BehaviourConfigurationContext
|
||||||
import com.cobblemon.mod.common.api.ai.asVariables
|
import com.cobblemon.mod.common.api.ai.asVariables
|
||||||
|
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asMostSpecificMoLangValue
|
||||||
|
import com.cobblemon.mod.common.util.withQueryValue
|
||||||
import net.minecraft.world.entity.LivingEntity
|
import net.minecraft.world.entity.LivingEntity
|
||||||
import net.minecraft.world.entity.PathfinderMob
|
import net.minecraft.world.entity.PathfinderMob
|
||||||
import net.minecraft.world.entity.ai.behavior.BehaviorControl
|
import net.minecraft.world.entity.ai.behavior.BehaviorControl
|
||||||
|
|||||||
+2
@@ -10,6 +10,8 @@ package com.cobblemon.mod.common.api.ai.config.task
|
|||||||
|
|
||||||
import com.cobblemon.mod.common.api.ai.BehaviourConfigurationContext
|
import com.cobblemon.mod.common.api.ai.BehaviourConfigurationContext
|
||||||
import com.cobblemon.mod.common.api.ai.asVariables
|
import com.cobblemon.mod.common.api.ai.asVariables
|
||||||
|
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asMostSpecificMoLangValue
|
||||||
|
import com.cobblemon.mod.common.util.withQueryValue
|
||||||
import net.minecraft.world.entity.LivingEntity
|
import net.minecraft.world.entity.LivingEntity
|
||||||
import net.minecraft.world.entity.PathfinderMob
|
import net.minecraft.world.entity.PathfinderMob
|
||||||
import net.minecraft.world.entity.ai.behavior.BehaviorControl
|
import net.minecraft.world.entity.ai.behavior.BehaviorControl
|
||||||
|
|||||||
+1
@@ -25,6 +25,7 @@ import net.minecraft.world.entity.ai.behavior.BehaviorControl
|
|||||||
import net.minecraft.world.entity.ai.behavior.declarative.BehaviorBuilder
|
import net.minecraft.world.entity.ai.behavior.declarative.BehaviorBuilder
|
||||||
import net.minecraft.world.entity.ai.behavior.declarative.Trigger
|
import net.minecraft.world.entity.ai.behavior.declarative.Trigger
|
||||||
import net.minecraft.world.entity.ai.memory.MemoryModuleType
|
import net.minecraft.world.entity.ai.memory.MemoryModuleType
|
||||||
|
import net.minecraft.world.entity.ai.memory.MemoryStatus
|
||||||
import net.minecraft.world.entity.ai.sensing.SensorType
|
import net.minecraft.world.entity.ai.sensing.SensorType
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+1
-1
@@ -22,7 +22,6 @@ import com.cobblemon.mod.common.util.mainThreadRuntime
|
|||||||
import com.cobblemon.mod.common.util.resolveFloat
|
import com.cobblemon.mod.common.util.resolveFloat
|
||||||
import com.cobblemon.mod.common.util.withQueryValue
|
import com.cobblemon.mod.common.util.withQueryValue
|
||||||
import com.mojang.datafixers.util.Either
|
import com.mojang.datafixers.util.Either
|
||||||
import kotlin.math.ceil
|
|
||||||
import net.minecraft.core.BlockPos
|
import net.minecraft.core.BlockPos
|
||||||
import net.minecraft.world.entity.LivingEntity
|
import net.minecraft.world.entity.LivingEntity
|
||||||
import net.minecraft.world.entity.PathfinderMob
|
import net.minecraft.world.entity.PathfinderMob
|
||||||
@@ -35,6 +34,7 @@ import net.minecraft.world.entity.ai.memory.MemoryModuleType
|
|||||||
import net.minecraft.world.level.material.Fluids
|
import net.minecraft.world.level.material.Fluids
|
||||||
import net.minecraft.world.level.pathfinder.PathType
|
import net.minecraft.world.level.pathfinder.PathType
|
||||||
import net.minecraft.world.phys.Vec3
|
import net.minecraft.world.phys.Vec3
|
||||||
|
import kotlin.math.ceil
|
||||||
|
|
||||||
class WaterWanderTaskConfig : SingleTaskConfig {
|
class WaterWanderTaskConfig : SingleTaskConfig {
|
||||||
val condition = booleanVariable(WANDER, "water_wanders", true).asExpressible()
|
val condition = booleanVariable(WANDER, "water_wanders", true).asExpressible()
|
||||||
|
|||||||
+11
-12
@@ -54,9 +54,9 @@ import com.cobblemon.mod.common.net.messages.client.battle.BattleEndPacket
|
|||||||
import com.cobblemon.mod.common.net.messages.client.battle.BattleMakeChoicePacket
|
import com.cobblemon.mod.common.net.messages.client.battle.BattleMakeChoicePacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.battle.BattleMessagePacket
|
import com.cobblemon.mod.common.net.messages.client.battle.BattleMessagePacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.battle.BattleQueueRequestPacket
|
import com.cobblemon.mod.common.net.messages.client.battle.BattleQueueRequestPacket
|
||||||
import com.cobblemon.mod.common.pokemon.transformation.progress.DefeatTransformationProgress
|
import com.cobblemon.mod.common.pokemon.evolution.progress.DefeatEvolutionProgress
|
||||||
import com.cobblemon.mod.common.pokemon.transformation.progress.LastBattleCriticalHitsTransformationProgress
|
import com.cobblemon.mod.common.pokemon.evolution.progress.LastBattleCriticalHitsEvolutionProgress
|
||||||
import com.cobblemon.mod.common.pokemon.transformation.requirements.DefeatRequirement
|
import com.cobblemon.mod.common.pokemon.requirements.DefeatRequirement
|
||||||
import com.cobblemon.mod.common.util.battleLang
|
import com.cobblemon.mod.common.util.battleLang
|
||||||
import com.cobblemon.mod.common.util.getPlayer
|
import com.cobblemon.mod.common.util.getPlayer
|
||||||
import com.cobblemon.mod.common.util.giveOrDropItemStack
|
import com.cobblemon.mod.common.util.giveOrDropItemStack
|
||||||
@@ -97,8 +97,8 @@ open class PokemonBattle(
|
|||||||
this.actors.forEach { actor ->
|
this.actors.forEach { actor ->
|
||||||
actor.battle = this
|
actor.battle = this
|
||||||
actor.pokemonList.forEach { battlePokemon ->
|
actor.pokemonList.forEach { battlePokemon ->
|
||||||
battlePokemon.effectedPokemon.requirementProgress
|
battlePokemon.effectedPokemon.evolutionProxy.current().progress()
|
||||||
.filterIsInstance<LastBattleCriticalHitsTransformationProgress>()
|
.filterIsInstance<LastBattleCriticalHitsEvolutionProgress>()
|
||||||
.forEach { it.reset() }
|
.forEach { it.reset() }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -271,13 +271,12 @@ open class PokemonBattle(
|
|||||||
val facedFainted = opponentPokemon.facedOpponents.contains(faintedPokemon)
|
val facedFainted = opponentPokemon.facedOpponents.contains(faintedPokemon)
|
||||||
val pokemon = opponentPokemon.effectedPokemon
|
val pokemon = opponentPokemon.effectedPokemon
|
||||||
if (facedFainted) {
|
if (facedFainted) {
|
||||||
if (pokemon.hasMatchingRequirement<DefeatRequirement>({ it.target.matches(faintedPokemon.effectedPokemon) })) {
|
pokemon.lockedEvolutions.forEach { evolution ->
|
||||||
val requiredPokemonProperties = pokemon.getRelevantRequirements<DefeatRequirement> { it.target.matches(faintedPokemon.effectedPokemon) }
|
evolution.requirements.filterIsInstance<DefeatRequirement>().forEach { defeatRequirement ->
|
||||||
.map { it.target }
|
if (defeatRequirement.target.matches(faintedPokemon.effectedPokemon)) {
|
||||||
.distinctBy { it.asString() }
|
val progress = pokemon.evolutionProxy.current().progressFirstOrCreate({ it is DefeatEvolutionProgress && it.currentProgress().target == defeatRequirement.target }) { DefeatEvolutionProgress() }
|
||||||
for (props in requiredPokemonProperties) {
|
progress.updateProgress(DefeatEvolutionProgress.Progress(defeatRequirement.target, progress.currentProgress().amount + 1))
|
||||||
val progress = pokemon.progressFirstOrCreate({ it is DefeatTransformationProgress && it.currentProgress().target.asString().equals(props.asString(), ignoreCase = true) }, ::DefeatTransformationProgress)
|
}
|
||||||
progress.updateProgress(DefeatTransformationProgress.Progress(props.copy(), progress.currentProgress().amount + 1))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -22,9 +22,9 @@ import com.cobblemon.mod.common.item.battle.BagItem
|
|||||||
import com.cobblemon.mod.common.net.messages.client.battle.BattleApplyPassResponsePacket
|
import com.cobblemon.mod.common.net.messages.client.battle.BattleApplyPassResponsePacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.battle.BattleMakeChoicePacket
|
import com.cobblemon.mod.common.net.messages.client.battle.BattleMakeChoicePacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.battle.BattleMessagePacket
|
import com.cobblemon.mod.common.net.messages.client.battle.BattleMessagePacket
|
||||||
import java.util.UUID
|
|
||||||
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 java.util.UUID
|
||||||
import net.minecraft.server.level.ServerPlayer
|
import net.minecraft.server.level.ServerPlayer
|
||||||
|
|
||||||
abstract class BattleActor(
|
abstract class BattleActor(
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ import com.cobblemon.mod.common.util.adapters.*
|
|||||||
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 java.awt.Color
|
|
||||||
import net.minecraft.advancements.critereon.MinMaxBounds
|
import net.minecraft.advancements.critereon.MinMaxBounds
|
||||||
import net.minecraft.core.registries.Registries
|
import net.minecraft.core.registries.Registries
|
||||||
import net.minecraft.resources.ResourceLocation
|
import net.minecraft.resources.ResourceLocation
|
||||||
@@ -31,6 +30,7 @@ import net.minecraft.tags.TagKey
|
|||||||
import net.minecraft.world.level.biome.Biome
|
import net.minecraft.world.level.biome.Biome
|
||||||
import net.minecraft.world.phys.AABB
|
import net.minecraft.world.phys.AABB
|
||||||
import net.minecraft.world.phys.Vec3
|
import net.minecraft.world.phys.Vec3
|
||||||
|
import java.awt.Color
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The data registry for [Berry].
|
* The data registry for [Berry].
|
||||||
|
|||||||
@@ -26,10 +26,10 @@ import com.cobblemon.mod.common.util.writeBox
|
|||||||
import com.cobblemon.mod.common.util.writeEnumConstant
|
import com.cobblemon.mod.common.util.writeEnumConstant
|
||||||
import com.cobblemon.mod.common.util.writeIdentifier
|
import com.cobblemon.mod.common.util.writeIdentifier
|
||||||
import com.google.gson.annotations.SerializedName
|
import com.google.gson.annotations.SerializedName
|
||||||
import java.awt.Color
|
|
||||||
import java.util.EnumSet
|
|
||||||
import net.minecraft.core.BlockPos
|
import net.minecraft.core.BlockPos
|
||||||
import net.minecraft.network.RegistryFriendlyByteBuf
|
import net.minecraft.network.RegistryFriendlyByteBuf
|
||||||
|
import java.awt.Color
|
||||||
|
import java.util.EnumSet
|
||||||
import net.minecraft.resources.ResourceLocation
|
import net.minecraft.resources.ResourceLocation
|
||||||
import net.minecraft.tags.TagKey
|
import net.minecraft.tags.TagKey
|
||||||
import net.minecraft.world.entity.LivingEntity
|
import net.minecraft.world.entity.LivingEntity
|
||||||
|
|||||||
+12
-1
@@ -11,6 +11,9 @@ package com.cobblemon.mod.common.api.conditional
|
|||||||
import com.google.gson.JsonDeserializationContext
|
import com.google.gson.JsonDeserializationContext
|
||||||
import com.google.gson.JsonDeserializer
|
import com.google.gson.JsonDeserializer
|
||||||
import com.google.gson.JsonElement
|
import com.google.gson.JsonElement
|
||||||
|
import com.google.gson.JsonPrimitive
|
||||||
|
import com.google.gson.JsonSerializationContext
|
||||||
|
import com.google.gson.JsonSerializer
|
||||||
import java.lang.reflect.Type
|
import java.lang.reflect.Type
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -21,11 +24,19 @@ import java.lang.reflect.Type
|
|||||||
* @author Hiroku
|
* @author Hiroku
|
||||||
* @since July 17th, 2022
|
* @since July 17th, 2022
|
||||||
*/
|
*/
|
||||||
interface RegistryLikeAdapter<B> : JsonDeserializer<RegistryLikeCondition<B>> {
|
interface RegistryLikeAdapter<B> : JsonDeserializer<RegistryLikeCondition<B>>, JsonSerializer<RegistryLikeCondition<B>> {
|
||||||
val registryLikeConditions: MutableList<(JsonElement) -> RegistryLikeCondition<B>?>
|
val registryLikeConditions: MutableList<(JsonElement) -> RegistryLikeCondition<B>?>
|
||||||
|
|
||||||
override fun deserialize(json: JsonElement, type: Type, ctx: JsonDeserializationContext): RegistryLikeCondition<B> {
|
override fun deserialize(json: JsonElement, type: Type, ctx: JsonDeserializationContext): RegistryLikeCondition<B> {
|
||||||
return registryLikeConditions.firstNotNullOfOrNull { it(json) }
|
return registryLikeConditions.firstNotNullOfOrNull { it(json) }
|
||||||
?: throw IllegalArgumentException("Unable to deserialize $json")
|
?: throw IllegalArgumentException("Unable to deserialize $json")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun serialize(src: RegistryLikeCondition<B>, typeOfSrc: Type, ctx: JsonSerializationContext): JsonElement {
|
||||||
|
return when (src) {
|
||||||
|
is RegistryLikeTagCondition<B> -> JsonPrimitive(RegistryLikeTagCondition.PREFIX + src.tag.location())
|
||||||
|
is RegistryLikeIdentifierCondition<B> -> JsonPrimitive(src.identifier.toString())
|
||||||
|
else -> throw IllegalArgumentException("Unable to serialize $src")
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,93 @@
|
|||||||
|
/*
|
||||||
|
* 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.data
|
||||||
|
|
||||||
|
import com.cobblemon.mod.common.util.endsWith
|
||||||
|
import com.google.gson.Gson
|
||||||
|
import com.google.gson.reflect.TypeToken
|
||||||
|
import net.minecraft.core.HolderLookup
|
||||||
|
import java.io.BufferedReader
|
||||||
|
import java.io.File
|
||||||
|
import java.util.concurrent.ExecutionException
|
||||||
|
import net.minecraft.resources.ResourceLocation
|
||||||
|
import net.minecraft.server.packs.PackType
|
||||||
|
import net.minecraft.server.packs.resources.ResourceManager
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A [DataRegistry] that consumes JSON files.
|
||||||
|
* Every deserialized instance is attached to an [Identifier].
|
||||||
|
* For example a file under data/mymod/[resourcePath]/entry.json would be backed by the identifier modid:entry.
|
||||||
|
*
|
||||||
|
* @param T The type of the data consumed by this registry.
|
||||||
|
*
|
||||||
|
* @author Licious
|
||||||
|
* @since August 5th, 2022
|
||||||
|
*/
|
||||||
|
interface ServerJsonDataRegistry<T> : DataRegistry {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The [TypeToken] of type [T].
|
||||||
|
*/
|
||||||
|
val typeToken: TypeToken<T>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The folder location for the data this registry will consume.
|
||||||
|
*/
|
||||||
|
val resourcePath: String
|
||||||
|
|
||||||
|
override val type: PackType
|
||||||
|
get() = PackType.SERVER_DATA
|
||||||
|
|
||||||
|
override fun reload(manager: ResourceManager) {
|
||||||
|
//NO-OP, handled by reload(manager, registry)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun reload(manager: ResourceManager, registry: HolderLookup.Provider) {
|
||||||
|
val gson = setupParser(registry)
|
||||||
|
val data = hashMapOf<ResourceLocation, T>()
|
||||||
|
manager.listResources(resourcePath) { path -> path.endsWith(JSON_EXTENSION) }.forEach { (identifier, resource) ->
|
||||||
|
if (identifier.namespace == "pixelmon") {
|
||||||
|
return@forEach
|
||||||
|
}
|
||||||
|
|
||||||
|
resource.open().use { stream ->
|
||||||
|
stream.bufferedReader().use { reader ->
|
||||||
|
val resolvedIdentifier = ResourceLocation.fromNamespaceAndPath(identifier.namespace, File(identifier.path).nameWithoutExtension)
|
||||||
|
data[resolvedIdentifier] = parse(reader, resolvedIdentifier, gson)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
reload(data, registry)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun parse(reader: BufferedReader, identifier: ResourceLocation, gson: Gson): T {
|
||||||
|
return try {
|
||||||
|
gson.fromJson(reader, typeToken.type)
|
||||||
|
} catch (exception: Exception) {
|
||||||
|
throw ExecutionException("Error loading JSON for data: $identifier", exception)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allows the creation of [Gson] instances which have adapters that are registry-aware, e.g. [com.cobblemon.mod.common.pokemon.evolution.adapters.LegacyItemConditionWrapperAdapter]
|
||||||
|
*/
|
||||||
|
fun setupParser(registry: HolderLookup.Provider): Gson
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reloads this registry from the deserialized data.
|
||||||
|
*
|
||||||
|
* @param data A map of the data associating an instance to the respective identifier from the [ResourceManager].
|
||||||
|
*/
|
||||||
|
fun reload(data: Map<ResourceLocation, T>, registry: HolderLookup.Provider)
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
const val JSON_EXTENSION = ".json"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,11 +8,11 @@
|
|||||||
|
|
||||||
package com.cobblemon.mod.common.api.drop
|
package com.cobblemon.mod.common.api.drop
|
||||||
|
|
||||||
import com.cobblemon.mod.common.api.pokemon.transformation.requirement.TransformationRequirement
|
import com.cobblemon.mod.common.api.pokemon.requirement.Requirement
|
||||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||||
|
|
||||||
class EvolutionItemDropEntry : ItemDropEntry() {
|
class EvolutionItemDropEntry : ItemDropEntry() {
|
||||||
val requirements: MutableSet<TransformationRequirement> = mutableSetOf()
|
val requirements: MutableSet<Requirement> = mutableSetOf()
|
||||||
|
|
||||||
override fun canDrop(pokemon: Pokemon?): Boolean = pokemon != null && requirements.all { it.check(pokemon) }
|
override fun canDrop(pokemon: Pokemon?): Boolean = pokemon != null && requirements.all { it.check(pokemon) }
|
||||||
}
|
}
|
||||||
@@ -48,10 +48,6 @@ import com.cobblemon.mod.common.api.events.pokemon.evolution.EvolutionAcceptedEv
|
|||||||
import com.cobblemon.mod.common.api.events.pokemon.evolution.EvolutionCompleteEvent
|
import com.cobblemon.mod.common.api.events.pokemon.evolution.EvolutionCompleteEvent
|
||||||
import com.cobblemon.mod.common.api.events.pokemon.evolution.EvolutionDisplayEvent
|
import com.cobblemon.mod.common.api.events.pokemon.evolution.EvolutionDisplayEvent
|
||||||
import com.cobblemon.mod.common.api.events.pokemon.evolution.EvolutionTestedEvent
|
import com.cobblemon.mod.common.api.events.pokemon.evolution.EvolutionTestedEvent
|
||||||
import com.cobblemon.mod.common.api.events.pokemon.form.FormAcceptedEvent
|
|
||||||
import com.cobblemon.mod.common.api.events.pokemon.form.FormCompleteEvent
|
|
||||||
import com.cobblemon.mod.common.api.events.pokemon.form.FormDisplayEvent
|
|
||||||
import com.cobblemon.mod.common.api.events.pokemon.form.FormTestedEvent
|
|
||||||
import com.cobblemon.mod.common.api.events.pokemon.healing.PokemonHealedEvent
|
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
|
||||||
@@ -107,18 +103,6 @@ object CobblemonEvents {
|
|||||||
@JvmField
|
@JvmField
|
||||||
val EVOLUTION_COMPLETE = EventObservable<EvolutionCompleteEvent>()
|
val EVOLUTION_COMPLETE = EventObservable<EvolutionCompleteEvent>()
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val FORM_ACCEPTED = CancelableObservable<FormAcceptedEvent>()
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val FORM_DISPLAY = EventObservable<FormDisplayEvent>()
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val FORM_TESTED = EventObservable<FormTestedEvent>()
|
|
||||||
|
|
||||||
@JvmField
|
|
||||||
val FORM_COMPLETE = EventObservable<FormCompleteEvent>()
|
|
||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val POKEMON_NICKNAMED = CancelableObservable<PokemonNicknamedEvent>()
|
val POKEMON_NICKNAMED = CancelableObservable<PokemonNicknamedEvent>()
|
||||||
|
|
||||||
|
|||||||
+2
@@ -15,7 +15,9 @@ 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
|
||||||
import com.cobblemon.mod.common.api.battles.model.actor.EntityBackedBattleActor
|
import com.cobblemon.mod.common.api.battles.model.actor.EntityBackedBattleActor
|
||||||
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asMostSpecificMoLangValue
|
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asMostSpecificMoLangValue
|
||||||
|
import com.cobblemon.mod.common.battles.actor.PlayerBattleActor
|
||||||
import com.cobblemon.mod.common.entity.MoLangScriptingEntity
|
import com.cobblemon.mod.common.entity.MoLangScriptingEntity
|
||||||
|
import com.cobblemon.mod.common.entity.npc.NPCBattleActor
|
||||||
import com.cobblemon.mod.common.util.asArrayValue
|
import com.cobblemon.mod.common.util.asArrayValue
|
||||||
import net.minecraft.world.entity.LivingEntity
|
import net.minecraft.world.entity.LivingEntity
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import com.bedrockk.molang.runtime.value.DoubleValue
|
|||||||
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.molang.MoLangFunctions.moLangFunctionMap
|
||||||
|
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||||
import com.cobblemon.mod.common.trade.TradeParticipant
|
import com.cobblemon.mod.common.trade.TradeParticipant
|
||||||
import com.cobblemon.mod.common.util.getPlayer
|
import com.cobblemon.mod.common.util.getPlayer
|
||||||
|
|||||||
+1
-1
@@ -12,8 +12,8 @@ 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.asMoLangValue
|
||||||
import com.cobblemon.mod.common.api.molang.MoLangFunctions.moLangFunctionMap
|
import com.cobblemon.mod.common.api.molang.MoLangFunctions.moLangFunctionMap
|
||||||
|
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.pokemon.transformation.evolution.Evolution
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fired when an evolution is accepted.
|
* Fired when an evolution is accepted.
|
||||||
|
|||||||
+1
-1
@@ -10,8 +10,8 @@ package com.cobblemon.mod.common.api.events.pokemon.evolution
|
|||||||
|
|
||||||
import com.bedrockk.molang.runtime.value.MoValue
|
import com.bedrockk.molang.runtime.value.MoValue
|
||||||
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asMoLangValue
|
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asMoLangValue
|
||||||
|
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.pokemon.transformation.evolution.Evolution
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fired after an evolution finishes.
|
* Fired after an evolution finishes.
|
||||||
|
|||||||
+2
-2
@@ -8,9 +8,9 @@
|
|||||||
|
|
||||||
package com.cobblemon.mod.common.api.events.pokemon.evolution
|
package com.cobblemon.mod.common.api.events.pokemon.evolution
|
||||||
|
|
||||||
import com.cobblemon.mod.common.pokemon.transformation.evolution.Evolution
|
import com.cobblemon.mod.common.api.pokemon.evolution.Evolution
|
||||||
|
import com.cobblemon.mod.common.api.pokemon.evolution.EvolutionDisplay
|
||||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||||
import com.cobblemon.mod.common.pokemon.transformation.evolution.EvolutionDisplay
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fired before an evolution is sent to clients.
|
* Fired before an evolution is sent to clients.
|
||||||
|
|||||||
+1
-1
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
package com.cobblemon.mod.common.api.events.pokemon.evolution
|
package com.cobblemon.mod.common.api.events.pokemon.evolution
|
||||||
|
|
||||||
import com.cobblemon.mod.common.pokemon.transformation.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
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+1
-1
@@ -12,8 +12,8 @@ import com.bedrockk.molang.runtime.value.DoubleValue
|
|||||||
import com.bedrockk.molang.runtime.value.MoValue
|
import com.bedrockk.molang.runtime.value.MoValue
|
||||||
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.molang.MoLangFunctions.moLangFunctionMap
|
||||||
|
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.pokemon.transformation.evolution.Evolution
|
|
||||||
import com.cobblemon.mod.common.util.getBoolean
|
import com.cobblemon.mod.common.util.getBoolean
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
-37
@@ -1,37 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.api.events.pokemon.form
|
|
||||||
|
|
||||||
import com.bedrockk.molang.runtime.value.StringValue
|
|
||||||
import com.cobblemon.mod.common.api.events.Cancelable
|
|
||||||
import com.cobblemon.mod.common.api.molang.MoLangFunctions.moLangFunctionMap
|
|
||||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
|
||||||
import com.cobblemon.mod.common.pokemon.transformation.form.TemporaryForm
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fired when a temporary form change is accepted.
|
|
||||||
* Cancelling will not notify users nor remove the form from the pending list.
|
|
||||||
*
|
|
||||||
* @param pokemon The [Pokemon] about to change form.
|
|
||||||
* @param form The [TemporaryForm] being used.
|
|
||||||
*
|
|
||||||
* @author Hiroku
|
|
||||||
* @since June 3rd, 2026
|
|
||||||
*/
|
|
||||||
data class FormAcceptedEvent(
|
|
||||||
override val pokemon: Pokemon,
|
|
||||||
override val form: TemporaryForm
|
|
||||||
) : Cancelable(), FormEvent {
|
|
||||||
val context = mutableMapOf(
|
|
||||||
"pokemon" to pokemon.struct,
|
|
||||||
"form" to StringValue(form.formOnlyShowdownId())
|
|
||||||
)
|
|
||||||
|
|
||||||
val functions = moLangFunctionMap(cancelFunc)
|
|
||||||
}
|
|
||||||
-34
@@ -1,34 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.api.events.pokemon.form
|
|
||||||
|
|
||||||
import com.bedrockk.molang.runtime.value.StringValue
|
|
||||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
|
||||||
import com.cobblemon.mod.common.pokemon.transformation.form.TemporaryForm
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fired after a temporary form change finishes.
|
|
||||||
*
|
|
||||||
* @param pokemon The [Pokemon] resulting from the form change.
|
|
||||||
* @param form The [TemporaryForm] that was used.
|
|
||||||
*
|
|
||||||
* @author Hiroku
|
|
||||||
* @since June 3rd, 2026
|
|
||||||
*/
|
|
||||||
data class FormCompleteEvent(
|
|
||||||
/** The [Pokemon] that did the form change. */
|
|
||||||
override val pokemon: Pokemon,
|
|
||||||
/** The [TemporaryForm] that was used. */
|
|
||||||
override val form: TemporaryForm
|
|
||||||
) : FormEvent {
|
|
||||||
val context = mutableMapOf(
|
|
||||||
"pokemon" to pokemon.struct,
|
|
||||||
"form" to StringValue(form.formOnlyShowdownId())
|
|
||||||
)
|
|
||||||
}
|
|
||||||
-37
@@ -1,37 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.api.events.pokemon.form
|
|
||||||
|
|
||||||
import com.bedrockk.molang.runtime.value.StringValue
|
|
||||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
|
||||||
import com.cobblemon.mod.common.pokemon.transformation.form.FormDisplay
|
|
||||||
import com.cobblemon.mod.common.pokemon.transformation.form.TemporaryForm
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fired before a form is sent to clients. For modifications on the actual output when they accept it modify
|
|
||||||
* the [display] directly.
|
|
||||||
*
|
|
||||||
* @param pokemon The [Pokemon] that will change form if this proposition is accepted.
|
|
||||||
* @param display The current [FormDisplay] the client will see.
|
|
||||||
* @param form The [TemporaryForm] being used.
|
|
||||||
*
|
|
||||||
* @author Hiroku
|
|
||||||
* @since June 3rd, 2026
|
|
||||||
*/
|
|
||||||
data class FormDisplayEvent(
|
|
||||||
override val pokemon: Pokemon,
|
|
||||||
var display: FormDisplay,
|
|
||||||
override val form: TemporaryForm
|
|
||||||
) : FormEvent {
|
|
||||||
val context = mutableMapOf(
|
|
||||||
"pokemon" to pokemon.struct,
|
|
||||||
"display" to display.struct,
|
|
||||||
"form" to StringValue(form.formOnlyShowdownId())
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.api.events.pokemon.form
|
|
||||||
|
|
||||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
|
||||||
import com.cobblemon.mod.common.pokemon.transformation.form.TemporaryForm
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The root of the various [TemporaryForm]-related events.
|
|
||||||
*/
|
|
||||||
interface FormEvent {
|
|
||||||
/** The Pokémon impacted in this event.*/
|
|
||||||
val pokemon: Pokemon
|
|
||||||
/*** The form triggering this event.*/
|
|
||||||
val form: TemporaryForm
|
|
||||||
}
|
|
||||||
-47
@@ -1,47 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2023 Cobblemon Contributors
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.cobblemon.mod.common.api.events.pokemon.form
|
|
||||||
|
|
||||||
import com.bedrockk.molang.runtime.value.DoubleValue
|
|
||||||
import com.bedrockk.molang.runtime.value.StringValue
|
|
||||||
import com.cobblemon.mod.common.api.molang.MoLangFunctions.moLangFunctionMap
|
|
||||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
|
||||||
import com.cobblemon.mod.common.pokemon.transformation.form.TemporaryForm
|
|
||||||
import com.cobblemon.mod.common.util.getBoolean
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An event fired when [TemporaryForm.test] has been performed.
|
|
||||||
* The final state [result] will be the return value of the test function.
|
|
||||||
*
|
|
||||||
* @property pokemon The [Pokemon] being tested against.
|
|
||||||
* @property form The [TemporaryForm] instance performing the test.
|
|
||||||
* @property originalResult The base result from the Cobblemon implementation.
|
|
||||||
* @property result The final value returned by [TemporaryForm.test].
|
|
||||||
*/
|
|
||||||
data class FormTestedEvent(
|
|
||||||
override val pokemon: Pokemon,
|
|
||||||
override val form: TemporaryForm,
|
|
||||||
val originalResult: Boolean,
|
|
||||||
) : FormEvent {
|
|
||||||
var result: Boolean = originalResult
|
|
||||||
|
|
||||||
val context = mutableMapOf(
|
|
||||||
"pokemon" to pokemon.struct,
|
|
||||||
"form" to StringValue(form.formOnlyShowdownId()),
|
|
||||||
"original_result" to DoubleValue(originalResult),
|
|
||||||
)
|
|
||||||
|
|
||||||
val functions = moLangFunctionMap(
|
|
||||||
"result" to { DoubleValue(result) },
|
|
||||||
"set_result" to {
|
|
||||||
result = it.getBoolean(0)
|
|
||||||
DoubleValue.ONE
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
+1
@@ -15,6 +15,7 @@ import com.cobblemon.mod.common.api.molang.MoLangFunctions.asMoLangValue
|
|||||||
import com.cobblemon.mod.common.api.molang.MoLangFunctions.moLangFunctionMap
|
import com.cobblemon.mod.common.api.molang.MoLangFunctions.moLangFunctionMap
|
||||||
import com.cobblemon.mod.common.api.pokemon.PokemonProperties
|
import com.cobblemon.mod.common.api.pokemon.PokemonProperties
|
||||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||||
|
import com.cobblemon.mod.common.util.getPlayer
|
||||||
import net.minecraft.server.level.ServerPlayer
|
import net.minecraft.server.level.ServerPlayer
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+1
@@ -8,6 +8,7 @@
|
|||||||
|
|
||||||
package com.cobblemon.mod.common.api.events.storage
|
package com.cobblemon.mod.common.api.events.storage
|
||||||
|
|
||||||
|
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.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
|
||||||
|
|||||||
+2
@@ -16,7 +16,9 @@ import com.cobblemon.mod.common.api.molang.MoLangFunctions.asMoLangValue
|
|||||||
import com.cobblemon.mod.common.api.molang.MoLangFunctions.moLangFunctionMap
|
import com.cobblemon.mod.common.api.molang.MoLangFunctions.moLangFunctionMap
|
||||||
import com.cobblemon.mod.common.api.storage.PokemonStore
|
import com.cobblemon.mod.common.api.storage.PokemonStore
|
||||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||||
|
import com.cobblemon.mod.common.util.getPlayer
|
||||||
import net.minecraft.server.level.ServerPlayer
|
import net.minecraft.server.level.ServerPlayer
|
||||||
|
import java.util.UUID
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The base of the events around the release of Pokémon from pc or party.
|
* The base of the events around the release of Pokémon from pc or party.
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ 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.data.FossilRegistrySyncPacket
|
import com.cobblemon.mod.common.net.messages.client.data.FossilRegistrySyncPacket
|
||||||
import com.cobblemon.mod.common.pokemon.transformation.adapters.LegacyItemConditionWrapperAdapter
|
import com.cobblemon.mod.common.pokemon.evolution.adapters.LegacyItemConditionWrapperAdapter
|
||||||
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
|
||||||
@@ -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(ItemPredicate::class.java, LegacyItemConditionWrapperAdapter)
|
.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,6 @@ package com.cobblemon.mod.common.api.gui
|
|||||||
|
|
||||||
import com.cobblemon.mod.common.client.gui.CobblemonRenderable
|
import com.cobblemon.mod.common.client.gui.CobblemonRenderable
|
||||||
import net.minecraft.client.gui.components.AbstractWidget
|
import net.minecraft.client.gui.components.AbstractWidget
|
||||||
import net.minecraft.client.gui.components.Renderable
|
|
||||||
import net.minecraft.client.gui.components.events.GuiEventListener
|
import net.minecraft.client.gui.components.events.GuiEventListener
|
||||||
import net.minecraft.client.gui.narration.NarrationElementOutput
|
import net.minecraft.client.gui.narration.NarrationElementOutput
|
||||||
import net.minecraft.network.chat.Component
|
import net.minecraft.network.chat.Component
|
||||||
@@ -55,6 +54,8 @@ abstract class ParentWidget(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun mouseClicked(pMouseX: Double, pMouseY: Double, pButton: Int): Boolean {
|
override fun mouseClicked(pMouseX: Double, pMouseY: Double, pButton: Int): Boolean {
|
||||||
|
if (!active) return false
|
||||||
|
|
||||||
return children.any {
|
return children.any {
|
||||||
it.mouseClicked(pMouseX, pMouseY, pButton)
|
it.mouseClicked(pMouseX, pMouseY, pButton)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,116 @@
|
|||||||
|
/*
|
||||||
|
* 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.gui
|
||||||
|
|
||||||
|
import kotlin.math.max
|
||||||
|
import kotlin.math.min
|
||||||
|
|
||||||
|
interface TreeNode<T> {
|
||||||
|
val children: List<TreeNode<T>>
|
||||||
|
}
|
||||||
|
|
||||||
|
class TreeDrawingNode<T>(
|
||||||
|
val value: T,
|
||||||
|
val children: List<TreeDrawingNode<T>>,
|
||||||
|
) {
|
||||||
|
var x = 0
|
||||||
|
var y = 0
|
||||||
|
var offset = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
fun <T> createDrawingTree(treeNode: TreeNode<T>): TreeDrawingNode<T> {
|
||||||
|
val root = setup(treeNode, 0, mutableListOf<Int>(), mutableListOf<Int>())
|
||||||
|
addMods(root, 0)
|
||||||
|
|
||||||
|
return root
|
||||||
|
}
|
||||||
|
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
private fun <T> setup(
|
||||||
|
treeNode: TreeNode<T>,
|
||||||
|
depth: Int,
|
||||||
|
nexts: MutableList<Int>,
|
||||||
|
offset: MutableList<Int>,
|
||||||
|
): TreeDrawingNode<T> {
|
||||||
|
val children = treeNode.children.map { child ->
|
||||||
|
setup(child, depth + 1, nexts, offset)
|
||||||
|
}
|
||||||
|
|
||||||
|
val treeDrawingNode = TreeDrawingNode<T>(treeNode as T, children)
|
||||||
|
treeDrawingNode.y = depth
|
||||||
|
|
||||||
|
while (nexts.size <= depth) {
|
||||||
|
nexts.add(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
while (offset.size <= depth) {
|
||||||
|
offset.add(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
var place =
|
||||||
|
if (children.isEmpty()) {
|
||||||
|
nexts[depth]
|
||||||
|
} else if (children.size == 1) {
|
||||||
|
// children.first().x - 1
|
||||||
|
children.first().x
|
||||||
|
} else {
|
||||||
|
// (children[0].x + children[1].x) / 2
|
||||||
|
(children.first().x + children.last().x) / 2
|
||||||
|
}
|
||||||
|
|
||||||
|
offset[depth] = max(offset[depth], nexts[depth] - place)
|
||||||
|
|
||||||
|
if (children.isEmpty()) {
|
||||||
|
treeDrawingNode.x = place
|
||||||
|
} else {
|
||||||
|
treeDrawingNode.x = place + offset[depth]
|
||||||
|
}
|
||||||
|
|
||||||
|
nexts[depth] += 2
|
||||||
|
treeDrawingNode.offset = offset[depth]
|
||||||
|
|
||||||
|
return treeDrawingNode
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun <T> addMods(
|
||||||
|
treeNode: TreeDrawingNode<T>,
|
||||||
|
modSum: Int,
|
||||||
|
) {
|
||||||
|
treeNode.x += modSum
|
||||||
|
val newModSum = modSum + treeNode.offset
|
||||||
|
|
||||||
|
treeNode.children.forEach { child ->
|
||||||
|
addMods(child, newModSum)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
data class TreeDrawingBounds(val minX: Int, val maxX: Int, val minY: Int, val maxY: Int) {
|
||||||
|
val width = maxX - minX
|
||||||
|
val height = maxY - minY
|
||||||
|
val xCenter = (maxX + minX) / 2.0
|
||||||
|
val yCenter = (maxY + minY) / 2.0
|
||||||
|
}
|
||||||
|
|
||||||
|
fun <T> calculateBounds(treeDrawingNode: TreeDrawingNode<T>): TreeDrawingBounds {
|
||||||
|
var minX = treeDrawingNode.x
|
||||||
|
var maxX = treeDrawingNode.x
|
||||||
|
var minY = treeDrawingNode.y
|
||||||
|
var maxY = treeDrawingNode.y
|
||||||
|
|
||||||
|
for (child in treeDrawingNode.children) {
|
||||||
|
val childBounds = calculateBounds(child)
|
||||||
|
|
||||||
|
minX = min(minX, childBounds.minX)
|
||||||
|
maxX = max(maxX, childBounds.maxX)
|
||||||
|
minY = min(minY, childBounds.minY)
|
||||||
|
maxY = max(maxY, childBounds.maxY)
|
||||||
|
}
|
||||||
|
|
||||||
|
return TreeDrawingBounds(minX, maxX, minY, maxY)
|
||||||
|
}
|
||||||
+5
-10
@@ -12,16 +12,11 @@ import com.bedrockk.molang.runtime.MoLangRuntime
|
|||||||
import com.cobblemon.mod.common.api.molang.ExpressionLike
|
import com.cobblemon.mod.common.api.molang.ExpressionLike
|
||||||
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.pokemon.transformation.requirement.TransformationRequirement
|
import com.cobblemon.mod.common.api.pokemon.requirement.Requirement
|
||||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||||
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.pokemon.transformation.adapters.CobblemonRequirementAdapter
|
import com.cobblemon.mod.common.pokemon.adapters.CobblemonRequirementAdapter
|
||||||
import com.cobblemon.mod.common.util.asExpressionLike
|
import com.cobblemon.mod.common.util.*
|
||||||
import com.cobblemon.mod.common.util.giveOrDropItemStack
|
|
||||||
import com.cobblemon.mod.common.util.readExpressionLike
|
|
||||||
import com.cobblemon.mod.common.util.withPlayerValue
|
|
||||||
import com.cobblemon.mod.common.util.withQueryValue
|
|
||||||
import com.cobblemon.mod.common.util.writeExpressionLike
|
|
||||||
import com.google.gson.annotations.SerializedName
|
import com.google.gson.annotations.SerializedName
|
||||||
import net.minecraft.core.registries.Registries
|
import net.minecraft.core.registries.Registries
|
||||||
import net.minecraft.network.FriendlyByteBuf
|
import net.minecraft.network.FriendlyByteBuf
|
||||||
@@ -34,7 +29,7 @@ import net.minecraft.world.entity.item.ItemEntity
|
|||||||
import net.minecraft.world.item.ItemStack
|
import net.minecraft.world.item.ItemStack
|
||||||
|
|
||||||
data class PokemonInteractionSet(
|
data class PokemonInteractionSet(
|
||||||
val requirements: List<TransformationRequirement> = listOf(),
|
val requirements: List<Requirement> = listOf(),
|
||||||
val interactions: List<PokemonInteraction> = listOf(),
|
val interactions: List<PokemonInteraction> = listOf(),
|
||||||
) {
|
) {
|
||||||
fun encode(buffer: FriendlyByteBuf) {
|
fun encode(buffer: FriendlyByteBuf) {
|
||||||
@@ -56,7 +51,7 @@ data class PokemonInteractionSet(
|
|||||||
}
|
}
|
||||||
|
|
||||||
data class PokemonInteraction(
|
data class PokemonInteraction(
|
||||||
val requirements: List<TransformationRequirement> = listOf(),
|
val requirements: List<Requirement> = listOf(),
|
||||||
val effects: List<InteractionEffect> = listOf(),
|
val effects: List<InteractionEffect> = listOf(),
|
||||||
val cooldown: ExpressionLike = "0".asExpressionLike()
|
val cooldown: ExpressionLike = "0".asExpressionLike()
|
||||||
) {
|
) {
|
||||||
+27
-23
@@ -10,22 +10,23 @@ package com.cobblemon.mod.common.api.interaction
|
|||||||
|
|
||||||
import com.cobblemon.mod.common.Cobblemon
|
import com.cobblemon.mod.common.Cobblemon
|
||||||
import com.cobblemon.mod.common.api.conditional.RegistryLikeCondition
|
import com.cobblemon.mod.common.api.conditional.RegistryLikeCondition
|
||||||
import com.cobblemon.mod.common.api.data.JsonDataRegistry
|
import com.cobblemon.mod.common.api.data.ServerJsonDataRegistry
|
||||||
import com.cobblemon.mod.common.api.molang.ExpressionLike
|
import com.cobblemon.mod.common.api.molang.ExpressionLike
|
||||||
import com.cobblemon.mod.common.api.pokemon.PokemonProperties
|
import com.cobblemon.mod.common.api.pokemon.PokemonProperties
|
||||||
import com.cobblemon.mod.common.api.pokemon.transformation.requirement.TransformationRequirement
|
import com.cobblemon.mod.common.api.pokemon.requirement.Requirement
|
||||||
import com.cobblemon.mod.common.api.reactive.SimpleObservable
|
import com.cobblemon.mod.common.api.reactive.SimpleObservable
|
||||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||||
import com.cobblemon.mod.common.net.messages.client.data.PokemonInteractionsSyncPacket
|
import com.cobblemon.mod.common.net.messages.client.data.PokemonInteractionsSyncPacket
|
||||||
import com.cobblemon.mod.common.pokemon.transformation.adapters.CobblemonRequirementAdapter
|
import com.cobblemon.mod.common.pokemon.adapters.CobblemonRequirementAdapter
|
||||||
import com.cobblemon.mod.common.pokemon.transformation.adapters.LegacyItemConditionWrapperAdapter
|
import com.cobblemon.mod.common.pokemon.evolution.adapters.LegacyItemConditionWrapperAdapter
|
||||||
import com.cobblemon.mod.common.pokemon.transformation.requirements.PokemonPropertiesRequirement
|
import com.cobblemon.mod.common.pokemon.requirements.PokemonPropertiesRequirement
|
||||||
import com.cobblemon.mod.common.util.adapters.*
|
import com.cobblemon.mod.common.util.adapters.*
|
||||||
import com.cobblemon.mod.common.util.cobblemonResource
|
import com.cobblemon.mod.common.util.cobblemonResource
|
||||||
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.advancements.critereon.ItemPredicate
|
||||||
|
import net.minecraft.core.HolderLookup
|
||||||
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
|
||||||
@@ -36,28 +37,31 @@ import net.minecraft.world.level.block.Block
|
|||||||
import net.minecraft.world.level.levelgen.structure.Structure
|
import net.minecraft.world.level.levelgen.structure.Structure
|
||||||
import net.minecraft.world.level.material.Fluid
|
import net.minecraft.world.level.material.Fluid
|
||||||
|
|
||||||
object PokemonInteractions : JsonDataRegistry<PokemonInteractionSet> {
|
object PokemonInteractions : ServerJsonDataRegistry<PokemonInteractionSet> {
|
||||||
override val id = cobblemonResource("pokemon_interactions")
|
override val id = cobblemonResource("pokemon_interactions")
|
||||||
override val type = PackType.SERVER_DATA
|
override val type = PackType.SERVER_DATA
|
||||||
|
override fun setupParser(registry: HolderLookup.Provider): Gson {
|
||||||
|
return GsonBuilder()
|
||||||
|
.registerTypeAdapter(ResourceLocation::class.java, IdentifierAdapter)
|
||||||
|
.registerTypeAdapter(PokemonProperties::class.java, pokemonPropertiesShortAdapter)
|
||||||
|
.registerTypeAdapter(ItemPredicate::class.java, LegacyItemConditionWrapperAdapter(registry))
|
||||||
|
.registerTypeAdapter(Requirement::class.java, CobblemonRequirementAdapter)
|
||||||
|
.registerTypeAdapter(InteractionEffect::class.java, InteractionEffectAdapter)
|
||||||
|
.registerTypeAdapter(ExpressionLike::class.java, ExpressionLikeAdapter)
|
||||||
|
.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, Item::class.java).type, ItemLikeConditionAdapter)
|
||||||
|
.registerTypeAdapter(TypeToken.getParameterized(RegistryLikeCondition::class.java, Structure::class.java).type, StructureLikeConditionAdapter)
|
||||||
|
.registerTypeAdapter(TypeToken.getParameterized(RegistryLikeCondition::class.java, Fluid::class.java).type, FluidLikeConditionAdapter)
|
||||||
|
.registerTypeAdapter(IntRange::class.java, IntRangeAdapter)
|
||||||
|
.registerTypeAdapterFactory(LowerCaseEnumTypeAdapterFactory())
|
||||||
|
.setPrettyPrinting()
|
||||||
|
.create()
|
||||||
|
}
|
||||||
|
|
||||||
override val observable = SimpleObservable<PokemonInteractions>()
|
override val observable = SimpleObservable<PokemonInteractions>()
|
||||||
override val typeToken: TypeToken<PokemonInteractionSet> = TypeToken.get(PokemonInteractionSet::class.java)
|
override val typeToken: TypeToken<PokemonInteractionSet> = TypeToken.get(PokemonInteractionSet::class.java)
|
||||||
override val resourcePath = "pokemon_interactions"
|
override val resourcePath = "pokemon_interactions"
|
||||||
override val gson: Gson = GsonBuilder()
|
|
||||||
.registerTypeAdapter(ResourceLocation::class.java, IdentifierAdapter)
|
|
||||||
.registerTypeAdapter(PokemonProperties::class.java, pokemonPropertiesShortAdapter)
|
|
||||||
.registerTypeAdapter(ItemPredicate::class.java, LegacyItemConditionWrapperAdapter)
|
|
||||||
.registerTypeAdapter(TransformationRequirement::class.java, CobblemonRequirementAdapter)
|
|
||||||
.registerTypeAdapter(InteractionEffect::class.java, InteractionEffectAdapter)
|
|
||||||
.registerTypeAdapter(ExpressionLike::class.java, ExpressionLikeAdapter)
|
|
||||||
.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, Item::class.java).type, ItemLikeConditionAdapter)
|
|
||||||
.registerTypeAdapter(TypeToken.getParameterized(RegistryLikeCondition::class.java, Structure::class.java).type, StructureLikeConditionAdapter)
|
|
||||||
.registerTypeAdapter(TypeToken.getParameterized(RegistryLikeCondition::class.java, Fluid::class.java).type, FluidLikeConditionAdapter)
|
|
||||||
.registerTypeAdapter(IntRange::class.java, IntRangeAdapter)
|
|
||||||
.registerTypeAdapterFactory(LowerCaseEnumTypeAdapterFactory())
|
|
||||||
.setPrettyPrinting()
|
|
||||||
.create()
|
|
||||||
|
|
||||||
val interactions = mutableListOf<PokemonInteractionSet>()
|
val interactions = mutableListOf<PokemonInteractionSet>()
|
||||||
|
|
||||||
@@ -65,7 +69,7 @@ object PokemonInteractions : JsonDataRegistry<PokemonInteractionSet> {
|
|||||||
PokemonInteractionsSyncPacket(interactions).sendToPlayer(player)
|
PokemonInteractionsSyncPacket(interactions).sendToPlayer(player)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun reload(data: Map<ResourceLocation, PokemonInteractionSet>) {
|
override fun reload(data: Map<ResourceLocation, PokemonInteractionSet>, registry: HolderLookup.Provider) {
|
||||||
interactions.clear()
|
interactions.clear()
|
||||||
val split = data.entries
|
val split = data.entries
|
||||||
.partition {
|
.partition {
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ abstract class RequestManager<T : ServerPlayerActionRequest> {
|
|||||||
?: this.getInboundRequest(receiver.uuid, requestID)
|
?: this.getInboundRequest(receiver.uuid, requestID)
|
||||||
|
|
||||||
/** Determines whether [player] can receive a [T]. */
|
/** Determines whether [player] can receive a [T]. */
|
||||||
open fun isBusy(player: ServerPlayer): Boolean = player.isBusy() || player.isPartyBusy()
|
open fun isBusy(player: ServerPlayer): Boolean = player.isInBattle() || player.isTrading() || player.party().find { it.entity?.isBusy == true } != null
|
||||||
|
|
||||||
/** Determines if the [target] is a valid interaction request target. */
|
/** Determines if the [target] is a valid interaction request target. */
|
||||||
abstract fun isValidInteraction(player: ServerPlayer, target: ServerPlayer): Boolean
|
abstract fun isValidInteraction(player: ServerPlayer, target: ServerPlayer): Boolean
|
||||||
|
|||||||
@@ -21,9 +21,34 @@ import com.cobblemon.mod.common.api.battles.interpreter.BattleMessage
|
|||||||
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.BattleActor
|
import com.cobblemon.mod.common.api.battles.model.actor.BattleActor
|
||||||
import com.cobblemon.mod.common.api.drop.DropEntry
|
import com.cobblemon.mod.common.api.drop.DropEntry
|
||||||
import com.cobblemon.mod.common.api.molang.function.*
|
import com.cobblemon.mod.common.api.molang.function.BattleActorMoLangFunctions
|
||||||
|
import com.cobblemon.mod.common.api.molang.function.BattleMessageMoLangFunctions
|
||||||
|
import com.cobblemon.mod.common.api.molang.function.BattleMoLangFunctions
|
||||||
|
import com.cobblemon.mod.common.api.molang.function.BiomeMoLangFunctions
|
||||||
|
import com.cobblemon.mod.common.api.molang.function.BlockMoLangFunctions
|
||||||
|
import com.cobblemon.mod.common.api.molang.function.DimensionTypeMoLangFunctions
|
||||||
|
import com.cobblemon.mod.common.api.molang.function.DropEntryMoLangFunctions
|
||||||
|
import com.cobblemon.mod.common.api.molang.function.EntityMoLangFunctions
|
||||||
|
import com.cobblemon.mod.common.api.molang.function.EvolutionMoLangFunctions
|
||||||
|
import com.cobblemon.mod.common.api.molang.function.GeneralMoLangFunctions
|
||||||
|
import com.cobblemon.mod.common.api.molang.function.ItemStackMoLangFunctions
|
||||||
|
import com.cobblemon.mod.common.api.molang.function.LivingEntityMoLangFunctions
|
||||||
|
import com.cobblemon.mod.common.api.molang.function.NPCMoLangFunctions
|
||||||
|
import com.cobblemon.mod.common.api.molang.function.PCMoLangFunctions
|
||||||
|
import com.cobblemon.mod.common.api.molang.function.PartyMoLangFunctions
|
||||||
|
import com.cobblemon.mod.common.api.molang.function.PlayerMoLangFunctions
|
||||||
|
import com.cobblemon.mod.common.api.molang.function.PokedexMoLangFunctions
|
||||||
|
import com.cobblemon.mod.common.api.molang.function.PokemonEntityMoLangFunctions
|
||||||
|
import com.cobblemon.mod.common.api.molang.function.PokemonMoLangFunctions
|
||||||
|
import com.cobblemon.mod.common.api.molang.function.PokemonPropertiesMoLangFunctions
|
||||||
|
import com.cobblemon.mod.common.api.molang.function.PokemonStoreMoLangFunctions
|
||||||
|
import com.cobblemon.mod.common.api.molang.function.ServerMoLangFunctions
|
||||||
|
import com.cobblemon.mod.common.api.molang.function.SpawnablePositionMoLangFunctions
|
||||||
|
import com.cobblemon.mod.common.api.molang.function.SpeciesMoLangFunctions
|
||||||
|
import com.cobblemon.mod.common.api.molang.function.WorldMoLangFunctions
|
||||||
import com.cobblemon.mod.common.api.pokedex.AbstractPokedexManager
|
import com.cobblemon.mod.common.api.pokedex.AbstractPokedexManager
|
||||||
import com.cobblemon.mod.common.api.pokemon.PokemonProperties
|
import com.cobblemon.mod.common.api.pokemon.PokemonProperties
|
||||||
|
import com.cobblemon.mod.common.api.pokemon.evolution.Evolution
|
||||||
import com.cobblemon.mod.common.api.scripting.CobblemonScripts
|
import com.cobblemon.mod.common.api.scripting.CobblemonScripts
|
||||||
import com.cobblemon.mod.common.api.spawning.position.SpawnablePosition
|
import com.cobblemon.mod.common.api.spawning.position.SpawnablePosition
|
||||||
import com.cobblemon.mod.common.api.storage.PokemonStore
|
import com.cobblemon.mod.common.api.storage.PokemonStore
|
||||||
@@ -33,10 +58,8 @@ import com.cobblemon.mod.common.entity.npc.NPCEntity
|
|||||||
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 com.cobblemon.mod.common.pokemon.Species
|
import com.cobblemon.mod.common.pokemon.Species
|
||||||
import com.cobblemon.mod.common.pokemon.transformation.evolution.Evolution
|
|
||||||
import com.cobblemon.mod.common.util.effectiveName
|
import com.cobblemon.mod.common.util.effectiveName
|
||||||
import com.mojang.datafixers.util.Either
|
import com.mojang.datafixers.util.Either
|
||||||
import java.util.function.Function
|
|
||||||
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.RegistryAccess
|
||||||
@@ -61,6 +84,7 @@ import net.minecraft.world.level.biome.Biome
|
|||||||
import net.minecraft.world.level.block.Block
|
import net.minecraft.world.level.block.Block
|
||||||
import net.minecraft.world.level.dimension.DimensionType
|
import net.minecraft.world.level.dimension.DimensionType
|
||||||
import net.minecraft.world.phys.Vec3
|
import net.minecraft.world.phys.Vec3
|
||||||
|
import java.util.function.Function
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Holds a bunch of useful MoLang trickery that can be used or extended in API
|
* Holds a bunch of useful MoLang trickery that can be used or extended in API
|
||||||
|
|||||||
+1
-1
@@ -13,7 +13,7 @@ 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.battles.model.PokemonBattle
|
import com.cobblemon.mod.common.api.battles.model.PokemonBattle
|
||||||
import com.cobblemon.mod.common.util.asArrayValue
|
import com.cobblemon.mod.common.util.asArrayValue
|
||||||
import java.util.UUID
|
import java.util.*
|
||||||
|
|
||||||
object BattleMoLangFunctions : AbstractMoLangFunctionHolder<PokemonBattle>() {
|
object BattleMoLangFunctions : AbstractMoLangFunctionHolder<PokemonBattle>() {
|
||||||
override fun PokemonBattle.moLangFunctions(): MutableMap<String, (MoParams) -> Any> {
|
override fun PokemonBattle.moLangFunctions(): MutableMap<String, (MoParams) -> Any> {
|
||||||
|
|||||||
+17
-20
@@ -11,34 +11,31 @@ package com.cobblemon.mod.common.api.molang.function
|
|||||||
import com.bedrockk.molang.runtime.MoParams
|
import com.bedrockk.molang.runtime.MoParams
|
||||||
import com.bedrockk.molang.runtime.value.DoubleValue
|
import com.bedrockk.molang.runtime.value.DoubleValue
|
||||||
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asMoLangValue
|
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asMoLangValue
|
||||||
import com.cobblemon.mod.common.api.pokemon.transformation.Transformation
|
import com.cobblemon.mod.common.api.pokemon.evolution.Evolution
|
||||||
import com.cobblemon.mod.common.pokemon.transformation.evolution.Evolution
|
import com.cobblemon.mod.common.pokemon.evolution.variants.ItemInteractionEvolution
|
||||||
import com.cobblemon.mod.common.pokemon.transformation.triggers.ItemInteractionTrigger
|
import com.cobblemon.mod.common.pokemon.evolution.variants.LevelUpEvolution
|
||||||
import com.cobblemon.mod.common.pokemon.transformation.triggers.LevelUpTrigger
|
import com.cobblemon.mod.common.pokemon.evolution.variants.TradeEvolution
|
||||||
import com.cobblemon.mod.common.pokemon.transformation.triggers.TradeTrigger
|
|
||||||
|
|
||||||
object EvolutionMoLangFunctions : AbstractMoLangFunctionHolder<Transformation>() {
|
object EvolutionMoLangFunctions : AbstractMoLangFunctionHolder<Evolution>() {
|
||||||
override fun Transformation.moLangFunctions(): MutableMap<String, (MoParams) -> Any> {
|
override fun Evolution.moLangFunctions(): MutableMap<String, (MoParams) -> Any> {
|
||||||
val evolution = this
|
val evolution = this
|
||||||
val functions = hashMapOf<String, (MoParams) -> Any>()
|
val functions = hashMapOf<String, (MoParams) -> Any>()
|
||||||
|
|
||||||
|
functions["result"] = { evolution.result.asMoLangValue() }
|
||||||
functions["is_optional"] = { DoubleValue(evolution.optional) }
|
functions["is_optional"] = { DoubleValue(evolution.optional) }
|
||||||
functions["reevaluate"] = { DoubleValue(evolution.reevaluate) }
|
functions["consumes_held_item"] = { DoubleValue(evolution.consumeHeldItem) }
|
||||||
|
|
||||||
if (evolution is Evolution) {
|
when (evolution) {
|
||||||
functions["result"] = { evolution.result.asMoLangValue() }
|
is LevelUpEvolution -> {
|
||||||
when (evolution.trigger) {
|
functions["is_level_up"] = { DoubleValue.ONE }
|
||||||
is LevelUpTrigger -> {
|
}
|
||||||
functions["is_level_up"] = { DoubleValue.ONE }
|
|
||||||
}
|
|
||||||
|
|
||||||
is TradeTrigger -> {
|
is TradeEvolution -> {
|
||||||
functions["is_trade"] = { DoubleValue.ONE }
|
functions["is_trade"] = { DoubleValue.ONE }
|
||||||
}
|
}
|
||||||
|
|
||||||
is ItemInteractionTrigger -> {
|
is ItemInteractionEvolution -> {
|
||||||
functions["is_item"] = { DoubleValue.ONE }
|
functions["is_item"] = { DoubleValue.ONE }
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+22
@@ -16,6 +16,7 @@ import com.cobblemon.mod.common.api.molang.ObjectValue
|
|||||||
import com.cobblemon.mod.common.api.pokedex.AbstractPokedexManager
|
import com.cobblemon.mod.common.api.pokedex.AbstractPokedexManager
|
||||||
import com.cobblemon.mod.common.api.pokedex.CaughtCount
|
import com.cobblemon.mod.common.api.pokedex.CaughtCount
|
||||||
import com.cobblemon.mod.common.api.pokedex.CaughtPercent
|
import com.cobblemon.mod.common.api.pokedex.CaughtPercent
|
||||||
|
import com.cobblemon.mod.common.api.pokedex.Dexes
|
||||||
import com.cobblemon.mod.common.api.pokedex.PokedexEntryProgress
|
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
|
||||||
@@ -74,6 +75,27 @@ object PokedexMoLangFunctions : AbstractMoLangFunctionHolder<AbstractPokedexMana
|
|||||||
functions["caught_percent"] = { DoubleValue(pokedex.getGlobalCalculatedValue(CaughtPercent)) }
|
functions["caught_percent"] = { DoubleValue(pokedex.getGlobalCalculatedValue(CaughtPercent)) }
|
||||||
functions["seen_percent"] = { DoubleValue(pokedex.getGlobalCalculatedValue(SeenPercent)) }
|
functions["seen_percent"] = { DoubleValue(pokedex.getGlobalCalculatedValue(SeenPercent)) }
|
||||||
|
|
||||||
|
functions["dex_caught_count"] = { params ->
|
||||||
|
val dexId = params.getString(0).asIdentifierDefaultingNamespace()
|
||||||
|
if (Dexes.dexEntryMap.containsKey(dexId)) DoubleValue(pokedex.getDexCalculatedValue(dexId, CaughtCount))
|
||||||
|
else DoubleValue.ZERO
|
||||||
|
}
|
||||||
|
functions["dex_seen_count"] = { params ->
|
||||||
|
val dexId = params.getString(0).asIdentifierDefaultingNamespace()
|
||||||
|
if (Dexes.dexEntryMap.containsKey(dexId)) DoubleValue(pokedex.getDexCalculatedValue(dexId, SeenCount))
|
||||||
|
else DoubleValue.ZERO
|
||||||
|
}
|
||||||
|
functions["dex_caught_percent"] = { params ->
|
||||||
|
val dexId = params.getString(0).asIdentifierDefaultingNamespace()
|
||||||
|
if (Dexes.dexEntryMap.containsKey(dexId)) DoubleValue(pokedex.getDexCalculatedValue(dexId, CaughtPercent).toDouble())
|
||||||
|
else DoubleValue.ZERO
|
||||||
|
}
|
||||||
|
functions["dex_seen_percent"] = { params ->
|
||||||
|
val dexId = params.getString(0).asIdentifierDefaultingNamespace()
|
||||||
|
if (Dexes.dexEntryMap.containsKey(dexId)) DoubleValue(pokedex.getDexCalculatedValue(dexId, SeenPercent).toDouble())
|
||||||
|
else DoubleValue.ZERO
|
||||||
|
}
|
||||||
|
|
||||||
when (pokedex) {
|
when (pokedex) {
|
||||||
is PokedexManager -> {
|
is PokedexManager -> {
|
||||||
functions["player_id"] = { StringValue(pokedex.uuid.toString()) }
|
functions["player_id"] = { StringValue(pokedex.uuid.toString()) }
|
||||||
|
|||||||
+1
-1
@@ -445,7 +445,7 @@ object PokemonMoLangFunctions : AbstractMoLangFunctionHolder<Pokemon>() {
|
|||||||
val idx = params.getInt(0)
|
val idx = params.getInt(0)
|
||||||
val evolution =
|
val evolution =
|
||||||
if (idx >= 0) pokemon.evolutions.elementAtOrNull(idx) else return@forceEvolve DoubleValue.ZERO
|
if (idx >= 0) pokemon.evolutions.elementAtOrNull(idx) else return@forceEvolve DoubleValue.ZERO
|
||||||
evolution?.perform(pokemon)
|
evolution?.forceEvolve(pokemon)
|
||||||
StringValue(evolution.toString())
|
StringValue(evolution.toString())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,8 +12,6 @@ import com.bedrockk.molang.runtime.struct.MoStruct
|
|||||||
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.bedrockk.molang.runtime.value.StringValue
|
import com.bedrockk.molang.runtime.value.StringValue
|
||||||
import com.cobblemon.mod.common.api.data.ShowdownIdentifiable
|
|
||||||
import com.cobblemon.mod.common.api.moves.animations.ActionEffectTimeline
|
|
||||||
import com.cobblemon.mod.common.api.moves.categories.DamageCategories
|
import com.cobblemon.mod.common.api.moves.categories.DamageCategories
|
||||||
import com.cobblemon.mod.common.api.moves.categories.DamageCategory
|
import com.cobblemon.mod.common.api.moves.categories.DamageCategory
|
||||||
import com.cobblemon.mod.common.api.types.ElementalType
|
import com.cobblemon.mod.common.api.types.ElementalType
|
||||||
@@ -57,7 +55,7 @@ open class MoveTemplate(
|
|||||||
val critRatio: Double,
|
val critRatio: Double,
|
||||||
val effectChances: Array<Double>,
|
val effectChances: Array<Double>,
|
||||||
val weight: Float
|
val weight: Float
|
||||||
) : ShowdownIdentifiable {
|
) {
|
||||||
val struct: MoStruct by lazy {
|
val struct: MoStruct by lazy {
|
||||||
QueryStruct(hashMapOf())
|
QueryStruct(hashMapOf())
|
||||||
.addFunction("name") { StringValue(name) }
|
.addFunction("name") { StringValue(name) }
|
||||||
@@ -165,8 +163,6 @@ open class MoveTemplate(
|
|||||||
return this.elementalType
|
return this.elementalType
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun showdownId() = ShowdownIdentifiable.REGEX.replace(this.name.lowercase(), "")
|
|
||||||
|
|
||||||
fun getSelectionWeight(form: FormData): Float {
|
fun getSelectionWeight(form: FormData): Float {
|
||||||
return if (this in form.signatureMoves) {
|
return if (this in form.signatureMoves) {
|
||||||
weight * MovesetBuilder.signatureMoveWeightMultiplier
|
weight * MovesetBuilder.signatureMoveWeightMultiplier
|
||||||
|
|||||||
+4
-42
@@ -10,17 +10,13 @@ package com.cobblemon.mod.common.api.moves.animations
|
|||||||
|
|
||||||
import com.bedrockk.molang.runtime.MoLangRuntime
|
import com.bedrockk.molang.runtime.MoLangRuntime
|
||||||
import com.cobblemon.mod.common.api.molang.ExpressionLike
|
import com.cobblemon.mod.common.api.molang.ExpressionLike
|
||||||
import com.cobblemon.mod.common.api.molang.MoLangFunctions.addStandardFunctions
|
|
||||||
import com.cobblemon.mod.common.api.moves.animations.keyframes.ActionEffectKeyframe
|
import com.cobblemon.mod.common.api.moves.animations.keyframes.ActionEffectKeyframe
|
||||||
import com.cobblemon.mod.common.api.scheduling.Schedulable
|
|
||||||
import com.cobblemon.mod.common.api.scheduling.ServerTaskTracker
|
|
||||||
import com.cobblemon.mod.common.entity.npc.NPCEntity
|
import com.cobblemon.mod.common.entity.npc.NPCEntity
|
||||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
|
||||||
import com.cobblemon.mod.common.util.asExpressionLike
|
import com.cobblemon.mod.common.util.asExpressionLike
|
||||||
import com.cobblemon.mod.common.util.resolveBoolean
|
import com.cobblemon.mod.common.util.resolveBoolean
|
||||||
import java.util.concurrent.CompletableFuture
|
|
||||||
import net.minecraft.world.entity.Entity
|
import net.minecraft.world.entity.Entity
|
||||||
import net.minecraft.world.level.Level
|
import net.minecraft.world.level.Level
|
||||||
|
import java.util.concurrent.CompletableFuture
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An action effect will run and execute a series of 'keyframes', with each running once
|
* An action effect will run and execute a series of 'keyframes', with each running once
|
||||||
@@ -40,7 +36,7 @@ class ActionEffectTimeline(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun run(context: ActionEffectContext): CompletableFuture<Unit> {
|
fun run(context: ActionEffectContext): CompletableFuture<Unit> {
|
||||||
val future = if (timeline.isEmpty() || !context.runtime.resolveBoolean(condition)) {
|
return if (timeline.isEmpty() || !context.runtime.resolveBoolean(condition)) {
|
||||||
CompletableFuture.completedFuture(Unit)
|
CompletableFuture.completedFuture(Unit)
|
||||||
} else {
|
} else {
|
||||||
val finalFuture = CompletableFuture<Unit>()
|
val finalFuture = CompletableFuture<Unit>()
|
||||||
@@ -51,10 +47,6 @@ class ActionEffectTimeline(
|
|||||||
it.printStackTrace()
|
it.printStackTrace()
|
||||||
CompletableFuture.completedFuture(Unit)
|
CompletableFuture.completedFuture(Unit)
|
||||||
}
|
}
|
||||||
|
|
||||||
context.future = future
|
|
||||||
future.thenRun { context.getHolds().forEach(context::removeHold) }
|
|
||||||
return future
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun chainKeyframes(context: ActionEffectContext, iterator: Iterator<ActionEffectKeyframe>, finalFuture: CompletableFuture<Unit>) {
|
fun chainKeyframes(context: ActionEffectContext, iterator: Iterator<ActionEffectKeyframe>, finalFuture: CompletableFuture<Unit>) {
|
||||||
@@ -73,45 +65,15 @@ class ActionEffectTimeline(
|
|||||||
|
|
||||||
class ActionEffectContext(
|
class ActionEffectContext(
|
||||||
val actionEffect: ActionEffectTimeline,
|
val actionEffect: ActionEffectTimeline,
|
||||||
private val holds: MutableSet<String> = mutableSetOf(),
|
val holds: MutableSet<String> = mutableSetOf(),
|
||||||
val providers: MutableList<Any> = mutableListOf(),
|
val providers: MutableList<Any> = mutableListOf(),
|
||||||
val runtime: MoLangRuntime,
|
val runtime: MoLangRuntime,
|
||||||
var canBeInterrupted: Boolean = false,
|
var canBeInterrupted: Boolean = false,
|
||||||
var interrupted: Boolean = false,
|
var interrupted: Boolean = false,
|
||||||
var currentKeyframes: MutableList<ActionEffectKeyframe> = mutableListOf(),
|
var currentKeyframes: MutableList<ActionEffectKeyframe> = mutableListOf(),
|
||||||
var level: Level? = null,
|
var level: Level? = null
|
||||||
var holdRemovalCallbacks: MutableMap<String, () -> Unit> = mutableMapOf(),
|
|
||||||
var tracker: Schedulable = ServerTaskTracker
|
|
||||||
) {
|
) {
|
||||||
companion object {
|
|
||||||
fun fromPokemonEntity(
|
|
||||||
actionEffect: ActionEffectTimeline,
|
|
||||||
pokemonEntity: PokemonEntity,
|
|
||||||
runtime: MoLangRuntime = MoLangRuntime().also { it.environment.query.addStandardFunctions() },
|
|
||||||
holds: Collection<String> = emptySet(),
|
|
||||||
holdRemovalCallbacks: Map<String, () -> Unit> = emptyMap()
|
|
||||||
): ActionEffectContext {
|
|
||||||
return ActionEffectContext(
|
|
||||||
actionEffect = actionEffect,
|
|
||||||
providers = mutableListOf(UsersProvider(listOf(pokemonEntity))),
|
|
||||||
holdRemovalCallbacks = holdRemovalCallbacks.toMutableMap(),
|
|
||||||
holds = holds.toMutableSet(),
|
|
||||||
runtime = runtime,
|
|
||||||
level = pokemonEntity.level()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
lateinit var future: CompletableFuture<Unit>
|
|
||||||
inline fun <reified T> findOneProvider() = providers.filterIsInstance<T>().firstOrNull()
|
inline fun <reified T> findOneProvider() = providers.filterIsInstance<T>().firstOrNull()
|
||||||
|
|
||||||
/** Returns a reference to the internal holds set so you can keep an eye on it. */
|
|
||||||
fun getHolds(): Set<String> = holds
|
|
||||||
fun addHold(hold: String) = holds.add(hold)
|
|
||||||
fun removeHold(hold: String) {
|
|
||||||
holds.remove(hold)
|
|
||||||
holdRemovalCallbacks.remove(hold)?.invoke()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class UsersProvider(users: List<Entity>): EntityProvider {
|
class UsersProvider(users: List<Entity>): EntityProvider {
|
||||||
|
|||||||
+1
-1
@@ -21,7 +21,7 @@ import java.util.concurrent.CompletableFuture
|
|||||||
class AddHoldsActionEffectKeyframe : ActionEffectKeyframe {
|
class AddHoldsActionEffectKeyframe : ActionEffectKeyframe {
|
||||||
val holds = mutableSetOf<String>()
|
val holds = mutableSetOf<String>()
|
||||||
override fun play(context: ActionEffectContext): CompletableFuture<Unit> {
|
override fun play(context: ActionEffectContext): CompletableFuture<Unit> {
|
||||||
holds.forEach(context::addHold)
|
context.holds.addAll(holds)
|
||||||
return CompletableFuture.completedFuture(Unit)
|
return CompletableFuture.completedFuture(Unit)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+1
-1
@@ -49,6 +49,6 @@ class AnimationActionEffectKeyframe : ConditionalActionEffectKeyframe(), EntityC
|
|||||||
players.forEach { it.sendPacket(pkt) }
|
players.forEach { it.sendPacket(pkt) }
|
||||||
}
|
}
|
||||||
|
|
||||||
return delayedFuture(seconds = delay.resolveFloat(context.runtime), tracker = context.tracker)
|
return delayedFuture(seconds = delay.resolveFloat(context.runtime))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+1
-1
@@ -46,6 +46,6 @@ class EntityMoLangActionEffectKeyframe : ConditionalActionEffectKeyframe(), Enti
|
|||||||
players.forEach { it.sendPacket(pkt) }
|
players.forEach { it.sendPacket(pkt) }
|
||||||
}
|
}
|
||||||
|
|
||||||
return delayedFuture(seconds = delay.resolveFloat(context.runtime), context.tracker)
|
return delayedFuture(seconds = delay.resolveFloat(context.runtime))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+2
-1
@@ -18,6 +18,7 @@ import com.cobblemon.mod.common.entity.PosableEntity
|
|||||||
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.util.asExpressionLike
|
import com.cobblemon.mod.common.util.asExpressionLike
|
||||||
import com.cobblemon.mod.common.util.asIdentifierDefaultingNamespace
|
import com.cobblemon.mod.common.util.asIdentifierDefaultingNamespace
|
||||||
|
import net.minecraft.commands.arguments.EntityArgument.getPlayers
|
||||||
import java.util.concurrent.CompletableFuture
|
import java.util.concurrent.CompletableFuture
|
||||||
import net.minecraft.server.level.ServerLevel
|
import net.minecraft.server.level.ServerLevel
|
||||||
|
|
||||||
@@ -78,6 +79,6 @@ class EntityParticlesActionEffectKeyframe : ConditionalActionEffectKeyframe(), E
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return delayedFuture(seconds = delay.resolveFloat(context.runtime), context.tracker)
|
return delayedFuture(seconds = delay.resolveFloat(context.runtime))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+2
-2
@@ -15,8 +15,8 @@ import com.cobblemon.mod.common.api.moves.animations.UsersProvider
|
|||||||
import com.cobblemon.mod.common.api.scheduling.delayedFuture
|
import com.cobblemon.mod.common.api.scheduling.delayedFuture
|
||||||
import com.cobblemon.mod.common.util.asExpressionLike
|
import com.cobblemon.mod.common.util.asExpressionLike
|
||||||
import com.cobblemon.mod.common.util.asIdentifierDefaultingNamespace
|
import com.cobblemon.mod.common.util.asIdentifierDefaultingNamespace
|
||||||
import java.util.concurrent.CompletableFuture
|
|
||||||
import net.minecraft.core.registries.Registries
|
import net.minecraft.core.registries.Registries
|
||||||
|
import java.util.concurrent.CompletableFuture
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An action effect keyframe that plays a positioned sound for all matching entities.
|
* An action effect keyframe that plays a positioned sound for all matching entities.
|
||||||
@@ -45,6 +45,6 @@ class EntitySoundActionEffectKeyframe : ConditionalActionEffectKeyframe(), Entit
|
|||||||
entity.playSound(soundEvent, 1f, 1f)
|
entity.playSound(soundEvent, 1f, 1f)
|
||||||
}
|
}
|
||||||
|
|
||||||
return delayedFuture(seconds = delay.resolveFloat(context.runtime), context.tracker)
|
return delayedFuture(seconds = delay.resolveFloat(context.runtime))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+3
-1
@@ -8,6 +8,8 @@
|
|||||||
|
|
||||||
package com.cobblemon.mod.common.api.moves.animations.keyframes
|
package com.cobblemon.mod.common.api.moves.animations.keyframes
|
||||||
|
|
||||||
|
import com.bedrockk.molang.runtime.struct.QueryStruct
|
||||||
|
import com.cobblemon.mod.common.Cobblemon
|
||||||
import com.cobblemon.mod.common.api.molang.ExpressionLike
|
import com.cobblemon.mod.common.api.molang.ExpressionLike
|
||||||
import com.cobblemon.mod.common.api.moves.animations.ActionEffectContext
|
import com.cobblemon.mod.common.api.moves.animations.ActionEffectContext
|
||||||
import com.cobblemon.mod.common.api.scheduling.delayedFuture
|
import com.cobblemon.mod.common.api.scheduling.delayedFuture
|
||||||
@@ -25,6 +27,6 @@ class MoLangActionEffectKeyframe : ActionEffectKeyframe {
|
|||||||
val delay: ExpressionLike = "0".asExpressionLike()
|
val delay: ExpressionLike = "0".asExpressionLike()
|
||||||
override fun play(context: ActionEffectContext): CompletableFuture<Unit> {
|
override fun play(context: ActionEffectContext): CompletableFuture<Unit> {
|
||||||
expressions.resolve(context.runtime)
|
expressions.resolve(context.runtime)
|
||||||
return delayedFuture(seconds = delay.resolveFloat(context.runtime), context.tracker)
|
return delayedFuture(seconds = delay.resolveFloat(context.runtime))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+2
-1
@@ -13,6 +13,7 @@ import com.cobblemon.mod.common.api.moves.animations.ActionEffectTimeline
|
|||||||
import com.cobblemon.mod.common.api.moves.animations.ActionEffects
|
import com.cobblemon.mod.common.api.moves.animations.ActionEffects
|
||||||
import com.cobblemon.mod.common.api.moves.animations.TargetsProvider
|
import com.cobblemon.mod.common.api.moves.animations.TargetsProvider
|
||||||
import com.cobblemon.mod.common.api.moves.animations.UsersProvider
|
import com.cobblemon.mod.common.api.moves.animations.UsersProvider
|
||||||
|
import com.cobblemon.mod.common.api.scheduling.afterOnServer
|
||||||
import com.cobblemon.mod.common.entity.ai.OmniPathNavigation.NavigationContext
|
import com.cobblemon.mod.common.entity.ai.OmniPathNavigation.NavigationContext
|
||||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||||
import com.cobblemon.mod.common.util.asExpressionLike
|
import com.cobblemon.mod.common.util.asExpressionLike
|
||||||
@@ -60,7 +61,7 @@ class MoveToTargetActionEffectKeyframe : ActionEffectKeyframe {
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
context.tracker.after(seconds = timeout.resolveFloat(context.runtime)) {
|
afterOnServer(seconds = timeout.resolveFloat(context.runtime)) {
|
||||||
if (!future.isDone && !timedOut) {
|
if (!future.isDone && !timedOut) {
|
||||||
timedOut = true
|
timedOut = true
|
||||||
timeoutEffect.run(context).thenApply { future.complete(Unit) }
|
timeoutEffect.run(context).thenApply { future.complete(Unit) }
|
||||||
|
|||||||
+1
-1
@@ -14,5 +14,5 @@ import com.cobblemon.mod.common.util.asExpressionLike
|
|||||||
|
|
||||||
class PauseActionEffectKeyframe : ConditionalActionEffectKeyframe() {
|
class PauseActionEffectKeyframe : ConditionalActionEffectKeyframe() {
|
||||||
val pause = "1".asExpressionLike()
|
val pause = "1".asExpressionLike()
|
||||||
override fun playWhenTrue(context: ActionEffectContext) = delayedFuture(seconds = pause.resolveFloat(context.runtime), context.tracker)
|
override fun playWhenTrue(context: ActionEffectContext) = delayedFuture(seconds = pause.resolveFloat(context.runtime))
|
||||||
}
|
}
|
||||||
+5
-2
@@ -25,8 +25,11 @@ class RemoveHoldsActionEffectKeyframe : ActionEffectKeyframe {
|
|||||||
val holds = mutableSetOf<String>()
|
val holds = mutableSetOf<String>()
|
||||||
override fun play(context: ActionEffectContext): CompletableFuture<Unit> {
|
override fun play(context: ActionEffectContext): CompletableFuture<Unit> {
|
||||||
return delayedFuture(seconds = delay).thenApply {
|
return delayedFuture(seconds = delay).thenApply {
|
||||||
val holdsToRemove = if (holds.isEmpty()) context.getHolds() else holds
|
if (holds.isEmpty()) {
|
||||||
holdsToRemove.forEach(context::removeHold)
|
context.holds.clear()
|
||||||
|
} else {
|
||||||
|
context.holds.removeAll(holds)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+3
-2
@@ -13,12 +13,13 @@ import com.cobblemon.mod.common.api.moves.animations.ActionEffectContext
|
|||||||
import com.cobblemon.mod.common.api.moves.animations.ActionEffectTimeline
|
import com.cobblemon.mod.common.api.moves.animations.ActionEffectTimeline
|
||||||
import com.cobblemon.mod.common.api.moves.animations.ActionEffects
|
import com.cobblemon.mod.common.api.moves.animations.ActionEffects
|
||||||
import com.cobblemon.mod.common.api.moves.animations.UsersProvider
|
import com.cobblemon.mod.common.api.moves.animations.UsersProvider
|
||||||
|
import com.cobblemon.mod.common.api.scheduling.after
|
||||||
import com.cobblemon.mod.common.entity.ai.OmniPathNavigation.NavigationContext
|
import com.cobblemon.mod.common.entity.ai.OmniPathNavigation.NavigationContext
|
||||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||||
import com.cobblemon.mod.common.util.asExpressionLike
|
import com.cobblemon.mod.common.util.asExpressionLike
|
||||||
import java.util.concurrent.CompletableFuture
|
|
||||||
import net.minecraft.resources.ResourceLocation
|
import net.minecraft.resources.ResourceLocation
|
||||||
import net.minecraft.world.phys.Vec3
|
import net.minecraft.world.phys.Vec3
|
||||||
|
import java.util.concurrent.CompletableFuture
|
||||||
|
|
||||||
class ReturnToPositionActionEffectKeyframe : ActionEffectKeyframe {
|
class ReturnToPositionActionEffectKeyframe : ActionEffectKeyframe {
|
||||||
val speed = 1F
|
val speed = 1F
|
||||||
@@ -55,7 +56,7 @@ class ReturnToPositionActionEffectKeyframe : ActionEffectKeyframe {
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
context.tracker.after(seconds = timeout.resolveFloat(context.runtime)) {
|
after(seconds = timeout.resolveFloat(context.runtime)) {
|
||||||
if (!future.isDone && !timedOut) {
|
if (!future.isDone && !timedOut) {
|
||||||
timedOut = true
|
timedOut = true
|
||||||
timeoutEffect.run(context).thenApply { future.complete(Unit) }
|
timeoutEffect.run(context).thenApply { future.complete(Unit) }
|
||||||
|
|||||||
+1
@@ -29,6 +29,7 @@ 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 kotlin.random.Random
|
import kotlin.random.Random
|
||||||
|
import kotlin.ranges.random
|
||||||
import net.minecraft.server.level.ServerPlayer
|
import net.minecraft.server.level.ServerPlayer
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+11
-8
@@ -17,18 +17,21 @@ 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.cobblemonResource
|
|
||||||
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
|
||||||
|
|||||||
+23
-7
@@ -8,8 +8,10 @@
|
|||||||
|
|
||||||
package com.cobblemon.mod.common.api.orientation
|
package com.cobblemon.mod.common.api.orientation
|
||||||
|
|
||||||
|
import com.cobblemon.mod.common.util.math.QuatSpring
|
||||||
import com.cobblemon.mod.common.util.math.geometry.toDegrees
|
import com.cobblemon.mod.common.util.math.geometry.toDegrees
|
||||||
import com.cobblemon.mod.common.util.math.geometry.toRadians
|
import com.cobblemon.mod.common.util.math.geometry.toRadians
|
||||||
|
import com.cobblemon.mod.common.util.math.simpleSpringDamperQuat
|
||||||
import net.minecraft.client.Minecraft
|
import net.minecraft.client.Minecraft
|
||||||
import net.minecraft.util.Mth
|
import net.minecraft.util.Mth
|
||||||
import net.minecraft.world.entity.LivingEntity
|
import net.minecraft.world.entity.LivingEntity
|
||||||
@@ -26,6 +28,8 @@ open class OrientationController(val entity: LivingEntity) {
|
|||||||
val FORWARDS: Vector3f = Vector3f(0.0f, 0.0f, -1.0f)
|
val FORWARDS: Vector3f = Vector3f(0.0f, 0.0f, -1.0f)
|
||||||
val UP: Vector3f = Vector3f(0.0f, 1.0f, 0.0f)
|
val UP: Vector3f = Vector3f(0.0f, 1.0f, 0.0f)
|
||||||
val LEFT: Vector3f = Vector3f(-1.0f, 0.0f, 0.0f)
|
val LEFT: Vector3f = Vector3f(-1.0f, 0.0f, 0.0f)
|
||||||
|
private const val TICK_DT = 1f / 20f // Minecraft server tick rate
|
||||||
|
private const val RENDER_SMOOTH_HALFLIFE = 0.1f // seconds to close ~half the gap
|
||||||
}
|
}
|
||||||
|
|
||||||
open var active: Boolean = false
|
open var active: Boolean = false
|
||||||
@@ -33,6 +37,8 @@ open class OrientationController(val entity: LivingEntity) {
|
|||||||
var orientation: Matrix3f? = null
|
var orientation: Matrix3f? = null
|
||||||
private set
|
private set
|
||||||
|
|
||||||
|
private val renderSpring = QuatSpring()
|
||||||
|
|
||||||
private var renderOrientationO: Matrix3f? = null
|
private var renderOrientationO: Matrix3f? = null
|
||||||
private var renderOrientation: Matrix3f? = null
|
private var renderOrientation: Matrix3f? = null
|
||||||
|
|
||||||
@@ -54,6 +60,8 @@ open class OrientationController(val entity: LivingEntity) {
|
|||||||
orientation = null
|
orientation = null
|
||||||
renderOrientationO = null
|
renderOrientationO = null
|
||||||
renderOrientation = null
|
renderOrientation = null
|
||||||
|
renderSpring.quat.identity()
|
||||||
|
renderSpring.angVel.set(0f, 0f, 0f)
|
||||||
active = false
|
active = false
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -77,18 +85,26 @@ open class OrientationController(val entity: LivingEntity) {
|
|||||||
return oldQuat
|
return oldQuat
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Every tick move the current render orientation towards the last known true orientation **/
|
||||||
fun tick() {
|
fun tick() {
|
||||||
if (!active || orientation == null) return
|
if (!active || orientation == null) return
|
||||||
renderOrientationO = renderOrientation
|
renderOrientationO = renderOrientation
|
||||||
val current = orientation
|
val current = orientation!!
|
||||||
val renderMatrix = this.renderOrientation ?: current
|
val targetQuat = Quaternionf().setFromUnnormalized(current)
|
||||||
val renderQuat = Quaternionf().setFromUnnormalized(renderMatrix)
|
|
||||||
val targetQuat = Quaternionf().setFromUnnormalized(current)
|
if (renderOrientation == null) {
|
||||||
val dampingFactor = 0.66f // Smooth interpolation to reduce jitter of orientations recieved from the server.
|
// First tick: snap the spring to the target instead of easing in from identity
|
||||||
renderQuat.slerp(targetQuat, dampingFactor)
|
renderSpring.quat.set(targetQuat)
|
||||||
|
renderSpring.angVel.set(0f, 0f, 0f)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use a "quat spring" to smoothly move the render orientation towards the goal orientation.
|
||||||
|
// It takes into account the orientations angular velocities and should be much more resilient
|
||||||
|
// to sharp changes in goal orientation or late/missed packets.
|
||||||
|
simpleSpringDamperQuat(renderSpring, targetQuat, 0.15f, TICK_DT)
|
||||||
|
|
||||||
val newRenderOrientation = Matrix3f()
|
val newRenderOrientation = Matrix3f()
|
||||||
renderQuat.get(newRenderOrientation)
|
renderSpring.quat.get(newRenderOrientation)
|
||||||
renderOrientation = newRenderOrientation
|
renderOrientation = newRenderOrientation
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -108,7 +108,7 @@ object CatchRateModifiers {
|
|||||||
* Used by [PokeBalls.SAFARI_BALL].
|
* Used by [PokeBalls.SAFARI_BALL].
|
||||||
* Checks if the target is not battling, if true boost by *1.5
|
* Checks if the target is not battling, if true boost by *1.5
|
||||||
*/
|
*/
|
||||||
val SAFARI = WorldStateModifier { _, entity -> if (!entity.isBattling) 1.5F else 1F }
|
val SAFARI = MultiplierModifier(1.5f) { _, poke -> !poke.entity?.isBattling!! }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Used by [PokeBalls.PARK_BALL].
|
* Used by [PokeBalls.PARK_BALL].
|
||||||
|
|||||||
@@ -13,6 +13,10 @@ import com.cobblemon.mod.common.api.molang.MoLangFunctions.addStandardFunctions
|
|||||||
import com.cobblemon.mod.common.api.molang.ObjectValue
|
import com.cobblemon.mod.common.api.molang.ObjectValue
|
||||||
import com.cobblemon.mod.common.api.pokedex.entry.PokedexEntry
|
import com.cobblemon.mod.common.api.pokedex.entry.PokedexEntry
|
||||||
import com.cobblemon.mod.common.api.pokedex.entry.PokedexForm
|
import com.cobblemon.mod.common.api.pokedex.entry.PokedexForm
|
||||||
|
import com.cobblemon.mod.common.api.pokemon.PokemonSpecies
|
||||||
|
import com.cobblemon.mod.common.api.pokemon.feature.ChoiceSpeciesFeatureProvider
|
||||||
|
import com.cobblemon.mod.common.api.pokemon.feature.SpeciesFeatures
|
||||||
|
import com.cobblemon.mod.common.api.pokemon.feature.WeightedChoiceSpeciesFeatureProvider
|
||||||
import com.cobblemon.mod.common.pokedex.scanner.PokedexEntityData
|
import com.cobblemon.mod.common.pokedex.scanner.PokedexEntityData
|
||||||
import com.cobblemon.mod.common.pokemon.Gender
|
import com.cobblemon.mod.common.pokemon.Gender
|
||||||
import net.minecraft.resources.ResourceLocation
|
import net.minecraft.resources.ResourceLocation
|
||||||
@@ -72,6 +76,57 @@ abstract class AbstractPokedexManager {
|
|||||||
} ?: PokedexEntryProgress.UNREGISTERED
|
} ?: PokedexEntryProgress.UNREGISTERED
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun getHighestKnowledgeFor(entry: PokedexEntry, form: PokedexForm?): PokedexEntryProgress {
|
||||||
|
if (form == null) return getHighestKnowledgeFor(entry)
|
||||||
|
|
||||||
|
val speciesRecord = getSpeciesRecord(entry.speciesId) ?: return PokedexEntryProgress.UNREGISTERED
|
||||||
|
val hasAllAspects = entry.conditionAspects.all(speciesRecord::hasAspect)
|
||||||
|
if (!hasAllAspects) {
|
||||||
|
return PokedexEntryProgress.UNREGISTERED
|
||||||
|
}
|
||||||
|
|
||||||
|
return speciesRecord.getFormRecord(form.displayForm)?.knowledge ?: PokedexEntryProgress.UNREGISTERED
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getHighestKnowledgeFor(entry: PokedexEntry, form: PokedexForm?, aspects: Iterable<String>): PokedexEntryProgress {
|
||||||
|
val formKnowledge = getHighestKnowledgeFor(entry, form)
|
||||||
|
|
||||||
|
if (formKnowledge == PokedexEntryProgress.UNREGISTERED) return PokedexEntryProgress.UNREGISTERED
|
||||||
|
|
||||||
|
val seenAspects = getSeenAspects(entry)
|
||||||
|
|
||||||
|
// Aspects that select one of the species' own forms are already covered by the form knowledge check above,
|
||||||
|
// so exempt them (and every other value of the same feature, since defaults like "phony" never appear on a form directly).
|
||||||
|
val species = PokemonSpecies.getByIdentifier(entry.speciesId)
|
||||||
|
val formAspects = species?.forms?.flatMapTo(hashSetOf()) { it.aspects } ?: emptySet()
|
||||||
|
val formSelectingFeatureAspects = species?.let(SpeciesFeatures::getFeaturesFor).orEmpty()
|
||||||
|
.mapNotNull { provider ->
|
||||||
|
val allAspects: Collection<String> = when (provider) {
|
||||||
|
is ChoiceSpeciesFeatureProvider -> provider.getAllAspects()
|
||||||
|
is WeightedChoiceSpeciesFeatureProvider -> provider.getAllAspects().keys
|
||||||
|
else -> return@mapNotNull null
|
||||||
|
}
|
||||||
|
allAspects.takeIf { it.any { aspect -> aspect in formAspects } }
|
||||||
|
}
|
||||||
|
.flatten()
|
||||||
|
.toHashSet()
|
||||||
|
|
||||||
|
val allSeenAspects = aspects
|
||||||
|
.filter { aspect ->
|
||||||
|
if (Dexes.equivalentFormsLookup[aspect] != null) return@filter false
|
||||||
|
if (aspect in formAspects || aspect in formSelectingFeatureAspects) return@filter false
|
||||||
|
if (aspect.uppercase() in setOf(Gender.MALE.name, Gender.FEMALE.name, Gender.GENDERLESS.name)) return@filter false
|
||||||
|
if ("shiny".equals(aspect, ignoreCase = true)) return@filter false
|
||||||
|
|
||||||
|
return@filter true
|
||||||
|
}
|
||||||
|
.all { aspect -> seenAspects.contains(aspect) }
|
||||||
|
|
||||||
|
if (!allSeenAspects) return PokedexEntryProgress.UNREGISTERED
|
||||||
|
|
||||||
|
return formKnowledge
|
||||||
|
}
|
||||||
|
|
||||||
fun getEncounteredForms(entry: PokedexEntry) : List<PokedexForm> {
|
fun getEncounteredForms(entry: PokedexEntry) : List<PokedexForm> {
|
||||||
return getFormsWithKnowledge(entry, PokedexEntryProgress.SEEN)
|
return getFormsWithKnowledge(entry, PokedexEntryProgress.SEEN)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,9 @@ package com.cobblemon.mod.common.api.pokedex
|
|||||||
|
|
||||||
import com.cobblemon.mod.common.api.data.JsonDataRegistry
|
import com.cobblemon.mod.common.api.data.JsonDataRegistry
|
||||||
import com.cobblemon.mod.common.api.pokedex.def.PokedexDef
|
import com.cobblemon.mod.common.api.pokedex.def.PokedexDef
|
||||||
|
import com.cobblemon.mod.common.api.pokedex.entry.PokedexEntry
|
||||||
|
import com.cobblemon.mod.common.api.pokedex.entry.PokedexForm
|
||||||
|
import com.cobblemon.mod.common.api.pokemon.PokemonSpecies
|
||||||
import com.cobblemon.mod.common.api.reactive.SimpleObservable
|
import com.cobblemon.mod.common.api.reactive.SimpleObservable
|
||||||
import com.cobblemon.mod.common.net.messages.client.data.PokedexDexSyncPacket
|
import com.cobblemon.mod.common.net.messages.client.data.PokedexDexSyncPacket
|
||||||
import com.cobblemon.mod.common.util.adapters.CodecBackedAdapter
|
import com.cobblemon.mod.common.util.adapters.CodecBackedAdapter
|
||||||
@@ -40,6 +43,17 @@ object Dexes : JsonDataRegistry<PokedexDef> {
|
|||||||
//Maps a dex id to its PokedexDef
|
//Maps a dex id to its PokedexDef
|
||||||
val dexEntryMap = linkedMapOf<ResourceLocation, PokedexDef>()
|
val dexEntryMap = linkedMapOf<ResourceLocation, PokedexDef>()
|
||||||
|
|
||||||
|
val equivalentForms = mapOf(
|
||||||
|
"galar" to listOf("region-bias-galar", "bias-galar", "galar-bias", "galarian", "galar"),
|
||||||
|
"alola" to listOf("region-bias-alola", "bias-alola", "alola-bias", "alolan", "alola"),
|
||||||
|
"hisui" to listOf("region-bias-hisui", "bias-hisui", "hisui-bias", "hisuian", "hisui"),
|
||||||
|
"paldea" to listOf("region-bias-paldea", "bias-paldea", "paldea-bias", "paldean", "paldea"),
|
||||||
|
)
|
||||||
|
|
||||||
|
val equivalentFormsLookup = equivalentForms.flatMap { (key, values) ->
|
||||||
|
values.map { it to key }
|
||||||
|
}.toMap()
|
||||||
|
|
||||||
override fun reload(data: Map<ResourceLocation, PokedexDef>) {
|
override fun reload(data: Map<ResourceLocation, PokedexDef>) {
|
||||||
dexEntryMap.clear()
|
dexEntryMap.clear()
|
||||||
data.entries.sortedBy { it.value.sortOrder }.forEach { (id, def) -> dexEntryMap[id] = def }
|
data.entries.sortedBy { it.value.sortOrder }.forEach { (id, def) -> dexEntryMap[id] = def }
|
||||||
@@ -49,4 +63,41 @@ object Dexes : JsonDataRegistry<PokedexDef> {
|
|||||||
override fun sync(player: ServerPlayer) {
|
override fun sync(player: ServerPlayer) {
|
||||||
PokedexDexSyncPacket(dexEntryMap.values).sendToPlayer(player)
|
PokedexDexSyncPacket(dexEntryMap.values).sendToPlayer(player)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun findDexEntryBySpeciesId(regionId: ResourceLocation, speciesId: ResourceLocation): PokedexEntry? {
|
||||||
|
return dexEntryMap[regionId]?.getEntries()?.firstOrNull { it -> it.speciesId == speciesId }
|
||||||
|
}
|
||||||
|
|
||||||
|
fun findDexEntryBySpeciesId(speciesId: ResourceLocation): PokedexEntry? {
|
||||||
|
return findDexEntryBySpeciesId(cobblemonResource("national"), speciesId)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun findRootDexEntryBySpeciesId(speciesId: ResourceLocation, formName: String): Pair<PokedexEntry, PokedexForm> {
|
||||||
|
var rootSpecies = PokemonSpecies.getByIdentifier(speciesId)!!
|
||||||
|
val initialFormEquivalents = getFormEquivalents(formName)
|
||||||
|
var rootForm = rootSpecies.forms.firstOrNull { initialFormEquivalents.contains(it.name.lowercase()) }
|
||||||
|
?: rootSpecies.standardForm
|
||||||
|
|
||||||
|
var preEvolution = rootForm.preEvolution
|
||||||
|
while (preEvolution != null) {
|
||||||
|
rootSpecies = preEvolution.species
|
||||||
|
rootForm = preEvolution.resolveForm(rootForm.aspects.toSet())
|
||||||
|
preEvolution = rootForm.preEvolution
|
||||||
|
}
|
||||||
|
|
||||||
|
val entry = findDexEntryBySpeciesId(rootSpecies.resourceIdentifier)
|
||||||
|
?: throw RuntimeException("Root dex entry not found")
|
||||||
|
|
||||||
|
val formEquivalents = getFormEquivalents(rootForm.name)
|
||||||
|
val form =
|
||||||
|
entry.forms.firstOrNull { formEquivalents.contains(it.displayForm.lowercase()) } ?:
|
||||||
|
entry.forms.first { it.displayForm.equals("Normal", ignoreCase = true) }
|
||||||
|
|
||||||
|
return entry to form
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getFormEquivalents(formName: String): List<String> {
|
||||||
|
val key = equivalentFormsLookup[formName.lowercase()]
|
||||||
|
return equivalentForms[key] ?: listOf(formName.lowercase())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -121,6 +121,7 @@ class SpeciesDexRecord {
|
|||||||
|
|
||||||
fun addAspects(addedAspects: Set<String>) {
|
fun addAspects(addedAspects: Set<String>) {
|
||||||
aspects.addAll(addedAspects)
|
aspects.addAll(addedAspects)
|
||||||
|
pokedexManager.onSpeciesRecordUpdated(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Returns true if the given Pokémon contains new information. Internal because it's only to be called from [FormDexRecord.wouldBeDifferent]. */
|
/** Returns true if the given Pokémon contains new information. Internal because it's only to be called from [FormDexRecord.wouldBeDifferent]. */
|
||||||
|
|||||||
+1
-1
@@ -12,10 +12,10 @@ import com.cobblemon.mod.common.api.pokedex.AbstractPokedexManager
|
|||||||
import com.cobblemon.mod.common.api.pokedex.PokedexEntryProgress
|
import com.cobblemon.mod.common.api.pokedex.PokedexEntryProgress
|
||||||
import com.cobblemon.mod.common.api.pokedex.entry.PokedexEntry
|
import com.cobblemon.mod.common.api.pokedex.entry.PokedexEntry
|
||||||
import com.cobblemon.mod.common.api.pokemon.PokemonSpecies
|
import com.cobblemon.mod.common.api.pokemon.PokemonSpecies
|
||||||
|
import com.cobblemon.mod.common.api.pokemon.evolution.Evolution
|
||||||
import com.cobblemon.mod.common.api.tms.TechnicalMachines
|
import com.cobblemon.mod.common.api.tms.TechnicalMachines
|
||||||
import com.cobblemon.mod.common.client.CobblemonClient
|
import com.cobblemon.mod.common.client.CobblemonClient
|
||||||
import com.cobblemon.mod.common.pokemon.FormData
|
import com.cobblemon.mod.common.pokemon.FormData
|
||||||
import com.cobblemon.mod.common.pokemon.transformation.evolution.Evolution
|
|
||||||
import com.cobblemon.mod.common.util.asIdentifierDefaultingNamespace
|
import com.cobblemon.mod.common.util.asIdentifierDefaultingNamespace
|
||||||
|
|
||||||
enum class PokedexCategoryFilterType {
|
enum class PokedexCategoryFilterType {
|
||||||
|
|||||||
@@ -14,11 +14,11 @@ import com.cobblemon.mod.common.api.pokedex.AbstractPokedexManager
|
|||||||
import com.cobblemon.mod.common.api.pokedex.PokedexEntryProgress
|
import com.cobblemon.mod.common.api.pokedex.PokedexEntryProgress
|
||||||
import com.cobblemon.mod.common.api.pokedex.entry.PokedexEntry
|
import com.cobblemon.mod.common.api.pokedex.entry.PokedexEntry
|
||||||
import com.cobblemon.mod.common.api.pokemon.PokemonSpecies
|
import com.cobblemon.mod.common.api.pokemon.PokemonSpecies
|
||||||
|
import com.cobblemon.mod.common.api.pokemon.evolution.Evolution
|
||||||
import com.cobblemon.mod.common.api.tms.TechnicalMachines
|
import com.cobblemon.mod.common.api.tms.TechnicalMachines
|
||||||
import com.cobblemon.mod.common.client.CobblemonClient
|
import com.cobblemon.mod.common.client.CobblemonClient
|
||||||
import com.cobblemon.mod.common.pokemon.FormData
|
|
||||||
import com.cobblemon.mod.common.pokemon.abilities.HiddenAbility
|
import com.cobblemon.mod.common.pokemon.abilities.HiddenAbility
|
||||||
import com.cobblemon.mod.common.pokemon.transformation.evolution.Evolution
|
import com.cobblemon.mod.common.pokemon.FormData
|
||||||
import com.cobblemon.mod.common.util.asIdentifierDefaultingNamespace
|
import com.cobblemon.mod.common.util.asIdentifierDefaultingNamespace
|
||||||
import com.cobblemon.mod.common.util.asTranslated
|
import com.cobblemon.mod.common.util.asTranslated
|
||||||
import com.cobblemon.mod.common.util.itemRegistry
|
import com.cobblemon.mod.common.util.itemRegistry
|
||||||
|
|||||||
@@ -49,7 +49,6 @@ import com.mojang.brigadier.StringReader
|
|||||||
import com.mojang.serialization.Codec
|
import com.mojang.serialization.Codec
|
||||||
import com.mojang.serialization.JsonOps
|
import com.mojang.serialization.JsonOps
|
||||||
import java.util.UUID
|
import java.util.UUID
|
||||||
import kotlin.jvm.optionals.getOrNull
|
|
||||||
import kotlin.math.min
|
import kotlin.math.min
|
||||||
import kotlin.random.Random
|
import kotlin.random.Random
|
||||||
import net.minecraft.ResourceLocationException
|
import net.minecraft.ResourceLocationException
|
||||||
@@ -66,6 +65,7 @@ import net.minecraft.resources.ResourceLocation
|
|||||||
import net.minecraft.server.level.ServerPlayer
|
import net.minecraft.server.level.ServerPlayer
|
||||||
import net.minecraft.world.item.ItemStack
|
import net.minecraft.world.item.ItemStack
|
||||||
import net.minecraft.world.level.Level
|
import net.minecraft.world.level.Level
|
||||||
|
import kotlin.jvm.optionals.getOrNull
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A grouping of typical, selectable properties for a Pokémon. This is serializable
|
* A grouping of typical, selectable properties for a Pokémon. This is serializable
|
||||||
@@ -168,8 +168,8 @@ open class PokemonProperties {
|
|||||||
parseIntProperty(keyPairs, listOf("${statName}_iv"))?.coerceIn(0, IVs.MAX_VALUE)?.let { maybeIVs[stat] = it }
|
parseIntProperty(keyPairs, listOf("${statName}_iv"))?.coerceIn(0, IVs.MAX_VALUE)?.let { maybeIVs[stat] = it }
|
||||||
parseIntProperty(keyPairs, listOf("${statName}_ev"))?.coerceIn(0, EVs.MAX_STAT_VALUE)?.let { maybeEVs[stat] = it }
|
parseIntProperty(keyPairs, listOf("${statName}_ev"))?.coerceIn(0, EVs.MAX_STAT_VALUE)?.let { maybeEVs[stat] = it }
|
||||||
}
|
}
|
||||||
props.evs = maybeEVs.takeIf { it.total() > 0 }
|
props.ivs = maybeIVs
|
||||||
props.ivs = maybeIVs.takeIf { it.total() > 0 }
|
props.evs = maybeEVs
|
||||||
|
|
||||||
props.updateAspects()
|
props.updateAspects()
|
||||||
return props
|
return props
|
||||||
@@ -519,18 +519,29 @@ open class PokemonProperties {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun matches(properties: PokemonProperties): Boolean {
|
fun matches(properties: PokemonProperties): Boolean {
|
||||||
// Custom properties check could be duplicated but can't assume 3rd party hasn't done anything type specific
|
return properties.asString() == this.asString()
|
||||||
return this.commonMatches(properties) && this.customProperties.containsAll(properties.customProperties)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Undefined properties will match whatever they're compared with
|
|
||||||
private fun commonMatches(pokemon: Pokemon): Boolean {
|
private fun commonMatches(pokemon: Pokemon): Boolean {
|
||||||
level?.takeIf { it != pokemon.level }?.let { return false }
|
level?.takeIf { it != pokemon.level }?.let { return false }
|
||||||
shiny?.takeIf { it != pokemon.shiny }?.let { return false }
|
shiny?.takeIf { it != pokemon.shiny }?.let { return false }
|
||||||
gender?.takeIf { it != pokemon.gender }?.let { return false }
|
gender?.takeIf { it != pokemon.gender }?.let { return false }
|
||||||
species?.takeIf { it.asSpecies() != pokemon.species }?.let { return false }
|
species?.run {
|
||||||
|
try {
|
||||||
|
val species = if (this == "random") {
|
||||||
|
PokemonSpecies.species.random()
|
||||||
|
} else {
|
||||||
|
PokemonSpecies.getByIdentifier(this.asIdentifierDefaultingNamespace()) ?: return@run
|
||||||
|
}
|
||||||
|
if (pokemon.species != species) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
} catch (e: ResourceLocationException) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
nickname?.takeIf { it.string != pokemon.nickname?.string }?.let { return false }
|
nickname?.takeIf { it.string != pokemon.nickname?.string }?.let { return false }
|
||||||
form?.takeIf { !it.equals(pokemon.form.formOnlyShowdownId(), true) }?.let { return false }
|
form?.takeIf { !it.equals(pokemon.form.name, true) }?.let { return false }
|
||||||
friendship?.takeIf { it != pokemon.friendship }?.let { return false }
|
friendship?.takeIf { it != pokemon.friendship }?.let { return false }
|
||||||
fullness?.takeIf { it != pokemon.currentFullness }?.let { return false }
|
fullness?.takeIf { it != pokemon.currentFullness }?.let { return false }
|
||||||
pokeball?.takeIf { it != pokemon.caughtBall.name.toString() }?.let { return false }
|
pokeball?.takeIf { it != pokemon.caughtBall.name.toString() }?.let { return false }
|
||||||
@@ -573,36 +584,6 @@ open class PokemonProperties {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
// Undefined properties will match whatever they're compared with
|
|
||||||
private fun commonMatches(properties: PokemonProperties): Boolean {
|
|
||||||
level?.takeIf { it != properties.level }?.let { return false }
|
|
||||||
shiny?.takeIf { it != properties.shiny }?.let { return false }
|
|
||||||
gender?.takeIf { it != properties.gender }?.let { return false }
|
|
||||||
species?.takeIf { it.asSpecies() != properties.species?.asSpecies() }?.let { return false }
|
|
||||||
nickname?.takeIf { it.string != properties.nickname?.string }?.let { return false }
|
|
||||||
form?.takeIf { it != properties.form }?.let { return false }
|
|
||||||
friendship?.takeIf { it != properties.friendship }?.let { return false }
|
|
||||||
pokeball?.takeIf { it != properties.pokeball }?.let { return false }
|
|
||||||
nature?.takeIf { it != properties.nature }?.let { return false }
|
|
||||||
ability?.takeIf { it != properties.ability }?.let { return false }
|
|
||||||
status?.takeIf { it != properties.status }?.let { return false }
|
|
||||||
ivs?.forEach{ stat ->
|
|
||||||
if (stat.value != properties.ivs?.get(stat.key)) { return false }
|
|
||||||
}
|
|
||||||
evs?.forEach{ stat ->
|
|
||||||
if (stat.value != properties.evs?.get(stat.key)) { return false }
|
|
||||||
}
|
|
||||||
type?.takeIf { it != properties.type }?.let { return false }
|
|
||||||
teraType?.takeIf { it != properties.teraType }?.let { return false }
|
|
||||||
dmaxLevel?.takeIf { it != properties.dmaxLevel }?.let { return false }
|
|
||||||
gmaxFactor?.takeIf { it != properties.gmaxFactor }?.let { return false }
|
|
||||||
tradeable?.takeIf { it != properties.tradeable }?.let { return false }
|
|
||||||
originalTrainer?.takeIf { it != properties.originalTrainer }?.let{ return false }
|
|
||||||
originalTrainerType?.takeIf { it != properties.originalTrainerType }?.let{ return false }
|
|
||||||
moves?.takeIf { it.any { move -> properties.moves?.none { it == move } == true } }?.let { return false }
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO Review the need for this, usage for us is in commands that deviate from the behavior established by multiple Pokémon query equivalent
|
// TODO Review the need for this, usage for us is in commands that deviate from the behavior established by multiple Pokémon query equivalent
|
||||||
fun isSubSetOf(properties: PokemonProperties): Boolean {
|
fun isSubSetOf(properties: PokemonProperties): Boolean {
|
||||||
level?.takeIf { it != properties.level }?.let { return false }
|
level?.takeIf { it != properties.level }?.let { return false }
|
||||||
@@ -923,15 +904,4 @@ open class PokemonProperties {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun hasSpecies() = species?.let { PokemonSpecies.getByIdentifier(it.asIdentifierDefaultingNamespace()) } != null
|
fun hasSpecies() = species?.let { PokemonSpecies.getByIdentifier(it.asIdentifierDefaultingNamespace()) } != null
|
||||||
private fun String.asSpecies() =
|
|
||||||
try {
|
|
||||||
if (this == "random") {
|
|
||||||
PokemonSpecies.species.random()
|
|
||||||
} else {
|
|
||||||
PokemonSpecies.getByIdentifier(this.asIdentifierDefaultingNamespace())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (e: ResourceLocationException) {
|
|
||||||
null
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -12,8 +12,6 @@ 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
|
||||||
import com.cobblemon.mod.common.api.abilities.CommonAbility
|
|
||||||
import com.cobblemon.mod.common.api.abilities.PotentialAbility
|
|
||||||
import com.cobblemon.mod.common.api.ai.SleepDepth
|
import com.cobblemon.mod.common.api.ai.SleepDepth
|
||||||
import com.cobblemon.mod.common.api.ai.config.BehaviourConfig
|
import com.cobblemon.mod.common.api.ai.config.BehaviourConfig
|
||||||
import com.cobblemon.mod.common.api.ai.config.task.TaskConfig
|
import com.cobblemon.mod.common.api.ai.config.task.TaskConfig
|
||||||
@@ -32,39 +30,33 @@ import com.cobblemon.mod.common.api.pokemon.PokemonSpecies.getByIdentifier
|
|||||||
import com.cobblemon.mod.common.api.pokemon.effect.ShoulderEffect
|
import com.cobblemon.mod.common.api.pokemon.effect.ShoulderEffect
|
||||||
import com.cobblemon.mod.common.api.pokemon.effect.adapter.ShoulderEffectAdapter
|
import com.cobblemon.mod.common.api.pokemon.effect.adapter.ShoulderEffectAdapter
|
||||||
import com.cobblemon.mod.common.api.pokemon.egg.EggGroup
|
import com.cobblemon.mod.common.api.pokemon.egg.EggGroup
|
||||||
|
import com.cobblemon.mod.common.api.pokemon.evolution.Evolution
|
||||||
|
import com.cobblemon.mod.common.api.pokemon.evolution.PreEvolution
|
||||||
import com.cobblemon.mod.common.api.pokemon.experience.ExperienceGroup
|
import com.cobblemon.mod.common.api.pokemon.experience.ExperienceGroup
|
||||||
import com.cobblemon.mod.common.api.pokemon.experience.ExperienceGroupAdapter
|
import com.cobblemon.mod.common.api.pokemon.experience.ExperienceGroupAdapter
|
||||||
import com.cobblemon.mod.common.api.pokemon.moves.Learnset
|
import com.cobblemon.mod.common.api.pokemon.moves.Learnset
|
||||||
|
import com.cobblemon.mod.common.api.pokemon.requirement.Requirement
|
||||||
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.pokemon.transformation.evolution.PreEvolution
|
|
||||||
import com.cobblemon.mod.common.api.pokemon.transformation.requirement.TransformationRequirement
|
|
||||||
import com.cobblemon.mod.common.api.pokemon.transformation.trigger.TransformationTrigger
|
|
||||||
import com.cobblemon.mod.common.api.reactive.SimpleObservable
|
import com.cobblemon.mod.common.api.reactive.SimpleObservable
|
||||||
import com.cobblemon.mod.common.api.riding.behaviour.RidingBehaviourSettings
|
import com.cobblemon.mod.common.api.riding.behaviour.RidingBehaviourSettings
|
||||||
import com.cobblemon.mod.common.api.riding.sound.RideSoundSettingsList
|
import com.cobblemon.mod.common.api.riding.sound.RideSoundSettingsList
|
||||||
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
|
||||||
|
import com.cobblemon.mod.common.net.messages.client.data.FormEvolutionOverride
|
||||||
|
import com.cobblemon.mod.common.net.messages.client.data.SpeciesEvolutionEntry
|
||||||
|
import com.cobblemon.mod.common.net.messages.client.data.SpeciesEvolutionSyncPacket
|
||||||
import com.cobblemon.mod.common.net.messages.client.data.SpeciesRegistrySyncPacket
|
import com.cobblemon.mod.common.net.messages.client.data.SpeciesRegistrySyncPacket
|
||||||
import com.cobblemon.mod.common.pokemon.FormData
|
import com.cobblemon.mod.common.pokemon.FormData
|
||||||
import com.cobblemon.mod.common.pokemon.Species
|
import com.cobblemon.mod.common.pokemon.Species
|
||||||
import com.cobblemon.mod.common.pokemon.SpeciesAdditions
|
import com.cobblemon.mod.common.pokemon.SpeciesAdditions
|
||||||
import com.cobblemon.mod.common.pokemon.abilities.HiddenAbility
|
import com.cobblemon.mod.common.pokemon.adapters.CobblemonRequirementAdapter
|
||||||
import com.cobblemon.mod.common.pokemon.abilities.SpecialAbility
|
|
||||||
import com.cobblemon.mod.common.pokemon.ai.ObtainableItemCondition
|
import com.cobblemon.mod.common.pokemon.ai.ObtainableItemCondition
|
||||||
import com.cobblemon.mod.common.pokemon.ai.ObtainableItemConditionAdapter
|
import com.cobblemon.mod.common.pokemon.ai.ObtainableItemConditionAdapter
|
||||||
import com.cobblemon.mod.common.pokemon.transformation.adapters.CobblemonPreEvolutionAdapter
|
import com.cobblemon.mod.common.pokemon.evolution.adapters.CobblemonEvolutionAdapter
|
||||||
import com.cobblemon.mod.common.pokemon.transformation.adapters.CobblemonRequirementAdapter
|
import com.cobblemon.mod.common.pokemon.evolution.adapters.CobblemonPreEvolutionAdapter
|
||||||
import com.cobblemon.mod.common.pokemon.transformation.adapters.CobblemonTriggerAdapter
|
import com.cobblemon.mod.common.pokemon.evolution.adapters.LegacyItemConditionWrapperAdapter
|
||||||
import com.cobblemon.mod.common.pokemon.transformation.adapters.LegacyItemConditionWrapperAdapter
|
|
||||||
import com.cobblemon.mod.common.pokemon.transformation.evolution.Evolution
|
|
||||||
import com.cobblemon.mod.common.pokemon.transformation.form.GigantamaxForm
|
|
||||||
import com.cobblemon.mod.common.pokemon.transformation.form.PermanentForm
|
|
||||||
import com.cobblemon.mod.common.pokemon.transformation.form.StandardForm
|
|
||||||
import com.cobblemon.mod.common.pokemon.transformation.form.TemporaryForm
|
|
||||||
import com.cobblemon.mod.common.pokemon.transformation.requirements.HeldItemRequirement
|
|
||||||
import com.cobblemon.mod.common.pokemon.transformation.requirements.MoveSetRequirement
|
|
||||||
import com.cobblemon.mod.common.util.adapters.*
|
import com.cobblemon.mod.common.util.adapters.*
|
||||||
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
|
||||||
@@ -115,8 +107,10 @@ object PokemonSpecies : JsonDataRegistry<Species> {
|
|||||||
.registerTypeAdapter(ExperienceGroup::class.java, ExperienceGroupAdapter)
|
.registerTypeAdapter(ExperienceGroup::class.java, ExperienceGroupAdapter)
|
||||||
.registerTypeAdapter(EntityDimensions::class.java, EntityDimensionsAdapter)
|
.registerTypeAdapter(EntityDimensions::class.java, EntityDimensionsAdapter)
|
||||||
.registerTypeAdapter(Learnset::class.java, LearnsetAdapter)
|
.registerTypeAdapter(Learnset::class.java, LearnsetAdapter)
|
||||||
|
.registerTypeAdapter(Evolution::class.java, CobblemonEvolutionAdapter)
|
||||||
.registerTypeAdapter(AABB::class.java, BoxAdapter)
|
.registerTypeAdapter(AABB::class.java, BoxAdapter)
|
||||||
.registerTypeAdapter(AbilityPool::class.java, AbilityPoolAdapter)
|
.registerTypeAdapter(AbilityPool::class.java, AbilityPoolAdapter)
|
||||||
|
.registerTypeAdapter(Requirement::class.java, CobblemonRequirementAdapter)
|
||||||
.registerTypeAdapter(PreEvolution::class.java, CobblemonPreEvolutionAdapter)
|
.registerTypeAdapter(PreEvolution::class.java, CobblemonPreEvolutionAdapter)
|
||||||
.registerTypeAdapter(TypeToken.getParameterized(Set::class.java, Evolution::class.java).type, LazySetAdapter(Evolution::class))
|
.registerTypeAdapter(TypeToken.getParameterized(Set::class.java, Evolution::class.java).type, LazySetAdapter(Evolution::class))
|
||||||
.registerTypeAdapter(IntRange::class.java, IntRangeAdapter)
|
.registerTypeAdapter(IntRange::class.java, IntRangeAdapter)
|
||||||
@@ -137,10 +131,7 @@ object PokemonSpecies : JsonDataRegistry<Species> {
|
|||||||
.registerTypeAdapter(TypeToken.getParameterized(RegistryLikeCondition::class.java, Fluid::class.java).type, FluidLikeConditionAdapter)
|
.registerTypeAdapter(TypeToken.getParameterized(RegistryLikeCondition::class.java, Fluid::class.java).type, FluidLikeConditionAdapter)
|
||||||
.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(TransformationTrigger::class.java, CobblemonTriggerAdapter)
|
.registerTypeAdapter(ItemPredicate::class.java, LegacyItemConditionWrapperAdapter())
|
||||||
.registerTypeAdapter(TransformationRequirement::class.java, CobblemonRequirementAdapter)
|
|
||||||
.registerTypeAdapter(ItemPredicate::class.java, LegacyItemConditionWrapperAdapter)
|
|
||||||
.registerTypeAdapter(FormData::class.java, FormAdapter)
|
|
||||||
.registerTypeAdapter(RidingBehaviourSettings::class.java, RidingBehaviourSettingsAdapter)
|
.registerTypeAdapter(RidingBehaviourSettings::class.java, RidingBehaviourSettingsAdapter)
|
||||||
.registerTypeAdapter(RideSoundSettingsList::class.java, RideSoundSettingsListAdapter)
|
.registerTypeAdapter(RideSoundSettingsList::class.java, RideSoundSettingsListAdapter)
|
||||||
.registerTypeAdapter(ObtainableItemCondition::class.java, ObtainableItemConditionAdapter)
|
.registerTypeAdapter(ObtainableItemCondition::class.java, ObtainableItemConditionAdapter)
|
||||||
@@ -164,9 +155,6 @@ object PokemonSpecies : JsonDataRegistry<Species> {
|
|||||||
val implemented: List<Species>
|
val implemented: List<Species>
|
||||||
get() = this.species.filter { it.implemented }
|
get() = this.species.filter { it.implemented }
|
||||||
|
|
||||||
val forms: Collection<FormData>
|
|
||||||
get() = this.species.flatMap { it.allForms }
|
|
||||||
|
|
||||||
init {
|
init {
|
||||||
SpeciesAdditions.observable.subscribe {
|
SpeciesAdditions.observable.subscribe {
|
||||||
this.species.forEach(Species::initialize)
|
this.species.forEach(Species::initialize)
|
||||||
@@ -258,21 +246,49 @@ object PokemonSpecies : JsonDataRegistry<Species> {
|
|||||||
|
|
||||||
override fun sync(player: ServerPlayer) {
|
override fun sync(player: ServerPlayer) {
|
||||||
SpeciesRegistrySyncPacket(species.toList()).sendToPlayer(player)
|
SpeciesRegistrySyncPacket(species.toList()).sendToPlayer(player)
|
||||||
|
// Sent after the species themselves so every species is already registered by the time this is decoded.
|
||||||
|
val evolutionEntries = species.map { singleSpecies ->
|
||||||
|
val formOverrides = singleSpecies.forms.mapNotNull { form ->
|
||||||
|
if (form.ownEvolutions == null && form.ownPreEvolution == null) {
|
||||||
|
null
|
||||||
|
} else {
|
||||||
|
FormEvolutionOverride(form.name, form.ownEvolutions, form.ownPreEvolution)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SpeciesEvolutionEntry(singleSpecies.resourceIdentifier, singleSpecies.evolutions, singleSpecies.preEvolution, formOverrides)
|
||||||
|
}
|
||||||
|
SpeciesEvolutionSyncPacket(evolutionEntries).sendToPlayer(player)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The representation of [FormData] in the context of Showdown.
|
* The representation of a [Species] and/or [FormData] in the context of showdown.
|
||||||
* This is intended as a sort of DTO that can be easily converted between JSON and Java/JS objects.
|
* This is intended as a sort of DTO that can be easily converted between JSON and Java/JS objects.
|
||||||
*
|
*
|
||||||
* @param form The [FormData] being converted into a species (Showdown considers them species).
|
* @param species The [Species] being converted or the base species if the form is not null.
|
||||||
|
* @param form The [FormData] being converted int o species (Showdown considers them species) will be null when dealing with the base form.
|
||||||
*/
|
*/
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
internal open class ShowdownSpecies(form: FormData) {
|
internal class ShowdownSpecies(species: Species, form: FormData?) {
|
||||||
val num = form.species.nationalPokedexNumber
|
val num = species.nationalPokedexNumber
|
||||||
val name = form.showdownName()
|
val name = if (form != null) "${createShowdownName(species)}-${form.name}" else createShowdownName(species)
|
||||||
val types = form.types.map { it.name }
|
val baseSpecies = if (form != null) createShowdownName(species) else this.name
|
||||||
val eggGroups = form.eggGroups.map { it.showdownID }
|
val forme = form?.name
|
||||||
val gender: String? = when (form.maleRatio) {
|
// ToDo baseForme
|
||||||
|
val otherFormes = if (form == null && species.forms.isNotEmpty()) species.forms.map { "${this.name}-${it.name}" } else emptyList()
|
||||||
|
val formeOrder = if (form == null && this.otherFormes.isNotEmpty()) arrayListOf(this.name, *this.otherFormes.toTypedArray()) else emptyList()
|
||||||
|
val abilities: Map<String, String> = mapOf(
|
||||||
|
"0" to "No Ability",
|
||||||
|
"1" to "No Ability",
|
||||||
|
"H" to "No Ability",
|
||||||
|
"S" to "No Ability"
|
||||||
|
)
|
||||||
|
val types = (form?.types ?: species.types).map { it.name }
|
||||||
|
val preevo: String? = (form?.preEvolution ?: species.preEvolution)?.let { if (it.form == it.species.standardForm) createShowdownName(it.species) else "${createShowdownName(it.species)}-${it.form.name}" }
|
||||||
|
// For the context of battles the content here doesn't matter whatsoever and due to how PokemonProperties work we can't guarantee an actual specific species is defined.
|
||||||
|
val evos = if ((form?.evolutions ?: species.evolutions).isEmpty()) emptyList() else arrayListOf("")
|
||||||
|
val nfe = this.evos.isNotEmpty()
|
||||||
|
val eggGroups = (form?.eggGroups ?: species.eggGroups).map { it.showdownID }
|
||||||
|
val gender: String? = when (form?.maleRatio ?: species.maleRatio) {
|
||||||
0F -> "F"
|
0F -> "F"
|
||||||
1F -> "M"
|
1F -> "M"
|
||||||
-1F, 1.125F -> "N"
|
-1F, 1.125F -> "N"
|
||||||
@@ -280,145 +296,47 @@ object PokemonSpecies : JsonDataRegistry<Species> {
|
|||||||
}
|
}
|
||||||
val genderRatio = if (this.gender == null)
|
val genderRatio = if (this.gender == null)
|
||||||
mapOf(
|
mapOf(
|
||||||
"M" to (form.maleRatio),
|
"maleRatio" to (form?.maleRatio ?: species.maleRatio),
|
||||||
"F" to (1F - (form.maleRatio))
|
"femaleRation" to (1F - (form?.maleRatio ?: species.maleRatio))
|
||||||
) else null
|
) else null
|
||||||
val baseStats = Stats.PERMANENT.associateBy({ it.showdownId }, { form.baseStats[it] ?: 1 })
|
val baseStats = mapOf(
|
||||||
val heightm = form.height / 10
|
"hp" to (form?.baseStats?.get(Stats.HP) ?: species.baseStats[Stats.HP] ?: 1),
|
||||||
val weightkg = form.weight / 10
|
"atk" to (form?.baseStats?.get(Stats.ATTACK) ?: species.baseStats[Stats.ATTACK] ?: 1),
|
||||||
|
"def" to (form?.baseStats?.get(Stats.DEFENCE) ?: species.baseStats[Stats.DEFENCE] ?: 1),
|
||||||
|
"spa" to (form?.baseStats?.get(Stats.SPECIAL_ATTACK) ?: species.baseStats[Stats.SPECIAL_ATTACK] ?: 1),
|
||||||
|
"spd" to (form?.baseStats?.get(Stats.SPECIAL_DEFENCE) ?: species.baseStats[Stats.SPECIAL_DEFENCE] ?: 1),
|
||||||
|
"spe" to (form?.baseStats?.get(Stats.SPEED) ?: species.baseStats[Stats.SPEED] ?: 1)
|
||||||
|
)
|
||||||
|
val heightm = (form?.height ?: species.height) / 10
|
||||||
|
val weightkg = (form?.weight ?: species.weight) / 10
|
||||||
// This is ugly, but we already have it hardcoded in the mod anyway
|
// This is ugly, but we already have it hardcoded in the mod anyway
|
||||||
val maxHP = if (this.num == 292) 1 else null
|
val maxHP = if (species.showdownId() == "shedinja") 1 else null
|
||||||
val cannotDynamax = form.dynamaxBlocked
|
val canGigantamax: String? = if (form?.gigantamaxMove != null) form.gigantamaxMove.name else null
|
||||||
val abilities = form.showdownAbilityMapping()
|
val cannotDynamax = form?.dynamaxBlocked ?: species.dynamaxBlocked
|
||||||
// Common fields exempt from standard forms
|
// ToDo battleOnly
|
||||||
val baseSpecies = if (form !is StandardForm) form.species.standardForm.showdownName() else null
|
// ToDo changesFrom
|
||||||
val forme = if (form !is StandardForm) form.name else null
|
val requiredMove = form?.requiredMove
|
||||||
|
val requiredItem = form?.requiredItem
|
||||||
/**
|
val requiredItems = form?.requiredItems
|
||||||
* The following fields are optional and currently omitted
|
|
||||||
*
|
|
||||||
* cosmeticFormes (not needed, we have species features)
|
|
||||||
* addedType (tertiary type [by name or showdownid] added by moves or abilities)
|
|
||||||
* tier (smogon tryhard bs)
|
|
||||||
* doublesTier (smogon tryhard bs)
|
|
||||||
* natDexTier (smogon tryhard bs)
|
|
||||||
* evoType (the evolution method used to evolve from 'prevo'; trade', 'useItem', 'levelMove', 'levelExtra', 'levelFriendship', 'levelHold', 'other')
|
|
||||||
* evoMove (the move [by name or showdownid] used to evolve from 'prevo')
|
|
||||||
* evoLevel (the minimum level required to evolve from 'prevo')
|
|
||||||
* canHatch (flag for baby pokemon)
|
|
||||||
* color (color, value is arbitrary)
|
|
||||||
* tags (flags for filtering pokemon; 'Mega', 'Mythical', 'Sub-Legendary', 'Restricted Legendary', 'Paradox')
|
|
||||||
* unreleasedHidden (whether this pokemon has an unreleased hidden ability)
|
|
||||||
* maleOnlyHidden (whether it is only possible to get the hidden ability on a male pokemon)
|
|
||||||
* gmaxUnreleased (whether this pokemon has an unreleased gmax form)
|
|
||||||
* pokemonGoData (no one cares)
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
private fun createShowdownName(species: Species): String {
|
||||||
* The representation of a [PermanentForm] in the context of Showdown.
|
if (species.resourceIdentifier.namespace == Cobblemon.MODID) {
|
||||||
*
|
return species.name
|
||||||
* @param form The [PermanentForm] being converted into a species.
|
|
||||||
*/
|
|
||||||
internal open class ShowdownPermanentForm(form: PermanentForm) : ShowdownSpecies(form) {
|
|
||||||
// species this form evolves from
|
|
||||||
val prevo = form.preEvolution?.form?.showdownName()
|
|
||||||
// For the context of battles the content here doesn't matter whatsoever and due to how PokemonProperties work we can't guarantee an actual specific species is defined.
|
|
||||||
val evos = form.evolutions.map { "" }
|
|
||||||
// not fully evolved
|
|
||||||
val nfe = this.evos.isNotEmpty()
|
|
||||||
// whether there is a gmax form to change to
|
|
||||||
val canGigantamax: String? = form.changeableForms.filterIsInstance<GigantamaxForm>().firstOrNull()?.name // TODO id better
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The representation of a [StandardForm] in the context of Showdown.
|
|
||||||
*
|
|
||||||
* @param form The [StandardForm] being converted into a species.
|
|
||||||
*/
|
|
||||||
internal class ShowdownStandardForm(form: StandardForm) : ShowdownPermanentForm(form) {
|
|
||||||
// list of all forms descending from this base species
|
|
||||||
val otherFormes = form.flattenForms().map { it.showdownName() }
|
|
||||||
// list of forms [by name or showdownid] in the order they appear in game [union of baseSpecies, otherFormes, and cosmeticFormes] with the exception of ending with 'Gmax' forms
|
|
||||||
val formeOrder = if (this.otherFormes.isNotEmpty()) arrayListOf(this.name, *this.otherFormes.toTypedArray()) else null
|
|
||||||
|
|
||||||
// TODO we don't enforce any form order with our Species registration - right now this looks like only a problem with Mega Rayquaza, but investigate changes needed on Showdown's end to enable these lists to be more dynamic
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The representation of a [TemporaryForm] in the context of Showdown.
|
|
||||||
*
|
|
||||||
* @param form The [TemporaryForm] being converted into a species.
|
|
||||||
*/
|
|
||||||
internal class ShowdownTemporaryForm(form: TemporaryForm) : ShowdownSpecies(form) {
|
|
||||||
// form change can occur during a battle
|
|
||||||
val battleOnly = if (form.battleOnly) form.parentForm.showdownName() else null
|
|
||||||
// form change can occur outside of battle (mutually exclusive with battleOnly)
|
|
||||||
val changesFrom = if (!form.battleOnly) form.parentForm.showdownName() else null
|
|
||||||
// pokemon must know this move to be in this form
|
|
||||||
val requiredMove = form.requirements.filterIsInstance<MoveSetRequirement>().firstOrNull()?.move?.showdownId() // TODO update showdown to support 'requiredMoves'
|
|
||||||
// pokemon must hold one of these item(s) to be in this form
|
|
||||||
val requiredItems = form.requirements.filterIsInstance<HeldItemRequirement>().firstOrNull()?.let { requirement ->
|
|
||||||
try {
|
|
||||||
requirement.itemCondition.items.get().map { BuiltInRegistries.ITEM.getKey(it.value()).path } // TODO held items on showdown are ignorant of namespace
|
|
||||||
}
|
|
||||||
catch (e: NoSuchElementException)
|
|
||||||
{
|
|
||||||
Cobblemon.LOGGER.error("Failed to resolve required held item for ${form.showdownId()}}") // TODO this needs to be done after tags are loaded...
|
|
||||||
null
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
return "${species.resourceIdentifier.namespace}:${species.name}"
|
||||||
|
|
||||||
/** Accommodate for Showdown bullshit. */
|
|
||||||
/*
|
|
||||||
private fun TemporaryForm.showdownParentForm(): Any {
|
|
||||||
if (this.parentOverrides.isNotEmpty())
|
|
||||||
return this.species.standardForm.flattenForms().filter {
|
|
||||||
parentOverrides.contains(it.showdownId())
|
|
||||||
}.map {
|
|
||||||
it.showdownName()
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return parentForm.showdownName()
|
|
||||||
}
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs a mapping of the [PotentialAbility]s belonging to a [FormData] in Showdown identifiable format.
|
|
||||||
*
|
|
||||||
* @return A map of type (numeric for [CommonAbility]s, H for [HiddenAbility], S for [SpecialAbility]) to showdownid.
|
|
||||||
*/
|
|
||||||
private fun FormData.showdownAbilityMapping(): Map<String, String>? {
|
|
||||||
// potential abilities
|
|
||||||
val commonAbilities = this.abilities.filterIsInstance<CommonAbility>()
|
|
||||||
val hiddenAbility = this.abilities.find { it is HiddenAbility }
|
|
||||||
val specialAbility = this.abilities.find { it is SpecialAbility }
|
|
||||||
|
|
||||||
// can have multiple common abilities
|
|
||||||
val abilities = mutableMapOf<String, String>()
|
|
||||||
val mapping: (String, PotentialAbility) -> Unit = { key, ability ->
|
|
||||||
abilities.put(key, ability.template.showdownId())
|
|
||||||
}
|
|
||||||
|
|
||||||
// can only have one hidden and one special ability
|
|
||||||
commonAbilities.forEachIndexed { index, ability -> mapping(index.toString(), ability) }
|
|
||||||
hiddenAbility?.let { ability -> mapping("H", ability) }
|
|
||||||
specialAbility?.let { ability -> mapping("S", ability) }
|
|
||||||
return if (abilities.isEmpty()) null else abilities
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal fun allShowdownSpecies(): Map<String, String> {
|
internal fun allShowdownSpecies(): Map<String, String> {
|
||||||
val result = mutableMapOf<String, String>()
|
val result = mutableMapOf<String, String>()
|
||||||
this.species.forEach { species ->
|
this.species.forEach {species ->
|
||||||
species.permanentForms.forEach { form ->
|
val baseSpecies = ShowdownSpecies(species, null)
|
||||||
val formSpecies = ShowdownSpecies(form)
|
result[ShowdownIdentifiable.REGEX.replace(baseSpecies.name.lowercase(), "")] = this.gson.toJson(baseSpecies)
|
||||||
result[ShowdownIdentifiable.REGEX.replace(formSpecies.name.lowercase(), "")] = this.gson.toJson(formSpecies)
|
species.forms.forEach { form ->
|
||||||
}
|
if (form != species.standardForm) {
|
||||||
species.temporaryForms.forEach { form ->
|
val formSpecies = ShowdownSpecies(species, form)
|
||||||
val formSpecies = ShowdownSpecies(form)
|
result[ShowdownIdentifiable.REGEX.replace(formSpecies.name.lowercase(), "")] = this.gson.toJson(formSpecies)
|
||||||
result[ShowdownIdentifiable.REGEX.replace(formSpecies.name.lowercase(), "")] = this.gson.toJson(formSpecies)
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result
|
return result
|
||||||
|
|||||||
+34
@@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Cobblemon Contributors
|
||||||
|
*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.cobblemon.mod.common.api.pokemon.adapters
|
||||||
|
|
||||||
|
import com.cobblemon.mod.common.api.pokemon.requirement.Requirement
|
||||||
|
import com.google.gson.JsonDeserializer
|
||||||
|
import com.google.gson.JsonSerializer
|
||||||
|
import kotlin.reflect.KClass
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Saves and loads [Requirement]s with JSON.
|
||||||
|
* For the default implementation see [com.cobblemon.mod.common.pokemon.adapters.CobblemonRequirementAdapter].
|
||||||
|
*
|
||||||
|
* @author Licious
|
||||||
|
* @since March 21st, 2022
|
||||||
|
*/
|
||||||
|
interface RequirementAdapter : JsonDeserializer<Requirement>, JsonSerializer<Requirement> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers the given type of [Requirement] to it's associated ID for deserialization.
|
||||||
|
*
|
||||||
|
* @param T The type of [Requirement].
|
||||||
|
* @param id The id of the evolution event.
|
||||||
|
* @param type The [KClass] of the type.
|
||||||
|
*/
|
||||||
|
fun <T : Requirement> registerType(id: String, type: KClass<T>)
|
||||||
|
|
||||||
|
}
|
||||||
Loaded 100 of 1542 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user