Compare commits

..
Author SHA1 Message Date
JazzMcNade 9ff62821cd Add the ability for piglins to fear pokemon tagged with avoidedByPiglin 2025-07-18 23:44:46 -05:00
JazzMcNade 1fb300cd86 Code cleanup of old mixin 2025-07-18 00:01:13 -05:00
JazzMcNade dae01c545d Piglins are now infatuated by Gholdengo 2025-07-17 23:49:29 -05:00
Polymeta 02c4947513 fixed some typos in pokemon interactions
Signed-off-by: Polymeta <40173118+Polymeta@users.noreply.github.com>
2025-07-17 23:10:07 +01:00
Test 3048e3d81d fix data for variations and species features 2025-07-15 02:14:53 -04:00
Polymeta 77fb94d9ef Merge branch 'fix-x-axis-offsets' into 'main'
Fix X-axis being a different direction than Blockbench and addded new property attachment_options

See merge request cable-mc/cobblemon!1730
2025-07-13 23:25:25 +00:00
JordanandPolymeta 9078ee2191 Fix X-axis being a different direction than Blockbench and addded new property attachment_options 2025-07-13 23:25:24 +00:00
Polymeta 06edc2810e Merge branch 'cooking-fixes-gert' into 'main'
Plefora of Cooking related fixes/implementations

See merge request cable-mc/cobblemon!1739
2025-07-13 22:56:49 +00:00
GertimoshkaandPolymeta 81b83aabc1 Plefora of Cooking related fixes/implementations 2025-07-13 22:56:49 +00:00
Polymeta 6e7895c3b3 Merge branch 'PhantomsFearTheFurySwipes' into 'main'
Implement avoidedByPhantom behavior

See merge request cable-mc/cobblemon!1737
2025-07-12 20:26:33 +00:00
JazzMcNade c69de804b9 Merge branch 'main' into PhantomsFearTheFurySwipes 2025-07-12 11:15:39 -05:00
JazzMcNade fbbed7b20a More license 2025-07-12 11:15:27 -05:00
Polymeta a1b5f0a567 Merge branch 'i-cant-take-it-anymore' into 'main'
Block Texture Clean Up

See merge request cable-mc/cobblemon!1738
2025-07-12 12:07:01 +00:00
Polymeta e42e06781d Merge branch 'flora-heals-an-aching-soul' into 'main'
Design Meeting Changes - Recipe/Loot Table Tweaks

See merge request cable-mc/cobblemon!1740
2025-07-12 12:03:35 +00:00
dhi_holo 0a48014931 Design Meeting Changes
- Healing Machine recipe rebalanced
- Vivichoke Crops now drop one seed at full grown stage as well as the crop
- Vivichoke now can only be crafted into one seed, rather than two, to compensate for the above
2025-07-12 11:23:21 +10:00
Polymeta a70fed25c5 Merge branch 'feature/type-madness' into 'main'
make elementaltypes showdown identifiable for consistency

See merge request cable-mc/cobblemon!1688
2025-07-11 21:01:59 +00:00
Polymeta c2daed803f make elementaltypes showdown identifiable for consistency 2025-07-11 21:01:58 +00:00
dhi_holo 658fed638d Update saccharine_log_slathered.json
Should remove errors from that blockstate too
2025-07-11 19:39:10 +10:00
dhi_holo 3faa2a0467 Saccharine and Candles
Fixed all Saccharine wood recipes missing advancements, and the log spamming Candle Poké Cake Blockstate being missin
2025-07-11 19:05:32 +10:00
dhi_holo 77788a91b7 Merge branch 'main' into i-cant-take-it-anymore 2025-07-11 19:01:21 +10:00
dhi_holo 745b48e77b Update CHANGELOG.md
Changelog.
2025-07-09 15:06:40 +10:00
dhi_holo 9a4815f453 Block Texture Clean Up
Re-organised all the Block textures to match how the Item textures are sorted

