chore: resolve conflicts

# Conflicts:
#   common/src/main/kotlin/com/cobblemon/mod/common/pokemon/properties/PropertiesCompletionProvider.kt
This commit is contained in:
Gitoido
2026-10-18 22:16:27 +00:00
215 changed files with 6932 additions and 1196 deletions
+62 -12
View File
@@ -3,36 +3,86 @@
### Additions ### Additions
### Pokémon Added ### Cries added/updated for the following Pokémon
#### Generation 4 - Hoppip
- Skiploom
#### Generation 5 - Jumpluff
- Houndour
#### Generation 6 - Houndoom
- Wurmple
#### Generation 7 - Silcoon
- Beautifly
#### Generation 8 - Cascoon
- Dustox
#### Generation 9 - Surskit
- Masquerain
- Torkoal
- Starly
- Staravia
- Staraptor
- Combee
- Vespiquen
- Dusknoir
- Helioptile
- Heliolisk
- Grubbin
- Charjabug
- Vikavolt
- Applin (updated)
- Flapple (updated)
- Appletun
- Runerigus
- Dipplin
### Model updates for the following Pokémon ### Model updates for the following Pokémon
### Animation updates for the following Pokémon ### Animation updates for the following Pokémon
- Vikavolt
### Changes ### Changes
- Changed the Misc icon in the Campfire Pot Recipe Book to Health Candy
- Moved EXP Candies from the Medicine recipe book category to the Misc category
- Removed Dynamic Lights data from the Magmarizer item for consistency with the block
- Added `doPokemonPredation` gamerule, which controls aggressiveness of Pokémon with `hate_entity` brain task defined
- Added `predation_chance` server config value, which controls the possibility of attacking the hated entity found by `hate_entity` brain task
- Prehistoric Eroded Pillar generates slightly more frequently
### Fixes ### Fixes
- Fixed datapacks with item interaction evolutions that don't specify an item crashing the world on load. - Fixed datapacks with item interaction evolutions that don't specify an item crashing the world on load.
- Fixed the Pokédex evolution tree crashing when a datapack's dex entry is missing an evolution's form. - Fixed the Pokédex evolution tree crashing when a datapack's dex entry is missing an evolution's form.
- Fixed the Pokédex evolution tree crashing with a stack overflow on evolutions that loop back on themselves. - Fixed the Pokédex evolution tree crashing with a stack overflow on evolutions that loop back on themselves.
- Fixed the Pokédex evolution tree crashing when looking at a dex that is not part of the "National Dex" aggregate.
- Fixed evolution trees not building properly when a Pokémon has several Pokédex entries for different regions.
- Fixed form-changing evolutions sometimes resolving to the source form in the Pokédex evolution tree. - Fixed form-changing evolutions sometimes resolving to the source form in the Pokédex evolution tree.
- Broken datapack evolutions are now logged and skipped in the Pokédex evolution tree instead of crashing. - Broken datapack evolutions are now logged and skipped in the Pokédex evolution tree instead of crashing.
- Fixed the `alpha` property having no tab completion in commands such as `/pokespawn`, `/pokegive` and `/pokeedit`, and added the missing `dmax_level`, `gmax_factor` and `tradable` aliases to tab completion - Fixed the `alpha` property having no tab completion in commands such as `/pokespawn`, `/pokegive` and `/pokeedit`, and added the missing `dmax_level`, `gmax_factor` and `tradable` aliases to tab completion
- Fixed friendship booster items not being recognised as such
- Fixed conflicts with other mods that would make use of recipe books in certain ways (Farmer's Delight Cooking Pot)
- Fixed Pokémon battles stalling when a sidemod cancels the `THROWN_POKEBALL_HIT` hit event
- Fixed choice feature tab completion in `spawnpokemon/pokegive/pokeedit` commands
- Fixed MoLang that's targeting players intermittedly failing when they have died, needing them to relog
- Fixed a NeoForge bug where none of the Cobblemon plants/berries could be placed into pots
- Fixed party overlay not hiding when the player opens the Pokédex scanner
- Added compat for AppleSkin
- Fixed some display names having unintended font colours
- Fixed `hate_entity` task focusing on its own entity
- Thus enabled deadly warfare between Zangoose and Seviper
- Prehistoric Frozen Pond, Prehistoric Frozen Spike, and Prehistoric Lush Den now generate
- Fixed Frogadier floating in its battle_idle animation
- Fixed absence or incorrect mergers in spawning conditions, making max height/depth of conditions to use the min value instead
- Added stricter riding checks on server side to prevent possible packet forgery when player tries to ride pokemon
- Fixed Pokémon cries and animation sounds played from GUIs, such as the starter selection screen and the Pokédex, being tied to the Master volume slider instead of Friendly Creatures
### Developer ### Developer
- Bumped NeoForge to `21.1.195` to get access to MixinExtras `0.5` and the expressions annotation
- New Platform Event `PLAYER_RESPAWN` which is fired when a player respawns (either through death or returning from the end)
- Platform Events `SERVER_PLAYER_TICK_PRE` and `SERVER_PLAYER_TICK_POST` no longer fire when the player is dead
- it is now tied much closer to the actual entity rather than the player (or their connection)
### Molang & Datapacks ### Molang & Datapacks
- Fixed `q.pokemon.nature` returning class instance instead of proper string value (`cobblemon:adamant`)
- Fixed `q.entity.is_looking_at` result being always `1` for whatever entity passed as target
- Added hate chance optional parameter to `hate_entity` task. `1.0` will make an entity always attack the target
### Localization ### Localization
- Updated translations for: - Updated translations for:
@@ -16,6 +16,7 @@ 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;
import com.llamalad7.mixinextras.sugar.Local;
import net.minecraft.client.ClientRecipeBook; import net.minecraft.client.ClientRecipeBook;
import net.minecraft.client.RecipeBookCategories; import net.minecraft.client.RecipeBookCategories;
import net.minecraft.client.gui.screens.recipebook.RecipeCollection; import net.minecraft.client.gui.screens.recipebook.RecipeCollection;
@@ -63,23 +64,12 @@ public abstract class ClientRecipeBookMixin {
} }
} }
@Inject(method = "setupCollections", at = @At("RETURN")) @Inject(method = "setupCollections",
private void addCustomAggregateCategories(Iterable<RecipeHolder<?>> recipes, RegistryAccess registryAccess, CallbackInfo ci) { at = @At(
Map<RecipeBookCategories, List<List<RecipeHolder<?>>>> map = categorizeAndGroupRecipes(recipes); value = "INVOKE",
Map<RecipeBookCategories, List<RecipeCollection>> map2 = Maps.newHashMap(); target = "Lcom/google/common/collect/ImmutableMap;copyOf(Ljava/util/Map;)Lcom/google/common/collect/ImmutableMap;"
ImmutableList.Builder<RecipeCollection> builder = ImmutableList.builder(); ))
private void addCustomAggregateCategories(Iterable<RecipeHolder<?>> recipes, RegistryAccess registryAccess, CallbackInfo ci, @Local(name = "map2") Map<RecipeBookCategories, List<RecipeCollection>> map2) {
map.forEach((recipeBookCategories, list) -> {
List<RecipeCollection> collections = list.stream()
.map(listx -> new RecipeCollection(registryAccess, listx))
.peek(builder::add)
.collect(ImmutableList.toImmutableList());
map2.put(recipeBookCategories, collections);
});
RecipeBookCategories.AGGREGATE_CATEGORIES.forEach((recipeBookCategories, list) -> map2.put(recipeBookCategories, (List) list.stream().flatMap((recipeBookCategoriesx) -> ((List) map2.getOrDefault(recipeBookCategoriesx, ImmutableList.of())).stream()).collect(ImmutableList.toImmutableList())));
CobblemonRecipeCategories.Companion.getCustomAggregateCategories().forEach((recipeBookCategories, list) -> map2.put(recipeBookCategories, (List) list.stream().flatMap((recipeBookCategoriesx) -> ((List) map2.getOrDefault(recipeBookCategoriesx, ImmutableList.of())).stream()).collect(ImmutableList.toImmutableList()))); CobblemonRecipeCategories.Companion.getCustomAggregateCategories().forEach((recipeBookCategories, list) -> map2.put(recipeBookCategories, (List) list.stream().flatMap((recipeBookCategoriesx) -> ((List) map2.getOrDefault(recipeBookCategoriesx, ImmutableList.of())).stream()).collect(ImmutableList.toImmutableList())));
this.collectionsByTab = ImmutableMap.copyOf(map2);
this.allCollections = builder.build();
} }
} }
@@ -9,55 +9,25 @@
package com.cobblemon.mod.common.mixin.client; package com.cobblemon.mod.common.mixin.client;
import com.cobblemon.mod.common.CobblemonRecipeCategories; import com.cobblemon.mod.common.CobblemonRecipeCategories;
import net.minecraft.client.ClientRecipeBook; import com.llamalad7.mixinextras.expression.Definition;
import net.minecraft.client.Minecraft; import com.llamalad7.mixinextras.expression.Expression;
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
import com.llamalad7.mixinextras.sugar.Local;
import net.minecraft.client.RecipeBookCategories; import net.minecraft.client.RecipeBookCategories;
import net.minecraft.client.gui.screens.recipebook.RecipeBookComponent; import net.minecraft.client.gui.screens.recipebook.RecipeBookComponent;
import net.minecraft.client.gui.screens.recipebook.RecipeBookPage;
import net.minecraft.client.gui.screens.recipebook.RecipeBookTabButton;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(RecipeBookComponent.class) @Mixin(RecipeBookComponent.class)
public class RecipeBookComponentMixin { public class RecipeBookComponentMixin {
@Definition(id = "recipeBookCategories", local = @Local(name = "recipeBookCategories"))
@Shadow private ClientRecipeBook book; @Definition(id = "FURNACE_SEARCH", field = "Lnet/minecraft/client/RecipeBookCategories;FURNACE_SEARCH:Lnet/minecraft/client/RecipeBookCategories;")
@Expression("recipeBookCategories != FURNACE_SEARCH")
@Shadow protected Minecraft minecraft; @ModifyExpressionValue(
method = "updateTabs",
@Shadow private int width; at = @At(value = "MIXINEXTRAS:EXPRESSION")
)
@Shadow private int xOffset; private boolean notCookingPotSearch(boolean original, @Local(name = "recipeBookCategories") RecipeBookCategories recipeBookCategories) {
return original && recipeBookCategories != CobblemonRecipeCategories.COOKING_POT_SEARCH.toVanillaCategory();
@Shadow private int height;
@Shadow @Final private RecipeBookPage recipeBookPage;
@Inject(method = "updateTabs", at = @At("HEAD"), cancellable = true)
private void customUpdateTabs(CallbackInfo ci) {
RecipeBookComponent instance = (RecipeBookComponent) (Object) this;
int i = (width - 147) / 2 - xOffset - 30;
int j = (height - 166) / 2 + 3;
int k = 27;
int l = 0;
for (RecipeBookTabButton recipeBookTabButton : instance.tabButtons) {
RecipeBookCategories recipeBookCategories = recipeBookTabButton.getCategory();
if (recipeBookCategories != RecipeBookCategories.CRAFTING_SEARCH && recipeBookCategories != RecipeBookCategories.FURNACE_SEARCH && recipeBookCategories != CobblemonRecipeCategories.COOKING_POT_SEARCH.toVanillaCategory()) {
if (recipeBookTabButton.updateVisibility(book)) {
recipeBookTabButton.setPosition(i, j + 27 * l++);
recipeBookTabButton.startAnimation(minecraft);
}
} else {
recipeBookTabButton.visible = true;
recipeBookTabButton.setPosition(i, j + k * l++);
}
}
ci.cancel();
} }
} }
@@ -260,6 +260,9 @@ object Cobblemon {
RequestManager.onLogoff(it.player) RequestManager.onLogoff(it.player)
serverPlayerStructs.remove(it.player.uuid) serverPlayerStructs.remove(it.player.uuid)
} }
PlatformEvents.PLAYER_RESPAWN.subscribe {
serverPlayerStructs.remove(it.player.uuid)
}
PlatformEvents.PLAYER_DEATH.subscribe { PlatformEvents.PLAYER_DEATH.subscribe {
PCLinkManager.removeLink(it.player.uuid) PCLinkManager.removeLink(it.player.uuid)
battleRegistry.getBattleByParticipatingPlayer(it.player)?.stop() battleRegistry.getBattleByParticipatingPlayer(it.player)?.stop()
@@ -845,54 +845,35 @@ object CobblemonBlocks : PlatformRegistry<Registry<Block>, ResourceKey<Registry<
@JvmField @JvmField
val PEP_UP_FLOWER = this.create("pep_up_flower", FlowerBlock(MobEffects.LEVITATION, 10F, BlockBehaviour.Properties.of().mapColor(MapColor.PLANT).noCollission().instabreak().sound(SoundType.GRASS).offsetType(BlockBehaviour.OffsetType.XZ).pushReaction(PushReaction.DESTROY))) val PEP_UP_FLOWER = this.create("pep_up_flower", FlowerBlock(MobEffects.LEVITATION, 10F, BlockBehaviour.Properties.of().mapColor(MapColor.PLANT).noCollission().instabreak().sound(SoundType.GRASS).offsetType(BlockBehaviour.OffsetType.XZ).pushReaction(PushReaction.DESTROY)))
@JvmField @JvmField
val POTTED_PEP_UP_FLOWER = this.create("potted_pep_up_flower", BlocksInvoker.createFlowerPotBlock(PEP_UP_FLOWER))
@JvmField
val HEARTY_GRAINS = this.create("hearty_grains", HeartyGrainsBlock(BlockBehaviour.Properties.of().pushReaction(PushReaction.DESTROY).ignitedByLava().mapColor(MapColor.PLANT).noCollission().randomTicks().instabreak())) val HEARTY_GRAINS = this.create("hearty_grains", HeartyGrainsBlock(BlockBehaviour.Properties.of().pushReaction(PushReaction.DESTROY).ignitedByLava().mapColor(MapColor.PLANT).noCollission().randomTicks().instabreak()))
@JvmField @JvmField
val GALARICA_NUT_BUSH = this.create("galarica_nut_bush", NutBushBlock(BlockBehaviour.Properties.of().mapColor(MapColor.PLANT).randomTicks().noCollission().sound(SoundType.SWEET_BERRY_BUSH).pushReaction(PushReaction.DESTROY))) val GALARICA_NUT_BUSH = this.create("galarica_nut_bush", NutBushBlock(BlockBehaviour.Properties.of().mapColor(MapColor.PLANT).randomTicks().noCollission().sound(SoundType.SWEET_BERRY_BUSH).pushReaction(PushReaction.DESTROY)))
@JvmField
val POTTED_RED_APRICORN_SAPLING = this.create("potted_red_apricorn_sapling", BlocksInvoker.createFlowerPotBlock(RED_APRICORN_SAPLING))
@JvmField
val POTTED_YELLOW_APRICORN_SAPLING = this.create("potted_yellow_apricorn_sapling", BlocksInvoker.createFlowerPotBlock(YELLOW_APRICORN_SAPLING))
@JvmField
val POTTED_GREEN_APRICORN_SAPLING = this.create("potted_green_apricorn_sapling", BlocksInvoker.createFlowerPotBlock(GREEN_APRICORN_SAPLING))
@JvmField
val POTTED_BLUE_APRICORN_SAPLING = this.create("potted_blue_apricorn_sapling", BlocksInvoker.createFlowerPotBlock(BLUE_APRICORN_SAPLING))
@JvmField
val POTTED_PINK_APRICORN_SAPLING = this.create("potted_pink_apricorn_sapling", BlocksInvoker.createFlowerPotBlock(PINK_APRICORN_SAPLING))
@JvmField
val POTTED_BLACK_APRICORN_SAPLING = this.create("potted_black_apricorn_sapling", BlocksInvoker.createFlowerPotBlock(BLACK_APRICORN_SAPLING))
@JvmField
val POTTED_WHITE_APRICORN_SAPLING = this.create("potted_white_apricorn_sapling", BlocksInvoker.createFlowerPotBlock(WHITE_APRICORN_SAPLING))
@JvmField
val POTTED_SACCHARINE_SAPLING = this.create("potted_saccharine_sapling", BlocksInvoker.createFlowerPotBlock(SACCHARINE_SAPLING))
@JvmField @JvmField
val RED_MINT_LEAF_LITTER = this.mintLitter("red_mint_leaf_litter", MapColor.COLOR_RED) val RED_MINT_LEAF_LITTER = this.mintLitter("red_mint_leaf_litter", MapColor.COLOR_RED)
@JvmField @JvmField
val POTTED_RED_MINT = this.pottedPlant("potted_red_mint", RED_MINT_LEAF_LITTER) val POTTED_RED_MINT = this.flowerPot("potted_red_mint", RED_MINT_LEAF_LITTER)
@JvmField @JvmField
val BLUE_MINT_LEAF_LITTER = this.mintLitter("blue_mint_leaf_litter", MapColor.COLOR_BLUE) val BLUE_MINT_LEAF_LITTER = this.mintLitter("blue_mint_leaf_litter", MapColor.COLOR_BLUE)
@JvmField @JvmField
val POTTED_BLUE_MINT = this.pottedPlant("potted_blue_mint", BLUE_MINT_LEAF_LITTER) val POTTED_BLUE_MINT = this.flowerPot("potted_blue_mint", BLUE_MINT_LEAF_LITTER)
@JvmField @JvmField
val CYAN_MINT_LEAF_LITTER = this.mintLitter("cyan_mint_leaf_litter", MapColor.COLOR_CYAN) val CYAN_MINT_LEAF_LITTER = this.mintLitter("cyan_mint_leaf_litter", MapColor.COLOR_CYAN)
@JvmField @JvmField
val POTTED_CYAN_MINT = this.pottedPlant("potted_cyan_mint", CYAN_MINT_LEAF_LITTER) val POTTED_CYAN_MINT = this.flowerPot("potted_cyan_mint", CYAN_MINT_LEAF_LITTER)
@JvmField @JvmField
val PINK_MINT_LEAF_LITTER = this.mintLitter("pink_mint_leaf_litter", MapColor.COLOR_PINK) val PINK_MINT_LEAF_LITTER = this.mintLitter("pink_mint_leaf_litter", MapColor.COLOR_PINK)
@JvmField @JvmField
val POTTED_PINK_MINT = this.pottedPlant("potted_pink_mint", PINK_MINT_LEAF_LITTER) val POTTED_PINK_MINT = this.flowerPot("potted_pink_mint", PINK_MINT_LEAF_LITTER)
@JvmField @JvmField
val GREEN_MINT_LEAF_LITTER = this.mintLitter("green_mint_leaf_litter", MapColor.COLOR_GREEN) val GREEN_MINT_LEAF_LITTER = this.mintLitter("green_mint_leaf_litter", MapColor.COLOR_GREEN)
@JvmField @JvmField
val POTTED_GREEN_MINT = this.pottedPlant("potted_green_mint", GREEN_MINT_LEAF_LITTER) val POTTED_GREEN_MINT = this.flowerPot("potted_green_mint", GREEN_MINT_LEAF_LITTER)
@JvmField @JvmField
val WHITE_MINT_LEAF_LITTER = this.mintLitter("white_mint_leaf_litter", MapColor.SNOW) val WHITE_MINT_LEAF_LITTER = this.mintLitter("white_mint_leaf_litter", MapColor.SNOW)
@JvmField @JvmField
val POTTED_WHITE_MINT = this.pottedPlant("potted_white_mint", WHITE_MINT_LEAF_LITTER) val POTTED_WHITE_MINT = this.flowerPot("potted_white_mint", WHITE_MINT_LEAF_LITTER)
@JvmField @JvmField
val LOBAILA = this.create("lobaila", LobailaFlowerBlock(BlockBehaviour.Properties.of().mapColor(MapColor.PLANT).noCollission().instabreak().sound(SoundType.GRASS).offsetType(BlockBehaviour.OffsetType.XZ).ignitedByLava().pushReaction(PushReaction.DESTROY))) val LOBAILA = this.create("lobaila", LobailaFlowerBlock(BlockBehaviour.Properties.of().mapColor(MapColor.PLANT).noCollission().instabreak().sound(SoundType.GRASS).offsetType(BlockBehaviour.OffsetType.XZ).ignitedByLava().pushReaction(PushReaction.DESTROY)))
@@ -1104,145 +1085,163 @@ object CobblemonBlocks : PlatformRegistry<Registry<Block>, ResourceKey<Registry<
//val BINDING_SOIL = this.create("binding_soil", BindingSoilBlock(BlockBehaviour.Properties.of())) //val BINDING_SOIL = this.create("binding_soil", BindingSoilBlock(BlockBehaviour.Properties.of()))
@JvmField @JvmField
val POTTED_AGUAV_BERRY = this.create("potted_aguav_berry", BlocksInvoker.createFlowerPotBlock(AGUAV_BERRY)) val POTTED_AGUAV_BERRY = this.flowerPot("potted_aguav_berry", AGUAV_BERRY)
@JvmField @JvmField
val POTTED_APICOT_BERRY = this.create("potted_apicot_berry", BlocksInvoker.createFlowerPotBlock(APICOT_BERRY)) val POTTED_APICOT_BERRY = this.flowerPot("potted_apicot_berry", APICOT_BERRY)
@JvmField @JvmField
val POTTED_ASPEAR_BERRY = this.create("potted_aspear_berry", BlocksInvoker.createFlowerPotBlock(ASPEAR_BERRY)) val POTTED_ASPEAR_BERRY = this.flowerPot("potted_aspear_berry", ASPEAR_BERRY)
@JvmField @JvmField
val POTTED_BABIRI_BERRY = this.create("potted_babiri_berry", BlocksInvoker.createFlowerPotBlock(BABIRI_BERRY)) val POTTED_BABIRI_BERRY = this.flowerPot("potted_babiri_berry", BABIRI_BERRY)
@JvmField @JvmField
val POTTED_BELUE_BERRY = this.create("potted_belue_berry", BlocksInvoker.createFlowerPotBlock(BELUE_BERRY)) val POTTED_BELUE_BERRY = this.flowerPot("potted_belue_berry", BELUE_BERRY)
@JvmField @JvmField
val POTTED_BLUK_BERRY = this.create("potted_bluk_berry", BlocksInvoker.createFlowerPotBlock(BLUK_BERRY)) val POTTED_BLUK_BERRY = this.flowerPot("potted_bluk_berry", BLUK_BERRY)
@JvmField @JvmField
val POTTED_CHARTI_BERRY = this.create("potted_charti_berry", BlocksInvoker.createFlowerPotBlock(CHARTI_BERRY)) val POTTED_CHARTI_BERRY = this.flowerPot("potted_charti_berry", CHARTI_BERRY)
@JvmField @JvmField
val POTTED_CHERI_BERRY = this.create("potted_cheri_berry", BlocksInvoker.createFlowerPotBlock(CHERI_BERRY)) val POTTED_CHERI_BERRY = this.flowerPot("potted_cheri_berry", CHERI_BERRY)
@JvmField @JvmField
val POTTED_CHESTO_BERRY = this.create("potted_chesto_berry", BlocksInvoker.createFlowerPotBlock(CHESTO_BERRY)) val POTTED_CHESTO_BERRY = this.flowerPot("potted_chesto_berry", CHESTO_BERRY)
@JvmField @JvmField
val POTTED_CHILAN_BERRY = this.create("potted_chilan_berry", BlocksInvoker.createFlowerPotBlock(CHILAN_BERRY)) val POTTED_CHILAN_BERRY = this.flowerPot("potted_chilan_berry", CHILAN_BERRY)
@JvmField @JvmField
val POTTED_CHOPLE_BERRY = this.create("potted_chople_berry", BlocksInvoker.createFlowerPotBlock(CHOPLE_BERRY)) val POTTED_CHOPLE_BERRY = this.flowerPot("potted_chople_berry", CHOPLE_BERRY)
@JvmField @JvmField
val POTTED_COBA_BERRY = this.create("potted_coba_berry", BlocksInvoker.createFlowerPotBlock(COBA_BERRY)) val POTTED_COBA_BERRY = this.flowerPot("potted_coba_berry", COBA_BERRY)
@JvmField @JvmField
val POTTED_COLBUR_BERRY = this.create("potted_colbur_berry", BlocksInvoker.createFlowerPotBlock(COLBUR_BERRY)) val POTTED_COLBUR_BERRY = this.flowerPot("potted_colbur_berry", COLBUR_BERRY)
@JvmField @JvmField
val POTTED_CORNN_BERRY = this.create("potted_cornn_berry", BlocksInvoker.createFlowerPotBlock(CORNN_BERRY)) val POTTED_CORNN_BERRY = this.flowerPot("potted_cornn_berry", CORNN_BERRY)
@JvmField @JvmField
val POTTED_CUSTAP_BERRY = this.create("potted_custap_berry", BlocksInvoker.createFlowerPotBlock(CUSTAP_BERRY)) val POTTED_CUSTAP_BERRY = this.flowerPot("potted_custap_berry", CUSTAP_BERRY)
@JvmField @JvmField
val POTTED_DURIN_BERRY = this.create("potted_durin_berry", BlocksInvoker.createFlowerPotBlock(DURIN_BERRY)) val POTTED_DURIN_BERRY = this.flowerPot("potted_durin_berry", DURIN_BERRY)
@JvmField @JvmField
val POTTED_EGGANT_BERRY = this.create("potted_eggant_berry", BlocksInvoker.createFlowerPotBlock(EGGANT_BERRY)) val POTTED_EGGANT_BERRY = this.flowerPot("potted_eggant_berry", EGGANT_BERRY)
@JvmField @JvmField
val POTTED_ENIGMA_BERRY = this.create("potted_enigma_berry", BlocksInvoker.createFlowerPotBlock(ENIGMA_BERRY)) val POTTED_ENIGMA_BERRY = this.flowerPot("potted_enigma_berry", ENIGMA_BERRY)
@JvmField @JvmField
val POTTED_FIGY_BERRY = this.create("potted_figy_berry", BlocksInvoker.createFlowerPotBlock(FIGY_BERRY)) val POTTED_FIGY_BERRY = this.flowerPot("potted_figy_berry", FIGY_BERRY)
@JvmField @JvmField
val POTTED_GANLON_BERRY = this.create("potted_ganlon_berry", BlocksInvoker.createFlowerPotBlock(GANLON_BERRY)) val POTTED_GANLON_BERRY = this.flowerPot("potted_ganlon_berry", GANLON_BERRY)
@JvmField @JvmField
val POTTED_GREPA_BERRY = this.create("potted_grepa_berry", BlocksInvoker.createFlowerPotBlock(GREPA_BERRY)) val POTTED_GREPA_BERRY = this.flowerPot("potted_grepa_berry", GREPA_BERRY)
@JvmField @JvmField
val POTTED_HABAN_BERRY = this.create("potted_haban_berry", BlocksInvoker.createFlowerPotBlock(HABAN_BERRY)) val POTTED_HABAN_BERRY = this.flowerPot("potted_haban_berry", HABAN_BERRY)
@JvmField @JvmField
val POTTED_HONDEW_BERRY = this.create("potted_hondew_berry", BlocksInvoker.createFlowerPotBlock(HONDEW_BERRY)) val POTTED_HONDEW_BERRY = this.flowerPot("potted_hondew_berry", HONDEW_BERRY)
@JvmField @JvmField
val POTTED_HOPO_BERRY = this.create("potted_hopo_berry", BlocksInvoker.createFlowerPotBlock(HOPO_BERRY)) val POTTED_HOPO_BERRY = this.flowerPot("potted_hopo_berry", HOPO_BERRY)
@JvmField @JvmField
val POTTED_IAPAPA_BERRY = this.create("potted_iapapa_berry", BlocksInvoker.createFlowerPotBlock(IAPAPA_BERRY)) val POTTED_IAPAPA_BERRY = this.flowerPot("potted_iapapa_berry", IAPAPA_BERRY)
@JvmField @JvmField
val POTTED_JABOCA_BERRY = this.create("potted_jaboca_berry", BlocksInvoker.createFlowerPotBlock(JABOCA_BERRY)) val POTTED_JABOCA_BERRY = this.flowerPot("potted_jaboca_berry", JABOCA_BERRY)
@JvmField @JvmField
val POTTED_KASIB_BERRY = this.create("potted_kasib_berry", BlocksInvoker.createFlowerPotBlock(KASIB_BERRY)) val POTTED_KASIB_BERRY = this.flowerPot("potted_kasib_berry", KASIB_BERRY)
@JvmField @JvmField
val POTTED_KEBIA_BERRY = this.create("potted_kebia_berry", BlocksInvoker.createFlowerPotBlock(KEBIA_BERRY)) val POTTED_KEBIA_BERRY = this.flowerPot("potted_kebia_berry", KEBIA_BERRY)
@JvmField @JvmField
val POTTED_KEE_BERRY = this.create("potted_kee_berry", BlocksInvoker.createFlowerPotBlock(KEE_BERRY)) val POTTED_KEE_BERRY = this.flowerPot("potted_kee_berry", KEE_BERRY)
@JvmField @JvmField
val POTTED_KELPSY_BERRY = this.create("potted_kelpsy_berry", BlocksInvoker.createFlowerPotBlock(KELPSY_BERRY)) val POTTED_KELPSY_BERRY = this.flowerPot("potted_kelpsy_berry", KELPSY_BERRY)
@JvmField @JvmField
val POTTED_LANSAT_BERRY = this.create("potted_lansat_berry", BlocksInvoker.createFlowerPotBlock(LANSAT_BERRY)) val POTTED_LANSAT_BERRY = this.flowerPot("potted_lansat_berry", LANSAT_BERRY)
@JvmField @JvmField
val POTTED_LEPPA_BERRY = this.create("potted_leppa_berry", BlocksInvoker.createFlowerPotBlock(LEPPA_BERRY)) val POTTED_LEPPA_BERRY = this.flowerPot("potted_leppa_berry", LEPPA_BERRY)
@JvmField @JvmField
val POTTED_LIECHI_BERRY = this.create("potted_liechi_berry", BlocksInvoker.createFlowerPotBlock(LIECHI_BERRY)) val POTTED_LIECHI_BERRY = this.flowerPot("potted_liechi_berry", LIECHI_BERRY)
@JvmField @JvmField
val POTTED_LUM_BERRY = this.create("potted_lum_berry", BlocksInvoker.createFlowerPotBlock(LUM_BERRY)) val POTTED_LUM_BERRY = this.flowerPot("potted_lum_berry", LUM_BERRY)
@JvmField @JvmField
val POTTED_MAGO_BERRY = this.create("potted_mago_berry", BlocksInvoker.createFlowerPotBlock(MAGO_BERRY)) val POTTED_MAGO_BERRY = this.flowerPot("potted_mago_berry", MAGO_BERRY)
@JvmField @JvmField
val POTTED_MAGOST_BERRY = this.create("potted_magost_berry", BlocksInvoker.createFlowerPotBlock(MAGOST_BERRY)) val POTTED_MAGOST_BERRY = this.flowerPot("potted_magost_berry", MAGOST_BERRY)
@JvmField @JvmField
val POTTED_MARANGA_BERRY = this.create("potted_maranga_berry", BlocksInvoker.createFlowerPotBlock(MARANGA_BERRY)) val POTTED_MARANGA_BERRY = this.flowerPot("potted_maranga_berry", MARANGA_BERRY)
@JvmField @JvmField
val POTTED_MICLE_BERRY = this.create("potted_micle_berry", BlocksInvoker.createFlowerPotBlock(MICLE_BERRY)) val POTTED_MICLE_BERRY = this.flowerPot("potted_micle_berry", MICLE_BERRY)
@JvmField @JvmField
val POTTED_NANAB_BERRY = this.create("potted_nanab_berry", BlocksInvoker.createFlowerPotBlock(NANAB_BERRY)) val POTTED_NANAB_BERRY = this.flowerPot("potted_nanab_berry", NANAB_BERRY)
@JvmField @JvmField
val POTTED_NOMEL_BERRY = this.create("potted_nomel_berry", BlocksInvoker.createFlowerPotBlock(NOMEL_BERRY)) val POTTED_NOMEL_BERRY = this.flowerPot("potted_nomel_berry", NOMEL_BERRY)
@JvmField @JvmField
val POTTED_OCCA_BERRY = this.create("potted_occa_berry", BlocksInvoker.createFlowerPotBlock(OCCA_BERRY)) val POTTED_OCCA_BERRY = this.flowerPot("potted_occa_berry", OCCA_BERRY)
@JvmField @JvmField
val POTTED_ORAN_BERRY = this.create("potted_oran_berry", BlocksInvoker.createFlowerPotBlock(ORAN_BERRY)) val POTTED_ORAN_BERRY = this.flowerPot("potted_oran_berry", ORAN_BERRY)
@JvmField @JvmField
val POTTED_PAMTRE_BERRY = this.create("potted_pamtre_berry", BlocksInvoker.createFlowerPotBlock(PAMTRE_BERRY)) val POTTED_PAMTRE_BERRY = this.flowerPot("potted_pamtre_berry", PAMTRE_BERRY)
@JvmField @JvmField
val POTTED_PASSHO_BERRY = this.create("potted_passho_berry", BlocksInvoker.createFlowerPotBlock(PASSHO_BERRY)) val POTTED_PASSHO_BERRY = this.flowerPot("potted_passho_berry", PASSHO_BERRY)
@JvmField @JvmField
val POTTED_PAYAPA_BERRY = this.create("potted_payapa_berry", BlocksInvoker.createFlowerPotBlock(PAYAPA_BERRY)) val POTTED_PAYAPA_BERRY = this.flowerPot("potted_payapa_berry", PAYAPA_BERRY)
@JvmField @JvmField
val POTTED_PECHA_BERRY = this.create("potted_pecha_berry", BlocksInvoker.createFlowerPotBlock(PECHA_BERRY)) val POTTED_PECHA_BERRY = this.flowerPot("potted_pecha_berry", PECHA_BERRY)
@JvmField @JvmField
val POTTED_PERSIM_BERRY = this.create("potted_persim_berry", BlocksInvoker.createFlowerPotBlock(PERSIM_BERRY)) val POTTED_PERSIM_BERRY = this.flowerPot("potted_persim_berry", PERSIM_BERRY)
@JvmField @JvmField
val POTTED_PETAYA_BERRY = this.create("potted_petaya_berry", BlocksInvoker.createFlowerPotBlock(PETAYA_BERRY)) val POTTED_PETAYA_BERRY = this.flowerPot("potted_petaya_berry", PETAYA_BERRY)
@JvmField @JvmField
val POTTED_PINAP_BERRY = this.create("potted_pinap_berry", BlocksInvoker.createFlowerPotBlock(PINAP_BERRY)) val POTTED_PINAP_BERRY = this.flowerPot("potted_pinap_berry", PINAP_BERRY)
@JvmField @JvmField
val POTTED_POMEG_BERRY = this.create("potted_pomeg_berry", BlocksInvoker.createFlowerPotBlock(POMEG_BERRY)) val POTTED_POMEG_BERRY = this.flowerPot("potted_pomeg_berry", POMEG_BERRY)
@JvmField @JvmField
val POTTED_QUALOT_BERRY = this.create("potted_qualot_berry", BlocksInvoker.createFlowerPotBlock(QUALOT_BERRY)) val POTTED_QUALOT_BERRY = this.flowerPot("potted_qualot_berry", QUALOT_BERRY)
@JvmField @JvmField
val POTTED_RABUTA_BERRY = this.create("potted_rabuta_berry", BlocksInvoker.createFlowerPotBlock(RABUTA_BERRY)) val POTTED_RABUTA_BERRY = this.flowerPot("potted_rabuta_berry", RABUTA_BERRY)
@JvmField @JvmField
val POTTED_RAWST_BERRY = this.create("potted_rawst_berry", BlocksInvoker.createFlowerPotBlock(RAWST_BERRY)) val POTTED_RAWST_BERRY = this.flowerPot("potted_rawst_berry", RAWST_BERRY)
@JvmField @JvmField
val POTTED_RAZZ_BERRY = this.create("potted_razz_berry", BlocksInvoker.createFlowerPotBlock(RAZZ_BERRY)) val POTTED_RAZZ_BERRY = this.flowerPot("potted_razz_berry", RAZZ_BERRY)
@JvmField @JvmField
val POTTED_RINDO_BERRY = this.create("potted_rindo_berry", BlocksInvoker.createFlowerPotBlock(RINDO_BERRY)) val POTTED_RINDO_BERRY = this.flowerPot("potted_rindo_berry", RINDO_BERRY)
@JvmField @JvmField
val POTTED_ROSELI_BERRY = this.create("potted_roseli_berry", BlocksInvoker.createFlowerPotBlock(ROSELI_BERRY)) val POTTED_ROSELI_BERRY = this.flowerPot("potted_roseli_berry", ROSELI_BERRY)
@JvmField @JvmField
val POTTED_ROWAP_BERRY = this.create("potted_rowap_berry", BlocksInvoker.createFlowerPotBlock(ROWAP_BERRY)) val POTTED_ROWAP_BERRY = this.flowerPot("potted_rowap_berry", ROWAP_BERRY)
@JvmField @JvmField
val POTTED_SALAC_BERRY = this.create("potted_salac_berry", BlocksInvoker.createFlowerPotBlock(SALAC_BERRY)) val POTTED_SALAC_BERRY = this.flowerPot("potted_salac_berry", SALAC_BERRY)
@JvmField @JvmField
val POTTED_SHUCA_BERRY = this.create("potted_shuca_berry", BlocksInvoker.createFlowerPotBlock(SHUCA_BERRY)) val POTTED_SHUCA_BERRY = this.flowerPot("potted_shuca_berry", SHUCA_BERRY)
@JvmField @JvmField
val POTTED_SITRUS_BERRY = this.create("potted_sitrus_berry", BlocksInvoker.createFlowerPotBlock(SITRUS_BERRY)) val POTTED_SITRUS_BERRY = this.flowerPot("potted_sitrus_berry", SITRUS_BERRY)
@JvmField @JvmField
val POTTED_SPELON_BERRY = this.create("potted_spelon_berry", BlocksInvoker.createFlowerPotBlock(SPELON_BERRY)) val POTTED_SPELON_BERRY = this.flowerPot("potted_spelon_berry", SPELON_BERRY)
@JvmField @JvmField
val POTTED_STARF_BERRY = this.create("potted_starf_berry", BlocksInvoker.createFlowerPotBlock(STARF_BERRY)) val POTTED_STARF_BERRY = this.flowerPot("potted_starf_berry", STARF_BERRY)
@JvmField @JvmField
val POTTED_TAMATO_BERRY = this.create("potted_tamato_berry", BlocksInvoker.createFlowerPotBlock(TAMATO_BERRY)) val POTTED_TAMATO_BERRY = this.flowerPot("potted_tamato_berry", TAMATO_BERRY)
@JvmField @JvmField
val POTTED_TANGA_BERRY = this.create("potted_tanga_berry", BlocksInvoker.createFlowerPotBlock(TANGA_BERRY)) val POTTED_TANGA_BERRY = this.flowerPot("potted_tanga_berry", TANGA_BERRY)
@JvmField @JvmField
val POTTED_TOUGA_BERRY = this.create("potted_touga_berry", BlocksInvoker.createFlowerPotBlock(TOUGA_BERRY)) val POTTED_TOUGA_BERRY = this.flowerPot("potted_touga_berry", TOUGA_BERRY)
@JvmField @JvmField
val POTTED_WACAN_BERRY = this.create("potted_wacan_berry", BlocksInvoker.createFlowerPotBlock(WACAN_BERRY)) val POTTED_WACAN_BERRY = this.flowerPot("potted_wacan_berry", WACAN_BERRY)
@JvmField @JvmField
val POTTED_WATMEL_BERRY = this.create("potted_watmel_berry", BlocksInvoker.createFlowerPotBlock(WATMEL_BERRY)) val POTTED_WATMEL_BERRY = this.flowerPot("potted_watmel_berry", WATMEL_BERRY)
@JvmField @JvmField
val POTTED_WEPEAR_BERRY = this.create("potted_wepear_berry", BlocksInvoker.createFlowerPotBlock(WEPEAR_BERRY)) val POTTED_WEPEAR_BERRY = this.flowerPot("potted_wepear_berry", WEPEAR_BERRY)
@JvmField @JvmField
val POTTED_WIKI_BERRY = this.create("potted_wiki_berry", BlocksInvoker.createFlowerPotBlock(WIKI_BERRY)) val POTTED_WIKI_BERRY = this.flowerPot("potted_wiki_berry", WIKI_BERRY)
@JvmField @JvmField
val POTTED_YACHE_BERRY = this.create("potted_yache_berry", BlocksInvoker.createFlowerPotBlock(YACHE_BERRY)) val POTTED_YACHE_BERRY = this.flowerPot("potted_yache_berry", YACHE_BERRY)
@JvmField
val POTTED_PEP_UP_FLOWER = this.flowerPot("potted_pep_up_flower", PEP_UP_FLOWER)
@JvmField
val POTTED_RED_APRICORN_SAPLING = this.flowerPot("potted_red_apricorn_sapling", RED_APRICORN_SAPLING)
@JvmField
val POTTED_YELLOW_APRICORN_SAPLING = this.flowerPot("potted_yellow_apricorn_sapling", YELLOW_APRICORN_SAPLING)
@JvmField
val POTTED_GREEN_APRICORN_SAPLING = this.flowerPot("potted_green_apricorn_sapling", GREEN_APRICORN_SAPLING)
@JvmField
val POTTED_BLUE_APRICORN_SAPLING = this.flowerPot("potted_blue_apricorn_sapling", BLUE_APRICORN_SAPLING)
@JvmField
val POTTED_PINK_APRICORN_SAPLING = this.flowerPot("potted_pink_apricorn_sapling", PINK_APRICORN_SAPLING)
@JvmField
val POTTED_BLACK_APRICORN_SAPLING = this.flowerPot("potted_black_apricorn_sapling", BLACK_APRICORN_SAPLING)
@JvmField
val POTTED_WHITE_APRICORN_SAPLING = this.flowerPot("potted_white_apricorn_sapling", WHITE_APRICORN_SAPLING)
@JvmField
val POTTED_SACCHARINE_SAPLING = this.flowerPot("potted_saccharine_sapling", SACCHARINE_SAPLING)
init { init {
/** /**
@@ -1346,7 +1345,16 @@ object CobblemonBlocks : PlatformRegistry<Registry<Block>, ResourceKey<Registry<
fun typeGemClusters() = typeGemClusters.toMap() fun typeGemClusters() = typeGemClusters.toMap()
private fun pottedPlant(name: String, flower: Block) = this.create(name, BlocksInvoker.createFlowerPotBlock(flower)) private fun flowerPot(name: String, flower: Block) = this.create(
name,
FlowerPotBlock(
flower,
BlockBehaviour.Properties.of()
.instabreak()
.noOcclusion()
.pushReaction(PushReaction.DESTROY)
)
)
private fun mintLitter(name: String, color: MapColor) = this.create( private fun mintLitter(name: String, color: MapColor) = this.create(
name, name,
@@ -9,6 +9,7 @@
package com.cobblemon.mod.common.api.ai.config.task package com.cobblemon.mod.common.api.ai.config.task
import com.bedrockk.molang.Expression import com.bedrockk.molang.Expression
import com.cobblemon.mod.common.Cobblemon
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.asMostSpecificMoLangValue
@@ -17,6 +18,7 @@ import com.cobblemon.mod.common.util.asExpression
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
import com.cobblemon.mod.common.util.withQueryValue import com.cobblemon.mod.common.util.withQueryValue
import com.cobblemon.mod.common.world.gamerules.CobblemonGameRules
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
@@ -34,6 +36,8 @@ import net.minecraft.world.entity.ai.sensing.SensorType
class HateEntityTaskConfig : SingleTaskConfig { class HateEntityTaskConfig : SingleTaskConfig {
val entityCondition: Expression = "true".asExpression() val entityCondition: Expression = "true".asExpression()
val range: ExpressionOrEntityVariable = Either.left("24".asExpression()) val range: ExpressionOrEntityVariable = Either.left("24".asExpression())
val chance: Float = Cobblemon.config.predationChance
private val coercedChance = chance.coerceIn(0f, 1f)
override fun getVariables(entity: LivingEntity, behaviourConfigurationContext: BehaviourConfigurationContext) = emptyList<MoLangConfigVariable>() override fun getVariables(entity: LivingEntity, behaviourConfigurationContext: BehaviourConfigurationContext) = emptyList<MoLangConfigVariable>()
override fun createTask( override fun createTask(
@@ -43,24 +47,44 @@ class HateEntityTaskConfig : SingleTaskConfig {
val range = range.resolveFloat(behaviourConfigurationContext.runtime) val range = range.resolveFloat(behaviourConfigurationContext.runtime)
behaviourConfigurationContext.addMemories( behaviourConfigurationContext.addMemories(
MemoryModuleType.NEAREST_VISIBLE_LIVING_ENTITIES, MemoryModuleType.NEAREST_VISIBLE_LIVING_ENTITIES,
MemoryModuleType.ANGRY_AT MemoryModuleType.ANGRY_AT,
MemoryModuleType.ATTACK_TARGET
) )
behaviourConfigurationContext.addSensors(SensorType.NEAREST_LIVING_ENTITIES) behaviourConfigurationContext.addSensors(SensorType.NEAREST_LIVING_ENTITIES)
return BehaviorBuilder.create { instance -> return BehaviorBuilder.create { instance ->
instance.group( instance.group(
instance.present(MemoryModuleType.NEAREST_VISIBLE_LIVING_ENTITIES), instance.present(MemoryModuleType.NEAREST_VISIBLE_LIVING_ENTITIES),
instance.registered(MemoryModuleType.ANGRY_AT) instance.registered(MemoryModuleType.ANGRY_AT),
).apply(instance) { entities, angryAt -> instance.registered(MemoryModuleType.ATTACK_TARGET),
).apply(instance) { entities, angryAt, attackTarget ->
Trigger { world, entity, _ -> Trigger { world, entity, _ ->
val target = instance.get(entities).findClosest { // bail if gamerule is disabled
mainThreadRuntime.withQueryValue("entity", entity.asMostSpecificMoLangValue()) if (!world.gameRules.getBoolean(CobblemonGameRules.DO_POKEMON_PREDATION)) return@Trigger false
val target = instance.get(entities).findClosest { hated ->
mainThreadRuntime.withQueryValue("entity", hated.asMostSpecificMoLangValue())
return@findClosest mainThreadRuntime.resolveBoolean(entityCondition) return@findClosest mainThreadRuntime.resolveBoolean(entityCondition)
}.orElse(null) }.orElse(null)
var shouldTrigger = false
if (target != null && target.distanceTo(entity) <= range) { if (target != null && target.distanceTo(entity) <= range) {
angryAt.set(target.uuid) shouldTrigger = when {
// set always attacking if activity chance is equal to 1.0
coercedChance == 1f -> {
angryAt.set(target.uuid)
attackTarget.set(target)
true
}
// roll the dice in other way
coercedChance != 1f && world.random.nextFloat() < coercedChance -> {
angryAt.set(target.uuid)
attackTarget.set(target)
true
}
// fallback to peaceful behavior in unattended cases
else -> false
}
} }
return@Trigger true return@Trigger shouldTrigger
} }
} }
} }
@@ -98,14 +98,14 @@ object LivingEntityMoLangFunctions : AbstractMoLangFunctionHolder<LivingEntity>(
val targetEntity = params.get<MoValue>(0) val targetEntity = params.get<MoValue>(0)
val maxDistance = params.getDoubleOrNull(1)?.toFloat() ?: 2.0F val maxDistance = params.getDoubleOrNull(1)?.toFloat() ?: 2.0F
val entity = val target =
if (targetEntity is ObjectValue<*> && targetEntity.obj is Entity) { if (targetEntity is ObjectValue<*> && targetEntity.obj is Entity) {
targetEntity.obj as Entity targetEntity.obj as Entity
} else { } else {
return@isLookingAt DoubleValue.ZERO return@isLookingAt DoubleValue.ZERO
} }
DoubleValue(entity.isLookingAt(entity, maxDistance)) DoubleValue(entity.isLookingAt(target, maxDistance))
} }
functions["is_living_entity"] = { DoubleValue.ONE } functions["is_living_entity"] = { DoubleValue.ONE }
functions["is_flying"] = { DoubleValue(entity.isFallFlying) } functions["is_flying"] = { DoubleValue(entity.isFallFlying) }
@@ -212,7 +212,7 @@ object PokemonMoLangFunctions : AbstractMoLangFunctionHolder<Pokemon>() {
// Lol. Lmao, even. // Lol. Lmao, even.
// TO-DO: Subscribe to [PokemonSpecies.observable]. // TO-DO: Subscribe to [PokemonSpecies.observable].
functions["pre_evolution"] = { pokemon.species.preEvolution ?: DoubleValue.ZERO } functions["pre_evolution"] = { pokemon.species.preEvolution ?: DoubleValue.ZERO }
functions["nature"] = { StringValue(pokemon.nature.toString()) } functions["nature"] = { StringValue(pokemon.nature.name.toString()) }
functions["is_wild"] = { DoubleValue(pokemon.entity?.let { it.ownerUUID == null } == true) } functions["is_wild"] = { DoubleValue(pokemon.entity?.let { it.ownerUUID == null } == true) }
functions["is_shiny"] = { DoubleValue(pokemon.shiny) } functions["is_shiny"] = { DoubleValue(pokemon.shiny) }
functions["is_in_party"] = { DoubleValue(pokemon.storeCoordinates.get()?.store is PartyStore) } functions["is_in_party"] = { DoubleValue(pokemon.storeCoordinates.get()?.store is PartyStore) }
@@ -10,9 +10,6 @@ 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
@@ -64,14 +61,6 @@ object Dexes : JsonDataRegistry<PokedexDef> {
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 getFormEquivalents(formName: String): List<String> { fun getFormEquivalents(formName: String): List<String> {
val key = equivalentFormsLookup[formName.lowercase()] val key = equivalentFormsLookup[formName.lowercase()]
return equivalentForms[key] ?: listOf(formName.lowercase()) return equivalentForms[key] ?: listOf(formName.lowercase())
@@ -88,7 +88,7 @@ fun getToolTipHeaderIcon(tradeEvolution: TradeEvolution): CobblemonDexEvolutionR
lang("ui.pokedex.evolution.trade.tooltip.with_any_species") lang("ui.pokedex.evolution.trade.tooltip.with_any_species")
} else { } else {
PokemonSpecies.getByIdentifier(species.asIdentifierDefaultingNamespace()) PokemonSpecies.getByIdentifier(species.asIdentifierDefaultingNamespace())
?.let { lang("ui.pokedex.evolution.trade.tooltip.with_species", it.translatedName.green()) } ?.let { lang("ui.pokedex.evolution.trade.tooltip.with_species", it.translatedName.plainCopy().green()) }
?: lang("ui.pokedex.evolution.trade.tooltip.with_any_species") ?: lang("ui.pokedex.evolution.trade.tooltip.with_any_species")
} }
return CobblemonDexEvolutionRequirementDisplay(CobblemonItems.LINK_CABLE, tooltip) return CobblemonDexEvolutionRequirementDisplay(CobblemonItems.LINK_CABLE, tooltip)
@@ -282,7 +282,7 @@ fun buildLevelRequirement(levelRequirement: LevelRequirement): DexEvolutionRequi
fun buildMoonPhaseRequirement(moonPhaseRequirement: MoonPhaseRequirement): DexEvolutionRequirementDisplay { fun buildMoonPhaseRequirement(moonPhaseRequirement: MoonPhaseRequirement): DexEvolutionRequirementDisplay {
val icon = Items.CLOCK val icon = Items.CLOCK
val moonPhaseComponent = moonPhaseRequirement.moonPhase.displayName().green() val moonPhaseComponent = moonPhaseRequirement.moonPhase.displayName().plainCopy().green()
val tooltip = lang("ui.pokedex.requirement.moon_phase.tooltip", moonPhaseComponent) val tooltip = lang("ui.pokedex.requirement.moon_phase.tooltip", moonPhaseComponent)
return CobblemonDexEvolutionRequirementDisplay(icon, tooltip) return CobblemonDexEvolutionRequirementDisplay(icon, tooltip)
@@ -290,7 +290,7 @@ fun buildMoonPhaseRequirement(moonPhaseRequirement: MoonPhaseRequirement): DexEv
fun buildMoveSetRequirement(moveSetRequirement: MoveSetRequirement): DexEvolutionRequirementDisplay { fun buildMoveSetRequirement(moveSetRequirement: MoveSetRequirement): DexEvolutionRequirementDisplay {
val icon = CobblemonItems.TECHNICAL_MACHINE val icon = CobblemonItems.TECHNICAL_MACHINE
val tooltip = lang("ui.pokedex.requirement.has_move.tooltip", moveSetRequirement.move.displayName.green()) val tooltip = lang("ui.pokedex.requirement.has_move.tooltip", moveSetRequirement.move.displayName.plainCopy().green())
return CobblemonDexEvolutionRequirementDisplay(icon, tooltip) return CobblemonDexEvolutionRequirementDisplay(icon, tooltip)
} }
@@ -319,7 +319,7 @@ fun buildMoveTypeRequirement(moveTypeRequirement: MoveTypeRequirement): DexEvolu
else -> CobblemonItems.NORMAL_GEM else -> CobblemonItems.NORMAL_GEM
} }
val tooltip = lang("ui.pokedex.requirement.has_move_type.tooltip", moveTypeRequirement.type.displayName.green()) val tooltip = lang("ui.pokedex.requirement.has_move_type.tooltip", moveTypeRequirement.type.displayName.plainCopy().green())
return CobblemonDexEvolutionRequirementDisplay(icon, tooltip) return CobblemonDexEvolutionRequirementDisplay(icon, tooltip)
} }
@@ -437,7 +437,7 @@ fun buildStructureRequirement(structureRequirement: StructureRequirement, negate
fun buildTimeRangeRequirement(timeRangeRequirement: TimeRangeRequirement): DexEvolutionRequirementDisplay? { fun buildTimeRangeRequirement(timeRangeRequirement: TimeRangeRequirement): DexEvolutionRequirementDisplay? {
val icon = Items.CLOCK val icon = Items.CLOCK
val timeRangeComponent = timeRangeRequirement.range.displayName() ?: return null val timeRangeComponent = timeRangeRequirement.range.displayName()?.plainCopy() ?: return null
val tooltip = lang("ui.pokedex.requirement.time_range.tooltip", timeRangeComponent.green()) val tooltip = lang("ui.pokedex.requirement.time_range.tooltip", timeRangeComponent.green())
return CobblemonDexEvolutionRequirementDisplay(icon, tooltip) return CobblemonDexEvolutionRequirementDisplay(icon, tooltip)
@@ -445,7 +445,7 @@ fun buildTimeRangeRequirement(timeRangeRequirement: TimeRangeRequirement): DexEv
fun buildUseMoveRequirement(useMoveRequirement: UseMoveRequirement): DexEvolutionRequirementDisplay { fun buildUseMoveRequirement(useMoveRequirement: UseMoveRequirement): DexEvolutionRequirementDisplay {
val icon = CobblemonItems.CHOICE_BAND val icon = CobblemonItems.CHOICE_BAND
val tooltip = lang("ui.pokedex.requirement.use_move.tooltip", useMoveRequirement.move.displayName.green()) val tooltip = lang("ui.pokedex.requirement.use_move.tooltip", useMoveRequirement.move.displayName.plainCopy().green())
return CobblemonDexEvolutionRequirementDisplay(icon, tooltip) return CobblemonDexEvolutionRequirementDisplay(icon, tooltip)
} }
@@ -42,8 +42,8 @@ abstract class AreaTypeSpawningCondition<T : AreaSpawnablePosition> : SpawningCo
override fun copyFrom(other: SpawningCondition<*>, merger: Merger) { override fun copyFrom(other: SpawningCondition<*>, merger: Merger) {
super.copyFrom(other, merger) super.copyFrom(other, merger)
if (other is AreaTypeSpawningCondition) { if (other is AreaTypeSpawningCondition) {
merger.mergeSingle(minHeight, other.minHeight) minHeight = merger.mergeSingle(minHeight, other.minHeight)
merger.mergeSingle(maxHeight, other.maxHeight) maxHeight = merger.mergeSingle(maxHeight, other.maxHeight)
neededNearbyBlocks = merger.merge(neededNearbyBlocks, other.neededNearbyBlocks)?.toMutableList() neededNearbyBlocks = merger.merge(neededNearbyBlocks, other.neededNearbyBlocks)?.toMutableList()
} }
} }
@@ -46,7 +46,7 @@ abstract class SubmergedTypeSpawningCondition<T : SubmergedSpawnablePosition> :
super.copyFrom(other, merger) super.copyFrom(other, merger)
if (other is SubmergedTypeSpawningCondition) { if (other is SubmergedTypeSpawningCondition) {
minDepth = merger.mergeSingle(minDepth, other.minDepth) minDepth = merger.mergeSingle(minDepth, other.minDepth)
maxDepth = merger.mergeSingle(minDepth, other.minDepth) maxDepth = merger.mergeSingle(maxDepth, other.maxDepth)
fluidIsSource = merger.mergeSingle(fluidIsSource, other.fluidIsSource) fluidIsSource = merger.mergeSingle(fluidIsSource, other.fluidIsSource)
fluid = merger.mergeSingle(fluid, other.fluid) fluid = merger.mergeSingle(fluid, other.fluid)
} }
@@ -39,7 +39,7 @@ abstract class SurfaceTypeSpawningCondition<T : SurfaceSpawnablePosition> : Area
super.copyFrom(other, merger) super.copyFrom(other, merger)
if (other is SurfaceTypeSpawningCondition) { if (other is SurfaceTypeSpawningCondition) {
minDepth = merger.mergeSingle(minDepth, other.minDepth) minDepth = merger.mergeSingle(minDepth, other.minDepth)
maxDepth = merger.mergeSingle(minDepth, other.minDepth) maxDepth = merger.mergeSingle(maxDepth, other.maxDepth)
fluid = merger.mergeSingle(fluid, other.fluid) fluid = merger.mergeSingle(fluid, other.fluid)
} }
} }
@@ -120,7 +120,7 @@ object CobblemonItemTags {
@JvmField val DESTINY_KNOT = create("held/destiny_knot") @JvmField val DESTINY_KNOT = create("held/destiny_knot")
@JvmField val EVERSTONE = create("held/everstone") @JvmField val EVERSTONE = create("held/everstone")
@JvmField val EXPERIENCE_SHARE = create("held/experience_share") @JvmField val EXPERIENCE_SHARE = create("held/experience_share")
@JvmField val IS_FRIENDSHIP_BOOSTER = create("is_friendship_booster") @JvmField val IS_FRIENDSHIP_BOOSTER = create("held/is_friendship_booster")
@JvmField val ANY_HELD_ITEM = create("held/is_held_item") @JvmField val ANY_HELD_ITEM = create("held/is_held_item")
@JvmField val BLACKLISTED_ITEMS_TO_HOLD = create("held/blacklisted_items_to_hold") @JvmField val BLACKLISTED_ITEMS_TO_HOLD = create("held/blacklisted_items_to_hold")
@JvmField val WHITELISTED_ITEMS_TO_HOLD = create("held/whitelisted_items_to_hold") @JvmField val WHITELISTED_ITEMS_TO_HOLD = create("held/whitelisted_items_to_hold")
@@ -85,6 +85,7 @@ class PartyOverlay : Gui(Minecraft.getInstance()) {
if (HidePartyBinding.shouldHide) { if (HidePartyBinding.shouldHide) {
return false return false
} }
return true return true
} }
} }
@@ -558,4 +559,4 @@ class PartyOverlay : Gui(Minecraft.getInstance()) {
} }
} }
} }
} }
@@ -9,19 +9,11 @@
package com.cobblemon.mod.common.client.gui.pokedex.widgets package com.cobblemon.mod.common.client.gui.pokedex.widgets
import com.cobblemon.mod.common.Cobblemon import com.cobblemon.mod.common.Cobblemon
import com.cobblemon.mod.common.CobblemonItems
import com.cobblemon.mod.common.api.gui.* import com.cobblemon.mod.common.api.gui.*
import com.cobblemon.mod.common.api.pokedex.Dexes 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.entry.CobblemonBiomeDexEvolutionRequirementDisplay import com.cobblemon.mod.common.api.pokedex.entry.*
import com.cobblemon.mod.common.api.pokedex.entry.DexEntries
import com.cobblemon.mod.common.api.pokedex.entry.DexEvolutionDisplay
import com.cobblemon.mod.common.api.pokedex.entry.DexEvolutionRequirementDisplay
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.PokemonProperties
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.text.add import com.cobblemon.mod.common.api.text.add
import com.cobblemon.mod.common.api.text.bold import com.cobblemon.mod.common.api.text.bold
import com.cobblemon.mod.common.api.text.green import com.cobblemon.mod.common.api.text.green
@@ -41,16 +33,15 @@ import com.cobblemon.mod.common.client.render.renderScaledGuiItemIcon
import com.cobblemon.mod.common.pokemon.FormData import com.cobblemon.mod.common.pokemon.FormData
import com.cobblemon.mod.common.pokemon.Gender import com.cobblemon.mod.common.pokemon.Gender
import com.cobblemon.mod.common.pokemon.RenderablePokemon import com.cobblemon.mod.common.pokemon.RenderablePokemon
import com.cobblemon.mod.common.util.asIdentifierDefaultingNamespace
import com.cobblemon.mod.common.util.cobblemonResource import com.cobblemon.mod.common.util.cobblemonResource
import com.cobblemon.mod.common.util.lang import com.cobblemon.mod.common.util.lang
import net.minecraft.client.Minecraft import net.minecraft.client.Minecraft
import net.minecraft.client.gui.GuiGraphics import net.minecraft.client.gui.GuiGraphics
import net.minecraft.core.registries.Registries import net.minecraft.core.registries.Registries
import net.minecraft.locale.Language import net.minecraft.locale.Language
import net.minecraft.resources.ResourceLocation
import net.minecraft.network.chat.Component import net.minecraft.network.chat.Component
import net.minecraft.network.chat.MutableComponent import net.minecraft.network.chat.MutableComponent
import net.minecraft.resources.ResourceLocation
import net.minecraft.tags.TagKey import net.minecraft.tags.TagKey
class EvolutionTreeWidget( class EvolutionTreeWidget(
@@ -168,7 +159,8 @@ class EvolutionTreeWidget(
// Stop at whatever the dex can't resolve, and at cycles (datapacks) // Stop at whatever the dex can't resolve, and at cycles (datapacks)
val visited = mutableSetOf(rootSpecies.speciesId to rootForm.displayForm) val visited = mutableSetOf(rootSpecies.speciesId to rootForm.displayForm)
while (preEvolution != null) { while (preEvolution != null) {
val preEvolutionSpecies = Dexes.findDexEntryBySpeciesId(preEvolution.fromSpecies) ?: break val preEvolutionSpecies = DexEntries.entries.values.firstOrNull { it.speciesId == preEvolution.fromSpecies &&
it.forms.any {form -> form.displayForm.equals(preEvolution.fromForm, ignoreCase = true)}} ?: break
val preEvolutionForm = preEvolutionSpecies.forms.firstOrNull { it.displayForm.equals(preEvolution.fromForm, ignoreCase = true) } ?: break val preEvolutionForm = preEvolutionSpecies.forms.firstOrNull { it.displayForm.equals(preEvolution.fromForm, ignoreCase = true) } ?: break
if (!visited.add(preEvolutionSpecies.speciesId to preEvolutionForm.displayForm)) break if (!visited.add(preEvolutionSpecies.speciesId to preEvolutionForm.displayForm)) break
rootSpecies = preEvolutionSpecies rootSpecies = preEvolutionSpecies
@@ -176,19 +168,16 @@ class EvolutionTreeWidget(
preEvolution = findPreEvolution(rootSpecies, rootForm) preEvolution = findPreEvolution(rootSpecies, rootForm)
} }
val entry = Dexes.findDexEntryBySpeciesId(rootSpecies.speciesId)
?: throw RuntimeException("Root dex entry not found")
val viewedFormEquivalents = Dexes.getFormEquivalents(pokedexForm.displayForm) val viewedFormEquivalents = Dexes.getFormEquivalents(pokedexForm.displayForm)
viewedForm = PokemonSpecies.getByIdentifier(pokedexEntry.speciesId) viewedForm = PokemonSpecies.getByIdentifier(pokedexEntry.speciesId)
?.forms?.firstOrNull { viewedFormEquivalents.contains(it.name.lowercase()) } ?.forms?.firstOrNull { viewedFormEquivalents.contains(it.name.lowercase()) }
val formEquivalents = Dexes.getFormEquivalents(rootForm.displayForm) val formEquivalents = Dexes.getFormEquivalents(rootForm.displayForm)
val form = val form =
entry.forms.firstOrNull { formEquivalents.contains(it.displayForm.lowercase()) } ?: rootSpecies.forms.firstOrNull { formEquivalents.contains(it.displayForm.lowercase()) } ?:
entry.forms.first { it.displayForm.equals("Normal", ignoreCase = true) } rootSpecies.forms.first { it.displayForm.equals("Normal", ignoreCase = true) }
val rootEvolutionNode = buildEvolutionTree(entry, form) val rootEvolutionNode = buildEvolutionTree(rootSpecies, form)
// val isSameEntry = previousRootPokedexEntry != null && pokedexEntry?.id == previousRootPokedexEntry?.id // val isSameEntry = previousRootPokedexEntry != null && pokedexEntry?.id == previousRootPokedexEntry?.id
// val isSameForm = // val isSameForm =
@@ -214,7 +203,7 @@ class EvolutionTreeWidget(
/** The evolution leading to [form]; the standard form falls back to any form of the species (no evolution leads to regular Vivillon). */ /** The evolution leading to [form]; the standard form falls back to any form of the species (no evolution leads to regular Vivillon). */
private fun findPreEvolution(entry: PokedexEntry, form: PokedexForm): DexEvolutionDisplay? { private fun findPreEvolution(entry: PokedexEntry, form: PokedexForm): DexEvolutionDisplay? {
return DexEntries.evolutionDisplays.firstOrNull { it.toSpecies == entry.speciesId && it.toForm == form.displayForm } return DexEntries.evolutionDisplays.firstOrNull { it.toSpecies == entry.speciesId && form.displayForm.equals(it.toForm, ignoreCase = true) }
?: DexEntries.evolutionDisplays.takeIf { form.displayForm.equals("Normal", ignoreCase = true) } ?: DexEntries.evolutionDisplays.takeIf { form.displayForm.equals("Normal", ignoreCase = true) }
?.firstOrNull { it.toSpecies == entry.speciesId } ?.firstOrNull { it.toSpecies == entry.speciesId }
} }
@@ -246,7 +235,8 @@ class EvolutionTreeWidget(
val evolutions = DexEntries.evolutionDisplays.filter { it.fromSpecies == pokedexEntry.speciesId && formEquivalents.contains(it.fromForm.lowercase()) } val evolutions = DexEntries.evolutionDisplays.filter { it.fromSpecies == pokedexEntry.speciesId && formEquivalents.contains(it.fromForm.lowercase()) }
val children = evolutions.mapNotNull { val children = evolutions.mapNotNull {
val childPokedexEntry = Dexes.findDexEntryBySpeciesId(it.toSpecies) val childPokedexEntry = DexEntries.entries.values.firstOrNull { entry -> entry.speciesId == it.toSpecies &&
entry.forms.any {form -> form.displayForm.equals(it.toForm, ignoreCase = true)}}
if (childPokedexEntry == null) { if (childPokedexEntry == null) {
Cobblemon.LOGGER.warn("Dex entry not found for species: ${it.toSpecies}") Cobblemon.LOGGER.warn("Dex entry not found for species: ${it.toSpecies}")
return@mapNotNull null return@mapNotNull null
@@ -34,6 +34,7 @@ import com.cobblemon.mod.common.client.render.models.blockbench.bedrock.animatio
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
import com.cobblemon.mod.common.client.render.models.blockbench.quirk.ModelQuirk import com.cobblemon.mod.common.client.render.models.blockbench.quirk.ModelQuirk
import com.cobblemon.mod.common.client.render.models.blockbench.quirk.QuirkData import com.cobblemon.mod.common.client.render.models.blockbench.quirk.QuirkData
import com.cobblemon.mod.common.client.sound.instances.UIEntitySoundInstance
import com.cobblemon.mod.common.entity.PosableEntity import com.cobblemon.mod.common.entity.PosableEntity
import com.cobblemon.mod.common.entity.PoseType import com.cobblemon.mod.common.entity.PoseType
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
@@ -44,7 +45,6 @@ import com.mojang.brigadier.exceptions.CommandSyntaxException
import java.util.concurrent.ConcurrentLinkedQueue import java.util.concurrent.ConcurrentLinkedQueue
import net.minecraft.client.Minecraft import net.minecraft.client.Minecraft
import net.minecraft.client.multiplayer.ClientLevel import net.minecraft.client.multiplayer.ClientLevel
import net.minecraft.client.resources.sounds.SimpleSoundInstance
import net.minecraft.commands.arguments.item.ItemParser import net.minecraft.commands.arguments.item.ItemParser
import net.minecraft.sounds.SoundEvent import net.minecraft.sounds.SoundEvent
import net.minecraft.world.entity.Entity import net.minecraft.world.entity.Entity
@@ -289,7 +289,7 @@ abstract class PosableState : Schedulable {
entity.level().playLocalSound(entity, soundEvent, entity.soundSource, volume, pitch) entity.level().playLocalSound(entity, soundEvent, entity.soundSource, volume, pitch)
} }
} else { } else {
Minecraft.getInstance().soundManager.play(SimpleSoundInstance.forUI(soundEvent, volume, pitch)) Minecraft.getInstance().soundManager.play(UIEntitySoundInstance(soundEvent, volume, pitch))
} }
} }
} }
@@ -19,6 +19,7 @@ import com.cobblemon.mod.common.client.render.models.blockbench.PosableState
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Bone import com.cobblemon.mod.common.client.render.models.blockbench.pose.Bone
import com.cobblemon.mod.common.client.render.models.blockbench.repository.RenderContext import com.cobblemon.mod.common.client.render.models.blockbench.repository.RenderContext
import com.cobblemon.mod.common.client.sound.instances.AlphaCrySoundInstance import com.cobblemon.mod.common.client.sound.instances.AlphaCrySoundInstance
import com.cobblemon.mod.common.client.sound.instances.UIEntitySoundInstance
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
import com.cobblemon.mod.common.util.effectiveName import com.cobblemon.mod.common.util.effectiveName
import com.cobblemon.mod.common.util.genericRuntime import com.cobblemon.mod.common.util.genericRuntime
@@ -31,7 +32,6 @@ import net.minecraft.client.Minecraft
import net.minecraft.client.model.geom.ModelPart import net.minecraft.client.model.geom.ModelPart
import net.minecraft.client.multiplayer.ClientLevel import net.minecraft.client.multiplayer.ClientLevel
import net.minecraft.client.resources.sounds.EntityBoundSoundInstance import net.minecraft.client.resources.sounds.EntityBoundSoundInstance
import net.minecraft.client.resources.sounds.SimpleSoundInstance
import net.minecraft.resources.ResourceLocation import net.minecraft.resources.ResourceLocation
import net.minecraft.sounds.SoundEvent import net.minecraft.sounds.SoundEvent
import net.minecraft.world.entity.Entity import net.minecraft.world.entity.Entity
@@ -121,7 +121,7 @@ class BedrockSoundKeyframe(
} }
} }
} else { } else {
Minecraft.getInstance().soundManager.play(SimpleSoundInstance.forUI(soundEvent, 1F, 1F)) Minecraft.getInstance().soundManager.play(UIEntitySoundInstance(soundEvent))
} }
} }
} }
@@ -12,6 +12,7 @@ import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonP
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
import com.cobblemon.mod.common.entity.PoseType import com.cobblemon.mod.common.entity.PoseType
import com.cobblemon.mod.common.util.asExpressionLike
import net.minecraft.client.model.geom.ModelPart import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3 import net.minecraft.world.phys.Vec3
@@ -28,6 +29,8 @@ class MasquerainModel(root: ModelPart) : PokemonPosableModel(root), HeadedFrame
lateinit var walk: Pose lateinit var walk: Pose
lateinit var standing: Pose lateinit var standing: Pose
override fun registerPoses() { override fun registerPoses() {
animations["cry"] = "q.bedrock_stateful('masquerain', 'cry')".asExpressionLike()
val blink = quirk { bedrockStateful("masquerain", "blink") } val blink = quirk { bedrockStateful("masquerain", "blink") }
standing = registerPose( standing = registerPose(
poseName = "standing", poseName = "standing",
@@ -14,6 +14,7 @@ import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonP
import com.cobblemon.mod.common.client.render.models.blockbench.pose.ModelPartTransformation import com.cobblemon.mod.common.client.render.models.blockbench.pose.ModelPartTransformation
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
import com.cobblemon.mod.common.entity.PoseType import com.cobblemon.mod.common.entity.PoseType
import com.cobblemon.mod.common.util.asExpressionLike
import com.cobblemon.mod.common.util.isInWater import com.cobblemon.mod.common.util.isInWater
import net.minecraft.client.model.geom.ModelPart import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3 import net.minecraft.world.phys.Vec3
@@ -36,6 +37,8 @@ class SurskitModel(root: ModelPart) : PokemonPosableModel(root), HeadedFrame {
val wateroffset = -8 val wateroffset = -8
override fun registerPoses() { override fun registerPoses() {
animations["cry"] = "q.bedrock_stateful('surskit', 'cry')".asExpressionLike()
val blink = quirk { bedrockStateful("surskit", "blink") } val blink = quirk { bedrockStateful("surskit", "blink") }
standing = registerPose( standing = registerPose(
poseName = "standing", poseName = "standing",
@@ -14,6 +14,7 @@ import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonP
import com.cobblemon.mod.common.client.render.models.blockbench.pose.ModelPartTransformation import com.cobblemon.mod.common.client.render.models.blockbench.pose.ModelPartTransformation
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
import com.cobblemon.mod.common.entity.PoseType import com.cobblemon.mod.common.entity.PoseType
import com.cobblemon.mod.common.util.asExpressionLike
import net.minecraft.client.model.geom.ModelPart import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3 import net.minecraft.world.phys.Vec3
@@ -36,6 +37,8 @@ class CombeeModel (root: ModelPart) : PokemonPosableModel(root) {
val shoulderZOffset = 8 val shoulderZOffset = 8
override fun registerPoses() { override fun registerPoses() {
animations["cry"] = "q.bedrock_stateful('combee', 'cry')".asExpressionLike()
val blink1 = quirk { bedrockStateful("combee", "blink_right") } val blink1 = quirk { bedrockStateful("combee", "blink_right") }
val blink2 = quirk { bedrockStateful("combee", "blink_gender") } val blink2 = quirk { bedrockStateful("combee", "blink_gender") }
val blink3 = quirk { bedrockStateful("combee", "blink_left") } val blink3 = quirk { bedrockStateful("combee", "blink_left") }
@@ -12,6 +12,7 @@ import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonP
import com.cobblemon.mod.common.client.render.models.blockbench.PosableState import com.cobblemon.mod.common.client.render.models.blockbench.PosableState
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
import com.cobblemon.mod.common.entity.PoseType import com.cobblemon.mod.common.entity.PoseType
import com.cobblemon.mod.common.util.asExpressionLike
import net.minecraft.client.model.geom.ModelPart import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3 import net.minecraft.world.phys.Vec3
@@ -30,6 +31,8 @@ class VespiquenModel (root: ModelPart) : PokemonPosableModel(root) {
lateinit var standing: Pose lateinit var standing: Pose
override fun registerPoses() { override fun registerPoses() {
animations["cry"] = "q.bedrock_stateful('vespiquen', 'cry')".asExpressionLike()
val blink1 = quirk { bedrockStateful("vespiquen", "blink") } val blink1 = quirk { bedrockStateful("vespiquen", "blink") }
val wingsleep = quirk { bedrockStateful("vespiquen", "sleep_flap") } val wingsleep = quirk { bedrockStateful("vespiquen", "sleep_flap") }
@@ -1,62 +0,0 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen5
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
import com.cobblemon.mod.common.entity.PoseType
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class SerperiorModel (root: ModelPart) : PokemonPosableModel(root), HeadedFrame {
override val rootPart = root.registerChildWithAllChildren("serperior")
override val head = getPart("head_ai")
override var portraitScale = 2.5F
override var portraitTranslation = Vec3(-0.3, 1.25, 0.0)
override var profileScale = 0.6F
override var profileTranslation = Vec3(0.0, 0.8, 0.0)
lateinit var standing: Pose
lateinit var walk: Pose
lateinit var sleep: Pose
override val cryAnimation = CryProvider { bedrockStateful("serperior", "cry") }
override fun registerPoses() {
val blink = quirk { bedrockStateful("serperior", "blink") }
sleep = registerPose(
poseType = PoseType.SLEEP,
animations = arrayOf(bedrock("serperior", "sleep"))
)
standing = registerPose(
poseName = "standing",
poseTypes = PoseType.STATIONARY_POSES + PoseType.UI_POSES,
quirks = arrayOf(blink),
animations = arrayOf(
singleBoneLook(),
bedrock("serperior", "ground_idle")
)
)
walk = registerPose(
poseName = "walk",
poseTypes = PoseType.MOVING_POSES,
quirks = arrayOf(blink),
animations = arrayOf(
singleBoneLook(),
bedrock("serperior", "ground_walk")
)
)
}
}
@@ -1,70 +0,0 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen5
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BimanualFrame
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BipedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
import com.cobblemon.mod.common.entity.PoseType
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class ServineModel (root: ModelPart) : PokemonPosableModel(root), HeadedFrame, BipedFrame, BimanualFrame {
override val rootPart = root.registerChildWithAllChildren("servine")
override val head = getPart("head_ai")
override val rightArm = getPart("arm_right")
override val leftArm = getPart("arm_left")
override val rightLeg = getPart("leg_right")
override val leftLeg = getPart("leg_left")
override var portraitScale = 2.6F
override var portraitTranslation = Vec3(-0.15, 0.75, 0.0)
override var profileScale = 0.8F
override var profileTranslation = Vec3(0.0, 0.55, 0.0)
lateinit var sleep: Pose
lateinit var standing: Pose
lateinit var walk: Pose
override val cryAnimation = CryProvider { bedrockStateful("servine", "cry") }
override fun registerPoses() {
val blink = quirk { bedrockStateful("servine", "blink") }
sleep = registerPose(
poseType = PoseType.SLEEP,
transformTicks = 10,
animations = arrayOf(bedrock("servine", "sleep"))
)
standing = registerPose(
poseName = "standing",
poseTypes = PoseType.STATIONARY_POSES + PoseType.UI_POSES,
transformTicks = 10,
quirks = arrayOf(blink),
animations = arrayOf(
singleBoneLook(),
bedrock("servine", "ground_idle")
)
)
walk = registerPose(
poseName = "walking",
poseTypes = PoseType.MOVING_POSES,
transformTicks = 10,
quirks = arrayOf(blink),
animations = arrayOf(
singleBoneLook(),
bedrock("servine", "ground_walk")
)
)
}
}
@@ -1,70 +0,0 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen5
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BimanualFrame
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BipedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
import com.cobblemon.mod.common.entity.PoseType
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class SnivyModel (root: ModelPart) : PokemonPosableModel(root), HeadedFrame, BipedFrame, BimanualFrame {
override val rootPart = root.registerChildWithAllChildren("snivy")
override val head = getPart("head_ai")
override val rightArm = getPart("arm_right")
override val leftArm = getPart("arm_left")
override val rightLeg = getPart("leg_right")
override val leftLeg = getPart("leg_left")
override var portraitScale = 2.0F
override var portraitTranslation = Vec3(-0.15, 0.32, 0.0)
override var profileScale = 0.8F
override var profileTranslation = Vec3(0.0, 0.55, 0.0)
lateinit var sleep: Pose
lateinit var standing: Pose
lateinit var walk: Pose
override val cryAnimation = CryProvider { bedrockStateful("snivy", "cry") }
override fun registerPoses() {
val blink = quirk { bedrockStateful("snivy", "blink") }
sleep = registerPose(
poseType = PoseType.SLEEP,
transformTicks = 10,
animations = arrayOf(bedrock("snivy", "sleep"))
)
standing = registerPose(
poseName = "standing",
poseTypes = PoseType.STATIONARY_POSES + PoseType.UI_POSES,
transformTicks = 10,
quirks = arrayOf(blink),
animations = arrayOf(
singleBoneLook(),
bedrock("snivy", "ground_idle")
)
)
walk = registerPose(
poseName = "walking",
poseTypes = PoseType.MOVING_POSES,
transformTicks = 10,
quirks = arrayOf(blink),
animations = arrayOf(
singleBoneLook(),
bedrock("snivy", "ground_walk")
)
)
}
}
@@ -1,85 +0,0 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen6
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
import com.cobblemon.mod.common.entity.PoseType
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class GourgeistModel (root: ModelPart) : PokemonPosableModel(root), HeadedFrame {
override val rootPart = root.registerChildWithAllChildren("gourgeist")
override val head = getPart("head")
override var portraitScale = 4.0F
override var portraitTranslation = Vec3(-0.1, 0.6, 0.0)
override var profileScale = 0.8F
override var profileTranslation = Vec3(0.0, 0.55, 0.0)
lateinit var standing: Pose
lateinit var walk: Pose
lateinit var hovering: Pose
lateinit var fly: Pose
lateinit var sleep: Pose
override val cryAnimation = CryProvider { bedrockStateful("gourgeist", "cry") }
override fun registerPoses() {
val blink = quirk { bedrockStateful("gourgeist", "blink") }
standing = registerPose(
poseName = "standing",
poseTypes = PoseType.UI_POSES + PoseType.STAND,
quirks = arrayOf(blink),
animations = arrayOf(
singleBoneLook(),
bedrock("gourgeist", "ground_idle")
)
)
walk = registerPose(
poseName = "walk",
poseType = PoseType.WALK,
quirks = arrayOf(blink),
animations = arrayOf(
bedrock("gourgeist", "ground_walk")
)
)
hovering = registerPose(
poseName = "hovering",
poseType = PoseType.HOVER,
quirks = arrayOf(blink),
animations = arrayOf(
bedrock("gourgeist", "air_idle")
)
)
fly = registerPose(
poseName = "fly",
poseType = PoseType.FLY,
quirks = arrayOf(blink),
animations = arrayOf(
bedrock("gourgeist", "air_fly")
)
)
sleep = registerPose(
poseName = "sleep",
poseType = PoseType.SLEEP,
quirks = arrayOf(blink),
animations = arrayOf(
bedrock("gourgeist", "sleep")
)
)
}
}
@@ -1,77 +0,0 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen6
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
import com.cobblemon.mod.common.client.render.models.blockbench.pose.CobblemonPose
import com.cobblemon.mod.common.entity.PoseType
import net.minecraft.client.model.geom.ModelPart
import net.minecraft.world.phys.Vec3
class PumpkabooModel (root: ModelPart) : PokemonPosableModel(root), HeadedFrame {
override val rootPart = root.registerChildWithAllChildren("pumpkaboo")
override val head = getPart("head")
override var portraitScale = 3.5F
override var portraitTranslation = Vec3(0.0, -1.5, 0.0)
override var profileScale = 1.0F
override var profileTranslation = Vec3(0.0, 0.25, 0.0)
lateinit var standing: CobblemonPose
lateinit var walk: CobblemonPose
lateinit var battleidle: CobblemonPose
lateinit var sleep: CobblemonPose
override val cryAnimation = CryProvider { bedrockStateful("pumpkaboo", "cry") }
override fun registerPoses() {
val blink = quirk { bedrockStateful("pumpkaboo", "blink") }
val quirk = quirk { bedrockStateful("pumpkaboo", "quirk_idle") }
sleep = registerPose(
poseName = "sleep",
poseType = PoseType.SLEEP,
quirks = arrayOf(blink),
animations = arrayOf(
bedrock("pumpkaboo", "sleep")
)
)
standing = registerPose(
poseName = "standing",
poseTypes = PoseType.STATIONARY_POSES + PoseType.UI_POSES,
quirks = arrayOf(blink, quirk),
animations = arrayOf(
singleBoneLook(),
bedrock("pumpkaboo", "ground_idle")
)
)
walk = registerPose(
poseName = "walk",
poseTypes = PoseType.MOVING_POSES,
quirks = arrayOf(blink),
animations = arrayOf(
bedrock("pumpkaboo", "ground_walk")
)
)
battleidle = registerPose(
poseName = "battleidle",
poseTypes = PoseType.STATIONARY_POSES,
quirks = arrayOf(blink),
animations = arrayOf(
bedrock("pumpkaboo", "battle_idle")
)
)
}
}
@@ -322,8 +322,6 @@ object VaryingModelRepository {
inbuilt("loudred", :: LoudredModel) inbuilt("loudred", :: LoudredModel)
inbuilt("exploud", :: ExploudModel) inbuilt("exploud", :: ExploudModel)
inbuilt("cryogonal", :: CryogonalModel) inbuilt("cryogonal", :: CryogonalModel)
inbuilt("pumpkaboo", :: PumpkabooModel)
inbuilt("gourgeist", :: GourgeistModel)
inbuilt("eiscue", :: EiscueModel) inbuilt("eiscue", :: EiscueModel)
inbuilt("wooloo", :: WoolooModel) inbuilt("wooloo", :: WoolooModel)
inbuilt("dubwool", :: DubwoolModel) inbuilt("dubwool", :: DubwoolModel)
@@ -340,9 +338,6 @@ object VaryingModelRepository {
inbuilt("thwackey", ::ThwackeyModel) inbuilt("thwackey", ::ThwackeyModel)
inbuilt("rillaboom", ::RillaboomModel) inbuilt("rillaboom", ::RillaboomModel)
inbuilt("samurott", ::SamurottModel) inbuilt("samurott", ::SamurottModel)
inbuilt("snivy", ::SnivyModel)
inbuilt("servine", ::ServineModel)
inbuilt("serperior", ::SerperiorModel)
inbuilt("slugma", ::SlugmaModel) inbuilt("slugma", ::SlugmaModel)
inbuilt("magcargo", ::MagcargoModel) inbuilt("magcargo", ::MagcargoModel)
inbuilt("slugma_shiny", ::SlugmaShinyModel) inbuilt("slugma_shiny", ::SlugmaShinyModel)
@@ -0,0 +1,22 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.client.sound.instances
import net.minecraft.client.resources.sounds.SimpleSoundInstance
import net.minecraft.client.resources.sounds.SoundInstance
import net.minecraft.sounds.SoundEvent
import net.minecraft.sounds.SoundSource
/**
* Plays a sound for a Pokémon rendered in a GUI, where there is no entity to take the sound source from.
* Unlike [SimpleSoundInstance.forUI] this uses [SoundSource.NEUTRAL] so the Friendly Creatures slider applies.
*/
class UIEntitySoundInstance(sound: SoundEvent, volume: Float = 1F, pitch: Float = 1F) :
SimpleSoundInstance(sound.location, SoundSource.NEUTRAL, volume, pitch, SoundInstance.createUnseededRandom(),
false, 0, SoundInstance.Attenuation.NONE, 0.0, 0.0, 0.0, true)
@@ -164,6 +164,9 @@ class CobblemonConfig {
@CobblemonConfigField(Category.Pokemon, lang = "experience_multiplier", SERVER) @CobblemonConfigField(Category.Pokemon, lang = "experience_multiplier", SERVER)
var experienceMultiplier = 2F var experienceMultiplier = 2F
@CobblemonConfigField(Category.Pokemon, lang = "predation_chance", SERVER)
var predationChance = 0.05F
@CobblemonConfigField(Category.Spawning, lang = "pokemon_per_chunk", SERVER) @CobblemonConfigField(Category.Spawning, lang = "pokemon_per_chunk", SERVER)
var pokemonPerChunk = 1F var pokemonPerChunk = 1F
@@ -269,6 +269,7 @@ class EmptyPokeBallEntity : ThrowableItemProjectile, PosableEntity, WaterDragMod
attemptCatch(pokemonEntity) attemptCatch(pokemonEntity)
}, },
ifCanceled = { ifCanceled = {
captureFuture.complete(false)
drop() drop()
return return
} }
@@ -1294,16 +1294,7 @@ open class PokemonEntity(
} }
private fun showInteractionWheel(player: ServerPlayer, itemStack: ItemStack) { private fun showInteractionWheel(player: ServerPlayer, itemStack: ItemStack) {
val canRide = ifRidingAvailableSupply(false) { behaviour, settings, state -> val canRide = isRideableFor(player)
if (platform != PlatformType.NONE) return@ifRidingAvailableSupply false
if (tethering != null) return@ifRidingAvailableSupply false;
if (seats.isEmpty()) return@ifRidingAvailableSupply false;
if ((owner as? ServerPlayer)?.isInBattle() == true) return@ifRidingAvailableSupply false;
if (this.owner != player && this.passengers.isEmpty()) return@ifRidingAvailableSupply false;
if(pokemon.effectiveScale < Cobblemon.config.minimumRidingScale) return@ifRidingAvailableSupply false;
if(beamMode == 3) return@ifRidingAvailableSupply false;
return@ifRidingAvailableSupply behaviour.isActive(settings, state, this);
}
if (pokemon.getOwnerPlayer() == player) { if (pokemon.getOwnerPlayer() == player) {
val cosmeticItemDefinition = CobblemonCosmeticItems.findValidCosmeticForPokemonAndItem( val cosmeticItemDefinition = CobblemonCosmeticItems.findValidCosmeticForPokemonAndItem(
player.level().registryAccess(), player.level().registryAccess(),
@@ -1325,6 +1316,18 @@ open class PokemonEntity(
} }
} }
fun isRideableFor(player: ServerPlayer): Boolean = ifRidingAvailableSupply(false) canRide@{ behaviour, settings, state ->
if (!player.canInteractWithEntity(this, player.entityInteractionRange())) return@canRide false
if (platform != PlatformType.NONE) return@canRide false
if (tethering != null) return@canRide false
if (seats.isEmpty()) return@canRide false
if ((owner as? ServerPlayer)?.isInBattle() == true) return@canRide false
if (this.owner != player && this.passengers.isEmpty()) return@canRide false
if (pokemon.effectiveScale < Cobblemon.config.minimumRidingScale) return@canRide false
if (beamMode == 3) return@canRide false
return@canRide behaviour.isActive(settings, state, this)
}
override fun getDimensions(pose: Pose): EntityDimensions { override fun getDimensions(pose: Pose): EntityDimensions {
val scale = effects.mockEffect?.scale ?: (form.baseScale * pokemon.effectiveScale) val scale = effects.mockEffect?.scale ?: (form.baseScale * pokemon.effectiveScale)
var result = this.exposedForm.hitbox.scale(scale) var result = this.exposedForm.hitbox.scale(scale)
@@ -1606,9 +1609,8 @@ open class PokemonEntity(
|| stack.`is`(CobblemonItemTags.WHITELISTED_ITEMS_TO_HOLD) || stack.`is`(CobblemonItemTags.WHITELISTED_ITEMS_TO_HOLD)
fun tryRidingPokemon(player: ServerPlayer): Boolean { fun tryRidingPokemon(player: ServerPlayer): Boolean {
if (pokemon.effectiveScale < Cobblemon.config.minimumRidingScale) { if (!isRideableFor(player)) return false
return false
}
val event = RidePokemonEvent.Pre(player, this) val event = RidePokemonEvent.Pre(player, this)
CobblemonEvents.RIDE_EVENT_PRE.post(event) CobblemonEvents.RIDE_EVENT_PRE.post(event)
if (!event.isCanceled) { if (!event.isCanceled) {
@@ -55,6 +55,8 @@ object PlatformEvents {
@JvmField @JvmField
val CLIENT_PLAYER_LOGOUT = EventObservable<ClientPlayerEvent.Logout>() val CLIENT_PLAYER_LOGOUT = EventObservable<ClientPlayerEvent.Logout>()
@JvmField @JvmField
val PLAYER_RESPAWN = EventObservable<ServerPlayerEvent.Respawn>()
@JvmField
val PLAYER_DEATH = CancelableObservable<ServerPlayerEvent.Death>() val PLAYER_DEATH = CancelableObservable<ServerPlayerEvent.Death>()
@JvmField @JvmField
val RIGHT_CLICK_BLOCK = CancelableObservable<ServerPlayerEvent.RightClickBlock>() val RIGHT_CLICK_BLOCK = CancelableObservable<ServerPlayerEvent.RightClickBlock>()
@@ -50,6 +50,11 @@ interface ServerPlayerEvent {
*/ */
data class Logout(override val player: ServerPlayer) : ServerPlayerEvent data class Logout(override val player: ServerPlayer) : ServerPlayerEvent
/**
* Fired when the [player] respawns (either by coming back from the end or dying).
*/
data class Respawn(override val player: ServerPlayer) : ServerPlayerEvent
/** /**
* Fired when the [player] dies. * Fired when the [player] dies.
* If canceled the death will be prevented but healing is required in order to not be stuck in a loop. * If canceled the death will be prevented but healing is required in order to not be stuck in a loop.
@@ -13,6 +13,7 @@ import com.cobblemon.mod.common.api.abilities.Abilities
import com.cobblemon.mod.common.api.data.DataRegistry import com.cobblemon.mod.common.api.data.DataRegistry
import com.cobblemon.mod.common.api.pokeball.PokeBalls import com.cobblemon.mod.common.api.pokeball.PokeBalls
import com.cobblemon.mod.common.api.pokemon.Natures import com.cobblemon.mod.common.api.pokemon.Natures
import com.cobblemon.mod.common.api.pokemon.feature.AbstractChoiceSpeciesFeatureProvider
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.status.Statuses import com.cobblemon.mod.common.api.pokemon.status.Statuses
import com.cobblemon.mod.common.api.properties.CustomPokemonProperty import com.cobblemon.mod.common.api.properties.CustomPokemonProperty
@@ -135,7 +136,7 @@ internal object PropertiesCompletionProvider : DataRegistry {
this.inject(setOf("level", "lvl", "l"), setOf("1", "${Cobblemon.config.maxPokemonLevel}") ) this.inject(setOf("level", "lvl", "l"), setOf("1", "${Cobblemon.config.maxPokemonLevel}") )
this.inject(setOf("shiny", "s"), setOf("yes", "no")) this.inject(setOf("shiny", "s"), setOf("yes", "no"))
this.inject(setOf("alpha", "is_alpha"), setOf("yes", "no")) this.inject(setOf("alpha", "is_alpha"), setOf("yes", "no"))
this.inject(setOf("gender"), Gender.values().map { it.name.lowercase() }) this.inject(setOf("gender"), Gender.entries.map { it.name.lowercase() })
this.inject(setOf("friendship"), setOf("0", Cobblemon.config.maxPokemonFriendship.toString())) this.inject(setOf("friendship"), setOf("0", Cobblemon.config.maxPokemonFriendship.toString()))
this.inject(setOf("fullness"), setOf("0", "255")) this.inject(setOf("fullness"), setOf("0", "255"))
this.inject(setOf("pokeball"), PokeBalls.all().map { it.name.simplify() }) this.inject(setOf("pokeball"), PokeBalls.all().map { it.name.simplify() })
@@ -165,7 +166,11 @@ internal object PropertiesCompletionProvider : DataRegistry {
private fun addCustom() { private fun addCustom() {
CustomPokemonProperty.properties.forEach { property -> CustomPokemonProperty.properties.forEach { property ->
// We won't tab complete properties that have no key attached to them as it would be fairly hard to determine which one to suggest // We won't tab complete properties that have no key attached to them as it would be fairly hard to determine which one to suggest
if (property.needsKey) { if (property.needsKey && property !is AbstractChoiceSpeciesFeatureProvider<*>) {
this.inject(property.keys, property.examples())
}
// Except choice features that fill examples with all available choices - Gito
if (property is AbstractChoiceSpeciesFeatureProvider<*>) {
this.inject(property.keys, property.examples()) this.inject(property.keys, property.examples())
} }
} }
@@ -176,4 +181,4 @@ internal object PropertiesCompletionProvider : DataRegistry {
val suggestions: Collection<String> val suggestions: Collection<String>
) )
} }
@@ -26,5 +26,6 @@ object CobblemonGameRules {
val SHINY_STARTERS: GameRules.Key<GameRules.BooleanValue> = Cobblemon.implementation.registerGameRule("doShinyStarters", GameRules.Category.MISC, BooleanRuleInvoker.`cobblemon$create`(false)) val SHINY_STARTERS: GameRules.Key<GameRules.BooleanValue> = Cobblemon.implementation.registerGameRule("doShinyStarters", GameRules.Category.MISC, BooleanRuleInvoker.`cobblemon$create`(false))
@JvmField @JvmField
val HEALERS_HEAL_PC: GameRules.Key<GameRules.BooleanValue> = Cobblemon.implementation.registerGameRule("healersHealPC", GameRules.Category.MISC, BooleanRuleInvoker.`cobblemon$create`(false)) val HEALERS_HEAL_PC: GameRules.Key<GameRules.BooleanValue> = Cobblemon.implementation.registerGameRule("healersHealPC", GameRules.Category.MISC, BooleanRuleInvoker.`cobblemon$create`(false))
@JvmField
val DO_POKEMON_PREDATION: GameRules.Key<GameRules.BooleanValue> = Cobblemon.implementation.registerGameRule("doPokemonPredation", GameRules.Category.MOBS, BooleanRuleInvoker.`cobblemon$create`(true))
} }
@@ -217,7 +217,7 @@
} }
} }
}, },
"animation.raichu_cap.water_swim": { "animation.raichu_cap.water_surface_swim": {
"loop": true, "loop": true,
"animation_length": 1, "animation_length": 1,
"bones": { "bones": {
@@ -364,6 +364,14 @@
"rotation": [-22.5, 0, 0] "rotation": [-22.5, 0, 0]
} }
} }
},
"animation.wurmple.cry": {
"animation_length": 1.25,
"sound_effects": {
"0.0": {
"effect": "pokemon.wurmple.cry"
}
}
} }
} }
} }
@@ -212,6 +212,14 @@
"position": [0, 0, -0.1] "position": [0, 0, -0.1]
} }
} }
},
"animation.silcoon.cry": {
"animation_length": 1.25,
"sound_effects": {
"0.0": {
"effect": "pokemon.silcoon.cry"
}
}
} }
} }
} }
@@ -361,6 +361,14 @@
"rotation": [0, 20, 0] "rotation": [0, 20, 0]
} }
} }
},
"animation.beautifly.cry": {
"animation_length": 1.25,
"sound_effects": {
"0.0": {
"effect": "pokemon.beautifly.cry"
}
}
} }
} }
} }
@@ -194,6 +194,14 @@
"position": [0, 0, -0.1] "position": [0, 0, -0.1]
} }
} }
},
"animation.cascoon.cry": {
"animation_length": 1.25,
"sound_effects": {
"0.0": {
"effect": "pokemon.cascoon.cry"
}
}
} }
} }
} }
@@ -255,6 +255,30 @@
"position": [0, 0, -0.1] "position": [0, 0, -0.1]
} }
} }
},
"animation.dustox.cry": {
"animation_length": 1,
"bones": {
"mouth_closed_smile": {
"position": {
"0.0": [0, 0, 0],
"0.0833": {"pre": [0, 0, 0], "post": [0, 0, 0.1]},
"0.625": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"mouth_open": {
"position": {
"0.0": [0, 0, 0],
"0.0833": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"0.625": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
}
},
"sound_effects": {
"0.0833": {
"effect": "pokemon.dustox.cry"
}
}
} }
} }
} }
@@ -149,6 +149,14 @@
"rotation": [0, 0, 22.5] "rotation": [0, 0, 22.5]
} }
} }
},
"animation.surskit.cry": {
"animation_length": 1.25,
"sound_effects": {
"0.0": {
"effect": "pokemon.surskit.cry"
}
}
} }
}, },
"geckolib_format_version": 2 "geckolib_format_version": 2
@@ -158,6 +158,11 @@
"0.75": [0, 0, 0] "0.75": [0, 0, 0]
} }
} }
},
"sound_effects": {
"0.0": {
"effect": "pokemon.masquerain.cry"
}
} }
} }
}, },
@@ -447,6 +447,11 @@
"1.5": [0, 0, 0] "1.5": [0, 0, 0]
} }
} }
},
"sound_effects": {
"0.0": {
"effect": "pokemon.starly.cry"
}
} }
} }
} }
@@ -331,6 +331,11 @@
"1.5": [0, 0, 0] "1.5": [0, 0, 0]
} }
} }
},
"sound_effects": {
"0.0": {
"effect": "pokemon.staravia.cry"
}
} }
}, },
"animation.staravia.blink": { "animation.staravia.blink": {
@@ -464,6 +464,11 @@
"1.5": [0, 0, 0] "1.5": [0, 0, 0]
} }
} }
},
"sound_effects": {
"0.0": {
"effect": "pokemon.combee.cry"
}
} }
} }
} }
@@ -824,6 +824,14 @@
} }
} }
} }
},
"animation.vespiquen.cry": {
"animation_length": 1.25,
"sound_effects": {
"0.0": {
"effect": "pokemon.vespiquen.cry"
}
}
} }
} }
} }
@@ -589,7 +589,7 @@
"animation.frogadier.battle_idle": { "animation.frogadier.battle_idle": {
"loop": true, "loop": true,
"bones": { "bones": {
"frogadier": { "body": {
"position": [0, -8, 0] "position": [0, -8, 0]
}, },
"torso": { "torso": {
@@ -400,6 +400,30 @@
"position": [0, 0, -0.1] "position": [0, 0, -0.1]
} }
} }
},
"animation.helioptile.cry": {
"animation_length": 1.2083,
"bones": {
"mouth_closed": {
"position": {
"0.0": [0, 0, 0],
"0.0833": {"pre": [0, 0, 0], "post": [0, 0, 0.1]},
"1.1667": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
}
},
"mouth_open": {
"position": {
"0.0": [0, 0, 0],
"0.0833": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
"1.1667": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
}
}
},
"sound_effects": {
"0.0833": {
"effect": "pokemon.helioptile.cry"
}
}
} }
} }
} }
@@ -563,6 +563,14 @@
"position": [0.1, 0, 0] "position": [0.1, 0, 0]
} }
} }
},
"animation.heliolisk.cry": {
"animation_length": 1.25,
"sound_effects": {
"0.0": {
"effect": "pokemon.heliolisk.cry"
}
}
} }
} }
} }
@@ -125,6 +125,11 @@
"0.5417": {"pre": [0, 0, -0.1], "post": [0, 0, 0]} "0.5417": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
} }
} }
},
"sound_effects": {
"0.0417": {
"effect": "pokemon.grubbin.cry"
}
} }
}, },
"animation.grubbin.physical": { "animation.grubbin.physical": {
@@ -38,6 +38,11 @@
"0.625": {"pre": [0, 0, 0.1], "post": [0, 0, 0]} "0.625": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
} }
} }
},
"sound_effects": {
"0.0833": {
"effect": "pokemon.charjabug.cry"
}
} }
}, },
"animation.charjabug.ditto_face": { "animation.charjabug.ditto_face": {
@@ -326,6 +326,14 @@
"position": [0, 0, -0.1] "position": [0, 0, -0.1]
} }
} }
},
"animation.runerigus.cry": {
"animation_length": 1.25,
"sound_effects": {
"0.0": {
"effect": "pokemon.runerigus.cry"
}
}
} }
} }
} }
@@ -68,7 +68,7 @@
"parent": "torso", "parent": "torso",
"pivot": [0, 13, 2], "pivot": [0, 13, 2],
"locators": { "locators": {
"seat": [0, 13, 2] "seat_1": [0, 13, 2]
} }
}, },
{ {
@@ -7,7 +7,7 @@
"animations": { "animations": {
"cry": "q.bedrock_stateful('pidgeot', 'cry')", "cry": "q.bedrock_stateful('pidgeot', 'cry')",
"recoil": "q.bedrock_stateful('pidgeot', 'recoil')", "recoil": "q.bedrock_stateful('pidgeot', 'recoil')",
"special": "q.bedrock_primary('pidgeot', 'special', q.curve('symmetrical'))" "status": "q.bedrock_primary('pidgeot', 'status', q.curve('symmetrical_wide'))"
}, },
"firstPersonCameraOffset": { "firstPersonCameraOffset": {
"seat_1": [0, 0.45, 0] "seat_1": [0, 0.45, 0]
@@ -64,7 +64,7 @@
"q.sine_wing_flap(0.9, 0.9, 25, 'z', 'wing_open_left', 'wing_open_right')", "q.sine_wing_flap(0.9, 0.9, 25, 'z', 'wing_open_left', 'wing_open_right')",
"q.look('neck', 1, 1, 70, -10, 20, -20)", "q.look('neck', 1, 1, 70, -10, 20, -20)",
"q.look('head')", "q.look('head')",
"q.bedrock('spearow', 'air_idle')" "q.bedrock('spearow', 'ground_idle')"
], ],
"quirks": ["q.bedrock_quirk('spearow', 'blink')"], "quirks": ["q.bedrock_quirk('spearow', 'blink')"],
"transformedParts": [ "transformedParts": [
@@ -93,7 +93,7 @@
"q.sine_wing_flap(0.9, 0.9, 25, 'z', 'wing_open_left', 'wing_open_right')", "q.sine_wing_flap(0.9, 0.9, 25, 'z', 'wing_open_left', 'wing_open_right')",
"q.look('neck', 1, 1, 70, -10, 20, -20)", "q.look('neck', 1, 1, 70, -10, 20, -20)",
"q.look('head')", "q.look('head')",
"q.bedrock('spearow', 'air_idle')" "q.bedrock('spearow', 'ground_idle')"
], ],
"quirks": ["q.bedrock_quirk('spearow', 'blink')"], "quirks": ["q.bedrock_quirk('spearow', 'blink')"],
"transformedParts": [ "transformedParts": [
@@ -16,9 +16,6 @@
"q.look('head_ai', 1, 1, 8, -18, 10, -10)", "q.look('head_ai', 1, 1, 8, -18, 10, -10)",
"q.bedrock('oddish', 'battle_idle')" "q.bedrock('oddish', 'battle_idle')"
], ],
"namedAnimations": {
"cry": "q.bedrock_stateful('oddish', 'battle_cry')"
},
"quirks": ["q.bedrock_quirk('oddish', 'blink')"] "quirks": ["q.bedrock_quirk('oddish', 'blink')"]
}, },
"standing": { "standing": {
@@ -16,9 +16,6 @@
"q.look('head_ai', 1, 1, 6, -18, 10, -10)", "q.look('head_ai', 1, 1, 6, -18, 10, -10)",
"q.bedrock('gloom', 'battle_idle')" "q.bedrock('gloom', 'battle_idle')"
], ],
"namedAnimations": {
"cry": "q.bedrock_stateful('gloom', 'battle_cry')"
},
"quirks": ["q.bedrock_quirk('gloom', 'blink')"] "quirks": ["q.bedrock_quirk('gloom', 'blink')"]
}, },
"standing": { "standing": {
@@ -16,9 +16,6 @@
"q.look('head_ai', 1, 1, 6, -18, 10, -10)", "q.look('head_ai', 1, 1, 6, -18, 10, -10)",
"q.bedrock('vileplume', 'battle_idle')" "q.bedrock('vileplume', 'battle_idle')"
], ],
"namedAnimations": {
"cry": "q.bedrock_stateful('vileplume', 'battle_cry')"
},
"quirks": [ "quirks": [
"q.bedrock_quirk('vileplume', 'blink')", "q.bedrock_quirk('vileplume', 'blink')",
"q.bedrock_primary_quirk('vileplume', 'quirk', 20, 40, 1, q.curve('symmetrical_wide'))" "q.bedrock_primary_quirk('vileplume', 'quirk', 20, 40, 1, q.curve('symmetrical_wide'))"
@@ -7,7 +7,6 @@
"animations": { "animations": {
"faint": "q.bedrock_primary('diglett', 'faint', q.curve('one'))", "faint": "q.bedrock_primary('diglett', 'faint', q.curve('one'))",
"cry": "q.bedrock_stateful('diglett', 'cry')", "cry": "q.bedrock_stateful('diglett', 'cry')",
"recoil": "q.bedrock_stateful('diglett', 'recoil')",
"physical": "q.bedrock_primary('diglett', 'physical', q.curve('symmetrical'))" "physical": "q.bedrock_primary('diglett', 'physical', q.curve('symmetrical'))"
}, },
"poses": { "poses": {
@@ -5,9 +5,9 @@
"profileTranslation": [0.0, 0.3, 0], "profileTranslation": [0.0, 0.3, 0],
"rootBone": "diglett_alolan", "rootBone": "diglett_alolan",
"animations": { "animations": {
"faint": "q.bedrock_primary('diglett_alolan', 'faint', q.curve('one'))",
"cry": "q.bedrock_stateful('diglett_alolan', 'cry')", "cry": "q.bedrock_stateful('diglett_alolan', 'cry')",
"recoil": "q.bedrock_stateful('diglett_alolan', 'recoil')", "physical": "q.bedrock_primary('diglett_alolan', 'physical', q.curve('symmetrical_wide'))"
"physical": "q.bedrock_primary('diglett_alolan', 'physical', q.curve('symmetrical'))"
}, },
"poses": { "poses": {
"standing": { "standing": {
@@ -7,7 +7,6 @@
"animations": { "animations": {
"faint": "q.bedrock_primary('dugtrio', 'faint', q.curve('one'))", "faint": "q.bedrock_primary('dugtrio', 'faint', q.curve('one'))",
"cry": "q.bedrock_stateful('dugtrio', 'cry')", "cry": "q.bedrock_stateful('dugtrio', 'cry')",
"recoil": "q.bedrock_stateful('dugtrio', 'recoil')",
"physical": "q.bedrock_primary('dugtrio', 'physical', q.curve('symmetrical'))" "physical": "q.bedrock_primary('dugtrio', 'physical', q.curve('symmetrical'))"
}, },
"poses": { "poses": {
@@ -5,9 +5,9 @@
"profileTranslation": [0.0, 0.29, 0], "profileTranslation": [0.0, 0.29, 0],
"rootBone": "dugtrio_alolan", "rootBone": "dugtrio_alolan",
"animations": { "animations": {
"faint": "q.bedrock_primary('dugtrio_alolan', 'faint', q.curve('one'))",
"cry": "q.bedrock_stateful('dugtrio_alolan', 'cry')", "cry": "q.bedrock_stateful('dugtrio_alolan', 'cry')",
"recoil": "q.bedrock_stateful('dugtrio_alolan', 'recoil')", "physical": "q.bedrock_primary('dugtrio_alolan', 'physical', q.curve('symmetrical_wide'))"
"physical": "q.bedrock_primary('dugtrio_alolan', 'physical', q.curve('symmetrical'))"
}, },
"poses": { "poses": {
"standing": { "standing": {
@@ -83,7 +83,7 @@
"namedAnimations": { "namedAnimations": {
"cry": "q.bedrock_stateful('dummy', 'cry')" "cry": "q.bedrock_stateful('dummy', 'cry')"
}, },
"animations": ["q.bedrock('tentacool', 'ground_sleep')"] "animations": ["q.bedrock('tentacool', 'sleep')"]
} }
} }
} }
@@ -108,7 +108,7 @@
"namedAnimations": { "namedAnimations": {
"cry": "q.bedrock_stateful('dummy', 'cry')" "cry": "q.bedrock_stateful('dummy', 'cry')"
}, },
"animations": ["q.bedrock('tentacruel', 'sleep')"] "animations": ["q.bedrock('tentacruel', 'water_sleep')"]
}, },
"ground-sleep": { "ground-sleep": {
"poseTypes": ["SLEEP"], "poseTypes": ["SLEEP"],
@@ -116,7 +116,7 @@
"namedAnimations": { "namedAnimations": {
"cry": "q.bedrock_stateful('dummy', 'cry')" "cry": "q.bedrock_stateful('dummy', 'cry')"
}, },
"animations": ["q.bedrock('tentacruel', 'sleep')"] "animations": ["q.bedrock('tentacruel', 'ground_sleep')"]
} }
} }
} }
@@ -6,8 +6,7 @@
"rootBone": "golem", "rootBone": "golem",
"animations": { "animations": {
"cry": "q.bedrock_stateful('golem', 'cry')", "cry": "q.bedrock_stateful('golem', 'cry')",
"recoil": "q.bedrock_stateful('golem', 'recoil')", "recoil": "q.bedrock_stateful('golem', 'recoil')"
"status": "q.bedrock_stateful('golem', 'status', q.curve('symmetrical_wide'))"
}, },
"poses": { "poses": {
"battle-standing": { "battle-standing": {
@@ -6,8 +6,7 @@
"rootBone": "golem", "rootBone": "golem",
"animations": { "animations": {
"cry": "q.bedrock_stateful('golem_alolan', 'cry')", "cry": "q.bedrock_stateful('golem_alolan', 'cry')",
"recoil": "q.bedrock_stateful('golem_alolan', 'recoil')", "recoil": "q.bedrock_stateful('golem_alolan', 'recoil')"
"status": "q.bedrock_stateful('golem_alolan', 'status', q.curve('symmetrical_wide'))"
}, },
"poses": { "poses": {
"battle-standing": { "battle-standing": {
@@ -6,8 +6,7 @@
"rootBone": "grimer", "rootBone": "grimer",
"animations": { "animations": {
"cry": "q.bedrock_stateful('grimer', 'cry')", "cry": "q.bedrock_stateful('grimer', 'cry')",
"recoil": "q.bedrock_stateful('grimer', 'recoil')", "recoil": "q.bedrock_stateful('grimer', 'recoil')"
"status": "q.bedrock_stateful('grimer', 'status', q.curve('symmetrical_wide'))"
}, },
"poses": { "poses": {
"battle-standing": { "battle-standing": {
@@ -6,8 +6,7 @@
"rootBone": "grimer_alola", "rootBone": "grimer_alola",
"animations": { "animations": {
"cry": "q.bedrock_stateful('grimer', 'cry')", "cry": "q.bedrock_stateful('grimer', 'cry')",
"recoil": "q.bedrock_stateful('grimer', 'recoil')", "recoil": "q.bedrock_stateful('grimer', 'recoil')"
"status": "q.bedrock_stateful('grimer', 'status', q.curve('symmetrical_wide'))"
}, },
"poses": { "poses": {
"battle-standing": { "battle-standing": {
@@ -1,6 +1,6 @@
{ {
"portraitScale": 1.82, "portraitScale": 1.82,
"portraitTranslation": [-0.01, 0.64, 0], "portraitTranslation": [0.15, 0.52, 0],
"profileScale": 0.84, "profileScale": 0.84,
"profileTranslation": [0, 0.51, 0], "profileTranslation": [0, 0.51, 0],
"rootBone": "marowak_alolan", "rootBone": "marowak_alolan",
@@ -36,7 +36,7 @@
}, },
"portrait": { "portrait": {
"poseTypes": ["PORTRAIT"], "poseTypes": ["PORTRAIT"],
"animations": ["q.bedrock('marowak_alolan', 'portrait')"] "animations": ["q.bedrock('marowak_alolan', 'ground_idle')"]
} }
} }
} }
@@ -5,7 +5,6 @@
"profileTranslation": [0, 0.46, 0], "profileTranslation": [0, 0.46, 0],
"rootBone": "weezing", "rootBone": "weezing",
"animations": { "animations": {
"faint": "q.bedrock_primary('weezing', 'faint')",
"cry": "q.bedrock_stateful('weezing', 'cry')", "cry": "q.bedrock_stateful('weezing', 'cry')",
"recoil": "q.bedrock_stateful('weezing', 'recoil')", "recoil": "q.bedrock_stateful('weezing', 'recoil')",
"physical": "q.bedrock_primary('weezing', 'physical', q.curve('symmetrical_wide'))", "physical": "q.bedrock_primary('weezing', 'physical', q.curve('symmetrical_wide'))",
@@ -57,7 +56,7 @@
"namedAnimations": { "namedAnimations": {
"cry": "q.bedrock_stateful('dummy', 'cry')" "cry": "q.bedrock_stateful('dummy', 'cry')"
}, },
"animations": ["q.bedrock('weezing', 'battle-sleep')"] "animations": ["q.bedrock('weezing', 'battle_sleep')"]
}, },
"sleep": { "sleep": {
"poseTypes": ["SLEEP"], "poseTypes": ["SLEEP"],
@@ -39,10 +39,6 @@
"q.bedrock_quirk('weezing_galar', 'blink')", "q.bedrock_quirk('weezing_galar', 'blink')",
"q.bedrock_quirk('weezing_galar', 'blink2')" "q.bedrock_quirk('weezing_galar', 'blink2')"
] ]
},
"sleeping": {
"poseTypes": ["SLEEP"],
"animations": ["q.bedrock('weezing_galar', 'sleep')"]
} }
} }
} }
@@ -33,10 +33,7 @@
"quirks": [ "quirks": [
"q.bedrock_quirk('rhydon', 'blink')", "q.bedrock_quirk('rhydon', 'blink')",
"q.bedrock_quirk('rhydon', 'battle_quirk')" "q.bedrock_quirk('rhydon', 'battle_quirk')"
], ]
"namedAnimations": {
"cry": "q.bedrock_primary('rhydon', 'battle_cry', q.curve('symmetrical_wide'))"
}
}, },
"jump": { "jump": {
"poseTypes": ["STAND", "WALK"], "poseTypes": ["STAND", "WALK"],
@@ -94,13 +94,6 @@
"q.bedrock('mr_mime', 'ground_run')" "q.bedrock('mr_mime', 'ground_run')"
], ],
"quirks": ["q.bedrock_quirk('mr_mime', 'blink')"] "quirks": ["q.bedrock_quirk('mr_mime', 'blink')"]
},
"sleep": {
"poseTypes": ["SLEEP"],
"namedAnimations": {
"cry": "q.bedrock_stateful('dummy', 'cry')"
},
"animations": ["q.bedrock('mr_mime', 'sleep')"]
} }
} }
} }
@@ -75,13 +75,6 @@
} }
], ],
"quirks": ["q.bedrock_quirk('tauros', 'blink')"] "quirks": ["q.bedrock_quirk('tauros', 'blink')"]
},
"sleep": {
"poseTypes": ["SLEEP"],
"namedAnimations": {
"cry": "q.bedrock_stateful('dummy', 'cry')"
},
"animations": ["q.bedrock('tauros', 'sleep')"]
} }
} }
} }
@@ -120,13 +120,6 @@
} }
], ],
"quirks": ["q.bedrock_quirk('tauros_paldean_aqua', 'blink')"] "quirks": ["q.bedrock_quirk('tauros_paldean_aqua', 'blink')"]
},
"sleep": {
"poseTypes": ["SLEEP"],
"namedAnimations": {
"cry": "q.bedrock_stateful('dummy', 'cry')"
},
"animations": ["q.bedrock('tauros_paldean_aqua', 'sleep')"]
} }
} }
} }
@@ -74,13 +74,6 @@
} }
], ],
"quirks": ["q.bedrock_quirk('tauros_paldean_blaze', 'blink')"] "quirks": ["q.bedrock_quirk('tauros_paldean_blaze', 'blink')"]
},
"sleep": {
"poseTypes": ["SLEEP"],
"namedAnimations": {
"cry": "q.bedrock_stateful('dummy', 'cry')"
},
"animations": ["q.bedrock('tauros_paldean_blaze', 'sleep')"]
} }
} }
} }
@@ -5,7 +5,6 @@
"profileTranslation": [0, -0.02, 0], "profileTranslation": [0, -0.02, 0],
"rootBone": "omanyte", "rootBone": "omanyte",
"animations": { "animations": {
"faint": "q.bedrock_primary('omanyte', 'faint', q.curve('one'))",
"cry": "q.bedrock_stateful('omanyte', 'cry')" "cry": "q.bedrock_stateful('omanyte', 'cry')"
}, },
"poses": { "poses": {
@@ -5,7 +5,6 @@
"profileTranslation": [0, 0.066, 0], "profileTranslation": [0, 0.066, 0],
"rootBone": "omastar", "rootBone": "omastar",
"animations": { "animations": {
"faint": "q.bedrock_primary('omastar', 'faint', q.curve('one'))",
"cry": "q.bedrock_stateful('omastar', 'cry')" "cry": "q.bedrock_stateful('omastar', 'cry')"
}, },
"poses": { "poses": {
@@ -169,7 +169,7 @@
"q.look('neck', 1, 1, 25, -20, 20, -20)", "q.look('neck', 1, 1, 25, -20, 20, -20)",
"q.look('head', 1, 1, 22.5, -10, 15, -15)", "q.look('head', 1, 1, 22.5, -10, 15, -15)",
"q.bedrock('aerodactyl', 'air_glide')", "q.bedrock('aerodactyl', 'air_glide')",
"q.bedrock('aerodactyl', 'air_dive')", "q.bedrock('aerodactyl', 'ride_dive')",
{ {
"condition": "q.is_ridden", "condition": "q.is_ridden",
"animation": "q.bedrock('aerodactyl', 'ride_air_glide')" "animation": "q.bedrock('aerodactyl', 'ride_air_glide')"
@@ -5,8 +5,7 @@
"profileTranslation": [0, 0.84, -10], "profileTranslation": [0, 0.84, -10],
"rootBone": "feraligatr", "rootBone": "feraligatr",
"animations": { "animations": {
"cry": "q.bedrock_stateful('feraligatr', 'cry')", "cry": "q.bedrock_stateful('feraligatr', 'cry')"
"recoil": "q.bedrock_stateful('feraligatr', 'recoil')"
}, },
"poses": { "poses": {
"standing": { "standing": {
@@ -16,9 +16,6 @@
"q.look('head_ai')", "q.look('head_ai')",
"q.bedrock('bellossom', 'battle_idle')" "q.bedrock('bellossom', 'battle_idle')"
], ],
"namedAnimations": {
"cry": "q.bedrock_stateful('bellossom', 'battle_cry')"
},
"quirks": [ "quirks": [
"q.bedrock_quirk('bellossom', 'blink')" "q.bedrock_quirk('bellossom', 'blink')"
] ]
@@ -4,6 +4,9 @@
"profileScale": 0.98, "profileScale": 0.98,
"profileTranslation": [0.00, 0.24, 0], "profileTranslation": [0.00, 0.24, 0],
"rootBone": "wurmple", "rootBone": "wurmple",
"animations": {
"cry": "q.bedrock_stateful('wurmple', 'cry')"
},
"poses": { "poses": {
"battle-standing": { "battle-standing": {
"poseTypes": ["STAND"], "poseTypes": ["STAND"],
@@ -4,6 +4,9 @@
"profileScale": 0.80, "profileScale": 0.80,
"profileTranslation": [0.00, 0.48, 0], "profileTranslation": [0.00, 0.48, 0],
"rootBone": "silcoon", "rootBone": "silcoon",
"animations": {
"cry": "q.bedrock_stateful('silcoon', 'cry')"
},
"poses": { "poses": {
"battle-standing": { "battle-standing": {
"poseTypes": ["STAND"], "poseTypes": ["STAND"],
@@ -4,6 +4,9 @@
"profileScale": 0.60, "profileScale": 0.60,
"profileTranslation": [0, 0.90, 0], "profileTranslation": [0, 0.90, 0],
"rootBone": "beautifly", "rootBone": "beautifly",
"animations": {
"cry": "q.bedrock_stateful('beautifly', 'cry')"
},
"poses": { "poses": {
"battle-standing": { "battle-standing": {
"poseTypes": ["STAND"], "poseTypes": ["STAND"],
@@ -4,6 +4,9 @@
"profileScale": 0.74, "profileScale": 0.74,
"profileTranslation": [0.00, 0.57, 0], "profileTranslation": [0.00, 0.57, 0],
"rootBone": "cascoon", "rootBone": "cascoon",
"animations": {
"cry": "q.bedrock_stateful('cascoon', 'cry')"
},
"poses": { "poses": {
"battle-standing": { "battle-standing": {
"poseTypes": ["STAND"], "poseTypes": ["STAND"],
@@ -4,6 +4,9 @@
"profileScale": 0.63, "profileScale": 0.63,
"profileTranslation": [0, 0.64, 0], "profileTranslation": [0, 0.64, 0],
"rootBone": "dustox", "rootBone": "dustox",
"animations": {
"cry": "q.bedrock_stateful('dustox', 'cry')"
},
"poses": { "poses": {
"battle-standing": { "battle-standing": {
"poseTypes": ["STAND"], "poseTypes": ["STAND"],
@@ -5,7 +5,6 @@
"profileTranslation": [0, -1.3, 0], "profileTranslation": [0, -1.3, 0],
"rootBone": "luvdisc", "rootBone": "luvdisc",
"animations": { "animations": {
"cry": "q.bedrock_stateful('luvdisc', 'cry')",
"faint": "q.bedrock_primary('luvdisc', 'ground_faint', q.curve('one'))" "faint": "q.bedrock_primary('luvdisc', 'ground_faint', q.curve('one'))"
}, },
"poses": { "poses": {
@@ -44,12 +43,12 @@
"ground-sleep": { "ground-sleep": {
"poseTypes": ["SLEEP"], "poseTypes": ["SLEEP"],
"isTouchingWater": false, "isTouchingWater": false,
"animations": ["q.bedrock('luvdisc', 'ground-sleep')"] "animations": ["q.bedrock('luvdisc', 'ground_sleep')"]
}, },
"water-sleep": { "water-sleep": {
"poseTypes": ["SLEEP"], "poseTypes": ["SLEEP"],
"isTouchingWater": true, "isTouchingWater": true,
"animations": ["q.bedrock('luvdisc', 'water-sleep')"] "animations": ["q.bedrock('luvdisc', 'water_sleep')"]
} }
} }
} }
@@ -17,10 +17,6 @@
"poseTypes": ["WALK"], "poseTypes": ["WALK"],
"animations": ["q.look('head_ai')", "q.bedrock('servine', 'ground_idle')"], "animations": ["q.look('head_ai')", "q.bedrock('servine', 'ground_idle')"],
"quirks": ["q.bedrock_quirk('servine', 'blink')"] "quirks": ["q.bedrock_quirk('servine', 'blink')"]
},
"sleep": {
"poseTypes": ["SLEEP"],
"animations": ["q.bedrock('servine', 'sleep')"]
} }
} }
} }
@@ -5,7 +5,6 @@
"profileTranslation": [0, 0.82, 0], "profileTranslation": [0, 0.82, 0],
"rootBone": "pignite", "rootBone": "pignite",
"animations": { "animations": {
"faint": "q.bedrock_primary('pignite', 'faint', q.curve('one'))",
"cry": "q.bedrock_stateful('pignite', 'cry')", "cry": "q.bedrock_stateful('pignite', 'cry')",
"recoil": "q.bedrock_stateful('pignite', 'recoil')" "recoil": "q.bedrock_stateful('pignite', 'recoil')"
}, },
@@ -5,7 +5,6 @@
"profileTranslation": [0, 0.96, 0], "profileTranslation": [0, 0.96, 0],
"rootBone": "emboar", "rootBone": "emboar",
"animations": { "animations": {
"faint": "q.bedrock_primary('emboar', 'faint', q.curve('one'))",
"cry": "q.bedrock_stateful('emboar', 'cry')", "cry": "q.bedrock_stateful('emboar', 'cry')",
"recoil": "q.bedrock_stateful('pignite', 'recoil')" "recoil": "q.bedrock_stateful('pignite', 'recoil')"
}, },
@@ -39,10 +39,7 @@
], ],
"quirks": [ "quirks": [
"q.bedrock_quirk('archeops', 'blink')" "q.bedrock_quirk('archeops', 'blink')"
], ]
"namedAnimations": {
"cry": "q.bedrock_primary('archeops', 'battle_cry', q.curve('symmetrical_wide'))"
}
}, },
"battle-flying": { "battle-flying": {
"poseTypes": ["HOVER"], "poseTypes": ["HOVER"],
@@ -214,7 +211,6 @@
"q.bedrock('archeops', 'sleep')" "q.bedrock('archeops', 'sleep')"
], ],
"quirks": [ "quirks": [
"q.bedrock_quirk('archeops', 'sleep_quirk')"
] ]
} }
} }
@@ -11,13 +11,13 @@
"standing": { "standing": {
"poseName": "standing", "poseName": "standing",
"poseTypes": ["STAND", "NONE", "PORTRAIT", "PROFILE", "FLOAT"], "poseTypes": ["STAND", "NONE", "PORTRAIT", "PROFILE", "FLOAT"],
"animations": ["q.look('head')", "q.bedrock('fennekin', 'ground_idle')"], "animations": ["q.look('head_ai')", "q.bedrock('fennekin', 'ground_idle')"],
"quirks": ["q.bedrock_quirk('fennekin', 'blink')"] "quirks": ["q.bedrock_quirk('fennekin', 'blink')"]
}, },
"walking": { "walking": {
"poseName": "walking", "poseName": "walking",
"poseTypes": ["WALK", "SWIM"], "poseTypes": ["WALK", "SWIM"],
"animations": ["q.look('head')", "q.bedrock('fennekin', 'ground_walk')"], "animations": ["q.look('head_ai')", "q.bedrock('fennekin', 'ground_walk')"],
"quirks": ["q.bedrock_quirk('fennekin', 'blink')"] "quirks": ["q.bedrock_quirk('fennekin', 'blink')"]
} }
} }
@@ -12,21 +12,21 @@
"poseName": "battle-standing", "poseName": "battle-standing",
"poseTypes": ["STAND"], "poseTypes": ["STAND"],
"isBattle": true, "isBattle": true,
"animations": ["q.look('head')", "q.bedrock('braixen', 'battle_idle')"], "animations": ["q.look('head_ai')", "q.bedrock('braixen', 'battle_idle')"],
"quirks": ["q.bedrock_quirk('braixen', 'blink')"] "quirks": ["q.bedrock_quirk('braixen', 'blink')"]
}, },
"standing": { "standing": {
"poseName": "standing", "poseName": "standing",
"poseTypes": ["STAND", "NONE", "PORTRAIT", "PROFILE", "FLOAT"], "poseTypes": ["STAND", "NONE", "PORTRAIT", "PROFILE", "FLOAT"],
"isBattle": false, "isBattle": false,
"animations": ["q.look('head')", "q.bedrock('braixen', 'ground_idle')"], "animations": ["q.look('head_ai')", "q.bedrock('braixen', 'ground_idle')"],
"quirks": ["q.bedrock_quirk('braixen', 'blink')"] "quirks": ["q.bedrock_quirk('braixen', 'blink')"]
}, },
"walking": { "walking": {
"poseName": "walking", "poseName": "walking",
"poseTypes": ["WALK", "SWIM"], "poseTypes": ["WALK", "SWIM"],
"animations": [ "animations": [
"q.look('head')", "q.look('head_ai')",
"q.bedrock('braixen', 'ground_walk')" "q.bedrock('braixen', 'ground_walk')"
], ],
"quirks": ["q.bedrock_quirk('braixen', 'blink')"], "quirks": ["q.bedrock_quirk('braixen', 'blink')"],
@@ -4,7 +4,9 @@
"profileScale": 0.5, "profileScale": 0.5,
"profileTranslation": [-0.05,1,0], "profileTranslation": [-0.05,1,0],
"rootBone": "helioptile", "rootBone": "helioptile",
"animations": { }, "animations": {
"cry": "q.bedrock_stateful('helioptile', 'cry')"
},
"poses": { "poses": {
"standing": { "standing": {
"poseTypes": [ "poseTypes": [
@@ -4,7 +4,9 @@
"profileScale": 0.5, "profileScale": 0.5,
"profileTranslation": [0,1,0], "profileTranslation": [0,1,0],
"rootBone": "heliolisk", "rootBone": "heliolisk",
"animations": {}, "animations": {
"cry": "q.bedrock_stateful('heliolisk', 'cry')"
},
"poses": { "poses": {
"standing": { "standing": {
"poseTypes": [ "poseTypes": [
@@ -5,9 +5,7 @@
"profileTranslation": [0.0, 0.25, 0.0], "profileTranslation": [0.0, 0.25, 0.0],
"rootBone": "pumpkaboo", "rootBone": "pumpkaboo",
"animations": { "animations": {
"faint": "q.bedrock_primary('pumpkaboo', 'faint', q.curve('one'))", "cry": "q.bedrock_stateful('pumpkaboo', 'cry')"
"cry": "q.bedrock_stateful('pumpkaboo', 'cry')",
"recoil": "q.bedrock_stateful('pumpkaboo', 'recoil')"
}, },
"poses": { "poses": {
"battle-standing": { "battle-standing": {
@@ -5,9 +5,7 @@
"profileTranslation": [0.0, 0.15, 0.0], "profileTranslation": [0.0, 0.15, 0.0],
"rootBone": "pumpkaboo", "rootBone": "pumpkaboo",
"animations": { "animations": {
"faint": "q.bedrock_primary('pumpkaboo', 'faint', q.curve('one'))", "cry": "q.bedrock_stateful('pumpkaboo', 'cry')"
"cry": "q.bedrock_stateful('pumpkaboo', 'cry')",
"recoil": "q.bedrock_stateful('pumpkaboo', 'recoil')"
}, },
"poses": { "poses": {
"battle-standing": { "battle-standing": {

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