mirror of
https://gitlab.com/cable-mc/cobblemon.git
synced 2026-10-27 20:46:27 -04:00
Compare commits
25
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5b0c34ce9a | ||
|
|
37f70903c5 | ||
|
|
1149880926 | ||
|
|
42d569b4fa | ||
|
|
f1f1f183f1 | ||
|
|
c4fdb4c89e | ||
|
|
87510acd17 | ||
|
|
dc8821ed8d | ||
|
|
04478d7807 | ||
|
|
f708c1bddb | ||
|
|
97b7cf4bee | ||
|
|
0447ecded7 | ||
|
|
ab9e73d3ec | ||
|
|
d34a0d28aa | ||
|
|
d46627d24e | ||
|
|
9f5c76fc0b | ||
|
|
94e12787a2 | ||
|
|
2cd0686537 | ||
|
|
9c539d7aaf | ||
|
|
1ee2374923 | ||
|
|
f6f9d1329d | ||
|
|
ae2f91a94d | ||
|
|
74ff99c478 | ||
|
|
d6367518c6 | ||
|
|
a2aa4bbd7d |
+19
-8
@@ -1,11 +1,20 @@
|
||||
# Changelog
|
||||
## [1.8.4 (MONTH xth, 2026)](#1-8-4)
|
||||
## [1.8.3 (MONTH xth, 2026)](#1-8-3)
|
||||
|
||||
### Additions
|
||||
|
||||
### Particles
|
||||
### Pokémon Added
|
||||
#### Generation 4
|
||||
|
||||
### Cries added/updated for the following Pokémon
|
||||
#### Generation 5
|
||||
|
||||
#### Generation 6
|
||||
|
||||
#### Generation 7
|
||||
|
||||
#### Generation 8
|
||||
|
||||
#### Generation 9
|
||||
|
||||
### Model updates for the following Pokémon
|
||||
|
||||
@@ -14,13 +23,15 @@
|
||||
### Changes
|
||||
|
||||
### Fixes
|
||||
- Fixed datapacks with item interaction evolutions that don't specify an item crashing the world on load.
|
||||
- Fixed the Pokédex evolution tree crashing when a datapack's dex entry is missing an evolution's form.
|
||||
- Fixed the Pokédex evolution tree crashing with a stack overflow on evolutions that loop back on themselves.
|
||||
- Fixed form-changing evolutions sometimes resolving to the source form in the Pokédex evolution tree.
|
||||
- Broken datapack evolutions are now logged and skipped in the Pokédex evolution tree instead of crashing.
|
||||
|
||||
### Developer
|
||||
|
||||
### Molang & Datapacks
|
||||
- Added a `loot_table` drop entry type.
|
||||
- Accepts an `id` field, pointing to a vanilla loot table.
|
||||
- Added the `cobblemon:biome` and `cobblemon:pokemon_properties` loot conditions.
|
||||
- `cobblemon:biome` returns true if the biome of death matches the `biome` field.
|
||||
- `cobblemon:pokemon_properties` returns true if the Pokémon matches the `properties` field.
|
||||
|
||||
### Localization
|
||||
- Updated translations for:
|
||||
|
||||
+17
-7
@@ -16,7 +16,6 @@ import com.cobblemon.mod.common.item.crafting.CookingPotShapelessRecipe;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.common.collect.Maps;
|
||||
import com.llamalad7.mixinextras.sugar.Local;
|
||||
import net.minecraft.client.ClientRecipeBook;
|
||||
import net.minecraft.client.RecipeBookCategories;
|
||||
import net.minecraft.client.gui.screens.recipebook.RecipeCollection;
|
||||
@@ -64,12 +63,23 @@ public abstract class ClientRecipeBookMixin {
|
||||
}
|
||||
}
|
||||
|
||||
@Inject(method = "setupCollections",
|
||||
at = @At(
|
||||
value = "INVOKE",
|
||||
target = "Lcom/google/common/collect/ImmutableMap;copyOf(Ljava/util/Map;)Lcom/google/common/collect/ImmutableMap;"
|
||||
))
|
||||
private void addCustomAggregateCategories(Iterable<RecipeHolder<?>> recipes, RegistryAccess registryAccess, CallbackInfo ci, @Local(name = "map2") Map<RecipeBookCategories, List<RecipeCollection>> map2) {
|
||||
@Inject(method = "setupCollections", at = @At("RETURN"))
|
||||
private void addCustomAggregateCategories(Iterable<RecipeHolder<?>> recipes, RegistryAccess registryAccess, CallbackInfo ci) {
|
||||
Map<RecipeBookCategories, List<List<RecipeHolder<?>>>> map = categorizeAndGroupRecipes(recipes);
|
||||
Map<RecipeBookCategories, List<RecipeCollection>> map2 = Maps.newHashMap();
|
||||
ImmutableList.Builder<RecipeCollection> builder = ImmutableList.builder();
|
||||
|
||||
map.forEach((recipeBookCategories, list) -> {
|
||||
List<RecipeCollection> collections = list.stream()
|
||||
.map(listx -> new RecipeCollection(registryAccess, listx))
|
||||
.peek(builder::add)
|
||||
.collect(ImmutableList.toImmutableList());
|
||||
map2.put(recipeBookCategories, collections);
|
||||
});
|
||||
RecipeBookCategories.AGGREGATE_CATEGORIES.forEach((recipeBookCategories, list) -> map2.put(recipeBookCategories, (List) list.stream().flatMap((recipeBookCategoriesx) -> ((List) map2.getOrDefault(recipeBookCategoriesx, ImmutableList.of())).stream()).collect(ImmutableList.toImmutableList())));
|
||||
CobblemonRecipeCategories.Companion.getCustomAggregateCategories().forEach((recipeBookCategories, list) -> map2.put(recipeBookCategories, (List) list.stream().flatMap((recipeBookCategoriesx) -> ((List) map2.getOrDefault(recipeBookCategoriesx, ImmutableList.of())).stream()).collect(ImmutableList.toImmutableList())));
|
||||
|
||||
this.collectionsByTab = ImmutableMap.copyOf(map2);
|
||||
this.allCollections = builder.build();
|
||||
}
|
||||
}
|
||||
@@ -15,7 +15,9 @@ import com.cobblemon.mod.common.ModAPI;
|
||||
import com.cobblemon.mod.common.item.PokeBallItem;
|
||||
import com.cobblemon.mod.common.item.PokedexItem;
|
||||
import com.cobblemon.mod.common.item.WearableItem;
|
||||
import com.cobblemon.mod.common.item.components.PokeBallComponent;
|
||||
import com.cobblemon.mod.common.item.components.TMMoveComponent;
|
||||
import com.cobblemon.mod.common.pokeball.PokeBall;
|
||||
import com.mojang.blaze3d.vertex.PoseStack;
|
||||
import net.minecraft.client.multiplayer.ClientLevel;
|
||||
import net.minecraft.client.renderer.ItemModelShaper;
|
||||
@@ -57,11 +59,27 @@ public abstract class ItemRendererMixin {
|
||||
cancellable = true
|
||||
)
|
||||
private void cobblemon$overrideItemModel(ItemStack stack, ItemDisplayContext renderMode, boolean leftHanded, PoseStack matrices, MultiBufferSource multiBufferSource, int light, int overlay, BakedModel model, CallbackInfo ci) {
|
||||
boolean shouldBe2d = renderMode == ItemDisplayContext.GUI || renderMode == ItemDisplayContext.FIXED || stack.getItem() == CobblemonItems.TECHNICAL_MACHINE;
|
||||
boolean shouldBe2d =
|
||||
renderMode == ItemDisplayContext.GUI
|
||||
|| renderMode == ItemDisplayContext.FIXED
|
||||
|| stack.getItem() == CobblemonItems.TECHNICAL_MACHINE;
|
||||
|
||||
boolean shouldBe3d =
|
||||
renderMode == ItemDisplayContext.FIRST_PERSON_LEFT_HAND
|
||||
|| renderMode == ItemDisplayContext.FIRST_PERSON_RIGHT_HAND
|
||||
|| renderMode == ItemDisplayContext.THIRD_PERSON_LEFT_HAND
|
||||
|| renderMode == ItemDisplayContext.THIRD_PERSON_RIGHT_HAND
|
||||
|| renderMode == ItemDisplayContext.GROUND
|
||||
|| renderMode == ItemDisplayContext.HEAD;
|
||||
|
||||
ResourceLocation resourceLocation = null;
|
||||
if (stack.getItem() instanceof PokeBallItem) {
|
||||
if (shouldBe2d) resourceLocation = PokeBallComponent.getPokeBall(stack).getModel2d();
|
||||
if (shouldBe3d) resourceLocation = PokeBallComponent.getPokeBall(stack).getModel3d();
|
||||
}
|
||||
|
||||
if (shouldBe2d) {
|
||||
if (stack.getItem() instanceof PokeBallItem pokeBallItem) resourceLocation = pokeBallItem.getPokeBall().getModel2d();
|
||||
else if (stack.getItem() instanceof PokedexItem pokedexItem) resourceLocation = pokedexItem.getType().getItemSpritePath();
|
||||
if (stack.getItem() instanceof PokedexItem pokedexItem) resourceLocation = pokedexItem.getType().getItemSpritePath();
|
||||
else if (stack.getItem() == CobblemonItems.TECHNICAL_MACHINE) {
|
||||
TMMoveComponent component = stack.get(CobblemonItemComponents.TM_MOVE);
|
||||
if (component != null) {
|
||||
@@ -83,16 +101,21 @@ public abstract class ItemRendererMixin {
|
||||
@Inject(method = "getModel", at = @At("HEAD"), cancellable = true)
|
||||
private void cobblemon$getItemModel(ItemStack stack, Level world, LivingEntity entity, int seed, CallbackInfoReturnable<BakedModel> cir) {
|
||||
ResourceLocation resourceLocation = null;
|
||||
if (stack.getItem() instanceof PokeBallItem pokeBallItem) resourceLocation = pokeBallItem.getPokeBall().getModel3d();
|
||||
else if (stack.getItem() instanceof PokedexItem pokedexItem) {
|
||||
boolean isScanModel = entity instanceof Player && entity.getUseItem() == stack && entity.isUsingItem();
|
||||
boolean canOpenScreen = entity != null && ((entity.getOffhandItem() == stack && !(entity.getMainHandItem().getItem() instanceof PokedexItem)) || entity.getMainHandItem() == stack);
|
||||
resourceLocation = pokedexItem.getType().getItemModelPath(isScanModel ? "scanning" : (canOpenScreen ? null : "off"));
|
||||
switch (stack.getItem()) {
|
||||
case PokeBallItem ignored -> resourceLocation = PokeBallComponent.getPokeBall(stack).getModel3d();
|
||||
case PokedexItem pokedexItem -> {
|
||||
boolean isScanModel = entity instanceof Player && entity.getUseItem() == stack && entity.isUsingItem();
|
||||
boolean canOpenScreen = entity != null && ((entity.getOffhandItem() == stack && !(entity.getMainHandItem().getItem() instanceof PokedexItem)) || entity.getMainHandItem() == stack);
|
||||
resourceLocation = pokedexItem.getType().getItemModelPath(isScanModel ? "scanning" : (canOpenScreen ? null : "off"));
|
||||
}
|
||||
case WearableItem wearableItem -> resourceLocation = wearableItem.getModel3d();
|
||||
default -> {
|
||||
}
|
||||
}
|
||||
else if (stack.getItem() instanceof WearableItem wearableItem) resourceLocation = wearableItem.getModel3d();
|
||||
|
||||
if (resourceLocation != null) {
|
||||
BakedModel model = this.itemModelShaper.getModelManager().getModel(new ModelResourceLocation(resourceLocation, MODEL_PATH));
|
||||
String modelPath = (stack.getItem() instanceof PokeBallItem && stack.has(CobblemonItemComponents.POKE_BALL)) ? "inventory" : MODEL_PATH;
|
||||
BakedModel model = this.itemModelShaper.getModelManager().getModel(new ModelResourceLocation(resourceLocation, modelPath));
|
||||
ClientLevel clientWorld = world instanceof ClientLevel ? (ClientLevel) world : null;
|
||||
BakedModel overriddenModel = model.getOverrides().resolve(model, stack, clientWorld, entity, seed);
|
||||
cir.setReturnValue(overriddenModel == null ? this.itemModelShaper.getModelManager().getMissingModel() : overriddenModel);
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
package com.cobblemon.mod.common.mixin.client;
|
||||
|
||||
import com.cobblemon.mod.common.client.CobblemonBakingOverrides;
|
||||
import com.cobblemon.mod.common.client.CobblemonClient;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.color.block.BlockColors;
|
||||
import net.minecraft.client.renderer.block.model.BlockModel;
|
||||
@@ -19,6 +20,7 @@ import net.minecraft.client.resources.model.UnbakedModel;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.server.packs.resources.Resource;
|
||||
import net.minecraft.util.profiling.ProfilerFiller;
|
||||
import net.minecraft.world.item.ItemDisplayContext;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
import org.spongepowered.asm.mixin.Unique;
|
||||
@@ -29,6 +31,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
|
||||
@Mixin(ModelBakery.class)
|
||||
public abstract class ModelLoaderMixin {
|
||||
@@ -38,8 +41,10 @@ public abstract class ModelLoaderMixin {
|
||||
|
||||
@Shadow protected abstract void loadItemModelAndDependencies(ResourceLocation resourceLocation);
|
||||
|
||||
@Shadow protected abstract void loadSpecialItemModelAndDependencies(ModelResourceLocation modelResourceLocation);
|
||||
|
||||
@Unique
|
||||
List<String> dynamicFolders = Arrays.asList("egg", "tm");
|
||||
List<String> dynamicFolders = Arrays.asList("egg", "tm", "poke_ball");
|
||||
|
||||
@Inject(
|
||||
method = "<init>",
|
||||
@@ -67,6 +72,9 @@ public abstract class ModelLoaderMixin {
|
||||
* hacky at the init stage and hacky at the render stage. Pretty cool in the gameplay stage though.
|
||||
*
|
||||
* - Hiro
|
||||
*
|
||||
* We also want to load different contexts (first/third person etc.) for poke ball models, so additional check was added for them.
|
||||
* - Gito
|
||||
*/
|
||||
|
||||
dynamicFolders.forEach(folder -> {
|
||||
@@ -74,6 +82,15 @@ public abstract class ModelLoaderMixin {
|
||||
map.forEach((key, value) -> {
|
||||
ResourceLocation resourceLocation = new ResourceLocation(key.getNamespace(), key.getPath().replace("models/item/", "").replace(".json", ""));
|
||||
this.loadItemModelAndDependencies(resourceLocation);
|
||||
|
||||
if (folder.equals("poke_ball")) {
|
||||
// also load variants for different display ctx
|
||||
Arrays.stream(ItemDisplayContext.values())
|
||||
.forEach(item -> {
|
||||
ModelResourceLocation model = new ModelResourceLocation(resourceLocation, item.getSerializedName());
|
||||
this.loadSpecialItemModelAndDependencies(model);
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
+43
-13
@@ -9,25 +9,55 @@
|
||||
package com.cobblemon.mod.common.mixin.client;
|
||||
|
||||
import com.cobblemon.mod.common.CobblemonRecipeCategories;
|
||||
import com.llamalad7.mixinextras.expression.Definition;
|
||||
import com.llamalad7.mixinextras.expression.Expression;
|
||||
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
|
||||
import com.llamalad7.mixinextras.sugar.Local;
|
||||
import net.minecraft.client.ClientRecipeBook;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.RecipeBookCategories;
|
||||
import net.minecraft.client.gui.screens.recipebook.RecipeBookComponent;
|
||||
import net.minecraft.client.gui.screens.recipebook.RecipeBookPage;
|
||||
import net.minecraft.client.gui.screens.recipebook.RecipeBookTabButton;
|
||||
import org.spongepowered.asm.mixin.Final;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
@Mixin(RecipeBookComponent.class)
|
||||
public class RecipeBookComponentMixin {
|
||||
@Definition(id = "recipeBookCategories", local = @Local(name = "recipeBookCategories"))
|
||||
@Definition(id = "FURNACE_SEARCH", field = "Lnet/minecraft/client/RecipeBookCategories;FURNACE_SEARCH:Lnet/minecraft/client/RecipeBookCategories;")
|
||||
@Expression("recipeBookCategories != FURNACE_SEARCH")
|
||||
@ModifyExpressionValue(
|
||||
method = "updateTabs",
|
||||
at = @At(value = "MIXINEXTRAS:EXPRESSION")
|
||||
)
|
||||
private boolean notCookingPotSearch(boolean original, @Local(name = "recipeBookCategories") RecipeBookCategories recipeBookCategories) {
|
||||
return original && recipeBookCategories != CobblemonRecipeCategories.COOKING_POT_SEARCH.toVanillaCategory();
|
||||
|
||||
@Shadow private ClientRecipeBook book;
|
||||
|
||||
@Shadow protected Minecraft minecraft;
|
||||
|
||||
@Shadow private int width;
|
||||
|
||||
@Shadow private int xOffset;
|
||||
|
||||
@Shadow private int height;
|
||||
|
||||
@Shadow @Final private RecipeBookPage recipeBookPage;
|
||||
|
||||
@Inject(method = "updateTabs", at = @At("HEAD"), cancellable = true)
|
||||
private void customUpdateTabs(CallbackInfo ci) {
|
||||
RecipeBookComponent instance = (RecipeBookComponent) (Object) this;
|
||||
int i = (width - 147) / 2 - xOffset - 30;
|
||||
int j = (height - 166) / 2 + 3;
|
||||
int k = 27;
|
||||
int l = 0;
|
||||
|
||||
for (RecipeBookTabButton recipeBookTabButton : instance.tabButtons) {
|
||||
RecipeBookCategories recipeBookCategories = recipeBookTabButton.getCategory();
|
||||
if (recipeBookCategories != RecipeBookCategories.CRAFTING_SEARCH && recipeBookCategories != RecipeBookCategories.FURNACE_SEARCH && recipeBookCategories != CobblemonRecipeCategories.COOKING_POT_SEARCH.toVanillaCategory()) {
|
||||
if (recipeBookTabButton.updateVisibility(book)) {
|
||||
recipeBookTabButton.setPosition(i, j + 27 * l++);
|
||||
recipeBookTabButton.startAnimation(minecraft);
|
||||
}
|
||||
} else {
|
||||
recipeBookTabButton.visible = true;
|
||||
recipeBookTabButton.setPosition(i, j + k * l++);
|
||||
}
|
||||
}
|
||||
|
||||
ci.cancel();
|
||||
}
|
||||
}
|
||||
@@ -16,7 +16,6 @@ import com.cobblemon.mod.common.api.drop.CommandDropEntry
|
||||
import com.cobblemon.mod.common.api.drop.DropEntry
|
||||
import com.cobblemon.mod.common.api.drop.EvolutionItemDropEntry
|
||||
import com.cobblemon.mod.common.api.drop.ItemDropEntry
|
||||
import com.cobblemon.mod.common.api.drop.LootTableDropEntry
|
||||
import com.cobblemon.mod.common.api.events.CobblemonEvents
|
||||
import com.cobblemon.mod.common.api.events.CobblemonEvents.DATA_SYNCHRONIZED
|
||||
import com.cobblemon.mod.common.api.habitats.HabitatPools
|
||||
@@ -91,7 +90,6 @@ import com.cobblemon.mod.common.events.EntityCallbackHandler
|
||||
import com.cobblemon.mod.common.events.PokedexHandler
|
||||
import com.cobblemon.mod.common.events.ServerTickHandler
|
||||
import com.cobblemon.mod.common.events.StatHandler
|
||||
import com.cobblemon.mod.common.loot.CobblemonLootItemConditions
|
||||
import com.cobblemon.mod.common.net.messages.client.settings.ServerSettingsPacket
|
||||
import com.cobblemon.mod.common.permission.LaxPermissionValidator
|
||||
import com.cobblemon.mod.common.platform.events.PlatformEvents
|
||||
@@ -227,12 +225,10 @@ object Cobblemon {
|
||||
implementation.registerEntitySubPredicates()
|
||||
implementation.registerMobEffects()
|
||||
DispenserBehaviorRegistry.registerDispenserBehaviors()
|
||||
CobblemonLootItemConditions.touch()
|
||||
|
||||
DropEntry.register("command", CommandDropEntry::class.java)
|
||||
DropEntry.register("item", ItemDropEntry::class.java, isDefault = true)
|
||||
DropEntry.register("evolution", EvolutionItemDropEntry::class.java)
|
||||
DropEntry.register("loot_table", LootTableDropEntry::class.java)
|
||||
|
||||
ExperienceGroups.registerDefaults()
|
||||
CaptureCalculators.registerDefaults()
|
||||
@@ -264,9 +260,6 @@ object Cobblemon {
|
||||
RequestManager.onLogoff(it.player)
|
||||
serverPlayerStructs.remove(it.player.uuid)
|
||||
}
|
||||
PlatformEvents.PLAYER_RESPAWN.subscribe {
|
||||
serverPlayerStructs.remove(it.player.uuid)
|
||||
}
|
||||
PlatformEvents.PLAYER_DEATH.subscribe {
|
||||
PCLinkManager.removeLink(it.player.uuid)
|
||||
battleRegistry.getBattleByParticipatingPlayer(it.player)?.stop()
|
||||
|
||||
@@ -47,7 +47,7 @@ object CobblemonEntities : PlatformRegistry<Registry<EntityType<*>>, ResourceKey
|
||||
@JvmField
|
||||
val EMPTY_POKEBALL: EntityType<EmptyPokeBallEntity> = this.create(
|
||||
EMPTY_POKEBALL_KEY.path,
|
||||
EntityType.Builder.of({ _, world -> EmptyPokeBallEntity(PokeBalls.POKE_BALL, world) }, MobCategory.MISC)
|
||||
EntityType.Builder.of({ _, world -> EmptyPokeBallEntity(PokeBalls.STRANGE_BALL, world) }, MobCategory.MISC)
|
||||
.build(EMPTY_POKEBALL_KEY.toString())
|
||||
)
|
||||
|
||||
@@ -99,4 +99,4 @@ object CobblemonEntities : PlatformRegistry<Registry<EntityType<*>>, ResourceKey
|
||||
consumer(POKEMON, PokemonEntity.createAttributes())
|
||||
consumer(NPC, NPCEntity.createAttributes())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -99,6 +99,12 @@ object CobblemonItemComponents : PlatformRegistry<Registry<DataComponentType<*>>
|
||||
.networkSynchronized(ByteBufCodecs.BOOL)
|
||||
.build())
|
||||
|
||||
@JvmField
|
||||
val POKE_BALL: DataComponentType<PokeBallComponent> = create("poke_ball", DataComponentType.builder<PokeBallComponent>()
|
||||
.persistent(PokeBallComponent.CODEC)
|
||||
.networkSynchronized(PokeBallComponent.PACKET_CODEC)
|
||||
.build())
|
||||
|
||||
fun register() {
|
||||
Registry.register(BuiltInRegistries.DATA_COMPONENT_TYPE, ResourceLocation.parse("cobblemon:pokemon_item"), POKEMON_ITEM)
|
||||
Registry.register(BuiltInRegistries.DATA_COMPONENT_TYPE, ResourceLocation.parse("cobblemon:bait"), BAIT)
|
||||
@@ -112,9 +118,10 @@ object CobblemonItemComponents : PlatformRegistry<Registry<DataComponentType<*>>
|
||||
Registry.register(BuiltInRegistries.DATA_COMPONENT_TYPE, ResourceLocation.parse("cobblemon:food"), FOOD)
|
||||
Registry.register(BuiltInRegistries.DATA_COMPONENT_TYPE, ResourceLocation.parse("cobblemon:mob_effects"), MOB_EFFECTS)
|
||||
Registry.register(BuiltInRegistries.DATA_COMPONENT_TYPE, ResourceLocation.parse("cobblemon:held_item_effect"), HELD_ITEM_EFFECT)
|
||||
Registry.register(BuiltInRegistries.DATA_COMPONENT_TYPE, ResourceLocation.parse("cobblemon:poke_ball"), POKE_BALL)
|
||||
}
|
||||
|
||||
override val registry = BuiltInRegistries.DATA_COMPONENT_TYPE
|
||||
override val resourceKey = Registries.DATA_COMPONENT_TYPE
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -172,6 +172,8 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
|
||||
val ANCIENT_GIGATON_BALL = pokeBallItem(PokeBalls.ANCIENT_GIGATON_BALL)
|
||||
@JvmField
|
||||
val ANCIENT_ORIGIN_BALL = pokeBallItem(PokeBalls.ANCIENT_ORIGIN_BALL)
|
||||
@JvmField
|
||||
val STRANGE_BALL = pokeBallItem(PokeBalls.STRANGE_BALL)
|
||||
|
||||
val pokedexes = mutableListOf<PokedexItem>()
|
||||
@JvmField
|
||||
@@ -1591,7 +1593,7 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
|
||||
|
||||
private fun pokeBallItem(pokeBall: PokeBall): PokeBallItem {
|
||||
val item = create(pokeBall.name.path, PokeBallItem(pokeBall))
|
||||
pokeBall.item = item
|
||||
pokeBall.stack = item.defaultInstance
|
||||
pokeBalls.add(item)
|
||||
return item
|
||||
}
|
||||
|
||||
@@ -10,14 +10,9 @@ package com.cobblemon.mod.common.api.drop
|
||||
|
||||
import com.cobblemon.mod.common.api.events.CobblemonEvents.LOOT_DROPPED
|
||||
import com.cobblemon.mod.common.api.events.drops.LootDroppedEvent
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import net.minecraft.core.registries.Registries
|
||||
import kotlin.random.Random
|
||||
import net.minecraft.network.RegistryFriendlyByteBuf
|
||||
import net.minecraft.resources.ResourceKey
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.server.level.ServerLevel
|
||||
import net.minecraft.server.level.ServerPlayer
|
||||
import net.minecraft.world.entity.LivingEntity
|
||||
@@ -110,11 +105,7 @@ class DropTable {
|
||||
) {
|
||||
LOOT_DROPPED.postThen(
|
||||
event = LootDroppedEvent(this, player, entity, drops),
|
||||
ifSucceeded = {
|
||||
val pokemon = (entity as? PokemonEntity)?.pokemon?.species?.resourceIdentifier ?: return@postThen
|
||||
it.drops.forEach { it.drop(entity, world, pos, player) }
|
||||
// val lootKey = ResourceKey.create(Registries.LOOT_TABLE, cobblemonResource("pokemon/${pokemon}"))
|
||||
}
|
||||
ifSucceeded = { it.drops.forEach { it.drop(entity, world, pos, player) } }
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -1,64 +0,0 @@
|
||||
package com.cobblemon.mod.common.api.drop
|
||||
|
||||
import net.minecraft.core.registries.Registries
|
||||
import net.minecraft.resources.ResourceKey
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.server.level.ServerLevel
|
||||
import net.minecraft.server.level.ServerPlayer
|
||||
import net.minecraft.world.entity.LivingEntity
|
||||
import net.minecraft.world.entity.item.ItemEntity
|
||||
import net.minecraft.world.level.storage.loot.LootParams
|
||||
import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets
|
||||
import net.minecraft.world.level.storage.loot.parameters.LootContextParams
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
/**
|
||||
* A drop entry that points to a vanilla loot table.
|
||||
*/
|
||||
class LootTableDropEntry(
|
||||
override val percentage: Float,
|
||||
override val quantity: Int,
|
||||
override val maxSelectableTimes: Int,
|
||||
val id: ResourceLocation
|
||||
) : DropEntry {
|
||||
override fun drop(
|
||||
entity: LivingEntity?,
|
||||
world: ServerLevel,
|
||||
pos: Vec3,
|
||||
player: ServerPlayer?
|
||||
) {
|
||||
val key = ResourceKey.create(Registries.LOOT_TABLE, id)
|
||||
val playerEntity = player as? LivingEntity
|
||||
if (entity == null) return
|
||||
if (playerEntity != null) {
|
||||
val params = LootParams.Builder(world)
|
||||
.withParameter(LootContextParams.ATTACKING_ENTITY, playerEntity)
|
||||
.withParameter(LootContextParams.DAMAGE_SOURCE, playerEntity.damageSources().genericKill())
|
||||
.withParameter(LootContextParams.ORIGIN, pos)
|
||||
.withParameter(LootContextParams.THIS_ENTITY, entity)
|
||||
.create(LootContextParamSets.ENTITY)
|
||||
val drops = world.server.reloadableRegistries().getLootTable(key)
|
||||
.getRandomItems(params)
|
||||
for (stack in drops) {
|
||||
if (stack.isEmpty) continue
|
||||
|
||||
val itemEntity = ItemEntity(world, pos.x, pos.y, pos.z, stack)
|
||||
itemEntity.setDefaultPickUpDelay()
|
||||
world.addFreshEntity(itemEntity)
|
||||
}
|
||||
} else {
|
||||
val params = LootParams.Builder(world)
|
||||
.create(LootContextParamSets.EMPTY)
|
||||
val drops = world.server.reloadableRegistries().getLootTable(key)
|
||||
.getRandomItems(params)
|
||||
for (stack in drops) {
|
||||
if (stack.isEmpty) continue
|
||||
|
||||
val itemEntity = ItemEntity(world, pos.x, pos.y, pos.z, stack)
|
||||
itemEntity.setDefaultPickUpDelay()
|
||||
world.addFreshEntity(itemEntity)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
+3
-2
@@ -25,6 +25,7 @@ data class PokemonCapturedEvent (
|
||||
"pokemon" to pokemon.struct,
|
||||
"player" to player.asMoLangValue(),
|
||||
"poke_ball" to pokeBallEntity.struct,
|
||||
"item" to player.level().itemRegistry.wrapAsHolder(pokeBallEntity.pokeBall.item).asMoLangValue(Registries.ITEM)
|
||||
"item" to player.level().itemRegistry.wrapAsHolder(pokeBallEntity.pokeBall.item()).asMoLangValue(Registries.ITEM),
|
||||
"stack" to pokeBallEntity.pokeBall.stack.asMoLangValue(player.level().registryAccess())
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,6 +37,7 @@ import com.cobblemon.mod.common.api.molang.function.NPCMoLangFunctions
|
||||
import com.cobblemon.mod.common.api.molang.function.PCMoLangFunctions
|
||||
import com.cobblemon.mod.common.api.molang.function.PartyMoLangFunctions
|
||||
import com.cobblemon.mod.common.api.molang.function.PlayerMoLangFunctions
|
||||
import com.cobblemon.mod.common.api.molang.function.PokeBallMoLangFunctions
|
||||
import com.cobblemon.mod.common.api.molang.function.PokedexMoLangFunctions
|
||||
import com.cobblemon.mod.common.api.molang.function.PokemonEntityMoLangFunctions
|
||||
import com.cobblemon.mod.common.api.molang.function.PokemonMoLangFunctions
|
||||
@@ -56,6 +57,7 @@ import com.cobblemon.mod.common.api.storage.party.PartyStore
|
||||
import com.cobblemon.mod.common.api.storage.pc.PCStore
|
||||
import com.cobblemon.mod.common.entity.npc.NPCEntity
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||
import com.cobblemon.mod.common.pokeball.PokeBall
|
||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||
import com.cobblemon.mod.common.pokemon.Species
|
||||
import com.cobblemon.mod.common.util.effectiveName
|
||||
@@ -262,6 +264,18 @@ object MoLangFunctions {
|
||||
return value
|
||||
}
|
||||
|
||||
fun PokeBall.asMoLangValue(): ObjectValue<PokeBall> {
|
||||
val value =
|
||||
ObjectValue(
|
||||
obj = this,
|
||||
stringify = { it.name.toString() }
|
||||
)
|
||||
|
||||
value.addFunctions(PokeBallMoLangFunctions.attach(this))
|
||||
|
||||
return value
|
||||
}
|
||||
|
||||
fun Vec3.asMoLangValue(): ObjectValue<Vec3> {
|
||||
val value =
|
||||
ObjectValue(
|
||||
@@ -389,6 +403,12 @@ object MoLangFunctions {
|
||||
return this
|
||||
}
|
||||
|
||||
fun QueryStruct.addPokeBallFunctions(ball: PokeBall): QueryStruct {
|
||||
val addedFunctions = PokeBallMoLangFunctions.attach(ball)
|
||||
addFunctions(addedFunctions)
|
||||
return this
|
||||
}
|
||||
|
||||
fun <T : QueryStruct> T.addFunctions(functions: Map<String, Function<MoParams, Any>>): T {
|
||||
this.functions.putAll(functions)
|
||||
return this
|
||||
|
||||
+10
@@ -23,6 +23,7 @@ import com.cobblemon.mod.common.api.scheduling.Schedulable
|
||||
import com.cobblemon.mod.common.api.text.text
|
||||
import com.cobblemon.mod.common.entity.MoLangScriptingEntity
|
||||
import com.cobblemon.mod.common.entity.PosableEntity
|
||||
import com.cobblemon.mod.common.entity.pokeball.EmptyPokeBallEntity
|
||||
import com.cobblemon.mod.common.net.messages.client.animation.PlayPosableAnimationPacket
|
||||
import com.cobblemon.mod.common.net.messages.client.effect.SpawnSnowstormEntityParticlePacket
|
||||
import com.cobblemon.mod.common.util.asArrayValue
|
||||
@@ -307,6 +308,15 @@ object EntityMoLangFunctions : AbstractMoLangFunctionHolder<Entity>() {
|
||||
functions["face"] = { params ->
|
||||
ObjectValue(ReferenceDialogueFaceProvider(entity.id, params.getBooleanOrNull(0) != false))
|
||||
}
|
||||
|
||||
// EmptyPokeBallEntity is a subclass of PosableEntity
|
||||
// meaning we need to add a condition here to attach our func
|
||||
// only to instance of EmptyPokeBallEntity
|
||||
if (entity is EmptyPokeBallEntity) {
|
||||
functions["capture_state"] = {
|
||||
StringValue(entity.captureState.toString())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
is Schedulable -> {
|
||||
|
||||
+2
-2
@@ -98,14 +98,14 @@ object LivingEntityMoLangFunctions : AbstractMoLangFunctionHolder<LivingEntity>(
|
||||
val targetEntity = params.get<MoValue>(0)
|
||||
val maxDistance = params.getDoubleOrNull(1)?.toFloat() ?: 2.0F
|
||||
|
||||
val target =
|
||||
val entity =
|
||||
if (targetEntity is ObjectValue<*> && targetEntity.obj is Entity) {
|
||||
targetEntity.obj as Entity
|
||||
} else {
|
||||
return@isLookingAt DoubleValue.ZERO
|
||||
}
|
||||
|
||||
DoubleValue(entity.isLookingAt(target, maxDistance))
|
||||
DoubleValue(entity.isLookingAt(entity, maxDistance))
|
||||
}
|
||||
functions["is_living_entity"] = { DoubleValue.ONE }
|
||||
functions["is_flying"] = { DoubleValue(entity.isFallFlying) }
|
||||
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.api.molang.function
|
||||
|
||||
import com.bedrockk.molang.runtime.MoParams
|
||||
import com.bedrockk.molang.runtime.value.DoubleValue
|
||||
import com.cobblemon.mod.common.api.battles.interpreter.BattleMessage
|
||||
import com.cobblemon.mod.common.pokeball.PokeBall
|
||||
import com.cobblemon.mod.common.util.getStringOrNull
|
||||
|
||||
object PokeBallMoLangFunctions : AbstractMoLangFunctionHolder<PokeBall>() {
|
||||
override fun PokeBall.moLangFunctions(): MutableMap<String, (MoParams) -> Any> {
|
||||
val ball = this
|
||||
val functions = hashMapOf<String, (MoParams) -> Any>()
|
||||
|
||||
|
||||
return functions
|
||||
}
|
||||
}
|
||||
+6
-1
@@ -47,6 +47,10 @@ object PokemonMoLangFunctions : AbstractMoLangFunctionHolder<Pokemon>() {
|
||||
functions["max_hp"] = { DoubleValue(pokemon.maxHealth.toDouble()) }
|
||||
functions["current_hp"] = { DoubleValue(pokemon.currentHealth.toDouble()) }
|
||||
functions["friendship"] = { DoubleValue(pokemon.friendship.toDouble()) }
|
||||
functions["set_friendship"] = { params ->
|
||||
val amount = params.getDouble(0)
|
||||
pokemon.setFriendship(amount.toInt())
|
||||
}
|
||||
functions["max_fullness"] = { DoubleValue(pokemon.getMaxFullness().toDouble()) }
|
||||
functions["fullness"] = { DoubleValue(pokemon.currentFullness.toDouble()) }
|
||||
functions["lose_fullness"] = { params ->
|
||||
@@ -212,7 +216,7 @@ object PokemonMoLangFunctions : AbstractMoLangFunctionHolder<Pokemon>() {
|
||||
// Lol. Lmao, even.
|
||||
// TO-DO: Subscribe to [PokemonSpecies.observable].
|
||||
functions["pre_evolution"] = { pokemon.species.preEvolution ?: DoubleValue.ZERO }
|
||||
functions["nature"] = { StringValue(pokemon.nature.name.toString()) }
|
||||
functions["nature"] = { StringValue(pokemon.nature.toString()) }
|
||||
functions["is_wild"] = { DoubleValue(pokemon.entity?.let { it.ownerUUID == null } == true) }
|
||||
functions["is_shiny"] = { DoubleValue(pokemon.shiny) }
|
||||
functions["is_in_party"] = { DoubleValue(pokemon.storeCoordinates.get()?.store is PartyStore) }
|
||||
@@ -452,6 +456,7 @@ object PokemonMoLangFunctions : AbstractMoLangFunctionHolder<Pokemon>() {
|
||||
functions["entity"] = { pokemon.entity?.asMoLangValue() ?: DoubleValue.ZERO }
|
||||
functions["is_alpha"] = { DoubleValue(pokemon.isAlpha) }
|
||||
functions["size_category"] = { StringValue(pokemon.getSizeCategory().name) }
|
||||
functions["full_heal"] = { pokemon.heal() }
|
||||
|
||||
return functions
|
||||
}
|
||||
|
||||
@@ -8,27 +8,47 @@
|
||||
|
||||
package com.cobblemon.mod.common.api.pokeball
|
||||
|
||||
import com.bedrockk.molang.Expression
|
||||
import com.cobblemon.mod.common.Cobblemon
|
||||
import com.cobblemon.mod.common.api.Priority
|
||||
import com.cobblemon.mod.common.api.data.JsonDataRegistry
|
||||
import com.cobblemon.mod.common.api.events.CobblemonEvents
|
||||
import com.cobblemon.mod.common.api.molang.ExpressionLike
|
||||
import com.cobblemon.mod.common.api.pokeball.catching.CaptureEffect
|
||||
import com.cobblemon.mod.common.api.pokeball.catching.CatchRateModifier
|
||||
import com.cobblemon.mod.common.api.pokeball.catching.effects.CaptureEffects
|
||||
import com.cobblemon.mod.common.api.pokeball.catching.effects.FriendshipEarningBoostEffect
|
||||
import com.cobblemon.mod.common.api.pokeball.catching.modifiers.*
|
||||
import com.cobblemon.mod.common.api.pokeball.catching.modifiers.BaseStatModifier
|
||||
import com.cobblemon.mod.common.api.pokeball.catching.modifiers.CatchRateModifiers
|
||||
import com.cobblemon.mod.common.api.pokeball.catching.modifiers.DynamicMultiplierModifier
|
||||
import com.cobblemon.mod.common.api.pokeball.catching.modifiers.GuaranteedModifier
|
||||
import com.cobblemon.mod.common.api.pokeball.catching.modifiers.MultiplierModifier
|
||||
import com.cobblemon.mod.common.api.pokemon.labels.CobblemonPokemonLabels
|
||||
import com.cobblemon.mod.common.api.pokemon.stats.Stats
|
||||
import com.cobblemon.mod.common.api.pokemon.status.Statuses
|
||||
import com.cobblemon.mod.common.api.reactive.SimpleObservable
|
||||
import com.cobblemon.mod.common.api.types.ElementalTypes
|
||||
import com.cobblemon.mod.common.item.components.PokeBallComponent
|
||||
import com.cobblemon.mod.common.pokeball.PokeBall
|
||||
import com.cobblemon.mod.common.util.adapters.CobblemonCaptureEffectAdapter
|
||||
import com.cobblemon.mod.common.util.adapters.CobblemonCatchRateModifierAdapter
|
||||
import com.cobblemon.mod.common.util.adapters.ExpressionAdapter
|
||||
import com.cobblemon.mod.common.util.adapters.ExpressionLikeAdapter
|
||||
import com.cobblemon.mod.common.util.adapters.FloatNumberRangeAdapter
|
||||
import com.cobblemon.mod.common.util.adapters.IdentifierAdapter
|
||||
import com.cobblemon.mod.common.util.adapters.IntRangeAdapter
|
||||
import com.cobblemon.mod.common.util.adapters.LiteralHexColorAdapter
|
||||
import com.cobblemon.mod.common.util.asExpressionLike
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import com.google.gson.Gson
|
||||
import com.google.gson.GsonBuilder
|
||||
import com.google.gson.reflect.TypeToken
|
||||
import net.minecraft.advancements.critereon.MinMaxBounds
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.server.level.ServerPlayer
|
||||
import net.minecraft.server.packs.PackType
|
||||
import net.minecraft.util.LowerCaseEnumTypeAdapterFactory
|
||||
import java.awt.Color
|
||||
import kotlin.math.roundToInt
|
||||
|
||||
/**
|
||||
@@ -43,6 +63,15 @@ object PokeBalls : JsonDataRegistry<PokeBall> {
|
||||
|
||||
// ToDo once datapack pokeball is implemented add required adapters here
|
||||
override val gson: Gson = GsonBuilder()
|
||||
.registerTypeAdapter(ResourceLocation::class.java, IdentifierAdapter)
|
||||
.registerTypeAdapter(Expression::class.java, ExpressionAdapter)
|
||||
.registerTypeAdapter(ExpressionLike::class.java, ExpressionLikeAdapter)
|
||||
.registerTypeAdapter(IntRange::class.java, IntRangeAdapter)
|
||||
.registerTypeAdapter(MinMaxBounds.Doubles::class.java, FloatNumberRangeAdapter)
|
||||
.registerTypeAdapter(CatchRateModifier::class.java, CobblemonCatchRateModifierAdapter)
|
||||
.registerTypeAdapter(CaptureEffect::class.java, CobblemonCaptureEffectAdapter)
|
||||
.registerTypeAdapter(Color::class.java, LiteralHexColorAdapter)
|
||||
.registerTypeAdapterFactory(LowerCaseEnumTypeAdapterFactory())
|
||||
.disableHtmlEscaping()
|
||||
.setPrettyPrinting()
|
||||
.create()
|
||||
@@ -50,8 +79,8 @@ object PokeBalls : JsonDataRegistry<PokeBall> {
|
||||
override val resourcePath = "pokeballs"
|
||||
|
||||
private val defaults = hashMapOf<ResourceLocation, PokeBall>()
|
||||
// ToDo datapack pokeball type here instead
|
||||
private val custom = hashMapOf<ResourceLocation, PokeBall>()
|
||||
|
||||
val custom = hashMapOf<ResourceLocation, PokeBall>()
|
||||
|
||||
@JvmStatic
|
||||
@get:JvmName("getPokeBall")
|
||||
@@ -245,6 +274,10 @@ object PokeBalls : JsonDataRegistry<PokeBall> {
|
||||
@get:JvmName("getAncientOriginBall")
|
||||
val ANCIENT_ORIGIN_BALL
|
||||
get() = this.byName("ancient_origin_ball")
|
||||
@JvmStatic
|
||||
@get:JvmName("getStrangeBall")
|
||||
val STRANGE_BALL
|
||||
get() = this.byName("strange_ball")
|
||||
|
||||
init {
|
||||
createDefault("poke_ball")
|
||||
@@ -257,12 +290,12 @@ object PokeBalls : JsonDataRegistry<PokeBall> {
|
||||
createDefault("ultra_ball", MultiplierModifier(2F))
|
||||
createDefault("master_ball", GuaranteedModifier())
|
||||
createDefault("safari_ball", CatchRateModifiers.SAFARI)
|
||||
createDefault("fast_ball", BaseStatModifier(Stats.SPEED, { it >= 100 }, 4F))
|
||||
createDefault("fast_ball", BaseStatModifier(Stats.SPEED, 100, BaseStatModifier.Comparator.GTE, 4F))
|
||||
createDefault("level_ball", CatchRateModifiers.LEVEL)
|
||||
createDefault("lure_ball", CatchRateModifiers.LURE)
|
||||
createDefault("heavy_ball", CatchRateModifiers.WEIGHT_BASED)
|
||||
createDefault("love_ball", CatchRateModifiers.LOVE)
|
||||
createDefault("friend_ball", effects = listOf(CaptureEffects.friendshipSetter(150)))
|
||||
createDefault("friend_ball", effects = listOf("q.pokemon.set_friendship(150.0)".asExpressionLike()))
|
||||
createDefault("moon_ball", CatchRateModifiers.MOON_PHASES)
|
||||
createDefault("sport_ball", MultiplierModifier(1.5F))
|
||||
createDefault("net_ball", CatchRateModifiers.typeBoosting(3F, ElementalTypes.BUG, ElementalTypes.WATER))
|
||||
@@ -270,10 +303,10 @@ object PokeBalls : JsonDataRegistry<PokeBall> {
|
||||
createDefault("nest_ball", CatchRateModifiers.NEST)
|
||||
createDefault("repeat_ball", CatchRateModifiers.REPEAT)
|
||||
createDefault("timer_ball", CatchRateModifiers.turnBased { turn -> (1F + turn * (1229F / 4096F)).coerceAtMost(4F) })
|
||||
createDefault("luxury_ball", effects = listOf(FriendshipEarningBoostEffect(2F)))
|
||||
createDefault("luxury_ball", /*effects = listOf(FriendshipEarningBoostEffect(2F))*/)
|
||||
createDefault("premier_ball")
|
||||
createDefault("dusk_ball", CatchRateModifiers.LIGHT_LEVEL)
|
||||
createDefault("heal_ball", effects = listOf(CaptureEffects.FULL_RESTORE))
|
||||
createDefault("heal_ball", effects = listOf("q.pokemon.heal()".asExpressionLike()))
|
||||
createDefault("quick_ball", CatchRateModifiers.turnBased { turn -> if (turn == 1) 5F else 1F })
|
||||
createDefault("cherish_ball")
|
||||
createDefault("park_ball", CatchRateModifiers.PARK)
|
||||
@@ -295,6 +328,9 @@ object PokeBalls : JsonDataRegistry<PokeBall> {
|
||||
createDefault("ancient_wing_ball", MultiplierModifier(1.5F), throwPower = 2.5f, ancient = true)
|
||||
createDefault("ancient_jet_ball", MultiplierModifier(2F), throwPower = 2.5f, ancient = true)
|
||||
createDefault("ancient_origin_ball", GuaranteedModifier(), ancient = true)
|
||||
// for customs
|
||||
createDefault("strange_ball")
|
||||
|
||||
// Luxury ball effect, low priority as it must be triggered before soothe bell as of gen 4
|
||||
CobblemonEvents.FRIENDSHIP_UPDATED.subscribe(priority = Priority.LOW) { event ->
|
||||
if (!event.earned) {
|
||||
@@ -311,8 +347,20 @@ object PokeBalls : JsonDataRegistry<PokeBall> {
|
||||
}
|
||||
|
||||
override fun reload(data: Map<ResourceLocation, PokeBall>) {
|
||||
data.entries.forEach { it.value.name = it.key }
|
||||
this.custom.clear()
|
||||
// ToDo once datapack pokeball is implemented load them here, we will want datapacks to be able to override our default pokeballs too, however they will never be able to disable them
|
||||
|
||||
data.forEach { (location, ball) ->
|
||||
if (defaults.containsKey(location)) {
|
||||
ball.stack = defaults[location]!!.stack
|
||||
} else {
|
||||
ball.stack = PokeBallComponent.createStack(ball)
|
||||
}
|
||||
|
||||
this.custom[location] = ball
|
||||
}
|
||||
|
||||
Cobblemon.LOGGER.info("Loaded ${data.size} custom poke balls.")
|
||||
}
|
||||
|
||||
override fun sync(player: ServerPlayer) {
|
||||
@@ -321,10 +369,11 @@ object PokeBalls : JsonDataRegistry<PokeBall> {
|
||||
|
||||
/**
|
||||
* Gets a Pokeball from registry name.
|
||||
* @return the pokeball object if found otherwise null.
|
||||
* @return the pokeball object if found otherwise strange ball.
|
||||
*/
|
||||
@JvmStatic
|
||||
fun getPokeBall(name : ResourceLocation): PokeBall? = this.custom[name] ?: this.defaults[name]
|
||||
fun getPokeBall(name : ResourceLocation): PokeBall =
|
||||
this.custom[name] ?: this.defaults[name] ?: STRANGE_BALL
|
||||
|
||||
@JvmStatic
|
||||
fun all() = this.defaults.filterKeys { !this.custom.containsKey(it) }.values + this.custom.values
|
||||
@@ -332,213 +381,22 @@ object PokeBalls : JsonDataRegistry<PokeBall> {
|
||||
private fun createDefault(
|
||||
name: String,
|
||||
modifier: CatchRateModifier = MultiplierModifier(1F) { _, _ -> true },
|
||||
effects: List<CaptureEffect> = emptyList(),
|
||||
effects: List<ExpressionLike> = emptyList(),
|
||||
waterDragValue: Float = 0.8F,
|
||||
model2d: ResourceLocation = cobblemonResource(name),
|
||||
model3d: ResourceLocation = cobblemonResource("item/${name}_model"),
|
||||
throwPower: Float = 1.25f,
|
||||
ancient: Boolean = false
|
||||
ancient: Boolean = false,
|
||||
color: Color = Color.decode("#ff1111")
|
||||
): PokeBall {
|
||||
val identifier = cobblemonResource(name)
|
||||
val pokeball = PokeBall(identifier, modifier, effects, waterDragValue, model2d, model3d, throwPower, ancient)
|
||||
val pokeball = PokeBall(identifier, modifier, effects, PokeBall.PokeBallProperties(), waterDragValue, model2d, model3d, throwPower, ancient, color)
|
||||
this.defaults[identifier] = pokeball
|
||||
return pokeball
|
||||
}
|
||||
|
||||
private fun byName(name: String): PokeBall {
|
||||
fun byName(name: String): PokeBall {
|
||||
val identifier = cobblemonResource(name)
|
||||
return this.custom[identifier] ?: this.defaults[identifier]!!
|
||||
}
|
||||
|
||||
/**
|
||||
* Backwards compatibility getters
|
||||
*/
|
||||
@JvmName("getPOKE_BALL")
|
||||
@Deprecated("Use PokeBalls.getPokeBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getPOKE_BALL() = POKE_BALL
|
||||
|
||||
@JvmName("getSLATE_BALL")
|
||||
@Deprecated("Use PokeBalls.getSlateBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getSLATE_BALL() = SLATE_BALL
|
||||
|
||||
@JvmName("getAZURE_BALL")
|
||||
@Deprecated("Use PokeBalls.getAzureBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getAZURE_BALL() = AZURE_BALL
|
||||
|
||||
@JvmName("getVERDANT_BALL")
|
||||
@Deprecated("Use PokeBalls.getVerdantBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getVERDANT_BALL() = VERDANT_BALL
|
||||
|
||||
@JvmName("getROSEATE_BALL")
|
||||
@Deprecated("Use PokeBalls.getRoseateBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getROSEATE_BALL() = ROSEATE_BALL
|
||||
|
||||
@JvmName("getCITRINE_BALL")
|
||||
@Deprecated("Use PokeBalls.getCitrineBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getCITRINE_BALL() = CITRINE_BALL
|
||||
|
||||
@JvmName("getGREAT_BALL")
|
||||
@Deprecated("Use PokeBalls.getGreatBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getGREAT_BALL() = GREAT_BALL
|
||||
|
||||
@JvmName("getULTRA_BALL")
|
||||
@Deprecated("Use PokeBalls.getUltraBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getULTRA_BALL() = ULTRA_BALL
|
||||
|
||||
@JvmName("getMASTER_BALL")
|
||||
@Deprecated("Use PokeBalls.getMasterBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getMASTER_BALL() = MASTER_BALL
|
||||
|
||||
@JvmName("getSAFARI_BALL")
|
||||
@Deprecated("Use PokeBalls.getSafariBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getSAFARI_BALL() = SAFARI_BALL
|
||||
|
||||
@JvmName("getFAST_BALL")
|
||||
@Deprecated("Use PokeBalls.getFastBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getFAST_BALL() = FAST_BALL
|
||||
|
||||
@JvmName("getLEVEL_BALL")
|
||||
@Deprecated("Use PokeBalls.getLevelBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getLEVEL_BALL() = LEVEL_BALL
|
||||
|
||||
@JvmName("getLURE_BALL")
|
||||
@Deprecated("Use PokeBalls.getLureBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getLURE_BALL() = LURE_BALL
|
||||
|
||||
@JvmName("getHEAVY_BALL")
|
||||
@Deprecated("Use PokeBalls.getHeavyBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getHEAVY_BALL() = HEAVY_BALL
|
||||
|
||||
@JvmName("getLOVE_BALL")
|
||||
@Deprecated("Use PokeBalls.getLoveBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getLOVE_BALL() = LOVE_BALL
|
||||
|
||||
@JvmName("getFRIEND_BALL")
|
||||
@Deprecated("Use PokeBalls.getFriendBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getFRIEND_BALL() = FRIEND_BALL
|
||||
|
||||
@JvmName("getMOON_BALL")
|
||||
@Deprecated("Use PokeBalls.getMoonBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getMOON_BALL() = MOON_BALL
|
||||
|
||||
@JvmName("getSPORT_BALL")
|
||||
@Deprecated("Use PokeBalls.getSportBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getSPORT_BALL() = SPORT_BALL
|
||||
|
||||
@JvmName("getNET_BALL")
|
||||
@Deprecated("Use PokeBalls.getNetBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getNET_BALL() = NET_BALL
|
||||
|
||||
@JvmName("getNEST_BALL")
|
||||
@Deprecated("Use PokeBalls.getNestBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getNEST_BALL() = NEST_BALL
|
||||
|
||||
@JvmName("getREPEAT_BALL")
|
||||
@Deprecated("Use PokeBalls.getRepeatBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getREPEAT_BALL() = REPEAT_BALL
|
||||
|
||||
@JvmName("getTIMER_BALL")
|
||||
@Deprecated("Use PokeBalls.getTimerBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getTIMER_BALL() = TIMER_BALL
|
||||
|
||||
@JvmName("getLUXURY_BALL")
|
||||
@Deprecated("Use PokeBalls.getLuxuryBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getLUXURY_BALL() = LUXURY_BALL
|
||||
|
||||
@JvmName("getPREMIER_BALL")
|
||||
@Deprecated("Use PokeBalls.getPremierBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getPREMIER_BALL() = PREMIER_BALL
|
||||
|
||||
@JvmName("getDUSK_BALL")
|
||||
@Deprecated("Use PokeBalls.getDuskBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getDUSK_BALL() = DUSK_BALL
|
||||
|
||||
@JvmName("getHEAL_BALL")
|
||||
@Deprecated("Use PokeBalls.getHealBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getHEAL_BALL() = HEAL_BALL
|
||||
|
||||
@JvmName("getQUICK_BALL")
|
||||
@Deprecated("Use PokeBalls.getQuickBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getQUICK_BALL() = QUICK_BALL
|
||||
|
||||
@JvmName("getCHERISH_BALL")
|
||||
@Deprecated("Use PokeBalls.getCherishBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getCHERISH_BALL() = CHERISH_BALL
|
||||
|
||||
@JvmName("getPARK_BALL")
|
||||
@Deprecated("Use PokeBalls.getParkBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getPARK_BALL() = PARK_BALL
|
||||
|
||||
@JvmName("getDREAM_BALL")
|
||||
@Deprecated("Use PokeBalls.getDreamBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getDREAM_BALL() = DREAM_BALL
|
||||
|
||||
@JvmName("getBEAST_BALL")
|
||||
@Deprecated("Use PokeBalls.getBeastBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getBEAST_BALL() = BEAST_BALL
|
||||
|
||||
@JvmName("getANCIENT_POKE_BALL")
|
||||
@Deprecated("Use PokeBalls.getAncientPokeBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getANCIENT_POKE_BALL() = ANCIENT_POKE_BALL
|
||||
|
||||
@JvmName("getANCIENT_CITRINE_BALL")
|
||||
@Deprecated("Use PokeBalls.getAncientCitrineBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getANCIENT_CITRINE_BALL() = ANCIENT_CITRINE_BALL
|
||||
|
||||
@JvmName("getANCIENT_VERDANT_BALL")
|
||||
@Deprecated("Use PokeBalls.getAncientVerdantBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getANCIENT_VERDANT_BALL() = ANCIENT_VERDANT_BALL
|
||||
|
||||
@JvmName("getANCIENT_AZURE_BALL")
|
||||
@Deprecated("Use PokeBalls.getAncientAzureBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getANCIENT_AZURE_BALL() = ANCIENT_AZURE_BALL
|
||||
|
||||
@JvmName("getANCIENT_ROSEATE_BALL")
|
||||
@Deprecated("Use PokeBalls.getAncientRoseateBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getANCIENT_ROSEATE_BALL() = ANCIENT_ROSEATE_BALL
|
||||
|
||||
@JvmName("getANCIENT_SLATE_BALL")
|
||||
@Deprecated("Use PokeBalls.getAncientSlateBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getANCIENT_SLATE_BALL() = ANCIENT_SLATE_BALL
|
||||
|
||||
@JvmName("getANCIENT_IVORY_BALL")
|
||||
@Deprecated("Use PokeBalls.getAncientIvoryBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getANCIENT_IVORY_BALL() = ANCIENT_IVORY_BALL
|
||||
|
||||
@JvmName("getANCIENT_GREAT_BALL")
|
||||
@Deprecated("Use PokeBalls.getAncientGreatBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getANCIENT_GREAT_BALL() = ANCIENT_GREAT_BALL
|
||||
|
||||
@JvmName("getANCIENT_ULTRA_BALL")
|
||||
@Deprecated("Use PokeBalls.getAncientUltraBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getANCIENT_ULTRA_BALL() = ANCIENT_ULTRA_BALL
|
||||
|
||||
@JvmName("getANCIENT_HEAVY_BALL")
|
||||
@Deprecated("Use PokeBalls.getAncientHeavyBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getANCIENT_HEAVY_BALL() = ANCIENT_HEAVY_BALL
|
||||
|
||||
@JvmName("getANCIENT_LEADEN_BALL")
|
||||
@Deprecated("Use PokeBalls.getAncientLeadenBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getANCIENT_LEADEN_BALL() = ANCIENT_LEADEN_BALL
|
||||
|
||||
@JvmName("getANCIENT_GIGATON_BALL")
|
||||
@Deprecated("Use PokeBalls.getAncientGigatonBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getANCIENT_GIGATON_BALL() = ANCIENT_GIGATON_BALL
|
||||
|
||||
@JvmName("getANCIENT_FEATHER_BALL")
|
||||
@Deprecated("Use PokeBalls.getAncientFeatherBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getANCIENT_FEATHER_BALL() = ANCIENT_FEATHER_BALL
|
||||
|
||||
@JvmName("getANCIENT_WING_BALL")
|
||||
@Deprecated("Use PokeBalls.getAncientWingBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getANCIENT_WING_BALL() = ANCIENT_WING_BALL
|
||||
|
||||
@JvmName("getANCIENT_JET_BALL")
|
||||
@Deprecated("Use PokeBalls.getAncientJetBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getANCIENT_JET_BALL() = ANCIENT_JET_BALL
|
||||
|
||||
@JvmName("getANCIENT_ORIGIN_BALL")
|
||||
@Deprecated("Use PokeBalls.getAncientOriginBall(), provided for backwards compatibility until Cobblemon 1.8.")
|
||||
fun getANCIENT_ORIGIN_BALL() = ANCIENT_ORIGIN_BALL
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
+6
-2
@@ -18,6 +18,10 @@ import net.minecraft.world.entity.LivingEntity
|
||||
*
|
||||
* @property multiplier The multiplier for friendship gains
|
||||
*/
|
||||
class FriendshipEarningBoostEffect(val multiplier: Float) : CaptureEffect {
|
||||
data class FriendshipEarningBoostEffect(val multiplier: Float) : CaptureEffect {
|
||||
companion object {
|
||||
const val VARIANT = "friendship_boost"
|
||||
}
|
||||
|
||||
override fun apply(thrower: LivingEntity, pokemon: Pokemon) {}
|
||||
}
|
||||
}
|
||||
|
||||
+36
-4
@@ -11,6 +11,7 @@ package com.cobblemon.mod.common.api.pokeball.catching.modifiers
|
||||
import com.cobblemon.mod.common.api.pokeball.catching.CatchRateModifier
|
||||
import com.cobblemon.mod.common.api.pokemon.stats.Stat
|
||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||
import net.minecraft.util.StringRepresentable
|
||||
import net.minecraft.world.entity.LivingEntity
|
||||
|
||||
/**
|
||||
@@ -26,9 +27,13 @@ import net.minecraft.world.entity.LivingEntity
|
||||
*/
|
||||
class BaseStatModifier(
|
||||
val stat: Stat,
|
||||
val comparator: (value: Int) -> Boolean,
|
||||
val multiplier: Float
|
||||
val value: Int,
|
||||
val comparator: Comparator,
|
||||
val multiplier: Float,
|
||||
) : CatchRateModifier {
|
||||
companion object {
|
||||
const val VARIANT = "bst"
|
||||
}
|
||||
|
||||
init {
|
||||
if (stat.type != Stat.Type.PERMANENT) {
|
||||
@@ -44,9 +49,36 @@ class BaseStatModifier(
|
||||
|
||||
override fun isValid(thrower: LivingEntity, pokemon: Pokemon): Boolean {
|
||||
val valStat = pokemon.form.baseStats[this.stat] ?: return false
|
||||
return comparator(valStat)
|
||||
return when (comparator) {
|
||||
Comparator.GT -> value > valStat
|
||||
Comparator.LT -> value < valStat
|
||||
Comparator.GTE -> value >= valStat
|
||||
Comparator.LTE -> value <= valStat
|
||||
Comparator.EQ -> value == valStat
|
||||
Comparator.NOT -> value != valStat
|
||||
}
|
||||
}
|
||||
|
||||
override fun modifyCatchRate(currentCatchRate: Float, thrower: LivingEntity, pokemon: Pokemon): Float = this.behavior(thrower, pokemon).mutator(currentCatchRate, this.value(thrower, pokemon))
|
||||
override fun modifyCatchRate(
|
||||
currentCatchRate: Float,
|
||||
thrower: LivingEntity,
|
||||
pokemon: Pokemon,
|
||||
): Float = this.behavior(thrower, pokemon).mutator(currentCatchRate, this.value(thrower, pokemon))
|
||||
|
||||
enum class Comparator : StringRepresentable {
|
||||
@JvmField
|
||||
GT,
|
||||
@JvmField
|
||||
LT,
|
||||
@JvmField
|
||||
GTE,
|
||||
@JvmField
|
||||
LTE,
|
||||
@JvmField
|
||||
EQ,
|
||||
@JvmField
|
||||
NOT,
|
||||
;
|
||||
override fun getSerializedName(): String = this.name.lowercase()
|
||||
}
|
||||
}
|
||||
|
||||
+78
@@ -0,0 +1,78 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.api.pokeball.catching.modifiers
|
||||
|
||||
import com.bedrockk.molang.runtime.MoLangRuntime
|
||||
import com.cobblemon.mod.common.api.molang.ExpressionLike
|
||||
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asBiomeMoLangValue
|
||||
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asStruct
|
||||
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asWorldMoLangValue
|
||||
import com.cobblemon.mod.common.api.molang.MoLangFunctions.setup
|
||||
import com.cobblemon.mod.common.api.pokeball.catching.CatchRateModifier
|
||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||
import com.cobblemon.mod.common.util.asExpressionLike
|
||||
import com.cobblemon.mod.common.util.toBlockPos
|
||||
import com.cobblemon.mod.common.util.withPlayerValue
|
||||
import com.cobblemon.mod.common.util.withQueryValue
|
||||
import net.minecraft.core.registries.Registries
|
||||
import net.minecraft.server.level.ServerPlayer
|
||||
import net.minecraft.world.entity.LivingEntity
|
||||
|
||||
class ExpressionModifier(
|
||||
val query: ExpressionLike = "1.0".asExpressionLike(),
|
||||
) : CatchRateModifier {
|
||||
companion object {
|
||||
const val VARIANT = "expression"
|
||||
val runtime = MoLangRuntime().setup()
|
||||
}
|
||||
|
||||
override fun isGuaranteed(): Boolean = false
|
||||
|
||||
override fun value(
|
||||
thrower: LivingEntity,
|
||||
pokemon: Pokemon
|
||||
): Float {
|
||||
val worldValue =
|
||||
thrower
|
||||
.level()
|
||||
.registryAccess()
|
||||
.registryOrThrow(Registries.DIMENSION)
|
||||
.wrapAsHolder(thrower.level())
|
||||
.asWorldMoLangValue()
|
||||
|
||||
val biomeValue = thrower.level().getBiome(thrower.position().toBlockPos()).asBiomeMoLangValue()
|
||||
|
||||
var ballRuntime = runtime
|
||||
.withQueryValue("world", worldValue)
|
||||
.withQueryValue("biome", biomeValue)
|
||||
.withQueryValue("pokemon", pokemon.asStruct())
|
||||
|
||||
if (thrower is ServerPlayer) {
|
||||
ballRuntime = ballRuntime.withPlayerValue("player", thrower)
|
||||
}
|
||||
|
||||
return query.resolveFloat(ballRuntime)
|
||||
}
|
||||
|
||||
override fun behavior(
|
||||
thrower: LivingEntity,
|
||||
pokemon: Pokemon
|
||||
): CatchRateModifier.Behavior = CatchRateModifier.Behavior.MULTIPLY
|
||||
|
||||
override fun isValid(
|
||||
thrower: LivingEntity,
|
||||
pokemon: Pokemon
|
||||
): Boolean = true
|
||||
|
||||
override fun modifyCatchRate(
|
||||
currentCatchRate: Float,
|
||||
thrower: LivingEntity,
|
||||
pokemon: Pokemon
|
||||
): Float = this.behavior(thrower, pokemon).mutator(currentCatchRate, this.value(thrower, pokemon))
|
||||
}
|
||||
+4
-2
@@ -19,11 +19,13 @@ import net.minecraft.world.entity.LivingEntity
|
||||
* @since August 9th, 2022
|
||||
*/
|
||||
class GuaranteedModifier : CatchRateModifier {
|
||||
|
||||
companion object {
|
||||
const val VARIANT = "guaranteed"
|
||||
}
|
||||
override fun isGuaranteed() = true
|
||||
override fun value(thrower: LivingEntity, pokemon: Pokemon): Float = 255F
|
||||
override fun behavior(thrower: LivingEntity, pokemon: Pokemon): CatchRateModifier.Behavior = CatchRateModifier.Behavior.MULTIPLY
|
||||
override fun isValid(thrower: LivingEntity, pokemon: Pokemon): Boolean = true
|
||||
override fun modifyCatchRate(currentCatchRate: Float, thrower: LivingEntity, pokemon: Pokemon): Float = this.behavior(thrower, pokemon).mutator(currentCatchRate, this.value(thrower, pokemon))
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
+11
-9
@@ -22,20 +22,22 @@ import net.minecraft.world.entity.LivingEntity
|
||||
* @property matching Will this multiplier should be applied if the labels match?
|
||||
* @property labels The literal labels being queried.
|
||||
*/
|
||||
class LabelModifier(
|
||||
val multiplier: Float,
|
||||
val matching: Boolean,
|
||||
vararg val labels: String
|
||||
) : CatchRateModifier {
|
||||
data class LabelModifier(val multiplier: Float, val matching: Boolean, val labels: List<String>) : CatchRateModifier {
|
||||
companion object {
|
||||
const val VARIANT = "labels"
|
||||
}
|
||||
|
||||
override fun isGuaranteed(): Boolean = false
|
||||
|
||||
override fun value(thrower: LivingEntity, pokemon: Pokemon): Float = this.multiplier
|
||||
|
||||
override fun behavior(thrower: LivingEntity, pokemon: Pokemon): CatchRateModifier.Behavior = CatchRateModifier.Behavior.MULTIPLY
|
||||
override fun behavior(thrower: LivingEntity, pokemon: Pokemon): CatchRateModifier.Behavior =
|
||||
CatchRateModifier.Behavior.MULTIPLY
|
||||
|
||||
override fun isValid(thrower: LivingEntity, pokemon: Pokemon): Boolean = if (this.matching) pokemon.hasLabels(*this.labels) else !pokemon.hasLabels(*this.labels)
|
||||
override fun isValid(thrower: LivingEntity, pokemon: Pokemon): Boolean =
|
||||
if (this.matching) pokemon.hasLabels(*this.labels.toSet().toTypedArray()) else !pokemon.hasLabels(*this.labels.toSet().toTypedArray())
|
||||
|
||||
override fun modifyCatchRate(currentCatchRate: Float, thrower: LivingEntity, pokemon: Pokemon): Float = this.behavior(thrower, pokemon).mutator(currentCatchRate, this.value(thrower, pokemon))
|
||||
override fun modifyCatchRate(currentCatchRate: Float, thrower: LivingEntity, pokemon: Pokemon): Float =
|
||||
this.behavior(thrower, pokemon).mutator(currentCatchRate, this.value(thrower, pokemon))
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
+8
-6
@@ -13,19 +13,21 @@ import com.cobblemon.mod.common.api.pokemon.PokemonProperties
|
||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||
import net.minecraft.world.entity.LivingEntity
|
||||
|
||||
class PropertyBasedModifier(
|
||||
val property: PokemonProperties,
|
||||
val multiplier: Float
|
||||
) : CatchRateModifier {
|
||||
data class PropertyBasedModifier(val property: PokemonProperties, val multiplier: Float) : CatchRateModifier {
|
||||
companion object {
|
||||
const val VARIANT = "property"
|
||||
}
|
||||
|
||||
override fun isGuaranteed(): Boolean = false
|
||||
|
||||
override fun value(thrower: LivingEntity, pokemon: Pokemon): Float = this.multiplier
|
||||
|
||||
override fun behavior(thrower: LivingEntity, pokemon: Pokemon): CatchRateModifier.Behavior = CatchRateModifier.Behavior.MULTIPLY
|
||||
override fun behavior(thrower: LivingEntity, pokemon: Pokemon): CatchRateModifier.Behavior =
|
||||
CatchRateModifier.Behavior.MULTIPLY
|
||||
|
||||
override fun isValid(thrower: LivingEntity, pokemon: Pokemon): Boolean = this.property.matches(pokemon)
|
||||
|
||||
override fun modifyCatchRate(currentCatchRate: Float, thrower: LivingEntity, pokemon: Pokemon): Float = this.behavior(thrower, pokemon).mutator(currentCatchRate, this.value(thrower, pokemon))
|
||||
override fun modifyCatchRate(currentCatchRate: Float, thrower: LivingEntity, pokemon: Pokemon): Float =
|
||||
this.behavior(thrower, pokemon).mutator(currentCatchRate, this.value(thrower, pokemon))
|
||||
|
||||
}
|
||||
|
||||
+80
@@ -0,0 +1,80 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.api.pokeball.catching.modifiers
|
||||
|
||||
import com.bedrockk.molang.runtime.MoLangRuntime
|
||||
import com.cobblemon.mod.common.api.molang.ExpressionLike
|
||||
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asBiomeMoLangValue
|
||||
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asStruct
|
||||
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asWorldMoLangValue
|
||||
import com.cobblemon.mod.common.api.molang.MoLangFunctions.setup
|
||||
import com.cobblemon.mod.common.api.pokeball.catching.CatchRateModifier
|
||||
import com.cobblemon.mod.common.api.scripting.CobblemonScripts
|
||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||
import com.cobblemon.mod.common.util.asExpressionLike
|
||||
import com.cobblemon.mod.common.util.toBlockPos
|
||||
import com.cobblemon.mod.common.util.withPlayerValue
|
||||
import com.cobblemon.mod.common.util.withQueryValue
|
||||
import net.minecraft.core.registries.Registries
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.server.level.ServerPlayer
|
||||
import net.minecraft.world.entity.LivingEntity
|
||||
|
||||
class ScriptModifier(
|
||||
val location: ResourceLocation
|
||||
) : CatchRateModifier {
|
||||
companion object {
|
||||
const val VARIANT = "script"
|
||||
val runtime = MoLangRuntime().setup()
|
||||
}
|
||||
|
||||
override fun isGuaranteed(): Boolean = false
|
||||
|
||||
override fun value(
|
||||
thrower: LivingEntity,
|
||||
pokemon: Pokemon
|
||||
): Float {
|
||||
val worldValue =
|
||||
thrower
|
||||
.level()
|
||||
.registryAccess()
|
||||
.registryOrThrow(Registries.DIMENSION)
|
||||
.wrapAsHolder(thrower.level())
|
||||
.asWorldMoLangValue()
|
||||
|
||||
val biomeValue = thrower.level().getBiome(thrower.position().toBlockPos()).asBiomeMoLangValue()
|
||||
|
||||
var ballRuntime = runtime
|
||||
.withQueryValue("world", worldValue)
|
||||
.withQueryValue("biome", biomeValue)
|
||||
.withQueryValue("pokemon", pokemon.asStruct())
|
||||
|
||||
if (thrower is ServerPlayer) {
|
||||
ballRuntime = ballRuntime.withPlayerValue("player", thrower)
|
||||
}
|
||||
|
||||
return CobblemonScripts.run(location, ballRuntime)?.asDouble()?.toFloat() ?: 0.0f
|
||||
}
|
||||
|
||||
override fun behavior(
|
||||
thrower: LivingEntity,
|
||||
pokemon: Pokemon
|
||||
): CatchRateModifier.Behavior = CatchRateModifier.Behavior.MULTIPLY
|
||||
|
||||
override fun isValid(
|
||||
thrower: LivingEntity,
|
||||
pokemon: Pokemon
|
||||
): Boolean = true
|
||||
|
||||
override fun modifyCatchRate(
|
||||
currentCatchRate: Float,
|
||||
thrower: LivingEntity,
|
||||
pokemon: Pokemon
|
||||
): Float = this.behavior(thrower, pokemon).mutator(currentCatchRate, this.value(thrower, pokemon))
|
||||
}
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.api.pokeball.catching.modifiers
|
||||
|
||||
import com.cobblemon.mod.common.api.pokeball.catching.CatchRateModifier
|
||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||
import net.minecraft.world.entity.LivingEntity
|
||||
|
||||
data class SimpleModifier(val multiplier: Float) : CatchRateModifier {
|
||||
companion object {
|
||||
const val VARIANT = "simple"
|
||||
}
|
||||
|
||||
override fun isGuaranteed(): Boolean = false
|
||||
|
||||
override fun value(thrower: LivingEntity, pokemon: Pokemon): Float = this.multiplier
|
||||
|
||||
override fun behavior(thrower: LivingEntity, pokemon: Pokemon): CatchRateModifier.Behavior =
|
||||
CatchRateModifier.Behavior.MULTIPLY
|
||||
|
||||
override fun isValid(thrower: LivingEntity, pokemon: Pokemon): Boolean = true
|
||||
|
||||
override fun modifyCatchRate(
|
||||
currentCatchRate: Float,
|
||||
thrower: LivingEntity,
|
||||
pokemon: Pokemon,
|
||||
): Float = behavior(thrower, pokemon).mutator(currentCatchRate, value(thrower, pokemon))
|
||||
}
|
||||
@@ -10,6 +10,9 @@ package com.cobblemon.mod.common.api.pokedex
|
||||
|
||||
import com.cobblemon.mod.common.api.data.JsonDataRegistry
|
||||
import com.cobblemon.mod.common.api.pokedex.def.PokedexDef
|
||||
import com.cobblemon.mod.common.api.pokedex.entry.PokedexEntry
|
||||
import com.cobblemon.mod.common.api.pokedex.entry.PokedexForm
|
||||
import com.cobblemon.mod.common.api.pokemon.PokemonSpecies
|
||||
import com.cobblemon.mod.common.api.reactive.SimpleObservable
|
||||
import com.cobblemon.mod.common.net.messages.client.data.PokedexDexSyncPacket
|
||||
import com.cobblemon.mod.common.util.adapters.CodecBackedAdapter
|
||||
@@ -61,6 +64,14 @@ object Dexes : JsonDataRegistry<PokedexDef> {
|
||||
PokedexDexSyncPacket(dexEntryMap.values).sendToPlayer(player)
|
||||
}
|
||||
|
||||
fun findDexEntryBySpeciesId(regionId: ResourceLocation, speciesId: ResourceLocation): PokedexEntry? {
|
||||
return dexEntryMap[regionId]?.getEntries()?.firstOrNull { it -> it.speciesId == speciesId }
|
||||
}
|
||||
|
||||
fun findDexEntryBySpeciesId(speciesId: ResourceLocation): PokedexEntry? {
|
||||
return findDexEntryBySpeciesId(cobblemonResource("national"), speciesId)
|
||||
}
|
||||
|
||||
fun getFormEquivalents(formName: String): List<String> {
|
||||
val key = equivalentFormsLookup[formName.lowercase()]
|
||||
return equivalentForms[key] ?: listOf(formName.lowercase())
|
||||
|
||||
@@ -25,7 +25,9 @@ import com.cobblemon.mod.common.api.pokemon.requirement.Requirement
|
||||
import com.cobblemon.mod.common.api.tags.CobblemonItemTags
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||
import com.cobblemon.mod.common.item.PokeBallItem
|
||||
import com.cobblemon.mod.common.item.components.PokeBallComponent
|
||||
import com.cobblemon.mod.common.net.messages.client.animation.PlayPosableAnimationPacket
|
||||
import com.cobblemon.mod.common.pokeball.PokeBall
|
||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||
import com.cobblemon.mod.common.pokemon.activestate.ShoulderedState
|
||||
import com.cobblemon.mod.common.pokemon.evolution.variants.ItemInteractionEvolution
|
||||
@@ -138,7 +140,7 @@ interface Evolution : EvolutionLike {
|
||||
val shedPokemon = pokemon.clone(registryAccess = owner.registryAccess())
|
||||
shedPokemon.removeHeldItem()
|
||||
innerShedder.apply(shedPokemon)
|
||||
shedPokemon.caughtBall = ((pokeballStack?.item ?: CobblemonItems.POKE_BALL) as PokeBallItem).pokeBall
|
||||
shedPokemon.caughtBall = pokeballStack?.let { PokeBallComponent.getPokeBall(it) } ?: CobblemonItems.STRANGE_BALL.pokeBall
|
||||
pokemon.storeCoordinates.get()?.store?.add(shedPokemon)
|
||||
CobblemonCriteria.EVOLVE_POKEMON.trigger(owner, EvolvePokemonContext(pokemon.preEvolution!!.species.resourceIdentifier, shedPokemon.species.resourceIdentifier, playerDataManager.getGenericData(owner).advancementData.totalEvolvedCount))
|
||||
// Consume one of the balls (if the player isn't creative)
|
||||
|
||||
+2
-2
@@ -145,7 +145,7 @@ class ReforgedConversion(val base: Path) : CobblemonConverter<CompoundTag> {
|
||||
// result.nickname = this.find(nbt, "Nickname", NbtCompound::getString)
|
||||
|
||||
val ball = this.find(nbt, "CaughtBall", CompoundTag::getString)
|
||||
result.caughtBall = if(ball != null) PokeBalls.getPokeBall(ResourceLocation.parse(ball)) ?: PokeBalls.POKE_BALL else PokeBalls.POKE_BALL
|
||||
result.caughtBall = if(ball != null) PokeBalls.getPokeBall(ResourceLocation.parse(ball)) else PokeBalls.STRANGE_BALL
|
||||
|
||||
return result
|
||||
}
|
||||
@@ -190,4 +190,4 @@ class ReforgedConversion(val base: Path) : CobblemonConverter<CompoundTag> {
|
||||
CAREFUL,
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -120,7 +120,7 @@ object CobblemonItemTags {
|
||||
@JvmField val DESTINY_KNOT = create("held/destiny_knot")
|
||||
@JvmField val EVERSTONE = create("held/everstone")
|
||||
@JvmField val EXPERIENCE_SHARE = create("held/experience_share")
|
||||
@JvmField val IS_FRIENDSHIP_BOOSTER = create("held/is_friendship_booster")
|
||||
@JvmField val IS_FRIENDSHIP_BOOSTER = create("is_friendship_booster")
|
||||
@JvmField val ANY_HELD_ITEM = create("held/is_held_item")
|
||||
@JvmField val BLACKLISTED_ITEMS_TO_HOLD = create("held/blacklisted_items_to_hold")
|
||||
@JvmField val WHITELISTED_ITEMS_TO_HOLD = create("held/whitelisted_items_to_hold")
|
||||
|
||||
+7
-1
@@ -16,7 +16,9 @@ import com.cobblemon.mod.common.client.render.pokeball.PokeBallPosableState
|
||||
import com.cobblemon.mod.common.entity.pokeball.EmptyPokeBallEntity
|
||||
import com.cobblemon.mod.common.entity.pokeball.EmptyPokeBallEntity.CaptureState
|
||||
import com.cobblemon.mod.common.entity.pokeball.EmptyPokeBallEntity.CaptureState.NOT
|
||||
import com.cobblemon.mod.common.util.toRGBA
|
||||
import net.minecraft.network.syncher.EntityDataAccessor
|
||||
import org.joml.Vector4f
|
||||
|
||||
class EmptyPokeBallClientDelegate : PokeBallPosableState(), EntitySideDelegate<EmptyPokeBallEntity> {
|
||||
override val stateEmitter: SettableObservable<CaptureState> = SettableObservable(NOT)
|
||||
@@ -52,4 +54,8 @@ class EmptyPokeBallClientDelegate : PokeBallPosableState(), EntitySideDelegate<E
|
||||
EmptyPokeBallEntity.ASPECTS -> currentAspects = currentEntity.aspects
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun getBeamColor(): Vector4f {
|
||||
return currentEntity.pokeBall.beamColor.rgb.toRGBA()
|
||||
}
|
||||
}
|
||||
|
||||
+20
-10
@@ -9,11 +9,19 @@
|
||||
package com.cobblemon.mod.common.client.gui.pokedex.widgets
|
||||
|
||||
import com.cobblemon.mod.common.Cobblemon
|
||||
import com.cobblemon.mod.common.CobblemonItems
|
||||
import com.cobblemon.mod.common.api.gui.*
|
||||
import com.cobblemon.mod.common.api.pokedex.Dexes
|
||||
import com.cobblemon.mod.common.api.pokedex.PokedexEntryProgress
|
||||
import com.cobblemon.mod.common.api.pokedex.entry.*
|
||||
import com.cobblemon.mod.common.api.pokedex.entry.CobblemonBiomeDexEvolutionRequirementDisplay
|
||||
import com.cobblemon.mod.common.api.pokedex.entry.DexEntries
|
||||
import com.cobblemon.mod.common.api.pokedex.entry.DexEvolutionDisplay
|
||||
import com.cobblemon.mod.common.api.pokedex.entry.DexEvolutionRequirementDisplay
|
||||
import com.cobblemon.mod.common.api.pokedex.entry.PokedexEntry
|
||||
import com.cobblemon.mod.common.api.pokedex.entry.PokedexForm
|
||||
import com.cobblemon.mod.common.api.pokemon.PokemonProperties
|
||||
import com.cobblemon.mod.common.api.pokemon.PokemonSpecies
|
||||
import com.cobblemon.mod.common.api.pokemon.evolution.Evolution
|
||||
import com.cobblemon.mod.common.api.text.add
|
||||
import com.cobblemon.mod.common.api.text.bold
|
||||
import com.cobblemon.mod.common.api.text.green
|
||||
@@ -33,15 +41,16 @@ import com.cobblemon.mod.common.client.render.renderScaledGuiItemIcon
|
||||
import com.cobblemon.mod.common.pokemon.FormData
|
||||
import com.cobblemon.mod.common.pokemon.Gender
|
||||
import com.cobblemon.mod.common.pokemon.RenderablePokemon
|
||||
import com.cobblemon.mod.common.util.asIdentifierDefaultingNamespace
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import com.cobblemon.mod.common.util.lang
|
||||
import net.minecraft.client.Minecraft
|
||||
import net.minecraft.client.gui.GuiGraphics
|
||||
import net.minecraft.core.registries.Registries
|
||||
import net.minecraft.locale.Language
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.network.chat.Component
|
||||
import net.minecraft.network.chat.MutableComponent
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.tags.TagKey
|
||||
|
||||
class EvolutionTreeWidget(
|
||||
@@ -159,8 +168,7 @@ class EvolutionTreeWidget(
|
||||
// Stop at whatever the dex can't resolve, and at cycles (datapacks)
|
||||
val visited = mutableSetOf(rootSpecies.speciesId to rootForm.displayForm)
|
||||
while (preEvolution != null) {
|
||||
val preEvolutionSpecies = DexEntries.entries.values.firstOrNull { it.speciesId == preEvolution.fromSpecies &&
|
||||
it.forms.any {form -> form.displayForm.equals(preEvolution.fromForm, ignoreCase = true)}} ?: break
|
||||
val preEvolutionSpecies = Dexes.findDexEntryBySpeciesId(preEvolution.fromSpecies) ?: break
|
||||
val preEvolutionForm = preEvolutionSpecies.forms.firstOrNull { it.displayForm.equals(preEvolution.fromForm, ignoreCase = true) } ?: break
|
||||
if (!visited.add(preEvolutionSpecies.speciesId to preEvolutionForm.displayForm)) break
|
||||
rootSpecies = preEvolutionSpecies
|
||||
@@ -168,16 +176,19 @@ class EvolutionTreeWidget(
|
||||
preEvolution = findPreEvolution(rootSpecies, rootForm)
|
||||
}
|
||||
|
||||
val entry = Dexes.findDexEntryBySpeciesId(rootSpecies.speciesId)
|
||||
?: throw RuntimeException("Root dex entry not found")
|
||||
|
||||
val viewedFormEquivalents = Dexes.getFormEquivalents(pokedexForm.displayForm)
|
||||
viewedForm = PokemonSpecies.getByIdentifier(pokedexEntry.speciesId)
|
||||
?.forms?.firstOrNull { viewedFormEquivalents.contains(it.name.lowercase()) }
|
||||
|
||||
val formEquivalents = Dexes.getFormEquivalents(rootForm.displayForm)
|
||||
val form =
|
||||
rootSpecies.forms.firstOrNull { formEquivalents.contains(it.displayForm.lowercase()) } ?:
|
||||
rootSpecies.forms.first { it.displayForm.equals("Normal", ignoreCase = true) }
|
||||
entry.forms.firstOrNull { formEquivalents.contains(it.displayForm.lowercase()) } ?:
|
||||
entry.forms.first { it.displayForm.equals("Normal", ignoreCase = true) }
|
||||
|
||||
val rootEvolutionNode = buildEvolutionTree(rootSpecies, form)
|
||||
val rootEvolutionNode = buildEvolutionTree(entry, form)
|
||||
|
||||
// val isSameEntry = previousRootPokedexEntry != null && pokedexEntry?.id == previousRootPokedexEntry?.id
|
||||
// val isSameForm =
|
||||
@@ -203,7 +214,7 @@ class EvolutionTreeWidget(
|
||||
|
||||
/** The evolution leading to [form]; the standard form falls back to any form of the species (no evolution leads to regular Vivillon). */
|
||||
private fun findPreEvolution(entry: PokedexEntry, form: PokedexForm): DexEvolutionDisplay? {
|
||||
return DexEntries.evolutionDisplays.firstOrNull { it.toSpecies == entry.speciesId && form.displayForm.equals(it.toForm, ignoreCase = true) }
|
||||
return DexEntries.evolutionDisplays.firstOrNull { it.toSpecies == entry.speciesId && it.toForm == form.displayForm }
|
||||
?: DexEntries.evolutionDisplays.takeIf { form.displayForm.equals("Normal", ignoreCase = true) }
|
||||
?.firstOrNull { it.toSpecies == entry.speciesId }
|
||||
}
|
||||
@@ -235,8 +246,7 @@ class EvolutionTreeWidget(
|
||||
val evolutions = DexEntries.evolutionDisplays.filter { it.fromSpecies == pokedexEntry.speciesId && formEquivalents.contains(it.fromForm.lowercase()) }
|
||||
|
||||
val children = evolutions.mapNotNull {
|
||||
val childPokedexEntry = DexEntries.entries.values.firstOrNull { entry -> entry.speciesId == it.toSpecies &&
|
||||
entry.forms.any {form -> form.displayForm.equals(it.toForm, ignoreCase = true)}}
|
||||
val childPokedexEntry = Dexes.findDexEntryBySpeciesId(it.toSpecies)
|
||||
if (childPokedexEntry == null) {
|
||||
Cobblemon.LOGGER.warn("Dex entry not found for species: ${it.toSpecies}")
|
||||
return@mapNotNull null
|
||||
|
||||
+2
-2
@@ -20,7 +20,7 @@ object BattleCaptureStartHandler : ClientNetworkPacketHandler<BattleCaptureStart
|
||||
val battle = CobblemonClient.battle ?: return
|
||||
val targetPokemon = battle.getPokemonFromPNX(packet.targetPNX)
|
||||
val tile = targetPokemon.second
|
||||
val pokeBall = PokeBalls.getPokeBall(packet.pokeBallType) ?: PokeBalls.POKE_BALL
|
||||
val pokeBall = PokeBalls.getPokeBall(packet.pokeBallType)
|
||||
tile.ballCapturing = ClientBallDisplay(pokeBall, packet.aspects).also { it.start() }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+2
-2
@@ -133,11 +133,11 @@ class PokeBobberEntityRenderer(context: EntityRendererProvider.Context?) : Entit
|
||||
val pokeBobberBaitItemStack = fishingBobberEntity.entityData.get(PokeRodFishingBobberEntity.POKEBOBBER_BAIT)
|
||||
val pokeRodId = ResourceLocation.tryParse(pokeRodIdStr)
|
||||
val pokeRod = PokeRods.getPokeRod(pokeRodId!!)
|
||||
val ballItem = PokeBalls.getPokeBall(pokeRod?.pokeBallId!!)!!.item
|
||||
val ballItem = PokeBalls.getPokeBall(pokeRod?.pokeBallId!!)!!.stack
|
||||
|
||||
// render the pokebobber
|
||||
Minecraft.getInstance().itemRenderer.renderStatic(
|
||||
ballItem.defaultInstance,
|
||||
ballItem,
|
||||
ItemDisplayContext.GROUND,
|
||||
light,
|
||||
OverlayTexture.NO_OVERLAY,
|
||||
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.client.render.models.blockbench.pokeball
|
||||
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.PosableModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.ModelFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Bone
|
||||
import net.minecraft.client.model.geom.ModelPart
|
||||
|
||||
open class PokeBallPosableModel(root: Bone) : PosableModel(root), ModelFrame {
|
||||
@Transient
|
||||
override val rootPart =
|
||||
(root as ModelPart)
|
||||
.children.entries
|
||||
.first()
|
||||
.let { root.registerChildWithAllChildren(it.key) }
|
||||
|
||||
val rootBone: String = (root as ModelPart).children.entries.first().key
|
||||
}
|
||||
+2
-2
@@ -13,11 +13,11 @@ import com.cobblemon.mod.common.client.render.models.blockbench.repository.Rende
|
||||
import com.cobblemon.mod.common.entity.pokeball.EmptyPokeBallEntity
|
||||
import net.minecraft.world.entity.Entity
|
||||
|
||||
class PosablePokeBallModel : PosableEntityModel<EmptyPokeBallEntity>() {
|
||||
class PosablePokeBallEntityModel : PosableEntityModel<EmptyPokeBallEntity>() {
|
||||
override fun setupEntityTypeContext(entity: Entity?) {
|
||||
super.setupEntityTypeContext(entity)
|
||||
if (entity is EmptyPokeBallEntity) {
|
||||
context.put(RenderContext.ASPECTS, entity.aspects)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -29,8 +29,8 @@ class FarfetchdGalarianModel(root: ModelPart) : PokemonPosableModel(root), Heade
|
||||
override var portraitScale = 2.6F
|
||||
override var portraitTranslation = Vec3(-0.2, -1.0, 0.0)
|
||||
|
||||
override var profileScale = 0.93F
|
||||
override var profileTranslation = Vec3(-0.1, 0.36, 0.0)
|
||||
override var profileScale = 1.1F
|
||||
override var profileTranslation = Vec3(-0.1, 0.1, 0.0)
|
||||
|
||||
lateinit var standing: Pose
|
||||
lateinit var walk: Pose
|
||||
|
||||
+2
-2
@@ -28,8 +28,8 @@ class FarfetchdModel(root: ModelPart) : PokemonPosableModel(root), HeadedFrame,
|
||||
override var portraitScale = 2.6F
|
||||
override var portraitTranslation = Vec3(-0.2, -1.0, 0.0)
|
||||
|
||||
override var profileScale = 0.93F
|
||||
override var profileTranslation = Vec3(-0.1, 0.36, 0.0)
|
||||
override var profileScale = 1.1F
|
||||
override var profileTranslation = Vec3(-0.1, 0.1, 0.0)
|
||||
|
||||
lateinit var standing: Pose
|
||||
lateinit var walk: Pose
|
||||
|
||||
+2
-2
@@ -23,8 +23,8 @@ class KabutoModel(root: ModelPart) : PokemonPosableModel(root) {
|
||||
override var portraitScale = 3.3F
|
||||
override var portraitTranslation = Vec3(0.0, -3.3, 0.0)
|
||||
|
||||
override var profileScale = 1.25F
|
||||
override var profileTranslation = Vec3(0.0, -0.17, 0.0)
|
||||
override var profileScale = 1.6F
|
||||
override var profileTranslation = Vec3(0.0, -0.6, 0.0)
|
||||
|
||||
lateinit var standing: CobblemonPose
|
||||
lateinit var walk: CobblemonPose
|
||||
|
||||
+2
-2
@@ -21,8 +21,8 @@ class HoothootModel (root: ModelPart) : PokemonPosableModel(root) {
|
||||
|
||||
override var portraitScale = 2.2F
|
||||
override var portraitTranslation = Vec3(-0.25, -0.9, 0.0)
|
||||
override var profileScale = 0.82F
|
||||
override var profileTranslation = Vec3(0.0, 0.53, 0.0)
|
||||
override var profileScale = 1.0F
|
||||
override var profileTranslation = Vec3(0.0, 0.3, 0.0)
|
||||
|
||||
lateinit var standing: Pose
|
||||
lateinit var walk: Pose
|
||||
|
||||
+2
-2
@@ -29,8 +29,8 @@ class WooperModel(root: ModelPart) : PokemonPosableModel(root), HeadedFrame {
|
||||
override var portraitScale = 2.0F
|
||||
override var portraitTranslation = Vec3(-0.15, -0.65, 0.0)
|
||||
|
||||
override var profileScale = 0.75F
|
||||
override var profileTranslation = Vec3(0.0, 0.6, 0.0)
|
||||
override var profileScale = 0.9F
|
||||
override var profileTranslation = Vec3(0.0, 0.4, 0.0)
|
||||
|
||||
lateinit var shoulderLeft: Pose
|
||||
lateinit var shoulderRight: Pose
|
||||
|
||||
+2
-2
@@ -29,8 +29,8 @@ class WooperPaldeanModel(root: ModelPart) : PokemonPosableModel(root), HeadedFra
|
||||
override var portraitScale = 2.0F
|
||||
override var portraitTranslation = Vec3(-0.15, -0.65, 0.0)
|
||||
|
||||
override var profileScale = 0.75F
|
||||
override var profileTranslation = Vec3(0.0, 0.6, 0.0)
|
||||
override var profileScale = 0.9F
|
||||
override var profileTranslation = Vec3(0.0, 0.4, 0.0)
|
||||
|
||||
lateinit var shoulderLeft: Pose
|
||||
lateinit var shoulderRight: Pose
|
||||
|
||||
-3
@@ -12,7 +12,6 @@ import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonP
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
import com.cobblemon.mod.common.util.asExpressionLike
|
||||
import net.minecraft.client.model.geom.ModelPart
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
@@ -29,8 +28,6 @@ class MasquerainModel(root: ModelPart) : PokemonPosableModel(root), HeadedFrame
|
||||
lateinit var walk: Pose
|
||||
lateinit var standing: Pose
|
||||
override fun registerPoses() {
|
||||
animations["cry"] = "q.bedrock_stateful('masquerain', 'cry')".asExpressionLike()
|
||||
|
||||
val blink = quirk { bedrockStateful("masquerain", "blink") }
|
||||
standing = registerPose(
|
||||
poseName = "standing",
|
||||
|
||||
-3
@@ -14,7 +14,6 @@ import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonP
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.ModelPartTransformation
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
import com.cobblemon.mod.common.util.asExpressionLike
|
||||
import com.cobblemon.mod.common.util.isInWater
|
||||
import net.minecraft.client.model.geom.ModelPart
|
||||
import net.minecraft.world.phys.Vec3
|
||||
@@ -37,8 +36,6 @@ class SurskitModel(root: ModelPart) : PokemonPosableModel(root), HeadedFrame {
|
||||
val wateroffset = -8
|
||||
|
||||
override fun registerPoses() {
|
||||
animations["cry"] = "q.bedrock_stateful('surskit', 'cry')".asExpressionLike()
|
||||
|
||||
val blink = quirk { bedrockStateful("surskit", "blink") }
|
||||
standing = registerPose(
|
||||
poseName = "standing",
|
||||
|
||||
-3
@@ -14,7 +14,6 @@ import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonP
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.ModelPartTransformation
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
import com.cobblemon.mod.common.util.asExpressionLike
|
||||
import net.minecraft.client.model.geom.ModelPart
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
@@ -37,8 +36,6 @@ class CombeeModel (root: ModelPart) : PokemonPosableModel(root) {
|
||||
val shoulderZOffset = 8
|
||||
|
||||
override fun registerPoses() {
|
||||
animations["cry"] = "q.bedrock_stateful('combee', 'cry')".asExpressionLike()
|
||||
|
||||
val blink1 = quirk { bedrockStateful("combee", "blink_right") }
|
||||
val blink2 = quirk { bedrockStateful("combee", "blink_gender") }
|
||||
val blink3 = quirk { bedrockStateful("combee", "blink_left") }
|
||||
|
||||
-3
@@ -12,7 +12,6 @@ import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonP
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.PosableState
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
import com.cobblemon.mod.common.util.asExpressionLike
|
||||
import net.minecraft.client.model.geom.ModelPart
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
@@ -31,8 +30,6 @@ class VespiquenModel (root: ModelPart) : PokemonPosableModel(root) {
|
||||
lateinit var standing: Pose
|
||||
|
||||
override fun registerPoses() {
|
||||
animations["cry"] = "q.bedrock_stateful('vespiquen', 'cry')".asExpressionLike()
|
||||
|
||||
val blink1 = quirk { bedrockStateful("vespiquen", "blink") }
|
||||
val wingsleep = quirk { bedrockStateful("vespiquen", "sleep_flap") }
|
||||
|
||||
|
||||
+62
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen5
|
||||
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
import net.minecraft.client.model.geom.ModelPart
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
class SerperiorModel (root: ModelPart) : PokemonPosableModel(root), HeadedFrame {
|
||||
override val rootPart = root.registerChildWithAllChildren("serperior")
|
||||
override val head = getPart("head_ai")
|
||||
|
||||
override var portraitScale = 2.5F
|
||||
override var portraitTranslation = Vec3(-0.3, 1.25, 0.0)
|
||||
|
||||
override var profileScale = 0.6F
|
||||
override var profileTranslation = Vec3(0.0, 0.8, 0.0)
|
||||
|
||||
lateinit var standing: Pose
|
||||
lateinit var walk: Pose
|
||||
lateinit var sleep: Pose
|
||||
|
||||
override val cryAnimation = CryProvider { bedrockStateful("serperior", "cry") }
|
||||
|
||||
override fun registerPoses() {
|
||||
val blink = quirk { bedrockStateful("serperior", "blink") }
|
||||
sleep = registerPose(
|
||||
poseType = PoseType.SLEEP,
|
||||
animations = arrayOf(bedrock("serperior", "sleep"))
|
||||
)
|
||||
|
||||
standing = registerPose(
|
||||
poseName = "standing",
|
||||
poseTypes = PoseType.STATIONARY_POSES + PoseType.UI_POSES,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("serperior", "ground_idle")
|
||||
)
|
||||
)
|
||||
|
||||
walk = registerPose(
|
||||
poseName = "walk",
|
||||
poseTypes = PoseType.MOVING_POSES,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("serperior", "ground_walk")
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
+70
@@ -0,0 +1,70 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen5
|
||||
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BimanualFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BipedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
import net.minecraft.client.model.geom.ModelPart
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
class ServineModel (root: ModelPart) : PokemonPosableModel(root), HeadedFrame, BipedFrame, BimanualFrame {
|
||||
override val rootPart = root.registerChildWithAllChildren("servine")
|
||||
override val head = getPart("head_ai")
|
||||
override val rightArm = getPart("arm_right")
|
||||
override val leftArm = getPart("arm_left")
|
||||
override val rightLeg = getPart("leg_right")
|
||||
override val leftLeg = getPart("leg_left")
|
||||
|
||||
override var portraitScale = 2.6F
|
||||
override var portraitTranslation = Vec3(-0.15, 0.75, 0.0)
|
||||
override var profileScale = 0.8F
|
||||
override var profileTranslation = Vec3(0.0, 0.55, 0.0)
|
||||
|
||||
lateinit var sleep: Pose
|
||||
lateinit var standing: Pose
|
||||
lateinit var walk: Pose
|
||||
|
||||
override val cryAnimation = CryProvider { bedrockStateful("servine", "cry") }
|
||||
|
||||
override fun registerPoses() {
|
||||
val blink = quirk { bedrockStateful("servine", "blink") }
|
||||
sleep = registerPose(
|
||||
poseType = PoseType.SLEEP,
|
||||
transformTicks = 10,
|
||||
animations = arrayOf(bedrock("servine", "sleep"))
|
||||
)
|
||||
|
||||
standing = registerPose(
|
||||
poseName = "standing",
|
||||
poseTypes = PoseType.STATIONARY_POSES + PoseType.UI_POSES,
|
||||
transformTicks = 10,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("servine", "ground_idle")
|
||||
)
|
||||
)
|
||||
|
||||
walk = registerPose(
|
||||
poseName = "walking",
|
||||
poseTypes = PoseType.MOVING_POSES,
|
||||
transformTicks = 10,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("servine", "ground_walk")
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
+70
@@ -0,0 +1,70 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen5
|
||||
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BimanualFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BipedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
import net.minecraft.client.model.geom.ModelPart
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
class SnivyModel (root: ModelPart) : PokemonPosableModel(root), HeadedFrame, BipedFrame, BimanualFrame {
|
||||
override val rootPart = root.registerChildWithAllChildren("snivy")
|
||||
override val head = getPart("head_ai")
|
||||
override val rightArm = getPart("arm_right")
|
||||
override val leftArm = getPart("arm_left")
|
||||
override val rightLeg = getPart("leg_right")
|
||||
override val leftLeg = getPart("leg_left")
|
||||
|
||||
override var portraitScale = 2.0F
|
||||
override var portraitTranslation = Vec3(-0.15, 0.32, 0.0)
|
||||
override var profileScale = 0.8F
|
||||
override var profileTranslation = Vec3(0.0, 0.55, 0.0)
|
||||
|
||||
lateinit var sleep: Pose
|
||||
lateinit var standing: Pose
|
||||
lateinit var walk: Pose
|
||||
|
||||
override val cryAnimation = CryProvider { bedrockStateful("snivy", "cry") }
|
||||
|
||||
override fun registerPoses() {
|
||||
val blink = quirk { bedrockStateful("snivy", "blink") }
|
||||
sleep = registerPose(
|
||||
poseType = PoseType.SLEEP,
|
||||
transformTicks = 10,
|
||||
animations = arrayOf(bedrock("snivy", "sleep"))
|
||||
)
|
||||
|
||||
standing = registerPose(
|
||||
poseName = "standing",
|
||||
poseTypes = PoseType.STATIONARY_POSES + PoseType.UI_POSES,
|
||||
transformTicks = 10,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("snivy", "ground_idle")
|
||||
)
|
||||
)
|
||||
|
||||
walk = registerPose(
|
||||
poseName = "walking",
|
||||
poseTypes = PoseType.MOVING_POSES,
|
||||
transformTicks = 10,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("snivy", "ground_walk")
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -23,7 +23,7 @@ class CarbinkModel (root: ModelPart) : PokemonPosableModel(root) {
|
||||
override var portraitScale = 1.8F
|
||||
override var portraitTranslation = Vec3(0.0, 0.2, 0.0)
|
||||
|
||||
override var profileScale = 0.68F
|
||||
override var profileScale = 0.85F
|
||||
override var profileTranslation = Vec3(0.0, 0.7, 0.0)
|
||||
|
||||
lateinit var standing: CobblemonPose
|
||||
|
||||
+85
@@ -0,0 +1,85 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen6
|
||||
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
import net.minecraft.client.model.geom.ModelPart
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
class GourgeistModel (root: ModelPart) : PokemonPosableModel(root), HeadedFrame {
|
||||
override val rootPart = root.registerChildWithAllChildren("gourgeist")
|
||||
override val head = getPart("head")
|
||||
|
||||
override var portraitScale = 4.0F
|
||||
override var portraitTranslation = Vec3(-0.1, 0.6, 0.0)
|
||||
|
||||
override var profileScale = 0.8F
|
||||
override var profileTranslation = Vec3(0.0, 0.55, 0.0)
|
||||
|
||||
lateinit var standing: Pose
|
||||
lateinit var walk: Pose
|
||||
lateinit var hovering: Pose
|
||||
lateinit var fly: Pose
|
||||
lateinit var sleep: Pose
|
||||
|
||||
override val cryAnimation = CryProvider { bedrockStateful("gourgeist", "cry") }
|
||||
|
||||
override fun registerPoses() {
|
||||
val blink = quirk { bedrockStateful("gourgeist", "blink") }
|
||||
standing = registerPose(
|
||||
poseName = "standing",
|
||||
poseTypes = PoseType.UI_POSES + PoseType.STAND,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("gourgeist", "ground_idle")
|
||||
)
|
||||
)
|
||||
|
||||
walk = registerPose(
|
||||
poseName = "walk",
|
||||
poseType = PoseType.WALK,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
bedrock("gourgeist", "ground_walk")
|
||||
)
|
||||
)
|
||||
|
||||
hovering = registerPose(
|
||||
poseName = "hovering",
|
||||
poseType = PoseType.HOVER,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
bedrock("gourgeist", "air_idle")
|
||||
)
|
||||
)
|
||||
|
||||
fly = registerPose(
|
||||
poseName = "fly",
|
||||
poseType = PoseType.FLY,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
bedrock("gourgeist", "air_fly")
|
||||
)
|
||||
)
|
||||
|
||||
sleep = registerPose(
|
||||
poseName = "sleep",
|
||||
poseType = PoseType.SLEEP,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
bedrock("gourgeist", "sleep")
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
+77
@@ -0,0 +1,77 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen6
|
||||
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.CobblemonPose
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
import net.minecraft.client.model.geom.ModelPart
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
class PumpkabooModel (root: ModelPart) : PokemonPosableModel(root), HeadedFrame {
|
||||
override val rootPart = root.registerChildWithAllChildren("pumpkaboo")
|
||||
override val head = getPart("head")
|
||||
|
||||
override var portraitScale = 3.5F
|
||||
override var portraitTranslation = Vec3(0.0, -1.5, 0.0)
|
||||
|
||||
override var profileScale = 1.0F
|
||||
override var profileTranslation = Vec3(0.0, 0.25, 0.0)
|
||||
|
||||
lateinit var standing: CobblemonPose
|
||||
lateinit var walk: CobblemonPose
|
||||
lateinit var battleidle: CobblemonPose
|
||||
lateinit var sleep: CobblemonPose
|
||||
|
||||
override val cryAnimation = CryProvider { bedrockStateful("pumpkaboo", "cry") }
|
||||
|
||||
override fun registerPoses() {
|
||||
val blink = quirk { bedrockStateful("pumpkaboo", "blink") }
|
||||
val quirk = quirk { bedrockStateful("pumpkaboo", "quirk_idle") }
|
||||
|
||||
sleep = registerPose(
|
||||
poseName = "sleep",
|
||||
poseType = PoseType.SLEEP,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
bedrock("pumpkaboo", "sleep")
|
||||
)
|
||||
)
|
||||
|
||||
standing = registerPose(
|
||||
poseName = "standing",
|
||||
poseTypes = PoseType.STATIONARY_POSES + PoseType.UI_POSES,
|
||||
quirks = arrayOf(blink, quirk),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("pumpkaboo", "ground_idle")
|
||||
)
|
||||
)
|
||||
|
||||
walk = registerPose(
|
||||
poseName = "walk",
|
||||
poseTypes = PoseType.MOVING_POSES,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
bedrock("pumpkaboo", "ground_walk")
|
||||
)
|
||||
)
|
||||
|
||||
battleidle = registerPose(
|
||||
poseName = "battleidle",
|
||||
poseTypes = PoseType.STATIONARY_POSES,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
bedrock("pumpkaboo", "battle_idle")
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -26,8 +26,8 @@ class ScatterbugModel (root: ModelPart) : PokemonPosableModel(root), HeadedFrame
|
||||
override var portraitScale = 2.6F
|
||||
override var portraitTranslation = Vec3(-0.2, -1.9, 0.0)
|
||||
|
||||
override var profileScale = 0.98F
|
||||
override var profileTranslation = Vec3(0.0, 0.28, 0.0)
|
||||
override var profileScale = 1.2F
|
||||
override var profileTranslation = Vec3(0.0, 0.05, 0.0)
|
||||
|
||||
lateinit var standing: CobblemonPose
|
||||
lateinit var walk: CobblemonPose
|
||||
|
||||
+2
-2
@@ -36,8 +36,8 @@ class CharcadetModel(root: ModelPart) : PokemonPosableModel(root), HeadedFrame,
|
||||
override var portraitScale = 1.7F
|
||||
override var portraitTranslation = Vec3(-0.15, 0.08, 0.0)
|
||||
|
||||
override var profileScale = 0.58F
|
||||
override var profileTranslation = Vec3(0.0, 0.91, 0.0)
|
||||
override var profileScale = 0.8F
|
||||
override var profileTranslation = Vec3(0.0, 0.6, 0.0)
|
||||
|
||||
lateinit var standing: CobblemonPose
|
||||
lateinit var walking: CobblemonPose
|
||||
|
||||
+2
-2
@@ -35,8 +35,8 @@ class QuaquavalModel (root: ModelPart) : PokemonPosableModel(root), HeadedFrame,
|
||||
override var portraitScale = 2.3F
|
||||
override var portraitTranslation = Vec3(-0.42, 3.7, 0.0)
|
||||
|
||||
override var profileScale = 0.36F
|
||||
override var profileTranslation = Vec3(0.0, 1.19, 0.0)
|
||||
override var profileScale = 0.32F
|
||||
override var profileTranslation = Vec3(0.0, 1.24, 0.0)
|
||||
|
||||
lateinit var standing: CobblemonPose
|
||||
lateinit var standing2: CobblemonPose
|
||||
|
||||
+11
-56
@@ -20,9 +20,7 @@ import com.cobblemon.mod.common.client.render.models.blockbench.*
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.bedrock.animation.BedrockAnimationRepository
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.blockentity.BlockEntityModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.fossil.FossilModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokeball.AncientPokeBallModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokeball.BeastBallModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokeball.PokeBallModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokeball.PokeBallPosableModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen1.*
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen2.*
|
||||
@@ -88,7 +86,7 @@ object VaryingModelRepository {
|
||||
"bedrock/fossils/posers" to FossilModel::class.java,
|
||||
"bedrock/block_entities/posers" to BlockEntityModel::class.java,
|
||||
"bedrock/npcs/posers" to PosableModel::class.java,
|
||||
"bedrock/poke_balls/posers" to PosableModel::class.java,
|
||||
"bedrock/poke_balls/posers" to PokeBallPosableModel::class.java,
|
||||
"bedrock/generic/posers" to PosableModel::class.java,
|
||||
)
|
||||
|
||||
@@ -116,6 +114,7 @@ object VaryingModelRepository {
|
||||
.registerTypeAdapter(ExpressionLike::class.java, ExpressionLikeAdapter)
|
||||
.registerTypeAdapter(PosableModel::class.java, JsonModelAdapter(::PosableModel))
|
||||
.registerTypeAdapter(PokemonPosableModel::class.java, JsonModelAdapter(::PokemonPosableModel))
|
||||
.registerTypeAdapter(PokeBallPosableModel::class.java, JsonModelAdapter(::PokeBallPosableModel))
|
||||
.registerTypeAdapter(FossilModel::class.java, JsonModelAdapter(::FossilModel))
|
||||
.registerTypeAdapter(BlockEntityModel::class.java, JsonModelAdapter(::BlockEntityModel))
|
||||
.registerTypeAdapter(Pose::class.java, PoseAdapter { JsonModelAdapter.model!! })
|
||||
@@ -155,8 +154,8 @@ object VaryingModelRepository {
|
||||
return {
|
||||
var boneName = jsonObject.getAsJsonPrimitive("rootBone")
|
||||
JsonModelAdapter.modelPart = if (boneName != null && it.children[boneName.asString] != null) it.children[boneName.asString] else it.children[fileName] ?: it.children.entries.filter { LocatorAccess.PREFIX !in it.key }.first().value
|
||||
gson.fromJson(jsonObject, poserClass).also {
|
||||
it.poses.forEach { (poseName, pose) -> pose.poseName = poseName }
|
||||
gson.fromJson(jsonObject, poserClass).also { model ->
|
||||
model.poses.forEach { (poseName, pose) -> pose.poseName = poseName }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -169,55 +168,6 @@ object VaryingModelRepository {
|
||||
}
|
||||
|
||||
fun registerInBuiltPosers() {
|
||||
inbuilt("azure_ball", ::PokeBallModel)
|
||||
inbuilt("beast_ball", ::BeastBallModel)
|
||||
inbuilt("cherish_ball", ::PokeBallModel)
|
||||
inbuilt("citrine_ball", ::PokeBallModel)
|
||||
inbuilt("dive_ball", ::PokeBallModel)
|
||||
inbuilt("dream_ball", ::PokeBallModel)
|
||||
inbuilt("dusk_ball", ::PokeBallModel)
|
||||
inbuilt("fast_ball", ::PokeBallModel)
|
||||
inbuilt("friend_ball", ::PokeBallModel)
|
||||
inbuilt("great_ball", ::PokeBallModel)
|
||||
inbuilt("heal_ball", ::PokeBallModel)
|
||||
inbuilt("heavy_ball", ::PokeBallModel)
|
||||
inbuilt("level_ball", ::PokeBallModel)
|
||||
inbuilt("love_ball", ::PokeBallModel)
|
||||
inbuilt("lure_ball", ::PokeBallModel)
|
||||
inbuilt("luxury_ball", ::PokeBallModel)
|
||||
inbuilt("master_ball", ::PokeBallModel)
|
||||
inbuilt("moon_ball", ::PokeBallModel)
|
||||
inbuilt("nest_ball", ::PokeBallModel)
|
||||
inbuilt("net_ball", ::PokeBallModel)
|
||||
inbuilt("park_ball", ::PokeBallModel)
|
||||
inbuilt("poke_ball", ::PokeBallModel)
|
||||
inbuilt("premier_ball", ::PokeBallModel)
|
||||
inbuilt("quick_ball", ::PokeBallModel)
|
||||
inbuilt("repeat_ball", ::PokeBallModel)
|
||||
inbuilt("roseate_ball", ::PokeBallModel)
|
||||
inbuilt("safari_ball", ::PokeBallModel)
|
||||
inbuilt("slate_ball", ::PokeBallModel)
|
||||
inbuilt("sport_ball", ::PokeBallModel)
|
||||
inbuilt("strange_ball", ::PokeBallModel)
|
||||
inbuilt("timer_ball", ::PokeBallModel)
|
||||
inbuilt("ultra_ball", ::PokeBallModel)
|
||||
inbuilt("verdant_ball", ::PokeBallModel)
|
||||
inbuilt("ancient_poke_ball", ::AncientPokeBallModel)
|
||||
inbuilt("ancient_citrine_ball", ::AncientPokeBallModel)
|
||||
inbuilt("ancient_verdant_ball", ::AncientPokeBallModel)
|
||||
inbuilt("ancient_azure_ball", ::AncientPokeBallModel)
|
||||
inbuilt("ancient_roseate_ball", ::AncientPokeBallModel)
|
||||
inbuilt("ancient_slate_ball", ::AncientPokeBallModel)
|
||||
inbuilt("ancient_ivory_ball", ::AncientPokeBallModel)
|
||||
inbuilt("ancient_great_ball", ::AncientPokeBallModel)
|
||||
inbuilt("ancient_ultra_ball", ::AncientPokeBallModel)
|
||||
inbuilt("ancient_feather_ball", ::AncientPokeBallModel)
|
||||
inbuilt("ancient_wing_ball", ::AncientPokeBallModel)
|
||||
inbuilt("ancient_jet_ball", ::AncientPokeBallModel)
|
||||
inbuilt("ancient_heavy_ball", ::AncientPokeBallModel)
|
||||
inbuilt("ancient_leaden_ball", ::AncientPokeBallModel)
|
||||
inbuilt("ancient_gigaton_ball", ::AncientPokeBallModel)
|
||||
|
||||
inbuilt("squirtle", ::SquirtleModel)
|
||||
inbuilt("wartortle", ::WartortleModel)
|
||||
inbuilt("metapod", ::MetapodModel)
|
||||
@@ -322,6 +272,8 @@ object VaryingModelRepository {
|
||||
inbuilt("loudred", :: LoudredModel)
|
||||
inbuilt("exploud", :: ExploudModel)
|
||||
inbuilt("cryogonal", :: CryogonalModel)
|
||||
inbuilt("pumpkaboo", :: PumpkabooModel)
|
||||
inbuilt("gourgeist", :: GourgeistModel)
|
||||
inbuilt("eiscue", :: EiscueModel)
|
||||
inbuilt("wooloo", :: WoolooModel)
|
||||
inbuilt("dubwool", :: DubwoolModel)
|
||||
@@ -338,6 +290,9 @@ object VaryingModelRepository {
|
||||
inbuilt("thwackey", ::ThwackeyModel)
|
||||
inbuilt("rillaboom", ::RillaboomModel)
|
||||
inbuilt("samurott", ::SamurottModel)
|
||||
inbuilt("snivy", ::SnivyModel)
|
||||
inbuilt("servine", ::ServineModel)
|
||||
inbuilt("serperior", ::SerperiorModel)
|
||||
inbuilt("slugma", ::SlugmaModel)
|
||||
inbuilt("magcargo", ::MagcargoModel)
|
||||
inbuilt("slugma_shiny", ::SlugmaShinyModel)
|
||||
@@ -667,4 +622,4 @@ object VaryingModelRepository {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+9
-7
@@ -12,8 +12,7 @@ import com.cobblemon.mod.common.api.reactive.Observable
|
||||
import com.cobblemon.mod.common.api.reactive.SettableObservable
|
||||
import com.cobblemon.mod.common.api.scheduling.Schedulable
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.PosableState
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokeball.AncientPokeBallModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokeball.PokeBallModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokeball.PokeBallPosableModel
|
||||
import com.cobblemon.mod.common.entity.pokeball.EmptyPokeBallEntity
|
||||
import kotlin.random.Random
|
||||
|
||||
@@ -21,18 +20,21 @@ import kotlin.random.Random
|
||||
abstract class PokeBallPosableState : PosableState(), Schedulable {
|
||||
abstract val stateEmitter: SettableObservable<EmptyPokeBallEntity.CaptureState>
|
||||
abstract val shakeEmitter: Observable<Unit>
|
||||
protected open val group: String
|
||||
get() = if (this.currentModel is AncientPokeBallModel) "ancient_poke_ball" else "poke_ball"
|
||||
|
||||
protected open var lastKnownState: EmptyPokeBallEntity.CaptureState? = null
|
||||
|
||||
open fun initSubscriptions() {
|
||||
stateEmitter.subscribe { state ->
|
||||
|
||||
// if we fail to cast, provide default bone name.
|
||||
val group = (currentModel as? PokeBallPosableModel)?.rootBone ?: "poke_ball"
|
||||
|
||||
when (state) {
|
||||
EmptyPokeBallEntity.CaptureState.HIT -> {
|
||||
doLater {
|
||||
val model = this.currentModel!!
|
||||
after(seconds = 0.2F) {
|
||||
if (model is PokeBallModel && stateEmitter.get() == EmptyPokeBallEntity.CaptureState.HIT) {
|
||||
if (model is PokeBallPosableModel && stateEmitter.get() == EmptyPokeBallEntity.CaptureState.HIT) {
|
||||
doLater latest@{
|
||||
model.moveToPose(this, model.poses["open"]!!)
|
||||
after(seconds = 1.75F) {
|
||||
@@ -60,7 +62,7 @@ abstract class PokeBallPosableState : PosableState(), Schedulable {
|
||||
shakeEmitter
|
||||
.pipe(Observable.emitWhile { stateEmitter.get() == EmptyPokeBallEntity.CaptureState.SHAKE })
|
||||
.subscribe {
|
||||
val bob = "bob${Random.Default.nextInt(6) + 1}"
|
||||
val bob = "bob${Random.nextInt(6) + 1}"
|
||||
doLater { setActiveAnimations(currentModel!!.bedrockStateful(group, bob)) }
|
||||
}
|
||||
}
|
||||
@@ -79,4 +81,4 @@ abstract class PokeBallPosableState : PosableState(), Schedulable {
|
||||
this.lastKnownState = state
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+3
-3
@@ -9,7 +9,7 @@
|
||||
package com.cobblemon.mod.common.client.render.pokeball
|
||||
|
||||
import com.cobblemon.mod.common.client.entity.EmptyPokeBallClientDelegate
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokeball.PosablePokeBallModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokeball.PosablePokeBallEntityModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.repository.RenderContext
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.repository.VaryingModelRepository
|
||||
import com.cobblemon.mod.common.entity.pokeball.EmptyPokeBallEntity
|
||||
@@ -24,7 +24,7 @@ import net.minecraft.client.renderer.texture.OverlayTexture
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
|
||||
class PokeBallRenderer(context: EntityRendererProvider.Context) : EntityRenderer<EmptyPokeBallEntity>(context) {
|
||||
val model = PosablePokeBallModel()
|
||||
val model = PosablePokeBallEntityModel()
|
||||
|
||||
override fun getTextureLocation(pEntity: EmptyPokeBallEntity): ResourceLocation {
|
||||
return VaryingModelRepository.getTexture(pEntity.pokeBall.name, pEntity.delegate as EmptyPokeBallClientDelegate)
|
||||
@@ -58,4 +58,4 @@ class PokeBallRenderer(context: EntityRendererProvider.Context) : EntityRenderer
|
||||
poseStack.popPose()
|
||||
super.render(entity, yaw, partialTicks, poseStack, buffer, packedLight)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+12
-4
@@ -13,6 +13,7 @@ import com.cobblemon.mod.common.OrientationControllable
|
||||
import com.cobblemon.mod.common.api.pokedex.PokedexEntryProgress
|
||||
import com.cobblemon.mod.common.client.CobblemonClient
|
||||
import com.cobblemon.mod.common.client.battle.ClientBallDisplay
|
||||
import com.cobblemon.mod.common.client.entity.EmptyPokeBallClientDelegate
|
||||
import com.cobblemon.mod.common.client.entity.NPCClientDelegate
|
||||
import com.cobblemon.mod.common.client.entity.PokemonClientDelegate
|
||||
import com.cobblemon.mod.common.client.entity.PokemonClientDelegate.Companion.BEAM_EXTEND_TIME
|
||||
@@ -43,6 +44,7 @@ import com.cobblemon.mod.common.util.lang
|
||||
import com.cobblemon.mod.common.util.math.DoubleRange
|
||||
import com.cobblemon.mod.common.util.math.geometry.toRadians
|
||||
import com.cobblemon.mod.common.util.math.remap
|
||||
import com.cobblemon.mod.common.util.toRGBA
|
||||
import com.mojang.blaze3d.vertex.PoseStack
|
||||
import com.mojang.math.Axis
|
||||
import net.minecraft.ChatFormatting
|
||||
@@ -64,6 +66,7 @@ import net.minecraft.world.entity.Entity
|
||||
import net.minecraft.world.entity.player.Player
|
||||
import net.minecraft.world.phys.Vec3
|
||||
import org.joml.*
|
||||
import java.lang.Integer
|
||||
import kotlin.math.*
|
||||
|
||||
class PokemonRenderer(
|
||||
@@ -320,6 +323,11 @@ class PokemonRenderer(
|
||||
val pokemonPosition = entity.position().add(0.0, entity.bbHeight / 2.0 * clientDelegate.activeSendoutScale.toDouble(), 0.0)
|
||||
val recallBallOrigin = (beamTarget as? Player)?.let { RecallArmAnimationTracker.get(it.uuid)?.beamOrigin }
|
||||
|
||||
val beamColorVec4f = when(beamTarget) {
|
||||
is EmptyPokeBallEntity -> (beamTarget.delegate as EmptyPokeBallClientDelegate).getBeamColor()
|
||||
else -> entity.pokemon.caughtBall.beamColor.rgb.toRGBA()
|
||||
}
|
||||
|
||||
val beamSourcePosition = when {
|
||||
// cover the recall ball origin presence
|
||||
recallBallOrigin != null -> recallBallOrigin
|
||||
@@ -385,10 +393,10 @@ class PokemonRenderer(
|
||||
partialTicks = partialTicks,
|
||||
totalLevelTime = entity.level().gameTime,
|
||||
height = pokemonPosition.distanceTo(beamSourcePosition.add(offset)).toFloat() * ratio,
|
||||
red = recallBeamColour.x,
|
||||
green = recallBeamColour.y,
|
||||
blue = recallBeamColour.z,
|
||||
alpha = recallBeamColour.w,
|
||||
red = beamColorVec4f.x,
|
||||
green = beamColorVec4f.y,
|
||||
blue = beamColorVec4f.z,
|
||||
alpha = beamColorVec4f.w,
|
||||
beamRadius = 0.03F,
|
||||
glowRadius = 0.07F,
|
||||
glowAlpha = 0.4F
|
||||
|
||||
+3
-3
@@ -30,7 +30,7 @@ object FishingRodTooltipGenerator : TooltipGenerator() {
|
||||
val baitComponent = stack.get(CobblemonItemComponents.BAIT)
|
||||
|
||||
// Add the description of the Poke Ball used in the rod
|
||||
ball.item.description.let {
|
||||
ball.stack.item.description.let {
|
||||
val bobberDescription = Component.translatable(
|
||||
"cobblemon.pokerod.bobber",
|
||||
it.copy().gray()
|
||||
@@ -40,7 +40,7 @@ object FishingRodTooltipGenerator : TooltipGenerator() {
|
||||
|
||||
val client = Minecraft.getInstance()
|
||||
val itemRegistry = client.level?.registryAccess()?.registryOrThrow(Registries.ITEM)
|
||||
itemRegistry?.let { registry ->
|
||||
itemRegistry?.let {
|
||||
baitComponent?.stack?.item?.description
|
||||
?.let { // maybe this can be simplified to not use the FishingBaits to get the stack and just use PokerodItem to get the stack since we have it already
|
||||
val baitDescription = "cobblemon.pokerod.bait".asTranslated(it.copy().gray(), PokerodItem.getBaitStackOnRod(stack).count)
|
||||
@@ -77,4 +77,4 @@ object FishingRodTooltipGenerator : TooltipGenerator() {
|
||||
|
||||
return resultLines
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+40
-19
@@ -8,6 +8,7 @@
|
||||
|
||||
package com.cobblemon.mod.common.entity.pokeball
|
||||
|
||||
import com.bedrockk.molang.runtime.MoLangRuntime
|
||||
import com.bedrockk.molang.runtime.struct.QueryStruct
|
||||
import com.bedrockk.molang.runtime.value.DoubleValue
|
||||
import com.bedrockk.molang.runtime.value.StringValue
|
||||
@@ -18,7 +19,9 @@ import com.cobblemon.mod.common.api.events.CobblemonEvents
|
||||
import com.cobblemon.mod.common.api.events.pokeball.PokeBallCaptureCalculatedEvent
|
||||
import com.cobblemon.mod.common.api.events.pokeball.ThrownPokeballHitEvent
|
||||
import com.cobblemon.mod.common.api.events.pokemon.PokemonCapturedEvent
|
||||
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asMoLangValue
|
||||
import com.cobblemon.mod.common.api.molang.MoLangFunctions.asMostSpecificMoLangValue
|
||||
import com.cobblemon.mod.common.api.molang.MoLangFunctions.setup
|
||||
import com.cobblemon.mod.common.api.net.serializers.StringSetDataSerializer
|
||||
import com.cobblemon.mod.common.api.net.serializers.Vec3DataSerializer
|
||||
import com.cobblemon.mod.common.api.pokeball.PokeBalls
|
||||
@@ -49,7 +52,16 @@ import com.cobblemon.mod.common.net.messages.client.spawn.SpawnPokeballPacket
|
||||
import com.cobblemon.mod.common.pokeball.PokeBall
|
||||
import com.cobblemon.mod.common.pokemon.ai.PokemonBrain
|
||||
import com.cobblemon.mod.common.pokemon.properties.UncatchableProperty
|
||||
import com.cobblemon.mod.common.util.*
|
||||
import com.cobblemon.mod.common.util.asArrayValue
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import com.cobblemon.mod.common.util.isServerSide
|
||||
import com.cobblemon.mod.common.util.lang
|
||||
import com.cobblemon.mod.common.util.party
|
||||
import com.cobblemon.mod.common.util.playSoundServer
|
||||
import com.cobblemon.mod.common.util.sendParticlesServer
|
||||
import com.cobblemon.mod.common.util.setPositionSafely
|
||||
import com.cobblemon.mod.common.util.update
|
||||
import com.cobblemon.mod.common.util.withQueryValue
|
||||
import com.mojang.blaze3d.vertex.PoseStack
|
||||
import net.minecraft.client.Minecraft
|
||||
import net.minecraft.core.particles.ParticleTypes
|
||||
@@ -65,7 +77,10 @@ import net.minecraft.server.level.ServerPlayer
|
||||
import net.minecraft.sounds.SoundEvents
|
||||
import net.minecraft.util.Mth
|
||||
import net.minecraft.util.Mth.PI
|
||||
import net.minecraft.world.entity.*
|
||||
import net.minecraft.world.entity.EntityDimensions
|
||||
import net.minecraft.world.entity.EntityType
|
||||
import net.minecraft.world.entity.LivingEntity
|
||||
import net.minecraft.world.entity.Pose
|
||||
import net.minecraft.world.entity.decoration.LeashFenceKnotEntity
|
||||
import net.minecraft.world.entity.projectile.ThrowableItemProjectile
|
||||
import net.minecraft.world.item.Item
|
||||
@@ -97,7 +112,9 @@ class EmptyPokeBallEntity : ThrowableItemProjectile, PosableEntity, WaterDragMod
|
||||
const val SECONDS_BETWEEN_SHAKES = 1.25F
|
||||
const val SECONDS_BEFORE_SHAKE = 1F
|
||||
|
||||
val DIMENSIONS = EntityDimensions.fixed(0.4F, 0.4F)
|
||||
val DIMENSIONS: EntityDimensions = EntityDimensions.fixed(0.4F, 0.4F)
|
||||
|
||||
val runtime = MoLangRuntime().setup()
|
||||
}
|
||||
|
||||
val dataTrackerEmitter = SimpleObservable<EntityDataAccessor<*>>()
|
||||
@@ -125,7 +142,7 @@ class EmptyPokeBallEntity : ThrowableItemProjectile, PosableEntity, WaterDragMod
|
||||
.addFunction("thrower") { owner?.asMostSpecificMoLangValue() ?: DoubleValue.ZERO }
|
||||
|
||||
override fun defineSynchedData(builder: SynchedEntityData.Builder) {
|
||||
pokeBall = PokeBalls.POKE_BALL
|
||||
pokeBall = PokeBalls.STRANGE_BALL
|
||||
super.defineSynchedData(builder)
|
||||
builder.define(CAPTURE_STATE, CaptureState.NOT.ordinal.toByte())
|
||||
builder.define(ASPECTS, emptySet())
|
||||
@@ -158,7 +175,7 @@ class EmptyPokeBallEntity : ThrowableItemProjectile, PosableEntity, WaterDragMod
|
||||
addPosableFunctions(struct)
|
||||
}
|
||||
|
||||
constructor(world: Level) : this(pokeBall = PokeBalls.POKE_BALL, world = world)
|
||||
constructor(world: Level) : this(pokeBall = PokeBalls.STRANGE_BALL, world = world)
|
||||
constructor(
|
||||
pokeBall: PokeBall,
|
||||
world: Level,
|
||||
@@ -176,7 +193,7 @@ class EmptyPokeBallEntity : ThrowableItemProjectile, PosableEntity, WaterDragMod
|
||||
this.pokeBall = pokeBall
|
||||
}
|
||||
|
||||
var pokeBall: PokeBall = PokeBalls.POKE_BALL
|
||||
var pokeBall: PokeBall = PokeBalls.STRANGE_BALL
|
||||
|
||||
override fun onHitBlock(hitResult: BlockHitResult) {
|
||||
if (captureState == CaptureState.NOT) {
|
||||
@@ -187,7 +204,7 @@ class EmptyPokeBallEntity : ThrowableItemProjectile, PosableEntity, WaterDragMod
|
||||
discard()
|
||||
val player = this.owner as? ServerPlayer
|
||||
if (player?.isCreative == false) {
|
||||
spawnAtLocation(defaultItem)
|
||||
spawnAtLocation(pokeBall.stack())
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@@ -245,7 +262,7 @@ class EmptyPokeBallEntity : ThrowableItemProjectile, PosableEntity, WaterDragMod
|
||||
lang(
|
||||
"capture.attempted_capture",
|
||||
throwerActor.getName(),
|
||||
pokeBall.item().description,
|
||||
pokeBall.item().getDescriptionId(pokeBall.stack),
|
||||
pokemonEntity.exposedSpecies.translatedName
|
||||
).yellow()
|
||||
)
|
||||
@@ -269,7 +286,6 @@ class EmptyPokeBallEntity : ThrowableItemProjectile, PosableEntity, WaterDragMod
|
||||
attemptCatch(pokemonEntity)
|
||||
},
|
||||
ifCanceled = {
|
||||
captureFuture.complete(false)
|
||||
drop()
|
||||
return
|
||||
}
|
||||
@@ -284,7 +300,7 @@ class EmptyPokeBallEntity : ThrowableItemProjectile, PosableEntity, WaterDragMod
|
||||
val owner = owner
|
||||
discard()
|
||||
val player = owner?.takeIf { it is ServerPlayer } as? ServerPlayer
|
||||
if (player?.isCreative != true) spawnAtLocation(defaultItem)
|
||||
if (player?.isCreative != true) spawnAtLocation(pokeBall.stack())
|
||||
return
|
||||
}
|
||||
|
||||
@@ -296,7 +312,7 @@ class EmptyPokeBallEntity : ThrowableItemProjectile, PosableEntity, WaterDragMod
|
||||
delegate.tick(this)
|
||||
|
||||
if (level().isServerSide()) {
|
||||
|
||||
|
||||
|
||||
if (this.tickCount > 600 && this.capturingPokemon == null) {
|
||||
this.remove(RemovalReason.DISCARDED)
|
||||
@@ -346,7 +362,8 @@ class EmptyPokeBallEntity : ThrowableItemProjectile, PosableEntity, WaterDragMod
|
||||
// Do a capture
|
||||
val pokemon = capturingPokemon ?: return
|
||||
val player = this.owner as? ServerPlayer ?: return
|
||||
val captureTime = if (pokeBall.ancient == true) 1.8F else 1F
|
||||
|
||||
val captureTime = if (pokeBall.ancient) 1.8F else 1F
|
||||
after(seconds = captureTime) {
|
||||
// Dupes occurred by double-adding Pokémon, this hopefully prevents it triple-condom style
|
||||
// wtf did I just read above me
|
||||
@@ -355,8 +372,13 @@ class EmptyPokeBallEntity : ThrowableItemProjectile, PosableEntity, WaterDragMod
|
||||
discard()
|
||||
captureFuture.complete(true)
|
||||
val party = player.party()
|
||||
|
||||
val effectsRuntime = runtime
|
||||
.withQueryValue("pokeball", struct)
|
||||
.withQueryValue("pokemon", pokemon.asMoLangValue())
|
||||
|
||||
pokemon.pokemon.caughtBall = pokeBall
|
||||
pokeBall.effects.forEach { effect -> effect.apply(player, pokemon.pokemon) }
|
||||
pokeBall.effects.forEach { effect -> effect.resolve(effectsRuntime) }
|
||||
party.add(pokemon.pokemon)
|
||||
val leashHolder = pokemon.leashHolder
|
||||
|
||||
@@ -380,7 +402,7 @@ class EmptyPokeBallEntity : ThrowableItemProjectile, PosableEntity, WaterDragMod
|
||||
}
|
||||
// Emits a shake by changing the value to the opposite of what it currently is. Sends an update to the client basically.
|
||||
// We could replace this with a packet, but it feels awfully excessive when we already have 5 bajillion packets.
|
||||
if (this.pokeBall.ancient) {
|
||||
if (pokeBall.ancient) {
|
||||
when (captureResult.numberOfShakes) {
|
||||
1 -> ancientBallShake(setOf("q.bedrock_stateful('ancient_poke_ball', 'weirdhop')"))
|
||||
2 -> ancientBallShake(setOf("q.bedrock_stateful('ancient_poke_ball', 'bighop')"))
|
||||
@@ -395,7 +417,7 @@ class EmptyPokeBallEntity : ThrowableItemProjectile, PosableEntity, WaterDragMod
|
||||
private fun breakFree() {
|
||||
val pokemon = capturingPokemon ?: return
|
||||
pokemon.setPositionSafely(position())
|
||||
|
||||
|
||||
pokemon.beamMode = 2
|
||||
pokemon.isInvisible = false
|
||||
pokemon.isSilent = false
|
||||
@@ -425,8 +447,7 @@ class EmptyPokeBallEntity : ThrowableItemProjectile, PosableEntity, WaterDragMod
|
||||
|
||||
after(seconds = 0.1F) {
|
||||
captureFuture.complete(false)
|
||||
val ballType =
|
||||
this.pokeBall.name.path.lowercase().replace("_", "")
|
||||
val ballType = pokeBall.name.path.lowercase().replace("_", "")
|
||||
val mode = "casual"
|
||||
val sendflash =
|
||||
BedrockParticleOptionsRepository.getEffect(cobblemonResource("${ballType}/${mode}/sendflash"))
|
||||
@@ -443,7 +464,7 @@ class EmptyPokeBallEntity : ThrowableItemProjectile, PosableEntity, WaterDragMod
|
||||
|
||||
override fun getDefaultItem(): Item = pokeBall.item()
|
||||
|
||||
override fun getDimensions(pPose: Pose) = DIMENSIONS
|
||||
override fun getDimensions(pPose: Pose): EntityDimensions = DIMENSIONS
|
||||
|
||||
private fun attemptCatch(pokemonEntity: PokemonEntity) {
|
||||
pokemonEntity.busyLocks.add(this)
|
||||
@@ -551,4 +572,4 @@ class EmptyPokeBallEntity : ThrowableItemProjectile, PosableEntity, WaterDragMod
|
||||
|
||||
override fun waterDrag(): Float = this.pokeBall.waterDragValue
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -117,7 +117,6 @@ import net.minecraft.core.BlockPos
|
||||
import net.minecraft.core.Direction
|
||||
import net.minecraft.core.component.DataComponents
|
||||
import net.minecraft.core.registries.BuiltInRegistries
|
||||
import net.minecraft.core.registries.Registries
|
||||
import net.minecraft.nbt.CompoundTag
|
||||
import net.minecraft.nbt.NbtOps
|
||||
import net.minecraft.nbt.NbtUtils
|
||||
@@ -133,7 +132,6 @@ import net.minecraft.network.protocol.game.DebugPackets
|
||||
import net.minecraft.network.syncher.EntityDataAccessor
|
||||
import net.minecraft.network.syncher.EntityDataSerializers
|
||||
import net.minecraft.network.syncher.SynchedEntityData
|
||||
import net.minecraft.resources.ResourceKey
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.server.level.ServerEntity
|
||||
import net.minecraft.server.level.ServerLevel
|
||||
@@ -175,7 +173,6 @@ import net.minecraft.world.level.gameevent.GameEvent
|
||||
import net.minecraft.world.level.material.EmptyFluid
|
||||
import net.minecraft.world.level.material.FluidState
|
||||
import net.minecraft.world.level.pathfinder.PathType
|
||||
import net.minecraft.world.level.storage.loot.LootTable
|
||||
import net.minecraft.world.phys.AABB
|
||||
import net.minecraft.world.phys.Vec3
|
||||
import java.util.*
|
||||
@@ -245,12 +242,6 @@ open class PokemonEntity(
|
||||
|
||||
override val schedulingTracker = SchedulingTracker()
|
||||
|
||||
override fun getDefaultLootTable(): ResourceKey<LootTable?>? {
|
||||
println(cobblemonResource("pokemon/${this.pokemon.species.resourceIdentifier.path}"))
|
||||
// return ResourceKey.create(Registries.LOOT_TABLE, )
|
||||
return super.getDefaultLootTable()
|
||||
}
|
||||
|
||||
val form: FormData
|
||||
get() = pokemon.form
|
||||
val behaviour: FormPokemonBehaviour
|
||||
|
||||
@@ -8,42 +8,31 @@
|
||||
|
||||
package com.cobblemon.mod.common.item
|
||||
|
||||
import com.cobblemon.mod.common.api.pokeball.PokeBalls
|
||||
import com.cobblemon.mod.common.entity.pokeball.EmptyPokeBallEntity
|
||||
import com.cobblemon.mod.common.item.components.PokeBallComponent
|
||||
import com.cobblemon.mod.common.pokeball.PokeBall
|
||||
import com.cobblemon.mod.common.util.isServerSide
|
||||
import com.cobblemon.mod.common.util.math.geometry.toRadians
|
||||
import net.minecraft.world.entity.player.Player
|
||||
import net.minecraft.world.item.ItemStack
|
||||
import net.minecraft.server.level.ServerPlayer
|
||||
import net.minecraft.world.InteractionHand
|
||||
import net.minecraft.world.InteractionResultHolder
|
||||
import net.minecraft.world.item.Rarity
|
||||
import net.minecraft.world.entity.player.Player
|
||||
import net.minecraft.world.item.ItemStack
|
||||
import net.minecraft.world.level.Level
|
||||
import kotlin.math.cos
|
||||
|
||||
class PokeBallItem(
|
||||
val pokeBall: PokeBall
|
||||
) : CobblemonItem(Properties().apply {
|
||||
when (pokeBall.name) {
|
||||
// Master balls are a netherite product and should be fire immune
|
||||
PokeBalls.MASTER_BALL.name -> fireResistant().rarity(Rarity.EPIC)
|
||||
PokeBalls.CHERISH_BALL.name -> rarity(Rarity.EPIC)
|
||||
PokeBalls.ANCIENT_ORIGIN_BALL.name -> rarity(Rarity.EPIC)
|
||||
PokeBalls.BEAST_BALL.name -> rarity(Rarity.RARE)
|
||||
}
|
||||
}) {
|
||||
class PokeBallItem(val pokeBall: PokeBall) : CobblemonItem(pokeBall.itemProperties()) {
|
||||
|
||||
override fun use(world: Level, player: Player, usedHand: InteractionHand): InteractionResultHolder<ItemStack> {
|
||||
val itemStack = player.getItemInHand(usedHand)
|
||||
if (world.isServerSide()) {
|
||||
throwPokeBall(world, player as ServerPlayer)
|
||||
throwPokeBall(world, player as ServerPlayer, PokeBallComponent.getPokeBall(itemStack))
|
||||
}
|
||||
itemStack.consume(1, player)
|
||||
return InteractionResultHolder.sidedSuccess(itemStack, world.isClientSide)
|
||||
}
|
||||
|
||||
private fun throwPokeBall(world: Level, player: ServerPlayer) {
|
||||
private fun throwPokeBall(world: Level, player: ServerPlayer, pokeBall: PokeBall) {
|
||||
val pokeBallEntity = EmptyPokeBallEntity(pokeBall, player.level(), player).apply {
|
||||
val overhandFactor: Float = if (player.xRot < 0) {
|
||||
5f * cos(player.xRot.toRadians())
|
||||
@@ -57,4 +46,7 @@ class PokeBallItem(
|
||||
}
|
||||
world.addFreshEntity(pokeBallEntity)
|
||||
}
|
||||
}
|
||||
|
||||
override fun getDescriptionId(itemStack: ItemStack): String =
|
||||
PokeBallComponent.getPokeBall(itemStack).name.toLanguageKey("item")
|
||||
}
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
/*
|
||||
* 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.item.components
|
||||
|
||||
import com.cobblemon.mod.common.Cobblemon
|
||||
import com.cobblemon.mod.common.CobblemonItemComponents
|
||||
import com.cobblemon.mod.common.CobblemonItems
|
||||
import com.cobblemon.mod.common.api.pokeball.PokeBalls
|
||||
import com.cobblemon.mod.common.item.PokeBallItem
|
||||
import com.cobblemon.mod.common.pokeball.PokeBall
|
||||
import com.mojang.serialization.Codec
|
||||
import com.mojang.serialization.codecs.RecordCodecBuilder
|
||||
import io.netty.buffer.ByteBuf
|
||||
import net.minecraft.network.codec.ByteBufCodecs
|
||||
import net.minecraft.network.codec.StreamCodec
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.world.item.ItemStack
|
||||
|
||||
data class PokeBallComponent(val name: ResourceLocation) {
|
||||
companion object {
|
||||
val CODEC: Codec<PokeBallComponent> = RecordCodecBuilder.create {
|
||||
it
|
||||
.group(ResourceLocation.CODEC.fieldOf("type").forGetter(PokeBallComponent::name))
|
||||
.apply(it, ::PokeBallComponent)
|
||||
}
|
||||
|
||||
val PACKET_CODEC: StreamCodec<ByteBuf, PokeBallComponent> = ByteBufCodecs.fromCodec(CODEC)
|
||||
|
||||
@JvmStatic
|
||||
fun getPokeBall(stack: ItemStack): PokeBall {
|
||||
return stack.get(CobblemonItemComponents.POKE_BALL)?.name?.let(PokeBalls::getPokeBall)
|
||||
?: (stack.item as? PokeBallItem)?.pokeBall
|
||||
?: PokeBalls.STRANGE_BALL
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun setPokeBall(stack: ItemStack, ball: PokeBall): ItemStack {
|
||||
stack.set(CobblemonItemComponents.POKE_BALL, PokeBallComponent(ball.name))
|
||||
return stack
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun createStack(ball: PokeBall?): ItemStack {
|
||||
var result = PokeBalls.STRANGE_BALL
|
||||
if (ball == null) {
|
||||
Cobblemon.LOGGER.error("Attempted to create poke ball stack with null config, falling to strange ball.")
|
||||
} else {
|
||||
result = ball
|
||||
}
|
||||
val stack = ItemStack(CobblemonItems.STRANGE_BALL)
|
||||
return setPokeBall(stack, result)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
val ball: PokeBall
|
||||
get() = PokeBalls.getPokeBall(name)
|
||||
}
|
||||
@@ -11,10 +11,12 @@ package com.cobblemon.mod.common.item.group
|
||||
import com.cobblemon.mod.common.Cobblemon
|
||||
import com.cobblemon.mod.common.CobblemonItemComponents
|
||||
import com.cobblemon.mod.common.CobblemonItems
|
||||
import com.cobblemon.mod.common.api.pokeball.PokeBalls
|
||||
import com.cobblemon.mod.common.api.riding.stats.RidingStat
|
||||
import com.cobblemon.mod.common.api.tms.TechnicalMachines
|
||||
import com.cobblemon.mod.common.block.TypeGemClusterBlock
|
||||
import com.cobblemon.mod.common.item.AprijuiceItem
|
||||
import com.cobblemon.mod.common.item.components.PokeBallComponent
|
||||
import com.cobblemon.mod.common.item.components.RideBoostsComponent
|
||||
import com.cobblemon.mod.common.item.components.TMMoveComponent
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
@@ -943,6 +945,11 @@ object CobblemonItemGroups {
|
||||
|
||||
private fun utilityItemEntries(displayContext: ItemDisplayParameters, entries: Output) {
|
||||
CobblemonItems.pokeBalls.forEach(entries::accept)
|
||||
|
||||
PokeBalls.custom
|
||||
.filter { (_, value) -> CobblemonItems.pokeBalls.none { it.pokeBall.name == value.name } }
|
||||
.forEach { entries.accept(PokeBallComponent.createStack(it.value)) }
|
||||
|
||||
CobblemonItems.pokeRods.forEach(entries::accept)
|
||||
CobblemonItems.pokedexes.forEach(entries::accept)
|
||||
}
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
package com.cobblemon.mod.common.loot
|
||||
|
||||
import com.cobblemon.mod.common.loot.conditions.BiomeLootItemCondition
|
||||
import com.cobblemon.mod.common.loot.conditions.PokemonPropertiesLootItemCondition
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import net.minecraft.core.Registry
|
||||
import net.minecraft.core.registries.BuiltInRegistries
|
||||
import net.minecraft.world.level.storage.loot.predicates.LootItemConditionType
|
||||
|
||||
object CobblemonLootItemConditions {
|
||||
|
||||
@JvmField
|
||||
val POKEMON_PROPERTIES_CONDITION = Registry.register(
|
||||
BuiltInRegistries.LOOT_CONDITION_TYPE,
|
||||
cobblemonResource("pokemon_properties"),
|
||||
LootItemConditionType(PokemonPropertiesLootItemCondition.CODEC)
|
||||
)
|
||||
|
||||
@JvmField
|
||||
val BIOME_CONDITION = Registry.register(
|
||||
BuiltInRegistries.LOOT_CONDITION_TYPE,
|
||||
cobblemonResource("biome"),
|
||||
LootItemConditionType(BiomeLootItemCondition.CODEC)
|
||||
)
|
||||
|
||||
fun touch() = Unit
|
||||
|
||||
}
|
||||
-38
@@ -1,38 +0,0 @@
|
||||
package com.cobblemon.mod.common.loot.conditions
|
||||
|
||||
import com.cobblemon.mod.common.api.conditional.RegistryLikeCondition
|
||||
import com.cobblemon.mod.common.api.conditional.makeCodecForRegistryLikeCondition
|
||||
import com.cobblemon.mod.common.loot.CobblemonLootItemConditions
|
||||
import com.cobblemon.mod.common.util.toBlockPos
|
||||
import com.mojang.serialization.MapCodec
|
||||
import com.mojang.serialization.codecs.RecordCodecBuilder
|
||||
import net.minecraft.core.registries.Registries
|
||||
import net.minecraft.world.level.biome.Biome
|
||||
import net.minecraft.world.level.storage.loot.LootContext
|
||||
import net.minecraft.world.level.storage.loot.parameters.LootContextParams
|
||||
import net.minecraft.world.level.storage.loot.predicates.LootItemCondition
|
||||
import net.minecraft.world.level.storage.loot.predicates.LootItemConditionType
|
||||
|
||||
class BiomeLootItemCondition(
|
||||
val biome: RegistryLikeCondition<Biome>
|
||||
) : LootItemCondition {
|
||||
override fun getType(): LootItemConditionType {
|
||||
return CobblemonLootItemConditions.BIOME_CONDITION
|
||||
}
|
||||
|
||||
override fun test(t: LootContext): Boolean {
|
||||
val temp = biome.fits(t.level.getBiome(t.getParam(LootContextParams.ORIGIN).toBlockPos()))
|
||||
return temp
|
||||
}
|
||||
|
||||
companion object {
|
||||
private val BIOME_CODEC = makeCodecForRegistryLikeCondition("biome", Registries.BIOME)
|
||||
|
||||
val CODEC: MapCodec<BiomeLootItemCondition> = RecordCodecBuilder.mapCodec { instance ->
|
||||
instance.group(
|
||||
BIOME_CODEC.fieldOf("biome")
|
||||
.forGetter(BiomeLootItemCondition::biome)
|
||||
).apply(instance, ::BiomeLootItemCondition)
|
||||
}
|
||||
}
|
||||
}
|
||||
-33
@@ -1,33 +0,0 @@
|
||||
package com.cobblemon.mod.common.loot.conditions
|
||||
|
||||
import com.cobblemon.mod.common.api.pokemon.PokemonProperties
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||
import com.cobblemon.mod.common.loot.CobblemonLootItemConditions
|
||||
import com.mojang.serialization.MapCodec
|
||||
import com.mojang.serialization.codecs.RecordCodecBuilder
|
||||
import net.minecraft.world.level.storage.loot.LootContext
|
||||
import net.minecraft.world.level.storage.loot.parameters.LootContextParams
|
||||
import net.minecraft.world.level.storage.loot.predicates.LootItemCondition
|
||||
import net.minecraft.world.level.storage.loot.predicates.LootItemConditionType
|
||||
|
||||
class PokemonPropertiesLootItemCondition(
|
||||
val properties: PokemonProperties
|
||||
) : LootItemCondition {
|
||||
override fun getType(): LootItemConditionType {
|
||||
return CobblemonLootItemConditions.POKEMON_PROPERTIES_CONDITION
|
||||
}
|
||||
|
||||
override fun test(t: LootContext): Boolean {
|
||||
val pokemon = t.getParamOrNull(LootContextParams.THIS_ENTITY) as? PokemonEntity ?: return false
|
||||
return properties.matches(pokemon)
|
||||
}
|
||||
|
||||
companion object {
|
||||
val CODEC: MapCodec<PokemonPropertiesLootItemCondition> = RecordCodecBuilder.mapCodec { instance ->
|
||||
instance.group(
|
||||
PokemonProperties.CODEC.fieldOf("properties")
|
||||
.forGetter(PokemonPropertiesLootItemCondition::properties)
|
||||
).apply(instance, ::PokemonPropertiesLootItemCondition)
|
||||
}
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -30,8 +30,8 @@ class CaughtBallUpdatePacket(pokemon: () -> Pokemon?, value: PokeBall): SingleUp
|
||||
val ID = cobblemonResource("caught_ball_update")
|
||||
fun decode(buffer: RegistryFriendlyByteBuf): CaughtBallUpdatePacket {
|
||||
val pokemon = decodePokemon(buffer)
|
||||
val pokeBall = PokeBalls.getPokeBall(buffer.readIdentifier()) ?: PokeBalls.POKE_BALL
|
||||
val pokeBall = PokeBalls.getPokeBall(buffer.readIdentifier())
|
||||
return CaughtBallUpdatePacket(pokemon, pokeBall)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -55,8 +55,6 @@ object PlatformEvents {
|
||||
@JvmField
|
||||
val CLIENT_PLAYER_LOGOUT = EventObservable<ClientPlayerEvent.Logout>()
|
||||
@JvmField
|
||||
val PLAYER_RESPAWN = EventObservable<ServerPlayerEvent.Respawn>()
|
||||
@JvmField
|
||||
val PLAYER_DEATH = CancelableObservable<ServerPlayerEvent.Death>()
|
||||
@JvmField
|
||||
val RIGHT_CLICK_BLOCK = CancelableObservable<ServerPlayerEvent.RightClickBlock>()
|
||||
|
||||
@@ -50,11 +50,6 @@ interface ServerPlayerEvent {
|
||||
*/
|
||||
data class Logout(override val player: ServerPlayer) : ServerPlayerEvent
|
||||
|
||||
/**
|
||||
* Fired when the [player] respawns (either by coming back from the end or dying).
|
||||
*/
|
||||
data class Respawn(override val player: ServerPlayer) : ServerPlayerEvent
|
||||
|
||||
/**
|
||||
* Fired when the [player] dies.
|
||||
* If canceled the death will be prevented but healing is required in order to not be stuck in a loop.
|
||||
|
||||
@@ -8,18 +8,22 @@
|
||||
|
||||
package com.cobblemon.mod.common.pokeball
|
||||
|
||||
import com.bedrockk.molang.runtime.struct.QueryStruct
|
||||
import com.bedrockk.molang.runtime.value.DoubleValue
|
||||
import com.bedrockk.molang.runtime.value.StringValue
|
||||
import com.cobblemon.mod.common.api.molang.ExpressionLike
|
||||
import com.cobblemon.mod.common.api.molang.MoLangFunctions.addPokeBallFunctions
|
||||
import com.cobblemon.mod.common.api.molang.ObjectValue
|
||||
import com.cobblemon.mod.common.api.pokeball.PokeBalls
|
||||
import com.cobblemon.mod.common.api.pokeball.catching.CaptureEffect
|
||||
import com.cobblemon.mod.common.api.pokeball.catching.CatchRateModifier
|
||||
import com.cobblemon.mod.common.item.PokeBallItem
|
||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import com.cobblemon.mod.common.util.codec.CodecUtils
|
||||
import com.mojang.serialization.Codec
|
||||
import net.minecraft.world.item.ItemStack
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.world.item.Item
|
||||
import net.minecraft.world.item.ItemStack
|
||||
import net.minecraft.world.item.Rarity
|
||||
import java.awt.Color
|
||||
|
||||
/**
|
||||
* Base poke ball object
|
||||
@@ -31,37 +35,51 @@ import net.minecraft.resources.ResourceLocation
|
||||
* @property waterDragValue The value of the water drag modifier when the entity travels, default is 0.8.
|
||||
* @property model2d The identifier for the resource this Pokéball will use for the 2d model.
|
||||
* @property model3d The identifier for the resource this Pokéball will use for the 3d model.
|
||||
* @property ancient Marks this Pokéball as ancient, which makes it play different animations on catch hops
|
||||
* @property beamColor Defines the beam color of pokeball
|
||||
*/
|
||||
open class PokeBall(
|
||||
val name: ResourceLocation,
|
||||
class PokeBall(
|
||||
@Transient // Assigns in PokeBalls.reload
|
||||
var name: ResourceLocation = cobblemonResource("strange_ball"),
|
||||
val catchRateModifier: CatchRateModifier = CatchRateModifier.DUMMY,
|
||||
val effects: List<CaptureEffect> = listOf(),
|
||||
val effects: List<ExpressionLike> = listOf(),
|
||||
val itemProperties: PokeBallProperties = PokeBallProperties(),
|
||||
val waterDragValue: Float,
|
||||
val model2d: ResourceLocation,
|
||||
val model3d: ResourceLocation,
|
||||
val throwPower: Float,
|
||||
val ancient: Boolean
|
||||
val ancient: Boolean = false,
|
||||
val beamColor: Color
|
||||
) {
|
||||
val struct = QueryStruct(hashMapOf())
|
||||
.addFunction("name") { StringValue(name.toString()) }
|
||||
.addFunction("water_drag_value") { DoubleValue(waterDragValue) }
|
||||
.addFunction("throw_power") { DoubleValue(throwPower) }
|
||||
.addFunction("is_ancient") { DoubleValue(ancient) }
|
||||
@Transient
|
||||
val struct = ObjectValue(this)
|
||||
.addPokeBallFunctions(this)
|
||||
// .addFunction("item") { } // requires a registry which is hard
|
||||
|
||||
// This gets attached during item registry
|
||||
internal lateinit var item: PokeBallItem
|
||||
@Transient
|
||||
internal lateinit var stack: ItemStack
|
||||
|
||||
fun item(): PokeBallItem = this.item
|
||||
fun item(): PokeBallItem = this.stack.item as PokeBallItem
|
||||
|
||||
fun stack(count: Int = 1): ItemStack =
|
||||
ItemStack(this.item(), count)
|
||||
|
||||
fun itemProperties(): Item.Properties {
|
||||
var properties = Item.Properties().rarity(this.itemProperties.rarity)
|
||||
|
||||
if (this.itemProperties.fireResistant) {
|
||||
properties = properties.fireResistant()
|
||||
}
|
||||
|
||||
return properties
|
||||
}
|
||||
|
||||
@Deprecated("This is a temporary solution for the safari ball dilemma", ReplaceWith("target.currentHealth"))
|
||||
internal fun hpForCalculation(target: Pokemon): Int = if (this.name == PokeBalls.SAFARI_BALL.name) target.maxHealth else target.currentHealth
|
||||
internal fun hpForCalculation(target: Pokemon): Int =
|
||||
if (this.name == PokeBalls.SAFARI_BALL.name) target.maxHealth else target.currentHealth
|
||||
|
||||
companion object {
|
||||
|
||||
@JvmStatic
|
||||
val BY_IDENTIFIER_CODEC: Codec<PokeBall> = CodecUtils.createByIdentifierCodec(
|
||||
PokeBalls::getPokeBall,
|
||||
@@ -70,4 +88,8 @@ open class PokeBall(
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
data class PokeBallProperties(
|
||||
val fireResistant: Boolean = false,
|
||||
val rarity: Rarity = Rarity.COMMON
|
||||
)
|
||||
}
|
||||
|
||||
+2
-2
@@ -46,7 +46,7 @@ object Gen1CaptureCalculator : CaptureCalculator {
|
||||
}
|
||||
// This value can be reused when calculating the shakes in case of breakout.
|
||||
val nBound = when (pokeBall) {
|
||||
PokeBalls.POKE_BALL -> 255
|
||||
PokeBalls.POKE_BALL, PokeBalls.STRANGE_BALL -> 255
|
||||
PokeBalls.GREAT_BALL -> 200
|
||||
else -> 150
|
||||
}
|
||||
@@ -97,4 +97,4 @@ object Gen1CaptureCalculator : CaptureCalculator {
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -642,7 +642,16 @@ open class Pokemon : ShowdownIdentifiable {
|
||||
scaleModifier = 1F + (roundedPercent / 100F)
|
||||
}
|
||||
|
||||
var caughtBall: PokeBall = PokeBalls.POKE_BALL
|
||||
var caughtBall: PokeBall = PokeBalls.STRANGE_BALL
|
||||
get() {
|
||||
return try {
|
||||
field
|
||||
} catch (_: Exception) {
|
||||
// account for possibility of ball removal (datapack disable/removal)
|
||||
CaughtBallUpdatePacket({ this }, PokeBalls.STRANGE_BALL)
|
||||
PokeBalls.STRANGE_BALL
|
||||
}
|
||||
}
|
||||
set(value) {
|
||||
field = value
|
||||
onChange(CaughtBallUpdatePacket({ this }, field))
|
||||
|
||||
+3
-8
@@ -13,7 +13,6 @@ import com.cobblemon.mod.common.api.abilities.Abilities
|
||||
import com.cobblemon.mod.common.api.data.DataRegistry
|
||||
import com.cobblemon.mod.common.api.pokeball.PokeBalls
|
||||
import com.cobblemon.mod.common.api.pokemon.Natures
|
||||
import com.cobblemon.mod.common.api.pokemon.feature.AbstractChoiceSpeciesFeatureProvider
|
||||
import com.cobblemon.mod.common.api.pokemon.stats.Stats
|
||||
import com.cobblemon.mod.common.api.pokemon.status.Statuses
|
||||
import com.cobblemon.mod.common.api.properties.CustomPokemonProperty
|
||||
@@ -135,7 +134,7 @@ internal object PropertiesCompletionProvider : DataRegistry {
|
||||
private fun addDefaults() {
|
||||
this.inject(setOf("level", "lvl", "l"), setOf("1", "${Cobblemon.config.maxPokemonLevel}") )
|
||||
this.inject(setOf("shiny", "s"), setOf("yes", "no"))
|
||||
this.inject(setOf("gender"), Gender.entries.map { it.name.lowercase() })
|
||||
this.inject(setOf("gender"), Gender.values().map { it.name.lowercase() })
|
||||
this.inject(setOf("friendship"), setOf("0", Cobblemon.config.maxPokemonFriendship.toString()))
|
||||
this.inject(setOf("fullness"), setOf("0", "255"))
|
||||
this.inject(setOf("pokeball"), PokeBalls.all().map { it.name.simplify() })
|
||||
@@ -165,11 +164,7 @@ internal object PropertiesCompletionProvider : DataRegistry {
|
||||
private fun addCustom() {
|
||||
CustomPokemonProperty.properties.forEach { property ->
|
||||
// We won't tab complete properties that have no key attached to them as it would be fairly hard to determine which one to suggest
|
||||
if (property.needsKey && property !is AbstractChoiceSpeciesFeatureProvider<*>) {
|
||||
this.inject(property.keys, property.examples())
|
||||
}
|
||||
// Except choice features that fill examples with all available choices - Gito
|
||||
if (property is AbstractChoiceSpeciesFeatureProvider<*>) {
|
||||
if (property.needsKey) {
|
||||
this.inject(property.keys, property.examples())
|
||||
}
|
||||
}
|
||||
@@ -180,4 +175,4 @@ internal object PropertiesCompletionProvider : DataRegistry {
|
||||
val suggestions: Collection<String>
|
||||
)
|
||||
|
||||
}
|
||||
}
|
||||
+87
@@ -0,0 +1,87 @@
|
||||
/*
|
||||
* 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.util.adapters
|
||||
|
||||
import com.cobblemon.mod.common.api.pokeball.catching.CaptureEffect
|
||||
import com.cobblemon.mod.common.util.readString
|
||||
import com.cobblemon.mod.common.util.writeString
|
||||
import com.google.common.collect.HashBiMap
|
||||
import com.google.gson.Gson
|
||||
import com.google.gson.GsonBuilder
|
||||
import com.google.gson.JsonDeserializationContext
|
||||
import com.google.gson.JsonDeserializer
|
||||
import com.google.gson.JsonElement
|
||||
import com.google.gson.JsonSerializationContext
|
||||
import com.google.gson.JsonSerializer
|
||||
import net.minecraft.network.FriendlyByteBuf
|
||||
import java.lang.reflect.Type
|
||||
import kotlin.reflect.KClass
|
||||
|
||||
object CobblemonCaptureEffectAdapter : JsonDeserializer<CaptureEffect>, JsonSerializer<CaptureEffect> {
|
||||
private const val VARIANT = "variant"
|
||||
|
||||
private val types = HashBiMap.create<String, KClass<out CaptureEffect>>()
|
||||
|
||||
val gson: Gson by lazy {
|
||||
GsonBuilder()
|
||||
.registerTypeAdapter(CaptureEffect::class.java, CobblemonCaptureEffectAdapter)
|
||||
.setPrettyPrinting()
|
||||
.create()
|
||||
}
|
||||
|
||||
fun <T : CaptureEffect> registerType(id: String, type: KClass<T>) {
|
||||
this.types[id.lowercase()] = type
|
||||
}
|
||||
|
||||
override fun deserialize(
|
||||
json: JsonElement,
|
||||
typeOfT: Type,
|
||||
context: JsonDeserializationContext,
|
||||
): CaptureEffect {
|
||||
val variant =
|
||||
json.asJsonObject
|
||||
.get(VARIANT)
|
||||
.asString
|
||||
.lowercase()
|
||||
val type = getModifierType(variant)
|
||||
return context.deserialize(json, type.java)
|
||||
}
|
||||
|
||||
override fun serialize(
|
||||
effect: CaptureEffect,
|
||||
typeOfSrc: Type,
|
||||
context: JsonSerializationContext,
|
||||
): JsonElement {
|
||||
val json = context.serialize(effect, effect::class.java).asJsonObject
|
||||
val variant = getVariant(effect)
|
||||
json.addProperty(VARIANT, variant)
|
||||
return json
|
||||
}
|
||||
|
||||
fun encode(effect: CaptureEffect, buffer: FriendlyByteBuf) {
|
||||
buffer.writeString(gson.toJson(effect, CaptureEffect::class.java))
|
||||
}
|
||||
|
||||
fun decode(buffer: FriendlyByteBuf): CaptureEffect = gson.fromJson(buffer.readString(), CaptureEffect::class.java)
|
||||
|
||||
private fun getVariant(effect: CaptureEffect): String {
|
||||
val variant =
|
||||
this.types.inverse()[effect::class]
|
||||
?: throw IllegalArgumentException("Cannot resolve pokeball capture effect for type ${effect::class.qualifiedName}")
|
||||
|
||||
return variant
|
||||
}
|
||||
|
||||
private fun getModifierType(variant: String): KClass<out CaptureEffect> {
|
||||
val effectType =
|
||||
this.types[variant] ?: throw IllegalArgumentException("Cannot resolve pokeball capture effect type for variant $variant")
|
||||
|
||||
return effectType
|
||||
}
|
||||
}
|
||||
+113
@@ -0,0 +1,113 @@
|
||||
/*
|
||||
* 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.util.adapters
|
||||
|
||||
import com.bedrockk.molang.Expression
|
||||
import com.cobblemon.mod.common.api.molang.ExpressionLike
|
||||
import com.cobblemon.mod.common.api.pokeball.catching.CatchRateModifier
|
||||
import com.cobblemon.mod.common.api.pokeball.catching.modifiers.BaseStatModifier
|
||||
import com.cobblemon.mod.common.api.pokeball.catching.modifiers.CatchRateModifierAdapter
|
||||
import com.cobblemon.mod.common.api.pokeball.catching.modifiers.GuaranteedModifier
|
||||
import com.cobblemon.mod.common.api.pokeball.catching.modifiers.LabelModifier
|
||||
import com.cobblemon.mod.common.api.pokeball.catching.modifiers.ExpressionModifier
|
||||
import com.cobblemon.mod.common.api.pokeball.catching.modifiers.PropertyBasedModifier
|
||||
import com.cobblemon.mod.common.api.pokeball.catching.modifiers.ScriptModifier
|
||||
import com.cobblemon.mod.common.api.pokeball.catching.modifiers.SimpleModifier
|
||||
import com.cobblemon.mod.common.api.pokemon.PokemonProperties
|
||||
import com.cobblemon.mod.common.util.readString
|
||||
import com.cobblemon.mod.common.util.writeString
|
||||
import com.google.common.collect.HashBiMap
|
||||
import com.google.gson.Gson
|
||||
import com.google.gson.GsonBuilder
|
||||
import com.google.gson.JsonDeserializationContext
|
||||
import com.google.gson.JsonElement
|
||||
import com.google.gson.JsonSerializationContext
|
||||
import net.minecraft.network.FriendlyByteBuf
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import java.lang.reflect.Type
|
||||
import kotlin.reflect.KClass
|
||||
|
||||
object CobblemonCatchRateModifierAdapter : CatchRateModifierAdapter {
|
||||
private const val VARIANT = "variant"
|
||||
|
||||
private val types = HashBiMap.create<String, KClass<out CatchRateModifier>>()
|
||||
|
||||
init {
|
||||
this.registerType(SimpleModifier.VARIANT, SimpleModifier::class)
|
||||
this.registerType(BaseStatModifier.VARIANT, BaseStatModifier::class)
|
||||
this.registerType(GuaranteedModifier.VARIANT, GuaranteedModifier::class)
|
||||
this.registerType(PropertyBasedModifier.VARIANT, PropertyBasedModifier::class)
|
||||
this.registerType(LabelModifier.VARIANT, LabelModifier::class)
|
||||
this.registerType(ExpressionModifier.VARIANT, ExpressionModifier::class)
|
||||
this.registerType(ScriptModifier.VARIANT, ScriptModifier::class)
|
||||
}
|
||||
|
||||
val gson: Gson by lazy {
|
||||
GsonBuilder()
|
||||
.registerTypeAdapter(ResourceLocation::class.java, IdentifierAdapter)
|
||||
.registerTypeAdapter(Expression::class.java, ExpressionAdapter)
|
||||
.registerTypeAdapter(ExpressionLike::class.java, ExpressionLikeAdapter)
|
||||
.registerTypeAdapter(PokemonProperties::class.java, pokemonPropertiesShortAdapter)
|
||||
.registerTypeAdapter(CatchRateModifier::class.java, CobblemonCatchRateModifierAdapter)
|
||||
.setPrettyPrinting()
|
||||
.create()
|
||||
}
|
||||
|
||||
override fun <T : CatchRateModifier> registerType(id: String, type: KClass<T>) {
|
||||
this.types[id.lowercase()] = type
|
||||
}
|
||||
|
||||
override fun deserialize(
|
||||
json: JsonElement,
|
||||
typeOfT: Type,
|
||||
context: JsonDeserializationContext,
|
||||
): CatchRateModifier {
|
||||
val variant =
|
||||
json.asJsonObject
|
||||
.get(VARIANT)
|
||||
.asString
|
||||
.lowercase()
|
||||
val type = getModifierType(variant)
|
||||
return context.deserialize(json, type.java)
|
||||
}
|
||||
|
||||
override fun serialize(
|
||||
modifier: CatchRateModifier,
|
||||
typeOfSrc: Type,
|
||||
context: JsonSerializationContext,
|
||||
): JsonElement {
|
||||
val json = context.serialize(modifier, modifier::class.java).asJsonObject
|
||||
val variant = getVariant(modifier)
|
||||
json.addProperty(VARIANT, variant)
|
||||
return json
|
||||
}
|
||||
|
||||
fun encode(modifier: CatchRateModifier, buffer: FriendlyByteBuf) {
|
||||
buffer.writeString(gson.toJson(modifier, CatchRateModifier::class.java))
|
||||
}
|
||||
|
||||
fun decode(buffer: FriendlyByteBuf): CatchRateModifier =
|
||||
gson.fromJson(buffer.readString(), CatchRateModifier::class.java)
|
||||
|
||||
private fun getVariant(modifier: CatchRateModifier): String {
|
||||
val variant =
|
||||
this.types.inverse()[modifier::class]
|
||||
?: throw IllegalArgumentException("Cannot resolve pokeball catchrate modifier for type ${modifier::class.qualifiedName}")
|
||||
|
||||
return variant
|
||||
}
|
||||
|
||||
private fun getModifierType(variant: String): KClass<out CatchRateModifier> {
|
||||
val requirementType =
|
||||
this.types[variant]
|
||||
?: throw IllegalArgumentException("Cannot resolve pokeball catchrate modifier type for variant $variant")
|
||||
|
||||
return requirementType
|
||||
}
|
||||
}
|
||||
-90
@@ -1,90 +0,0 @@
|
||||
{
|
||||
"format_version": "1.10.0",
|
||||
"particle_effect": {
|
||||
"description": {
|
||||
"identifier": "cobblemon:watershuriken_actor",
|
||||
"basic_render_parameters": {
|
||||
"material": "particles_blend",
|
||||
"texture": "textures/particles/moves/watershuriken"
|
||||
}
|
||||
},
|
||||
"curves": {
|
||||
"variable.rsize": {
|
||||
"type": "linear",
|
||||
"input": "v.particle_age",
|
||||
"horizontal_range": "v.particle_lifetime",
|
||||
"nodes": [0, 1, 1, 1, 1, 1, 1, 1]
|
||||
}
|
||||
},
|
||||
"events": {
|
||||
"trail": {
|
||||
"particle_effect": {
|
||||
"effect": "cobblemon:watershuriken_actortrail",
|
||||
"type": "particle"
|
||||
}
|
||||
},
|
||||
"hit": {
|
||||
"particle_effect": {
|
||||
"effect": "cobblemon:watershuriken_target",
|
||||
"type": "particle"
|
||||
}
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
"minecraft:emitter_initialization": {
|
||||
"creation_expression": "v.target_deltaz=5;"
|
||||
},
|
||||
"minecraft:emitter_rate_instant": {
|
||||
"num_particles": 1
|
||||
},
|
||||
"minecraft:emitter_lifetime_once": {
|
||||
"active_time": 0.25
|
||||
},
|
||||
"minecraft:emitter_shape_disc": {
|
||||
"offset": [0, 0.02, 0.1],
|
||||
"radius": 0.5,
|
||||
"direction": "outwards"
|
||||
},
|
||||
"minecraft:particle_lifetime_expression": {
|
||||
"max_lifetime": 0.35
|
||||
},
|
||||
"minecraft:particle_lifetime_events": {
|
||||
"timeline": {
|
||||
"0.00": "trail",
|
||||
"0.06": "trail",
|
||||
"0.12": "trail",
|
||||
"0.18": "trail",
|
||||
"0.24": "trail",
|
||||
"0.30": "trail",
|
||||
"0.34": "hit"
|
||||
}
|
||||
},
|
||||
"minecraft:particle_initial_spin": {
|
||||
"rotation": "math.random_integer(0,3)*90"
|
||||
},
|
||||
"minecraft:particle_motion_parametric": {
|
||||
"relative_position": ["-v.target_deltax*(v.particle_age / v.particle_lifetime)", "(v.target_deltay*(v.particle_age / v.particle_lifetime))", "-v.target_deltaz*(v.particle_age / v.particle_lifetime)"]
|
||||
},
|
||||
"minecraft:particle_appearance_billboard": {
|
||||
"size": ["0.4*v.rsize", "0.4*v.rsize"],
|
||||
"facing_camera_mode": "lookat_direction",
|
||||
"direction": {
|
||||
"mode": "custom",
|
||||
"custom_direction": [0, 0, -1]
|
||||
},
|
||||
"uv": {
|
||||
"texture_width": 60,
|
||||
"texture_height": 15,
|
||||
"flipbook": {
|
||||
"base_UV": [0, 0],
|
||||
"size_UV": [15, 15],
|
||||
"step_UV": [15, 0],
|
||||
"frames_per_second": 24,
|
||||
"max_frame": 4,
|
||||
"loop": true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
-91
@@ -1,91 +0,0 @@
|
||||
{
|
||||
"format_version": "1.10.0",
|
||||
"particle_effect": {
|
||||
"description": {
|
||||
"identifier": "cobblemon:watershuriken_actoralt",
|
||||
"basic_render_parameters": {
|
||||
"material": "particles_blend",
|
||||
"texture": "textures/particles/moves/watershuriken"
|
||||
}
|
||||
},
|
||||
"curves": {
|
||||
"variable.rsize": {
|
||||
"type": "linear",
|
||||
"input": "v.particle_age",
|
||||
"horizontal_range": "v.particle_lifetime",
|
||||
"nodes": [0, 1, 1, 1, 1, 1, 1, 1]
|
||||
}
|
||||
},
|
||||
"events": {
|
||||
"trail": {
|
||||
"particle_effect": {
|
||||
"effect": "cobblemon:watershuriken_actortrail",
|
||||
"type": "particle"
|
||||
}
|
||||
},
|
||||
"hit": {
|
||||
"particle_effect": {
|
||||
"effect": "cobblemon:watershuriken_target",
|
||||
"type": "particle"
|
||||
}
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
"minecraft:emitter_initialization": {
|
||||
"creation_expression": "v.target_deltaz=5;"
|
||||
},
|
||||
"minecraft:emitter_rate_steady": {
|
||||
"spawn_rate": 7,
|
||||
"max_particles": 3
|
||||
},
|
||||
"minecraft:emitter_lifetime_once": {
|
||||
"active_time": 0.4
|
||||
},
|
||||
"minecraft:emitter_shape_disc": {
|
||||
"offset": [0, 0.02, 0.1],
|
||||
"radius": 0.5,
|
||||
"direction": "outwards"
|
||||
},
|
||||
"minecraft:particle_lifetime_expression": {
|
||||
"max_lifetime": 0.35
|
||||
},
|
||||
"minecraft:particle_lifetime_events": {
|
||||
"timeline": {
|
||||
"0.00": "trail",
|
||||
"0.06": "trail",
|
||||
"0.12": "trail",
|
||||
"0.18": "trail",
|
||||
"0.24": "trail",
|
||||
"0.30": "trail",
|
||||
"0.34": "hit"
|
||||
}
|
||||
},
|
||||
"minecraft:particle_initial_spin": {
|
||||
"rotation": "math.random_integer(0,3)*90"
|
||||
},
|
||||
"minecraft:particle_motion_parametric": {
|
||||
"relative_position": ["-(v.target_deltax+((v.particle_random_1-0.5)*2))*(v.particle_age / v.particle_lifetime)", "(v.target_deltay+((v.particle_random_2-0.5)*2))*(v.particle_age / v.particle_lifetime)", "-v.target_deltaz*(v.particle_age / v.particle_lifetime)"]
|
||||
},
|
||||
"minecraft:particle_appearance_billboard": {
|
||||
"size": ["0.4*v.rsize", "0.4*v.rsize"],
|
||||
"facing_camera_mode": "lookat_direction",
|
||||
"direction": {
|
||||
"mode": "custom",
|
||||
"custom_direction": [0, 0, -1]
|
||||
},
|
||||
"uv": {
|
||||
"texture_width": 60,
|
||||
"texture_height": 15,
|
||||
"flipbook": {
|
||||
"base_UV": [0, 0],
|
||||
"size_UV": [15, 15],
|
||||
"step_UV": [15, 0],
|
||||
"frames_per_second": 24,
|
||||
"max_frame": 4,
|
||||
"loop": true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
-86
@@ -1,86 +0,0 @@
|
||||
{
|
||||
"format_version": "1.10.0",
|
||||
"particle_effect": {
|
||||
"description": {
|
||||
"identifier": "cobblemon:watershuriken_actorhor",
|
||||
"basic_render_parameters": {
|
||||
"material": "particles_blend",
|
||||
"texture": "textures/particles/moves/watershuriken"
|
||||
}
|
||||
},
|
||||
"curves": {
|
||||
"variable.rsize": {
|
||||
"type": "linear",
|
||||
"input": "v.particle_age",
|
||||
"horizontal_range": "v.particle_lifetime",
|
||||
"nodes": [0, 1, 1, 1, 1, 1, 1, 1]
|
||||
}
|
||||
},
|
||||
"events": {
|
||||
"trail": {
|
||||
"particle_effect": {
|
||||
"effect": "cobblemon:watershuriken_actortrail",
|
||||
"type": "particle"
|
||||
}
|
||||
},
|
||||
"hit": {
|
||||
"particle_effect": {
|
||||
"effect": "cobblemon:watershuriken_target",
|
||||
"type": "particle"
|
||||
}
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
"minecraft:emitter_initialization": {
|
||||
"creation_expression": "v.target_deltaz=5;"
|
||||
},
|
||||
"minecraft:emitter_rate_instant": {
|
||||
"num_particles": 1
|
||||
},
|
||||
"minecraft:emitter_lifetime_once": {
|
||||
"active_time": 0.25
|
||||
},
|
||||
"minecraft:emitter_shape_disc": {
|
||||
"offset": [0, 0.02, 0.1],
|
||||
"radius": 0.5,
|
||||
"direction": "outwards"
|
||||
},
|
||||
"minecraft:particle_lifetime_expression": {
|
||||
"max_lifetime": 0.35
|
||||
},
|
||||
"minecraft:particle_lifetime_events": {
|
||||
"timeline": {
|
||||
"0.00": "trail",
|
||||
"0.06": "trail",
|
||||
"0.12": "trail",
|
||||
"0.18": "trail",
|
||||
"0.24": "trail",
|
||||
"0.30": "trail",
|
||||
"0.34": "hit"
|
||||
}
|
||||
},
|
||||
"minecraft:particle_initial_spin": {
|
||||
"rotation": "math.random_integer(0,3)*90"
|
||||
},
|
||||
"minecraft:particle_motion_parametric": {
|
||||
"relative_position": ["-v.target_deltax*(v.particle_age / v.particle_lifetime)", "(v.target_deltay*(v.particle_age / v.particle_lifetime))", "-v.target_deltaz*(v.particle_age / v.particle_lifetime)"]
|
||||
},
|
||||
"minecraft:particle_appearance_billboard": {
|
||||
"size": ["0.4*v.rsize", "0.4*v.rsize"],
|
||||
"facing_camera_mode": "emitter_transform_xz",
|
||||
"uv": {
|
||||
"texture_width": 60,
|
||||
"texture_height": 15,
|
||||
"flipbook": {
|
||||
"base_UV": [0, 0],
|
||||
"size_UV": [15, 15],
|
||||
"step_UV": [15, 0],
|
||||
"frames_per_second": 24,
|
||||
"max_frame": 4,
|
||||
"loop": true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
-63
@@ -1,63 +0,0 @@
|
||||
{
|
||||
"format_version": "1.10.0",
|
||||
"particle_effect": {
|
||||
"description": {
|
||||
"identifier": "cobblemon:watershuriken_actortrail",
|
||||
"basic_render_parameters": {
|
||||
"material": "particles_alpha",
|
||||
"texture": "textures/particles/generic/impact/impact_water"
|
||||
}
|
||||
},
|
||||
"curves": {
|
||||
"variable.scale": {
|
||||
"type": "linear",
|
||||
"input": "v.particle_age",
|
||||
"horizontal_range": "v.particle_lifetime",
|
||||
"nodes": [1, 0]
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
"minecraft:emitter_rate_instant": {
|
||||
"num_particles": 1
|
||||
},
|
||||
"minecraft:emitter_lifetime_once": {
|
||||
"active_time": 1
|
||||
},
|
||||
"minecraft:emitter_shape_point": {
|
||||
"direction": ["v.particle_random_1-0.5", "v.particle_random_2-0.25", -3]
|
||||
},
|
||||
"minecraft:particle_lifetime_expression": {
|
||||
"max_lifetime": "math.random(0.3, 0.6)"
|
||||
},
|
||||
"minecraft:particle_initial_spin": {
|
||||
"rotation": "math.round(v.particle_random_4*3)*90"
|
||||
},
|
||||
"minecraft:particle_initial_speed": 8,
|
||||
"minecraft:particle_motion_dynamic": {
|
||||
"linear_acceleration": [0, -5, 0],
|
||||
"linear_drag_coefficient": 8
|
||||
},
|
||||
"minecraft:particle_appearance_billboard": {
|
||||
"size": ["0.22 * variable.scale", "0.22 * variable.scale"],
|
||||
"facing_camera_mode": "rotate_xyz",
|
||||
"uv": {
|
||||
"texture_width": 8,
|
||||
"texture_height": 56,
|
||||
"flipbook": {
|
||||
"base_UV": [0, 24],
|
||||
"size_UV": [8, 8],
|
||||
"step_UV": [0, 8],
|
||||
"frames_per_second": 16,
|
||||
"max_frame": 4
|
||||
}
|
||||
}
|
||||
},
|
||||
"minecraft:particle_motion_collision": {
|
||||
"collision_radius": 0.02
|
||||
},
|
||||
"minecraft:particle_appearance_tinting": {
|
||||
"color": [0.61176, 0.87451, 1, 1]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
-86
@@ -1,86 +0,0 @@
|
||||
{
|
||||
"format_version": "1.10.0",
|
||||
"particle_effect": {
|
||||
"description": {
|
||||
"identifier": "cobblemon:watershuriken_actorvert",
|
||||
"basic_render_parameters": {
|
||||
"material": "particles_blend",
|
||||
"texture": "textures/particles/moves/watershuriken"
|
||||
}
|
||||
},
|
||||
"curves": {
|
||||
"variable.rsize": {
|
||||
"type": "linear",
|
||||
"input": "v.particle_age",
|
||||
"horizontal_range": "v.particle_lifetime",
|
||||
"nodes": [0, 1, 1, 1, 1, 1, 1, 1]
|
||||
}
|
||||
},
|
||||
"events": {
|
||||
"trail": {
|
||||
"particle_effect": {
|
||||
"effect": "cobblemon:watershuriken_actortrail",
|
||||
"type": "particle"
|
||||
}
|
||||
},
|
||||
"hit": {
|
||||
"particle_effect": {
|
||||
"effect": "cobblemon:watershuriken_target",
|
||||
"type": "particle"
|
||||
}
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
"minecraft:emitter_initialization": {
|
||||
"creation_expression": "v.target_deltaz=5;"
|
||||
},
|
||||
"minecraft:emitter_rate_instant": {
|
||||
"num_particles": 1
|
||||
},
|
||||
"minecraft:emitter_lifetime_once": {
|
||||
"active_time": 0.25
|
||||
},
|
||||
"minecraft:emitter_shape_disc": {
|
||||
"offset": [0, 0.02, 0.1],
|
||||
"radius": 0.5,
|
||||
"direction": "outwards"
|
||||
},
|
||||
"minecraft:particle_lifetime_expression": {
|
||||
"max_lifetime": 0.35
|
||||
},
|
||||
"minecraft:particle_lifetime_events": {
|
||||
"timeline": {
|
||||
"0.00": "trail",
|
||||
"0.06": "trail",
|
||||
"0.12": "trail",
|
||||
"0.18": "trail",
|
||||
"0.24": "trail",
|
||||
"0.30": "trail",
|
||||
"0.34": "hit"
|
||||
}
|
||||
},
|
||||
"minecraft:particle_initial_spin": {
|
||||
"rotation": "math.random_integer(0,3)*90"
|
||||
},
|
||||
"minecraft:particle_motion_parametric": {
|
||||
"relative_position": ["-v.target_deltax*(v.particle_age / v.particle_lifetime)", "(v.target_deltay*(v.particle_age / v.particle_lifetime))", "-v.target_deltaz*(v.particle_age / v.particle_lifetime)"]
|
||||
},
|
||||
"minecraft:particle_appearance_billboard": {
|
||||
"size": ["0.4*v.rsize", "0.4*v.rsize"],
|
||||
"facing_camera_mode": "emitter_transform_yz",
|
||||
"uv": {
|
||||
"texture_width": 60,
|
||||
"texture_height": 15,
|
||||
"flipbook": {
|
||||
"base_UV": [0, 0],
|
||||
"size_UV": [15, 15],
|
||||
"step_UV": [15, 0],
|
||||
"frames_per_second": 24,
|
||||
"max_frame": 4,
|
||||
"loop": true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
-69
@@ -1,69 +0,0 @@
|
||||
{
|
||||
"format_version": "1.10.0",
|
||||
"particle_effect": {
|
||||
"description": {
|
||||
"identifier": "cobblemon:watershuriken_target",
|
||||
"basic_render_parameters": {
|
||||
"material": "particles_alpha",
|
||||
"texture": "textures/particles/generic/impact/impact_water"
|
||||
}
|
||||
},
|
||||
"curves": {
|
||||
"variable.scale": {
|
||||
"type": "linear",
|
||||
"input": "v.particle_age",
|
||||
"horizontal_range": "v.particle_lifetime",
|
||||
"nodes": [1, 0]
|
||||
}
|
||||
},
|
||||
"events": {
|
||||
"event": {
|
||||
"particle_effect": {
|
||||
"effect": "cobblemon:watershuriken_targetspark",
|
||||
"type": "particle"
|
||||
}
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
"minecraft:emitter_rate_steady": {
|
||||
"spawn_rate": 240,
|
||||
"max_particles": 14
|
||||
},
|
||||
"minecraft:emitter_lifetime_once": {
|
||||
"active_time": 0.1
|
||||
},
|
||||
"minecraft:emitter_lifetime_events": {
|
||||
"creation_event": "event"
|
||||
},
|
||||
"minecraft:emitter_shape_point": {},
|
||||
"minecraft:particle_lifetime_expression": {
|
||||
"max_lifetime": "math.random(0.3, 0.6)"
|
||||
},
|
||||
"minecraft:particle_initial_spin": {
|
||||
"rotation": "math.round(v.particle_random_4*3)*90"
|
||||
},
|
||||
"minecraft:particle_initial_speed": "math.random(9,17)",
|
||||
"minecraft:particle_motion_dynamic": {
|
||||
"linear_drag_coefficient": 5
|
||||
},
|
||||
"minecraft:particle_appearance_billboard": {
|
||||
"size": ["0.3 * variable.scale", "0.3 * variable.scale"],
|
||||
"facing_camera_mode": "rotate_xyz",
|
||||
"uv": {
|
||||
"texture_width": 8,
|
||||
"texture_height": 56,
|
||||
"flipbook": {
|
||||
"base_UV": [0, 16],
|
||||
"size_UV": [8, 8],
|
||||
"step_UV": [0, 8],
|
||||
"frames_per_second": 16,
|
||||
"max_frame": 5
|
||||
}
|
||||
}
|
||||
},
|
||||
"minecraft:particle_appearance_tinting": {
|
||||
"color": [0.61176, 0.87451, 1, 1]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
-62
@@ -1,62 +0,0 @@
|
||||
{
|
||||
"format_version": "1.10.0",
|
||||
"particle_effect": {
|
||||
"description": {
|
||||
"identifier": "cobblemon:watershuriken_targetspark",
|
||||
"basic_render_parameters": {
|
||||
"material": "particles_blend",
|
||||
"texture": "textures/particles/vanilla/critical_hit"
|
||||
}
|
||||
},
|
||||
"curves": {
|
||||
"variable.bitespark": {
|
||||
"type": "linear",
|
||||
"input": "v.particle_age",
|
||||
"horizontal_range": "v.particle_lifetime",
|
||||
"nodes": [0, 1, 0.88, 0.66, 0.35, -0.05]
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
"minecraft:emitter_rate_instant": {
|
||||
"num_particles": 7
|
||||
},
|
||||
"minecraft:emitter_lifetime_once": {
|
||||
"active_time": 1
|
||||
},
|
||||
"minecraft:emitter_shape_point": {
|
||||
"offset": [0, 0, -0.25],
|
||||
"direction": ["v.particle_random_1-0.5", "v.particle_random_2-0.25", "v.particle_random_3-0.5"]
|
||||
},
|
||||
"minecraft:particle_lifetime_expression": {
|
||||
"max_lifetime": "0.5-(v.particle_random_4*0.1)"
|
||||
},
|
||||
"minecraft:particle_initial_speed": "math.random(1.75,3.55)*3",
|
||||
"minecraft:particle_motion_dynamic": {
|
||||
"linear_acceleration": [0, -5, 0],
|
||||
"linear_drag_coefficient": 4
|
||||
},
|
||||
"minecraft:particle_appearance_billboard": {
|
||||
"size": ["0.125*v.bitespark", "0.125*v.bitespark"],
|
||||
"facing_camera_mode": "rotate_xyz",
|
||||
"uv": {
|
||||
"texture_width": 8,
|
||||
"texture_height": 8,
|
||||
"uv": [0, 0],
|
||||
"uv_size": [7, 7]
|
||||
}
|
||||
},
|
||||
"minecraft:particle_motion_collision": {
|
||||
"collision_radius": 0.01
|
||||
},
|
||||
"minecraft:particle_appearance_tinting": {
|
||||
"color": {
|
||||
"interpolant": "v.particle_age / v.particle_lifetime",
|
||||
"gradient": {
|
||||
"0.0": "#FF51D8FF",
|
||||
"1.0": "#FF0076FF"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"portraitScale": 1,
|
||||
"portraitTranslation": [0, 0, 0],
|
||||
"profileScale": 1,
|
||||
"profileTranslation": [0, 0, 0],
|
||||
"rootBone": "ancient_ball",
|
||||
"poses": {
|
||||
"flying": {
|
||||
"poseTypes": ["NONE"],
|
||||
"condition": "q.capture_state() == 'NOT'",
|
||||
"animations": ["q.bedrock('ancient_ball', 'throw')"],
|
||||
"transitions": {
|
||||
"open": "q.bedrock_stateful('ancient_ball', 'open')"
|
||||
}
|
||||
},
|
||||
"open": {
|
||||
"poseTypes": ["NONE", "PORTRAIT"],
|
||||
"animations": ["q.bedrock('ancient_ball', 'open_idle')"],
|
||||
"transitions": {
|
||||
"shut": "q.bedrock_stateful('ancient_ball', 'shut')"
|
||||
}
|
||||
},
|
||||
"shut": {
|
||||
"poseTypes": ["NONE", "PORTRAIT"],
|
||||
"animations": [
|
||||
"q.bedrock('ancient_ball', 'shut_idle')"
|
||||
],
|
||||
"transitions": {
|
||||
"open": "q.bedrock_stateful('ancient_ball', 'open')"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"portraitScale": 1,
|
||||
"portraitTranslation": [0, 0, 0],
|
||||
"profileScale": 1,
|
||||
"profileTranslation": [0, 0, 0],
|
||||
"rootBone": "poke_ball",
|
||||
"poses": {
|
||||
"flying": {
|
||||
"poseTypes": ["NONE"],
|
||||
"condition": "q.capture_state() == 'NOT'",
|
||||
"animations": ["q.bedrock('poke_ball', 'throw')"],
|
||||
"transitions": {
|
||||
"open": "q.bedrock_stateful('poke_ball', 'open')"
|
||||
}
|
||||
},
|
||||
"open": {
|
||||
"poseTypes": ["NONE", "PORTRAIT"],
|
||||
"animations": ["q.bedrock('poke_ball', 'open_idle')"],
|
||||
"transitions": {
|
||||
"shut": "q.bedrock_stateful('poke_ball', 'shut')"
|
||||
}
|
||||
},
|
||||
"shut": {
|
||||
"poseTypes": ["NONE", "PORTRAIT"],
|
||||
"animations": [
|
||||
"q.bedrock('poke_ball', 'shut_idle')"
|
||||
],
|
||||
"transitions": {
|
||||
"open": "q.bedrock_stateful('poke_ball', 'open')"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+9
-611
@@ -37,10 +37,10 @@
|
||||
"rotation": [0, -7.5, 0]
|
||||
},
|
||||
"tail2": {
|
||||
"rotation": ["30-math.sin(q.anim_time*90*2-60)*-3", 0, 0]
|
||||
"rotation": [30, 0, 0]
|
||||
},
|
||||
"tail3": {
|
||||
"rotation": ["12.5-math.sin(q.anim_time*90*2-120)*-3", 0, 0]
|
||||
"rotation": [12.5, 0, 0]
|
||||
},
|
||||
"leg_right": {
|
||||
"rotation": [0, 5, 0]
|
||||
@@ -53,22 +53,6 @@
|
||||
},
|
||||
"wings_open": {
|
||||
"scale": 0
|
||||
},
|
||||
"torso": {
|
||||
"rotation": ["-math.sin(q.anim_time*90*2-90)*1", 0, "math.sin(q.anim_time*90*1-90)*1"],
|
||||
"position": [0, "math.sin(q.anim_time*90*2)*0.1", 0]
|
||||
},
|
||||
"wing_closed_left": {
|
||||
"rotation": ["-0-math.sin(q.anim_time*90*2-150)*1", 0, 0]
|
||||
},
|
||||
"wing_closed_right": {
|
||||
"rotation": ["-0-math.sin(q.anim_time*90*2-150)*1", 0, 0]
|
||||
},
|
||||
"neck": {
|
||||
"rotation": ["-math.sin(q.anim_time*90*2-180)*1", 0, 0]
|
||||
},
|
||||
"head": {
|
||||
"rotation": ["-math.sin(q.anim_time*90*2-90)*-2", 0, "math.sin(q.anim_time*90*1-60)*-1"]
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -127,30 +111,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"torso": {
|
||||
"rotation": {
|
||||
"0.0": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.3333": {
|
||||
"post": [5, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.5833": {
|
||||
"post": [2.5, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.8333": {
|
||||
"post": [-5, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"1.1667": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
}
|
||||
}
|
||||
},
|
||||
"jaw": {
|
||||
"rotation": {
|
||||
"0.0": {
|
||||
@@ -158,15 +118,19 @@
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.1667": {
|
||||
"post": [72.5, 0, 0],
|
||||
"post": [85, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.4167": {
|
||||
"post": [85, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.5833": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.8333": {
|
||||
"post": [52.5, 0, 0],
|
||||
"0.75": {
|
||||
"post": [85, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"1.1667": {
|
||||
@@ -174,32 +138,6 @@
|
||||
"lerp_mode": "catmullrom"
|
||||
}
|
||||
}
|
||||
},
|
||||
"eyelid_left": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.5833": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0.1, 0, -0.1]
|
||||
},
|
||||
"0.75": {
|
||||
"pre": [0.1, 0, -0.1],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"eyelid_right": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.5833": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [-0.1, 0, -0.1]
|
||||
},
|
||||
"0.75": {
|
||||
"pre": [-0.1, 0, -0.1],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"sound_effects": {
|
||||
@@ -265,546 +203,6 @@
|
||||
"position": [-0.1, 0, -0.1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.spearow.hold_item": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"jaw": {
|
||||
"rotation": [30, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.spearow.ground_walk": {
|
||||
"loop": true,
|
||||
"animation_length": 0.75,
|
||||
"bones": {
|
||||
"torso": {
|
||||
"rotation": ["1-math.cos(q.anim_time*90*16/3*2)*-2", "-math.sin(q.anim_time*90*16/3+60)*3", "-1+math.sin(q.anim_time*90*16/3+30)*-4"],
|
||||
"position": [0, "math.sin(q.anim_time*90*16/3*2)*0.2", 0]
|
||||
},
|
||||
"wings_open": {
|
||||
"scale": 0
|
||||
},
|
||||
"wing_closed_left": {
|
||||
"rotation": [3, 0, 0]
|
||||
},
|
||||
"wing_closed_right": {
|
||||
"rotation": [3, 0, 0]
|
||||
},
|
||||
"tail2": {
|
||||
"rotation": ["22-math.cos(q.anim_time*90*16/3*2)*5", 0, 0]
|
||||
},
|
||||
"tail3": {
|
||||
"rotation": ["5-math.cos(q.anim_time*90*16/3*2)*5", 0, 0]
|
||||
},
|
||||
"neck": {
|
||||
"rotation": {
|
||||
"0.0": ["-math.cos(q.anim_time*90*16/3*2)*-12.5", "-math.sin(q.anim_time*90*16/3+60)*-3", "math.sin(q.anim_time*90*16/3+30)*3"],
|
||||
"0.125": ["-math.cos(q.anim_time*90*16/3*2)*-9.5", "-math.sin(q.anim_time*90*16/3+60)*-3", "math.sin(q.anim_time*90*16/3+30)*3"],
|
||||
"0.1667": ["-math.cos(q.anim_time*90*16/3*2)*-12.5", "-math.sin(q.anim_time*90*16/3+60)*-3", "math.sin(q.anim_time*90*16/3+30)*3"],
|
||||
"0.375": ["-math.cos(q.anim_time*90*16/3*2)*-12.5", "-math.sin(q.anim_time*90*16/3+60)*-3", "math.sin(q.anim_time*90*16/3+30)*3"],
|
||||
"0.5": ["-math.cos(q.anim_time*90*16/3*2)*-9.5", "-math.sin(q.anim_time*90*16/3+60)*-3", "math.sin(q.anim_time*90*16/3+30)*3"],
|
||||
"0.5417": ["-math.cos(q.anim_time*90*16/3*2)*-12.5", "-math.sin(q.anim_time*90*16/3+60)*-3", "math.sin(q.anim_time*90*16/3+30)*3"]
|
||||
},
|
||||
"position": {
|
||||
"0.0": [0, "math.cos(q.anim_time*90*16/3*2)*0.2", 0],
|
||||
"0.0417": [0, -0.075, 0.025],
|
||||
"0.0833": [0, "-0.2+math.cos(q.anim_time*90*16/3*2)*0.2", -0.2],
|
||||
"0.125": [0, -0.22, -0.17],
|
||||
"0.1667": [0, -0.21, -0.185],
|
||||
"0.375": [0, "math.cos(q.anim_time*90*16/3*2)*0.2", 0],
|
||||
"0.4167": [0, -0.075, 0.025],
|
||||
"0.4583": [0, "-0.2+math.cos(q.anim_time*90*16/3*2)*0.2", -0.2],
|
||||
"0.5": [0, -0.22, -0.17],
|
||||
"0.5417": [0, -0.21, -0.185],
|
||||
"0.75": [0, "math.cos(q.anim_time*90*16/3*2)*0.2", 0]
|
||||
}
|
||||
},
|
||||
"head": {
|
||||
"rotation": ["5-math.cos(q.anim_time*90*16/3*2)*18", 0, 0],
|
||||
"position": [0, 0, "-0.2+math.cos(q.anim_time*90*16/3*2)*0.3"]
|
||||
},
|
||||
"scruff_left": {
|
||||
"rotation": [0, "-0-math.cos(q.anim_time*90*16/3*2-30)*7", 0]
|
||||
},
|
||||
"scruff_right": {
|
||||
"rotation": [0, "0+math.cos(q.anim_time*90*16/3*2-30)*7", 0]
|
||||
},
|
||||
"scruff_top_right": {
|
||||
"rotation": ["-0-math.cos(q.anim_time*90*16/3*2-30)*5", 0, 0]
|
||||
},
|
||||
"scruff_bottom": {
|
||||
"rotation": ["-0-math.cos(q.anim_time*90*16/3*2)*-12", 0, 0]
|
||||
},
|
||||
"leg_left": {
|
||||
"rotation": {
|
||||
"0.0": [25, -17.5, 0],
|
||||
"0.125": {
|
||||
"pre": [21.25, -12.5, 0],
|
||||
"post": [21.25, -12.5, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.375": [-40, -5, 0],
|
||||
"0.75": [25, -17.5, 0]
|
||||
},
|
||||
"position": {
|
||||
"0.0": [0.3, 0.1, 0.6],
|
||||
"0.0417": [0.23, 0.25, 0.71],
|
||||
"0.125": {
|
||||
"pre": [0, 0.68, -0.08],
|
||||
"post": [0, 0.68, -0.08],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.25": {
|
||||
"post": [0, 0.97, -1.41],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.375": [0, -0.5, -2.15],
|
||||
"0.5": [0, -0.19, -1.02],
|
||||
"0.5833": [0, -0.07, -0.3],
|
||||
"0.625": [0, -0.02, 0.21],
|
||||
"0.7083": [0.1, 0.215, 0.43],
|
||||
"0.75": [0.3, 0.1, 0.6]
|
||||
}
|
||||
},
|
||||
"leg_left2": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.125": {
|
||||
"pre": [-30.83, 0, 0],
|
||||
"post": [-30.83, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.25": {
|
||||
"post": [-2.65, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.375": [12.5, 0, 0],
|
||||
"0.75": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"foot_left": {
|
||||
"rotation": {
|
||||
"0.0": [27.5, 0, -5],
|
||||
"0.125": {
|
||||
"pre": [20.17, 0, 0],
|
||||
"post": [20.17, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.25": {
|
||||
"post": [12.596, 0.6637, -1.3486],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.375": [28, 0, 0],
|
||||
"0.625": [-7.33, 0, 0],
|
||||
"0.75": [27.5, 0, -5]
|
||||
},
|
||||
"position": {
|
||||
"0.0": [0, 0.25, 0],
|
||||
"0.125": [0, 0, 0],
|
||||
"0.375": [0, 0, 0],
|
||||
"0.625": [0, 0.17, 0],
|
||||
"0.75": [0, 0.25, 0]
|
||||
}
|
||||
},
|
||||
"toe_back_left": {
|
||||
"rotation": {
|
||||
"0.0": [-20, 0, 0],
|
||||
"0.2083": {
|
||||
"pre": [-8.33, 0, 0],
|
||||
"post": [-8.33, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.375": [0, 0, 0],
|
||||
"0.625": [0, 0, 0],
|
||||
"0.75": [-20, 0, 0]
|
||||
}
|
||||
},
|
||||
"toe_inner_left": {
|
||||
"rotation": {
|
||||
"0.0": [-55, 10, -7.5],
|
||||
"0.125": {
|
||||
"pre": [7.5, 15, 0],
|
||||
"post": [7.5, 15, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.25": {
|
||||
"post": [5, 15, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.375": [0, 15, 0],
|
||||
"0.625": [0, 15, 0],
|
||||
"0.75": [-55, 10, -7.5]
|
||||
},
|
||||
"position": {
|
||||
"0.0": [0, -0.75, 1.35],
|
||||
"0.125": [0, 0, 0],
|
||||
"0.625": [0, 0, 0],
|
||||
"0.75": [0, -0.75, 1.35]
|
||||
}
|
||||
},
|
||||
"toe_outer_left": {
|
||||
"rotation": {
|
||||
"0.0": [-51.5, -2.5, 10],
|
||||
"0.125": {
|
||||
"pre": [5, -15, 0],
|
||||
"post": [5, -15, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.25": {
|
||||
"post": [5, -15, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.375": [0, -15, 0],
|
||||
"0.625": [0, -15, 0],
|
||||
"0.75": [-51.5, -2.5, 10]
|
||||
},
|
||||
"position": {
|
||||
"0.0": [0, -0.75, 1.35],
|
||||
"0.125": [0, 0, 0],
|
||||
"0.625": [0, 0, 0],
|
||||
"0.75": [0, -0.75, 1.35]
|
||||
}
|
||||
},
|
||||
"leg_right": {
|
||||
"rotation": {
|
||||
"0.0": [-40, 5, 0],
|
||||
"0.375": [25, 17.5, 0],
|
||||
"0.5": {
|
||||
"pre": [21.25, 12.5, 0],
|
||||
"post": [21.25, 12.5, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.75": [-40, 5, 0]
|
||||
},
|
||||
"position": {
|
||||
"0.0": [0, -0.5, -2.15],
|
||||
"0.125": [0, -0.19, -1.02],
|
||||
"0.2083": [0, -0.07, -0.3],
|
||||
"0.25": [0, -0.02, 0.21],
|
||||
"0.3333": [-0.1, 0.215, 0.43],
|
||||
"0.375": [-0.3, 0.1, 0.6],
|
||||
"0.4167": [-0.23, 0.25, 0.71],
|
||||
"0.5": {
|
||||
"pre": [0, 0.68, -0.08],
|
||||
"post": [0, 0.68, -0.08],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.625": {
|
||||
"post": [0, 0.97, -1.41],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.75": [0, -0.5, -2.15]
|
||||
}
|
||||
},
|
||||
"leg_right2": {
|
||||
"rotation": {
|
||||
"0.0": [12.5, 0, 0],
|
||||
"0.375": [0, 0, 0],
|
||||
"0.5": {
|
||||
"pre": [-30.83, 0, 0],
|
||||
"post": [-30.83, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.625": {
|
||||
"post": [-2.65, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.75": [12.5, 0, 0]
|
||||
}
|
||||
},
|
||||
"foot_right": {
|
||||
"rotation": {
|
||||
"0.0": [28, 0, 0],
|
||||
"0.25": [-7.33, 0, 0],
|
||||
"0.375": [27.5, 0, 5],
|
||||
"0.5": {
|
||||
"pre": [20.17, 0, 0],
|
||||
"post": [20.17, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.625": {
|
||||
"post": [12.596, -0.6637, 1.3486],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.75": [28, 0, 0]
|
||||
},
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.25": [0, 0.17, 0],
|
||||
"0.375": [0, 0.25, 0],
|
||||
"0.5": [0, 0, 0],
|
||||
"0.75": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"toe_back_right": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.25": [0, 0, 0],
|
||||
"0.375": [-20, 0, 0],
|
||||
"0.5833": {
|
||||
"pre": [-8.33, 0, 0],
|
||||
"post": [-8.33, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.75": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"toe_inner_right": {
|
||||
"rotation": {
|
||||
"0.0": [0, -15, 0],
|
||||
"0.25": [0, -15, 0],
|
||||
"0.375": [-55, -10, 7.5],
|
||||
"0.5": {
|
||||
"pre": [7.5, -15, 0],
|
||||
"post": [7.5, -15, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.625": {
|
||||
"post": [5, -15, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.75": [0, -15, 0]
|
||||
},
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.25": [0, 0, 0],
|
||||
"0.375": [0, -0.75, 1.35],
|
||||
"0.5": [0, 0, 0],
|
||||
"0.75": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"toe_outer_right": {
|
||||
"rotation": {
|
||||
"0.0": [0, 15, 0],
|
||||
"0.25": [0, 15, 0],
|
||||
"0.375": [-51.5, 2.5, -10],
|
||||
"0.5": {
|
||||
"pre": [5, 15, 0],
|
||||
"post": [5, 15, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.625": {
|
||||
"post": [5, 15, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.75": [0, 15, 0]
|
||||
},
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.25": [0, 0, 0],
|
||||
"0.375": [0, -0.75, 1.35],
|
||||
"0.5": [0, 0, 0],
|
||||
"0.75": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.spearow.air_idle": {
|
||||
"loop": true,
|
||||
"animation_length": 4,
|
||||
"bones": {
|
||||
"body": {
|
||||
"position": ["-math.sin(q.anim_time*90*3-45)*0.5", "math.sin(q.anim_time*90*6-45)*1.5", "math.sin(q.anim_time*90*6-45)*1/2"]
|
||||
},
|
||||
"torso": {
|
||||
"rotation": ["-math.sin(q.anim_time*90*6-120)*-4", 0, "math.sin(q.anim_time*90*3-90)*4"]
|
||||
},
|
||||
"wing_open_left": {
|
||||
"rotation": ["-math.sin(q.anim_time*90*6-90)*6", 0, "math.sin(q.anim_time*90*6)*65"],
|
||||
"position": [0, "math.sin(q.anim_time*90*6)*-1", 0]
|
||||
},
|
||||
"wing_open_left2": {
|
||||
"rotation": [0, 0, "20+math.sin(q.anim_time*90*6-45)*30"]
|
||||
},
|
||||
"wing_open_left3": {
|
||||
"rotation": [0, 0, "0+math.sin(q.anim_time*90*6-75)*30"]
|
||||
},
|
||||
"wing_open_right": {
|
||||
"rotation": ["-math.sin(q.anim_time*90*6-90)*6", 0, "-math.sin(q.anim_time*90*6)*65"],
|
||||
"position": [0, "math.sin(q.anim_time*90*6)*-1", 0]
|
||||
},
|
||||
"wing_open_right2": {
|
||||
"rotation": [0, 0, "-20-math.sin(q.anim_time*90*6-45)*30"]
|
||||
},
|
||||
"wing_open_right3": {
|
||||
"rotation": [0, 0, "-0-math.sin(q.anim_time*90*6-75)*30"]
|
||||
},
|
||||
"tail2": {
|
||||
"rotation": ["-math.sin(q.anim_time*90*6-30)*5", 0, 0]
|
||||
},
|
||||
"tail3": {
|
||||
"rotation": ["-math.sin(q.anim_time*90*6-90)*5", 0, 0]
|
||||
},
|
||||
"neck": {
|
||||
"rotation": ["5-math.sin(q.anim_time*90*6-140)*-1", 0, "math.sin(q.anim_time*90*3-00)*-1"]
|
||||
},
|
||||
"head": {
|
||||
"rotation": ["-math.sin(q.anim_time*90*6-110)*3", 0, "math.sin(q.anim_time*90*3-120)*-2"]
|
||||
},
|
||||
"scruff_left": {
|
||||
"rotation": [0, "-0-math.sin(q.anim_time*90*6-170)*4", 0]
|
||||
},
|
||||
"scruff_right": {
|
||||
"rotation": [0, "0+math.sin(q.anim_time*90*6-170)*4", 0]
|
||||
},
|
||||
"scruff_top_right": {
|
||||
"rotation": ["-0-math.sin(q.anim_time*90*6-210)*6", 0, 0]
|
||||
},
|
||||
"scruff_bottom": {
|
||||
"rotation": ["-0-math.sin(q.anim_time*90*6-170)*3", 0, 0]
|
||||
},
|
||||
"leg_left": {
|
||||
"rotation": [50, 0, 0]
|
||||
},
|
||||
"leg_left2": {
|
||||
"rotation": [-100, 0, 0]
|
||||
},
|
||||
"foot_left": {
|
||||
"rotation": ["40-math.sin(q.anim_time*90*6-30)*-5", -10, "math.sin(q.anim_time*90*3-150)*6"]
|
||||
},
|
||||
"toe_back_left": {
|
||||
"rotation": [-27.5, 0, 0]
|
||||
},
|
||||
"toe_inner_left": {
|
||||
"rotation": [37.5, 0, 0]
|
||||
},
|
||||
"toe_outer_left": {
|
||||
"rotation": [37.5, 0, 0]
|
||||
},
|
||||
"leg_right": {
|
||||
"rotation": [50, 0, 0]
|
||||
},
|
||||
"leg_right2": {
|
||||
"rotation": [-100, 0, 0]
|
||||
},
|
||||
"foot_right": {
|
||||
"rotation": ["40-math.sin(q.anim_time*90*6-30)*-5", 10, "-math.sin(q.anim_time*90*3-150)*6"]
|
||||
},
|
||||
"toe_back_right": {
|
||||
"rotation": [-27.5, 0, 0]
|
||||
},
|
||||
"toe_inner_right": {
|
||||
"rotation": [37.5, 0, 0]
|
||||
},
|
||||
"toe_outer_right": {
|
||||
"rotation": [37.5, 0, 0]
|
||||
}
|
||||
},
|
||||
"timeline": {
|
||||
"0.6667": "q.has_entity?{q.sound('animation.plumage.wing_flap.small');};",
|
||||
"1.3333": "q.has_entity?{q.sound('animation.plumage.wing_flap.small');};",
|
||||
"2.0": "q.has_entity?{q.sound('animation.plumage.wing_flap.small');};",
|
||||
"2.6667": "q.has_entity?{q.sound('animation.plumage.wing_flap.small');};",
|
||||
"3.3333": "q.has_entity?{q.sound('animation.plumage.wing_flap.small');};",
|
||||
"4.0": "q.has_entity?{q.sound('animation.plumage.wing_flap.small');};"
|
||||
}
|
||||
},
|
||||
"animation.spearow.air_fly": {
|
||||
"loop": true,
|
||||
"animation_length": 4,
|
||||
"bones": {
|
||||
"body": {
|
||||
"position": ["-math.sin(q.anim_time*90*3-45)*0.5", "math.sin(q.anim_time*90*6-45)*1.5", "math.sin(q.anim_time*90*6-45)*1/2"]
|
||||
},
|
||||
"torso": {
|
||||
"rotation": ["15-math.sin(q.anim_time*90*6-120)*-1.5", 0, "math.sin(q.anim_time*90*3-90)*4"]
|
||||
},
|
||||
"wing_open_left": {
|
||||
"rotation": ["-math.sin(q.anim_time*90*6-90)*6", 0, "math.sin(q.anim_time*90*6)*65"],
|
||||
"position": [0, "math.sin(q.anim_time*90*6)*-1", 0]
|
||||
},
|
||||
"wing_open_left2": {
|
||||
"rotation": [0, 0, "20+math.sin(q.anim_time*90*6-45)*30"]
|
||||
},
|
||||
"wing_open_left3": {
|
||||
"rotation": [0, 0, "0+math.sin(q.anim_time*90*6-75)*30"]
|
||||
},
|
||||
"wing_open_right": {
|
||||
"rotation": ["-math.sin(q.anim_time*90*6-90)*6", 0, "-math.sin(q.anim_time*90*6)*65"],
|
||||
"position": [0, "math.sin(q.anim_time*90*6)*-1", 0]
|
||||
},
|
||||
"wing_open_right2": {
|
||||
"rotation": [0, 0, "-20-math.sin(q.anim_time*90*6-45)*30"]
|
||||
},
|
||||
"wing_open_right3": {
|
||||
"rotation": [0, 0, "-0-math.sin(q.anim_time*90*6-75)*30"]
|
||||
},
|
||||
"tail": {
|
||||
"rotation": [-10, 0, 0]
|
||||
},
|
||||
"tail2": {
|
||||
"rotation": ["-math.sin(q.anim_time*90*6-30)*5", 0, 0]
|
||||
},
|
||||
"tail3": {
|
||||
"rotation": ["-math.sin(q.anim_time*90*6-90)*5", 0, 0]
|
||||
},
|
||||
"neck": {
|
||||
"rotation": ["5-math.sin(q.anim_time*90*6-140)*-1", 0, "math.sin(q.anim_time*90*3-00)*-1"]
|
||||
},
|
||||
"head_ai": {
|
||||
"rotation": [5, 0, 0]
|
||||
},
|
||||
"head": {
|
||||
"rotation": ["-7.5-math.sin(q.anim_time*90*6-110)*3", 0, "math.sin(q.anim_time*90*3-120)*-2"]
|
||||
},
|
||||
"scruff_left": {
|
||||
"rotation": [0, "-0-math.sin(q.anim_time*90*6-170)*4", 0]
|
||||
},
|
||||
"scruff_right": {
|
||||
"rotation": [0, "0+math.sin(q.anim_time*90*6-170)*4", 0]
|
||||
},
|
||||
"scruff_top_right": {
|
||||
"rotation": ["-0-math.sin(q.anim_time*90*6-210)*6", 0, 0]
|
||||
},
|
||||
"scruff_bottom": {
|
||||
"rotation": ["-0-math.sin(q.anim_time*90*6-170)*3", 0, 0]
|
||||
},
|
||||
"leg_left": {
|
||||
"rotation": [50, 0, 0]
|
||||
},
|
||||
"leg_left2": {
|
||||
"rotation": [-100, 0, 0]
|
||||
},
|
||||
"foot_left": {
|
||||
"rotation": ["40-math.sin(q.anim_time*90*6-30)*-5", -10, "math.sin(q.anim_time*90*3-150)*6"]
|
||||
},
|
||||
"toe_back_left": {
|
||||
"rotation": [-27.5, 0, 0]
|
||||
},
|
||||
"toe_inner_left": {
|
||||
"rotation": [37.5, 0, 0]
|
||||
},
|
||||
"toe_outer_left": {
|
||||
"rotation": [37.5, 0, 0]
|
||||
},
|
||||
"leg_right": {
|
||||
"rotation": [50, 0, 0]
|
||||
},
|
||||
"leg_right2": {
|
||||
"rotation": [-100, 0, 0]
|
||||
},
|
||||
"foot_right": {
|
||||
"rotation": ["40-math.sin(q.anim_time*90*6-30)*-5", 10, "-math.sin(q.anim_time*90*3-150)*6"]
|
||||
},
|
||||
"toe_back_right": {
|
||||
"rotation": [-27.5, 0, 0]
|
||||
},
|
||||
"toe_inner_right": {
|
||||
"rotation": [37.5, 0, 0]
|
||||
},
|
||||
"toe_outer_right": {
|
||||
"rotation": [37.5, 0, 0]
|
||||
}
|
||||
},
|
||||
"timeline": {
|
||||
"0.6667": "q.has_entity?{q.sound('animation.plumage.wing_flap.small');};",
|
||||
"1.3333": "q.has_entity?{q.sound('animation.plumage.wing_flap.small');};",
|
||||
"2.0": "q.has_entity?{q.sound('animation.plumage.wing_flap.small');};",
|
||||
"2.6667": "q.has_entity?{q.sound('animation.plumage.wing_flap.small');};",
|
||||
"3.3333": "q.has_entity?{q.sound('animation.plumage.wing_flap.small');};",
|
||||
"4.0": "q.has_entity?{q.sound('animation.plumage.wing_flap.small');};"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+64
-3016
File diff suppressed because it is too large
Load Diff
+1
-1
@@ -217,7 +217,7 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.raichu_cap.water_surface_swim": {
|
||||
"animation.raichu_cap.water_swim": {
|
||||
"loop": true,
|
||||
"animation_length": 1,
|
||||
"bones": {
|
||||
|
||||
+19
-1299
File diff suppressed because it is too large
Load Diff
+57
-4559
File diff suppressed because it is too large
Load Diff
+16
-240
@@ -3,274 +3,58 @@
|
||||
"animations": {
|
||||
"animation.mudkip.ground_idle": {
|
||||
"loop": true,
|
||||
"animation_length": 2,
|
||||
"bones": {
|
||||
"head": {
|
||||
"rotation": ["2.5+math.sin(q.anim_time*90*4-90)*1.5", "math.sin(q.anim_time*90*2-60)*1.5", "math.sin(q.anim_time*90*2-60)*1"]
|
||||
"rotation": [2.5, 0, 0]
|
||||
},
|
||||
"fin2": {
|
||||
"rotation": [2.5, 0, "0+math.sin(q.anim_time*90*2-150)*-3"]
|
||||
"rotation": [2.5, 0, 0]
|
||||
},
|
||||
"cheek_left2": {
|
||||
"rotation": [0, -7.5, "0+math.sin(q.anim_time*90*4-90)*1.5"]
|
||||
"rotation": [0, -7.5, 0]
|
||||
},
|
||||
"leg_front_left": {
|
||||
"rotation": ["5+math.sin(q.anim_time*90*4)*2", 5, 0],
|
||||
"position": [0, "-0.125+math.sin(q.anim_time*90*4)*-0.05", "0+math.sin(q.anim_time*90*4)*-0.07"]
|
||||
"rotation": [7.5, 5, 0]
|
||||
},
|
||||
"leg_front_left2": {
|
||||
"rotation": ["-5+math.sin(q.anim_time*90*4)*-2", 0, 0]
|
||||
"rotation": [-7.5, 0, 0]
|
||||
},
|
||||
"leg_front_right": {
|
||||
"rotation": ["5+math.sin(q.anim_time*90*4)*2", -5, 0],
|
||||
"position": [0, "-0.125+math.sin(q.anim_time*90*4)*-0.05", "0+math.sin(q.anim_time*90*4)*-0.07"]
|
||||
"rotation": [7.5, -5, 0]
|
||||
},
|
||||
"leg_front_right2": {
|
||||
"rotation": ["-5+math.sin(q.anim_time*90*4)*-2", 0, 0]
|
||||
"rotation": [-7.5, 0, 0]
|
||||
},
|
||||
"leg_back_left": {
|
||||
"rotation": ["-5+math.sin(q.anim_time*90*4)*-1", -5, 0],
|
||||
"position": [0, "-0.125+math.sin(q.anim_time*90*4)*-0.025", "0+math.sin(q.anim_time*90*4)*0.035"]
|
||||
"rotation": [5, -5, 0]
|
||||
},
|
||||
"leg_back_left2": {
|
||||
"rotation": ["5+math.sin(q.anim_time*90*4)*1", 0, 0]
|
||||
"rotation": [-5, 0, 0]
|
||||
},
|
||||
"leg_back_right": {
|
||||
"rotation": ["-5+math.sin(q.anim_time*90*4)*-1", 5, 0],
|
||||
"position": [0, "-0.125+math.sin(q.anim_time*90*4)*-0.025", "0+math.sin(q.anim_time*90*4)*0.035"]
|
||||
"rotation": [5, 5, 0]
|
||||
},
|
||||
"leg_back_right2": {
|
||||
"rotation": ["5+math.sin(q.anim_time*90*4)*1", 0, 0]
|
||||
"rotation": [-5, 0, 0]
|
||||
},
|
||||
"body": {
|
||||
"position": [0, -0.1, 0]
|
||||
},
|
||||
"tail": {
|
||||
"rotation": ["6+math.sin(q.anim_time*90*4)*1", "0+math.sin(q.anim_time*90*2-90)*-10", 0]
|
||||
"rotation": [5, 0, 0]
|
||||
},
|
||||
"fin": {
|
||||
"rotation": [2.5, 0, "0+math.sin(q.anim_time*90*2-90)*-4"]
|
||||
"rotation": [2.5, 0, 0]
|
||||
},
|
||||
"cheek_right2": {
|
||||
"rotation": [0, 7.5, "0+math.sin(q.anim_time*90*4-90)*-1.5"]
|
||||
},
|
||||
"torso": {
|
||||
"rotation": ["0+math.sin(q.anim_time*90*4)*0.75", "0+math.sin(q.anim_time*90*2-30)*0.5", 0],
|
||||
"position": [0, "0+math.sin(q.anim_time*90*4+30)*-0.05", 0]
|
||||
},
|
||||
"tail2": {
|
||||
"rotation": [0, "0+math.sin(q.anim_time*90*2-150)*-12.5", 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.mudkip.battle_idle": {
|
||||
"loop": true,
|
||||
"animation_length": 2,
|
||||
"bones": {
|
||||
"head": {
|
||||
"rotation": ["-7.5+math.sin(q.anim_time*90*4-90)*3", "math.sin(q.anim_time*90*2-60)*1", "math.sin(q.anim_time*90*2-60)*1"]
|
||||
},
|
||||
"fin2": {
|
||||
"rotation": [2.5, 0, "0+math.sin(q.anim_time*90*2-120)*-3"]
|
||||
},
|
||||
"cheek_left2": {
|
||||
"rotation": [0, -7.5, "-5+math.sin(q.anim_time*90*4-90)*1.5"]
|
||||
},
|
||||
"leg_front_left": {
|
||||
"rotation": ["4.305+math.sin(q.anim_time*90*4)*2", 5.60922, -7.50745],
|
||||
"position": [0, "-0.275+math.sin(q.anim_time*90*4)*-0.05", "0.3+math.sin(q.anim_time*90*4)*-0.07"]
|
||||
},
|
||||
"leg_front_left2": {
|
||||
"rotation": ["-4.9575+math.sin(q.anim_time*90*4)*-2", 0.65182, 7.47178]
|
||||
},
|
||||
"leg_front_right": {
|
||||
"rotation": ["4.305+math.sin(q.anim_time*90*4)*2", -5.60922, 7.50745],
|
||||
"position": [0, "-0.275+math.sin(q.anim_time*90*4)*-0.05", "0.3+math.sin(q.anim_time*90*4)*-0.07"]
|
||||
},
|
||||
"leg_front_right2": {
|
||||
"rotation": ["-4.9575+math.sin(q.anim_time*90*4)*-2", -0.65182, -7.47178]
|
||||
},
|
||||
"leg_back_left": {
|
||||
"rotation": ["-5+math.sin(q.anim_time*90*4)*-1", -5, 0],
|
||||
"position": [0, "-0.125+math.sin(q.anim_time*90*4)*-0.025", "0+math.sin(q.anim_time*90*4)*0.035"]
|
||||
},
|
||||
"leg_back_left2": {
|
||||
"rotation": ["5+math.sin(q.anim_time*90*4)*1", 0, 0]
|
||||
},
|
||||
"leg_back_right": {
|
||||
"rotation": ["-5+math.sin(q.anim_time*90*4)*-1", 5, 0],
|
||||
"position": [0, "-0.125+math.sin(q.anim_time*90*4)*-0.025", "0+math.sin(q.anim_time*90*4)*0.035"]
|
||||
},
|
||||
"leg_back_right2": {
|
||||
"rotation": ["5+math.sin(q.anim_time*90*4)*1", 0, 0]
|
||||
},
|
||||
"body": {
|
||||
"position": [0, -0.1, 0]
|
||||
},
|
||||
"tail": {
|
||||
"rotation": ["6+math.sin(q.anim_time*90*4)*1", "0+math.sin(q.anim_time*90*2-90)*-17.5", 0]
|
||||
},
|
||||
"fin": {
|
||||
"rotation": [2.5, 0, "0+math.sin(q.anim_time*90*2-90)*-4"]
|
||||
},
|
||||
"cheek_right2": {
|
||||
"rotation": [0, 7.5, "5+math.sin(q.anim_time*90*4-90)*-1.5"]
|
||||
},
|
||||
"torso": {
|
||||
"rotation": ["10+math.sin(q.anim_time*90*4)*2.5", "math.sin(q.anim_time*90*2-30)*0.5", 0],
|
||||
"position": [0, "0+math.sin(q.anim_time*90*4+30)*-0.07", 0]
|
||||
},
|
||||
"tail2": {
|
||||
"rotation": [0, "0+math.sin(q.anim_time*90*2-90)*-7.5", 0]
|
||||
},
|
||||
"eye_angry_left": {
|
||||
"position": [0, 0, -0.1]
|
||||
},
|
||||
"eye_angry_right": {
|
||||
"position": [0, 0, -0.1]
|
||||
"rotation": [0, -7.5, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.mudkip.cry": {
|
||||
"animation_length": 1.75,
|
||||
"bones": {
|
||||
"torso": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.2917": [5, 0, 0],
|
||||
"0.5": [0, 0, 0],
|
||||
"1.0": [-2.5, 0, 0],
|
||||
"1.5": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"head": {
|
||||
"rotation": {
|
||||
"0.0": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.2083": {
|
||||
"post": [10, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.375": {
|
||||
"post": [10, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.5833": {
|
||||
"post": [-10, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.7083": {
|
||||
"post": [-10, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"1.0833": {
|
||||
"post": [-17.5, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"1.2917": {
|
||||
"post": [-3, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"1.625": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
}
|
||||
}
|
||||
},
|
||||
"jaw": {
|
||||
"rotation": {
|
||||
"0.0": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.3333": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.625": {
|
||||
"post": [35, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.7083": {
|
||||
"post": [15, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"1.0": {
|
||||
"post": [60, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"1.0833": {
|
||||
"post": [60, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"1.3333": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
}
|
||||
}
|
||||
},
|
||||
"fin": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.25": [6, 0, 0],
|
||||
"1.0": [-5, 0, 0],
|
||||
"1.5": [0, 0, 0]
|
||||
}
|
||||
},
|
||||
"cheek_left2": {
|
||||
"rotation": {
|
||||
"0.375": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.75": {
|
||||
"post": [0, 0, -12.5],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.8333": {
|
||||
"post": [0, 0, -12.5],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"1.5": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
}
|
||||
}
|
||||
},
|
||||
"cheek_right2": {
|
||||
"rotation": {
|
||||
"0.375": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.75": {
|
||||
"post": [0, 0, 12.5],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.8333": {
|
||||
"post": [0, 0, 12.5],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"1.5": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
}
|
||||
}
|
||||
},
|
||||
"tail": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.625": [0, "0+math.sin(q.anim_time*90*12-90)*-25", 0],
|
||||
"1.625": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation_length": 1.2,
|
||||
"sound_effects": {
|
||||
"0.5417": {
|
||||
"0.04": {
|
||||
"effect": "pokemon.mudkip.cry"
|
||||
}
|
||||
}
|
||||
@@ -423,14 +207,6 @@
|
||||
"position": [-0.1, 0, -0.1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.mudkip.WALKSPEED_TEST": {
|
||||
"loop": true,
|
||||
"bones": {
|
||||
"body": {
|
||||
"position": [0, 0, "q.anim_time*90*-0.07"]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+29
-221
@@ -3,173 +3,83 @@
|
||||
"animations": {
|
||||
"animation.marshtomp.ground_idle": {
|
||||
"loop": true,
|
||||
"animation_length": 4,
|
||||
"bones": {
|
||||
"torso": {
|
||||
"rotation": ["0+math.sin(q.anim_time*90*4)*-1", "math.sin(q.anim_time*90*2)*2", "math.sin(q.anim_time*90*2)*-1"],
|
||||
"position": [0, "math.sin(q.anim_time*90*4-30)*-0.05", 0]
|
||||
"rotation": [0, 0, 0]
|
||||
},
|
||||
"chest": {
|
||||
"rotation": ["0+math.sin(q.anim_time*90*4-30)*-1", "math.sin(q.anim_time*90*2-30)*1", "math.sin(q.anim_time*90*2-30)*-0.5"]
|
||||
},
|
||||
"neck": {
|
||||
"rotation": ["0+math.sin(q.anim_time*90*4-30)*2.5", 0, 0]
|
||||
"rotation": [-2.5, 0, 0]
|
||||
},
|
||||
"head": {
|
||||
"rotation": ["5+math.sin(q.anim_time*90*4-30)*-3", "math.sin(q.anim_time*90*2-30)*1", "math.sin(q.anim_time*90*2-30)*-1.5"]
|
||||
},
|
||||
"head_fin": {
|
||||
"rotation": ["0+math.sin(q.anim_time*90*4-30)*-1.5", 0, 0]
|
||||
"rotation": [5, 0, 0]
|
||||
},
|
||||
"arm_left": {
|
||||
"rotation": [7.5, 0, "37.5+math.sin(q.anim_time*90*2)*-5"]
|
||||
"rotation": [7.5, 0, 27.5]
|
||||
},
|
||||
"arm_left2": {
|
||||
"rotation": [0, "15+math.sin(q.anim_time*90*2-30)*5", "2.5+math.sin(q.anim_time*90*2-60)*-5"]
|
||||
"rotation": [0, 15, 2.5]
|
||||
},
|
||||
"hand_left": {
|
||||
"rotation": [0, "0+math.sin(q.anim_time*90*2-120)*3", "10+math.sin(q.anim_time*90*2-150)*-2.5"]
|
||||
"rotation": [0, 0, 5]
|
||||
},
|
||||
"finger_front_left": {
|
||||
"rotation": [0, 0, "10+math.sin(q.anim_time*90*2-60)*-5"]
|
||||
"rotation": [0, 2.5, 15]
|
||||
},
|
||||
"finger_middle_left": {
|
||||
"rotation": [0, 0, "10+math.sin(q.anim_time*90*2-120)*-5"]
|
||||
"rotation": [0, 0, 10]
|
||||
},
|
||||
"finger_back_left": {
|
||||
"rotation": [0, 0, "10+math.sin(q.anim_time*90*2-180)*-5"]
|
||||
"rotation": [0, -5, 20]
|
||||
},
|
||||
"arm_right": {
|
||||
"rotation": [7.5, 0, "-37.5+math.sin(q.anim_time*90*2)*-5"]
|
||||
"rotation": [7.5, 0, -27.5]
|
||||
},
|
||||
"arm_right2": {
|
||||
"rotation": [0, "-15+math.sin(q.anim_time*90*2-30)*5", "-2.5+math.sin(q.anim_time*90*2-60)*-5"]
|
||||
"rotation": [0, -15, -2.5]
|
||||
},
|
||||
"hand_right": {
|
||||
"rotation": [0, "0+math.sin(q.anim_time*90*2-120)*3", "-10+math.sin(q.anim_time*90*2-150)*-2.5"]
|
||||
"rotation": [0, 0, -5]
|
||||
},
|
||||
"finger_front_right": {
|
||||
"rotation": [0, 0, "-10+math.sin(q.anim_time*90*2-60)*-5"]
|
||||
"rotation": [0, -2.5, -15]
|
||||
},
|
||||
"finger_middle_right": {
|
||||
"rotation": [0, 0, "-10+math.sin(q.anim_time*90*2-120)*-5"]
|
||||
"rotation": [0, 0, -10]
|
||||
},
|
||||
"finger_back_right": {
|
||||
"rotation": [0, 0, "-10+math.sin(q.anim_time*90*2-180)*-5"]
|
||||
"rotation": [0, 5, -20]
|
||||
},
|
||||
"tail_fin_left": {
|
||||
"rotation": [-5, "45+math.sin(q.anim_time*90*2)*-12", 0]
|
||||
"rotation": [-5, 45, 0]
|
||||
},
|
||||
"tail_fin_right": {
|
||||
"rotation": [-5, "-45+math.sin(q.anim_time*90*2)*12", 0]
|
||||
"rotation": [-5, -45, 0]
|
||||
},
|
||||
"leg_left": {
|
||||
"rotation": ["-2.5+math.sin(q.anim_time*90*2)*2.5", 0, 0],
|
||||
"position": [0, "-0.05+math.sin(q.anim_time*90*2)*0.1", "0+math.sin(q.anim_time*90*2)*-0.1"]
|
||||
},
|
||||
"leg_left2": {
|
||||
"rotation": ["2.5+math.sin(q.anim_time*90*2)*-2.5", 0, 0]
|
||||
},
|
||||
"leg_right": {
|
||||
"rotation": ["-2.5+math.sin(q.anim_time*90*2)*-2.5", 0, 0],
|
||||
"position": [0, "-0.05+math.sin(q.anim_time*90*2)*-0.1", "0+math.sin(q.anim_time*90*2)*0.1"]
|
||||
},
|
||||
"leg_right2": {
|
||||
"rotation": ["2.5+math.sin(q.anim_time*90*2)*2.5", 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.marshtomp.battle_idle": {
|
||||
"loop": true,
|
||||
"animation_length": 4,
|
||||
"bones": {
|
||||
"torso": {
|
||||
"rotation": ["0+math.sin(q.anim_time*90*4)*-2", "math.sin(q.anim_time*90*2)*4", "math.sin(q.anim_time*90*2)*-2"],
|
||||
"position": [0, "math.sin(q.anim_time*90*4)*0.05", 0]
|
||||
},
|
||||
"chest": {
|
||||
"rotation": ["-2.5+math.sin(q.anim_time*90*4-30)*-1", "math.sin(q.anim_time*90*2-30)*4", "math.sin(q.anim_time*90*2-30)*-2.5"]
|
||||
},
|
||||
"head": {
|
||||
"rotation": ["5+math.sin(q.anim_time*90*4-30)*-3", "math.sin(q.anim_time*90*2-30)*-6", "math.sin(q.anim_time*90*2-30)*5"]
|
||||
},
|
||||
"arm_left": {
|
||||
"rotation": [7.5, 0, "27.5+math.sin(q.anim_time*90*2)*-7.5"]
|
||||
},
|
||||
"arm_left2": {
|
||||
"rotation": [0, "15+math.sin(q.anim_time*90*2-30)*5", "2.5+math.sin(q.anim_time*90*2-30)*-5"]
|
||||
},
|
||||
"hand_left": {
|
||||
"rotation": [0, "0+math.sin(q.anim_time*90*2-90)*5", "5+math.sin(q.anim_time*90*2-90)*-7.5"]
|
||||
},
|
||||
"finger_front_left": {
|
||||
"rotation": [0, 2.5, "15+math.sin(q.anim_time*90*2-120)*-10"]
|
||||
},
|
||||
"finger_middle_left": {
|
||||
"rotation": [0, 0, "10+math.sin(q.anim_time*90*2-150)*-10"]
|
||||
},
|
||||
"finger_back_left": {
|
||||
"rotation": [0, -5, "20+math.sin(q.anim_time*90*2-180)*-10"]
|
||||
},
|
||||
"arm_right": {
|
||||
"rotation": [7.5, 0, "-27.5+math.sin(q.anim_time*90*2)*-7.5"]
|
||||
},
|
||||
"arm_right2": {
|
||||
"rotation": [0, "-15+math.sin(q.anim_time*90*2-30)*5", "-2.5+math.sin(q.anim_time*90*2-30)*-5"]
|
||||
},
|
||||
"hand_right": {
|
||||
"rotation": [0, "0+math.sin(q.anim_time*90*2-90)*5", "-5+math.sin(q.anim_time*90*2-90)*-7.5"]
|
||||
},
|
||||
"finger_front_right": {
|
||||
"rotation": [0, -2.5, "-15+math.sin(q.anim_time*90*2-120)*-10"]
|
||||
},
|
||||
"finger_middle_right": {
|
||||
"rotation": [0, 0, "-10+math.sin(q.anim_time*90*2-150)*-10"]
|
||||
},
|
||||
"finger_back_right": {
|
||||
"rotation": [0, 5, "-20+math.sin(q.anim_time*90*2-180)*-10"]
|
||||
},
|
||||
"tail_fin_left": {
|
||||
"rotation": [-5, "45+math.sin(q.anim_time*90*2)*-12", 0]
|
||||
},
|
||||
"tail_fin_right": {
|
||||
"rotation": [-5, "-45+math.sin(q.anim_time*90*2)*12", 0]
|
||||
},
|
||||
"leg_left": {
|
||||
"rotation": [2.4905, "0.2178+math.sin(q.anim_time*90*2)*1.5", -2.49527]
|
||||
"rotation": [2.5, 0, -2.5]
|
||||
},
|
||||
"leg_left2": {
|
||||
"rotation": [5, 0, 0]
|
||||
},
|
||||
"foot_left": {
|
||||
"rotation": [-7.47178, "0.6518+math.sin(q.anim_time*90*2)*-1.5", 2.45744]
|
||||
"rotation": [-7.5, 0, 2.5]
|
||||
},
|
||||
"leg_right": {
|
||||
"rotation": [2.4905, "-0.2178+math.sin(q.anim_time*90*2)*1.5", 2.49527]
|
||||
"rotation": [2.5, 0, 2.5]
|
||||
},
|
||||
"leg_right2": {
|
||||
"rotation": [5, 0, 0]
|
||||
},
|
||||
"foot_right": {
|
||||
"rotation": [-7.47178, "-0.6518+math.sin(q.anim_time*90*2)*-1.5", -2.45744]
|
||||
},
|
||||
"body": {
|
||||
"position": [0, -0.15, 0]
|
||||
},
|
||||
"neck": {
|
||||
"rotation": ["0+math.sin(q.anim_time*90*4-30)*2.5", 0, 0]
|
||||
},
|
||||
"head_fin": {
|
||||
"rotation": ["0+math.sin(q.anim_time*90*4-30)*-1.5", 0, 0]
|
||||
},
|
||||
"eye_angry_left": {
|
||||
"position": [0, 0, -0.1]
|
||||
},
|
||||
"eye_angry_right": {
|
||||
"position": [0, 0, -0.1]
|
||||
},
|
||||
"jaw": {
|
||||
"rotation": ["5+math.sin(q.anim_time*90*4-30)*-5", 0, 0]
|
||||
"rotation": [-7.5, 0, -2.5]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.marshtomp.cry": {
|
||||
"animation_length": 1.2,
|
||||
"sound_effects": {
|
||||
"0.04": {
|
||||
"effect": "pokemon.marshtomp.cry"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -252,108 +162,6 @@
|
||||
"position": [0, 0, -0.1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.marshtomp.cry": {
|
||||
"animation_length": 2,
|
||||
"bones": {
|
||||
"chest": {
|
||||
"rotation": {
|
||||
"0.0": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.125": {
|
||||
"post": [5, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.5": {
|
||||
"post": [-2.5, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.7917": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"1.0833": {
|
||||
"post": [-2.5, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"1.5833": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
}
|
||||
}
|
||||
},
|
||||
"head": {
|
||||
"rotation": {
|
||||
"0.0": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.125": {
|
||||
"post": [7.5, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.4167": {
|
||||
"post": [-12.5, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.625": {
|
||||
"post": [-5, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.8333": {
|
||||
"post": [-12.5, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"1.0417": {
|
||||
"post": [-12.5, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"1.4583": {
|
||||
"post": [-1.53, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"1.7083": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
}
|
||||
}
|
||||
},
|
||||
"jaw": {
|
||||
"rotation": {
|
||||
"0.0": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.2083": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.5": {
|
||||
"post": [27.5, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.75": {
|
||||
"post": [17.5, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"1.0833": {
|
||||
"post": [40, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"1.4583": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"sound_effects": {
|
||||
"0.4167": {
|
||||
"effect": "pokemon.marshtomp.cry"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+34
-349
@@ -3,33 +3,30 @@
|
||||
"animations": {
|
||||
"animation.swampert.ground_idle": {
|
||||
"loop": true,
|
||||
"animation_length": 4,
|
||||
"bones": {
|
||||
"body": {
|
||||
"position": [0, 1.75, 0]
|
||||
},
|
||||
"chest2": {
|
||||
"rotation": ["-12.5+math.sin(q.anim_time*90*2-60)*0.75", 0, 0]
|
||||
"rotation": [-12.5, 0, 0]
|
||||
},
|
||||
"neck": {
|
||||
"rotation": ["-5+math.sin(q.anim_time*90*2-90)*1", "0+math.sin(q.anim_time*90*1-90)*-1", 0]
|
||||
"rotation": [-5, 0, 0]
|
||||
},
|
||||
"leg_left": {
|
||||
"rotation": ["8.7765+math.sin(q.anim_time*90*2)*-1.5", -12.0131, -53.28718],
|
||||
"position": [0, "0+math.sin(q.anim_time*90*2)*-0.1", "0+math.sin(q.anim_time*90*2)*0.15"]
|
||||
"rotation": [8.77647, -12.0131, -53.28718]
|
||||
},
|
||||
"leg_left2": {
|
||||
"rotation": [4.5416, -0.2127, 45.09046]
|
||||
"rotation": [4.54163, -0.2127, 45.09046]
|
||||
},
|
||||
"leg_left3": {
|
||||
"rotation": [9.83802, -2.51058, 9.95791]
|
||||
},
|
||||
"foot_left": {
|
||||
"rotation": [-27.58324, "-3.5552+math.sin(q.anim_time*90*2)*-1.5", 20.16242]
|
||||
"rotation": [-27.58324, -3.55523, 20.16242]
|
||||
},
|
||||
"leg_right": {
|
||||
"rotation": ["8.7765+math.sin(q.anim_time*90*2)*-1.5", 12.0131, 53.2872],
|
||||
"position": [0, "0+math.sin(q.anim_time*90*2)*-0.1", "0+math.sin(q.anim_time*90*2)*0.15"]
|
||||
"rotation": [8.77647, 12.0131, 53.2872]
|
||||
},
|
||||
"leg_right2": {
|
||||
"rotation": [4.54163, 0.2127, -45.0905]
|
||||
@@ -38,155 +35,16 @@
|
||||
"rotation": [9.83802, 2.5106, -9.9579]
|
||||
},
|
||||
"foot_right": {
|
||||
"rotation": [-27.58324, "3.5552+math.sin(q.anim_time*90*2)*1.5", -20.1624]
|
||||
"rotation": [-27.58324, 3.5552, -20.1624]
|
||||
},
|
||||
"arm_left2": {
|
||||
"rotation": [-4.36302, -31.26463, "17.6253+math.sin(q.anim_time*90*2-90)*2"]
|
||||
"rotation": [-4.36302, -31.26463, 17.62528]
|
||||
},
|
||||
"arm_left3": {
|
||||
"rotation": [1.80384, 2.38704, "35.4291+math.sin(q.anim_time*90*2-120)*2.5"]
|
||||
"rotation": [1.80384, 2.38704, 35.42915]
|
||||
},
|
||||
"arm_left": {
|
||||
"rotation": [-13.31914, "-14.6364+math.sin(q.anim_time*90*2-60)*2", 12.92638]
|
||||
},
|
||||
"finger_front_left": {
|
||||
"rotation": [0, "-37.5+math.sin(q.anim_time*90*2-120)*-2.5", 20]
|
||||
},
|
||||
"finger_middle_left": {
|
||||
"rotation": [0, "-32.5+math.sin(q.anim_time*90*2-120)*-2.5", 0]
|
||||
},
|
||||
"finger_back_left": {
|
||||
"rotation": [0, "-30+math.sin(q.anim_time*90*2-120)*-2.5", -27.5]
|
||||
},
|
||||
"fingers_left": {
|
||||
"rotation": [0, 37.5, 0]
|
||||
},
|
||||
"arm_right": {
|
||||
"rotation": [-13.31914, "14.6364+math.sin(q.anim_time*90*2-60)*-2", -12.9264]
|
||||
},
|
||||
"arm_right2": {
|
||||
"rotation": [-4.33052, "31.2647+math.sin(q.anim_time*90*2-90)*2", -17.60892]
|
||||
},
|
||||
"arm_right3": {
|
||||
"rotation": [1.80384, -2.387, "-35.4292+math.sin(q.anim_time*90*2-120)*-2.5"]
|
||||
},
|
||||
"fingers_right": {
|
||||
"rotation": [0, -37.5, 0]
|
||||
},
|
||||
"finger_front_right": {
|
||||
"rotation": [0, "37.5+math.sin(q.anim_time*90*2-120)*2.5", -20]
|
||||
},
|
||||
"finger_middle_right": {
|
||||
"rotation": [0, "32.5+math.sin(q.anim_time*90*2-120)*2.5", 0]
|
||||
},
|
||||
"finger_back_right": {
|
||||
"rotation": [0, "30+math.sin(q.anim_time*90*2-120)*2.5", 27.5]
|
||||
},
|
||||
"torso": {
|
||||
"rotation": ["-5+math.sin(q.anim_time*90*2)*0.5", 0, 0],
|
||||
"position": [0, "0+math.sin(q.anim_time*90*2+30)*-0.4", 0]
|
||||
},
|
||||
"chest": {
|
||||
"rotation": ["-7.5+math.sin(q.anim_time*90*2-30)*1.5", 0, 0]
|
||||
},
|
||||
"hand_left": {
|
||||
"rotation": [0, "-17.5+math.sin(q.anim_time*90*2-90)*-5", 0]
|
||||
},
|
||||
"finger_front_left2": {
|
||||
"rotation": [0, "-12.5+math.sin(q.anim_time*90*2-150)*-5", 0]
|
||||
},
|
||||
"finger_middle_left2": {
|
||||
"rotation": [0, "-10+math.sin(q.anim_time*90*2-150)*-5", 0]
|
||||
},
|
||||
"finger_back_left2": {
|
||||
"rotation": [0, "-15+math.sin(q.anim_time*90*2-150)*-5", 0]
|
||||
},
|
||||
"hand_right": {
|
||||
"rotation": [0, "17.5+math.sin(q.anim_time*90*2-90)*5", 0]
|
||||
},
|
||||
"finger_front_right2": {
|
||||
"rotation": [0, "12.5+math.sin(q.anim_time*90*2-150)*5", 0]
|
||||
},
|
||||
"finger_middle_right2": {
|
||||
"rotation": [0, "10+math.sin(q.anim_time*90*2-150)*5", 0]
|
||||
},
|
||||
"finger_back_right2": {
|
||||
"rotation": [0, "15+math.sin(q.anim_time*90*2-150)*5", 0]
|
||||
},
|
||||
"check_left_spike_front": {
|
||||
"rotation": [0, "0+math.sin(q.anim_time*90*2-30)*3", 0]
|
||||
},
|
||||
"check_left_spike_back": {
|
||||
"rotation": [0, "0+math.sin(q.anim_time*90*2-30)*3", 0]
|
||||
},
|
||||
"check_right_spike_front": {
|
||||
"rotation": [0, "0+math.sin(q.anim_time*90*2-30)*-3", 0]
|
||||
},
|
||||
"check_right_spike_back": {
|
||||
"rotation": [0, "0+math.sin(q.anim_time*90*2-30)*-3", 0]
|
||||
},
|
||||
"eyebrow_left": {
|
||||
"rotation": [0, "-2.5+math.sin(q.anim_time*90*2-60)*-2.5", 0]
|
||||
},
|
||||
"eyebrow_right": {
|
||||
"rotation": [0, "2.5-math.sin(q.anim_time*90*2-60)*-2.5", 0]
|
||||
},
|
||||
"tail": {
|
||||
"rotation": ["0+math.sin(q.anim_time*90*2-30)*-2.5", 0, 0]
|
||||
},
|
||||
"head": {
|
||||
"rotation": ["12.5+math.sin(q.anim_time*90*2-90)*-2.5", "-0+math.sin(q.anim_time*90*1-90)*-0.5", 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.swampert.battle_idle": {
|
||||
"loop": true,
|
||||
"animation_length": 4,
|
||||
"bones": {
|
||||
"body": {
|
||||
"position": [0, 1.75, 0]
|
||||
},
|
||||
"chest2": {
|
||||
"rotation": ["-12.5+math.sin(q.anim_time*90*2-60)*0.75", 0, 0]
|
||||
},
|
||||
"neck": {
|
||||
"rotation": ["-5+math.sin(q.anim_time*90*2-90)*1", "0+math.sin(q.anim_time*90*1-90)*-1", 0]
|
||||
},
|
||||
"leg_left": {
|
||||
"rotation": ["8.7765+math.sin(q.anim_time*90*2)*-1.5", -12.0131, -53.28718],
|
||||
"position": [0, "0+math.sin(q.anim_time*90*2)*-0.1", "0+math.sin(q.anim_time*90*2)*0.15"]
|
||||
},
|
||||
"leg_left2": {
|
||||
"rotation": [4.5416, -0.2127, 45.09046]
|
||||
},
|
||||
"leg_left3": {
|
||||
"rotation": [9.83802, -2.51058, 9.95791]
|
||||
},
|
||||
"foot_left": {
|
||||
"rotation": [-27.58324, "-3.5552+math.sin(q.anim_time*90*2)*-1.5", 20.16242]
|
||||
},
|
||||
"leg_right": {
|
||||
"rotation": ["8.7765+math.sin(q.anim_time*90*2)*-1.5", 12.0131, 53.2872],
|
||||
"position": [0, "0+math.sin(q.anim_time*90*2)*-0.1", "0+math.sin(q.anim_time*90*2)*0.15"]
|
||||
},
|
||||
"leg_right2": {
|
||||
"rotation": [4.54163, 0.2127, -45.0905]
|
||||
},
|
||||
"leg_right3": {
|
||||
"rotation": [9.83802, 2.5106, -9.9579]
|
||||
},
|
||||
"foot_right": {
|
||||
"rotation": [-27.58324, "3.5552+math.sin(q.anim_time*90*2)*1.5", -20.1624]
|
||||
},
|
||||
"arm_left2": {
|
||||
"rotation": [-4.71002, "-12.8789-math.sin(q.anim_time*90*2-90)*2", 28.88472]
|
||||
},
|
||||
"arm_left3": {
|
||||
"rotation": [1.81234, "10.1983-math.sin(q.anim_time*90*2-30)*-5", 25.6704]
|
||||
},
|
||||
"arm_left": {
|
||||
"rotation": [-33.31914, "-14.6364-math.sin(q.anim_time*90*2-60)*-2", 12.9264],
|
||||
"position": [0, "0-math.sin(q.anim_time*90*2-30)*-0.3", 0]
|
||||
"rotation": [-13.31914, -14.63639, 12.92638]
|
||||
},
|
||||
"finger_front_left": {
|
||||
"rotation": [0, -37.5, 20]
|
||||
@@ -201,14 +59,13 @@
|
||||
"rotation": [0, 37.5, 0]
|
||||
},
|
||||
"arm_right": {
|
||||
"rotation": [-33.31914, "14.6364+math.sin(q.anim_time*90*2-60)*-2", -12.9264],
|
||||
"position": [0, "0-math.sin(q.anim_time*90*2-30)*-0.3", 0]
|
||||
"rotation": [-13.31914, 14.6364, -12.9264]
|
||||
},
|
||||
"arm_right2": {
|
||||
"rotation": [-4.71002, "12.8789+math.sin(q.anim_time*90*2-90)*2", -28.88472]
|
||||
"rotation": [-4.36302, 31.2646, -17.6253]
|
||||
},
|
||||
"arm_right3": {
|
||||
"rotation": [1.81234, "-10.1983+math.sin(q.anim_time*90*2-30)*-5", -25.6704]
|
||||
"rotation": [1.80384, -2.387, -35.4292]
|
||||
},
|
||||
"fingers_right": {
|
||||
"rotation": [0, -37.5, 0]
|
||||
@@ -223,65 +80,37 @@
|
||||
"rotation": [0, 30, 27.5]
|
||||
},
|
||||
"torso": {
|
||||
"rotation": ["12.5+math.sin(q.anim_time*90*2)*0.5", 0, 0],
|
||||
"position": [0, "0+math.sin(q.anim_time*90*2+30)*-0.4", 0]
|
||||
"rotation": [-2.5, 0, 0]
|
||||
},
|
||||
"chest": {
|
||||
"rotation": ["-0+math.sin(q.anim_time*90*2-30)*1.5", 0, 0]
|
||||
"rotation": [-7.5, 0, 0]
|
||||
},
|
||||
"hand_left": {
|
||||
"rotation": [0, "-17.5-math.sin(q.anim_time*90*2-60)*-2", 0]
|
||||
"rotation": [0, -17.5, 0]
|
||||
},
|
||||
"finger_front_left2": {
|
||||
"rotation": [0, "-12.5+math.sin(q.anim_time*90*2-150)*-5", 0]
|
||||
"rotation": [0, -12.5, 0]
|
||||
},
|
||||
"finger_middle_left2": {
|
||||
"rotation": [0, "-10+math.sin(q.anim_time*90*2-150)*-5", 0]
|
||||
"rotation": [0, -10, 0]
|
||||
},
|
||||
"finger_back_left2": {
|
||||
"rotation": [0, "-15+math.sin(q.anim_time*90*2-150)*-5", 0]
|
||||
"rotation": [0, -15, 0]
|
||||
},
|
||||
"head_angle": {
|
||||
"rotation": [12.5, 0, 0]
|
||||
},
|
||||
"hand_right": {
|
||||
"rotation": [0, "17.5+math.sin(q.anim_time*90*2-60)*-2", 0]
|
||||
"rotation": [0, 17.5, 0]
|
||||
},
|
||||
"finger_front_right2": {
|
||||
"rotation": [0, "12.5+math.sin(q.anim_time*90*2-150)*5", 0]
|
||||
"rotation": [0, 12.5, 0]
|
||||
},
|
||||
"finger_middle_right2": {
|
||||
"rotation": [0, "10+math.sin(q.anim_time*90*2-150)*5", 0]
|
||||
"rotation": [0, 10, 0]
|
||||
},
|
||||
"finger_back_right2": {
|
||||
"rotation": [0, "15+math.sin(q.anim_time*90*2-150)*5", 0]
|
||||
},
|
||||
"check_left_spike_front": {
|
||||
"rotation": [0, "0+math.sin(q.anim_time*90*2-30)*3", 0]
|
||||
},
|
||||
"check_left_spike_back": {
|
||||
"rotation": [0, "0+math.sin(q.anim_time*90*2-30)*3", 0]
|
||||
},
|
||||
"check_right_spike_front": {
|
||||
"rotation": [0, "0+math.sin(q.anim_time*90*2-30)*-3", 0]
|
||||
},
|
||||
"check_right_spike_back": {
|
||||
"rotation": [0, "0+math.sin(q.anim_time*90*2-30)*-3", 0]
|
||||
},
|
||||
"eyebrow_left": {
|
||||
"rotation": [0, "-2.5+math.sin(q.anim_time*90*2-60)*-2.5", 0]
|
||||
},
|
||||
"eyebrow_right": {
|
||||
"rotation": [0, "2.5-math.sin(q.anim_time*90*2-60)*-2.5", 0]
|
||||
},
|
||||
"tail": {
|
||||
"rotation": ["0+math.sin(q.anim_time*90*2-30)*-2.5", 0, 0]
|
||||
},
|
||||
"head": {
|
||||
"rotation": ["-5+math.sin(q.anim_time*90*2-90)*-2.5", "math.sin(q.anim_time*90*1-90)*-0.5", 0]
|
||||
},
|
||||
"eye_angry_left": {
|
||||
"position": [0, -0.1, 0]
|
||||
},
|
||||
"eye_angry_right": {
|
||||
"position": [0, -0.1, 0]
|
||||
"rotation": [0, 15, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -404,6 +233,14 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.swampert.cry": {
|
||||
"animation_length": 1.2,
|
||||
"sound_effects": {
|
||||
"0.04": {
|
||||
"effect": "pokemon.swampert.cry"
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.swampert.blink": {
|
||||
"animation_length": 0.1667,
|
||||
"bones": {
|
||||
@@ -485,158 +322,6 @@
|
||||
"position": [0, -0.1, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.swampert.cry": {
|
||||
"animation_length": 2.5,
|
||||
"bones": {
|
||||
"chest2": {
|
||||
"rotation": {
|
||||
"0.0": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.2917": {
|
||||
"post": [7.5, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.625": {
|
||||
"post": [-5, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"1.5417": {
|
||||
"post": [-6, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"2.0417": {
|
||||
"post": [-1, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"2.5": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
}
|
||||
}
|
||||
},
|
||||
"neck": {
|
||||
"rotation": {
|
||||
"0.0": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.2917": {
|
||||
"post": [7.5, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.625": {
|
||||
"post": [-5, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"1.5417": {
|
||||
"post": [-6, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"2.0417": {
|
||||
"post": [-1, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"2.5": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
}
|
||||
}
|
||||
},
|
||||
"head": {
|
||||
"rotation": {
|
||||
"0.0": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.25": {
|
||||
"post": [7.5, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.5833": {
|
||||
"post": [-5, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"1.5": {
|
||||
"post": [-6, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"2.0": {
|
||||
"post": [1, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"2.5": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
}
|
||||
}
|
||||
},
|
||||
"eyelid_left": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.25": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, -0.1, 0]
|
||||
},
|
||||
"0.4167": {
|
||||
"pre": [0, -0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"eyelid_right": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.25": {
|
||||
"pre": [0, 0, 0],
|
||||
"post": [0, -0.1, 0]
|
||||
},
|
||||
"0.4167": {
|
||||
"pre": [0, -0.1, 0],
|
||||
"post": [0, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"jaw": {
|
||||
"rotation": {
|
||||
"0.0": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.3333": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.6667": {
|
||||
"post": [30, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"0.9167": {
|
||||
"post": [15, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"1.4167": {
|
||||
"post": [40, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"1.8333": {
|
||||
"post": [40, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
},
|
||||
"2.1667": {
|
||||
"post": [0, 0, 0],
|
||||
"lerp_mode": "catmullrom"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"sound_effects": {
|
||||
"0.4167": {
|
||||
"effect": "pokemon.swampert.cry"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
-8
@@ -364,14 +364,6 @@
|
||||
"rotation": [-22.5, 0, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.wurmple.cry": {
|
||||
"animation_length": 1.25,
|
||||
"sound_effects": {
|
||||
"0.0": {
|
||||
"effect": "pokemon.wurmple.cry"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
-8
@@ -212,14 +212,6 @@
|
||||
"position": [0, 0, -0.1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.silcoon.cry": {
|
||||
"animation_length": 1.25,
|
||||
"sound_effects": {
|
||||
"0.0": {
|
||||
"effect": "pokemon.silcoon.cry"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
-8
@@ -361,14 +361,6 @@
|
||||
"rotation": [0, 20, 0]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.beautifly.cry": {
|
||||
"animation_length": 1.25,
|
||||
"sound_effects": {
|
||||
"0.0": {
|
||||
"effect": "pokemon.beautifly.cry"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
-8
@@ -194,14 +194,6 @@
|
||||
"position": [0, 0, -0.1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.cascoon.cry": {
|
||||
"animation_length": 1.25,
|
||||
"sound_effects": {
|
||||
"0.0": {
|
||||
"effect": "pokemon.cascoon.cry"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
-24
@@ -255,30 +255,6 @@
|
||||
"position": [0, 0, -0.1]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.dustox.cry": {
|
||||
"animation_length": 1,
|
||||
"bones": {
|
||||
"mouth_closed_smile": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0833": {"pre": [0, 0, 0], "post": [0, 0, 0.1]},
|
||||
"0.625": {"pre": [0, 0, 0.1], "post": [0, 0, 0]}
|
||||
}
|
||||
},
|
||||
"mouth_open": {
|
||||
"position": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.0833": {"pre": [0, 0, 0], "post": [0, 0, -0.1]},
|
||||
"0.625": {"pre": [0, 0, -0.1], "post": [0, 0, 0]}
|
||||
}
|
||||
}
|
||||
},
|
||||
"sound_effects": {
|
||||
"0.0833": {
|
||||
"effect": "pokemon.dustox.cry"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
-8
@@ -149,14 +149,6 @@
|
||||
"rotation": [0, 0, 22.5]
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.surskit.cry": {
|
||||
"animation_length": 1.25,
|
||||
"sound_effects": {
|
||||
"0.0": {
|
||||
"effect": "pokemon.surskit.cry"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"geckolib_format_version": 2
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user