Also did a very minor clean up of the item texture folder to just keep it clean.
2025-07-09 15:06:09 +10:00
JazzMcNade 2ff41cdf9b Updated Cresselia to scare off phantoms 2025-07-08 23:35:08 -05:00
JazzMcNade d5268e8751 Added TODO for should mount cries 2025-07-08 21:40:46 -05:00
JazzMcNade 518799ee25 Updated Changelog 2025-07-08 21:38:07 -05:00
JazzMcNade b597bb0818 Clean up multiple entity searches. 2025-07-08 21:31:42 -05:00
JazzMcNade 1b39a64927 Added check for shoulder mounted phantom feared pokemon 2025-07-08 21:01:45 -05:00
JazzMcNade dda128e9e3 implemented mixin for avoidedByPhantom behavior flag 2025-07-08 02:42:24 -05:00
2248 changed files with 4382 additions and 20197 deletions
+9 -16
View File
@@ -18,7 +18,6 @@
- Added cosmetics for Gurdurr, Conkeldurr, Squirtle Line, Sneasler, Sandle line, Treecko line, Braixen, Delphox, and Dragonite.
- Added `/transformmodelpart (position|rotation|scale) <modelPart> <transform: x y z>` command that can add transformations to a pokemon's model part.
- The player executing the command must be facing the target pokemon entity. Transformations are not persistent and will revert when resources are reloaded.
- Added `legacy` and `special` sourced moves to Pokémon.
- Added lang keys for all moves and abilities up to Generation 9.
- Added `translucent_cull` boolean option into resolver's layer to allow for translucent textures with culling
- Added [LambDynamicLights](https://modrinth.com/mod/lambdynamiclights) support for items held by Pokémon, evolution stone blocks, evolution stone items, Pokédex, Luminous Moss, Flame Orb, and Magmarizer.
@@ -32,17 +31,16 @@
- Added `/pctake <player> <box> <slot>` command that takes a specific Pokémon from a player's PC. Removes the pokemon if target is self or ran from the server.
- Added Hyper Training items (IV Modification) as well as some additional candy items to do so (Health Candy, Sickly Candy)
- Added Galarica Nut Bushes
- Many Pokémon (mostly cats) are now feared by phantoms
- Added functionality to Everstone when held by a Pokémon; suppresses evolution notification and hides evolve button in summary interface.
- Added new optional property `attachment_options` for most EmitterShapes to be attached to the locator/entities scale, rotation, and/or position. Position is true by default.
### Pokémon Added
#### Gen 2
- Marill
- Azumarill
- Dunsparce
#### Gen 3
- Azurill
- Spoink
- Grumpig
- Snorunt
@@ -229,6 +227,10 @@
- Updated interaction interface to include 4 more option spaces
- Made lecterns that hold a Pokédex emit light.
- Updated light levels for active PC, Pasture, Healing Machine, and Data Monitor.
- Vivichokes now always drop one seed when harvested, and converting a fully grown Vivichoke to seeds via crafting results in 1 seed.
- Healing Machine recipe rebalanced.
- Reorganised the `block` texture folder to be more organised, in line with the `item` texture folder.
- Offset in EmitterShape now ignores scale to be more like Blockbench by default. You can get this behaviour back by adding `"scale": true` in the `attachment_options` property in most EmitterShapes.
### Fixes
- Fixed game crashing when removing national pokedex using datapacks
@@ -258,7 +260,6 @@
- Fixed Pokémon marked as silent still playing shiny sounds and effects.
- Fixed an issue with newer versions of Fabric API where underground Pokémon were spawning in The End.
- Fixed spawning not working well when you're at high points surrounded by lower altitude spawning areas, such as flying.
- Fixed some Pokémon having erroneous tutor moves if another move included a valid tutor move as a substring.
- Fixed certain Pokémon with forms not having appropriate stock Pokédex entries.
- Fixed issue with Pokédex Scanner that caused the open/close overlay to have the wrong opacity values
- Fixed dragon's breath not being usable on the restoration tank when it should be
@@ -294,9 +295,6 @@
- Fixed Pokédex Scanner not respecting the "Invert Mouse" option.
- Fixed a crash due to a ConcurrentModificationException that could occur during world generation.
- Fixed Moon Ball moon phase logic to actually work correctly
- Fixed recoil eyes on Shellder & Cloyster.
- Fixed Shroomish spinning at lightning speed when fainting (no longer allowed to let it rip.)
- Fixed Quaxly's animations showing hidden wing sets
### Developer
- A finished battle now has winners and losers set inside of `PokemonBattle` instead of them always being empty.
@@ -315,11 +313,6 @@
- Updated NPCEntity pokeball throw positioning to properly account for the baseScale property.
- Fixed `[Pokemon].copyFrom` error causing forms, IVs, and EVs to not be applied properly when using `[Pokemon].loadFromJSON` or `[Pokemon].loadFromNBT`
- Added new item class, `WearableItem`. Instances of this class should have a corresponding 3D model. These models render when the items display context is `HEAD`.
- Added new LearnsetQuery types:
- `LEGAL` for moves that are innately compatible and learnable by the Pokémon.
- `LEGACY` for moves that were once officially learnable by the Pokémon but aren't due to GameFreak's re-balancing.
- `SPECIAL` for moves that are not learnable by the Pokémon but may have appeared in a special event or distribution.
- Pokemon now have a fireImmune attribute in their behaviour that can be set to true to ignore all fire damage (lava, magma blocks, etc.)
`JSON
{
@@ -335,6 +328,9 @@
- `PokemonEntity` instances spawned into the world now appropriately finalize the spawn for mod compatibility.
- Added PokedexManager.obtain as a replacement for .catch which is not a friendly function name in Java.
- Added `Pokemon#hyperTrainIV()` and `IVs#setHyperTrainedIV(Stat, Int)`
- `ElementalType` now implelments `ShowdownIdentifiable` to ensure the communcation with showdown stays consistent (also in regards to TeraTypes)
### MoLang & Datapacks
- The following usages for item predicates can now use item conditions like advancements do, you can learn about them in the [Minecraft wiki](https://minecraft.wiki/w/Advancement_definition#minecraft:filled_bucket)
- The `requiredContext` for an item interaction evolution
@@ -352,9 +348,6 @@
- Added `pokemon` as an available Molang function for the `battleActor` functions.
- Fixed `heldItem` property inside spawn files not working and causing crashes
- Fixed `spawn_bedrock_particles` MoLang causing crashes when used in a server environment
- The following move sources are now valid for the `moves` array in species data:
- `legacy:{move}`
- `special:{move}`
- The Pokédex form lang key definition now follows `cobblemon.ui.pokedex.info.form.{species}-{formname}` instead of `cobblemon.ui.pokedex.info.form.{formname}`.
- Added `play_sound_on_server` as an available Molang function for the `worldHolder` & `player` functions.
- Added `run_molang_after` as an available Molang function for the `entity` functions when schedulable.
@@ -1,39 +0,0 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.mixin;
import net.minecraft.world.entity.monster.Phantom;
import org.spongepowered.asm.mixin.Mixin;
@Mixin(targets = "net/minecraft/world/entity/monster/Phantom$PhantomSweepAttackGoal")
public class EntityPhantomMixin {
// TODO: Figure out how to access the outer class that wraps SwoopMovementGoal
// Need to find the cat mons that are near the phantom
// @Inject(method = "shouldContinue", at = @At(value = "RETURN"), cancellable = true)
// public void cobblemon$shouldContinue(CallbackInfoReturnable<Boolean> ci) {
//// var goalSelectorField = PhantomEntity.class.getClasses();// PhantomEntity.class.getFields();// .class.getDeclaredField("goalSelector");
//
//// goalSelectorField.setAccessible(true);
//// GoalSelector goalSelector = (GoalSelector) goalSelectorField.get(mobEntity);
//// final SwoopMovementGoal phantom = (SwoopMovementGoal) (Object) this;
//// if(ci.getReturnValue() == false) {
//// var result = this$0.getWorld().getEntitiesByClass(
//// PokemonEntity.class,
//// this$0.getBoundingBox().expand(16.0),
//// entity -> {
//// return ((PokemonEntity) entity).getBehaviour().getEntityInteract().getAvoidedByPhantom();
//// }
//// ).isEmpty();
////
//// ci.setReturnValue(result);
//// }
// }
}
@@ -0,0 +1,57 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.mixin;
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity;
import com.cobblemon.mod.common.pokemon.ai.EntityBehaviour;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.entity.ai.goal.Goal;
import net.minecraft.world.entity.monster.Phantom;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
@Mixin(targets = "net.minecraft.world.entity.monster.Phantom$PhantomSweepAttackGoal")
public abstract class PhantomSweepAttackGoalMixin extends Goal {
@Unique
private Phantom phantomSelf; // Allows access to the outer class
@Inject(method = "<init>", at = @At("TAIL"))
private void onInit(Phantom phantom, CallbackInfo ci) {
this.phantomSelf = phantom;
}
@Inject(method = "canContinueToUse", at = @At("RETURN"), cancellable = true)
private void modifyCanContinueToUse(CallbackInfoReturnable<Boolean> cir) {
Phantom phantom = this.phantomSelf; // Outer class instance
if(phantom == null) return;
if (cir.getReturnValue()) {
var nearbyFearedEntities = phantom.level().getEntities(phantom, phantom.getBoundingBox().inflate(16.0),
(entity -> ((entity instanceof PokemonEntity && ((PokemonEntity) entity).getBeamMode() == 0 && ((PokemonEntity) entity).getBehaviour().getEntityInteract().getAvoidedByPhantom())
|| (entity instanceof ServerPlayer && EntityBehaviour.Companion.hasPhantomFearedShoulderMount((ServerPlayer)entity)))));
if (!nearbyFearedEntities.isEmpty()) {
nearbyFearedEntities.forEach(entity -> {
if (entity instanceof PokemonEntity) {
((PokemonEntity) entity).cry();
}
//TODO: Find a way to make shoulder mounted Pokemon cry
});
cir.setReturnValue(false);
}
}
}
}
@@ -9,13 +9,21 @@
package com.cobblemon.mod.common.mixin;
import com.cobblemon.mod.common.CobblemonItems;
import net.minecraft.world.entity.monster.piglin.PiglinAi;
import com.cobblemon.mod.common.CobblemonMemories;
import com.cobblemon.mod.common.entity.ai.PiglinDanceTarget;
import com.google.common.collect.ImmutableList;
import net.minecraft.world.entity.ai.Brain;
import net.minecraft.world.entity.monster.piglin.*;
import net.minecraft.world.entity.schedule.Activity;
import net.minecraft.world.item.ItemStack;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import java.util.*;
@Mixin(PiglinAi.class)
public class PiglinBarterMixin {
@@ -29,5 +37,31 @@ public class PiglinBarterMixin {
}
}
@Inject(method = "makeBrain", at = @At("TAIL"), cancellable = true)
private static void cobblemon$makeBrain(Piglin piglin, Brain<Piglin> brain, CallbackInfoReturnable<Brain<?>> cir) {
// Get access to private task map
brain.addActivityAndRemoveMemoryWhenStopped(Activity.INVESTIGATE, 10,
ImmutableList.of(
new PiglinDanceTarget()
), CobblemonMemories.INSTANCE.getNEAREST_LOVED_ENTITY());
}
@Redirect(
method = "updateActivity(Lnet/minecraft/world/entity/monster/piglin/Piglin;)V",
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/world/entity/ai/Brain;setActiveActivityToFirstValid(Ljava/util/List;)V"
)
)
private static void redirectSetActiveActivityToFirstValid(
Brain<Piglin> brain,
List<Activity> originalList
) {
// Add new activity to the front
List<Activity> newList = new ArrayList<>(List.of(Activity.INVESTIGATE));
newList.addAll(originalList);
// Call original method with modified list
brain.setActiveActivityToFirstValid(newList);
}
}
@@ -9,10 +9,19 @@
package com.cobblemon.mod.common.mixin;
import com.cobblemon.mod.common.CobblemonItems;
import com.cobblemon.mod.common.CobblemonMemories;
import com.cobblemon.mod.common.CobblemonSensors;
import com.google.common.collect.ImmutableList;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.ai.memory.MemoryModuleType;
import net.minecraft.world.entity.ai.sensing.Sensor;
import net.minecraft.world.entity.ai.sensing.SensorType;
import net.minecraft.world.entity.monster.piglin.Piglin;
import net.minecraft.world.item.ItemStack;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Mutable;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@@ -28,4 +37,27 @@ public abstract class PiglinEntityMixin {
ci.cancel();
}
}
@Shadow
@Final
@Mutable
private static ImmutableList<SensorType<? extends Sensor<? super Piglin>>> SENSOR_TYPES;
@Shadow
@Final
@Mutable
private static ImmutableList<MemoryModuleType<?>> MEMORY_TYPES;
@Inject(method = "<clinit>", at = @At("TAIL"))
private static void cobblemon$onInit(CallbackInfo ci) {
SENSOR_TYPES = ImmutableList.<SensorType<? extends Sensor<? super Piglin>>>builder()
.addAll(SENSOR_TYPES)
.add(CobblemonSensors.INSTANCE.getNEARBY_PIGLIN_LOVED_POKEMON())
.build();
MEMORY_TYPES = ImmutableList.<MemoryModuleType<?>>builder()
.addAll(MEMORY_TYPES)
.add(CobblemonMemories.INSTANCE.getNEAREST_LOVED_ENTITY())
.build();
}
}
@@ -0,0 +1,42 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.mixin;
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.ai.Brain;
import net.minecraft.world.entity.ai.memory.MemoryModuleType;
import net.minecraft.world.entity.ai.memory.NearestVisibleLivingEntities;
import net.minecraft.world.entity.ai.sensing.PiglinSpecificSensor;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.util.Optional;
@Mixin(PiglinSpecificSensor.class)
public abstract class PiglinSpecificSensorMixin {
@Inject(method = "doTick", at = @At("TAIL"))
protected void cobblemon$doTick(ServerLevel level, LivingEntity entity, CallbackInfo ci) {
Brain<?> brain = entity.getBrain();
if (!brain.hasMemoryValue(MemoryModuleType.NEAREST_VISIBLE_ZOMBIFIED)) {
NearestVisibleLivingEntities nearestVisibleLivingEntities = brain.getMemory(MemoryModuleType.NEAREST_VISIBLE_LIVING_ENTITIES).orElse(NearestVisibleLivingEntities.empty());
Optional<LivingEntity> fearedEntity = Optional.empty();
for (LivingEntity livingEntity : nearestVisibleLivingEntities.findAll((x) -> true)) {
if (fearedEntity.isEmpty() && livingEntity instanceof PokemonEntity && ((PokemonEntity) livingEntity).getPokemon().getSpecies().getBehaviour().getEntityInteract().getAvoidedByPiglin()) {
fearedEntity = Optional.of(livingEntity);
brain.setMemory(MemoryModuleType.NEAREST_VISIBLE_ZOMBIFIED, livingEntity);
}
}
}
}
}
@@ -11,6 +11,7 @@ package com.cobblemon.mod.common.mixin.client;
import com.cobblemon.mod.common.CobblemonRecipeCategories;
import com.cobblemon.mod.common.item.crafting.CookingPotBookCategory;
import com.cobblemon.mod.common.item.crafting.CookingPotRecipe;
import com.cobblemon.mod.common.item.crafting.CookingPotRecipeBase;
import com.cobblemon.mod.common.item.crafting.CookingPotShapelessRecipe;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
@@ -48,10 +49,8 @@ public abstract class ClientRecipeBookMixin {
@Inject(method = "getCategory", at = @At(value = "HEAD"), cancellable = true)
private static void addCustomCategory(RecipeHolder<?> recipe, CallbackInfoReturnable<RecipeBookCategories> cir) {
Recipe<?> recipe2 = recipe.value();
if (recipe2 instanceof CookingPotRecipe || recipe2 instanceof CookingPotShapelessRecipe) {
CookingPotBookCategory category = recipe2 instanceof CookingPotRecipe
? ((CookingPotRecipe) recipe2).getCategory()
: ((CookingPotShapelessRecipe) recipe2).category();
if (recipe2 instanceof CookingPotRecipeBase) {
CookingPotBookCategory category = ((CookingPotRecipeBase) recipe2).getCategory();
RecipeBookCategories var7;
switch (category) {
case MISC -> var7 = CobblemonRecipeCategories.COOKING_POT_MISC.toVanillaCategory();
@@ -11,6 +11,7 @@ package com.cobblemon.mod.common
import com.cobblemon.mod.common.api.ai.CobblemonAttackTargetData
import com.cobblemon.mod.common.api.dialogue.ActiveDialogue
import com.cobblemon.mod.common.api.moves.animations.ActionEffectContext
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
import com.mojang.serialization.Codec
import com.mojang.serialization.codecs.ListCodec
import com.mojang.serialization.codecs.PrimitiveCodec
@@ -48,6 +49,7 @@ object CobblemonMemories {
/** how many are following me rn? */
val HERD_SIZE = register<Int>("herd_size") // Don't bother saving it, we'll try to keep count roughly.
val ATTACK_TARGET_DATA = register<CobblemonAttackTargetData>("attack_target_data") // This is used to store additional information about the attack target, such as when to give up pursuit.
val NEAREST_LOVED_ENTITY = register<PokemonEntity>("nearst_loved_entity")
fun <U> register(id: String, codec: Codec<U>): MemoryModuleType<U> {
val memoryModule = MemoryModuleType(Optional.of(codec))
@@ -12,6 +12,7 @@ import com.cobblemon.mod.common.entity.pokemon.ai.sensors.DefendOwnerSensor
import com.cobblemon.mod.common.entity.pokemon.ai.sensors.DrowsySensor
import com.cobblemon.mod.common.entity.pokemon.ai.sensors.PokemonAdultSensor
import com.cobblemon.mod.common.entity.pokemon.ai.sensors.PokemonGrowableCropSensor
import com.cobblemon.mod.common.entity.pokemon.ai.sensors.PokemonPiglinLovedSensor
import com.cobblemon.mod.common.pokemon.ai.PokemonDisturbancesSensor
import com.cobblemon.mod.common.entity.sensor.BattlingPokemonSensor
import com.cobblemon.mod.common.entity.sensor.NPCBattlingSensor
@@ -36,6 +37,8 @@ object CobblemonSensors {
val NEARBY_GROWABLE_CROPS = register("nearby_growable_crops", ::PokemonGrowableCropSensor)
val NEARBY_PIGLIN_LOVED_POKEMON = register("nearby_golden_pokemon", ::PokemonPiglinLovedSensor)
fun <E : Entity, U : Sensor<E>> register(id: String, supplier: Supplier<U>): SensorType<U> {
val sensor = SensorType(supplier)
sensors[id] = sensor
@@ -1552,8 +1552,8 @@ object MoLangFunctions {
map.put("identifier") { StringValue(species.resourceIdentifier.toString()) }
map.put("name") { StringValue(species.name) }
map.put("primary_type") { StringValue(species.primaryType.name) }
map.put("secondary_type") { StringValue(species.secondaryType?.name ?: "null") }
map.put("primary_type") { StringValue(species.primaryType.showdownId) }
map.put("secondary_type") { StringValue(species.secondaryType?.showdownId ?: "null") }
map.put("experience_group") { StringValue(species.experienceGroup.name) }
map.put("height") { DoubleValue(species.height) }
map.put("weight") { DoubleValue(species.weight) }
@@ -103,7 +103,7 @@ open class Move(
"name" to Function { StringValue(name) },
"display_name" to Function { StringValue(displayName.string) },
"description" to Function { StringValue(description.string) },
"type" to Function { StringValue(type.name) },
"type" to Function { StringValue(type.showdownId) },
"damage_category" to Function { StringValue(damageCategory.name) },
"power" to Function { DoubleValue(power) },
"accuracy" to Function { DoubleValue(accuracy) },
@@ -59,7 +59,7 @@ open class MoveTemplate(
val struct: MoStruct by lazy {
QueryStruct(hashMapOf())
.addFunction("name") { StringValue(name) }
.addFunction("type") { StringValue(elementalType.name) }
.addFunction("type") { StringValue(elementalType.showdownId) }
.addFunction("damage_category") { StringValue(damageCategory.name) }
.addFunction("power") { DoubleValue(power) }
.addFunction("target") { StringValue(target.name) }
@@ -136,7 +136,7 @@ open class PokemonProperties {
props.ability = parseStringOfRegistry(keyPairs, listOf("ability")) { Abilities.get(it)?.name }
props.status = parseStringOfRegistry(keyPairs, listOf("status")) { (Statuses.getStatus(it) ?: Statuses.getStatus(it.asIdentifierDefaultingNamespace()))?.showdownName }
props.nickname = parseText(keyPairs, listOf("nickname", "nick"))
props.type = parseStringOfRegistry(keyPairs, listOf("type", "elemental_type")) { ElementalTypes.get(it)?.name }
props.type = parseStringOfRegistry(keyPairs, listOf("type", "elemental_type")) { ElementalTypes.get(it)?.showdownId }
props.teraType = parseIdentifierOfRegistry(keyPairs, listOf("tera_type", "tera")) { TeraTypes.get(it)?.id?.simplify() }
props.dmaxLevel = parseIntProperty(keyPairs, listOf("dmax_level", "dmax"))?.coerceIn(0, Cobblemon.config.maxDynamaxLevel)
props.gmaxFactor = parseBooleanProperty(keyPairs, listOf("gmax_factor", "gmax"))
@@ -13,7 +13,7 @@ import com.cobblemon.mod.common.pokemon.Pokemon
enum class PokemonSortMode(val comparator: Comparator<Pokemon?>, val reverseComparator: Comparator<Pokemon?>) {
NAME({ it?.getDisplayName()?.string }),
LEVEL({ it?.level }),
TYPE({ it?.primaryType?.name }),
TYPE({ it?.primaryType?.showdownId }),
POKEDEX_NUMBER({ it?.species?.nationalPokedexNumber }),
GENDER({ it?.gender });
@@ -265,7 +265,7 @@ object PokemonSpecies : JsonDataRegistry<Species> {
"H" to "No Ability",
"S" to "No Ability"
)
val types = (form?.types ?: species.types).map { it.name.replaceFirstChar(Char::uppercase) }
val types = (form?.types ?: species.types).map { it.name }
val preevo: String? = (form?.preEvolution ?: species.preEvolution)?.let { if (it.form == it.species.standardForm) createShowdownName(it.species) else "${createShowdownName(it.species)}-${it.form.name}" }
// For the context of battles the content here doesn't matter whatsoever and due to how PokemonProperties work we can't guarantee an actual specific species is defined.
val evos = if ((form?.evolutions ?: species.evolutions).isEmpty()) emptyList() else arrayListOf("")
@@ -43,8 +43,6 @@ open class Learnset : ClientDataSynchronizer<Learnset> {
val tmInterpreter = Interpreter.parseFromPrefixIntoList("tm") { it.tmMoves }
val eggInterpreter = Interpreter.parseFromPrefixIntoList("egg") { it.eggMoves }
val tutorInterpreter = Interpreter.parseFromPrefixIntoList("tutor") { it.tutorMoves }
val legacyInterpreter = Interpreter.parseFromPrefixIntoList("legacy") { it.legacyMoves }
val specialInterpreter = Interpreter.parseFromPrefixIntoList("special") { it.specialMoves }
val formChangeInterpreter = Interpreter.parseFromPrefixIntoList("form_change") { it.formChangeMoves }
val levelUpInterpreter = Interpreter { element, learnset ->
val str = element.takeIf { it.isJsonPrimitive }?.asString ?: return@Interpreter false
@@ -72,8 +70,6 @@ open class Learnset : ClientDataSynchronizer<Learnset> {
tmInterpreter,
eggInterpreter,
tutorInterpreter,
legacyInterpreter,
specialInterpreter,
levelUpInterpreter,
formChangeInterpreter
)
@@ -82,8 +78,6 @@ open class Learnset : ClientDataSynchronizer<Learnset> {
val levelUpMoves = mutableMapOf<Int, MutableList<MoveTemplate>>()
val eggMoves = mutableListOf<MoveTemplate>()
val tutorMoves = mutableListOf<MoveTemplate>()
val legacyMoves = mutableListOf<MoveTemplate>()
val specialMoves = mutableListOf<MoveTemplate>()
val tmMoves = mutableListOf<MoveTemplate>()
/**
* Moves the species/form will have learnt when evolving into itself.
@@ -24,17 +24,6 @@ fun interface LearnsetQuery {
companion object {
val ANY = LearnsetQuery { move, learnset ->
learnset.levelUpMoves.values.any { it.contains(move) }
|| learnset.eggMoves.contains(move)
|| learnset.tutorMoves.contains(move)
|| learnset.tmMoves.contains(move)
|| learnset.formChangeMoves.contains(move)
|| learnset.evolutionMoves.contains(move)
|| learnset.legacyMoves.contains(move)
|| learnset.specialMoves.contains(move)
}
val LEGAL = LearnsetQuery { move, learnset ->
learnset.levelUpMoves.values.any { it.contains(move) }
|| learnset.eggMoves.contains(move)
|| learnset.tutorMoves.contains(move)
@@ -57,9 +46,6 @@ fun interface LearnsetQuery {
val EVOLUTION = LearnsetQuery { move, learnset -> learnset.evolutionMoves.contains(move) }
val LEGACY_MOVES = LearnsetQuery { move, learnset -> learnset.legacyMoves.contains(move) }
val SPECIAL_MOVES = LearnsetQuery { move, learnset -> learnset.specialMoves.contains(move) }
}
}
@@ -41,11 +41,15 @@ class EmitterSpace(
if (scaling == ScalingMode.ENTITY) {
locatorMatrix.matrix.getScale(scale)
// If any value is zero we get NaNs, so default to a large enough value to be safe
scale.x.coerceAtLeast(.01f)
scale.y.coerceAtLeast(.01f)
scale.z.coerceAtLeast(.01f)
}
val particleScale = Vector3f(scale.x, scale.y, scale.z)
//Presumably we will want to make the initial rotation configurable instead of always using root
val particleRawMatrix = Matrix4f().scale(particleScale).rotate(rootRotation)
val particleRawMatrix = Matrix4f().scale(scale).rotate(rootRotation)
return MatrixWrapper().updateMatrix(particleRawMatrix).updatePosition(locatorMatrix.getOrigin())
}
@@ -53,9 +53,12 @@ interface ParticleEmitterShape : CodecMapped {
}
val type: ParticleEmitterShapeType
val defaultAttachedOptions: MutableMap<AttachedType, Boolean>
get() = mutableMapOf(AttachedType.POSITION to true, AttachedType.ROTATION to false, AttachedType.SCALE to false)
fun getNewParticlePosition(runtime: MoLangRuntime, entity: Entity?): Vec3
fun getCenter(runtime: MoLangRuntime, entity: Entity?): Vec3
fun getAttachmentOptions(): MutableMap<AttachedType, Boolean> = defaultAttachedOptions // Default Values
}
enum class ParticleEmitterShapeType {
@@ -66,6 +69,12 @@ enum class ParticleEmitterShapeType {
ENTITY_BOUNDING_BOX
}
enum class AttachedType {
ROTATION,
SCALE,
POSITION
}
class SphereParticleEmitterShape(
var offset: Triple<Expression, Expression, Expression> = Triple(
NumberExpression(0.0),
@@ -73,7 +82,8 @@ class SphereParticleEmitterShape(
NumberExpression(0.0)
),
var radius: Expression = NumberExpression(0.0),
var surfaceOnly: Boolean = false
var surfaceOnly: Boolean = false,
val pAttachmentOptions: Map<AttachedType, Boolean>? = null
) : ParticleEmitterShape {
companion object {
val CODEC: Codec<SphereParticleEmitterShape> = RecordCodecBuilder.create { instance ->
@@ -114,9 +124,7 @@ class SphereParticleEmitterShape(
buffer.writeBoolean(surfaceOnly)
}
override fun getCenter(runtime: MoLangRuntime, entity: Entity?): Vec3 {
return runtime.resolveVec3d(offset)
}
override fun getCenter(runtime: MoLangRuntime, entity: Entity?): Vec3 = runtime.resolveVec3d(offset).multiply(Vec3(-1.0, 1.0, 1.0))
override fun getNewParticlePosition(runtime: MoLangRuntime, entity: Entity?): Vec3 {
val radius = runtime.resolveDouble(radius) * if (surfaceOnly) 1.0 else Random.Default.nextDouble()
@@ -124,6 +132,16 @@ class SphereParticleEmitterShape(
val psi = Math.PI * 2 * Random.Default.nextDouble()
return getCenter(runtime, entity).add(convertSphericalToCartesian(radius = radius, theta = theta, psi = psi))
}
override fun getAttachmentOptions(): MutableMap<AttachedType, Boolean> {
val map = super.getAttachmentOptions()
if (pAttachmentOptions != null) {
AttachedType.entries.forEach {
pAttachmentOptions[it]?.let { bool -> map.put(it, bool) }
}
}
return map
}
}
class PointParticleEmitterShape(
@@ -131,7 +149,8 @@ class PointParticleEmitterShape(
NumberExpression(0.0),
NumberExpression(0.0),
NumberExpression(0.0)
)
),
val pAttachmentOptions: Map<AttachedType, Boolean>? = null
): ParticleEmitterShape {
companion object {
val CODEC: Codec<PointParticleEmitterShape> = RecordCodecBuilder.create { instance ->
@@ -145,11 +164,21 @@ class PointParticleEmitterShape(
}
override val type = ParticleEmitterShapeType.POINT
override fun getNewParticlePosition(runtime: MoLangRuntime, entity: Entity?) = runtime.resolveVec3d(offset)
override fun getNewParticlePosition(runtime: MoLangRuntime, entity: Entity?): Vec3 = runtime.resolveVec3d(offset).multiply(Vec3(-1.0, 1.0, 1.0))
override fun getCenter(runtime: MoLangRuntime, entity: Entity?): Vec3 {
return Vec3.ZERO
}
override fun getAttachmentOptions(): MutableMap<AttachedType, Boolean> {
val map = super.getAttachmentOptions()
if (pAttachmentOptions != null) {
AttachedType.entries.forEach {
pAttachmentOptions[it]?.let { bool -> map.put(it, bool) }
}
}
return map
}
override fun <T> encode(ops: DynamicOps<T>) = CODEC.encodeStart(ops, this)
override fun readFromBuffer(buffer: RegistryFriendlyByteBuf) {
offset = Triple(
@@ -177,7 +206,8 @@ class BoxParticleEmitterShape(
NumberExpression(1.0),
NumberExpression(1.0)
),
var surfaceOnly: Boolean = false
var surfaceOnly: Boolean = false,
val pAttachmentOptions: Map<AttachedType, Boolean>? = null
) : ParticleEmitterShape {
companion object {
val CODEC: Codec<BoxParticleEmitterShape> = RecordCodecBuilder.create { instance ->
@@ -226,7 +256,7 @@ class BoxParticleEmitterShape(
buffer.writeBoolean(surfaceOnly)
}
override fun getCenter(runtime: MoLangRuntime, entity: Entity?) = runtime.resolveVec3d(offset)
override fun getCenter(runtime: MoLangRuntime, entity: Entity?): Vec3 = runtime.resolveVec3d(offset).multiply(Vec3(-1.0, 1.0, 1.0))
override fun getNewParticlePosition(runtime: MoLangRuntime, entity: Entity?): Vec3 {
val center = getCenter(runtime, entity)
@@ -274,6 +304,16 @@ class BoxParticleEmitterShape(
return center.add(disposition)
}
override fun getAttachmentOptions(): MutableMap<AttachedType, Boolean> {
val map = super.getAttachmentOptions()
if (pAttachmentOptions != null) {
AttachedType.entries.forEach {
pAttachmentOptions[it]?.let { bool -> map.put(it, bool) }
}
}
return map
}
}
class DiscParticleEmitterShape(
@@ -288,7 +328,8 @@ class DiscParticleEmitterShape(
NumberExpression(1.0),
NumberExpression(0.0)
),
var surfaceOnly: Boolean = false
var surfaceOnly: Boolean = false,
val pAttachmentOptions: Map<AttachedType, Boolean>? = null
): ParticleEmitterShape {
companion object {
val CODEC: Codec<DiscParticleEmitterShape> = RecordCodecBuilder.create { instance ->
@@ -333,7 +374,18 @@ class DiscParticleEmitterShape(
return center.add(displacement)
}
override fun getCenter(runtime: MoLangRuntime, entity: Entity?) = runtime.resolveVec3d(offset)
override fun getCenter(runtime: MoLangRuntime, entity: Entity?): Vec3 = runtime.resolveVec3d(offset).multiply(Vec3(-1.0, 1.0, 1.0))
override fun getAttachmentOptions(): MutableMap<AttachedType, Boolean> {
val map = super.getAttachmentOptions()
if (pAttachmentOptions != null) {
AttachedType.entries.forEach {
pAttachmentOptions[it]?.let { bool -> map.put(it, bool) }
}
}
return map
}
override fun <T> encode(ops: DynamicOps<T>) = CODEC.encodeStart(ops, this)
override fun readFromBuffer(buffer: RegistryFriendlyByteBuf) {
offset = Triple(
@@ -100,7 +100,7 @@ class ParticleEvent(
val locatorMatrix = when (effect.type) {
EventParticleOptions.EventParticleType.EMITTER -> particleMatrix
EventParticleOptions.EventParticleType.EMITTER_BOUND -> storm.locatorSpaceMatrix
EventParticleOptions.EventParticleType.EMITTER_BOUND -> storm.attachedMatrix
EventParticleOptions.EventParticleType.PARTICLE,
EventParticleOptions.EventParticleType.PARTICLE_WITH_VELOCITY -> particleMatrix
}
@@ -121,7 +121,7 @@ class ParticleEvent(
val newStorm = ParticleStorm(
effect = bedrockParticleOptions,
emitterSpaceMatrix = particleMatrix,
locatorSpaceMatrix = locatorMatrix,
attachedMatrix = locatorMatrix,
world = storm.world,
sourceVelocity = sourceVelocity,
sourceAlive = storm.sourceAlive,
@@ -80,8 +80,8 @@ class PokemonSpawnDetail : SpawnDetail() {
val species = PokemonSpecies.getByIdentifier(pokemon.species!!.asIdentifierDefaultingNamespace())
if (species != null) {
labels.addAll(
species.secondaryType?.let { listOf(species.primaryType.name.lowercase(), it.name.lowercase()) }
?: listOf(species.primaryType.name.lowercase())
species.secondaryType?.let { listOf(species.primaryType.showdownId, it.showdownId) }
?: listOf(species.primaryType.showdownId)
)
if (height == -1) {
@@ -82,18 +82,18 @@ class PlayerAdvancementData {
}
fun getTotalTypeCaptureCount(type: ElementalType): Int {
if (!totalTypeCaptureCounts.containsKey(key = type.name)) {
totalTypeCaptureCounts[type.name] = 0
if (!totalTypeCaptureCounts.containsKey(key = type.showdownId)) {
totalTypeCaptureCounts[type.showdownId] = 0
}
return totalTypeCaptureCounts.get(key = type.name) ?: 0
return totalTypeCaptureCounts.get(key = type.showdownId) ?: 0
}
fun updateTotalTypeCaptureCount(type: ElementalType) {
val count = totalTypeCaptureCounts[type.name] ?: 0
val count = totalTypeCaptureCounts[type.showdownId] ?: 0
if (count == 0) {
totalTypeCaptureCounts[type.name] = 1
totalTypeCaptureCounts[type.showdownId] = 1
} else {
totalTypeCaptureCounts.replace(type.name, count + 1)
totalTypeCaptureCounts.replace(type.showdownId, count + 1)
}
}
@@ -9,6 +9,7 @@
package com.cobblemon.mod.common.api.types
import com.cobblemon.mod.common.Cobblemon
import com.cobblemon.mod.common.api.data.ShowdownIdentifiable
import com.cobblemon.mod.common.util.codec.CodecUtils
import com.mojang.serialization.Codec
import net.minecraft.network.chat.MutableComponent
@@ -21,20 +22,26 @@ import net.minecraft.resources.ResourceLocation
* @param displayName: A Component used to display the name, normally a TranslatableText
* @param textureXMultiplier: The multiplier by which the TypeWidget shall move the display
* @param resourceLocation: The location of the resource used in the TypeWidget
* @param showdownId: The showdown ID of that element without spaces and all lowercase
*/
class ElementalType(
val name: String,
val displayName: MutableComponent,
val hue: Int,
val textureXMultiplier: Int,
val resourceLocation: ResourceLocation = ResourceLocation.fromNamespaceAndPath(Cobblemon.MODID, "ui/types.png")
) {
val resourceLocation: ResourceLocation = ResourceLocation.fromNamespaceAndPath(Cobblemon.MODID, "ui/types.png"),
val showdownId: String = ShowdownIdentifiable.REGEX.replace(name.lowercase(), "")
) : ShowdownIdentifiable {
override fun showdownId(): String {
return showdownId
}
companion object {
@JvmStatic
val BY_STRING_CODEC: Codec<ElementalType> = CodecUtils.createByStringCodec(
ElementalTypes::get,
ElementalType::name
{it.showdownId}
) { id -> "No ElementalType for ID $id" }
}
@@ -19,126 +19,126 @@ object ElementalTypes {
private val allTypes = mutableListOf<ElementalType>()
val NORMAL = register(
name = "normal",
name = "Normal",
displayName = Component.translatable("cobblemon.type.normal"),
hue = 0xDDDDCF,
textureXMultiplier = 0
)
val FIRE = register(
name = "fire",
name = "Fire",
displayName = Component.translatable("cobblemon.type.fire"),
hue = 0xE55C32,
textureXMultiplier = 1
)
val WATER = register(
name = "water",
name = "Water",
displayName = Component.translatable("cobblemon.type.water"),
hue = 0x4A9BE8,
textureXMultiplier = 2
)
val GRASS = register(
name = "grass",
name = "Grass",
displayName = Component.translatable("cobblemon.type.grass"),
hue = 0x4DBC3C,
textureXMultiplier = 3
)
val ELECTRIC = register(
name = "electric",
name = "Electric",
displayName = Component.translatable("cobblemon.type.electric"),
hue = 0xEFD128,
textureXMultiplier = 4
)
val ICE = register(
name = "ice",
name = "Ice",
displayName = Component.translatable("cobblemon.type.ice"),
hue = 0x6BC3EF,
textureXMultiplier = 5
)
val FIGHTING = register(
name = "fighting",
name = "Fighting",
displayName = Component.translatable("cobblemon.type.fighting"),
hue = 0xC44C5C,
textureXMultiplier = 6
)
val POISON = register(
name = "poison",
name = "Poison",
displayName = Component.translatable("cobblemon.type.poison"),
hue = 0xA24BD8,
textureXMultiplier = 7
)
val GROUND = register(
name = "ground",
name = "Ground",
displayName = Component.translatable("cobblemon.type.ground"),
hue = 0xD89950,
textureXMultiplier = 8
)
val FLYING = register(
name = "flying",
name = "Flying",
displayName = Component.translatable("cobblemon.type.flying"),
hue = 0xBCC1FF,
textureXMultiplier = 9
)
val PSYCHIC = register(
name = "psychic",
name = "Psychic",
displayName = Component.translatable("cobblemon.type.psychic"),
hue = 0xD86AD6,
textureXMultiplier = 10
)
val BUG = register(
name = "bug",
name = "Bug",
displayName = Component.translatable("cobblemon.type.bug"),
hue = 0xA2C831,
textureXMultiplier = 11
)
val ROCK = register(
name = "rock",
name = "Rock",
displayName = Component.translatable("cobblemon.type.rock"),
hue = 0xAA9666,
textureXMultiplier = 12
)
val GHOST = register(
name = "ghost",
name = "Ghost",
displayName = Component.translatable("cobblemon.type.ghost"),
hue = 0x9572E5,
textureXMultiplier = 13
)
val DRAGON = register(
name = "dragon",
name = "Dragon",
displayName = Component.translatable("cobblemon.type.dragon"),
hue = 0x535DE8,
textureXMultiplier = 14
)
val DARK = register(
name = "dark",
name = "Dark",
displayName = Component.translatable("cobblemon.type.dark"),
hue = 0x5C6CB2,
textureXMultiplier = 15
)
val STEEL = register(
name = "steel",
name = "Steel",
displayName = Component.translatable("cobblemon.type.steel"),
hue = 0xC3CCE0,
textureXMultiplier = 16
)
val FAIRY = register(
name = "fairy",
name = "Fairy",
displayName = Component.translatable("cobblemon.type.fairy"),
hue = 0xEA727E,
textureXMultiplier = 17
@@ -20,7 +20,7 @@ import java.lang.reflect.Type
object ElementalTypeAdapter: JsonSerializer<ElementalType>, JsonDeserializer<ElementalType> {
override fun serialize(src: ElementalType, typeOfSrc: Type, context: JsonSerializationContext): JsonElement {
return JsonPrimitive(src.name)
return JsonPrimitive(src.showdownId)
}
override fun deserialize(json: JsonElement, typeOfT: Type, context: JsonDeserializationContext): ElementalType {
@@ -27,6 +27,11 @@ interface TeraType : ShowdownIdentifiable {
*/
val id: ResourceLocation
/**
* The english readable name of the type, used when packing Pokemon for showdown
*/
val name: String
/**
* If this tera type can be selected naturally.
*/
@@ -44,5 +49,4 @@ interface TeraType : ShowdownIdentifiable {
TeraType::id
) { identifier -> "No TeraType for ID $identifier" }
}
}
@@ -110,7 +110,13 @@ object TeraTypes : Iterable<TeraType> {
* @return The found [TeraType] or null.
*/
@JvmStatic
fun get(id: String): TeraType? = this.get(cobblemonResource(id))
fun get(id: String): TeraType? = this.get(cobblemonResource(id)) ?: this.getByName(id)
/**
* Attempts to retrieve the [TeraType] by its english name.
*/
@JvmStatic
fun getByName(name: String) = this.types.values.firstOrNull { it.name.equals(name, true) }
/**
* Gets the corresponding tera type for a [ElementalType].
@@ -119,7 +125,7 @@ object TeraTypes : Iterable<TeraType> {
* @return The associated [TeraType].
*/
@JvmStatic
fun forElementalType(type: ElementalType): TeraType = this.get(cobblemonResource(type.name))!! // it's safe to do
fun forElementalType(type: ElementalType): TeraType = this.get(cobblemonResource(type.showdownId))!! // it's safe to do
private fun create(id: ResourceLocation, type: TeraType): TeraType {
this.types[id] = type
@@ -17,9 +17,11 @@ import net.minecraft.resources.ResourceLocation
class ElementalTypeTeraType(val type: ElementalType) : TeraType {
override val legalAsStatic: Boolean = true
override val id: ResourceLocation = cobblemonResource(this.type.name)
override val name: String = this.type.name
override val id: ResourceLocation = cobblemonResource(this.type.showdownId)
override val displayName: Component = this.type.displayName
override fun showdownId(): String = this.type.name
override fun showdownId(): String = this.type.showdownId()
}
@@ -17,6 +17,8 @@ import net.minecraft.resources.ResourceLocation
class StellarTeraType : TeraType {
override val id: ResourceLocation = ID
override val name: String = "Stellar"
override val legalAsStatic: Boolean = false
override val displayName: Component = LANG
@@ -8,7 +8,6 @@
package com.cobblemon.mod.common.battles
import com.cobblemon.mod.common.Cobblemon
import com.cobblemon.mod.common.api.battles.model.PokemonBattle
import com.cobblemon.mod.common.api.events.CobblemonEvents
import com.cobblemon.mod.common.api.events.battles.BattleStartedPostEvent
@@ -113,7 +112,7 @@ object BattleRegistry {
packedTeamBuilder.append("$pokeball,")
// Hidden Power Type
// This is empty if the pokemon is not Hyper Trained, and the provided type corresponds to base IVs and not battle IVs.
val hiddenPowerType = if (pk.ivs.hyperTrainedIVs.any()) HiddenPowerUtil.getHiddenPowerType(pk).name.replaceFirstChar { it.uppercase() } else ""
val hiddenPowerType = if (pk.ivs.hyperTrainedIVs.any()) HiddenPowerUtil.getHiddenPowerType(pk).name else ""
packedTeamBuilder.append("$hiddenPowerType,")
// Gigantamax
packedTeamBuilder.append("${if (pk.gmaxFactor) "G" else ""},")
@@ -121,7 +120,7 @@ object BattleRegistry {
// 0 - 9, empty == 10
packedTeamBuilder.append("${if (pk.dmaxLevel < 10) pk.dmaxLevel else ""},")
// Teratype
packedTeamBuilder.append("${pokemon.effectedPokemon.teraType.showdownId()},")
packedTeamBuilder.append("${pokemon.effectedPokemon.teraType.name},")
team.add(packedTeamBuilder.toString())
}
@@ -18,6 +18,7 @@ import com.cobblemon.mod.common.util.toVec3d
import com.mojang.serialization.MapCodec
import net.minecraft.core.BlockPos
import net.minecraft.core.Direction
import net.minecraft.server.level.ServerLevel
import net.minecraft.sounds.SoundEvents
import net.minecraft.sounds.SoundSource
import net.minecraft.util.RandomSource
@@ -165,7 +166,9 @@ class CampfireBlock(settings: Properties) : BaseEntityBlock(settings), SimpleWat
val potItem = blockEntity.getPotItem()
if (!byWater && player != null) {
player.setItemInHand(InteractionHand.MAIN_HAND, potItem)
if (!player.isCreative && potItem != null) {
player.setItemInHand(InteractionHand.MAIN_HAND, potItem)
}
} else {
val direction = blockState.getValue(FACING) as Direction
val f = 0.25F * direction.stepX.toFloat()
@@ -267,35 +270,6 @@ class CampfireBlock(settings: Properties) : BaseEntityBlock(settings), SimpleWat
}
}
override fun playerWillDestroy(level: Level, blockPos: BlockPos, blockState: BlockState, player: Player): BlockState {
if (!level.isClientSide) {
val blockEntity = level.getBlockEntity(blockPos)
if (blockEntity is CampfireBlockEntity && !player.isCreative) {
Containers.dropContents(level, blockPos, blockEntity)
val potItem = blockEntity.getPotItem() ?: ItemStack.EMPTY
if (!potItem.isEmpty) {
val direction = blockState.getValue(FACING) as Direction
val f = 0.25F * direction.stepX.toFloat()
val g = 0.25F * direction.stepZ.toFloat()
val itemEntity = ItemEntity(level, blockPos.x.toDouble() + 0.5 + f.toDouble(), (blockPos.y + 1).toDouble(), blockPos.z.toDouble() + 0.5 + g.toDouble(), potItem)
itemEntity.setDefaultPickUpDelay()
level.addFreshEntity(itemEntity)
}
}
level.playSoundServer(
position = blockPos.toVec3d(),
sound = CobblemonSounds.CAMPFIRE_POT_OPEN,
volume = 0.25F
)
}
return super.playerWillDestroy(level, blockPos, blockState, player)
}
override fun getCloneItemStack(level: LevelReader, pos: BlockPos, state: BlockState): ItemStack {
return if (state.getValue(SOUL)) ItemStack(Blocks.SOUL_CAMPFIRE) else ItemStack(Blocks.CAMPFIRE)
}
@@ -321,4 +295,38 @@ class CampfireBlock(settings: Properties) : BaseEntityBlock(settings), SimpleWat
override fun isSignalSource(state: BlockState): Boolean {
return true
}
override fun onRemove(
state: BlockState,
level: Level,
pos: BlockPos,
newState: BlockState,
movedByPiston: Boolean
) {
if (!state.`is`(newState.block)) {
val blockEntity = level.getBlockEntity(pos)
if (blockEntity is CampfireBlockEntity) {
if (level is ServerLevel) {
Containers.dropContents(level, pos, blockEntity)
val potItem = blockEntity.getPotItem() ?: ItemStack.EMPTY
if (!potItem.isEmpty) {
val direction = state.getValue(FACING) as Direction
val f = 0.25F * direction.stepX.toFloat()
val g = 0.25F * direction.stepZ.toFloat()
val itemEntity = ItemEntity(level, pos.x.toDouble() + 0.5 + f.toDouble(), (pos.y + 1).toDouble(), pos.z.toDouble() + 0.5 + g.toDouble(), potItem)
itemEntity.setDefaultPickUpDelay()
level.addFreshEntity(itemEntity)
}
}
super.onRemove(state, level, pos, newState, movedByPiston)
level.updateNeighbourForOutputSignal(pos, this)
} else {
super.onRemove(state, level, pos, newState, movedByPiston)
}
}
}
}
@@ -115,7 +115,7 @@ class CookingPotMenu : RecipeBookMenu<CraftingInput, CookingPotRecipeBase>, Cont
@Suppress("UNCHECKED_CAST")
val castedRecipe = recipe as RecipeHolder<CookingPotRecipeBase>
// Save seasoning contents in case the next recipe absorbs seasoning data
// Save seasoning contents
val seasoningSlots = CampfireBlockEntity.SEASONING_SLOTS
val preservedSeasonings = seasoningSlots.map { container.getItem(it).copy() }
@@ -127,14 +127,9 @@ class CookingPotMenu : RecipeBookMenu<CraftingInput, CookingPotRecipeBase>, Cont
this.finishPlacingRecipe(castedRecipe)
}
// Check if new result item supports seasoning
val result = castedRecipe.value().result
if (itemTakesSeasoningData(result)) {
seasoningSlots.forEachIndexed { index, slot ->
container.setItem(slot, preservedSeasonings[index])
}
seasoningSlots.forEachIndexed { index, slot ->
container.setItem(slot, preservedSeasonings[index])
}
} else {
throw IllegalArgumentException("Unsupported recipe type: ${recipeValue::class.java.name}")
}
@@ -192,7 +187,7 @@ class CookingPotMenu : RecipeBookMenu<CraftingInput, CookingPotRecipeBase>, Cont
}
override fun shouldMoveToInventory(slotIndex: Int): Boolean {
return slotIndex != CampfireBlockEntity.Companion.PREVIEW_ITEM_SLOT
return slotIndex != CampfireBlockEntity.Companion.PREVIEW_ITEM_SLOT && !CampfireBlockEntity.SEASONING_SLOTS.contains(slotIndex)
}
override fun quickMoveStack(
@@ -143,7 +143,7 @@ class CampfireBlockEntity(pos: BlockPos, state: BlockState) : BaseContainerBlock
return optional.map { it as RecipeHolder<CookingPotRecipeBase> }
}
// Check for both COOKING_POT_COOKING and COOKING_POT_SHAPELESS recipes
// Check for all Cooking Pot Recipe Types recipes
val optionalRecipe = fetchRecipe(CobblemonRecipeTypes.COOKING_POT_COOKING)
.orElseGet { fetchRecipe(CobblemonRecipeTypes.COOKING_POT_SHAPELESS).orElse(null) }
@@ -191,7 +191,7 @@ class CampfireBlockEntity(pos: BlockPos, state: BlockState) : BaseContainerBlock
resultSlotItem.grow(cookedItem.count)
}
campfireBlockEntity.consumeCraftingIngredients()
campfireBlockEntity.consumeCraftingIngredients(recipe)
level.playSoundServer(
position = pos.bottomCenter,
@@ -270,21 +270,21 @@ class CampfireBlockEntity(pos: BlockPos, state: BlockState) : BaseContainerBlock
return particleStorm
}
fun consumeCraftingIngredients() {
for (i in CRAFTING_GRID_SLOTS.first..SEASONING_SLOTS.last) {
val itemInSlot = getItem(i)
fun consumeCraftingIngredients(recipe: CookingPotRecipeBase) {
fun consumeItem(slot: Int) {
val itemInSlot = getItem(slot)
if (!itemInSlot.isEmpty) {
when (itemInSlot.item) {
Items.LAVA_BUCKET, Items.WATER_BUCKET, Items.MILK_BUCKET -> {
// Replace with empty bucket
setItem(i, ItemStack(Items.BUCKET))
setItem(slot, ItemStack(Items.BUCKET))
}
Items.HONEY_BOTTLE -> {
// TODO: Currently eats the empty bottles until the honey bottle stack is empty, replace with better system later.
itemInSlot.shrink(1)
if (itemInSlot.count <= 0) {
setItem(i, ItemStack.EMPTY)
setItem(slot, ItemStack.EMPTY)
}
}
@@ -292,12 +292,19 @@ class CampfireBlockEntity(pos: BlockPos, state: BlockState) : BaseContainerBlock
// Decrease the stack size by 1
itemInSlot.shrink(1)
if (itemInSlot.count <= 0) {
setItem(i, ItemStack.EMPTY) // Clear the slot if empty
setItem(slot, ItemStack.EMPTY) // Clear the slot if empty
}
}
}
}
}
for (i in CRAFTING_GRID_SLOTS.first..CRAFTING_GRID_SLOTS.last) {
consumeItem(i)
}
for (i in SEASONING_SLOTS.first..SEASONING_SLOTS.last) {
if (recipe.seasoningProcessors.any { it.consumesItem(getItem(i)) }) consumeItem(i)
}
}
fun getSeasonings(): List<ItemStack> =
@@ -35,6 +35,7 @@ import net.minecraft.client.gui.screens.recipebook.RecipeUpdateListener
import net.minecraft.network.chat.Component
import net.minecraft.resources.ResourceLocation
import net.minecraft.world.entity.player.Inventory
import net.minecraft.world.inventory.ClickType
import net.minecraft.world.inventory.RecipeBookMenu
import net.minecraft.world.inventory.Slot
import net.minecraft.world.item.crafting.CraftingInput
@@ -259,4 +260,10 @@ class CookingPotScreen(
else Tooltip.create(Component.translatable("gui.recipebook.toggleRecipes.all"))
)
}
// Java nullability with kotlin is my greatest enemy, it'll complain but this works
override fun slotClicked(slot: Slot?, slotId: Int, mouseButton: Int, type: ClickType) {
super.slotClicked(slot, slotId, mouseButton, type)
recipeBookComponent.slotClicked(slot)
}
}
@@ -669,7 +669,7 @@ class PokemonInfoWidget(val pX: Int, val pY: Int, val updateForm: (PokedexForm)
val primaryType = type[0]
if (primaryType != null) {
return try {
cobblemonResource("textures/gui/pokedex/platform_base_${primaryType.name}.png")
cobblemonResource("textures/gui/pokedex/platform_base_${primaryType.showdownId}.png")
} catch (error: FileNotFoundException) {
null
}
@@ -43,7 +43,7 @@ object SpawnSnowstormEntityParticleHandler : ClientNetworkPacketHandler<SpawnSno
val storm = ParticleStorm(
effect = effect,
emitterSpaceMatrix = particleMatrix,
locatorSpaceMatrix = locatorMatrix,
attachedMatrix = locatorMatrix,
world = world,
runtime = particleRuntime,
sourceVelocity = { sourceEntity.deltaMovement },
@@ -14,6 +14,7 @@ import com.bedrockk.molang.runtime.value.DoubleValue
import com.cobblemon.mod.common.api.molang.MoLangFunctions
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asMoLangValue
import com.cobblemon.mod.common.api.molang.MoLangFunctions.setup
import com.cobblemon.mod.common.api.snowstorm.AttachedType
import com.cobblemon.mod.common.api.snowstorm.BedrockParticleOptions
import com.cobblemon.mod.common.api.snowstorm.ParticleEmitterAction
import com.cobblemon.mod.common.client.ClientMoLangFunctions.setupClient
@@ -33,6 +34,8 @@ import net.minecraft.world.entity.Entity
import net.minecraft.world.entity.LivingEntity
import net.minecraft.world.entity.player.Player
import net.minecraft.world.phys.Vec3
import org.joml.AxisAngle4f
import org.joml.Vector3f
import org.joml.Vector4f
/**
@@ -44,11 +47,7 @@ import org.joml.Vector4f
class ParticleStorm(
val effect: BedrockParticleOptions,
val emitterSpaceMatrix: MatrixWrapper,
//This is a mildly inaccurate name. This matrix is basically the matrix we want to peg our movement to.
//Often times, this is the locator matrix, but sometimes, when we want the emitter to NOT track the locator, this value is the same obj as emitterSpaceMatrix.
//Currently only position is tracked. Ideally we would come up with a way to configure whether the emitter tracks any combination of position/rotation (or neither)
//on this matrix.
val locatorSpaceMatrix: MatrixWrapper,
val attachedMatrix: MatrixWrapper, // Can be the same as emitterSpaceMatrix
val world: ClientLevel,
val sourceVelocity: () -> Vec3 = { Vec3.ZERO },
val sourceAlive: () -> Boolean = { true },
@@ -173,7 +172,7 @@ class ParticleStorm(
ParticleStorm(
effect = effect,
emitterSpaceMatrix = matrixWrapper,
locatorSpaceMatrix = matrixWrapper,
attachedMatrix = matrixWrapper,
world = world,
runtime = particleRuntime,
sourceVelocity = { entity.deltaMovement },
@@ -191,7 +190,7 @@ class ParticleStorm(
ParticleStorm(
effect = effect,
emitterSpaceMatrix = matrixWrapper,
locatorSpaceMatrix = matrixWrapper,
attachedMatrix = matrixWrapper,
world = world,
runtime = particleRuntime,
sourceVelocity = { entity.deltaMovement },
@@ -247,7 +246,7 @@ class ParticleStorm(
return
}
val pos = locatorSpaceMatrix.getOrigin()
val pos = attachedMatrix.getOrigin()
xo = x
yo = y
zo = z
@@ -256,8 +255,38 @@ class ParticleStorm(
y = pos.y
z = pos.z
//Keeps emitter attached to locator
emitterSpaceMatrix.updatePosition(locatorSpaceMatrix.getOrigin())
if (emitterSpaceMatrix != attachedMatrix){
val attachmentOptions = effect.emitter.shape.getAttachmentOptions()
//Keeps emitter attached to locator based on the settings
if (attachmentOptions[AttachedType.POSITION] == true){
emitterSpaceMatrix.updatePosition(attachedMatrix.getOrigin())
}
val setRotation = attachmentOptions[AttachedType.ROTATION] == true
val setScale = attachmentOptions[AttachedType.SCALE] == true
if (setRotation || setScale){
val translation = emitterSpaceMatrix.matrix.getTranslation(Vector3f())
val rotation = if (setRotation){
attachedMatrix.matrix.getRotation(AxisAngle4f())
} else {
emitterSpaceMatrix.matrix.getRotation(AxisAngle4f())
}
val scale = if (setScale) {
attachedMatrix.matrix.getScale(Vector3f())
} else {
emitterSpaceMatrix.matrix.getScale(Vector3f())
}
// If any value is zero we get NaNs, so default to a large enough value to be safe
scale.x.coerceAtLeast(0.01f)
scale.y.coerceAtLeast(0.01f)
scale.z.coerceAtLeast(0.01f)
emitterSpaceMatrix.matrix.identity()
.translate(translation)
.rotate(rotation)
.scale(scale)
}
}
val oldDistanceTravelled = distanceTravelled
distanceTravelled += Vec3(x - xo, y - yo, z - zo).length().toFloat()
@@ -292,12 +321,22 @@ class ParticleStorm(
runtime.environment.setSimpleVariable("particle_random_3", DoubleValue(Random.Default.nextDouble()))
runtime.environment.setSimpleVariable("particle_random_4", DoubleValue(Random.Default.nextDouble()))
val newPosition = transformPosition(effect.emitter.shape.getNewParticlePosition(runtime, entity))
val pos = effect.emitter.shape.getNewParticlePosition(runtime, entity)
val newPosition = if (effect.emitter.shape.getAttachmentOptions()[AttachedType.SCALE] == true) {
transformPosition(pos)
} else {
transformPositionWithoutScale(pos)
}
return newPosition
}
fun getNextParticleVelocity(nextParticlePosition: Vec3): Vec3 {
val center = transformPosition(effect.emitter.shape.getCenter(runtime, entity))
val pos = effect.emitter.shape.getCenter(runtime, entity)
val center = if (effect.emitter.shape.getAttachmentOptions()[AttachedType.SCALE] == true) {
transformPosition(pos)
} else {
transformPositionWithoutScale(pos)
}
val initialVelocity = effect.particle.motion.getInitialVelocity(runtime, storm = this, particlePos = nextParticlePosition, emitterPos = center)
return initialVelocity
.scale(1 / 20.0)
@@ -313,6 +352,14 @@ class ParticleStorm(
contextStorm = null
}
// Sometimes we need to transform without scale, IE just rotation and position.
fun transformPositionWithoutScale(position: Vec3): Vec3 {
val matrixWrapper = emitterSpaceMatrix.clone()
val scale = matrixWrapper.matrix.getScale(Vector3f())
matrixWrapper.matrix.scale(1 / scale.x, 1 / scale.y, 1 / scale.z)
return matrixWrapper.transformPosition(position)
}
fun transformPosition(position: Vec3): Vec3 = emitterSpaceMatrix.transformPosition(position)
fun transformDirection(direction: Vec3): Vec3 = emitterSpaceMatrix.matrix.transformDirection(direction)
@@ -15,9 +15,7 @@ import com.cobblemon.mod.common.ModAPI
import com.cobblemon.mod.common.api.snowstorm.ParticleMaterial
import com.cobblemon.mod.common.api.snowstorm.UVDetails
import com.cobblemon.mod.common.client.particle.ParticleStorm
import com.cobblemon.mod.common.util.asExpressionLike
import com.cobblemon.mod.common.util.math.geometry.transformDirection
import com.cobblemon.mod.common.util.resolve
import com.cobblemon.mod.common.util.resolveBoolean
import com.cobblemon.mod.common.util.resolveDouble
import com.mojang.blaze3d.platform.GlStateManager
@@ -289,7 +287,7 @@ class SnowstormParticle(
//So instead of being bound to the emitter, the particle is actually bound to the locator for local rotation.
//If you're messing with this - make sure evo particles still rotate with the pokemon
if (storm.effect.space.localRotation) {
storm.locatorSpaceMatrix.matrix.getRotation(axisRotation)
storm.attachedMatrix.matrix.getRotation(axisRotation)
}
else {
matrixWrapper.matrix.getRotation(axisRotation)
@@ -371,7 +369,7 @@ class SnowstormParticle(
}
fun updatePosition() {
val localVector = if (storm.effect.space.localRotation) storm.locatorSpaceMatrix.matrix.transformDirection(
val localVector = if (storm.effect.space.localRotation) storm.attachedMatrix.matrix.transformDirection(
Vec3(
localX,
localY,
@@ -95,7 +95,7 @@ open class CakeBlockEntityRenderer(ctx: BlockEntityRendererProvider.Context) : B
class CakeTexture(textureName: String, val color: LayerColor) {
val texture = loadTexture("block/${textureName}")
val texture = loadTexture("block/food/${textureName}")
fun getColor(primaryColor: Int, secondaryColor: Int, tertiaryColor: Int): Int {
return when (color) {
@@ -39,8 +39,8 @@ class CampfireBlockEntityRenderer(ctx: BlockEntityRendererProvider.Context) : Bl
const val BROTH_START = 0F
const val BROTH_END = 1F
const val BROTH_HEIGHT = 0.3F
val BROTH_BASIC_SPRITE: TextureAtlasSprite = Minecraft.getInstance().getTextureAtlas(InventoryMenu.BLOCK_ATLAS).apply(ResourceLocation("cobblemon", "block/campfire_pot_broth_basic"))
val BROTH_SPRITE: TextureAtlasSprite = Minecraft.getInstance().getTextureAtlas(InventoryMenu.BLOCK_ATLAS).apply(ResourceLocation("cobblemon", "block/campfire_pot_broth"))
val BROTH_BASIC_SPRITE: TextureAtlasSprite = Minecraft.getInstance().getTextureAtlas(InventoryMenu.BLOCK_ATLAS).apply(ResourceLocation("cobblemon", "block/campfire_pot/campfire_pot_broth_basic"))
val BROTH_SPRITE: TextureAtlasSprite = Minecraft.getInstance().getTextureAtlas(InventoryMenu.BLOCK_ATLAS).apply(ResourceLocation("cobblemon", "block/campfire_pot/campfire_pot_broth"))
const val CIRCLE_RADIUS = 0.4F
const val ROTATION_SPEED = 1.5F
@@ -50,6 +50,10 @@ class PokemonItemRenderer : CobblemonBuiltinItemRenderer {
val transformations = positions[mode]!!
if (mode == ItemDisplayContext.GUI) {
Lighting.setupForFlatItems()
}
matrices.scale(transformations.scale.x, transformations.scale.y, transformations.scale.z)
matrices.translate(transformations.translation.x, transformations.translation.y, transformations.translation.z)
state.setPoseToFirstSuitable(PoseType.PORTRAIT)
@@ -60,18 +64,13 @@ class PokemonItemRenderer : CobblemonBuiltinItemRenderer {
val rotation = Quaternionf().fromEulerXYZDegrees(Vector3f(transformations.rotation.x, transformations.rotation.y, transformations.rotation.z))
matrices.mulPose(rotation)
rotation.conjugate()
// TO-DO: Flip the model to show the back
//matrices.mulPose(Quaternionf().fromAxisAngleRad(0f, 1f, 0f, Math.PI.toFloat()))
// Tilt the model to an isometric angle
//matrices.mulPose(Quaternionf().fromAxisAngleRad(1f, 0f, 0f, Math.toRadians(15.0).toFloat()))
//matrices.mulPose(Quaternionf().fromAxisAngleRad(0f, 1f, 0f, Math.toRadians(5.0).toFloat()))
//matrices.mulPose(Quaternionf().fromAxisAngleRad(0f, 0f, 1f, Math.toRadians(10.0).toFloat()))
val vertexConsumer: VertexConsumer = vertexConsumers.getBuffer(renderLayer)
matrices.pushPose()
val packedLight = LightTexture.pack(15, 15)
val packedLight = if (mode == ItemDisplayContext.GUI) {
LightTexture.pack(13, 13)
} else {
light
}
// x = red, y = green, z = blue, w = alpha
val tint = pokemonItem.tint(stack)
@@ -88,7 +87,9 @@ class PokemonItemRenderer : CobblemonBuiltinItemRenderer {
matrices.popPose()
matrices.popPose()
Lighting.setupForFlatItems()
if (mode == ItemDisplayContext.GUI) {
Lighting.setupFor3DItems()
}
}
companion object {
@@ -742,6 +742,8 @@ open class PosableModel(@Transient override val rootPart: Bone) : ModelFrame {
// We could improve this to be generalized for other entities. First we'd have to figure out wtf is going on, though.
if (entity is PokemonEntity) {
scale = entity.pokemon.form.baseScale * entity.pokemon.scaleModifier * (entity.delegate as PokemonClientDelegate).entityScaleModifier
// If scale is 0 we start getting NaNs
scale.coerceAtLeast(0.01f)
if (entity.passengers.isNotEmpty() && entity.controllingPassenger is OrientationControllable
&& (entity.controllingPassenger as OrientationControllable).orientationController.active){
val controllingPassenger = entity.controllingPassenger as OrientationControllable
@@ -45,7 +45,6 @@ import net.minecraft.client.multiplayer.ClientLevel
import net.minecraft.client.resources.sounds.SimpleSoundInstance
import net.minecraft.commands.arguments.item.ItemParser
import net.minecraft.sounds.SoundEvent
import net.minecraft.sounds.SoundSource
import net.minecraft.world.entity.Entity
import net.minecraft.world.item.ItemStack
import net.minecraft.world.phys.Vec3
@@ -359,7 +358,7 @@ abstract class PosableState : Schedulable {
effect = effect,
entity = entity,
emitterSpaceMatrix = particleMatrix,
locatorSpaceMatrix = locatorMatrix,
attachedMatrix = locatorMatrix,
world = world,
runtime = particleRuntime,
sourceVelocity = { entity.deltaMovement },
@@ -85,7 +85,7 @@ class BedrockParticleKeyframe(
val storm = ParticleStorm(
effect = effect,
emitterSpaceMatrix = particleMatrix,
locatorSpaceMatrix = locatorMatrix,
attachedMatrix = locatorMatrix,
world = world,
runtime = particleRuntime,
sourceVelocity = { entity.deltaMovement },
@@ -0,0 +1,128 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.entity.ai
/*
* 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/.
*/
import com.cobblemon.mod.common.CobblemonMemories
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
import com.google.common.collect.ImmutableMap
import net.minecraft.server.level.ServerLevel
import net.minecraft.world.entity.ai.behavior.Behavior
import net.minecraft.world.entity.ai.behavior.EntityTracker
import net.minecraft.world.entity.ai.memory.MemoryModuleType
import net.minecraft.world.entity.ai.memory.MemoryStatus
import net.minecraft.world.entity.ai.memory.WalkTarget
import net.minecraft.world.entity.ai.util.LandRandomPos
import net.minecraft.world.entity.monster.piglin.Piglin
import java.util.*
class PiglinDanceTarget : Behavior<Piglin>(
ImmutableMap.of(
CobblemonMemories.NEAREST_LOVED_ENTITY, MemoryStatus.VALUE_PRESENT,
MemoryModuleType.WALK_TARGET, MemoryStatus.REGISTERED,
),
Int.MAX_VALUE,
Int.MAX_VALUE
) {
var lovedPokemon: PokemonEntity? = null
val wayTooFar = 20F
var tooFar = 5F
var closeEnough = 3F
var tooClose = 1.5F
override fun checkExtraStartConditions(level: ServerLevel, owner: Piglin): Boolean {
lovedPokemon = (owner.brain.getMemory(CobblemonMemories.NEAREST_LOVED_ENTITY).orElse(null) ?: return false)
return lovedPokemon != null
}
override fun canStillUse(level: ServerLevel, entity: Piglin, gameTime: Long) : Boolean {
return lovedPokemon != null && lovedPokemon?.isAlive == true && (lovedPokemon?.distanceTo(entity) ?: 999F) < wayTooFar
}
override fun tick(level: ServerLevel, entity: Piglin, gameTime: Long) {
val leader : PokemonEntity = lovedPokemon ?: return
if (entity.brain.hasMemoryValue(MemoryModuleType.WALK_TARGET)) {
return // We're busy goin' n' shit
}
if (leader.distanceTo(entity) > tooFar) {
entity.brain.setMemory(
MemoryModuleType.WALK_TARGET,
CobblemonWalkTarget(
pos = leader.blockPosition(),
speedModifier = 0.6F,
completionRange = closeEnough.toInt()
)
)
} else if (leader.distanceTo(entity) < tooClose) {
// Give the dude some space
for (j in 0..9) {
val vec3 = LandRandomPos.getPosAway(entity, 5, 7, leader.position())
if (vec3 != null) {
entity.brain.setMemory(
MemoryModuleType.WALK_TARGET,
WalkTarget(
vec3,
0.4F,
closeEnough.toInt()
)
)
}
}
} else if (leader.brain.hasMemoryValue(MemoryModuleType.WALK_TARGET)) {
// Go to the leader's walk target, roughly.
val walkTarget = leader.brain.getMemory(MemoryModuleType.WALK_TARGET).orElse(null) ?: return
entity.brain.setMemory(
MemoryModuleType.WALK_TARGET,
CobblemonWalkTarget(
pos = walkTarget.target.currentBlockPosition(),
speedModifier = walkTarget.speedModifier,
nodeTypeFilter = (walkTarget as? CobblemonWalkTarget)?.nodeTypeFilter ?: { true },
completionRange = closeEnough.toInt()
)
)
} else {
// Maybe wander around and mingle
if (entity.random.nextFloat() < 0.01f) {
val vec3 = LandRandomPos.getPosTowards(entity,5, 7, leader.position())
if (vec3 != null) {
entity.brain.setMemory(
MemoryModuleType.WALK_TARGET,
WalkTarget(
vec3,
0.5F,
1
)
)
}
}
}
}
override fun start(level: ServerLevel, entity: Piglin, gameTime: Long) {
val pokemonEntity = lovedPokemon ?: return
entity.brain.setMemory(MemoryModuleType.DANCING, true)
entity.brain.setMemory(MemoryModuleType.CELEBRATE_LOCATION, Optional.of(pokemonEntity.blockPosition()))
entity.brain.setMemory(MemoryModuleType.LOOK_TARGET, EntityTracker(pokemonEntity, true))
}
override fun stop(level: ServerLevel, entity: Piglin, gameTime: Long) {
entity.brain.setMemory(MemoryModuleType.DANCING, false)
entity.brain.eraseMemory(MemoryModuleType.CELEBRATE_LOCATION)
}
}
@@ -0,0 +1,41 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.entity.pokemon.ai.sensors
import com.cobblemon.mod.common.CobblemonMemories
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
import net.minecraft.server.level.ServerLevel
import net.minecraft.world.entity.LivingEntity
import net.minecraft.world.entity.ai.memory.MemoryModuleType
import net.minecraft.world.entity.ai.memory.NearestVisibleLivingEntities
import net.minecraft.world.entity.ai.sensing.Sensor
/**
* Senses when the Pokémon is near an adult of the same species.
*
* @author JazzMcNade
* @since May 15th, 2024
*/
class PokemonPiglinLovedSensor : Sensor<LivingEntity>(100) {
override fun requires() = setOf(CobblemonMemories.NEAREST_LOVED_ENTITY, MemoryModuleType.NEAREST_VISIBLE_LIVING_ENTITIES)
override fun doTick(world: ServerLevel, entity: LivingEntity) {
entity.brain.getMemory(MemoryModuleType.NEAREST_VISIBLE_LIVING_ENTITIES).ifPresent { visibleMobs ->
setNearestPokemonAdult(entity, visibleMobs)
}
}
private fun setNearestPokemonAdult(entity: LivingEntity, visibleMobs: NearestVisibleLivingEntities) {
val nearestGoldenIdol = visibleMobs.findClosest { mob ->
mob is PokemonEntity && mob.exposedSpecies.behaviour.entityInteract.lovedByPiglin
}.map { mob -> mob as PokemonEntity }
entity.brain.setMemory(CobblemonMemories.NEAREST_LOVED_ENTITY, nearestGoldenIdol)
}
}
@@ -48,7 +48,7 @@ object AdvancementHandler : EventHandler {
CobblemonCriteria.CATCH_POKEMON.trigger(event.player, CountablePokemonTypeContext(advancementData.totalCaptureCount, "any"))
event.pokemon.types.forEach {
advancementData.updateTotalTypeCaptureCount(it)
CobblemonCriteria.CATCH_POKEMON.trigger(event.player, CountablePokemonTypeContext(advancementData.getTotalTypeCaptureCount(it), it.name))
CobblemonCriteria.CATCH_POKEMON.trigger(event.player, CountablePokemonTypeContext(advancementData.getTotalTypeCaptureCount(it), it.showdownId))
}
if (event.pokemon.shiny) {
advancementData.updateTotalShinyCaptureCount()
@@ -30,8 +30,8 @@ class RegionalFoodItem(properties: Properties) : Item(properties), PokemonSelect
override fun use(world: Level, player: Player, hand: InteractionHand): InteractionResultHolder<ItemStack> {
val stack = player.getItemInHand(hand)
// Allow eating normally if player needs food
if (player.foodData.needsFood()) {
// Allow eating normally if player needs food OR in creative
if (player.foodData.needsFood() || player.isCreative) {
player.startUsingItem(hand)
return InteractionResultHolder.consume(stack)
}
@@ -33,4 +33,9 @@ object BaitSeasoningProcessor : SeasoningProcessor {
}
result.set(CobblemonItemComponents.BAIT_EFFECTS, BaitEffectsComponent(baitIdentifiers.toList()))
}
override fun consumesItem(seasoning: ItemStack): Boolean {
val seasoningData = Seasonings.getFromItemStack(seasoning)
return seasoningData != null && !seasoningData.baitEffects.isNullOrEmpty()
}
}
@@ -39,4 +39,9 @@ object FlavourSeasoningProcessor : SeasoningProcessor {
result.set(CobblemonItemComponents.FLAVOUR, FlavourComponent(flavours))
}
override fun consumesItem(seasoning: ItemStack): Boolean {
val seasoningData = Seasonings.getFromItemStack(seasoning)
return seasoningData != null && !seasoningData.flavours.isNullOrEmpty()
}
}
@@ -19,9 +19,14 @@ object FoodColourSeasoningProcessor : SeasoningProcessor {
override fun apply(result: ItemStack, seasoning: List<ItemStack>) {
val colours = mutableListOf<DyeColor>()
for (seasoningStack in seasoning) {
val seasoning = Seasonings.getFromItemStack(seasoningStack)
seasoning?.colour?.run(colours::add)
val seasoningData = Seasonings.getFromItemStack(seasoningStack)
seasoningData?.colour?.run(colours::add)
}
result.set(CobblemonItemComponents.FOOD_COLOUR, FoodColourComponent(colours))
}
override fun consumesItem(seasoning: ItemStack): Boolean {
val seasoningData = Seasonings.getFromItemStack(seasoning)
return seasoningData != null
}
}
@@ -36,4 +36,9 @@ object FoodSeasoningProcessor : SeasoningProcessor {
result.set(CobblemonItemComponents.FOOD, FoodComponent(baseHunger, baseSaturation))
}
}
override fun consumesItem(seasoning: ItemStack): Boolean {
val seasoningData = Seasonings.getFromItemStack(seasoning)
return seasoningData?.food != null
}
}
@@ -28,4 +28,9 @@ object IngredientSeasoningProcessor : SeasoningProcessor {
result.set(CobblemonItemComponents.INGREDIENT, IngredientComponent(ingredients))
}
}
override fun consumesItem(seasoning: ItemStack): Boolean {
val seasoningData = Seasonings.getFromItemStack(seasoning)
return seasoningData != null
}
}
@@ -29,4 +29,9 @@ object MobEffectSeasoningProcessor : SeasoningProcessor {
result.set(CobblemonItemComponents.MOB_EFFECTS, MobEffectsComponent(mergedEffects))
}
}
override fun consumesItem(seasoning: ItemStack): Boolean {
val seasoningData = Seasonings.getFromItemStack(seasoning)
return seasoningData?.mobEffects != null
}
}
@@ -32,4 +32,5 @@ interface SeasoningProcessor {
val type: String
fun apply(result: ItemStack, seasoning: List<ItemStack>)
fun consumesItem(seasoning: ItemStack): Boolean
}
@@ -7,11 +7,9 @@
*/
package com.cobblemon.mod.common.item.group
import java.io.File
import com.google.gson.JsonParser
import com.cobblemon.mod.common.Cobblemon
import com.cobblemon.mod.common.CobblemonItems
import com.cobblemon.mod.common.api.pokemon.PokemonSpecies
import com.cobblemon.mod.common.util.cobblemonResource
import net.minecraft.core.registries.BuiltInRegistries
import net.minecraft.world.level.ItemLike
@@ -54,9 +52,6 @@ object CobblemonItemGroups {
@JvmStatic val EVOLUTION_ITEMS_KEY = this.create("evolution_item", this::evolutionItemEntries) {
ItemStack(CobblemonItems.BLACK_AUGURITE)
}
@JvmStatic val POKEMON_MODEL_ITEMS_KEY = this.create("pokemon_model_items", this::pokemonModelItemsEntries) {
ItemStack(Items.PAPER)
}
@JvmStatic val BLOCKS get() = BuiltInRegistries.CREATIVE_MODE_TAB.get(BLOCKS_KEY)
@JvmStatic val UTILITY_ITEMS get() = BuiltInRegistries.CREATIVE_MODE_TAB.get(UTILITY_ITEMS_KEY)
@@ -65,7 +60,6 @@ object CobblemonItemGroups {
@JvmStatic val CONSUMABLES get() = BuiltInRegistries.CREATIVE_MODE_TAB.get(CONSUMABLES_KEY)
@JvmStatic val HELD_ITEMS get() = BuiltInRegistries.CREATIVE_MODE_TAB.get(HELD_ITEMS_KEY)
@JvmStatic val EVOLUTION_ITEMS get() = BuiltInRegistries.CREATIVE_MODE_TAB.get(EVOLUTION_ITEMS_KEY)
@JvmStatic val POKEMON_MODEL_ITEMS get() = BuiltInRegistries.CREATIVE_MODE_TAB.get(POKEMON_MODEL_ITEMS_KEY)
@JvmStatic val BUILDING_BLOCKS_INJECTIONS = this.inject(ResourceKey.create(BuiltInRegistries.CREATIVE_MODE_TAB.key(), ResourceLocation.parse("building_blocks")), this::blocksInjections)
@JvmStatic val FOOD_INJECTIONS = this.inject(ResourceKey.create(BuiltInRegistries.CREATIVE_MODE_TAB.key(), ResourceLocation.parse("food_and_drinks")), this::foodInjections)
@@ -101,536 +95,6 @@ object CobblemonItemGroups {
return consumer
}
private fun pokemonModelItemsEntries(displayContext: ItemDisplayParameters, entries: Output) {
val extraAspects: Map<String, List<Set<String>>> = mapOf(
"Magikarp" to listOf(
setOf("female"),
setOf("magikarp-jump-apricot-stripes"),
setOf("magikarp-jump-apricot-tiger"),
setOf("magikarp-jump-apricot-zebra"),
setOf("magikarp-jump-black-forehead"),
setOf("magikarp-jump-black-mask"),
setOf("magikarp-jump-blue-raindrops"),
setOf("magikarp-jump-blue-saucy"),
setOf("magikarp-jump-brown-stripes"),
setOf("magikarp-jump-brown-tiger"),
setOf("magikarp-jump-brown-zebra"),
setOf("magikarp-jump-calico-orange-gold"),
setOf("magikarp-jump-calico-orange-white"),
setOf("magikarp-jump-calico-orange-white-black"),
setOf("magikarp-jump-calico-white-orange"),
setOf("magikarp-jump-gray-bubbles"),
setOf("magikarp-jump-gray-diamonds"),
setOf("magikarp-jump-gray-patches"),
setOf("magikarp-jump-orange-dapples"),
setOf("magikarp-jump-orange-forehead"),
setOf("magikarp-jump-orange-mask"),
setOf("magikarp-jump-orange-orca"),
setOf("magikarp-jump-orange-two-tone"),
setOf("magikarp-jump-pink-dapples"),
setOf("magikarp-jump-pink-orca"),
setOf("magikarp-jump-pink-two-tone"),
setOf("magikarp-jump-purple-bubbles"),
setOf("magikarp-jump-purple-diamonds"),
setOf("magikarp-jump-purple-patches"),
setOf("magikarp-jump-skelly"),
setOf("magikarp-jump-violet-raindrops"),
setOf("magikarp-jump-violet-saucy")
),
"Vivillon" to listOf(
setOf("vivillon-wings-archipelago"),
setOf("vivillon-wings-continental"),
setOf("vivillon-wings-elegant"),
setOf("vivillon-wings-fancy"),
setOf("vivillon-wings-forsaken"),
setOf("vivillon-wings-garden"),
setOf("vivillon-wings-high-plains"),
setOf("vivillon-wings-icy-snow"),
setOf("vivillon-wings-inferno"),
setOf("vivillon-wings-jungle"),
setOf("vivillon-wings-marine"),
setOf("vivillon-wings-modern"),
setOf("vivillon-wings-monsoon"),
setOf("vivillon-wings-ocean"),
setOf("vivillon-wings-polar"),
setOf("vivillon-wings-river"),
setOf("vivillon-wings-sandstorm"),
setOf("vivillon-wings-savanna"),
setOf("vivillon-wings-sun"),
setOf("vivillon-wings-tundra"),
setOf("vivillon-wings-void")
),
"Wooloo" to listOf(
setOf("color-black"),
setOf("color-blue"),
setOf("color-brown"),
setOf("color-cyan"),
setOf("color-gray"),
setOf("color-green"),
setOf("color-light_blue"),
setOf("color-light_gray"),
setOf("color-lime"),
setOf("color-magenta"),
setOf("color-orange"),
setOf("color-pink"),
setOf("color-purple"),
setOf("color-red"),
setOf("color-yellow")
),
"Smeargle" to listOf(
setOf("color-black"),
setOf("color-blue"),
setOf("color-brown"),
setOf("color-cyan"),
setOf("color-gray"),
setOf("color-light_blue"),
setOf("color-light_gray"),
setOf("color-lime"),
setOf("color-magenta"),
setOf("color-orange"),
setOf("color-pink"),
setOf("color-purple"),
setOf("color-red"),
setOf("color-white"),
setOf("color-yellow")
),
"Dubwool" to listOf(
setOf("color-black"),
setOf("color-blue"),
setOf("color-brown"),
setOf("color-cyan"),
setOf("color-gray"),
setOf("color-green"),
setOf("color-light_blue"),
setOf("color-light_gray"),
setOf("color-lime"),
setOf("color-magenta"),
setOf("color-orange"),
setOf("color-pink"),
setOf("color-purple"),
setOf("color-red"),
setOf("color-yellow")
),
"Conkeldurr" to listOf(
setOf("color-black"),
setOf("color-blue"),
setOf("color-brown"),
setOf("color-cyan"),
setOf("color-gray"),
setOf("color-green"),
setOf("color-light_blue"),
setOf("color-lime"),
setOf("color-magenta"),
setOf("color-orange"),
setOf("color-pink"),
setOf("color-purple"),
setOf("color-red"),
setOf("color-white"),
setOf("color-yellow")
),
"Komala" to listOf(
setOf("tree-acacia"),
setOf("tree-apricorn"),
setOf("tree-birch"),
setOf("tree-cherry"),
setOf("tree-crimson"),
setOf("tree-darkoak"),
setOf("tree-jungle"),
setOf("tree-mangrove"),
setOf("tree-oak"),
setOf("tree-saccharine"),
setOf("tree-spruce"),
setOf("tree-warped")
),
"Timburr" to listOf(
setOf("tree-acacia"),
setOf("tree-birch"),
setOf("tree-cherry"),
setOf("tree-crimson"),
setOf("tree-darkoak"),
setOf("tree-jungle"),
setOf("tree-mangrove"),
setOf("tree-oak"),
setOf("tree-saccharine"),
setOf("tree-spruce"),
setOf("tree-warped")
),
"Torterra" to listOf(
setOf("tree-acacia"),
setOf("tree-azalea"),
setOf("tree-birch"),
setOf("tree-cherry"),
setOf("tree-darkoak"),
setOf("tree-jungle"),
setOf("tree-mangrove"),
setOf("tree-oak"),
setOf("tree-spruce"),
setOf("tree-swamp")
),
"Gholdengo" to listOf(
setOf("netherite-coating-full"),
setOf("netherite-coating-stage1"),
setOf("netherite-coating-stage2"),
setOf("netherite-coating-stage3"),
setOf("netherite-coating-stage4"),
setOf("netherite-coating-stage5"),
setOf("netherite-coating-stage6"),
setOf("netherite-coating-stage7")
),
"Arbok" to listOf(
setOf("snake-pattern-attack"),
setOf("snake-pattern-dark"),
setOf("snake-pattern-elusive"),
setOf("snake-pattern-heart"),
setOf("snake-pattern-legacy"),
setOf("snake-pattern-sound"),
setOf("snake-pattern-speed")
),
"Flabebe" to listOf(
setOf("flower-pink")
),
"Floette" to listOf(
setOf("flower-pink")
),
"Florges" to listOf(
setOf("flower-pink")
),
"Wooper" to listOf(
setOf("female"),
setOf("female", "wooper_heart"),
setOf("wooper_heart")
),
"Gurdurr" to listOf(
setOf("metals-copper"),
setOf("metals-gold"),
setOf("metals-iron"),
setOf("metals-netherite")
),
"Sneasel" to listOf(
setOf("female"),
setOf("female", "hisuian")
),
"Clauncher" to listOf(
setOf("claw-left"),
setOf("claw-right"),
setOf("right")
),
"Clawitzer" to listOf(
setOf("claw-left"),
setOf("claw-right"),
setOf("right")
),
"Squirtle" to listOf(
setOf("cosmetic_item-black_glasses"),
setOf("cosmetic_item-wise_glasses")
),
"Wartortle" to listOf(
setOf("cosmetic_item-black_glasses"),
setOf("cosmetic_item-wise_glasses")
),
"Blastoise" to listOf(
setOf("cosmetic_item-black_glasses"),
setOf("cosmetic_item-wise_glasses")
),
"Butterfree" to listOf(
setOf("female"),
setOf("valencian")
),
"Rattata" to listOf(
setOf("female")
),
"Raticate" to listOf(
setOf("female")
),
"Raichu" to listOf(
setOf("female")
),
"Gloom" to listOf(
setOf("female"),
setOf("valencian")
),
"Vileplume" to listOf(
setOf("female"),
setOf("valencian")
),
"Gyarados" to listOf(
setOf("female"),
setOf("gyarados-eye-color-purple")
),
"Miltank" to listOf(
setOf("mooshtank-brown"),
setOf("mooshtank-red")
),
"Gimmighoul" to listOf(
setOf("minecraft")
),
"Bulbasaur" to listOf(
setOf("female")
),
"Ivysaur" to listOf(
setOf("female")
),
"Venusaur" to listOf(
setOf("female")
),
"Pikachu" to listOf(
setOf("female")
),
"Zubat" to listOf(
setOf("female")
),
"Golbat" to listOf(
setOf("female")
),
"Kadabra" to listOf(
setOf("female")
),
"Alakazam" to listOf(
setOf("female")
),
"Doduo" to listOf(
setOf("female")
),
"Dodrio" to listOf(
setOf("female")
),
"Hypno" to listOf(
setOf("female")
),
"Rhyhorn" to listOf(
setOf("female")
),
"Rhydon" to listOf(
setOf("female")
),
"Goldeen" to listOf(
setOf("female")
),
"Seaking" to listOf(
setOf("female")
),
"Scyther" to listOf(
setOf("female")
),
"Eevee" to listOf(
setOf("female")
),
"Dragonite" to listOf(
setOf("cosmetic_item-bundle")
),
"Ledyba" to listOf(
setOf("female")
),
"Ledian" to listOf(
setOf("female")
),
"Xatu" to listOf(
setOf("female")
),
"Bellossom" to listOf(
setOf("valencian")
),
"Aipom" to listOf(
setOf("female")
),
"Quagsire" to listOf(
setOf("female")
),
"Murkrow" to listOf(
setOf("female")
),
"Wobbuffet" to listOf(
setOf("female")
),
"Girafarig" to listOf(
setOf("female")
),
"Forretress" to listOf(
setOf("cosmetic_item-shulker_shell")
),
"Scizor" to listOf(
setOf("female")
),
"Heracross" to listOf(
setOf("female")
),
"Piloswine" to listOf(
setOf("female")
),
"Octillery" to listOf(
setOf("female")
),
"Donphan" to listOf(
setOf("female")
),
"Treecko" to listOf(
setOf("cosmetic_item-stick")
),
"Grovyle" to listOf(
setOf("cosmetic_item-stick")
),
"Sceptile" to listOf(
setOf("cosmetic_item-stick")
),
"Torchic" to listOf(
setOf("female")
),
"Combusken" to listOf(
setOf("female")
),
"Blaziken" to listOf(
setOf("female")
),
"Ludicolo" to listOf(
setOf("female")
),
"Nuzleaf" to listOf(
setOf("female")
),
"Shiftry" to listOf(
setOf("female")
),
"Roselia" to listOf(
setOf("female")
),
"Cacturne" to listOf(
setOf("female")
),
"Whiscash" to listOf(
setOf("whiscash_nero")
),
"Milotic" to listOf(
setOf("female")
),
"Relicanth" to listOf(
setOf("female")
),
"Bidoof" to listOf(
setOf("female")
),
"Bibarel" to listOf(
setOf("female")
),
"Kricketot" to listOf(
setOf("female")
),
"Kricketune" to listOf(
setOf("female")
),
"Shinx" to listOf(
setOf("female")
),
"Luxio" to listOf(
setOf("female")
),
"Luxray" to listOf(
setOf("female")
),
"Roserade" to listOf(
setOf("female")
),
"Combee" to listOf(
setOf("female")
),
"Buizel" to listOf(
setOf("female")
),
"Floatzel" to listOf(
setOf("female")
),
"Ambipom" to listOf(
setOf("female")
),
"Gible" to listOf(
setOf("female")
),
"Gabite" to listOf(
setOf("female")
),
"Garchomp" to listOf(
setOf("female")
),
"Hippopotas" to listOf(
setOf("female")
),
"Hippowdon" to listOf(
setOf("female")
),
"Croagunk" to listOf(
setOf("female")
),
"Toxicroak" to listOf(
setOf("female")
),
"Weavile" to listOf(
setOf("female")
),
"Rhyperior" to listOf(
setOf("female")
),
"Mamoswine" to listOf(
setOf("female")
),
"Unfezant" to listOf(
setOf("female")
),
"Sandile" to listOf(
setOf("cosmetic_item-black_glasses")
),
"Krokorok" to listOf(
setOf("cosmetic_item-black_glasses")
),
"Krookodile" to listOf(
setOf("cosmetic_item-black_glasses")
),
"Frillish" to listOf(
setOf("female")
),
"Jellicent" to listOf(
setOf("female")
),
"Braixen" to listOf(
setOf("cosmetic_item-silk_scarf")
),
"Delphox" to listOf(
setOf("cosmetic_item-silk_scarf")
),
"Sneasler" to listOf(
setOf("cosmetic_item-composter")
)
)
val orderedSpecies = PokemonSpecies.species.sortedBy { it.nationalPokedexNumber }
orderedSpecies.forEach { species ->
if (species.forms.isEmpty()) {
entries.accept(com.cobblemon.mod.common.item.PokemonItem.from(species, emptySet()))
} else {
species.forms.forEach { form ->
val formAspects = form.aspects.toSet()
entries.accept(com.cobblemon.mod.common.item.PokemonItem.from(species, formAspects))
}
}
// Add extra aspects if present for this species
extraAspects[species.name]?.forEach { aspectSet ->
entries.accept(com.cobblemon.mod.common.item.PokemonItem.from(species, aspectSet))
}
}
orderedSpecies.forEach { species ->
if (species.forms.isEmpty()) {
entries.accept(com.cobblemon.mod.common.item.PokemonItem.from(species, setOf("shiny")))
} else {
species.forms.forEach { form ->
val formAspects = form.aspects.toSet()
entries.accept(com.cobblemon.mod.common.item.PokemonItem.from(species, formAspects + setOf("shiny")))
}
}
// Add extra aspects + shiny if present for this species
extraAspects[species.name]?.forEach { aspectSet ->
entries.accept(com.cobblemon.mod.common.item.PokemonItem.from(species, aspectSet + setOf("shiny")))
}
}
}
private fun agricultureEntries(displayContext: ItemDisplayParameters, entries: Output) {
entries.accept(CobblemonItems.MEDICINAL_LEEK)
entries.accept(CobblemonItems.BIG_ROOT)
@@ -23,7 +23,7 @@ class MovesRegistrySyncPacket(moves: List<MoveTemplate>) : DataRegistrySyncPacke
override fun encodeEntry(buffer: RegistryFriendlyByteBuf, entry: MoveTemplate) {
buffer.writeString(entry.name)
buffer.writeInt(entry.num)
buffer.writeString(entry.elementalType.name)
buffer.writeString(entry.elementalType.showdownId)
buffer.writeString(entry.damageCategory.name)
buffer.writeDouble(entry.power)
buffer.writeEnumConstant(entry.target)
@@ -21,6 +21,8 @@ import com.google.gson.JsonPrimitive
import com.mojang.serialization.JsonOps
import net.minecraft.resources.ResourceLocation
import org.joml.Vector4f
import java.util.Locale
import java.util.Locale.getDefault
object SnowstormParticleReader {
fun loadEffect(json: JsonObject): BedrockParticleOptions {
@@ -182,21 +184,36 @@ object SnowstormParticleReader {
}
}
val space = spaceJson?.let {
val spaceRotation = it.get("rotation")?.asBoolean ?: false
ParticleSpace(
localPosition = if (spaceRotation) true else it.get("position")?.asBoolean ?: false,
localRotation = spaceRotation,
localVelocity = it.get("velocity")?.asBoolean ?: false
)
} ?: ParticleSpace()
val shape = if (emitterShapePointJson != null) {
val arr = emitterShapePointJson.get("offset")?.asJsonArray?.map { it.asString.asExpression() } ?: listOf(0.0.asExpression(), 0.0.asExpression(), 0.0.asExpression())
val map = emitterShapePointJson.get("attachment_options")?.asJsonObject?.let { parseAttachment(it) } ?: mutableMapOf()
if (space.localRotation && map[AttachedType.ROTATION] == null) map[AttachedType.ROTATION] = true
resolveDirection(emitterShapePointJson)
PointParticleEmitterShape(offset = Triple(arr[0], arr[1], arr[2]))
PointParticleEmitterShape(offset = Triple(arr[0], arr[1], arr[2]), pAttachmentOptions = map)
} else if (emitterShapeSphereJson != null) {
val arr = emitterShapeSphereJson.get("offset")?.asJsonArray?.map { it.asString.asExpression() } ?: listOf(0.0.asExpression(), 0.0.asExpression(), 0.0.asExpression())
val map = emitterShapeSphereJson.get("attachment_options")?.asJsonObject?.let { parseAttachment(it) }
resolveDirection(emitterShapeSphereJson)
SphereParticleEmitterShape(
offset = Triple(arr[0], arr[1], arr[2]),
radius = emitterShapeSphereJson.get("radius")?.asString?.asExpression() ?: 0.0.asExpression(),
surfaceOnly = emitterShapeSphereJson.get("surface_only")?.asBoolean ?: false
surfaceOnly = emitterShapeSphereJson.get("surface_only")?.asBoolean ?: false,
pAttachmentOptions = map
)
} else if (emitterShapeDiscJson != null) {
resolveDirection(emitterShapeDiscJson)
val offsetExpressions = emitterShapeDiscJson.get("offset")?.asJsonArray?.map { it.asString.asExpression() } ?: listOf(0.0.asExpression(), 0.0.asExpression(), 0.0.asExpression())
val map = emitterShapeDiscJson.get("attachment_options")?.asJsonObject?.let { parseAttachment(it) } ?: mutableMapOf()
if (space.localRotation && map[AttachedType.ROTATION] == null) map[AttachedType.ROTATION] = true
val normalJson = emitterShapeDiscJson.get("plane_normal") ?: JsonPrimitive("y")
val normal: Triple<Expression, Expression, Expression> = if (normalJson.isJsonArray) {
val normalArr = normalJson.asJsonArray.map { it.asString.asExpression() }
@@ -214,7 +231,8 @@ object SnowstormParticleReader {
offset = Triple(offsetExpressions[0], offsetExpressions[1], offsetExpressions[2]),
radius = emitterShapeDiscJson.get("radius")?.asString?.asExpression() ?: 0.0.asExpression(),
surfaceOnly = emitterShapeDiscJson.get("surface_only")?.asBoolean ?: false,
normal = normal
normal = normal,
pAttachmentOptions = map
)
} else if (emitterShapeBoxJson != null) {
resolveDirection(emitterShapeBoxJson)
@@ -222,10 +240,13 @@ object SnowstormParticleReader {
?: listOf(0.0.asExpression(), 0.0.asExpression(), 0.0.asExpression())
val boxSizeExpressions = emitterShapeBoxJson.get("half_dimensions")?.asJsonArray?.map { it.asString.asExpression() }
?: listOf(0.0.asExpression(), 0.0.asExpression(), 0.0.asExpression())
val map = emitterShapeBoxJson.get("attachment_options")?.asJsonObject?.let { parseAttachment(it) } ?: mutableMapOf()
if (space.localRotation && map[AttachedType.ROTATION] == null) map[AttachedType.ROTATION] = true
BoxParticleEmitterShape(
offset = Triple(offsetExpressions[0], offsetExpressions[1], offsetExpressions[2]),
boxSize = Triple(boxSizeExpressions[0], boxSizeExpressions[1], boxSizeExpressions[2]),
surfaceOnly = emitterShapeBoxJson.get("surface_only")?.asBoolean ?: false
surfaceOnly = emitterShapeBoxJson.get("surface_only")?.asBoolean ?: false,
pAttachmentOptions = map
)
} else if (emitterShapeEntityBoundingBoxJson != null) {
resolveDirection(emitterShapeEntityBoundingBoxJson)
@@ -356,14 +377,6 @@ object SnowstormParticleReader {
expiresOnContact = it.get("expire_on_contact")?.asBoolean ?: false
)
} ?: ParticleCollision()
val space = spaceJson?.let {
val spaceRotation = it.get("rotation")?.asBoolean ?: false
ParticleSpace(
localPosition = if (spaceRotation) true else it.get("position")?.asBoolean ?: false,
localRotation = spaceRotation,
localVelocity = it.get("velocity")?.asBoolean ?: false
)
} ?: ParticleSpace()
val particleEventSet = particleLifetimeEventsJson?.let {
val creationEvents = it.get("creation_event")?.normalizeToArray()?.map { SimpleEventTrigger(it.asString) }?.toMutableList() ?: mutableListOf()
@@ -450,4 +463,20 @@ object SnowstormParticleReader {
alphaHex.toInt(16) / 255F
)
}
private fun parseAttachment(jsonObject: JsonObject): MutableMap<AttachedType, Boolean> {
return jsonObject
.asMap()
.filter{ (key, _) -> safeValueOf<AttachedType>(key.uppercase()) != null }
.map { (key, value) -> enumValueOf<AttachedType>(key.uppercase()) to value.asBoolean }.toMap().toMutableMap()
}
// https://stackoverflow.com/questions/35666815/enum-valueof-in-kotlin
inline fun <reified T : Enum<T>> safeValueOf(string: String): T? {
return try {
enumValueOf<T>(string)
} catch (e: IllegalArgumentException) {
null
}
}
}
@@ -284,8 +284,8 @@ class FormData(
{ _, value -> buffer.writeSizedInt(IntSize.U_SHORT, value) }
)
}
buffer.writeNullable(this._primaryType) { pb, type -> pb.writeString(type.name) }
buffer.writeNullable(this._secondaryType) { pb, type -> pb.writeString(type.name) }
buffer.writeNullable(this._primaryType) { pb, type -> pb.writeString(type.showdownId) }
buffer.writeNullable(this._secondaryType) { pb, type -> pb.writeString(type.showdownId) }
buffer.writeNullable(this._experienceGroup) { pb, value -> pb.writeString(value.name) }
buffer.writeNullable(this._height) { pb, height -> pb.writeFloat(height) }
buffer.writeNullable(this._weight) { pb, weight -> pb.writeFloat(weight) }
@@ -230,8 +230,8 @@ class Species : ClientDataSynchronizer<Species>, ShowdownIdentifiable {
{ _, value -> buffer.writeSizedInt(IntSize.U_SHORT, value) }
)
// ToDo remake once we have custom typing support
buffer.writeString(this.primaryType.name)
buffer.writeNullable(this.secondaryType) { pb, type -> pb.writeString(type.name) }
buffer.writeString(this.primaryType.showdownId)
buffer.writeNullable(this.secondaryType) { pb, type -> pb.writeString(type.showdownId) }
buffer.writeString(this.experienceGroup.name)
buffer.writeFloat(this.height)
buffer.writeFloat(this.weight)
@@ -20,14 +20,18 @@ import net.minecraft.server.level.ServerPlayer
*/
class EntityBehaviour {
val avoidedByCreeper = false
// val avoidedByPhantom = false
val avoidedByPhantom = false
val avoidedBySkeleton = false
val lovedByPiglin = false
val avoidedByPiglin = false
@Transient
val struct = ObjectValue(this).also {
it.addFunction("avoided_by_creeper") { DoubleValue(avoidedByCreeper) }
// it.addFunction("avoided_by_phantom") { DoubleValue(avoidedByPhantom) }
it.addFunction("avoided_by_phantom") { DoubleValue(avoidedByPhantom) }
it.addFunction("avoided_by_skeleton") { DoubleValue(avoidedBySkeleton) }
it.addFunction("loved_by_piglin") { DoubleValue(lovedByPiglin) }
it.addFunction("avoid_by_piglin") { DoubleValue(avoidedByPiglin) }
}
companion object {
@@ -38,5 +42,9 @@ class EntityBehaviour {
fun hasSkeletonFearedShoulderMount(player: ServerPlayer) : Boolean {
return player.party().any { pokemon -> pokemon.state is ShoulderedState && pokemon.form.behaviour.entityInteract.avoidedBySkeleton }
}
fun hasPhantomFearedShoulderMount(player: ServerPlayer) : Boolean {
return player.party().any { pokemon -> pokemon.state is ShoulderedState && pokemon.form.behaviour.entityInteract.avoidedByPhantom }
}
}
}
@@ -6,7 +6,7 @@
"aspects": [],
"poser": "cobblemon:gilded_chest",
"model": "cobblemon:gilded_chest.geo",
"texture": "cobblemon:textures/block/black_gilded_chest.png",
"texture": "cobblemon:textures/block/functional/black_gilded_chest.png",
"layers": []
}
]
@@ -6,7 +6,7 @@
"aspects": [],
"poser": "cobblemon:gilded_chest",
"model": "cobblemon:gilded_chest.geo",
"texture": "cobblemon:textures/block/blue_gilded_chest.png",
"texture": "cobblemon:textures/block/functional/blue_gilded_chest.png",
"layers": []
}
]
@@ -6,7 +6,7 @@
"aspects": [],
"poser": "cobblemon:gilded_chest",
"model": "cobblemon:gilded_chest.geo",
"texture": "cobblemon:textures/block/gilded_chest.png",
"texture": "cobblemon:textures/block/functional/gilded_chest.png",
"layers": []
}
]
@@ -6,7 +6,7 @@
"aspects": [],
"poser": "cobblemon:gilded_chest",
"model": "cobblemon:gilded_chest.geo",
"texture": "cobblemon:textures/block/green_gilded_chest.png",
"texture": "cobblemon:textures/block/functional/green_gilded_chest.png",
"layers": []
}
]
@@ -6,7 +6,7 @@
"aspects": [],
"poser": "cobblemon:gilded_chest",
"model": "cobblemon:gilded_chest.geo",
"texture": "cobblemon:textures/block/pink_gilded_chest.png",
"texture": "cobblemon:textures/block/functional/pink_gilded_chest.png",
"layers": []
}
]
@@ -6,7 +6,7 @@
"aspects": [],
"poser": "cobblemon:gilded_chest",
"model": "cobblemon:gilded_chest.geo",
"texture": "cobblemon:textures/block/white_gilded_chest.png",
"texture": "cobblemon:textures/block/functional/white_gilded_chest.png",
"layers": []
}
]
@@ -6,7 +6,7 @@
"aspects": [],
"poser": "cobblemon:gilded_chest",
"model": "cobblemon:gilded_chest.geo",
"texture": "cobblemon:textures/block/yellow_gilded_chest.png",
"texture": "cobblemon:textures/block/functional/yellow_gilded_chest.png",
"layers": []
}
]
@@ -30,6 +30,7 @@
0,
1
],
"direction": "outwards"
},
"minecraft:particle_lifetime_expression": {
@@ -439,7 +439,7 @@
}
},
"animation.shellder.recoil": {
"animation_length": 0.5,
"loop": true,
"bones": {
"eyelid_recoil_left": {
"position": [0, 0, -0.1]
@@ -460,7 +460,7 @@
}
},
"animation.cloyster.recoil": {
"animation_length": 0.5,
"loop": true,
"bones": {
"mouth_smile": {
"position": [0, 0, 0.1]
@@ -1,246 +0,0 @@
{
"format_version": "1.8.0",
"animations": {
"animation.marill.ground_idle": {
"loop": true,
"bones": {
"foot_right": {
"rotation": [0, 17.5, 0]
},
"foot_left": {
"rotation": [0, -17.5, 0]
},
"ear_right": {
"rotation": [0, 15, -20]
},
"ear_left": {
"rotation": [0, -15, 20]
},
"arm_left": {
"rotation": [20, -12.5, 0]
},
"hand_left": {
"rotation": [0, 27.5, 0],
"position": [0.1, 0, 0.45]
},
"arm_right": {
"rotation": [20, 12.5, 0]
},
"hand_right": {
"rotation": [0, -27.5, 0],
"position": [-0.1, 0, 0.45]
},
"tail": {
"rotation": [10, 0, 0]
},
"tail2": {
"rotation": [-57.5, 0, 0]
},
"tail3": {
"rotation": [100, 0, 0]
},
"tail4": {
"rotation": [-90, 0, 0]
},
"tail5": {
"rotation": [85, 0, 0]
},
"tail6": {
"rotation": [-85, 0, 0]
},
"tail7": {
"rotation": [85, 0, 0]
},
"tail_ball": {
"rotation": [-47.5, 0, 0]
}
}
},
"animation.marill.water_idle": {
"loop": true,
"bones": {
"foot_right": {
"rotation": [0, 17.5, 0]
},
"foot_left": {
"rotation": [0, -17.5, 0]
},
"ear_right": {
"rotation": [0, 15, -20]
},
"ear_left": {
"rotation": [0, -15, 20]
},
"arm_left": {
"rotation": [30, -60, 0]
},
"hand_left": {
"rotation": [-22.5, 0, 0],
"position": [0, -0.05, 0.375]
},
"arm_right": {
"rotation": [30, 60, 0]
},
"hand_right": {
"rotation": [-22.5, 0, 0],
"position": [0, -0.05, 0.375]
},
"tail": {
"rotation": [0, 0, 0]
},
"tail2": {
"rotation": [-57.5, 0, 0]
},
"tail3": {
"rotation": [100, 0, 0]
},
"tail4": {
"rotation": [-90, 0, 0]
},
"tail5": {
"rotation": [85, 0, 0]
},
"tail6": {
"rotation": [-85, 0, 0]
},
"tail7": {
"rotation": [85, 0, 0]
},
"tail_ball": {
"rotation": [-47.5, 0, 0]
},
"feet": {
"rotation": [35, 0, 0],
"position": [0, 1, 0]
},
"torso": {
"rotation": [5, 0, 0]
}
}
},
"animation.marill.blink": {
"animation_length": 0.1667,
"bones": {
"eye_left": {
"position": {
"0.0": [0, 0, 0.1],
"0.1667": {
"pre": [0, 0, 0.1],
"post": [0, 0, 0]
}
}
},
"eye_right": {
"position": {
"0.0": [0, 0, 0.1],
"0.1667": {
"pre": [0, 0, 0.1],
"post": [0, 0, 0]
}
}
},
"eyelid_right": {
"position": {
"0.0": [0, 0, -0.1],
"0.1667": {
"pre": [0, 0, -0.1],
"post": [0, 0, 0]
}
}
},
"eyelid_left": {
"position": {
"0.0": [0, 0, -0.1],
"0.1667": {
"pre": [0, 0, -0.1],
"post": [0, 0, 0]
}
}
}
}
},
"animation.marill.sleep": {
"loop": true,
"bones": {
"ear_right": {
"rotation": [0, 15, -20]
},
"ear_left": {
"rotation": [0, -15, 20]
},
"eye_left": {
"position": [0, 0, 0.1]
},
"eye_right": {
"position": [0, 0, 0.1]
},
"mouth_closed_smile": {
"position": [0, 0, 0.1]
},
"mouth_closed_frown_small": {
"position": [0, 0, -0.1]
},
"eyelid_right": {
"position": [0, 0, -0.1]
},
"eyelid_left": {
"position": [0, 0, -0.1]
},
"body": {
"rotation": [-12.5, 0, 0],
"position": [0, -1, 0]
},
"feet": {
"position": [0, -0.5, -8.5]
},
"foot_left": {
"rotation": [-52.5, -30, 25]
},
"foot_right": {
"rotation": [-52.5, 30, -25]
},
"torso": {
"position": [0, -0.5, 0]
},
"tail": {
"rotation": [32.5, 45, 0]
},
"tail2": {
"rotation": [-45, 0, 0]
},
"tail3": {
"rotation": [45, 67.5, 0]
},
"tail4": {
"rotation": [-90, 0, 0]
},
"tail5": {
"rotation": [67.5, 45, 0]
},
"tail6": {
"rotation": [-67.5, 0, 0]
},
"tail7": {
"rotation": [45, 0, 0]
},
"tail_ball": {
"rotation": [-18, 40.5, 25]
},
"arm_left": {
"rotation": [30, -22.5, 0]
},
"hand_left": {
"rotation": [0, 45, 0],
"position": [0.275, 0, 0.725]
},
"arm_right": {
"rotation": [30, 22.5, 0]
},
"hand_right": {
"rotation": [0, -45, 0],
"position": [-0.275, 0, 0.725]
}
}
}
}
}
@@ -1,285 +0,0 @@
{
"format_version": "1.8.0",
"animations": {
"animation.azumarill.ground_idle": {
"loop": true,
"bones": {
"foot_left": {
"rotation": [10, -25, 0]
},
"foot_right": {
"rotation": [10, 25, 0]
},
"arm_left": {
"rotation": [0, 15, 45]
},
"hand_left": {
"rotation": [0, 0, -25],
"position": [-0.4, -0.1, 0]
},
"arm_right": {
"rotation": [0, -15, -45]
},
"hand_right": {
"rotation": [0, 0, 25],
"position": [0.4, -0.1, 0]
},
"tail2": {
"rotation": [-67.5, 0, 0]
},
"tail3": {
"rotation": [115, 0, 0]
},
"tail4": {
"rotation": [-90, 0, 0]
},
"tail5": {
"rotation": [112.5, 0, 0]
},
"tail6": {
"rotation": [-112.5, 0, 0]
},
"tail7": {
"rotation": [110, 0, 0]
},
"tail_ball": {
"rotation": [-57.5, 0, 0]
},
"body": {
"position": [0, 0.5, 0]
},
"toes_left": {
"rotation": [-10, 0, 0],
"position": [0, 0, 0.25]
},
"toes_right": {
"rotation": [-10, 0, 0],
"position": [0, 0, 0.25]
},
"tail": {
"rotation": [-10, 0, 0]
},
"ear_left": {
"rotation": [0, -15, 15]
},
"ear_left2": {
"rotation": [45, 0, 0]
},
"ear_right": {
"rotation": [0, 15, -15]
},
"ear_right2": {
"rotation": [95, 0, 0]
}
}
},
"animation.azumarill.water_idle": {
"loop": true,
"bones": {
"tail_active": {
"position": [0, 0, 0.1],
"scale": 0.1
},
"feet": {
"rotation": [45, 0, 0],
"position": [0, 1, 0]
},
"foot_left": {
"rotation": [0, -17.5, 0]
},
"foot_right": {
"rotation": [0, 17.5, 0]
},
"torso": {
"rotation": [5, 0, 0]
},
"tail": {
"rotation": [-5, 0, 0]
},
"tail2": {
"rotation": [-57.5, 0, 0]
},
"tail3": {
"rotation": [100, 0, 0]
},
"tail4": {
"rotation": [-90, 0, 0]
},
"tail5": {
"rotation": [85, 0, 0]
},
"tail6": {
"rotation": [-85, 0, 0]
},
"tail7": {
"rotation": [85, 0, 0]
},
"tail_ball": {
"rotation": [-47.5, 0, 0]
},
"ear_left": {
"rotation": [0, -15, 15]
},
"ear_left2": {
"rotation": [45, 0, 0]
},
"ear_right": {
"rotation": [0, 15, -15]
},
"ear_right2": {
"rotation": [90, 0, 0]
},
"arm_left": {
"rotation": [0, 25, 35]
},
"hand_left": {
"rotation": [0, 0, -25],
"position": [-0.4, -0.1, 0]
},
"arm_right": {
"rotation": [0, -25, -35]
},
"hand_right": {
"rotation": [0, 0, 25],
"position": [0.4, -0.1, 0]
}
}
},
"animation.azumarill.sleep": {
"loop": true,
"bones": {
"feet": {
"rotation": [-40, 0, 0],
"position": [0, 0, -6]
},
"foot_left": {
"rotation": [-10, -25, 0]
},
"toes_left": {
"rotation": [17.5, 0, 0],
"position": [0, 0, 0.25]
},
"foot_right": {
"rotation": [-10, 25, 0]
},
"toes_right": {
"rotation": [17.5, 0, 0],
"position": [0, 0, 0.25]
},
"torso": {
"rotation": [-17.5, 0, 0],
"position": [0, -2, 0]
},
"tail": {
"rotation": [45, 0, 0]
},
"tail2": {
"rotation": [-45, 45, 0]
},
"tail3": {
"rotation": [67.5, 0, 0]
},
"tail4": {
"rotation": [-67.5, 37.5, 0]
},
"tail5": {
"rotation": [67.5, 0, 0]
},
"tail6": {
"rotation": [0, 45, 0]
},
"tail7": {
"rotation": [67.5, 0, 0]
},
"tail_ball": {
"rotation": [-25, 0, -55]
},
"arm_left": {
"rotation": [0, 27.5, 50]
},
"hand_left": {
"rotation": [0, 20, 0],
"position": [-0.5, 0, -0.05]
},
"arm_right": {
"rotation": [0, -27.5, -50]
},
"hand_right": {
"rotation": [0, -20, 0],
"position": [0.5, 0, -0.05]
},
"eye_left": {
"position": [0, 0, 0.1]
},
"eye_right": {
"position": [0, 0, 0.1]
},
"mouth_closed_smile": {
"position": [0, 0, 0.1]
},
"eyelid_left": {
"position": [0, 0, -0.1]
},
"eyelid_right": {
"position": [0, 0, -0.1]
},
"mouth_closed_frown_small": {
"position": [0, 0, -0.1]
},
"ear_left": {
"rotation": [20, -15, 25]
},
"ear_left2": {
"rotation": [80, 0, 0]
},
"ear_right": {
"rotation": [20, 15, -25]
},
"ear_right2": {
"rotation": [110, 0, 0]
}
}
},
"animation.azumarill.blink": {
"animation_length": 0.1667,
"bones": {
"eye_left": {
"position": {
"0.0": [0, 0, 0.1],
"0.1667": {
"pre": [0, 0, 0.1],
"post": [0, 0, 0]
}
}
},
"eye_right": {
"position": {
"0.0": [0, 0, 0.1],
"0.1667": {
"pre": [0, 0, 0.1],
"post": [0, 0, 0]
}
}
},
"eyelid_right": {
"position": {
"0.0": [0, 0, -0.1],
"0.1667": {
"pre": [0, 0, -0.1],
"post": [0, 0, 0]
}
}
},
"eyelid_left": {
"position": {
"0.0": [0, 0, -0.1],
"0.1667": {
"pre": [0, 0, -0.1],
"post": [0, 0, 0]
}
}
}
}
}
}
}
@@ -104,160 +104,73 @@
}
},
"animation.shroomish.cry": {
"animation_length": 1.5,
"animation_length": 0.66667,
"bones": {
"neck": {
"rotation": {
"0.0": [0, 0, 0],
"0.25": [10, 0, 0],
"1.25": [10, 0, 0],
"1.5": [0, 0, 0]
}
},
"mouth": {
"position": {
"0.0": [0, 0, 0],
"0.25": [0, -2, 0],
"1.25": [0, -2, 0],
"1.5": [0, 0, 0]
}
},
"mouth2": {
"position": {
"0.0": [0, 0, 0],
"0.25": [0, -5, 0],
"1.25": [0, -5, 0],
"1.5": [0, 0, 0]
}
},
"jaw": {
"position": {
"0.0": [0, 0, 0],
"0.25": [0, -3, 0],
"1.25": [0, -3, 0],
"1.5": [0, 0, 0]
}
},
"head": {
"rotation": {
"0.0": [0, 0, 0],
"0.25": [-15, 0, 0],
"1.25": [-15, 0, 0],
"1.5": [0, 0, 0]
}
},
"head2": {
"rotation": {
"0.0": [0, 0, 0],
"0.25": [-15, 0, 0],
"1.25": [-15, 0, 0],
"1.5": [0, 0, 0]
}
},
"mouth_closed2": {
"position": {
"0.25": [0, 0, -0.1],
"0.3333": [0, 0, 0],
"1.1667": [0, 0, 0],
"1.25": [0, 0, -0.1]
}
},
"mouth_open2": {
"position": {
"0.0": [0, 0, 0.1],
"0.25": [0, 0, 0],
"1.25": [0, 0, 0],
"1.5": [0, 0, 0.1]
}
},
"head3": {
"rotation": {
"0.0": [0, 0, 0],
"0.25": [-15, 0, 0],
"1.25": [-15, 0, 0],
"1.5": [0, 0, 0]
}
},
"mouth_closed3": {
"position": {
"0.25": [0, 0, -0.1],
"0.3333": [0, 0, 0],
"1.1667": [0, 0, 0],
"1.25": [0, 0, -0.1]
}
},
"mouth_open3": {
"position": {
"0.0": [0, 0, 0.1],
"0.25": [0, 0, 0],
"1.25": [0, 0, 0],
"1.5": [0, 0, 0.1]
}
},
"torso": {
"rotation": {
"0.0": [0, 0, 0],
"0.25": {
"0.1667": {
"pre": [-7.5, 0, 0],
"post": [-7.5, 0, 0],
"lerp_mode": "catmullrom"
},
"1.1667": {
"0.5": {
"post": [-7.5, 0, 0],
"lerp_mode": "catmullrom"
},
"1.5": [0, 0, 0]
"0.6667": [0, 0, 0]
}
},
"mouth_closed": {
"position": {
"0.25": [0, 0, 0],
"0.3333": [0, 0, 0.1],
"1.1667": [0, 0, 0.1],
"1.25": [0, 0, 0]
"0.0833": [0, 0, 0],
"0.1667": [0, 0, 0.1],
"0.5": [0, 0, 0.1],
"0.5833": [0, 0, 0]
}
},
"mouth_open": {
"position": {
"0.0": [0, 0, 0],
"0.25": [0, 0, -0.1],
"1.25": [0, 0, -0.1],
"1.5": [0, 0, 0]
"0.0833": [0, 0, 0],
"0.1667": [0, 0, -0.1],
"0.5": [0, 0, -0.1],
"0.5833": [0, 0, 0]
}
},
"hair": {
"rotation": {
"0.0": [0, 0, 0],
"0.25": {
"0.1667": {
"pre": [-12.5, 0, 0],
"post": [-12.5, 0, 0],
"lerp_mode": "catmullrom"
},
"1.1667": {
"0.5": {
"post": [-12.5, 0, 0],
"lerp_mode": "catmullrom"
},
"1.5": [0, 0, 0]
"0.6667": [0, 0, 0]
}
},
"Eyebrow": {
"position": {
"0.0": [0, 0, 0],
"0.25": {
"0.1667": {
"pre": [0, 0.05, 0],
"post": [0, 0.05, 0],
"lerp_mode": "catmullrom"
},
"1.1667": {
"0.5": {
"post": [0, 0.4, 0],
"lerp_mode": "catmullrom"
},
"1.5": [0, 0, 0]
"0.6667": [0, 0, 0]
}
}
},
"sound_effects": {
"0.125": {
"0.0833": {
"effect": "pokemon.shroomish.cry"
}
}
@@ -297,7 +210,7 @@
}
},
"animation.shroomish.blink": {
"animation_length": 0.1667,
"animation_length": 0.16667,
"bones": {
"eyelid_left": {
"position": {
@@ -517,8 +430,8 @@
"rotation": {
"0.0": [0, -20, 0],
"0.1667": [0, -2, 0],
"0.2083": [0, 13.486, 0],
"1.6667": [-2, 783.343, 0],
"0.2083": [0, "-74+q.anim_time*420", 0],
"1.6667": [-2, "300+q.anim_time*290", 0],
"1.7083": [0, 804.57, 0],
"2.0": [49.25, 975.5, 0],
"2.25": {
@@ -538,8 +451,14 @@
"post": [172.96, 1142.75, -10.97],
"lerp_mode": "catmullrom"
},
"2.7917": [190.47335, 1149.92345, -2.60677],
"3.0": [190.47335, 1149.92345, -2.60677]
"2.7917": {
"post": [190.47335, 1149.92345, -2.60677],
"lerp_mode": "catmullrom"
},
"3.0": {
"post": [190.47335, 1149.92345, -2.60677],
"lerp_mode": "catmullrom"
}
},
"position": {
"0.0": [0, 0, 0],
@@ -1,288 +0,0 @@
{
"format_version": "1.8.0",
"animations": {
"animation.azurill.ground_idle": {
"loop": true,
"bones": {
"tail2": {
"rotation": [-95, 0, 0]
},
"tail3": {
"rotation": [100, 0, 0]
},
"tail4": {
"rotation": [-100, 0, 0]
},
"tail5": {
"rotation": [115, 0, 0]
},
"tail6": {
"rotation": [-115, 0, 0]
},
"tail7": {
"rotation": [112.5, 0, 0]
},
"mouth_closed_smile": {
"position": [0, 0, 0]
},
"torso": {
"rotation": [-5, 0, 0]
},
"ear_left": {
"rotation": [0, -15, 45]
},
"tail8": {
"rotation": [-45, 0, 0]
},
"foot_left": {
"rotation": [0, -25, 0]
},
"foot_right": {
"rotation": [0, 25, 0]
},
"ear_right": {
"rotation": [0, 0, -45]
},
"tail_ball": {
"rotation": [-12.5, 0, 0]
}
}
},
"animation.azurill.water_idle": {
"loop": true,
"bones": {
"tail2": {
"rotation": [-95, 0, 0]
},
"tail3": {
"rotation": [100, 0, 0]
},
"tail4": {
"rotation": [-100, 0, 0]
},
"tail5": {
"rotation": [115, 0, 0]
},
"tail6": {
"rotation": [-115, 0, 0]
},
"tail7": {
"rotation": [112.5, 0, 0]
},
"mouth_closed_smile": {
"position": [0, 0, 0]
},
"torso": {
"rotation": [5, 0, 0]
},
"ear_left": {
"rotation": [0, -15, 45]
},
"tail8": {
"rotation": [-45, 0, 0]
},
"foot_left": {
"rotation": [0, -25, 0]
},
"foot_right": {
"rotation": [0, 25, 0]
},
"ear_right": {
"rotation": [0, 0, -45]
},
"tail_ball": {
"rotation": [-12.5, 0, 0]
},
"body": {
"position": [0, 1, 0]
},
"feet": {
"rotation": [35, 0, 0]
},
"tail": {
"rotation": [-15, 0, 0]
}
}
},
"animation.azurill.battle_idle": {
"loop": true,
"bones": {
"body": {
"position": [0, 8, 0]
},
"foot_left": {
"rotation": [0, -25, 0]
},
"foot_right": {
"rotation": [0, 25, 0]
},
"tail2": {
"rotation": [-125, 0, 0]
},
"tail3": {
"rotation": [75, 0, 0]
},
"tail4": {
"rotation": [-107.5, 0, 0]
},
"tail5": {
"rotation": [65, 0, 0]
},
"tail6": {
"rotation": [-137.5, 0, 0]
},
"tail7": {
"rotation": [75, 0, 0]
},
"mouth_closed_smile": {
"position": [0, 0, -0.1]
},
"feet": {
"rotation": [12.5, 0, 0]
},
"tail": {
"rotation": [-15, 0, 0]
},
"ear_left": {
"rotation": [0, -10, 45]
},
"tail8": {
"rotation": [-95, 0, 0]
},
"torso2": {
"rotation": [-5, 0, 0]
},
"ear_right": {
"rotation": [0, 10, -45]
},
"mouth_closed": {
"position": [0, 0, 0.1]
},
"eye_left": {
"rotation": [0, 0, 2.5]
},
"eye_right": {
"rotation": [0, 0, -2.5]
},
"tail_ball": {
"rotation": [40, 0, 0]
},
"locator_top": {
"position": [0, 7, 0]
},
"locator_middle": {
"position": [0, -1, 0]
}
}
},
"animation.azurill.sleep": {
"loop": true,
"bones": {
"tail2": {
"rotation": [-95, 0, -45]
},
"tail3": {
"rotation": [100, 0, 0]
},
"tail4": {
"rotation": [-100, -45, 0]
},
"tail5": {
"rotation": [115, 0, 0]
},
"tail6": {
"rotation": [-115, -45, 0]
},
"tail7": {
"rotation": [112.5, 0, 0]
},
"mouth_closed_smile": {
"position": [0, 0, 0]
},
"ear_left": {
"rotation": [30, -15, 45]
},
"tail8": {
"rotation": [-55, -45, 0]
},
"foot_left": {
"rotation": [0, -25, 0],
"position": [0.5, 0, 0]
},
"foot_right": {
"rotation": [0, 25, 0],
"position": [-0.5, 0, 0]
},
"ear_right": {
"rotation": [0, 0, -45]
},
"tail_ball": {
"rotation": [-50.5, 16.5, -40]
},
"body": {
"position": [0, -1, 0]
},
"feet": {
"rotation": [-77.5, 0, 0],
"position": [0, 0.5, -4.75]
},
"torso2": {
"rotation": [-7.5, 0, 0]
},
"eye_left": {
"position": [0, 0, 0.1]
},
"eyelid_left": {
"position": [0, 0, -0.1]
},
"eye_right": {
"position": [0, 0, 0.1]
},
"eyelid_right": {
"position": [0, 0, -0.1]
}
}
},
"animation.azurill.blink": {
"animation_length": 0.1667,
"bones": {
"eye_left": {
"position": {
"0.0": [0, 0, 0.1],
"0.1667": {
"pre": [0, 0, 0.1],
"post": [0, 0, 0]
}
}
},
"eye_right": {
"position": {
"0.0": [0, 0, 0.1],
"0.1667": {
"pre": [0, 0, 0.1],
"post": [0, 0, 0]
}
}
},
"eyelid_right": {
"position": {
"0.0": [0, 0, -0.1],
"0.1667": {
"pre": [0, 0, -0.1],
"post": [0, 0, 0]
}
}
},
"eyelid_left": {
"position": {
"0.0": [0, 0, -0.1],
"0.1667": {
"pre": [0, 0, -0.1],
"post": [0, 0, 0]
}
}
}
}
}
}
}
@@ -511,19 +511,13 @@
"eyelid_left": {
"position": {
"0.0": [0.1, 0, 0],
"0.1667": {
"pre": [0.1, 0, 0],
"post": [0, 0, 0]
}
"0.1667": {"pre": [0.1, 0, 0], "post": [0, 0, 0]}
}
},
"eyelid_right": {
"position": {
"0.0": [-0.1, 0, 0],
"0.1667": {
"pre": [-0.1, 0, 0],
"post": [0, 0, 0]
}
"0.1667": {"pre": [-0.1, 0, 0], "post": [0, 0, 0]}
}
}
}
@@ -718,75 +712,27 @@
"eyelid_left": {
"position": {
"0.5": [0, 0, 0],
"0.5417": {
"pre": [0, 0, 0],
"post": [0.1, 0, 0]
},
"0.7083": {
"pre": [0.1, 0, 0],
"post": [0, 0, 0]
},
"2.0417": {
"pre": [0, 0, 0],
"post": [0, 0, 0]
},
"2.0833": {
"pre": [0, 0, 0],
"post": [0.1, 0, 0]
},
"2.25": {
"pre": [0.1, 0, 0],
"post": [0, 0, 0]
},
"3.75": {
"pre": [0, 0, 0],
"post": [0, 0, 0]
},
"3.7917": {
"pre": [0, 0, 0],
"post": [0.1, 0, 0]
},
"3.9583": {
"pre": [0.1, 0, 0],
"post": [0, 0, 0]
}
"0.5417": {"pre": [0, 0, 0], "post": [0.1, 0, 0]},
"0.7083": {"pre": [0.1, 0, 0], "post": [0, 0, 0]},
"2.0417": {"pre": [0, 0, 0], "post": [0, 0, 0]},
"2.0833": {"pre": [0, 0, 0], "post": [0.1, 0, 0]},
"2.25": {"pre": [0.1, 0, 0], "post": [0, 0, 0]},
"3.75": {"pre": [0, 0, 0], "post": [0, 0, 0]},
"3.7917": {"pre": [0, 0, 0], "post": [0.1, 0, 0]},
"3.9583": {"pre": [0.1, 0, 0], "post": [0, 0, 0]}
}
},
"eyelid_right": {
"position": {
"0.5": [0, 0, 0],
"0.5417": {
"pre": [0, 0, 0],
"post": [-0.1, 0, 0]
},
"0.7083": {
"pre": [-0.1, 0, 0],
"post": [0, 0, 0]
},
"2.0417": {
"pre": [0, 0, 0],
"post": [0, 0, 0]
},
"2.0833": {
"pre": [0, 0, 0],
"post": [-0.1, 0, 0]
},
"2.25": {
"pre": [-0.1, 0, 0],
"post": [0, 0, 0]
},
"3.75": {
"pre": [0, 0, 0],
"post": [0, 0, 0]
},
"3.7917": {
"pre": [0, 0, 0],
"post": [-0.1, 0, 0]
},
"3.9583": {
"pre": [-0.1, 0, 0],
"post": [0, 0, 0]
}
"0.5417": {"pre": [0, 0, 0], "post": [-0.1, 0, 0]},
"0.7083": {"pre": [-0.1, 0, 0], "post": [0, 0, 0]},
"2.0417": {"pre": [0, 0, 0], "post": [0, 0, 0]},
"2.0833": {"pre": [0, 0, 0], "post": [-0.1, 0, 0]},
"2.25": {"pre": [-0.1, 0, 0], "post": [0, 0, 0]},
"3.75": {"pre": [0, 0, 0], "post": [0, 0, 0]},
"3.7917": {"pre": [0, 0, 0], "post": [-0.1, 0, 0]},
"3.9583": {"pre": [-0.1, 0, 0], "post": [0, 0, 0]}
}
},
"head": {
@@ -1510,7 +1456,11 @@
"leg_front_left": {
"rotation": {
"0.0": [20, -1, 0],
"0.25": [-42.47, 0, 0],
"0.25": {
"pre": [-42.47, 0, 0],
"post": [-42.47, 0, 0],
"lerp_mode": "catmullrom"
},
"0.3333": [-25.43708, -0.29167, 0],
"0.4167": [0.80407, -0.74074, 0],
"0.5": [20, -1, 0]
@@ -1600,7 +1550,11 @@
"rotation": {
"0.0": [3.21, 0.74, 0],
"0.0833": [16, 1, 0],
"0.3333": [-42.47, 0, 0],
"0.3333": {
"pre": [-42.47, 0, 0],
"post": [-42.47, 0, 0],
"lerp_mode": "catmullrom"
},
"0.5": [3.21, 0.74, 0]
},
"position": {
@@ -1675,10 +1629,7 @@
"post": [40, -1, 0],
"lerp_mode": "catmullrom"
},
"0.4167": {
"post": [40.63051, -0.53537, 0],
"lerp_mode": "catmullrom"
},
"0.4167": [40.63051, -0.53537, 0],
"0.5": [9.48, -0.16, 0]
},
"position": {
@@ -1932,7 +1883,7 @@
"loop": true,
"bones": {
"tropius": {
"position": [0, 0, "39-q.anim_time*90*0.12"]
"position": [0, 0, "39-q.anim_time*8.5"]
}
}
},
@@ -1940,7 +1891,10 @@
"loop": true,
"bones": {
"tropius": {
"position": [0, 0, "39-q.anim_time*90*0.88"]
"position": [0, 0, "39-q.anim_time*80"]
},
"neck": {
"rotation": [2.5, 0, 0]
}
}
},
@@ -2067,7 +2021,7 @@
"rotation": [0, 0, -20]
},
"wing_back_right3_upper": {
"rotation": [0, 0, 20]
"rotation": [0, 0, 7.5]
},
"toe_front_left": {
"rotation": [12.5, 0, 0]
@@ -2106,7 +2060,7 @@
"position": [0, 1, 0]
},
"neck": {
"rotation": ["17.5+math.sin(q.anim_time*90*2.25-30)*2", 0, 0]
"rotation": ["29+math.sin(q.anim_time*90*2.25-30)*2", 0, 0]
},
"neck2": {
"rotation": ["17.5+math.sin(q.anim_time*90*2.25-100)*2", 0, 0],
@@ -2143,16 +2097,16 @@
"rotation": [0, 0, "0+math.sin(q.anim_time*90*2.25-50)*30"]
},
"wing_back_left2": {
"rotation": [0, 0, "2.5+math.sin(q.anim_time*90*2.25-30)*3"]
"rotation": [0, 0, "2.5+math.sin(q.anim_time*90*2.25-30)*8"]
},
"wing_back_left3": {
"rotation": [0, 0, "32.5+math.sin(q.anim_time*90*2.25-70)*5"]
"rotation": [0, 0, "32.5+math.sin(q.anim_time*90*2.25-70)*3"]
},
"wing_back_left4": {
"rotation": [0, 0, "32.5+math.sin(q.anim_time*90*2.25-110)*4"]
},
"wing_back_left": {
"rotation": [31.64794, -31.06472, -21.18376]
"rotation": [26.74152, -33.01823, -15.16293]
},
"leg_front_right": {
"rotation": ["-22.5+math.sin(q.anim_time*90*2.25-260)*-5", 0, 0]
@@ -2192,26 +2146,26 @@
"rotation": [0, 0, -17.5]
},
"wing_back_right": {
"rotation": [31.64794, 31.06472, 21.18376]
"rotation": [21.21618, 38.00898, 12.8161]
},
"wing_back_right2": {
"rotation": [0, 0, "-2.5+math.sin(q.anim_time*90*2.25-30)*-3"]
"rotation": [0, 0, "-2.5+math.sin(q.anim_time*90*2.25-30)*-8"]
},
"wing_back_right3": {
"rotation": [0, 0, "-32.5+math.sin(q.anim_time*90*2.25-70)*-5"]
"rotation": [0, 0, "-25+math.sin(q.anim_time*90*2.25-70)*-3"]
},
"wing_back_right4_upper": {
"rotation": [0, 0, 17.5]
},
"body": {
"rotation": ["14.5+math.sin(q.anim_time*90*2.25-20)*2", 0, "math.sin(q.anim_time*90*0.666)*-1"],
"position": ["0+math.sin(q.anim_time*90*0.666)", "9+math.sin(q.anim_time*90*2.25-110)*4", "math.sin(q.anim_time*90*2.25-60)*-1"]
"rotation": ["math.sin(q.anim_time*90*2.25-20)*2", 0, "math.sin(q.anim_time*90*0.666)*-1"],
"position": ["0+math.sin(q.anim_time*90*0.666)", "9+math.sin(q.anim_time*90*2.25-110)*4", "1+math.sin(q.anim_time*90*2.25-60)*-1"]
},
"wing_back_left3_upper": {
"rotation": [0, 0, -20]
},
"wing_back_right3_upper": {
"rotation": [0, 0, 20]
"rotation": [0, 0, 7.5]
},
"toe_front_left": {
"rotation": [12.5, 0, 0]
@@ -2244,25 +2198,25 @@
"bones": {
"body": {
"rotation": ["14.5+math.sin(q.anim_time*90*0.43-90)*3", 0, "math.sin(q.anim_time*90*0.73-90)*-2"],
"position": ["0+math.sin(q.anim_time*90*0.73-90)*4", "7+math.sin(q.anim_time*90*1)*2", "0+math.sin(q.anim_time*90*0.43-90)*1"]
"position": ["0+math.sin(q.anim_time*90*0.73-90)*4", "7+math.sin(q.anim_time*90*1)*2", "0+math.sin(q.anim_time*90*0.43-90)*2"]
},
"neck": {
"rotation": ["25+math.sin(q.anim_time*90*0.43-90)*-3", 0, "math.sin(q.anim_time*90*0.73-130)*-2"]
"rotation": ["17.5+math.sin(q.anim_time*90*0.43-90)*-3", 0, "math.sin(q.anim_time*90*0.73-130)*-2"]
},
"neck2": {
"rotation": ["2.2151+math.sin(q.anim_time*90*0.43-130)*-3", 0.09443, "2.9287+math.sin(q.anim_time*90*0.73-170)*-2"]
"rotation": ["4.7151+math.sin(q.anim_time*90*0.43-130)*-3", 0.09443, "2.9287+math.sin(q.anim_time*90*0.73-170)*-2"]
},
"neck3": {
"rotation": ["15+math.sin(q.anim_time*90*0.43-170)*-3", 0, "math.sin(q.anim_time*90*0.73-210)*-2"]
"rotation": ["20+math.sin(q.anim_time*90*0.43-170)*-4", 0, "math.sin(q.anim_time*90*0.73-210)*-2"]
},
"neck4": {
"rotation": ["27.5+math.sin(q.anim_time*90*0.43-200)*-3", 0, "math.sin(q.anim_time*90*0.73-250)*-2"]
"rotation": ["32.5+math.sin(q.anim_time*90*0.43-200)*-4", 0, "math.sin(q.anim_time*90*0.73-250)*-2"]
},
"neck5": {
"rotation": ["17.5+math.sin(q.anim_time*90*0.43-240)*-3", 0, "math.sin(q.anim_time*90*0.73-290)*-2"]
"rotation": ["17.5+math.sin(q.anim_time*90*0.43-240)*-4", 0, "math.sin(q.anim_time*90*0.73-290)*-2"]
},
"head": {
"rotation": ["17.5+math.sin(q.anim_time*90*0.43-300)*-3", 0, "math.sin(q.anim_time*90*0.73-330)*-2"]
"rotation": ["17.5+math.sin(q.anim_time*90*0.43-300)*-4", 0, "math.sin(q.anim_time*90*0.73-330)*-2"]
},
"banana_middle": {
"rotation": ["0+math.sin(q.anim_time*90*0.43-40)*-15", 0, 0]
@@ -2292,25 +2246,25 @@
"rotation": [0, 0, "4.5-math.sin(q.anim_time*90*1-140)*6"]
},
"wing_back_left": {
"rotation": [19.55989, -21.69555, -27.00655]
"rotation": [15.77241, -22.91054, -21.63402]
},
"wing_back_left2": {
"rotation": ["0+math.sin(q.anim_time*90*16)*1", 0, "7.5+math.sin(q.anim_time*90*1)*3"]
},
"wing_back_left3": {
"rotation": [0, 0, "7+math.sin(q.anim_time*90*1-50)*3"]
"rotation": [0, 0, "3+math.sin(q.anim_time*90*1-50)*3"]
},
"wing_back_left4": {
"rotation": [0, 0, "15+math.sin(q.anim_time*90*1-100)*3"]
},
"wing_back_right": {
"rotation": [19.55989, 21.69555, 27.00655]
"rotation": [15.77241, 22.91054, 21.63402]
},
"wing_back_right2": {
"rotation": ["0+math.sin(q.anim_time*90*16)*1", 0, "-7.5+math.sin(q.anim_time*90*1)*-3"]
},
"wing_back_right3": {
"rotation": [0, 0, "-7+math.sin(q.anim_time*90*1-50)*-3"]
"rotation": [0, 0, "-3+math.sin(q.anim_time*90*1-50)*-3"]
},
"wing_back_right4": {
"rotation": [0, 0, "-15+math.sin(q.anim_time*90*1-100)*-3"]
@@ -2577,23 +2531,19 @@
"rotation": [0, 0, 27.5]
},
"leg_front_left": {
"rotation": [-78.8997, -13.75392, 4.78274],
"position": [0, 2, 0]
"rotation": [-78.8997, -13.75392, 4.78274]
},
"leg_front_right": {
"rotation": [-81.17768, 20.52872, -1.6317],
"position": [0, 1, 0]
"rotation": [-81.17768, 20.52872, -1.6317]
},
"leg_back_left": {
"rotation": [82.14048, 17.34551, -2.35666],
"position": [0, 2, 0]
"rotation": [82.14048, 17.34551, -2.35666]
},
"leg_back_left2": {
"rotation": [5, 0, 0]
},
"leg_back_right": {
"rotation": [84.82456, -14.94159, 1.3378],
"position": [0, 2, 0]
"rotation": [84.82456, -14.94159, 1.3378]
},
"leg_back_right2": {
"rotation": [5, 0, 0]
@@ -2619,7 +2569,7 @@
},
"neck": {
"rotation": [96.40868, 9.38063, 0.97369],
"position": [0, -3.4, 0]
"position": [0, -2, 4]
},
"neck2": {
"rotation": ["20.4907+math.sin(q.anim_time*90*0.5)*0.9", 0.36957, 6.39838],
@@ -2630,7 +2580,7 @@
"position": [0.775, -2.925, -0.7]
},
"neck4": {
"rotation": ["-5.757+math.sin(q.anim_time*90*0.5)*-0.9", -10.46977, -27.54476],
"rotation": ["-5.757+math.sin(q.anim_time*90*0.5)*-0.9", -10.46977, -23.04476],
"position": [-0.6, -3.775, -1]
},
"neck5": {
@@ -2667,16 +2617,19 @@
"rotation": [0, 0, "40+math.sin(q.anim_time*90*0.5)*0.9"]
},
"wing_front_left3": {
"rotation": [0, 0, "10-math.sin(q.anim_time*90*0.5)*0.9"]
"rotation": [0, 0, "10-math.sin(q.anim_time*90*0.5)*0.9"],
"position": [-2, 0, 0]
},
"wing_front_right": {
"rotation": [-2.83158, -35.08163, 4.61044]
},
"wing_front_right2": {
"rotation": [0, 0, -24.74881]
"rotation": [1.83368, -4.31076, -34.76983],
"position": [1, 0, 0]
},
"wing_front_right3": {
"rotation": [0, 0, "-10-math.sin(q.anim_time*90*0.5)*0.9"]
"rotation": [0, -7.13266, "8.6164248718+math.sin(q.anim_time*90*0.5)*-2.5"],
"position": [1, 0, 0]
},
"wing_back_left2": {
"rotation": [0, 0, 27.5]
@@ -3185,27 +3138,15 @@
"eyelid_left": {
"position": {
"0.0": [0, 0, 0],
"0.0417": {
"pre": [0, 0, 0],
"post": [0.1, 0, 0]
},
"0.2083": {
"pre": [0.1, 0, 0],
"post": [0, 0, 0]
}
"0.0417": {"pre": [0, 0, 0], "post": [0.1, 0, 0]},
"0.2083": {"pre": [0.1, 0, 0], "post": [0, 0, 0]}
}
},
"eyelid_right": {
"position": {
"0.0": [0, 0, 0],
"0.0417": {
"pre": [0, 0, 0],
"post": [-0.1, 0, 0]
},
"0.2083": {
"pre": [-0.1, 0, 0],
"post": [0, 0, 0]
}
"0.0417": {"pre": [0, 0, 0], "post": [-0.1, 0, 0]},
"0.2083": {"pre": [-0.1, 0, 0], "post": [0, 0, 0]}
}
}
}
@@ -4517,67 +4458,25 @@
"eyelid_left": {
"position": {
"0.0": [0, 0, 0],
"0.0417": {
"pre": [0, 0, 0],
"post": [0.1, 0, 0]
},
"0.2083": {
"pre": [0.1, 0, 0],
"post": [0, 0, 0]
},
"0.4583": {
"pre": [0, 0, 0],
"post": [0.1, 0, 0]
},
"0.9583": {
"pre": [0.1, 0, 0],
"post": [0, 0, 0]
},
"1.4583": {
"pre": [0, 0, 0],
"post": [0.1, 0, 0]
},
"1.7917": {
"pre": [0.1, 0, 0],
"post": [0, 0, 0]
},
"2.0833": {
"pre": [0, 0, 0],
"post": [0.1, 0, 0]
}
"0.0417": {"pre": [0, 0, 0], "post": [0.1, 0, 0]},
"0.2083": {"pre": [0.1, 0, 0], "post": [0, 0, 0]},
"0.4583": {"pre": [0, 0, 0], "post": [0.1, 0, 0]},
"0.9583": {"pre": [0.1, 0, 0], "post": [0, 0, 0]},
"1.4583": {"pre": [0, 0, 0], "post": [0.1, 0, 0]},
"1.7917": {"pre": [0.1, 0, 0], "post": [0, 0, 0]},
"2.0833": {"pre": [0, 0, 0], "post": [0.1, 0, 0]}
}
},
"eyelid_right": {
"position": {
"0.0": [0, 0, 0],
"0.0417": {
"pre": [0, 0, 0],
"post": [-0.1, 0, 0]
},
"0.2083": {
"pre": [-0.1, 0, 0],
"post": [0, 0, 0]
},
"0.4583": {
"pre": [0, 0, 0],
"post": [-0.1, 0, 0]
},
"0.9583": {
"pre": [-0.1, 0, 0],
"post": [0, 0, 0]
},
"1.4583": {
"pre": [0, 0, 0],
"post": [-0.1, 0, 0]
},
"1.7917": {
"pre": [-0.1, 0, 0],
"post": [0, 0, 0]
},
"2.0833": {
"pre": [0, 0, 0],
"post": [-0.1, 0, 0]
}
"0.0417": {"pre": [0, 0, 0], "post": [-0.1, 0, 0]},
"0.2083": {"pre": [-0.1, 0, 0], "post": [0, 0, 0]},
"0.4583": {"pre": [0, 0, 0], "post": [-0.1, 0, 0]},
"0.9583": {"pre": [-0.1, 0, 0], "post": [0, 0, 0]},
"1.4583": {"pre": [0, 0, 0], "post": [-0.1, 0, 0]},
"1.7917": {"pre": [-0.1, 0, 0], "post": [0, 0, 0]},
"2.0833": {"pre": [0, 0, 0], "post": [-0.1, 0, 0]}
}
},
"body": {
@@ -1,578 +0,0 @@
{
"format_version": "1.12.0",
"minecraft:geometry": [
{
"description": {
"identifier": "geometry.marill",
"texture_width": 64,
"texture_height": 64,
"visible_bounds_width": 5,
"visible_bounds_height": 2.5,
"visible_bounds_offset": [0, 0.75, 0]
},
"bones": [
{
"name": "marill",
"pivot": [0, 0, 0]
},
{
"name": "locator_root",
"parent": "marill",
"pivot": [0, 0, 0],
"locators": {
"root": [0, 0, 0]
}
},
{
"name": "locator_top",
"parent": "marill",
"pivot": [0, 17.35, 0],
"locators": {
"top": [0, 17.35, 0]
}
},
{
"name": "body",
"parent": "marill",
"pivot": [0, 8, 0]
},
{
"name": "locator_target",
"parent": "body",
"pivot": [0, 8, -8],
"locators": {
"target": [0, 8, -8]
}
},
{
"name": "locator_middle",
"parent": "body",
"pivot": [0, 8, 0],
"locators": {
"middle": [0, 8, 0]
}
},
{
"name": "torso",
"parent": "body",
"pivot": [0, 2, 0],
"cubes": [
{"origin": [-6.5, 1, -6.5], "size": [13, 14, 13], "uv": [0, 0]}
]
},
{
"name": "locator_mouth",
"parent": "torso",
"pivot": [0, 10.25, -6.5],
"locators": {
"mouth": [0, 10.25, -6.5],
"special": [0, 10.25, -6.5]
}
},
{
"name": "locator_item_face",
"parent": "torso",
"pivot": [0, 12.25, -6.5],
"locators": {
"item_face": [0, 12.25, -6.5]
}
},
{
"name": "locator_face",
"parent": "torso",
"pivot": [0, 12.25, -6.5],
"locators": {
"face": [0, 12.25, -6.5]
}
},
{
"name": "locator_item_hat",
"parent": "torso",
"pivot": [0, 15, 0],
"locators": {
"item_hat": [0, 15, 0]
}
},
{
"name": "locator_head",
"parent": "torso",
"pivot": [0, 15, -4],
"locators": {
"head": [0, 15, -4]
}
},
{
"name": "tail",
"parent": "torso",
"pivot": [0, 2.5, 6.5],
"cubes": [
{"origin": [0, 2, 4.5], "size": [0, 1, 6], "inflate": 0.01, "uv": [30, 25]}
]
},
{
"name": "tail2",
"parent": "tail",
"pivot": [0, 2.5, 10.5],
"cubes": [
{"origin": [0, 2, 10.5], "size": [0, 1, 3], "uv": [34, 29]}
]
},
{
"name": "tail3",
"parent": "tail2",
"pivot": [0, 2.5, 13.5],
"cubes": [
{"origin": [0, 2, 13.5], "size": [0, 1, 3], "inflate": 0.01, "uv": [30, 27]}
]
},
{
"name": "locator_tail",
"parent": "tail3",
"pivot": [0, 2.5, 15],
"rotation": [180, 0, -180],
"locators": {
"tail": [0, 2.5, 15]
}
},
{
"name": "tail4",
"parent": "tail3",
"pivot": [0, 2.5, 16.5],
"cubes": [
{"origin": [0, 2, 16.5], "size": [0, 1, 3], "uv": [36, 27]}
]
},
{
"name": "tail5",
"parent": "tail4",
"pivot": [0, 2.5, 19.5],
"cubes": [
{"origin": [0, 2, 19.5], "size": [0, 1, 2], "inflate": 0.01, "uv": [30, 27]}
]
},
{
"name": "tail6",
"parent": "tail5",
"pivot": [0, 2.5, 21.5],
"cubes": [
{"origin": [0, 2, 21.5], "size": [0, 1, 2], "uv": [30, 30]}
]
},
{
"name": "tail7",
"parent": "tail6",
"pivot": [0, 2.5, 23.5],
"cubes": [
{"origin": [0, 2, 23.5], "size": [0, 1, 4], "inflate": 0.01, "uv": [34, 25]}
]
},
{
"name": "tail_ball",
"parent": "tail7",
"pivot": [0, 2.5, 25.5],
"cubes": [
{"origin": [-3.5, -1, 25.5], "size": [7, 7, 7], "uv": [36, 27]}
]
},
{
"name": "locator_tail_tip",
"parent": "tail_ball",
"pivot": [0, 2.5, 32.5],
"rotation": [180, 0, -180],
"locators": {
"tail_tip": [0, 2.5, 32.5]
}
},
{
"name": "locator_physical",
"parent": "tail_ball",
"pivot": [0, 2.5, 29],
"locators": {
"physical": [0, 2.5, 29]
}
},
{
"name": "tail_ball_active",
"parent": "tail_ball",
"pivot": [0, 2.5, 29],
"cubes": [
{"origin": [-3.5, -1, 25.5], "size": [7, 7, 7], "inflate": -0.1, "uv": [36, 42]}
]
},
{
"name": "ears",
"parent": "torso",
"pivot": [0, 15, 0.01]
},
{
"name": "ear_left",
"parent": "ears",
"pivot": [4, 15, 0],
"cubes": [
{"origin": [2.5, 13.5, 0], "size": [7, 6, 0], "uv": [49, 58]}
]
},
{
"name": "ear_right",
"parent": "ears",
"pivot": [-4, 15, 0],
"cubes": [
{"origin": [-9.5, 13.5, 0], "size": [7, 6, 0], "uv": [33, 58]}
]
},
{
"name": "face",
"parent": "torso",
"pivot": [0, 11.75, -6.54]
},
{
"name": "eyes",
"parent": "face",
"pivot": [0, 11.75, -6.54]
},
{
"name": "eye_left",
"parent": "eyes",
"pivot": [3, 12.25, -6.52],
"cubes": [
{"origin": [2, 11.25, -6.52], "size": [2, 2, 0], "uv": [6, 29]}
]
},
{
"name": "locator_eye_left",
"parent": "eye_left",
"pivot": [3, 12.25, -6.45],
"locators": {
"eye2": [3, 12.25, -6.45]
}
},
{
"name": "eyeshine_left",
"parent": "eye_left",
"pivot": [2.75, 12.5, -6.54],
"cubes": [
{"origin": [2.25, 12, -6.54], "size": [1, 1, 0], "uv": [14, 29]}
]
},
{
"name": "eyebrow_left",
"parent": "eye_left",
"pivot": [3, 13.25, -6.46],
"cubes": [
{"origin": [1.5, 12.75, -6.46], "size": [3, 1, 0], "uv": [8, 54]}
]
},
{
"name": "eyebrow_small_left",
"parent": "eye_left",
"pivot": [2.25, 13, -6.46],
"cubes": [
{"origin": [1.75, 12.5, -6.46], "size": [1, 1, 0], "uv": [11, 51]}
]
},
{
"name": "eye_left_happy",
"parent": "eyes",
"pivot": [3, 12.25, -6.42],
"cubes": [
{"origin": [1.5, 11.25, -6.42], "size": [3, 2, 0], "uv": [8, 46]}
]
},
{
"name": "eye_left_hurt",
"parent": "eyes",
"pivot": [3, 12.25, -6.42],
"cubes": [
{"origin": [2, 11.25, -6.42], "size": [2, 2, 0], "uv": [6, 51]}
]
},
{
"name": "eyelid_left",
"parent": "eyes",
"pivot": [3, 11.75, -6.42],
"cubes": [
{"origin": [2, 11.25, -6.42], "size": [2, 1, 0], "uv": [6, 49]}
]
},
{
"name": "eye_right",
"parent": "eyes",
"pivot": [-3, 12.25, -6.52],
"cubes": [
{"origin": [-4, 11.25, -6.52], "size": [2, 2, 0], "uv": [1, 29]}
]
},
{
"name": "locator_eye_right",
"parent": "eye_right",
"pivot": [-3, 12.25, -6.45],
"locators": {
"eye1": [-3, 12.25, -6.45]
}
},
{
"name": "eyeshine_right",
"parent": "eye_right",
"pivot": [-2.75, 12.5, -6.54],
"cubes": [
{"origin": [-3.25, 12, -6.54], "size": [1, 1, 0], "uv": [11, 29]}
]
},
{
"name": "eyebrow_right",
"parent": "eye_right",
"pivot": [-3, 13.25, -6.46],
"cubes": [
{"origin": [-4.5, 12.75, -6.46], "size": [3, 1, 0], "uv": [1, 54]}
]
},
{
"name": "eyebrow_small_right",
"parent": "eye_right",
"pivot": [-2.25, 13, -6.46],
"cubes": [
{"origin": [-2.75, 12.5, -6.46], "size": [1, 1, 0], "uv": [11, 49]}
]
},
{
"name": "eye_right_happy",
"parent": "eyes",
"pivot": [-3, 12.25, -6.42],
"cubes": [
{"origin": [-4.5, 11.25, -6.42], "size": [3, 2, 0], "uv": [1, 46]}
]
},
{
"name": "eye_right_hurt",
"parent": "eyes",
"pivot": [-3, 12.25, -6.42],
"cubes": [
{"origin": [-4, 11.25, -6.42], "size": [2, 2, 0], "uv": [1, 51]}
]
},
{
"name": "eyelid_right",
"parent": "eyes",
"pivot": [-3, 11.75, -6.42],
"cubes": [
{"origin": [-4, 11.25, -6.42], "size": [2, 1, 0], "uv": [1, 49]}
]
},
{
"name": "mouth",
"parent": "face",
"pivot": [0, 10.375, -6.52]
},
{
"name": "mouth_closed_smile",
"parent": "mouth",
"pivot": [0, 10.375, -6.52],
"cubes": [
{"origin": [-2, 10, -6.52], "size": [4, 1, 0], "uv": [1, 38]},
{"origin": [-1, 9.75, -6.52], "size": [2, 1, 0], "inflate": 0.01, "uv": [10, 38]}
]
},
{
"name": "mouth_closed_frown",
"parent": "mouth",
"pivot": [0, 10.41667, -6.42],
"cubes": [
{"origin": [-2, 9.75, -6.42], "size": [4, 1, 0], "uv": [1, 40]},
{"origin": [-1, 10, -6.42], "size": [2, 1, 0], "uv": [10, 40]}
]
},
{
"name": "mouth_closed_frown_small",
"parent": "mouth",
"pivot": [0, 10.25, -6.42],
"cubes": [
{"origin": [-1.5, 9.5, -6.42], "size": [3, 1, 0], "uv": [1, 44]},
{"origin": [-0.5, 10, -6.42], "size": [1, 1, 0], "uv": [8, 44]}
]
},
{
"name": "mouth_closed_straight",
"parent": "mouth",
"pivot": [0, 10.25, -6.42],
"cubes": [
{"origin": [-2, 9.75, -6.42], "size": [4, 1, 0], "uv": [1, 42]}
]
},
{
"name": "mouth_open",
"parent": "mouth",
"pivot": [0, 10, -6.42],
"cubes": [
{"origin": [-1, 9, -6.42], "size": [2, 2, 0], "uv": [10, 32]}
]
},
{
"name": "mouth_open_big",
"parent": "mouth",
"pivot": [0, 10, -6.42],
"cubes": [
{"origin": [-2, 9, -6.42], "size": [4, 2, 0], "uv": [1, 32]}
]
},
{
"name": "mouth_open_small",
"parent": "mouth",
"pivot": [0, 10.25, -6.42],
"cubes": [
{"origin": [-1, 9.75, -6.42], "size": [2, 1, 0], "uv": [10, 35]}
]
},
{
"name": "mouth_open_smile",
"parent": "mouth",
"pivot": [0, 10, -6.44],
"cubes": [
{"origin": [-1, 9, -6.44], "size": [2, 1, 0], "uv": [2, 36]},
{"origin": [-1.5, 10, -6.44], "size": [3, 1, 0], "uv": [1, 35]}
]
},
{
"name": "locator_jaw_upper",
"parent": "mouth",
"pivot": [0, 11.1, -6.5],
"locators": {
"jaw1": [0, 11.1, -6.5]
}
},
{
"name": "locator_jaw_lower",
"parent": "mouth",
"pivot": [0, 9.05, -6.5],
"locators": {
"jaw2": [0, 9.05, -6.5]
}
},
{
"name": "nose",
"parent": "face",
"pivot": [0, 12, -6.53],
"cubes": [
{"origin": [-1, 11.75, -6.54], "size": [2, 1, 0], "uv": [10, 42]},
{"origin": [-0.5, 11.25, -6.52], "size": [1, 1, 0], "uv": [11, 44]}
]
},
{
"name": "arms",
"parent": "torso",
"pivot": [0, 8, -4]
},
{
"name": "arm_left",
"parent": "arms",
"pivot": [6.25, 8, -4],
"cubes": [
{"origin": [5.25, 7, -7], "size": [2, 2, 4], "uv": [0, 6]}
]
},
{
"name": "hand_left",
"parent": "arm_left",
"pivot": [6.25, 8.05, -7],
"cubes": [
{"origin": [5.25, 7, -9], "size": [2, 2, 2], "inflate": 0.02, "uv": [52, 14]}
]
},
{
"name": "locator_hand_secondary",
"parent": "hand_left",
"pivot": [6.2, 8, -8],
"locators": {
"hand_secondary": [6.2, 8, -8]
}
},
{
"name": "arm_right",
"parent": "arms",
"pivot": [-6.25, 8, -4],
"cubes": [
{"origin": [-7.25, 7, -7], "size": [2, 2, 4], "uv": [0, 0]}
]
},
{
"name": "hand_right",
"parent": "arm_right",
"pivot": [-6.25, 7.8, -7],
"cubes": [
{"origin": [-7.25, 7, -9], "size": [2, 2, 2], "inflate": 0.02, "uv": [52, 10]}
]
},
{
"name": "locator_hand_primary",
"parent": "hand_right",
"pivot": [-6.2, 8, -8],
"locators": {
"hand_primary": [-6.2, 8, -8]
}
},
{
"name": "locator_item",
"parent": "hand_right",
"pivot": [-6.2, 8, -9],
"locators": {
"item": [-6.2, 8, -9]
}
},
{
"name": "feet",
"parent": "body",
"pivot": [0, 1, 2]
},
{
"name": "foot_left",
"parent": "feet",
"pivot": [3, 1, 2],
"cubes": [
{"origin": [1.5, 0, -1], "size": [3, 2, 4], "uv": [39, 6]}
]
},
{
"name": "locator_foot_secondary",
"parent": "foot_left",
"pivot": [3.025, 0.5, 0],
"rotation": [90, 0, 0],
"locators": {
"foot_secondary": [3.025, 0.5, 0]
}
},
{
"name": "toes_left",
"parent": "foot_left",
"pivot": [3, 1, -1],
"cubes": [
{"origin": [1.5, 0, -3], "size": [3, 2, 2], "inflate": 0.02, "uv": [49, 6]}
]
},
{
"name": "foot_right",
"parent": "feet",
"pivot": [-3, 1, 2],
"cubes": [
{"origin": [-4.5, 0, -1], "size": [3, 2, 4], "uv": [39, 0]}
]
},
{
"name": "locator_foot_primary",
"parent": "foot_right",
"pivot": [-3.025, 0.5, 0],
"rotation": [90, 0, 0],
"locators": {
"foot_primary": [-3.025, 0.5, 0]
}
},
{
"name": "toes_right",
"parent": "foot_right",
"pivot": [-3, 1, -1],
"cubes": [
{"origin": [-4.5, 0, -3], "size": [3, 2, 2], "inflate": 0.02, "uv": [49, 0]}
]
}
]
}
]
}
@@ -1,593 +0,0 @@
{
"format_version": "1.12.0",
"minecraft:geometry": [
{
"description": {
"identifier": "geometry.azumarill",
"texture_width": 64,
"texture_height": 64,
"visible_bounds_width": 5,
"visible_bounds_height": 3.5,
"visible_bounds_offset": [0, 1.25, 0]
},
"bones": [
{
"name": "azumarill",
"pivot": [0, 0, 0]
},
{
"name": "locator_root",
"parent": "azumarill",
"pivot": [0, 0, 0],
"locators": {
"root": [0, 0, 0]
}
},
{
"name": "locator_top",
"parent": "azumarill",
"pivot": [0, 21.35, 0],
"locators": {
"top": [0, 21.35, 0]
}
},
{
"name": "body",
"parent": "azumarill",
"pivot": [0, 10, 0]
},
{
"name": "locator_target",
"parent": "body",
"pivot": [0, 10, -8],
"locators": {
"target": [0, 10, -8]
}
},
{
"name": "locator_middle",
"parent": "body",
"pivot": [0, 10, 0],
"locators": {
"middle": [0, 10, 0]
}
},
{
"name": "torso",
"parent": "body",
"pivot": [0, 2.5, 0],
"cubes": [
{"origin": [-6, 1.5, -6], "size": [12, 17, 12], "uv": [0, 0]}
]
},
{
"name": "locator_head",
"parent": "torso",
"pivot": [0, 18.5, -4],
"locators": {
"head": [0, 18.5, -4]
}
},
{
"name": "locator_item_hat",
"parent": "torso",
"pivot": [0, 18.5, 0],
"locators": {
"item_hat": [0, 18.5, 0]
}
},
{
"name": "locator_face",
"parent": "torso",
"pivot": [0, 15.5, -6],
"locators": {
"face": [0, 15.5, -6]
}
},
{
"name": "locator_item_face",
"parent": "torso",
"pivot": [0, 15.5, -6],
"locators": {
"item_face": [0, 15.5, -6]
}
},
{
"name": "locator_mouth",
"parent": "torso",
"pivot": [0, 13.25, -6],
"locators": {
"mouth": [0, 13.25, -6],
"special": [0, 13.25, -6]
}
},
{
"name": "tail",
"parent": "torso",
"pivot": [0, 4, 6],
"cubes": [
{"origin": [0, 3.5, 4], "size": [0, 1, 4], "uv": [55, 40]}
]
},
{
"name": "tail2",
"parent": "tail",
"pivot": [0, 4, 8],
"cubes": [
{"origin": [0, 3.5, 8], "size": [0, 1, 3], "inflate": 0.01, "uv": [56, 40]}
]
},
{
"name": "tail3",
"parent": "tail2",
"pivot": [0, 4, 11],
"cubes": [
{"origin": [0, 3.5, 11], "size": [0, 1, 3], "uv": [56, 39]}
]
},
{
"name": "tail4",
"parent": "tail3",
"pivot": [0, 4, 14],
"cubes": [
{"origin": [0, 3.5, 14], "size": [0, 1, 3], "inflate": 0.01, "uv": [56, 38]}
]
},
{
"name": "locator_tail",
"parent": "tail4",
"pivot": [0, 4, 15.5],
"rotation": [180, 0, -180],
"locators": {
"tail": [0, 4, 15.5]
}
},
{
"name": "tail5",
"parent": "tail4",
"pivot": [0, 4, 17],
"cubes": [
{"origin": [0, 3.5, 17], "size": [0, 1, 3], "uv": [56, 37]}
]
},
{
"name": "tail6",
"parent": "tail5",
"pivot": [0, 4, 20],
"cubes": [
{"origin": [0, 3.5, 20], "size": [0, 1, 3], "inflate": 0.01, "uv": [56, 36]}
]
},
{
"name": "tail7",
"parent": "tail6",
"pivot": [0, 4, 23],
"cubes": [
{"origin": [0, 3.5, 23], "size": [0, 1, 3], "uv": [56, 35]}
]
},
{
"name": "tail_ball",
"parent": "tail7",
"pivot": [0, 4, 25],
"cubes": [
{"origin": [-2.5, 1.5, 25], "size": [5, 5, 5], "uv": [44, 26]}
]
},
{
"name": "locator_tail_tip",
"parent": "tail_ball",
"pivot": [0, 4, 30],
"rotation": [180, 0, -180],
"locators": {
"tail_tip": [0, 4, 30]
}
},
{
"name": "locator_physical",
"parent": "tail_ball",
"pivot": [0, 4, 27.5],
"locators": {
"physical": [0, 4, 27.5]
}
},
{
"name": "tail_ball_active",
"parent": "tail_ball",
"pivot": [0, 4, 27.5],
"cubes": [
{"origin": [-2.5, 1.5, 25], "size": [5, 5, 5], "inflate": -0.1, "uv": [23, 30]}
]
},
{
"name": "ears",
"parent": "torso",
"pivot": [0, 17.5, 0]
},
{
"name": "ear_left",
"parent": "ears",
"pivot": [4.5, 17.5, 0],
"cubes": [
{"origin": [2.5, 16, 0], "size": [4, 8, 0], "uv": [54, 55]}
]
},
{
"name": "ear_left2",
"parent": "ear_left",
"pivot": [4.5, 24, 0],
"cubes": [
{"origin": [2, 24, 0], "size": [5, 7, 0], "uv": [53, 47]}
]
},
{
"name": "ear_right",
"parent": "ears",
"pivot": [-4.5, 17.5, 0],
"cubes": [
{"origin": [-6.5, 16, 0], "size": [4, 8, 0], "uv": [42, 55]}
]
},
{
"name": "ear_right2",
"parent": "ear_right",
"pivot": [-4.5, 24, 0],
"cubes": [
{"origin": [-7, 24, 0], "size": [5, 7, 0], "uv": [41, 47]}
]
},
{
"name": "arms",
"parent": "torso",
"pivot": [0, 9, 0]
},
{
"name": "arm_left",
"parent": "arms",
"pivot": [5.5, 9, 0],
"cubes": [
{"origin": [4, 8, -1.5], "size": [6, 2, 3], "uv": [45, 7]}
]
},
{
"name": "hand_left",
"parent": "arm_left",
"pivot": [10, 9, 0],
"cubes": [
{"origin": [10, 8, -1.5], "size": [3, 2, 3], "inflate": 0.02, "uv": [0, 5]}
]
},
{
"name": "locator_hand_secondary",
"parent": "hand_left",
"pivot": [12, 9, 0],
"locators": {
"hand_secondary": [12, 9, 0]
}
},
{
"name": "arm_right",
"parent": "arms",
"pivot": [-5.5, 9, 0],
"cubes": [
{"origin": [-10, 8, -1.5], "size": [6, 2, 3], "uv": [45, 2]}
]
},
{
"name": "hand_right",
"parent": "arm_right",
"pivot": [-10, 9, 0],
"cubes": [
{"origin": [-13, 8, -1.5], "size": [3, 2, 3], "inflate": 0.02, "uv": [0, 0]}
]
},
{
"name": "locator_hand_primary",
"parent": "hand_right",
"pivot": [-12, 9, 0],
"locators": {
"hand_primary": [-12, 9, 0]
}
},
{
"name": "locator_item",
"parent": "hand_right",
"pivot": [-12.5, 8, 0],
"locators": {
"item": [-12.5, 8, 0]
}
},
{
"name": "face",
"parent": "torso",
"pivot": [0, 15.5, -6.02]
},
{
"name": "eyes",
"parent": "face",
"pivot": [0, 15.5, -6.02]
},
{
"name": "eye_left",
"parent": "eyes",
"pivot": [3, 15.5, -6.02],
"cubes": [
{"origin": [2, 14.5, -6.02], "size": [2, 2, 0], "uv": [6, 30]}
]
},
{
"name": "locator_eye_left",
"parent": "eye_left",
"pivot": [3, 15.5, -5.95],
"locators": {
"eye2": [3, 15.5, -5.95]
}
},
{
"name": "eye_shine_left",
"parent": "eye_left",
"pivot": [2.75, 15.75, -6.04],
"cubes": [
{"origin": [2.25, 15.25, -6.04], "size": [1, 1, 0], "uv": [14, 30]}
]
},
{
"name": "eyebrow_left",
"parent": "eye_left",
"pivot": [3, 16.5, -5.96],
"cubes": [
{"origin": [1.5, 16, -5.96], "size": [3, 1, 0], "uv": [8, 56]}
]
},
{
"name": "eyebrow_left_small",
"parent": "eye_left",
"pivot": [2.25, 16.25, -5.96],
"cubes": [
{"origin": [1.75, 15.75, -5.96], "size": [1, 1, 0], "uv": [11, 50]}
]
},
{
"name": "eye_left_happy",
"parent": "eyes",
"pivot": [3, 15.5, -5.92],
"cubes": [
{"origin": [1.5, 14.5, -5.92], "size": [3, 2, 0], "uv": [8, 47]}
]
},
{
"name": "eye_left_hurt",
"parent": "eyes",
"pivot": [3, 15.5, -5.92],
"cubes": [
{"origin": [2, 14.5, -5.92], "size": [2, 2, 0], "uv": [6, 53]}
]
},
{
"name": "eyelid_left",
"parent": "eyes",
"pivot": [3, 15.5, -5.92],
"cubes": [
{"origin": [2, 14.5, -5.92], "size": [2, 2, 0], "uv": [6, 50]}
]
},
{
"name": "eye_right",
"parent": "eyes",
"pivot": [-3, 15.5, -6.02],
"cubes": [
{"origin": [-4, 14.5, -6.02], "size": [2, 2, 0], "uv": [1, 30]}
]
},
{
"name": "locator_eye_right",
"parent": "eye_right",
"pivot": [-3, 15.5, -5.95],
"locators": {
"eye1": [-3, 15.5, -5.95]
}
},
{
"name": "eye_shine_right",
"parent": "eye_right",
"pivot": [-2.75, 15.75, -6.04],
"cubes": [
{"origin": [-3.25, 15.25, -6.04], "size": [1, 1, 0], "uv": [11, 30]}
]
},
{
"name": "eyebrow_right",
"parent": "eye_right",
"pivot": [-3, 16.5, -5.96],
"cubes": [
{"origin": [-4.5, 16, -5.96], "size": [3, 1, 0], "uv": [1, 56]}
]
},
{
"name": "eyebrow_right_small",
"parent": "eye_right",
"pivot": [-2.25, 16.25, -5.96],
"cubes": [
{"origin": [-2.75, 15.75, -5.96], "size": [1, 1, 0], "uv": [11, 53]}
]
},
{
"name": "eye_right_happy",
"parent": "eyes",
"pivot": [-3, 15.5, -5.92],
"cubes": [
{"origin": [-4.5, 14.5, -5.92], "size": [3, 2, 0], "uv": [1, 47]}
]
},
{
"name": "eye_right_hurt",
"parent": "eyes",
"pivot": [-3, 15.5, -5.92],
"cubes": [
{"origin": [-4, 14.5, -5.92], "size": [2, 2, 0], "uv": [1, 53]}
]
},
{
"name": "eyelid_right",
"parent": "eyes",
"pivot": [-3, 15.5, -5.92],
"cubes": [
{"origin": [-4, 14.5, -5.92], "size": [2, 2, 0], "uv": [1, 50]}
]
},
{
"name": "nose",
"parent": "face",
"pivot": [0, 14.75, -6.03],
"cubes": [
{"origin": [-1, 15, -6.04], "size": [2, 1, 0], "uv": [10, 43]},
{"origin": [-0.5, 14.5, -6.02], "size": [1, 1, 0], "uv": [11, 45]}
]
},
{
"name": "mouth",
"parent": "face",
"pivot": [0, 13.5, -6.02]
},
{
"name": "mouth_closed_smile",
"parent": "mouth",
"pivot": [0, 13.5, -6.02],
"cubes": [
{"origin": [-1, 12.75, -6.02], "size": [2, 1, 0], "uv": [10, 39]},
{"origin": [-2, 13.25, -6.02], "size": [4, 1, 0], "uv": [1, 39]}
]
},
{
"name": "mouth_closed_frown",
"parent": "mouth",
"pivot": [0, 13.5, -5.92],
"cubes": [
{"origin": [-1, 13.25, -5.92], "size": [2, 1, 0], "uv": [10, 41]},
{"origin": [-2, 12.75, -5.92], "size": [4, 1, 0], "uv": [1, 41]}
]
},
{
"name": "mouth_closed_frown_small",
"parent": "mouth",
"pivot": [0, 13.5, -5.92],
"cubes": [
{"origin": [-0.5, 13.25, -5.92], "size": [1, 1, 0], "uv": [8, 45]},
{"origin": [-1.5, 12.75, -5.92], "size": [3, 1, 0], "uv": [1, 45]}
]
},
{
"name": "mouth_straight",
"parent": "mouth",
"pivot": [0, 13.5, -5.92],
"cubes": [
{"origin": [-2, 13, -5.92], "size": [4, 1, 0], "uv": [1, 43]}
]
},
{
"name": "mouth_open",
"parent": "mouth",
"pivot": [0, 13.25, -5.92],
"cubes": [
{"origin": [-1, 12.25, -5.92], "size": [2, 2, 0], "uv": [10, 33]}
]
},
{
"name": "mouth_open_big",
"parent": "mouth",
"pivot": [0, 13.25, -5.92],
"cubes": [
{"origin": [-2, 12.25, -5.92], "size": [4, 2, 0], "uv": [1, 33]}
]
},
{
"name": "mouth_open_small",
"parent": "mouth",
"pivot": [0, 13.5, -5.92],
"cubes": [
{"origin": [-1, 13, -5.92], "size": [2, 1, 0], "uv": [10, 36]}
]
},
{
"name": "mouth_open_smile",
"parent": "mouth",
"pivot": [0, 13.25, -5.92],
"cubes": [
{"origin": [-2, 12.25, -5.92], "size": [4, 2, 0], "uv": [1, 36]}
]
},
{
"name": "locator_jaw_upper",
"parent": "mouth",
"pivot": [0, 14.4, -6],
"locators": {
"jaw1": [0, 14.4, -6]
}
},
{
"name": "locator_jaw_lower",
"parent": "mouth",
"pivot": [0, 12.1, -6],
"locators": {
"jaw2": [0, 12.1, -6]
}
},
{
"name": "feet",
"parent": "body",
"pivot": [0, 1.5, 1.5]
},
{
"name": "foot_left",
"parent": "feet",
"pivot": [3, 1.5, 1.5],
"cubes": [
{"origin": [1.5, 0, -2], "size": [3, 2, 5], "uv": [48, 12], "mirror": true}
]
},
{
"name": "locator_foot_secondary",
"parent": "foot_left",
"pivot": [3.025, 0.5, -1],
"rotation": [90, 0, 0],
"locators": {
"foot_secondary": [3.025, 0.5, -1]
}
},
{
"name": "toes_left",
"parent": "foot_left",
"pivot": [3, 0, -2],
"cubes": [
{"origin": [1.5, 0, -5], "size": [3, 2, 3], "inflate": 0.02, "uv": [36, 0], "mirror": true}
]
},
{
"name": "foot_right",
"parent": "feet",
"pivot": [-3, 1.5, 1.5],
"cubes": [
{"origin": [-4.5, 0, -2], "size": [3, 2, 5], "uv": [48, 12]}
]
},
{
"name": "locator_foot_primary",
"parent": "foot_right",
"pivot": [-3.025, 0.5, -1],
"rotation": [90, 0, 0],
"locators": {
"foot_primary": [-3.025, 0.5, -1]
}
},
{
"name": "toes_right",
"parent": "foot_right",
"pivot": [-3, 0, -2],
"cubes": [
{"origin": [-4.5, 0, -5], "size": [3, 2, 3], "inflate": 0.02, "uv": [36, 0]}
]
}
]
}
]
}
@@ -1,483 +0,0 @@
{
"format_version": "1.12.0",
"minecraft:geometry": [
{
"description": {
"identifier": "geometry.azurill",
"texture_width": 64,
"texture_height": 32,
"visible_bounds_width": 5,
"visible_bounds_height": 3.5,
"visible_bounds_offset": [0, 1.25, 0]
},
"bones": [
{
"name": "azurill",
"pivot": [0, 0, 0]
},
{
"name": "locator_root",
"parent": "azurill",
"pivot": [0, 0, 0],
"locators": {
"root": [0, 0, 0]
}
},
{
"name": "locator_top",
"parent": "azurill",
"pivot": [0, 11.35, 0],
"locators": {
"top": [0, 11.35, 0]
}
},
{
"name": "body",
"parent": "azurill",
"pivot": [0, 4, 0]
},
{
"name": "locator_target",
"parent": "body",
"pivot": [0, 4.75, -6],
"locators": {
"target": [0, 4.75, -6]
}
},
{
"name": "locator_middle",
"parent": "body",
"pivot": [0, 5, 0],
"locators": {
"middle": [0, 5, 0]
}
},
{
"name": "torso",
"parent": "body",
"pivot": [0, 1.5, 0]
},
{
"name": "tail",
"parent": "torso",
"pivot": [0, 2.5, 4.5],
"rotation": [-45, 0, 0],
"cubes": [
{"origin": [0, 1, 4], "size": [0, 5, 1], "inflate": 0.01, "uv": [35, 13]}
]
},
{
"name": "tail2",
"parent": "tail",
"pivot": [0, 6, 4.5],
"cubes": [
{"origin": [0, 6, 4], "size": [0, 3, 1], "uv": [37, 15]}
]
},
{
"name": "tail3",
"parent": "tail2",
"pivot": [0, 9, 4.5],
"cubes": [
{"origin": [0, 9, 4], "size": [0, 3, 1], "inflate": 0.01, "uv": [37, 12]}
]
},
{
"name": "tail4",
"parent": "tail3",
"pivot": [0, 12, 4.5],
"cubes": [
{"origin": [0, 12, 4], "size": [0, 3, 1], "uv": [39, 15]}
]
},
{
"name": "locator_tail",
"parent": "tail4",
"pivot": [0, 13.5, 4.5],
"rotation": [180, 0, -180],
"locators": {
"tail": [0, 13.5, 4.5]
}
},
{
"name": "tail5",
"parent": "tail4",
"pivot": [0, 15, 4.5],
"cubes": [
{"origin": [0, 15, 4], "size": [0, 3, 1], "inflate": 0.01, "uv": [39, 12]}
]
},
{
"name": "tail6",
"parent": "tail5",
"pivot": [0, 18, 4.5],
"cubes": [
{"origin": [0, 18, 4], "size": [0, 3, 1], "uv": [41, 15]}
]
},
{
"name": "tail7",
"parent": "tail6",
"pivot": [0, 21, 4.5],
"cubes": [
{"origin": [0, 21, 4], "size": [0, 2, 1], "inflate": 0.01, "uv": [41, 13]}
]
},
{
"name": "tail8",
"parent": "tail7",
"pivot": [0, 23, 4.5],
"cubes": [
{"origin": [0, 23, 4], "size": [0, 3, 1], "uv": [43, 15]}
]
},
{
"name": "tail_ball",
"parent": "tail8",
"pivot": [0, 25, 4.5]
},
{
"name": "tail_ball_scale",
"parent": "tail_ball",
"pivot": [0, 29, 4.5],
"cubes": [
{"origin": [-4, 25, 0.5], "size": [8, 8, 8], "inflate": -0.02, "uv": [0, 16]}
]
},
{
"name": "locator_tail_tip",
"parent": "tail_ball_scale",
"pivot": [0, 33, 4.5],
"rotation": [180, 0, -180],
"locators": {
"tail_tip": [0, 33, 4.5]
}
},
{
"name": "torso2",
"parent": "torso",
"pivot": [0, 1.5, 0],
"cubes": [
{"origin": [-4, 0.5, -4], "size": [8, 8, 8], "uv": [0, 0]}
]
},
{
"name": "locator_head",
"parent": "torso2",
"pivot": [0, 8.5, -2.5],
"locators": {
"head": [0, 8.5, -2.5],
"physical": [0, 8.5, -2.5]
}
},
{
"name": "locator_item_hat",
"parent": "torso2",
"pivot": [0, 8.5, 0],
"locators": {
"item_hat": [0, 8.5, 0]
}
},
{
"name": "locator_face",
"parent": "torso2",
"pivot": [0, 5.5, -4],
"locators": {
"face": [0, 5.5, -4]
}
},
{
"name": "locator_item_face",
"parent": "torso2",
"pivot": [0, 5.5, -4],
"locators": {
"item_face": [0, 5.5, -4]
}
},
{
"name": "locator_mouth",
"parent": "torso2",
"pivot": [0, 3.75, -4],
"locators": {
"mouth": [0, 3.75, -4],
"special": [0, 3.75, -4]
}
},
{
"name": "locator_item",
"parent": "torso2",
"pivot": [0, 3.75, -4],
"locators": {
"item": [0, 3.75, -4]
}
},
{
"name": "ears",
"parent": "torso2",
"pivot": [0, 7.45642, -0.4981]
},
{
"name": "ear_left",
"parent": "ears",
"pivot": [3, 8.5, 0],
"cubes": [
{"origin": [1.5, 7, 0], "size": [5, 4, 0], "uv": [34, 27]}
]
},
{
"name": "ear_right",
"parent": "ears",
"pivot": [-3, 8.5, 0],
"cubes": [
{"origin": [-6.5, 7, 0], "size": [5, 4, 0], "uv": [34, 21]}
]
},
{
"name": "tail_bump",
"parent": "torso2",
"pivot": [0, 0.5, 4],
"rotation": [-35, 0, 0],
"cubes": [
{"origin": [-1.5, 0.5, 2], "size": [3, 2, 2], "uv": [24, 16]}
]
},
{
"name": "mouth",
"parent": "torso2",
"pivot": [0, 3.75, -4.02]
},
{
"name": "mouth_closed",
"parent": "mouth",
"pivot": [0, 3.75, -4.02],
"cubes": [
{"origin": [-1, 3.25, -4.02], "size": [2, 1, 0], "uv": [33, 11]}
]
},
{
"name": "mouth_closed_smile",
"parent": "mouth",
"pivot": [0, 3.75, -3.92],
"cubes": [
{"origin": [-1, 3.25, -3.92], "size": [2, 1, 0], "uv": [33, 7]},
{"origin": [-0.5, 3.75, -3.94], "size": [1, 1, 0], "uv": [38, 7]}
]
},
{
"name": "mouth_closed_frown",
"parent": "mouth",
"pivot": [0, 3.75, -3.92],
"cubes": [
{"origin": [-1, 3.25, -3.92], "size": [2, 1, 0], "uv": [33, 9]},
{"origin": [-0.5, 2.75, -3.94], "size": [1, 1, 0], "uv": [38, 9]}
]
},
{
"name": "mouth_open",
"parent": "mouth",
"pivot": [0, 3.75, -3.92],
"cubes": [
{"origin": [-1, 3.25, -3.92], "size": [2, 1, 0], "uv": [51, 1]}
]
},
{
"name": "mouth_open_tall",
"parent": "mouth",
"pivot": [0, 3.75, -3.9],
"cubes": [
{"origin": [-0.5, 2.75, -3.92], "size": [1, 2, 0], "uv": [51, 6]}
]
},
{
"name": "mouth_open_small",
"parent": "mouth",
"pivot": [0, 3.75, -3.92],
"cubes": [
{"origin": [-0.5, 3.25, -3.92], "size": [1, 1, 0], "uv": [54, 6]}
]
},
{
"name": "mouth_open_happy",
"parent": "mouth",
"pivot": [0, 3.75, -3.92],
"cubes": [
{"origin": [-1.5, 3.25, -3.92], "size": [3, 1, 0], "uv": [51, 3]},
{"origin": [-1, 2.25, -3.92], "size": [2, 1, 0], "uv": [51, 4]}
]
},
{
"name": "locator_jaw_upper",
"parent": "mouth",
"pivot": [0, 4.5, -4],
"locators": {
"jaw1": [0, 4.5, -4]
}
},
{
"name": "locator_jaw_lower",
"parent": "mouth",
"pivot": [0, 2.75, -4],
"locators": {
"jaw2": [0, 2.75, -4]
}
},
{
"name": "eyes",
"parent": "torso2",
"pivot": [0, 5.5, -4]
},
{
"name": "eye_left",
"parent": "eyes",
"pivot": [2, 5.49996, -4.02],
"cubes": [
{"origin": [1.5, 4.49996, -4.02], "size": [1, 2, 0], "uv": [36, 1]}
]
},
{
"name": "locator_eye_left",
"parent": "eye_left",
"pivot": [2, 5.5, -3.95],
"locators": {
"eye2": [2, 5.5, -3.95]
}
},
{
"name": "eyebrow_left_small",
"parent": "eye_left",
"pivot": [2.0057, 6.49988, -3.94],
"cubes": [
{"origin": [1.5, 5.99988, -3.94], "size": [1, 1, 0], "uv": [45, 1]}
]
},
{
"name": "eyebrow_left",
"parent": "eye_left",
"pivot": [2, 6.5, -3.94],
"cubes": [
{"origin": [1, 6, -3.94], "size": [2, 1, 0], "uv": [44, 4]}
]
},
{
"name": "eye_left_shocked",
"parent": "eyes",
"pivot": [2, 5.5, -3.92],
"cubes": [
{"origin": [1.5, 5, -3.92], "size": [1, 1, 0], "uv": [42, 1]}
]
},
{
"name": "eyelid_left",
"parent": "eyes",
"pivot": [2, 5.49996, -3.92],
"cubes": [
{"origin": [1.5, 4.49996, -3.92], "size": [1, 2, 0], "uv": [36, 4]}
]
},
{
"name": "eye_right",
"parent": "eyes",
"pivot": [-2, 5.49996, -4.02],
"cubes": [
{"origin": [-2.5, 4.49996, -4.02], "size": [1, 2, 0], "uv": [33, 1]}
]
},
{
"name": "locator_eye_right",
"parent": "eye_right",
"pivot": [-2, 5.5, -3.95],
"locators": {
"eye1": [-2, 5.5, -3.95]
}
},
{
"name": "eyebrow_right_small",
"parent": "eye_right",
"pivot": [-2.0057, 6.49988, -3.94],
"cubes": [
{"origin": [-2.5, 5.99988, -3.94], "size": [1, 1, 0], "uv": [48, 1]}
]
},
{
"name": "eyebrow_right",
"parent": "eye_right",
"pivot": [-2, 6.5, -3.94],
"cubes": [
{"origin": [-3, 6, -3.94], "size": [2, 1, 0], "uv": [39, 4]}
]
},
{
"name": "eye_right_shocked",
"parent": "eyes",
"pivot": [-2, 5.5, -3.92],
"cubes": [
{"origin": [-2.5, 5, -3.92], "size": [1, 1, 0], "uv": [39, 1]}
]
},
{
"name": "eyelid_right",
"parent": "eyes",
"pivot": [-2, 5.49996, -3.92],
"cubes": [
{"origin": [-2.5, 4.49996, -3.92], "size": [1, 2, 0], "uv": [33, 4]}
]
},
{
"name": "feet",
"parent": "body",
"pivot": [0, 1, 1]
},
{
"name": "foot_left",
"parent": "feet",
"pivot": [1.5, 1, 1],
"cubes": [
{"origin": [0.5, 0, 0], "size": [2, 1, 2], "uv": [0, 3]}
]
},
{
"name": "locator_foot_secondary",
"parent": "foot_left",
"pivot": [1.525, 0.5, 0],
"rotation": [90, 0, 0],
"locators": {
"foot_secondary": [1.525, 0.5, 0]
}
},
{
"name": "toes_left",
"parent": "foot_left",
"pivot": [1.5, 0, 0],
"cubes": [
{"origin": [0.5, 0, -2], "size": [2, 1, 2], "uv": [24, 3]}
]
},
{
"name": "foot_right",
"parent": "feet",
"pivot": [-1.5, 1, 1],
"cubes": [
{"origin": [-2.5, 0, 0], "size": [2, 1, 2], "uv": [0, 0]}
]
},
{
"name": "locator_foot_primary",
"parent": "foot_right",
"pivot": [-1.525, 0.5, 0],
"rotation": [90, 0, 0],
"locators": {
"foot_primary": [-1.525, 0.5, 0]
}
},
{
"name": "toes_right",
"parent": "foot_right",
"pivot": [-1.5, 0, 0],
"cubes": [
{"origin": [-2.5, 0, -2], "size": [2, 1, 2], "uv": [24, 0]}
]
}
]
}
]
}
@@ -1,42 +0,0 @@
{
"portraitScale": 2.02,
"portraitTranslation": [-0.5, -0.58, 0],
"profileScale": 0.81,
"profileTranslation": [0.0, 0.5, 0.0],
"rootBone": "marill",
"animations": {},
"poses": {
"standing": {
"poseName": "standing",
"poseTypes": ["STAND", "NONE", "PORTRAIT", "PROFILE"],
"animations": ["q.look('head_ai')", "q.bedrock('marill', 'ground_idle')"],
"quirks": ["q.bedrock_quirk('marill', 'blink')"]
},
"walking": {
"poseName": "walking",
"poseTypes": ["WALK"],
"animations": [
"q.look('head_ai')",
"q.biped_walk(0.66, 0.6, 'leg_left', 'leg_right')",
"q.bedrock('marill', 'ground_idle')"
],
"quirks": ["q.bedrock_quirk('marill', 'blink')"]
},
"swimming": {
"poseName": "swimming",
"poseTypes": ["SWIM", "FLOAT"],
"animations": [
"q.look('head_ai')",
"q.bedrock('marill', 'water_idle')"
],
"quirks": ["q.bedrock_quirk('marill', 'blink')"]
},
"sleep": {
"poseName": "sleep",
"poseTypes": ["SLEEP"],
"animations": [
"q.bedrock('marill', 'sleep')"
]
}
}
}
@@ -1,42 +0,0 @@
{
"portraitScale": 1.92,
"portraitTranslation": [-0.41, -0.11, 0],
"profileScale": 0.79,
"profileTranslation": [0.0, 0.54, 0.0],
"rootBone": "azumarill",
"animations": {},
"poses": {
"standing": {
"poseName": "standing",
"poseTypes": ["STAND", "NONE", "PORTRAIT", "PROFILE"],
"animations": ["q.look('head_ai')", "q.bedrock('azumarill', 'ground_idle')"],
"quirks": ["q.bedrock_quirk('azumarill', 'blink')"]
},
"walking": {
"poseName": "walking",
"poseTypes": ["WALK"],
"animations": [
"q.look('head_ai')",
"q.biped_walk(0.66, 0.6, 'leg_left', 'leg_right')",
"q.bedrock('azumarill', 'ground_idle')"
],
"quirks": ["q.bedrock_quirk('azumarill', 'blink')"]
},
"swimming": {
"poseName": "swimming",
"poseTypes": ["SWIM", "FLOAT"],
"animations": [
"q.look('head_ai')",
"q.bedrock('azumarill', 'water_idle')"
],
"quirks": ["q.bedrock_quirk('azumarill', 'blink')"]
},
"sleep": {
"poseName": "sleep",
"poseTypes": ["SLEEP"],
"animations": [
"q.bedrock('azumarill', 'sleep')"
]
}
}
}
@@ -1,50 +0,0 @@
{
"portraitScale": 2.41,
"portraitTranslation": [-0.23, -0.63, 0],
"profileScale": 0.89,
"profileTranslation": [0.0, 0.39, 0.0],
"rootBone": "azurill",
"animations": {},
"poses": {
"battle-standing": {
"poseName": "standing",
"poseTypes": ["STAND", "PORTRAIT", "PROFILE"],
"isBattle": true,
"animations": ["q.look('head_ai')", "q.bedrock('azurill', 'battle_idle')"],
"quirks": ["q.bedrock_quirk('azurill', 'blink')"]
},
"standing": {
"poseName": "standing",
"poseTypes": ["STAND", "NONE"],
"isBattle": false,
"animations": ["q.look('head_ai')", "q.bedrock('azurill', 'ground_idle')"],
"quirks": ["q.bedrock_quirk('azurill', 'blink')"]
},
"walking": {
"poseName": "walking",
"poseTypes": ["WALK"],
"animations": [
"q.look('head_ai')",
"q.biped_walk(0.66, 0.6, 'leg_left', 'leg_right')",
"q.bedrock('azurill', 'ground_idle')"
],
"quirks": ["q.bedrock_quirk('azurill', 'blink')"]
},
"swimming": {
"poseName": "swimming",
"poseTypes": ["SWIM", "FLOAT"],
"animations": [
"q.look('head_ai')",
"q.bedrock('azurill', 'water_idle')"
],
"quirks": ["q.bedrock_quirk('azurill', 'blink')"]
},
"sleep": {
"poseName": "sleep",
"poseTypes": ["SLEEP"],
"animations": [
"q.bedrock('azurill', 'sleep')"
]
}
}
}
@@ -18,63 +18,67 @@
"faint": "q.bedrock_primary('quaxly', 'faint', q.curve('one'))"
},
"poses": {
"battle_idle": {
"sleep": {
"isTouchingWater": "false",
"isUnderWater": "false",
"isBattle": "true",
"poseTypes": [
"STAND"
"SLEEP"
],
"animations": [
"q.look('head')",
"q.bedrock('quaxly', 'battle_idle')"
],
"transformTicks": 10,
"quirks": [
"q.bedrock_quirk('quaxly', 'blink')"
]
},
"surface_battle_idle": {
"isTouchingWater": "true",
"isUnderWater": "false",
"isBattle": "true",
"poseTypes": [
"STAND","FLOAT"
],
"animations": [
"q.look('head')",
"q.bedrock('quaxly', 'surfacewater_battle_idle')"
],
"transformTicks": 10,
"quirks": [
"q.bedrock_quirk('quaxly', 'blink')"
]
},
"water_battle_idle": {
"isTouchingWater": "true",
"isUnderWater": "true",
"isBattle": "true",
"poseTypes": [
"STAND","FLOAT"
],
"animations": [
"q.look('head')",
"q.bedrock('quaxly', 'water_battle_idle')"
],
"transformTicks": 10,
"quirks": [
"q.bedrock_quirk('quaxly', 'blink')"
"q.bedrock('quaxly', 'sleep')"
],
"transformedParts": [
{
"part": "body",
"position": [0, -10, 0]
"part": "wing_right_closed",
"isVisible": false
},
{
"part": "wing_left_closed",
"isVisible": false
}
]
},
"surface_sleep": {
"isTouchingWater": "true",
"isUnderWater": "false",
"poseTypes": [
"SLEEP"
],
"animations": [
"q.bedrock('quaxly', 'surfacewater_sleep')"
],
"transformedParts": [
{
"part": "wing_right_closed",
"isVisible": false
},
{
"part": "wing_left_closed",
"isVisible": false
}
]
},
"water_sleep": {
"isTouchingWater": "true",
"isUnderWater": "true",
"poseTypes": [
"SLEEP"
],
"animations": [
"q.bedrock('quaxly', 'water_sleep')"
],
"transformedParts": [
{
"part": "wing_right_closed",
"isVisible": false
},
{
"part": "wing_left_closed",
"isVisible": false
}
]
},
"standing": {
"isTouchingWater": "false",
"isBattle": "false",
"poseTypes": [
"PROFILE",
"PORTRAIT",
@@ -85,13 +89,23 @@
"q.look('head')",
"q.bedrock('quaxly', 'ground_idle')"
],
"transformedParts": [
{
"part": "wing_right_closed",
"isVisible": false
},
{
"part": "wing_left",
"isVisible": false
}
],
"transformTicks": 10,
"quirks": [
"q.bedrock_quirk('quaxly', 'blink')"
]
},
"walk": {
"isTouchingWater": "false",
"poseName": "walk",
"poseTypes": [
"WALK"
],
@@ -99,56 +113,22 @@
"q.look('head')",
"q.bedrock('quaxly', 'ground_walk')"
],
"transformedParts": [
{
"part": "wing_right",
"isVisible": false
},
{
"part": "wing_left",
"isVisible": false
}
],
"transformTicks": 10,
"quirks": [
"q.bedrock_quirk('quaxly', 'blink')"
]
},
"surface_idle": {
"isTouchingWater": "true",
"isUnderWater": "false",
"isBattle": "false",
"poseTypes": [
"STAND","FLOAT"
],
"animations": [
"q.look('head')",
"q.bedrock('quaxly', 'surfacewater_idle')"
],
"quirks": [
"q.bedrock_quirk('quaxly', 'blink')"
],
"transformedParts": [
{
"part": "body",
"position": [0, -10, 0]
}
]
},
"surface_swim": {
"isTouchingWater": "true",
"isUnderWater": "false",
"poseTypes": [
"WALK","SWIM"
],
"animations": [
"q.look('head')",
"q.bedrock('quaxly', 'surfacewater_swim')"
],
"quirks": [
"q.bedrock_quirk('quaxly', 'blink')"
],
"transformedParts": [
{
"part": "body",
"position": [0, -10, 0]
}
]
},
"float": {
"isTouchingWater": "true",
"isUnderWater": "true",
"isBattle": "false",
"poseTypes": [
"FLOAT"
],
@@ -156,6 +136,16 @@
"q.look('head')",
"q.bedrock('quaxly', 'water_idle')"
],
"transformedParts": [
{
"part": "wing_right_closed",
"isVisible": false
},
{
"part": "wing_left_closed",
"isVisible": false
}
],
"transformTicks": 10,
"quirks": [
"q.bedrock_quirk('quaxly', 'blink')"
@@ -171,39 +161,145 @@
"q.look('head')",
"q.bedrock('quaxly', 'water_swim')"
],
"transformedParts": [
{
"part": "wing_right_closed",
"isVisible": false
},
{
"part": "wing_left_closed",
"isVisible": false
}
],
"transformTicks": 10,
"quirks": [
"q.bedrock_quirk('quaxly', 'blink')"
]
},
"sleep": {
"battle_idle": {
"isTouchingWater": "false",
"isUnderWater": "false",
"isBattle": "true",
"poseTypes": [
"SLEEP"
"STAND"
],
"animations": [
"q.bedrock('quaxly', 'sleep')"
"q.look('head')",
"q.bedrock('quaxly', 'battle_idle')"
],
"transformedParts": [
{
"part": "wing_right",
"isVisible": false
},
{
"part": "wing_left",
"isVisible": false
}
],
"transformTicks": 10,
"quirks": [
"q.bedrock_quirk('quaxly', 'blink')"
]
},
"surface_sleep": {
"water_battle_idle": {
"isTouchingWater": "true",
"isUnderWater": "true",
"isBattle": "true",
"poseTypes": [
"FLOAT"
],
"animations": [
"q.look('head')",
"q.bedrock('quaxly', 'water_battle_idle')"
],
"transformedParts": [
{
"part": "wing_right",
"isVisible": false
},
{
"part": "wing_left",
"isVisible": false
}
],
"transformTicks": 10,
"quirks": [
"q.bedrock_quirk('quaxly', 'blink')"
]
},
"surface_battle_idle": {
"isTouchingWater": "true",
"isUnderWater": "false",
"iBattle": "true",
"poseTypes": [
"FLOAT"
],
"animations": [
"q.look('head')",
"q.bedrock('quaxly', 'surfacewater_battle_idle')"
],
"transformedParts": [
{
"part": "wing_right_closed",
"isVisible": false
},
{
"part": "wing_left_closed",
"isVisible": false
}
],
"transformTicks": 10,
"quirks": [
"q.bedrock_quirk('quaxly', 'blink')"
]
},
"surface_idle": {
"isTouchingWater": "true",
"isUnderWater": "false",
"poseTypes": [
"SLEEP"
"FLOAT"
],
"animations": [
"q.bedrock('quaxly', 'surfacewater_sleep')"
"q.look('head')",
"q.bedrock('quaxly', 'surfacewater_idle')"
],
"transformedParts": [
{
"part": "wing_right",
"isVisible": false
},
{
"part": "wing_left",
"isVisible": false
}
],
"quirks": [
"q.bedrock_quirk('quaxly', 'blink')"
]
},
"water_sleep": {
"surface_swim": {
"isTouchingWater": "true",
"isUnderWater": "true",
"isUnderWater": "false",
"poseTypes": [
"SLEEP"
"SWIM"
],
"animations": [
"q.bedrock('quaxly', 'water_sleep')"
"q.look('head')",
"q.bedrock('quaxly', 'surfacewater_swim')"
],
"transformedParts": [
{
"part": "wing_right",
"isVisible": false
},
{
"part": "wing_left",
"isVisible": false
}
],
"quirks": [
"q.bedrock_quirk('quaxly', 'blink')"
]
}
}
@@ -1,18 +0,0 @@
{
"species": "cobblemon:marill",
"order": 0,
"variations": [
{
"aspects": [],
"poser": "cobblemon:marill",
"model": "cobblemon:marill.geo",
"texture": "cobblemon:textures/pokemon/0183_marill/marill.png",
"layers": []
},
{
"aspects": ["shiny"],
"texture": "cobblemon:textures/pokemon/0183_marill/marill_shiny.png"
}
]
}
@@ -1,18 +0,0 @@
{
"species": "cobblemon:azumarill",
"order": 0,
"variations": [
{
"aspects": [],
"poser": "cobblemon:azumarill",
"model": "cobblemon:azumarill.geo",
"texture": "cobblemon:textures/pokemon/0184_azumarill/azumarill.png",
"layers": []
},
{
"aspects": ["shiny"],
"texture": "cobblemon:textures/pokemon/0184_azumarill/azumarill_shiny.png"
}
]
}
@@ -1,18 +0,0 @@
{
"species": "cobblemon:azurill",
"order": 0,
"variations": [
{
"aspects": [],
"poser": "cobblemon:azurill",
"model": "cobblemon:azurill.geo",
"texture": "cobblemon:textures/pokemon/0298_azurill/azurill.png",
"layers": []
},
{
"aspects": ["shiny"],
"texture": "cobblemon:textures/pokemon/0298_azurill/azurill_shiny.png"
}
]
}
@@ -23,7 +23,7 @@
{
"name": "emissive",
"emissive": true,
"texture": "cobblemon:textures/pokemon/0631_heatmor/heatmor_shiny_emissive.png",
"texture": "cobblemon:textures/pokemon/0631_heatmor/heatmor_emissive_shiny.png",
"translucent": true
}
]
@@ -55,6 +55,7 @@
},
{
"aspects": [
"squawkabilly-color-green",
"shiny"
],
"texture": "cobblemon:textures/pokemon/0931_squawkabilly/squawkabilly_green_shiny.png",
@@ -3,14 +3,14 @@
"order": 0,
"variations": [
{
"aspects": [],
"aspects": ["two-segment-form"],
"poser": "cobblemon:dudunsparce_two_segment",
"model": "cobblemon:dudunsparce_two_segment.geo",
"texture": "cobblemon:textures/pokemon/0982_dudunsparce/dudunsparce_two_segment.png",
"layers": []
},
{
"aspects": ["shiny"],
"aspects": ["two-segment-form","shiny"],
"texture": "cobblemon:textures/pokemon/0982_dudunsparce/dudunsparce_two_segment_shiny.png"
},
{
@@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "builtin/entity"
}
}
}
@@ -1,11 +1,5 @@
{
"variants": {
"facing=down": {
"model": "cobblemon:block/saccharine_log_slathered_0"
},
"facing=up": {
"model": "cobblemon:block/saccharine_log_slathered_0"
},
"facing=east,honey_type=0": {
"model": "cobblemon:block/saccharine_log_slathered_0",
"y": 90
@@ -1,6 +1,6 @@
{
"parent": "minecraft:block/button",
"textures": {
"texture": "cobblemon:block/apricorn_planks"
"texture": "cobblemon:block/wood/apricorn_planks"
}
}
@@ -1,6 +1,6 @@
{
"parent": "minecraft:block/button_inventory",
"textures": {
"texture": "cobblemon:block/apricorn_planks"
"texture": "cobblemon:block/wood/apricorn_planks"
}
}
@@ -1,6 +1,6 @@
{
"parent": "minecraft:block/button_pressed",
"textures": {
"texture": "cobblemon:block/apricorn_planks"
"texture": "cobblemon:block/wood/apricorn_planks"
}
}
@@ -1,7 +1,7 @@
{
"parent": "minecraft:block/door_bottom_left",
"textures": {
"bottom": "cobblemon:block/apricorn_door_bottom",
"top": "cobblemon:block/apricorn_door_top"
"bottom": "cobblemon:block/wood/apricorn_door_bottom",
"top": "cobblemon:block/wood/apricorn_door_top"
}
}
@@ -1,7 +1,7 @@
{
"parent": "minecraft:block/door_bottom_left_open",
"textures": {
"bottom": "cobblemon:block/apricorn_door_bottom",
"top": "cobblemon:block/apricorn_door_top"
"bottom": "cobblemon:block/wood/apricorn_door_bottom",
"top": "cobblemon:block/wood/apricorn_door_top"
}
}
@@ -1,7 +1,7 @@
{
"parent": "minecraft:block/door_bottom_right",
"textures": {
"bottom": "cobblemon:block/apricorn_door_bottom",
"top": "cobblemon:block/apricorn_door_top"
"bottom": "cobblemon:block/wood/apricorn_door_bottom",
"top": "cobblemon:block/wood/apricorn_door_top"
}
}
@@ -1,7 +1,7 @@
{
"parent": "minecraft:block/door_bottom_right_open",
"textures": {
"bottom": "cobblemon:block/apricorn_door_bottom",
"top": "cobblemon:block/apricorn_door_top"
"bottom": "cobblemon:block/wood/apricorn_door_bottom",
"top": "cobblemon:block/wood/apricorn_door_top"
}
}
@@ -1,7 +1,7 @@
{
"parent": "minecraft:block/door_top_left",
"textures": {
"bottom": "cobblemon:block/apricorn_door_bottom",
"top": "cobblemon:block/apricorn_door_top"
"bottom": "cobblemon:block/wood/apricorn_door_bottom",
"top": "cobblemon:block/wood/apricorn_door_top"
}
}

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